@@ -27,13 +27,16 @@ or backend SDK; Angular installs no React or backend SDK. Framework/compiler
2727versions come from the root lockfile. Contract probes compile the installed
2828public entries with ` strict ` and ` skipLibCheck:false ` , standard DOM signals, and
2929no workspace aliases. Negative probes check names, arguments, results and deep
30- readonly types directly on each binding's inferred snapshot.
30+ readonly types directly on each binding's inferred snapshot, including broad
31+ backend values without application-schema inference.
3132
3233` runtime-entry.ts ` is development-only composition around private ` createSession ` ,
3334the production ` FetchStreamTransport ` , and the real LangGraph SDK. A focused
3435TypeScript check resolves its public core imports against the installed tarball
35- declarations, then emits its narrow annotated ` AgentSession<FixtureTools> ` return
36- type with an optional fixture ` load ` capability. Vite bundles the private backend
36+ declarations, then emits its narrow annotated fixture return type. It replaces
37+ the core getter with ` Omit<AgentSession<FixtureTools>, 'getSnapshot'> ` and a concrete
38+ snapshot getter, avoiding an intersected overload that would hide ` values ` from
39+ inference; ` load ` remains optional. Vite bundles the private backend
3740and SDK into temporary ESM, externalizing
3841` @threadplane/core ` and ` @threadplane/core/tools ` . Only that JavaScript bundle and
3942entry declaration are copied into each installed consumer. No private TypeScript,
@@ -48,6 +51,27 @@ transport owns its retry policy. Canonical updates may replace or remove pending
4851tool calls for the same assistant message while retaining other messages' calls
4952and completed results.
5053
54+ The private ` LangGraphSnapshot.values ` is a broad
55+ ` Readonly<Record<string, PlainValue>> | undefined ` . It is observed application data,
56+ not a validated application schema. ` undefined ` means no current values map is
57+ observed; ` {} ` means a root record was observed with no application fields. Root
58+ ` values ` and ` checkpoints ` records, explicit history, and conclusive recovery
59+ correlated to the attempted run replace the whole map, including deleted fields.
60+ ` messages ` and ` __interrupt__ ` are excluded. Missing history values clear the map
61+ to ` undefined ` . Child streams, node updates, custom events and live interrupt
62+ envelopes do not replace it.
63+
64+ Messages and values publish together as one owned immutable snapshot. Equal maps
65+ retain identity, changed maps share unchanged nested branches, and token-only
66+ updates reuse the owned map without traversing it. This adds no I/O. Narrow SDK
67+ normalization prevents raw data fields from overriding protocol type/namespace;
68+ ` messageMetadata ` selects delta text semantics only for actual message events.
69+ The application field remains observable as data. The native bindings infer
70+ the concrete snapshot through structural getter/subscription signatures while
71+ retaining typed tool results, method receivers and borrowed lifetime semantics.
72+ The factory and snapshot extension remain private; state writes, application
73+ schema inference, SSR and package-root cutover remain outside this slice.
74+
5175The private ` LangGraphSession ` offers ` load({ signal }) ` only when its transport
5276supports history reads. Loading is explicit: construction, mount and subscription
5377perform no I/O. The latest checkpoint authoritatively replaces the transcript,
@@ -63,12 +87,12 @@ History is observation only: loading never executes pending tools. Execution
6387deduplication survives a load, while locally authored result provenance is cleared.
6488Persisted ToolMessage strings remain transcript text rather than becoming typed
6589handler results, including on later stream replay. This is a fixed-thread history
66- subset of T10, not thread switching, pagination, branching, full backend state,
90+ subset of T10, not thread switching, pagination, branching, state writes ,
6791interrupt resume, SSR, or a public LangGraph package cutover. Core public contracts
68- and the native binding implementations are unchanged .
92+ are unchanged; the native signatures now retain the concrete snapshot extension .
6993
7094The native fixtures expose Load, Send, Tool, Error, Hold and Stop buttons plus text,
71- transcript, load completion/error, status, tool result, delivery, submission and
95+ transcript, values, load completion/error, status, tool result, delivery, submission and
7296handler count outputs. A single app-owned
7397session is created outside component lifetime and outside React's StrictMode
7498tree; owner buttons perform framework unmount and explicit session disposal.
@@ -89,6 +113,10 @@ and no run requests or handler calls. Every completed load must leave its visibl
89113error output empty, so retained text cannot conceal a failed equal refresh. Both
90114registered handlers increment the same counter if executed. Request bodies check
91115the catalog and actual serialized ToolMessage payload.
116+ Values assertions distinguish unobserved from empty state, show loaded application
117+ fields, and verify replacement/deletion across root, tool, held and reused runs.
118+ Separate native component tests make four history reads to cover a values-only
119+ refresh with unchanged messages; installed browser scenarios still make three.
92120
93121A small in-process HTTP fixture serves only built artifacts and the expected
94122LangGraph run/history routes on dynamic port 0. The held response writes an actual SSE
0 commit comments