@ggui-ai/protocol 0.10.0 → 0.12.0

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.
@@ -12,7 +12,7 @@ export declare const STDLIB_GADGETS_PACKAGE = "@ggui-ai/gadgets";
12
12
  * in `@ggui-ai/gadgets` asserts the two stay in sync, so a release-time
13
13
  * bump to the runtime package without updating this constant fails CI.
14
14
  */
15
- export declare const STDLIB_GADGETS_VERSION = "0.10.0";
15
+ export declare const STDLIB_GADGETS_VERSION = "0.12.0";
16
16
  /**
17
17
  * v1 catalog of stdlib gadget descriptors. Every entry's
18
18
  * `package` defaults to {@link STDLIB_GADGETS_PACKAGE}; the
@@ -39,7 +39,7 @@ export const STDLIB_GADGETS_PACKAGE = '@ggui-ai/gadgets';
39
39
  * in `@ggui-ai/gadgets` asserts the two stay in sync, so a release-time
40
40
  * bump to the runtime package without updating this constant fails CI.
41
41
  */
42
- export const STDLIB_GADGETS_VERSION = '0.10.0';
42
+ export const STDLIB_GADGETS_VERSION = '0.12.0';
43
43
  /**
44
44
  * v1 catalog of stdlib gadget descriptors. Every entry's
45
45
  * `package` defaults to {@link STDLIB_GADGETS_PACKAGE}; the
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Theme-binding resolution — THE one normative total order for the
3
+ * `ai.ggui/render` slice's `themeId` / `themeMode` facts, and the two
4
+ * projections of it that run on either side of the wire (ggui#598
5
+ * leg 4; one-projection doctrine per MCP Apps Compliance).
6
+ *
7
+ * ## The normative total order
8
+ *
9
+ * ```
10
+ * themeMode: consolePick > staticConfig > sessionSidecar > hostAnnounced
11
+ * themeId: consolePick > renderOverride > staticConfig > sidecarName
12
+ * ```
13
+ *
14
+ * - `consolePick` — the live operator pick (console theme provider).
15
+ * - `renderOverride` — the agent's per-render `ggui_render({ themeId })`.
16
+ * - `staticConfig` — the app's static `ggui.json#theme` deps.
17
+ * - `sessionSidecar` — the per-app `App.theme` sidecar snapshotted at
18
+ * render-commit: its `mode` (for `themeMode`) / its `name` (for
19
+ * `themeId`, the registered-theme base-ladder binding).
20
+ * - `hostAnnounced` — the embedding host's `hostContext.theme`
21
+ * (mode only; hosts announce no theme id).
22
+ *
23
+ * An unresolved fact is `undefined` — NEVER defaulted to `'light'`.
24
+ * Absence is load-bearing: it is the signal that lets the next layer
25
+ * down (ultimately the host) fill the fact (ggui#551).
26
+ *
27
+ * ## The two projections and the composition law
28
+ *
29
+ * The server cannot see `hostAnnounced`; the client cannot see the
30
+ * server-only layers except through the stamp. So the order ships as
31
+ * two projections:
32
+ *
33
+ * - {@link stampThemeMode} / {@link stampThemeId} — the SERVER
34
+ * projection: folds the server-visible layers into the stamped
35
+ * top-level slice field.
36
+ * - {@link effectiveThemeMode} / {@link effectiveThemeId} — the
37
+ * CLIENT projection: stamped field first, then the layers the client
38
+ * can see directly.
39
+ *
40
+ * **Composition law (pinned by the test suite for every input
41
+ * combination):** `effective(stamp(server-layers), client-layers)`
42
+ * MUST equal the normative total order applied to all layers at once.
43
+ * The law is what makes cross-side precedence drift structurally
44
+ * impossible — before this module the two sides ranked the sidecar at
45
+ * different local positions and coherence silently depended on every
46
+ * transport threading every layer (the ggui#595 RCA's "two resolvers,
47
+ * two ranks" finding).
48
+ *
49
+ * The client's direct `sessionSidecar` leg is NOT redundant with the
50
+ * stamp: a transport that fails to thread the sidecar server-side
51
+ * (e.g. an envelope minted outside the render path) still resolves the
52
+ * sidecar at the correct rank client-side, because the law holds
53
+ * per-projection, not per-thread.
54
+ *
55
+ * Pure functions, no I/O — safe for both the node server and the
56
+ * browser runtime bundle.
57
+ */
58
+ /** A resolved color-scheme opinion. Absent = no opinion (never 'light'). */
59
+ export type ThemeModeOpinion = 'light' | 'dark';
60
+ /** Server-visible `themeMode` layers, highest rank first. */
61
+ export interface ThemeModeStampSources {
62
+ /** Live operator pick (console theme provider) — highest rank. */
63
+ readonly consolePick?: ThemeModeOpinion | undefined;
64
+ /** Static `ggui.json#theme` deps. */
65
+ readonly staticConfig?: ThemeModeOpinion | undefined;
66
+ /** The session theme sidecar's own `mode` — lowest server rank. */
67
+ readonly sessionSidecar?: ThemeModeOpinion | undefined;
68
+ }
69
+ /** Client-visible `themeMode` layers, highest rank first. */
70
+ export interface ThemeModeEffectiveSources {
71
+ /** The slice's stamped top-level `themeMode` (the server projection's output). */
72
+ readonly stamped?: ThemeModeOpinion | undefined;
73
+ /** The slice theme OBJECT's own `mode` (the sidecar, read directly). */
74
+ readonly sessionSidecar?: ThemeModeOpinion | undefined;
75
+ /** The embedding host's `hostContext.theme` announce — final fallback. */
76
+ readonly hostAnnounced?: ThemeModeOpinion | undefined;
77
+ }
78
+ /** Server projection of the `themeMode` total order → the stamped field. */
79
+ export declare function stampThemeMode(s: ThemeModeStampSources): ThemeModeOpinion | undefined;
80
+ /** Client projection of the `themeMode` total order → the effective mode. */
81
+ export declare function effectiveThemeMode(s: ThemeModeEffectiveSources): ThemeModeOpinion | undefined;
82
+ /** Server-visible `themeId` layers, highest rank first. */
83
+ export interface ThemeIdStampSources {
84
+ /** Live operator pick (console theme provider) — highest rank. */
85
+ readonly consolePick?: string | undefined;
86
+ /** The agent's per-render `ggui_render({ themeId })` override. */
87
+ readonly renderOverride?: string | undefined;
88
+ /** Static `ggui.json#theme` deps. */
89
+ readonly staticConfig?: string | undefined;
90
+ }
91
+ /** Client-visible `themeId` layers, highest rank first. */
92
+ export interface ThemeIdEffectiveSources {
93
+ /** The slice's stamped top-level `themeId`. */
94
+ readonly stamped?: string | undefined;
95
+ /**
96
+ * The slice theme OBJECT's `name` — the registered-theme base-ladder
97
+ * binding (ggui#589 ask 3): an unregistered name is harmless by
98
+ * construction (renderer falls back to the default ladder).
99
+ */
100
+ readonly sidecarName?: string | undefined;
101
+ }
102
+ /** Server projection of the `themeId` total order → the stamped field. */
103
+ export declare function stampThemeId(s: ThemeIdStampSources): string | undefined;
104
+ /** Client projection of the `themeId` total order → the effective id. */
105
+ export declare function effectiveThemeId(s: ThemeIdEffectiveSources): string | undefined;
106
+ //# sourceMappingURL=theme-binding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme-binding.d.ts","sourceRoot":"","sources":["../../src/integrations/theme-binding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAEH,4EAA4E;AAC5E,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhD,6DAA6D;AAC7D,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,QAAQ,CAAC,WAAW,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpD,qCAAqC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACrD,mEAAmE;IACnE,QAAQ,CAAC,cAAc,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CACxD;AAED,6DAA6D;AAC7D,MAAM,WAAW,yBAAyB;IACxC,kFAAkF;IAClF,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAChD,wEAAwE;IACxE,QAAQ,CAAC,cAAc,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvD,0EAA0E;IAC1E,QAAQ,CAAC,aAAa,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CACvD;AAED,4EAA4E;AAC5E,wBAAgB,cAAc,CAC5B,CAAC,EAAE,qBAAqB,GACvB,gBAAgB,GAAG,SAAS,CAE9B;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAChC,CAAC,EAAE,yBAAyB,GAC3B,gBAAgB,GAAG,SAAS,CAE9B;AAED,2DAA2D;AAC3D,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,kEAAkE;IAClE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,qCAAqC;IACrC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C;AAED,2DAA2D;AAC3D,MAAM,WAAW,uBAAuB;IACtC,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,CAAC,EAAE,mBAAmB,GAAG,MAAM,GAAG,SAAS,CAEvE;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,uBAAuB,GAAG,MAAM,GAAG,SAAS,CAE/E"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Theme-binding resolution — THE one normative total order for the
3
+ * `ai.ggui/render` slice's `themeId` / `themeMode` facts, and the two
4
+ * projections of it that run on either side of the wire (ggui#598
5
+ * leg 4; one-projection doctrine per MCP Apps Compliance).
6
+ *
7
+ * ## The normative total order
8
+ *
9
+ * ```
10
+ * themeMode: consolePick > staticConfig > sessionSidecar > hostAnnounced
11
+ * themeId: consolePick > renderOverride > staticConfig > sidecarName
12
+ * ```
13
+ *
14
+ * - `consolePick` — the live operator pick (console theme provider).
15
+ * - `renderOverride` — the agent's per-render `ggui_render({ themeId })`.
16
+ * - `staticConfig` — the app's static `ggui.json#theme` deps.
17
+ * - `sessionSidecar` — the per-app `App.theme` sidecar snapshotted at
18
+ * render-commit: its `mode` (for `themeMode`) / its `name` (for
19
+ * `themeId`, the registered-theme base-ladder binding).
20
+ * - `hostAnnounced` — the embedding host's `hostContext.theme`
21
+ * (mode only; hosts announce no theme id).
22
+ *
23
+ * An unresolved fact is `undefined` — NEVER defaulted to `'light'`.
24
+ * Absence is load-bearing: it is the signal that lets the next layer
25
+ * down (ultimately the host) fill the fact (ggui#551).
26
+ *
27
+ * ## The two projections and the composition law
28
+ *
29
+ * The server cannot see `hostAnnounced`; the client cannot see the
30
+ * server-only layers except through the stamp. So the order ships as
31
+ * two projections:
32
+ *
33
+ * - {@link stampThemeMode} / {@link stampThemeId} — the SERVER
34
+ * projection: folds the server-visible layers into the stamped
35
+ * top-level slice field.
36
+ * - {@link effectiveThemeMode} / {@link effectiveThemeId} — the
37
+ * CLIENT projection: stamped field first, then the layers the client
38
+ * can see directly.
39
+ *
40
+ * **Composition law (pinned by the test suite for every input
41
+ * combination):** `effective(stamp(server-layers), client-layers)`
42
+ * MUST equal the normative total order applied to all layers at once.
43
+ * The law is what makes cross-side precedence drift structurally
44
+ * impossible — before this module the two sides ranked the sidecar at
45
+ * different local positions and coherence silently depended on every
46
+ * transport threading every layer (the ggui#595 RCA's "two resolvers,
47
+ * two ranks" finding).
48
+ *
49
+ * The client's direct `sessionSidecar` leg is NOT redundant with the
50
+ * stamp: a transport that fails to thread the sidecar server-side
51
+ * (e.g. an envelope minted outside the render path) still resolves the
52
+ * sidecar at the correct rank client-side, because the law holds
53
+ * per-projection, not per-thread.
54
+ *
55
+ * Pure functions, no I/O — safe for both the node server and the
56
+ * browser runtime bundle.
57
+ */
58
+ /** Server projection of the `themeMode` total order → the stamped field. */
59
+ export function stampThemeMode(s) {
60
+ return s.consolePick ?? s.staticConfig ?? s.sessionSidecar;
61
+ }
62
+ /** Client projection of the `themeMode` total order → the effective mode. */
63
+ export function effectiveThemeMode(s) {
64
+ return s.stamped ?? s.sessionSidecar ?? s.hostAnnounced;
65
+ }
66
+ /** Server projection of the `themeId` total order → the stamped field. */
67
+ export function stampThemeId(s) {
68
+ return s.consolePick ?? s.renderOverride ?? s.staticConfig;
69
+ }
70
+ /** Client projection of the `themeId` total order → the effective id. */
71
+ export function effectiveThemeId(s) {
72
+ return s.stamped ?? s.sidecarName;
73
+ }
@@ -33,6 +33,11 @@ export declare const appThemeSchema: z.ZodObject<{
33
33
  }>;
34
34
  cssVariables: z.ZodRecord<z.ZodString, z.ZodString>;
35
35
  name: z.ZodOptional<z.ZodString>;
36
+ base: z.ZodOptional<z.ZodObject<{
37
+ documentHash: z.ZodString;
38
+ light: z.ZodRecord<z.ZodString, z.ZodString>;
39
+ dark: z.ZodRecord<z.ZodString, z.ZodString>;
40
+ }, z.core.$strict>>;
36
41
  }, z.core.$strict>;
37
42
  export type AppTheme = z.infer<typeof appThemeSchema>;
38
43
  //# sourceMappingURL=app-theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"app-theme.d.ts","sourceRoot":"","sources":["../../src/schemas/app-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,QAA2B,CAAC;AAE5D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,QAAiB,CAAC;AAShD,eAAO,MAAM,cAAc;;;;;;;kBAQhB,CAAC;AAEZ,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"app-theme.d.ts","sourceRoot":"","sources":["../../src/schemas/app-theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,QAA2B,CAAC;AAE5D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,iBAAiB,QAAiB,CAAC;AAahD,eAAO,MAAM,cAAc;;;;;;;;;;;;kBA2BhB,CAAC;AAEZ,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -32,12 +32,34 @@ const cssValue = z
32
32
  .max(256)
33
33
  .regex(CSS_VALUE_SAFE_RE, 'css value contains a disallowed character')
34
34
  .refine((v) => !v.includes('/*'), 'css value may not contain a comment');
35
+ const cssVariableMap = z
36
+ .record(z.string().regex(GGUI_CSS_VAR_KEY_RE, 'css var key must be --ggui-*'), cssValue)
37
+ .refine((m) => Object.keys(m).length <= 200, 'too many css variables (max 200)');
35
38
  export const appThemeSchema = z
36
39
  .object({
37
40
  mode: z.enum(['light', 'dark']),
38
- cssVariables: z
39
- .record(z.string().regex(GGUI_CSS_VAR_KEY_RE, 'css var key must be --ggui-*'), cssValue)
40
- .refine((m) => Object.keys(m).length <= 200, 'too many css variables (max 200)'),
41
+ cssVariables: cssVariableMap,
41
42
  name: z.string().min(1).max(64).optional(),
43
+ /**
44
+ * The REGISTERED base ladder, delivered (runtime theme
45
+ * registration): both modes' resolved variable sets ride the
46
+ * envelope so a mid-session mode switch is a local operation and
47
+ * delivery never depends on the iframe being able to fetch. The
48
+ * renderer injects the mode-selected set BELOW `cssVariables` (the
49
+ * per-app overlay) in the documented precedence. `documentHash` is
50
+ * the registration's identity: it joins painted ladders to
51
+ * registration records, and a receiver holding the hash may be
52
+ * served a future envelope without the variable sets.
53
+ */
54
+ base: z
55
+ .object({
56
+ documentHash: z
57
+ .string()
58
+ .regex(/^[0-9a-f]{64}$/, 'documentHash must be sha256 lowercase hex'),
59
+ light: cssVariableMap,
60
+ dark: cssVariableMap,
61
+ })
62
+ .strict()
63
+ .optional(),
42
64
  })
43
65
  .strict();
@@ -578,6 +578,8 @@ export declare const updateOutputSchema: z.ZodObject<{
578
578
  resourceUri: z.ZodString;
579
579
  epoch: z.ZodNumber;
580
580
  warning: z.ZodOptional<z.ZodString>;
581
+ propsSchemaHash: z.ZodOptional<z.ZodString>;
582
+ propsSchemaProfile: z.ZodOptional<z.ZodString>;
581
583
  }, z.core.$strip>;
582
584
  /**
583
585
  * `ggui_amend` wire output (#483) — acknowledgement only. `resourceUri`
@@ -591,6 +593,8 @@ export declare const amendOutputSchema: z.ZodObject<{
591
593
  updated: z.ZodBoolean;
592
594
  resourceUri: z.ZodString;
593
595
  warning: z.ZodOptional<z.ZodString>;
596
+ propsSchemaHash: z.ZodOptional<z.ZodString>;
597
+ propsSchemaProfile: z.ZodOptional<z.ZodString>;
594
598
  }, z.core.$strip>;
595
599
  /**
596
600
  * `ggui_runtime_declare_tool_catalog` — the host runtime declares its
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/schemas/mcp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/schemas/mcp.ts"],"names":[],"mappings":"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"}
@@ -699,6 +699,17 @@ export const updateOutputSchema = z.object({
699
699
  * its feedback channel.
700
700
  */
701
701
  warning: z.string().optional(),
702
+ /**
703
+ * Schema attestation (ggui#560): identity hash of the enforced props
704
+ * schema this mutation was validated against — the same schema the
705
+ * paired handshake disclosed. Present when the session declares a
706
+ * `propsSpec`; equal to the handshake's `propsSchemaHash` under the
707
+ * session-continuity guarantee, so a mismatch is the observable form
708
+ * of a contract changing mid-session.
709
+ */
710
+ propsSchemaHash: z.string().optional(),
711
+ /** Present with `propsSchemaHash`; same profile classifier as the handshake's. */
712
+ propsSchemaProfile: z.string().optional(),
702
713
  });
703
714
  /**
704
715
  * `ggui_amend` wire output (#483) — acknowledgement only. `resourceUri`
@@ -713,6 +724,10 @@ export const amendOutputSchema = z.object({
713
724
  resourceUri: z.string(),
714
725
  /** Same no-op feedback channel as ggui_update's `warning`. */
715
726
  warning: z.string().optional(),
727
+ /** Schema attestation (ggui#560) — same semantics as ggui_update's. */
728
+ propsSchemaHash: z.string().optional(),
729
+ /** Present with `propsSchemaHash`. */
730
+ propsSchemaProfile: z.string().optional(),
716
731
  });
717
732
  /**
718
733
  * `ggui_runtime_declare_tool_catalog` — the host runtime declares its
@@ -1 +1 @@
1
- {"version":3,"file":"enforced-props-schema.d.ts","sourceRoot":"","sources":["../../src/validation/enforced-props-schema.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAIvE,yEAAyE;AACzE,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,MAAM,CAAC;AAEzD;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAcpD,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAWnD,CAAC;AAEH;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAEpE;AAuED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU,CAIpE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,UAAU,GACjB,kBAAkB,CAiCpB"}
1
+ {"version":3,"file":"enforced-props-schema.d.ts","sourceRoot":"","sources":["../../src/validation/enforced-props-schema.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAIvE,yEAAyE;AACzE,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,MAAM,CAAC;AAEzD;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,MAAM,CAcpD,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,EAAE,WAAW,CAAC,MAAM,CAWnD,CAAC;AAEH;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAEpE;AAuFD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,GAAG,UAAU,CAIpE;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,UAAU,GACjB,kBAAkB,CAiCpB"}
@@ -151,6 +151,22 @@ function canonicalizeSchemaNode(node) {
151
151
  continue;
152
152
  }
153
153
  }
154
+ if (key === 'required' && Array.isArray(node.required)) {
155
+ // `required` is SET-semantics in JSON Schema — member order never
156
+ // affects validation — but it is an ARRAY on the wire, and JCS
157
+ // rightly preserves array order while sorting only object keys.
158
+ // The wrapper's `required` is derived from properties ITERATION
159
+ // order, an order-unstable source (a DynamoDB Map round-trip
160
+ // legally reorders object keys), so without this sort one
161
+ // contract stored under two representations rebuilt to two
162
+ // different propsSchemaHashes (production incident 2026-08-20:
163
+ // ca204076… vs d130e5b9… for the same Deskly contract). Sorting
164
+ // here — for derived AND authored arrays at every depth — makes
165
+ // the canonical bytes (and therefore the hash) canonical over the
166
+ // keyword's actual semantics.
167
+ out.required = [...node.required].sort();
168
+ continue;
169
+ }
154
170
  out[key] = value;
155
171
  }
156
172
  return out;
package/dist/version.d.ts CHANGED
@@ -3074,6 +3074,23 @@
3074
3074
  * sample).
3075
3075
  */
3076
3076
  export declare const PROTOCOL_VERSION = "draft-2026-08-19";
3077
+ /**
3078
+ * The shipped `@ggui-ai/*` WAVE version — bare semver, identical to
3079
+ * `package.json#version` on every published package (the lockstep
3080
+ * cohort; `@ggui-ai/protocol` is its anchor). Distinct from
3081
+ * {@link PROTOCOL_VERSION}: that names the WIRE draft (what the
3082
+ * messages mean), this names the SHIPPED BUILD (which release an agent
3083
+ * is actually talking to). Runtime surfaces that identify themselves
3084
+ * — MCP `serverInfo.version`, the MCP Apps `appInfo.version` — report
3085
+ * this, never a hand-typed literal (ggui#622: a hard-coded `0.0.1`
3086
+ * told every connected agent the wrong thing for four waves).
3087
+ *
3088
+ * Moves with every wave: `version.test.ts` pins it to this package's
3089
+ * `package.json#version` (the same parity pattern as
3090
+ * `STDLIB_GADGETS_VERSION` and `agent-server`'s `CLIENT_INFO`), and the
3091
+ * `/release:cut` straggler list names it so the bump is mechanical.
3092
+ */
3093
+ export declare const GGUI_WAVE_VERSION = "0.12.0";
3077
3094
  /**
3078
3095
  * Schema version stamped onto wire envelopes that opt into the
3079
3096
  * `schemaVersion` forward-compat field (see {@link ActionEnvelope},
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkgGG;AACH,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,uBAAuB,qBAAmB,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAErD,CAAC"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkgGG;AACH,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,uBAAuB,qBAAmB,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAErD,CAAC"}
package/dist/version.js CHANGED
@@ -3074,6 +3074,23 @@
3074
3074
  * sample).
3075
3075
  */
3076
3076
  export const PROTOCOL_VERSION = "draft-2026-08-19";
3077
+ /**
3078
+ * The shipped `@ggui-ai/*` WAVE version — bare semver, identical to
3079
+ * `package.json#version` on every published package (the lockstep
3080
+ * cohort; `@ggui-ai/protocol` is its anchor). Distinct from
3081
+ * {@link PROTOCOL_VERSION}: that names the WIRE draft (what the
3082
+ * messages mean), this names the SHIPPED BUILD (which release an agent
3083
+ * is actually talking to). Runtime surfaces that identify themselves
3084
+ * — MCP `serverInfo.version`, the MCP Apps `appInfo.version` — report
3085
+ * this, never a hand-typed literal (ggui#622: a hard-coded `0.0.1`
3086
+ * told every connected agent the wrong thing for four waves).
3087
+ *
3088
+ * Moves with every wave: `version.test.ts` pins it to this package's
3089
+ * `package.json#version` (the same parity pattern as
3090
+ * `STDLIB_GADGETS_VERSION` and `agent-server`'s `CLIENT_INFO`), and the
3091
+ * `/release:cut` straggler list names it so the bump is mechanical.
3092
+ */
3093
+ export const GGUI_WAVE_VERSION = "0.12.0";
3077
3094
  /**
3078
3095
  * Schema version stamped onto wire envelopes that opt into the
3079
3096
  * `schemaVersion` forward-compat field (see {@link ActionEnvelope},
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ggui-ai/protocol",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "description": "ggui protocol types — events, renders, WebSocket, MCP, LLM models",
5
5
  "license": "Apache-2.0",
6
6
  "keywords": [
@@ -68,6 +68,12 @@
68
68
  "require": "./dist/integrations/mcp-apps.js",
69
69
  "default": "./dist/integrations/mcp-apps.js"
70
70
  },
71
+ "./integrations/theme-binding": {
72
+ "types": "./dist/integrations/theme-binding.d.ts",
73
+ "import": "./dist/integrations/theme-binding.js",
74
+ "require": "./dist/integrations/theme-binding.js",
75
+ "default": "./dist/integrations/theme-binding.js"
76
+ },
71
77
  "./version": {
72
78
  "types": "./dist/version.d.ts",
73
79
  "import": "./dist/version.js",