@ggui-ai/protocol 0.1.0-rc.3 → 0.2.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/bridge/invoke-agent.d.ts +8 -8
- package/dist/bridge/invoke-agent.d.ts.map +1 -1
- package/dist/bridge/invoke-agent.js +12 -12
- package/dist/envelopes/builders.d.ts +2 -4
- package/dist/envelopes/builders.d.ts.map +1 -1
- package/dist/envelopes/builders.js +2 -6
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -3
- package/dist/integrations/mcp-apps.d.ts +354 -711
- package/dist/integrations/mcp-apps.d.ts.map +1 -1
- package/dist/integrations/mcp-apps.js +266 -208
- package/dist/recommended-prompts.d.ts +1 -1
- package/dist/recommended-prompts.js +1 -1
- package/dist/schemas/data-contract.d.ts +4 -3
- package/dist/schemas/data-contract.d.ts.map +1 -1
- package/dist/schemas/data-contract.js +4 -3
- package/dist/schemas/invoke.d.ts +2 -2
- package/dist/schemas/invoke.js +2 -2
- package/dist/schemas/mcp.d.ts +60 -79
- package/dist/schemas/mcp.d.ts.map +1 -1
- package/dist/schemas/mcp.js +93 -116
- package/dist/schemas/sync-check.js +1 -1
- package/dist/stream/stream-parser.d.ts +4 -4
- package/dist/stream/stream-parser.d.ts.map +1 -1
- package/dist/stream/stream-parser.js +9 -9
- package/dist/transport/websocket.d.ts +14 -49
- package/dist/transport/websocket.d.ts.map +1 -1
- package/dist/types/app-config.d.ts +17 -32
- package/dist/types/app-config.d.ts.map +1 -1
- package/dist/types/canvas-lifecycle.d.ts +13 -13
- package/dist/types/canvas-lifecycle.d.ts.map +1 -1
- package/dist/types/canvas-lifecycle.js +3 -3
- package/dist/types/contract-inference.d.ts +4 -7
- package/dist/types/contract-inference.d.ts.map +1 -1
- package/dist/types/data-bindings.d.ts +1 -1
- package/dist/types/data-bindings.d.ts.map +1 -1
- package/dist/types/data-contract.d.ts +10 -10
- package/dist/types/data-contract.d.ts.map +1 -1
- package/dist/types/events.d.ts +14 -56
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/events.js +1 -8
- package/dist/types/feedback.d.ts +2 -4
- package/dist/types/feedback.d.ts.map +1 -1
- package/dist/types/handshake-suggestion.d.ts +1 -1
- package/dist/types/host-context.d.ts +5 -15
- package/dist/types/host-context.d.ts.map +1 -1
- package/dist/types/host-context.js +1 -1
- package/dist/types/live-channel.d.ts +128 -191
- package/dist/types/live-channel.d.ts.map +1 -1
- package/dist/types/llm-route.d.ts +233 -0
- package/dist/types/llm-route.d.ts.map +1 -0
- package/dist/types/llm-route.js +433 -0
- package/dist/types/llm.d.ts +34 -16
- package/dist/types/llm.d.ts.map +1 -1
- package/dist/types/llm.js +34 -38
- package/dist/types/mcp.d.ts +47 -137
- package/dist/types/mcp.d.ts.map +1 -1
- package/dist/types/mcp.js +2 -2
- package/dist/types/openrouter-models.d.ts +3 -2
- package/dist/types/openrouter-models.d.ts.map +1 -1
- package/dist/types/render-event.d.ts +119 -0
- package/dist/types/render-event.d.ts.map +1 -0
- package/dist/types/render-event.js +38 -0
- package/dist/types/session.d.ts +216 -342
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/ui-generator.d.ts +8 -9
- package/dist/types/ui-generator.d.ts.map +1 -1
- package/dist/validation/contract-validator.d.ts +60 -4
- package/dist/validation/contract-validator.d.ts.map +1 -1
- package/dist/validation/contract-validator.js +101 -5
- package/dist/validation/reserved-channels.d.ts +1 -1
- package/dist/validation/reserved-channels.js +5 -5
- package/dist/validation/sanitize-error.js +1 -1
- package/dist/validation/schema-compat-invariants.d.ts +2 -2
- package/dist/validation/schema-compat-invariants.js +2 -2
- package/dist/validation/schema-meta-validation.d.ts +1 -1
- package/dist/validation/schema-meta-validation.js +2 -2
- package/dist/validation/schema-subset.d.ts +1 -1
- package/dist/version.d.ts +253 -46
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +253 -46
- package/package.json +3 -2
- package/dist/navigation/index.d.ts +0 -3
- package/dist/navigation/index.d.ts.map +0 -1
- package/dist/navigation/index.js +0 -1
- package/dist/navigation/stack-navigation.d.ts +0 -55
- package/dist/navigation/stack-navigation.d.ts.map +0 -1
- package/dist/navigation/stack-navigation.js +0 -80
package/dist/schemas/mcp.js
CHANGED
|
@@ -27,13 +27,10 @@ export const interfaceContextSchema = z.object({
|
|
|
27
27
|
// Input schemas: pre-launch posture is `.strict()` — unknown keys reject.
|
|
28
28
|
// Pre-fix all of these had `.passthrough()` as forward-compat shims. Pre-
|
|
29
29
|
// launch No Backward Compatibility (CLAUDE.md) supersedes — typos in agent
|
|
30
|
-
// args (`
|
|
30
|
+
// args (`renderid`, `redner_id`, etc.) surface immediately at the wire
|
|
31
31
|
// boundary instead of silently no-op-ing because the server stripped them.
|
|
32
|
-
export const popInputSchema = z.object({
|
|
33
|
-
sessionId: z.string().describe('Session opaque id from ggui_new_session.'),
|
|
34
|
-
}).strict();
|
|
35
32
|
export const consumeInputSchema = z.object({
|
|
36
|
-
|
|
33
|
+
renderId: z.string().describe('Render opaque id (UUID) — returned by ggui_render.'),
|
|
37
34
|
timeout: z.number().min(0).max(25).optional()
|
|
38
35
|
.describe('Long-poll timeout in seconds (default short; max 25).'),
|
|
39
36
|
}).strict();
|
|
@@ -42,23 +39,15 @@ export const consumeInputSchema = z.object({
|
|
|
42
39
|
* `streamSpec[channel]`.
|
|
43
40
|
*/
|
|
44
41
|
export const emitInputSchema = z.object({
|
|
45
|
-
|
|
42
|
+
renderId: z.string().describe('Render opaque id (UUID) — returned by ggui_render.'),
|
|
46
43
|
channel: z.string()
|
|
47
|
-
.describe('Channel name declared on the active
|
|
44
|
+
.describe('Channel name declared on the active render streamSpec.'),
|
|
48
45
|
payload: z.unknown().describe('Payload — must match streamSpec[channel].schema.'),
|
|
49
46
|
complete: z.boolean().optional()
|
|
50
47
|
.describe('True marks the stream complete; subsequent emits on this channel reject.'),
|
|
51
|
-
stackItemId: z.string().optional()
|
|
52
|
-
.describe('Stack item to scope this emit to; defaults to session top.'),
|
|
53
|
-
}).strict();
|
|
54
|
-
export const getSessionInputSchema = z.object({
|
|
55
|
-
sessionId: z.string().describe('Session opaque id from ggui_new_session.'),
|
|
56
|
-
}).strict();
|
|
57
|
-
export const getStackInputSchema = z.object({
|
|
58
|
-
sessionId: z.string().describe('Session opaque id from ggui_new_session.'),
|
|
59
48
|
}).strict();
|
|
60
|
-
export const
|
|
61
|
-
|
|
49
|
+
export const getRenderInputSchema = z.object({
|
|
50
|
+
renderId: z.string().describe('Render opaque id (UUID) — returned by ggui_render.'),
|
|
62
51
|
}).strict();
|
|
63
52
|
export const listFeaturedBlueprintsInputSchema = z.object({
|
|
64
53
|
level: z.enum(['primitive', 'component', 'composite', 'template']).optional(),
|
|
@@ -78,47 +67,17 @@ export const discoverInputSchema = z.object({}).strict();
|
|
|
78
67
|
export const requestCredentialInputSchema = z.object({
|
|
79
68
|
serviceId: z.string().describe('OAuth service ID (e.g., "bashdoor", "ubot")'),
|
|
80
69
|
reason: z.string().optional().describe('Why the agent needs this credential (shown to user)'),
|
|
81
|
-
|
|
70
|
+
renderId: z.string().optional().describe('Existing render id to push consent UI into.'),
|
|
82
71
|
}).strict();
|
|
83
|
-
// ──
|
|
72
|
+
// ── Post-Phase-B — canonical tool triad ──
|
|
84
73
|
//
|
|
85
|
-
// `
|
|
86
|
-
// The
|
|
87
|
-
//
|
|
88
|
-
//
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
//
|
|
92
|
-
//
|
|
93
|
-
/**
|
|
94
|
-
* `ggui_new_session` — mint or resolve a chat-scoped session handle.
|
|
95
|
-
*
|
|
96
|
-
* Server-mints, agent-threads. SEP-2567 aligned ("Sessionless MCP",
|
|
97
|
-
* Final 2026-03-11): the MCP spec deliberately removes Mcp-Session-Id
|
|
98
|
-
* because hosts can't agree on what a session means; the recommended
|
|
99
|
-
* pattern is exactly this — server returns explicit handles, agent
|
|
100
|
-
* threads them through subsequent calls.
|
|
101
|
-
*
|
|
102
|
-
* No inputs — every call mints a fresh random sessionId. (A prior
|
|
103
|
-
* optional `seed` for deterministic derivation was retired because
|
|
104
|
-
* LLMs were passing the same seed across user turns and getting back
|
|
105
|
-
* the same sessionId, defeating the "new" in the tool name.)
|
|
106
|
-
*/
|
|
107
|
-
export const newSessionInputSchema = z.object({}).strict();
|
|
108
|
-
export const newSessionOutputSchema = z.object({
|
|
109
|
-
sessionId: z.string()
|
|
110
|
-
.describe('Thread this through every subsequent ggui_handshake / ggui_update call in this chat.'),
|
|
111
|
-
appId: z.string(),
|
|
112
|
-
createdAt: z.string()
|
|
113
|
-
.describe('ISO 8601 — creation timestamp of the freshly-minted session.'),
|
|
114
|
-
nextStep: z.object({
|
|
115
|
-
tool: z.literal('ggui_handshake'),
|
|
116
|
-
description: z.string(),
|
|
117
|
-
example: z.string(),
|
|
118
|
-
}).describe('Wire-shape recovery hint — a worked literal example of the next call.'),
|
|
119
|
-
});
|
|
120
|
-
//
|
|
121
|
-
// `ggui_handshake` + `ggui_push` + `ggui_update` follow.
|
|
74
|
+
// `ggui_handshake` → `ggui_render` → `ggui_update` / `ggui_consume`.
|
|
75
|
+
// The retired `ggui_new_session` step is gone — handshake mints the
|
|
76
|
+
// render server-side. Conversation grouping (sibling renders within one
|
|
77
|
+
// host chat) lives on the unchanged `_meta["ai.ggui/host-session"]`
|
|
78
|
+
// channel, captured ONCE at render creation, never threaded by the
|
|
79
|
+
// agent. The collapse of Session→Render means `renderId` is the single
|
|
80
|
+
// identity the wire references everywhere.
|
|
122
81
|
//
|
|
123
82
|
/**
|
|
124
83
|
* `ggui_handshake` — three-step suggestion protocol.
|
|
@@ -130,7 +89,7 @@ export const newSessionOutputSchema = z.object({
|
|
|
130
89
|
* `BlueprintSearch` and contract-validation in parallel and returns a
|
|
131
90
|
* `HandshakeSuggestion` routed by `origin: cache | agent | synth`.
|
|
132
91
|
*
|
|
133
|
-
* Step 3 (paired `
|
|
92
|
+
* Step 3 (paired `ggui_render`): the agent accepts (reuses the
|
|
134
93
|
* provisional `blueprintId` minted in step-2) OR overrides (mints a
|
|
135
94
|
* fresh `blueprintId` against a NEW draft).
|
|
136
95
|
*
|
|
@@ -140,17 +99,13 @@ export const newSessionOutputSchema = z.object({
|
|
|
140
99
|
* variance + generator hint.
|
|
141
100
|
* - The agent is the contract authority; synth amends only when
|
|
142
101
|
* validation fails.
|
|
102
|
+
* - Post-Phase-B the handshake input carries NO `sessionId`. The
|
|
103
|
+
* server mints `renderId` on the paired `ggui_render`; host
|
|
104
|
+
* conversation grouping flows via the host-supplied
|
|
105
|
+
* `_meta["ai.ggui/host-session"]` envelope captured at render
|
|
106
|
+
* creation (see {@link RenderBase.hostSession}).
|
|
143
107
|
*/
|
|
144
108
|
export const handshakeInputSchema = z.object({
|
|
145
|
-
/**
|
|
146
|
-
* Required. Mint via `ggui_new_session` once per chat, then thread
|
|
147
|
-
* through every subsequent handshake. Server validates existence +
|
|
148
|
-
* tenant ownership; unknown / cross-tenant ids surface as
|
|
149
|
-
* session_not_found.
|
|
150
|
-
*/
|
|
151
|
-
sessionId: z.string()
|
|
152
|
-
.min(1)
|
|
153
|
-
.describe('Session handle minted by ggui_new_session. Required — call ggui_new_session({seed?}) first to obtain one. Reuse the same sessionId across multiple handshake/push pairs in the same chat to grow the session stack.'),
|
|
154
109
|
/**
|
|
155
110
|
* Concise semantic identity of the UI. Same intent across calls =
|
|
156
111
|
* same component reused. Required — drives blueprint-search keying
|
|
@@ -171,7 +126,7 @@ export const handshakeInputSchema = z.object({
|
|
|
171
126
|
* Skip blueprint-search on step-2 and route straight to validation
|
|
172
127
|
* + (if validation passes) agent-mode suggestion against the draft.
|
|
173
128
|
* Used after a prior handshake returned an unwanted cache suggestion
|
|
174
|
-
* and the agent wants to force a fresh-gen path on the paired
|
|
129
|
+
* and the agent wants to force a fresh-gen path on the paired render.
|
|
175
130
|
*/
|
|
176
131
|
forceCreate: z.boolean().optional(),
|
|
177
132
|
}).strict();
|
|
@@ -181,13 +136,13 @@ export const handshakeInputSchema = z.object({
|
|
|
181
136
|
* and optional `amendments` (synth-only) / `validationFindings`
|
|
182
137
|
* (soft on cache).
|
|
183
138
|
*
|
|
184
|
-
* The agent reads `suggestion.origin` to branch the paired
|
|
139
|
+
* The agent reads `suggestion.origin` to branch the paired render call:
|
|
185
140
|
*
|
|
186
|
-
* - `cache` →
|
|
187
|
-
* - `agent` →
|
|
188
|
-
* - `synth` →
|
|
141
|
+
* - `cache` → render `{decision: {kind: 'accept'}}` for cache delivery.
|
|
142
|
+
* - `agent` → render `{decision: {kind: 'accept'}}` to gen against the draft.
|
|
143
|
+
* - `synth` → render `{decision: {kind: 'accept'}}` to gen against the amended contract.
|
|
189
144
|
*
|
|
190
|
-
* Any origin →
|
|
145
|
+
* Any origin → render `{decision: {kind: 'override', blueprintDraft: {...}}}` to
|
|
191
146
|
* discard the suggestion and gen against a fresh draft (mints a new
|
|
192
147
|
* `blueprintId` server-side).
|
|
193
148
|
*
|
|
@@ -196,12 +151,16 @@ export const handshakeInputSchema = z.object({
|
|
|
196
151
|
* its internal `HandshakeOutput` TS shape for telemetry / post-classify
|
|
197
152
|
* tracing — zod strips them before structuredContent serialization.
|
|
198
153
|
*
|
|
199
|
-
* `serverCapabilities` reaches the iframe via `
|
|
200
|
-
* (see `
|
|
154
|
+
* `serverCapabilities` reaches the iframe via the `ai.ggui/render`
|
|
155
|
+
* slice meta (see `slice-meta-derivation.ts`), not via this response.
|
|
156
|
+
*
|
|
157
|
+
* Post-Phase-B the `'compose'` action enum value is gone — there is no
|
|
158
|
+
* stack of N renders to compose against. Three create/update branches +
|
|
159
|
+
* `'declined'` cover every legal outcome.
|
|
201
160
|
*/
|
|
202
161
|
export const handshakeOutputSchema = z.object({
|
|
203
|
-
handshakeId: z.string().describe('Stable id — pass to
|
|
204
|
-
action: z.enum(['create', 'reuse', 'update', 'replace', '
|
|
162
|
+
handshakeId: z.string().describe('Stable id — pass to ggui_render / ggui_update'),
|
|
163
|
+
action: z.enum(['create', 'reuse', 'update', 'replace', 'declined']),
|
|
205
164
|
/**
|
|
206
165
|
* The handshake suggestion — see `handshakeSuggestionSchema`. The
|
|
207
166
|
* routing discriminator is `suggestion.origin`; `blueprintMeta` is
|
|
@@ -209,7 +168,7 @@ export const handshakeOutputSchema = z.object({
|
|
|
209
168
|
* conditional on the routing outcome.
|
|
210
169
|
*/
|
|
211
170
|
suggestion: handshakeSuggestionSchema
|
|
212
|
-
.describe('Server\'s suggestion — origin-routed (cache | agent | synth). Always carries a provisional `blueprintMeta` the agent reuses by sending `decision: \'accept\'` on
|
|
171
|
+
.describe('Server\'s suggestion — origin-routed (cache | agent | synth). Always carries a provisional `blueprintMeta` the agent reuses by sending `decision: \'accept\'` on render.'),
|
|
213
172
|
/**
|
|
214
173
|
* Truncated human-readable rationale for the `action` value. Helps
|
|
215
174
|
* the agent and the operator narrate why the server chose to reuse a cached
|
|
@@ -223,13 +182,13 @@ export const handshakeOutputSchema = z.object({
|
|
|
223
182
|
.optional()
|
|
224
183
|
.describe('Short rationale (≤280 chars) for the `action` value. Surfaced for agent + operator visibility; truncated to keep the structuredContent payload predictable.'),
|
|
225
184
|
nextStep: z.object({
|
|
226
|
-
tool: z.literal('
|
|
185
|
+
tool: z.literal('ggui_render'),
|
|
227
186
|
description: z.string(),
|
|
228
187
|
example: z.string(),
|
|
229
|
-
}).optional().describe('Wire-shape recovery hint. A worked literal example of the next
|
|
188
|
+
}).optional().describe('Wire-shape recovery hint. A worked literal example of the next ggui_render call the agent should emit — the example string can be copied verbatim and tweaked (e.g. fill in `props` placeholders). Top-level field so a skimming agent finds it immediately.'),
|
|
230
189
|
});
|
|
231
190
|
/**
|
|
232
|
-
* `
|
|
191
|
+
* `ggui_render` — materialises a UI emission. Step 3 of the three-step
|
|
233
192
|
* handshake protocol.
|
|
234
193
|
*
|
|
235
194
|
* The agent commits its decision relative to the prior handshake's
|
|
@@ -244,18 +203,22 @@ export const handshakeOutputSchema = z.object({
|
|
|
244
203
|
* - `accept` reuses `handshake.suggestion.blueprintMeta.blueprintId`
|
|
245
204
|
* exactly; `override` discards the provisional id and mints fresh.
|
|
246
205
|
*
|
|
247
|
-
* There is no separate `ggui_commit` —
|
|
206
|
+
* There is no separate `ggui_commit` — render absorbs that responsibility.
|
|
207
|
+
*
|
|
208
|
+
* Post-Phase-B rename from `ggui_push` — the tool materialises a single
|
|
209
|
+
* render (no stack of N to push onto); the new name reflects what the
|
|
210
|
+
* tool does at the protocol surface.
|
|
248
211
|
*/
|
|
249
|
-
export const
|
|
212
|
+
export const renderInputSchema = z.object({
|
|
250
213
|
handshakeId: z
|
|
251
214
|
.string({
|
|
252
|
-
message: '
|
|
215
|
+
message: 'ggui_render: handshakeId is REQUIRED. Call ggui_handshake({intent, blueprintDraft}) first to negotiate — handshake returns a handshakeId + suggestion. Then render with {handshakeId, decision: {kind: \'accept\'}} (accept the suggestion) or {handshakeId, decision: {kind: \'override\', blueprintDraft: {...}}} (override with a fresh draft). Direct-render without a handshakeId is not supported.',
|
|
253
216
|
})
|
|
254
|
-
.min(1, '
|
|
217
|
+
.min(1, 'ggui_render: handshakeId must be a non-empty string from a prior ggui_handshake call.'),
|
|
255
218
|
/**
|
|
256
219
|
* Runtime prop values for THIS render. Validated against the
|
|
257
220
|
* effective contract's `propsSpec` — required-field checks + type
|
|
258
|
-
* checks per spec entry. Validation failures fail the
|
|
221
|
+
* checks per spec entry. Validation failures fail the render with a
|
|
259
222
|
* recoverable `ContractViolationError`.
|
|
260
223
|
*/
|
|
261
224
|
props: z.record(z.string(), z.unknown()).optional(),
|
|
@@ -275,30 +238,45 @@ export const pushInputSchema = z.object({
|
|
|
275
238
|
.describe('Accept the handshake suggestion (use provisional blueprintId verbatim) or override with a fresh draft (mint new blueprintId).'),
|
|
276
239
|
}).strict();
|
|
277
240
|
/**
|
|
278
|
-
* Wire-output shape — intentionally lean: `{
|
|
279
|
-
*
|
|
280
|
-
* `
|
|
281
|
-
*
|
|
282
|
-
*
|
|
283
|
-
*
|
|
241
|
+
* Wire-output shape — intentionally lean: `{renderId, nextStep?, action}`.
|
|
242
|
+
* The handler carries `shortCode`, `codeReady`, `handshakeId`,
|
|
243
|
+
* `decision`, `contract`, `contractHash`, `cache`, `codeUrl`, `codeHash`
|
|
244
|
+
* on its internal `RenderOutput` TS shape for telemetry / post-classify
|
|
245
|
+
* tracing — zod strips them before structuredContent serialization.
|
|
246
|
+
*
|
|
247
|
+
* The iframe receives bootstrap credentials (`wsUrl`, `wsToken`,
|
|
248
|
+
* `expiresAt`) via the single `ai.ggui/render` slice meta, not via this
|
|
249
|
+
* response. There is no clickable `url` field — post-R5 the `/r/`
|
|
250
|
+
* shortCode route was deleted (every host either resolves the
|
|
251
|
+
* `_meta.ui.resourceUri` iframe or reads `{renderId}` via
|
|
252
|
+
* `render-resource/...`). Leaving a dead URL on the wire had the model
|
|
253
|
+
* hallucinating links that resolve nowhere.
|
|
284
254
|
*
|
|
285
|
-
*
|
|
286
|
-
*
|
|
255
|
+
* Post-Phase-B the `'compose'` action enum value is gone — there is no
|
|
256
|
+
* stack of N renders to compose against.
|
|
287
257
|
*/
|
|
288
|
-
export const
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
258
|
+
export const renderOutputSchema = z.object({
|
|
259
|
+
renderId: z.string(),
|
|
260
|
+
/**
|
|
261
|
+
* Spec-canonical MCP-Apps entry-point — same `ui://ggui/render/{id}`
|
|
262
|
+
* URI surfaced on `_meta.ui.resourceUri`. Surfacing it on the LLM-
|
|
263
|
+
* visible structuredContent too lets SDKs that strip `_meta` from
|
|
264
|
+
* tool_results (OpenAI Agents SDK, Google ADK) reach the mount URI;
|
|
265
|
+
* SDKs that preserve `_meta` see the same value on both fields.
|
|
266
|
+
* Mirrors the `resourceUri` field on `ggui_update`'s output.
|
|
267
|
+
*/
|
|
268
|
+
resourceUri: z.string(),
|
|
269
|
+
action: z.enum(['create', 'reuse', 'update', 'replace', 'declined']),
|
|
292
270
|
/**
|
|
293
271
|
* Wire-shape recovery hint for the next call. Emitted ONLY when the
|
|
294
|
-
*
|
|
295
|
-
* receive user-action events on this
|
|
272
|
+
* rendered contract has a non-empty `actionSpec` — i.e. the agent will
|
|
273
|
+
* receive user-action events on this render. Pure-display renders
|
|
296
274
|
* (props only) get no `nextStep` because there is nothing to consume.
|
|
297
275
|
*
|
|
298
|
-
* Mirrors the chain at `
|
|
299
|
-
*
|
|
276
|
+
* Mirrors the chain at `handshake.nextStep` (→ render). Closes the loop
|
|
277
|
+
* with consume.
|
|
300
278
|
*
|
|
301
|
-
* `args.
|
|
279
|
+
* `args.renderId` is the literal value the agent passes to
|
|
302
280
|
* `ggui_consume` — copy-paste shape.
|
|
303
281
|
*/
|
|
304
282
|
nextStep: z.object({
|
|
@@ -306,9 +284,9 @@ export const pushOutputSchema = z.object({
|
|
|
306
284
|
description: z.string(),
|
|
307
285
|
example: z.string(),
|
|
308
286
|
args: z.object({
|
|
309
|
-
|
|
287
|
+
renderId: z.string(),
|
|
310
288
|
}),
|
|
311
|
-
}).optional().describe('Recovery hint — when the
|
|
289
|
+
}).optional().describe('Recovery hint — when the rendered contract has actions, points the agent at ggui_consume({renderId}) for the inbound action loop. Absent for pure-display renders.'),
|
|
312
290
|
});
|
|
313
291
|
/**
|
|
314
292
|
* `ggui_update` — refresh the rendered UI with new state.
|
|
@@ -334,23 +312,22 @@ export const pushOutputSchema = z.object({
|
|
|
334
312
|
* - Do NOT send `patch` on `kind: 'replace'` — use `props`.
|
|
335
313
|
*
|
|
336
314
|
* Both modes validate the FINAL props state (post-merge for `merge`)
|
|
337
|
-
* against the
|
|
315
|
+
* against the render's `propsSpec` and reject on violation —
|
|
338
316
|
* partial patches that would break required fields, type-mismatch
|
|
339
317
|
* values, etc. all reject pre-persist.
|
|
340
318
|
*
|
|
341
|
-
* `
|
|
342
|
-
*
|
|
343
|
-
* NO `sessionId` on the wire.
|
|
319
|
+
* `renderId` is globally unique; the server tenancy-checks via
|
|
320
|
+
* `ctx.appId`.
|
|
344
321
|
*/
|
|
345
322
|
export const updateInputSchema = z.discriminatedUnion('kind', [
|
|
346
323
|
z.object({
|
|
347
|
-
|
|
324
|
+
renderId: z.string().describe('Render opaque id (UUID) — returned by ggui_render.'),
|
|
348
325
|
kind: z.literal('replace'),
|
|
349
326
|
props: z.record(z.string(), z.unknown())
|
|
350
327
|
.describe('Full replacement props map. New map IS the new state.'),
|
|
351
328
|
}).strict(),
|
|
352
329
|
z.object({
|
|
353
|
-
|
|
330
|
+
renderId: z.string().describe('Render opaque id (UUID) — returned by ggui_render.'),
|
|
354
331
|
kind: z.literal('merge'),
|
|
355
332
|
patch: z.record(z.string(), z.unknown())
|
|
356
333
|
.describe('RFC 7396 JSON Merge Patch — null deletes a key; arrays fully replace.'),
|
|
@@ -358,16 +335,16 @@ export const updateInputSchema = z.discriminatedUnion('kind', [
|
|
|
358
335
|
]);
|
|
359
336
|
/**
|
|
360
337
|
* Wire-output shape — minimal acknowledgement. The handler carries
|
|
361
|
-
* `
|
|
362
|
-
*
|
|
363
|
-
* serialization.
|
|
338
|
+
* `decision`, `contract`, `contractHash` on its internal `UpdateOutput`
|
|
339
|
+
* TS shape — zod strips them before structuredContent serialization.
|
|
364
340
|
*
|
|
365
341
|
* Post-update the iframe receives the new props via the live-channel
|
|
366
342
|
* `props_update` WS frame; the cross-host fallback path receives them
|
|
367
|
-
* via `
|
|
368
|
-
* wire response itself is just
|
|
343
|
+
* via the `ai.ggui/render.propsJson` slice field (see
|
|
344
|
+
* `update.resultMeta`). The wire response itself is just
|
|
345
|
+
* acknowledgement.
|
|
369
346
|
*/
|
|
370
347
|
export const updateOutputSchema = z.object({
|
|
371
|
-
|
|
348
|
+
renderId: z.string(),
|
|
372
349
|
updated: z.boolean(),
|
|
373
350
|
});
|
|
@@ -45,7 +45,7 @@ function check(name, schema, tsKeys) {
|
|
|
45
45
|
failed = true;
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
-
// handshakeInputSchema /
|
|
48
|
+
// handshakeInputSchema / renderInputSchema are flat top-level shapes — z.infer
|
|
49
49
|
// derives the TS type directly so they stay in sync structurally without a
|
|
50
50
|
// keylist double-bookkeeping. Sub-schemas (blueprintDraft) are checked here.
|
|
51
51
|
console.log('\nSchema Sync Check\n');
|
|
@@ -34,10 +34,10 @@ export declare function deepFindText(obj: unknown, depth?: number): string;
|
|
|
34
34
|
*/
|
|
35
35
|
export declare function isStreamDone(data: Record<string, unknown>): boolean;
|
|
36
36
|
/**
|
|
37
|
-
* Extract
|
|
38
|
-
* Checks for a top-level `
|
|
37
|
+
* Extract hostSessionId (conversation envelope id) from a streaming event.
|
|
38
|
+
* Checks for a top-level `hostSessionId` string — no envelope format required.
|
|
39
39
|
*/
|
|
40
|
-
export declare function
|
|
40
|
+
export declare function extractHostSessionId(data: Record<string, unknown>): string | undefined;
|
|
41
41
|
/**
|
|
42
42
|
* Callbacks for stream consumers. Transport-agnostic — works with WebSocket,
|
|
43
43
|
* HTTP response streaming, file output, or anything else.
|
|
@@ -45,7 +45,7 @@ export declare function extractSessionId(data: Record<string, unknown>): string
|
|
|
45
45
|
export interface StreamCallbacks {
|
|
46
46
|
onChunk: (text: string) => Promise<void>;
|
|
47
47
|
onDone: () => Promise<void>;
|
|
48
|
-
|
|
48
|
+
onHostSessionId?: (hostSessionId: string) => Promise<void>;
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
51
|
* Read a streaming HTTP response and invoke callbacks for each text chunk.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-parser.d.ts","sourceRoot":"","sources":["../../src/stream/stream-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAKT;AAUD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,MAAM,CA0B5D;AAID;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAUnE;AAID;;;GAGG;AACH,wBAAgB,
|
|
1
|
+
{"version":3,"file":"stream-parser.d.ts","sourceRoot":"","sources":["../../src/stream/stream-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAKT;AAUD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,MAAM,CA0B5D;AAID;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAUnE;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,CAKtF;AAID;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,eAAe,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,cAAc,CAAC,UAAU,CAAC,EAChC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,eAAe,GACzB,OAAO,CAAC,IAAI,CAAC,CAkFf"}
|
|
@@ -87,14 +87,14 @@ export function isStreamDone(data) {
|
|
|
87
87
|
}
|
|
88
88
|
return false;
|
|
89
89
|
}
|
|
90
|
-
// ──
|
|
90
|
+
// ── HostSessionId extraction ──
|
|
91
91
|
/**
|
|
92
|
-
* Extract
|
|
93
|
-
* Checks for a top-level `
|
|
92
|
+
* Extract hostSessionId (conversation envelope id) from a streaming event.
|
|
93
|
+
* Checks for a top-level `hostSessionId` string — no envelope format required.
|
|
94
94
|
*/
|
|
95
|
-
export function
|
|
96
|
-
if (typeof data.
|
|
97
|
-
return data.
|
|
95
|
+
export function extractHostSessionId(data) {
|
|
96
|
+
if (typeof data.hostSessionId === 'string' && data.hostSessionId) {
|
|
97
|
+
return data.hostSessionId;
|
|
98
98
|
}
|
|
99
99
|
return undefined;
|
|
100
100
|
}
|
|
@@ -123,9 +123,9 @@ export async function readStream(body, contentType, callbacks) {
|
|
|
123
123
|
await callbacks.onDone();
|
|
124
124
|
};
|
|
125
125
|
const processJsonEvent = async (data) => {
|
|
126
|
-
const
|
|
127
|
-
if (
|
|
128
|
-
await callbacks.
|
|
126
|
+
const hsid = extractHostSessionId(data);
|
|
127
|
+
if (hsid)
|
|
128
|
+
await callbacks.onHostSessionId?.(hsid);
|
|
129
129
|
if (isStreamDone(data)) {
|
|
130
130
|
await emitDone();
|
|
131
131
|
return;
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WebSocket transport envelope — the wire-framing layer for the live channel.
|
|
3
3
|
*
|
|
4
|
-
* The live channel is the live
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* (`
|
|
8
|
-
* (`
|
|
9
|
-
* (`ConnectionStatus`).
|
|
4
|
+
* The live channel is the live plane between core-mcp and the user.
|
|
5
|
+
* This file defines HOW that plane is framed on a WebSocket: the
|
|
6
|
+
* dispatch discriminator (`WebSocketMessageType`), the discriminated
|
|
7
|
+
* union envelope (`WebSocketMessage`), and the client-side connection-
|
|
8
|
+
* lifecycle enum (`ConnectionStatus`).
|
|
10
9
|
*
|
|
11
10
|
* The CONTRACT payload shapes (what each variant carries —
|
|
12
11
|
* `SubscribePayload`, `AckPayload`, `StreamEnvelope`, etc.) live in
|
|
@@ -23,13 +22,14 @@
|
|
|
23
22
|
*/
|
|
24
23
|
import type { ActionEnvelope } from '../types/events';
|
|
25
24
|
import type { JsonObject } from '../types/data-contract';
|
|
26
|
-
import type { SubscribePayload,
|
|
25
|
+
import type { SubscribePayload, ClosePayload, AckPayload, ErrorPayload, RenderPayload, StreamEnvelope, StreamPayload, ProgressPayload, AgentMsgPayload, PropsUpdatePayload, UrlPayload, SystemPayload, InternalProgressPayload, ChannelSubscribePayload, ChannelUnsubscribePayload, ChannelPayloadFrame, ChannelErrorPayload, DrainAckPayload } from '../types/live-channel';
|
|
27
26
|
import type { HostContextObservedPayload } from '../types/host-context';
|
|
27
|
+
import type { RenderEvent } from '../types/render-event';
|
|
28
28
|
/**
|
|
29
29
|
* WebSocket message types for client-server communication.
|
|
30
30
|
* Each type maps to a specific payload shape in the {@link WebSocketMessage} discriminated union.
|
|
31
31
|
*/
|
|
32
|
-
export type WebSocketMessageType = 'action' | 'subscribe' | '
|
|
32
|
+
export type WebSocketMessageType = 'action' | 'subscribe' | 'close' | 'feedback' | 'ping' | 'pong' | 'ack' | 'error' | 'render' | 'data' | 'stream' | 'progress' | 'agent-msg' | 'props_update' | 'url' | 'system' | 'internal:progress' | 'channel_subscribe' | 'channel_unsubscribe' | 'channel_payload' | 'channel_error' | 'drain_ack' | 'host_context_observed' | 'render_event';
|
|
33
33
|
/** Fields shared by all WebSocket message variants. */
|
|
34
34
|
interface WsMessageBase {
|
|
35
35
|
requestId?: string;
|
|
@@ -51,8 +51,8 @@ interface WsMessageBase {
|
|
|
51
51
|
* msg.payload.message; // ErrorPayload — auto-narrowed
|
|
52
52
|
* msg.payload.details; // JsonValue | undefined
|
|
53
53
|
* break;
|
|
54
|
-
* case '
|
|
55
|
-
* msg.payload.
|
|
54
|
+
* case 'render':
|
|
55
|
+
* msg.payload.render; // RenderPayload — auto-narrowed
|
|
56
56
|
* break;
|
|
57
57
|
* case 'data':
|
|
58
58
|
* msg.payload.payload; // StreamEnvelope.payload
|
|
@@ -67,18 +67,9 @@ export type WebSocketMessage = (WsMessageBase & {
|
|
|
67
67
|
}) | (WsMessageBase & {
|
|
68
68
|
type: 'subscribe';
|
|
69
69
|
payload: SubscribePayload;
|
|
70
|
-
}) | (WsMessageBase & {
|
|
71
|
-
type: 'generate';
|
|
72
|
-
payload: GeneratePayload;
|
|
73
|
-
}) | (WsMessageBase & {
|
|
74
|
-
type: 'pop';
|
|
75
|
-
payload: PopPayload;
|
|
76
70
|
}) | (WsMessageBase & {
|
|
77
71
|
type: 'close';
|
|
78
72
|
payload: ClosePayload;
|
|
79
|
-
}) | (WsMessageBase & {
|
|
80
|
-
type: 'get_stack';
|
|
81
|
-
payload: GetStackPayload;
|
|
82
73
|
}) | (WsMessageBase & {
|
|
83
74
|
type: 'feedback';
|
|
84
75
|
payload: JsonObject;
|
|
@@ -95,17 +86,14 @@ export type WebSocketMessage = (WsMessageBase & {
|
|
|
95
86
|
type: 'error';
|
|
96
87
|
payload: ErrorPayload;
|
|
97
88
|
}) | (WsMessageBase & {
|
|
98
|
-
type: '
|
|
99
|
-
payload:
|
|
89
|
+
type: 'render';
|
|
90
|
+
payload: RenderPayload;
|
|
100
91
|
}) | (WsMessageBase & {
|
|
101
92
|
type: 'data';
|
|
102
93
|
payload: StreamEnvelope;
|
|
103
94
|
}) | (WsMessageBase & {
|
|
104
95
|
type: 'stream';
|
|
105
96
|
payload: StreamPayload;
|
|
106
|
-
}) | (WsMessageBase & {
|
|
107
|
-
type: 'session';
|
|
108
|
-
payload: SessionPayload;
|
|
109
97
|
}) | (WsMessageBase & {
|
|
110
98
|
type: 'progress';
|
|
111
99
|
payload: ProgressPayload;
|
|
@@ -143,32 +131,9 @@ export type WebSocketMessage = (WsMessageBase & {
|
|
|
143
131
|
type: 'host_context_observed';
|
|
144
132
|
payload: HostContextObservedPayload;
|
|
145
133
|
}) | (WsMessageBase & {
|
|
146
|
-
type: '
|
|
147
|
-
payload:
|
|
134
|
+
type: 'render_event';
|
|
135
|
+
payload: RenderEvent;
|
|
148
136
|
});
|
|
149
|
-
/**
|
|
150
|
-
* Payload for the canvas-mode `canvas_navigated` message. Emitted by
|
|
151
|
-
* the iframe-runtime's CanvasShell when the user back-navigates — the
|
|
152
|
-
* server uses `activeItemId` to update `session.activeStackItemId`
|
|
153
|
-
* (for `ggui_consume`'s active-pipe resolution) and
|
|
154
|
-
* `previousActiveItemId` to optionally abort the cold-gen
|
|
155
|
-
* `AbortSignal` keyed on that stack item.
|
|
156
|
-
*/
|
|
157
|
-
export interface CanvasNavigatedPayload {
|
|
158
|
-
/** Tenancy guard — server compares against subscriber binding. */
|
|
159
|
-
readonly sessionId: string;
|
|
160
|
-
/**
|
|
161
|
-
* Stack-item id the canvas had as active immediately BEFORE the
|
|
162
|
-
* navigation. Null when navigating from the empty state (no prior
|
|
163
|
-
* active item).
|
|
164
|
-
*/
|
|
165
|
-
readonly previousActiveItemId: string | null;
|
|
166
|
-
/**
|
|
167
|
-
* Stack-item id the canvas has as active immediately AFTER the
|
|
168
|
-
* navigation. Null when the user popped to an empty navStack.
|
|
169
|
-
*/
|
|
170
|
-
readonly activeItemId: string | null;
|
|
171
|
-
}
|
|
172
137
|
/**
|
|
173
138
|
* WebSocket connection status. Client-side transport enum describing
|
|
174
139
|
* the browser/Node ws.readyState lifecycle.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/transport/websocket.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/transport/websocket.ts"],"names":[],"mappings":"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"}
|