@ggui-ai/protocol 0.1.0-rc.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.
Files changed (222) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +46 -0
  3. package/dist/bridge/invoke-agent.d.ts +65 -0
  4. package/dist/bridge/invoke-agent.d.ts.map +1 -0
  5. package/dist/bridge/invoke-agent.js +113 -0
  6. package/dist/envelope-adapters.d.ts +24 -0
  7. package/dist/envelope-adapters.d.ts.map +1 -0
  8. package/dist/envelope-adapters.js +14 -0
  9. package/dist/envelopes/builders.d.ts +145 -0
  10. package/dist/envelopes/builders.d.ts.map +1 -0
  11. package/dist/envelopes/builders.js +113 -0
  12. package/dist/errors/unknown-permission-name.d.ts +12 -0
  13. package/dist/errors/unknown-permission-name.d.ts.map +1 -0
  14. package/dist/errors/unknown-permission-name.js +29 -0
  15. package/dist/errors/version-mismatch.d.ts +55 -0
  16. package/dist/errors/version-mismatch.d.ts.map +1 -0
  17. package/dist/errors/version-mismatch.js +52 -0
  18. package/dist/gadgets/resolve-contract-gadgets.d.ts +93 -0
  19. package/dist/gadgets/resolve-contract-gadgets.d.ts.map +1 -0
  20. package/dist/gadgets/resolve-contract-gadgets.js +119 -0
  21. package/dist/gadgets/stdlib-gadgets.d.ts +43 -0
  22. package/dist/gadgets/stdlib-gadgets.d.ts.map +1 -0
  23. package/dist/gadgets/stdlib-gadgets.js +161 -0
  24. package/dist/iframe-bridge.d.ts +63 -0
  25. package/dist/iframe-bridge.d.ts.map +1 -0
  26. package/dist/iframe-bridge.js +166 -0
  27. package/dist/index.d.ts +62 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +79 -0
  30. package/dist/integrations/mcp-apps.d.ts +1218 -0
  31. package/dist/integrations/mcp-apps.d.ts.map +1 -0
  32. package/dist/integrations/mcp-apps.js +427 -0
  33. package/dist/navigation/index.d.ts +3 -0
  34. package/dist/navigation/index.d.ts.map +1 -0
  35. package/dist/navigation/index.js +1 -0
  36. package/dist/navigation/stack-navigation.d.ts +55 -0
  37. package/dist/navigation/stack-navigation.d.ts.map +1 -0
  38. package/dist/navigation/stack-navigation.js +80 -0
  39. package/dist/recommended-prompts.d.ts +56 -0
  40. package/dist/recommended-prompts.d.ts.map +1 -0
  41. package/dist/recommended-prompts.js +55 -0
  42. package/dist/registry/blueprint-key.d.ts +9 -0
  43. package/dist/registry/blueprint-key.d.ts.map +1 -0
  44. package/dist/registry/blueprint-key.js +28 -0
  45. package/dist/registry/canonicalize-contract.d.ts +35 -0
  46. package/dist/registry/canonicalize-contract.d.ts.map +1 -0
  47. package/dist/registry/canonicalize-contract.js +166 -0
  48. package/dist/registry/summarize-contract.d.ts +46 -0
  49. package/dist/registry/summarize-contract.d.ts.map +1 -0
  50. package/dist/registry/summarize-contract.js +63 -0
  51. package/dist/schema-learning/derive-contract.d.ts +67 -0
  52. package/dist/schema-learning/derive-contract.d.ts.map +1 -0
  53. package/dist/schema-learning/derive-contract.js +117 -0
  54. package/dist/schema-learning/merge.d.ts +32 -0
  55. package/dist/schema-learning/merge.d.ts.map +1 -0
  56. package/dist/schema-learning/merge.js +146 -0
  57. package/dist/schemas/blueprint.d.ts +32 -0
  58. package/dist/schemas/blueprint.d.ts.map +1 -0
  59. package/dist/schemas/blueprint.js +92 -0
  60. package/dist/schemas/data-contract.d.ts +750 -0
  61. package/dist/schemas/data-contract.d.ts.map +1 -0
  62. package/dist/schemas/data-contract.js +663 -0
  63. package/dist/schemas/gadget-name-grammar.d.ts +29 -0
  64. package/dist/schemas/gadget-name-grammar.d.ts.map +1 -0
  65. package/dist/schemas/gadget-name-grammar.js +28 -0
  66. package/dist/schemas/handshake-suggestion.d.ts +46 -0
  67. package/dist/schemas/handshake-suggestion.d.ts.map +1 -0
  68. package/dist/schemas/handshake-suggestion.js +107 -0
  69. package/dist/schemas/invoke.d.ts +337 -0
  70. package/dist/schemas/invoke.d.ts.map +1 -0
  71. package/dist/schemas/invoke.js +169 -0
  72. package/dist/schemas/mcp.d.ts +301 -0
  73. package/dist/schemas/mcp.d.ts.map +1 -0
  74. package/dist/schemas/mcp.js +373 -0
  75. package/dist/schemas/ops-blueprint.d.ts +176 -0
  76. package/dist/schemas/ops-blueprint.d.ts.map +1 -0
  77. package/dist/schemas/ops-blueprint.js +259 -0
  78. package/dist/schemas/sync-check.d.ts +11 -0
  79. package/dist/schemas/sync-check.d.ts.map +1 -0
  80. package/dist/schemas/sync-check.js +60 -0
  81. package/dist/screen-blueprints/define.d.ts +22 -0
  82. package/dist/screen-blueprints/define.d.ts.map +1 -0
  83. package/dist/screen-blueprints/define.js +3 -0
  84. package/dist/screen-blueprints/index.d.ts +4 -0
  85. package/dist/screen-blueprints/index.d.ts.map +1 -0
  86. package/dist/screen-blueprints/index.js +3 -0
  87. package/dist/screen-blueprints/match.d.ts +35 -0
  88. package/dist/screen-blueprints/match.d.ts.map +1 -0
  89. package/dist/screen-blueprints/match.js +51 -0
  90. package/dist/screen-blueprints/types.d.ts +164 -0
  91. package/dist/screen-blueprints/types.d.ts.map +1 -0
  92. package/dist/screen-blueprints/types.js +1 -0
  93. package/dist/stream/stream-parser.d.ts +62 -0
  94. package/dist/stream/stream-parser.d.ts.map +1 -0
  95. package/dist/stream/stream-parser.js +199 -0
  96. package/dist/transport/websocket.d.ts +178 -0
  97. package/dist/transport/websocket.d.ts.map +1 -0
  98. package/dist/transport/websocket.js +1 -0
  99. package/dist/types/app-config.d.ts +61 -0
  100. package/dist/types/app-config.d.ts.map +1 -0
  101. package/dist/types/app-config.js +1 -0
  102. package/dist/types/auth.d.ts +61 -0
  103. package/dist/types/auth.d.ts.map +1 -0
  104. package/dist/types/auth.js +1 -0
  105. package/dist/types/blueprint.d.ts +206 -0
  106. package/dist/types/blueprint.d.ts.map +1 -0
  107. package/dist/types/blueprint.js +1 -0
  108. package/dist/types/canvas-lifecycle.d.ts +105 -0
  109. package/dist/types/canvas-lifecycle.d.ts.map +1 -0
  110. package/dist/types/canvas-lifecycle.js +38 -0
  111. package/dist/types/capabilities.d.ts +40 -0
  112. package/dist/types/capabilities.d.ts.map +1 -0
  113. package/dist/types/capabilities.js +19 -0
  114. package/dist/types/contract-inference.d.ts +401 -0
  115. package/dist/types/contract-inference.d.ts.map +1 -0
  116. package/dist/types/contract-inference.js +44 -0
  117. package/dist/types/credential.d.ts +41 -0
  118. package/dist/types/credential.d.ts.map +1 -0
  119. package/dist/types/credential.js +32 -0
  120. package/dist/types/data-bindings.d.ts +322 -0
  121. package/dist/types/data-bindings.d.ts.map +1 -0
  122. package/dist/types/data-bindings.js +29 -0
  123. package/dist/types/data-contract.d.ts +1296 -0
  124. package/dist/types/data-contract.d.ts.map +1 -0
  125. package/dist/types/data-contract.js +111 -0
  126. package/dist/types/events.d.ts +182 -0
  127. package/dist/types/events.d.ts.map +1 -0
  128. package/dist/types/events.js +8 -0
  129. package/dist/types/feedback.d.ts +24 -0
  130. package/dist/types/feedback.d.ts.map +1 -0
  131. package/dist/types/feedback.js +7 -0
  132. package/dist/types/gadget.d.ts +121 -0
  133. package/dist/types/gadget.d.ts.map +1 -0
  134. package/dist/types/gadget.js +24 -0
  135. package/dist/types/handshake-suggestion.d.ts +264 -0
  136. package/dist/types/handshake-suggestion.d.ts.map +1 -0
  137. package/dist/types/handshake-suggestion.js +70 -0
  138. package/dist/types/host-context.d.ts +163 -0
  139. package/dist/types/host-context.d.ts.map +1 -0
  140. package/dist/types/host-context.js +142 -0
  141. package/dist/types/interface-context.d.ts +105 -0
  142. package/dist/types/interface-context.d.ts.map +1 -0
  143. package/dist/types/interface-context.js +115 -0
  144. package/dist/types/invoke.d.ts +28 -0
  145. package/dist/types/invoke.d.ts.map +1 -0
  146. package/dist/types/invoke.js +7 -0
  147. package/dist/types/live-channel.d.ts +613 -0
  148. package/dist/types/live-channel.d.ts.map +1 -0
  149. package/dist/types/live-channel.js +1 -0
  150. package/dist/types/llm.d.ts +61 -0
  151. package/dist/types/llm.d.ts.map +1 -0
  152. package/dist/types/llm.js +186 -0
  153. package/dist/types/mcp-proxy.d.ts +67 -0
  154. package/dist/types/mcp-proxy.d.ts.map +1 -0
  155. package/dist/types/mcp-proxy.js +46 -0
  156. package/dist/types/mcp.d.ts +637 -0
  157. package/dist/types/mcp.d.ts.map +1 -0
  158. package/dist/types/mcp.js +30 -0
  159. package/dist/types/openrouter-models.d.ts +22 -0
  160. package/dist/types/openrouter-models.d.ts.map +1 -0
  161. package/dist/types/openrouter-models.js +4843 -0
  162. package/dist/types/region.d.ts +26 -0
  163. package/dist/types/region.d.ts.map +1 -0
  164. package/dist/types/region.js +36 -0
  165. package/dist/types/session.d.ts +419 -0
  166. package/dist/types/session.d.ts.map +1 -0
  167. package/dist/types/session.js +1 -0
  168. package/dist/types/thread.d.ts +207 -0
  169. package/dist/types/thread.d.ts.map +1 -0
  170. package/dist/types/thread.js +57 -0
  171. package/dist/types/ui-generator.d.ts +100 -0
  172. package/dist/types/ui-generator.d.ts.map +1 -0
  173. package/dist/types/ui-generator.js +53 -0
  174. package/dist/validation/ajv-runtime.d.ts +140 -0
  175. package/dist/validation/ajv-runtime.d.ts.map +1 -0
  176. package/dist/validation/ajv-runtime.js +452 -0
  177. package/dist/validation/content-hash.d.ts +3 -0
  178. package/dist/validation/content-hash.d.ts.map +1 -0
  179. package/dist/validation/content-hash.js +21 -0
  180. package/dist/validation/contract-validator.d.ts +244 -0
  181. package/dist/validation/contract-validator.d.ts.map +1 -0
  182. package/dist/validation/contract-validator.js +711 -0
  183. package/dist/validation/cross-references.d.ts +105 -0
  184. package/dist/validation/cross-references.d.ts.map +1 -0
  185. package/dist/validation/cross-references.js +164 -0
  186. package/dist/validation/hygiene-rules.d.ts +250 -0
  187. package/dist/validation/hygiene-rules.d.ts.map +1 -0
  188. package/dist/validation/hygiene-rules.js +564 -0
  189. package/dist/validation/lint-contract.d.ts +130 -0
  190. package/dist/validation/lint-contract.d.ts.map +1 -0
  191. package/dist/validation/lint-contract.js +225 -0
  192. package/dist/validation/name-invariants.d.ts +117 -0
  193. package/dist/validation/name-invariants.d.ts.map +1 -0
  194. package/dist/validation/name-invariants.js +172 -0
  195. package/dist/validation/reserved-channels.d.ts +156 -0
  196. package/dist/validation/reserved-channels.d.ts.map +1 -0
  197. package/dist/validation/reserved-channels.js +356 -0
  198. package/dist/validation/resolve-stream-channel.d.ts +78 -0
  199. package/dist/validation/resolve-stream-channel.d.ts.map +1 -0
  200. package/dist/validation/resolve-stream-channel.js +64 -0
  201. package/dist/validation/sanitize-error.d.ts +46 -0
  202. package/dist/validation/sanitize-error.d.ts.map +1 -0
  203. package/dist/validation/sanitize-error.js +88 -0
  204. package/dist/validation/schema-compat-invariants.d.ts +140 -0
  205. package/dist/validation/schema-compat-invariants.d.ts.map +1 -0
  206. package/dist/validation/schema-compat-invariants.js +220 -0
  207. package/dist/validation/schema-meta-validation.d.ts +60 -0
  208. package/dist/validation/schema-meta-validation.d.ts.map +1 -0
  209. package/dist/validation/schema-meta-validation.js +131 -0
  210. package/dist/validation/schema-subset.d.ts +165 -0
  211. package/dist/validation/schema-subset.d.ts.map +1 -0
  212. package/dist/validation/schema-subset.js +295 -0
  213. package/dist/validation/ui-security.d.ts +54 -0
  214. package/dist/validation/ui-security.d.ts.map +1 -0
  215. package/dist/validation/ui-security.js +138 -0
  216. package/dist/validation/zod-to-json-schema.d.ts +63 -0
  217. package/dist/validation/zod-to-json-schema.d.ts.map +1 -0
  218. package/dist/validation/zod-to-json-schema.js +126 -0
  219. package/dist/version.d.ts +1458 -0
  220. package/dist/version.d.ts.map +1 -0
  221. package/dist/version.js +1459 -0
  222. package/package.json +113 -0
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Two-axis region model:
3
+ *
4
+ * - `Market` is user-facing. Drives Discover visibility, editorial curation,
5
+ * and compliance copy. Users see flags / country names, never AWS regions.
6
+ * - `ServingRegion` is infra-facing. Drives compute, storage, routing, and
7
+ * residency. Surfaced in UI only as "Data processed in {country}" when
8
+ * userMarket ≠ servingRegion locality, and only inside a details section.
9
+ *
10
+ * A `Thread` is pinned to a single `servingRegion` at creation time.
11
+ * Write-once, immutable, enforced via DynamoDB conditional write.
12
+ *
13
+ * Do NOT use ad-hoc strings for either axis in app code — import from here.
14
+ */
15
+ export declare const MARKETS: readonly ["KR", "JP", "US", "GLOBAL"];
16
+ export type Market = (typeof MARKETS)[number];
17
+ export declare const SERVING_REGIONS: readonly ["ap-northeast-2", "ap-northeast-1", "us-east-1"];
18
+ export type ServingRegion = (typeof SERVING_REGIONS)[number];
19
+ export declare function isMarket(value: unknown): value is Market;
20
+ export declare function isServingRegion(value: unknown): value is ServingRegion;
21
+ /**
22
+ * Human-facing country display for a ServingRegion. Used only in the
23
+ * "Data processed in {country}" disclosure on Agent Profile.
24
+ */
25
+ export declare const SERVING_REGION_COUNTRY: Record<ServingRegion, string>;
26
+ //# sourceMappingURL=region.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"region.d.ts","sourceRoot":"","sources":["../../src/types/region.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,eAAO,MAAM,OAAO,uCAAwC,CAAC;AAC7D,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9C,eAAO,MAAM,eAAe,4DAIlB,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAKtE;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAIhE,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Two-axis region model:
3
+ *
4
+ * - `Market` is user-facing. Drives Discover visibility, editorial curation,
5
+ * and compliance copy. Users see flags / country names, never AWS regions.
6
+ * - `ServingRegion` is infra-facing. Drives compute, storage, routing, and
7
+ * residency. Surfaced in UI only as "Data processed in {country}" when
8
+ * userMarket ≠ servingRegion locality, and only inside a details section.
9
+ *
10
+ * A `Thread` is pinned to a single `servingRegion` at creation time.
11
+ * Write-once, immutable, enforced via DynamoDB conditional write.
12
+ *
13
+ * Do NOT use ad-hoc strings for either axis in app code — import from here.
14
+ */
15
+ export const MARKETS = ['KR', 'JP', 'US', 'GLOBAL'];
16
+ export const SERVING_REGIONS = [
17
+ 'ap-northeast-2', // Seoul
18
+ 'ap-northeast-1', // Tokyo
19
+ 'us-east-1', // N. Virginia
20
+ ];
21
+ export function isMarket(value) {
22
+ return typeof value === 'string' && MARKETS.includes(value);
23
+ }
24
+ export function isServingRegion(value) {
25
+ return (typeof value === 'string' &&
26
+ SERVING_REGIONS.includes(value));
27
+ }
28
+ /**
29
+ * Human-facing country display for a ServingRegion. Used only in the
30
+ * "Data processed in {country}" disclosure on Agent Profile.
31
+ */
32
+ export const SERVING_REGION_COUNTRY = {
33
+ 'ap-northeast-2': 'South Korea',
34
+ 'ap-northeast-1': 'Japan',
35
+ 'us-east-1': 'United States',
36
+ };
@@ -0,0 +1,419 @@
1
+ import type { EventSubscription } from './events';
2
+ import type { CapabilityPermissions, QualityMetadata } from './capabilities';
3
+ import type { KNOWN_PERMISSION_NAMES } from '../validation/hygiene-rules';
4
+ import type { PropsSpec, StreamSpec, ActionSpec, ContextSpec, ClientCapabilitiesSpec, GadgetDescriptor, JsonSchema, JsonObject } from './data-contract';
5
+ import type { EndUserIdentity } from './auth';
6
+ import type { HostContextProjection } from './host-context';
7
+ import type { McpAppsMode } from './app-config';
8
+ import type { McpAppsStackItem } from '../integrations/mcp-apps';
9
+ /**
10
+ * Declarative action for interactive UI elements.
11
+ *
12
+ * @deprecated Pre-actionSpec wire shape. New code declares user gestures
13
+ * via {@link DataContract.actionSpec} ({@link ActionEntry}); the entry
14
+ * carries `label` / `schema` / `nextStep` / `confirm` / `icon`. This
15
+ * interface is retained because some stored stack items still carry an
16
+ * `actions?: Action[]` field through denormalizers.
17
+ *
18
+ * Extends {@link JsonObject} so it can be serialized directly over
19
+ * WebSocket or stored server-side without transformation.
20
+ */
21
+ export interface Action extends JsonObject {
22
+ /** Unique identifier for this action (returned in the event payload) */
23
+ id: string;
24
+ /** Human-readable label displayed on the UI element */
25
+ label: string;
26
+ /** Optional description shown as secondary text */
27
+ description?: string;
28
+ /** Optional icon hint (emoji or icon name) */
29
+ icon?: string;
30
+ /** Visual style hint */
31
+ variant?: 'primary' | 'secondary' | 'danger' | 'ghost';
32
+ /** Whether to show confirmation before triggering */
33
+ confirm?: boolean | string;
34
+ /** Whether currently disabled */
35
+ disabled?: boolean;
36
+ }
37
+ /**
38
+ * Stack item — the generated/native component variant.
39
+ *
40
+ * One of two variants in the {@link SessionStackEntry} discriminated
41
+ * union (the other being {@link McpAppsStackItem} for inbound MCP Apps
42
+ * hosting). The discriminator is the optional `type` field:
43
+ * - `type: 'component'` or absent → this variant (generated UI).
44
+ * - `type: 'mcpApps'` → {@link McpAppsStackItem}.
45
+ *
46
+ * Existing producers that don't populate `type` continue to create
47
+ * component items — `type` is optional for back-compat with stored
48
+ * data and producers from before the discriminated-union landed.
49
+ * Consumers narrow via `item.type === 'mcpApps'` (or the
50
+ * {@link isMcpAppsStackItem} helper in
51
+ * `@ggui-ai/protocol/integrations/mcp-apps`).
52
+ *
53
+ * Generic `TProps` defaults to {@link JsonObject} for untyped usage.
54
+ * When a contract is known, pass the inferred type for compile-time safety:
55
+ * `StackItem<{ city: string; temperature: number }>`
56
+ */
57
+ export interface StackItem<TProps = JsonObject> {
58
+ id: string;
59
+ /**
60
+ * Variant discriminator. Optional on this (component) variant — an
61
+ * absent `type` implicitly means `'component'`. Required `'mcpApps'`
62
+ * on the {@link McpAppsStackItem} variant.
63
+ */
64
+ type?: 'component';
65
+ /**
66
+ * Theme preset id for THIS stack item — agent-explicit per-push
67
+ * override on the layered theme-resolution chain:
68
+ *
69
+ * 1. `StackItem.themeId` — this field (rare; agent explicit)
70
+ * 2. `Session.themeId` — chat-scoped default (set on new_session)
71
+ * 3. `App.defaultThemeId` — server-side per-app default
72
+ * 4. server fallback — `listThemes()[0]` / process default
73
+ *
74
+ * First non-undefined wins at bootstrap-meta projection time. Set
75
+ * this only when the agent wants ONE push to render differently
76
+ * from the session default (e.g. an urgent alert in `crimson` while
77
+ * the rest of the chat stays on `slate`). Most pushes omit it and
78
+ * inherit the session theme; that's the intended common case.
79
+ */
80
+ themeId?: string;
81
+ /** Blueprint component code (pure UI) */
82
+ componentCode: string;
83
+ /** Props to pass to the component at render time.
84
+ * Carries request-specific data values (e.g., { city: "Seoul", temperature: 15 }).
85
+ * Renderer passes these as: <Component {...props} /> */
86
+ props?: TProps;
87
+ /** The prompt that produced this component (if LLM-generated) */
88
+ prompt?: string;
89
+ /** Human-readable description of what this component is */
90
+ description?: string;
91
+ /** Content type. Determines how componentCode is interpreted.
92
+ * Default: 'application/javascript+react' */
93
+ contentType?: string;
94
+ /** Agent message to display while the component generates (thinking indicator) */
95
+ message?: string;
96
+ /** JSON Schema for validating user-submitted form data */
97
+ schema?: JsonSchema;
98
+ /**
99
+ * Event filter — pre-actionSpec event-routing surface.
100
+ *
101
+ * @deprecated The four-spec model (propsSpec/actionSpec/streamSpec/
102
+ * contextSpec) on {@link DataContract} replaces wholesale event
103
+ * filtering. Retained on stored stack items for back-compat.
104
+ */
105
+ subscription?: EventSubscription;
106
+ /** Capability permissions granted to this component */
107
+ capabilities?: CapabilityPermissions;
108
+ /**
109
+ * Declarative interaction contract — pre-actionSpec list shape.
110
+ *
111
+ * @deprecated Use {@link DataContract.actionSpec} ({@link ActionEntry})
112
+ * instead. Retained on stored stack items for back-compat.
113
+ */
114
+ actions?: Action[];
115
+ /** Quality evaluation metadata */
116
+ quality?: QualityMetadata;
117
+ /** Generation error message (populated on failure) */
118
+ error?: string;
119
+ /** Stream contract — describes what data the component accepts in real-time via ggui_emit */
120
+ streamSpec?: StreamSpec;
121
+ /** Props contract — initial render data interface (JSON Schema-based) */
122
+ propsSpec?: PropsSpec;
123
+ /** Action contract — user interaction callbacks (JSON Schema-based) */
124
+ actionSpec?: ActionSpec;
125
+ /** Context contract — observable client state surfaced to the agent's
126
+ * LLM context via React Context Providers. See {@link ContextSpec}
127
+ * for the full contract. */
128
+ contextSpec?: ContextSpec;
129
+ /**
130
+ * Client capabilities catalog — declarative browser-capability gadget
131
+ * hook bindings carried alongside this stack item. Mirrored verbatim
132
+ * from `DataContract.clientCapabilities` at `ggui_push` commit time.
133
+ *
134
+ * The persisted shape is the **wire** view
135
+ * ({@link ClientCapabilitiesSpec}) — package-keyed:
136
+ * `Record<package, { exports: Record<exportName, …> }>`. Identity
137
+ * (`package` + per-export `name`) is preserved verbatim from the
138
+ * agent's push payload — no enrichment overlay, no `version` (it
139
+ * resolves from `App.gadgets`). Resolution metadata (`version`,
140
+ * `bundleUrl`, `bundleSri`, `bundleHost`, `permission`, `connect`,
141
+ * `styleUrl`, ...) lives on the parallel
142
+ * {@link SessionStackEntry.gadgetDescriptors} sidecar — a filtered
143
+ * snapshot of `App.gadgets` covering only the descriptors referenced
144
+ * by this contract.
145
+ *
146
+ * Absent ⇒ no permissions requested (default-deny). Bootstrap omits
147
+ * `permissionsPolicy` and the public-render HTTP response sets no
148
+ * `Permissions-Policy` header beyond the host's own defaults.
149
+ */
150
+ clientCapabilities?: ClientCapabilitiesSpec;
151
+ /**
152
+ * Descriptor sidecar. Subset of `App.gadgets` containing
153
+ * exactly the descriptors referenced by `clientCapabilities.gadgets`
154
+ * — matched by `(package, export name)`. `version` is not on the
155
+ * wire; it resolves from each descriptor's `App.gadgets` entry.
156
+ * Snapshot at push-time; never re-resolved at render. Permissions-Policy
157
+ * + CSP + bundle-loader derivation read from this array (see
158
+ * `bootstrap-meta-derivation.ts`).
159
+ *
160
+ * Smaller than the full `App.gadgets` (~1-5KB typical); the full
161
+ * catalog stays recoverable from operator config if forensics need it.
162
+ *
163
+ * Omitted when `clientCapabilities` declares no gadgets.
164
+ */
165
+ gadgetDescriptors?: readonly GadgetDescriptor[];
166
+ /**
167
+ * Last-known snapshot of the contextSpec slot values, mirrored from
168
+ * the runtime's `ui/update-model-context` posts via `ggui_runtime_sync_context`.
169
+ * Keyed by slot name; values are JSON-serializable per the slot's
170
+ * declared schema. Last-write-wins (REPLACE semantics, never merge).
171
+ *
172
+ * Resume contract — when chat-history rehydrate re-mounts the
173
+ * iframe, the resource handler seeds `contextSlots[i].default` with
174
+ * `contextSnapshot[name]` (when present) instead of the
175
+ * authoring-time default. Without this field, rehydrate loses the
176
+ * user's interactive state (typed text, counter values, toggle
177
+ * positions); with it, the user sees their last-known state.
178
+ *
179
+ * Absent on initial render until the first context-update fires
180
+ * from the runtime. The bootstrap-meta projection
181
+ * (`deriveStackItemBootstrapView`) gracefully falls back to
182
+ * `entry.default` per slot when this field is absent.
183
+ */
184
+ contextSnapshot?: JsonObject;
185
+ createdAt: string;
186
+ }
187
+ /**
188
+ * Recognised system-card kinds the runtime renders via built-in
189
+ * components. The wire is open-ended (string), but new kinds without a
190
+ * matching renderer fall through to a generic "system message" card so
191
+ * an old runtime + new server still produce something visible.
192
+ */
193
+ export type SystemStackItemKind = 'no-credentials' | 'mcp-apps-probe' | (string & {});
194
+ /**
195
+ * Stack item — server-emitted system card.
196
+ *
197
+ * The third StackItem variant. Used when the SERVER (not an LLM, not
198
+ * an MCP host) needs to render a UI card the operator can act on:
199
+ * "set up your LLM key", "rate limited, try later", "server is
200
+ * misconfigured", etc.
201
+ *
202
+ * Why a separate variant: prior to this, system cards were authored
203
+ * as raw ESM source strings inlined alongside generated `componentCode`
204
+ * (see deleted `CONNECT_CLAUDE_CARD_COMPONENT_CODE`). That pattern
205
+ * bypasses TS, lint, and design-system co-evolution, and forces server
206
+ * code to hand-emit `React.createElement` calls. The system variant
207
+ * carries an opaque `kind` + structured `props`; the runtime maps the
208
+ * kind to a real `.tsx` component bundled inside it.
209
+ *
210
+ * Wire shape is intentionally tiny — server emits identifier + data,
211
+ * not code.
212
+ */
213
+ export interface SystemStackItem<TProps extends JsonObject = JsonObject> {
214
+ id: string;
215
+ type: 'system';
216
+ /**
217
+ * Identifier the runtime maps to a built-in renderer. Stable strings
218
+ * (kebab-case) that survive runtime version skew — adding a new kind
219
+ * never breaks an older runtime; it just falls through to a generic
220
+ * card carrying the props as raw JSON.
221
+ */
222
+ kind: SystemStackItemKind;
223
+ /** Props forwarded to the built-in renderer. */
224
+ props?: TProps;
225
+ /** Optional descriptive text the server can attach (telemetry, logs). */
226
+ description?: string;
227
+ createdAt: string;
228
+ }
229
+ /**
230
+ * Canonical session-stack entry — discriminated union over the three
231
+ * stack-item variants ggui supports:
232
+ *
233
+ * - {@link StackItem} — generated / native component (has
234
+ * `componentCode`, `actionSpec`, `streamSpec`, etc.).
235
+ * - {@link McpAppsStackItem} — embedded third-party MCP App iframe.
236
+ * - {@link SystemStackItem} — server-emitted system card (carries a
237
+ * stable `kind` + props; runtime renders via a built-in
238
+ * component).
239
+ *
240
+ * Narrowing pattern:
241
+ * ```ts
242
+ * if (entry.type === 'mcpApps') {
243
+ * // McpAppsStackItem — render via host-role adapter
244
+ * } else if (entry.type === 'system') {
245
+ * // SystemStackItem — render via built-in card registry
246
+ * } else {
247
+ * // StackItem — render via DynamicComponent
248
+ * }
249
+ * ```
250
+ *
251
+ * Or use the {@link isMcpAppsStackItem} / component helpers exported
252
+ * from `@ggui-ai/protocol/integrations/mcp-apps`.
253
+ */
254
+ export type SessionStackEntry<TProps = JsonObject> = StackItem<TProps> | McpAppsStackItem | SystemStackItem;
255
+ /**
256
+ * Adapter permission status
257
+ */
258
+ export type PermissionStatus = 'granted' | 'denied' | 'prompt';
259
+ /**
260
+ * Adapter permissions — per-session map keyed by Web Permissions API
261
+ * name (see `KNOWN_PERMISSION_NAMES` in `validation/hygiene-rules.ts`).
262
+ *
263
+ * Keys derive from `KNOWN_PERMISSION_NAMES` so there's one source of
264
+ * truth for permission identifiers across the protocol surface
265
+ * (schema validation, hygiene rules, and runtime SDK cache).
266
+ *
267
+ * Pre-launch posture: no backward-compat alias for the old field
268
+ * names — every consumer reads/writes through the runtime SDK
269
+ * `requestPermission` call, which itself is gated against the same
270
+ * enum.
271
+ */
272
+ export type AdapterPermissions = {
273
+ readonly [K in (typeof KNOWN_PERMISSION_NAMES)[number]]?: PermissionStatus;
274
+ };
275
+ /**
276
+ * Session state (internal — includes implementation details like connectionId)
277
+ */
278
+ export interface Session {
279
+ id: string;
280
+ appId: string;
281
+ connectionId?: string;
282
+ userId?: string;
283
+ /** Full authenticated end-user identity (populated after auth gate) */
284
+ endUserIdentity?: EndUserIdentity;
285
+ /**
286
+ * Theme preset id for this chat-scoped session. Set on
287
+ * `ggui_new_session` from the agent's explicit `themeId` input or
288
+ * the per-app `App.defaultThemeId` default. Read at every
289
+ * `ggui_push` commit so the bootstrap-meta projection can resolve
290
+ * the layered theme chain (see {@link StackItem.themeId} for the
291
+ * full ordering). Absent ⇒ the chain falls through to the app /
292
+ * server default at render time.
293
+ */
294
+ themeId?: string;
295
+ stack: SessionStackEntry[];
296
+ currentStackIndex: number;
297
+ adapterPermissions: AdapterPermissions;
298
+ eventSequence: number;
299
+ createdAt: number;
300
+ lastActivityAt: number;
301
+ expiresAt: number;
302
+ /**
303
+ * Resolved session lifecycle status. SessionStore implementations
304
+ * MAY populate this on `get` (e.g. InMemory + Sqlite compute from
305
+ * internal `closed` flag + `expiresAt`; cloud Dynamo reads
306
+ * `sessionStatus` row column). Absent = caller treats as
307
+ * `'active'` — the legacy default for stores that don't surface
308
+ * lifecycle state.
309
+ */
310
+ status?: 'active' | 'completed' | 'expired';
311
+ /**
312
+ * Latest `HostContextProjection` echoed from the iframe-runtime via
313
+ * the live-channel `host_context_observed` message. Captured at iframe
314
+ * `ui/initialize` time + updated on every spec-defined
315
+ * `ui/notifications/host-context-changed` notification.
316
+ *
317
+ * Surfaced to the agent via `client.hostContext` on `ggui_handshake`
318
+ * and `ggui_consume` output so the agent can reason about device
319
+ * class, available display modes, and container dimensions on each
320
+ * turn..
321
+ *
322
+ * Absent ⇒ the iframe has not echoed a HostContext yet (first push
323
+ * before iframe mount, or non-spec-compliant host that doesn't
324
+ * supply `McpUiHostContext`). Agent falls back to ggui's own
325
+ * `InterfaceContext` in that case.
326
+ */
327
+ hostContext?: HostContextProjection;
328
+ /**
329
+ * Resolved MCP-Apps presentation mode for this session. Persisted at
330
+ * `ggui_new_session` time from the app config's `defaultMcpAppsMode`
331
+ * so mid-session app-config changes don't disrupt live sessions.
332
+ *
333
+ * - `'inline'` (default): each `ggui_push` returns its own ui://
334
+ * resource. Today's behavior.
335
+ * - `'canvas'`: a session-scoped iframe was minted by
336
+ * `ggui_new_session`. `ggui_push` delivers via live-channel WS once
337
+ * the canvas iframe completes its `ui/initialize` handshake (see
338
+ * {@link canvasLoaded}).
339
+ *
340
+ * Absent ⇒ `'inline'` (zero-config default for legacy sessions).
341
+ *
342
+ */
343
+ mcpAppsMode?: McpAppsMode;
344
+ /**
345
+ * Set to `true` when the canvas iframe (for `mcpAppsMode === 'canvas'`
346
+ * sessions) has completed its `ui/initialize` handshake AND opened
347
+ * its live-channel subscription. Read by `ggui_push` to decide whether
348
+ * to deliver state via WS (canvas loaded) or return a per-push
349
+ * resource (canvas not yet loaded → fallback to inline-style
350
+ * delivery for that single push).
351
+ *
352
+ * Always undefined / false for `mcpAppsMode === 'inline'` sessions.
353
+ *
354
+ */
355
+ canvasLoaded?: boolean;
356
+ /**
357
+ * Currently-active stack item id from the canvas's user nav stack.
358
+ * Updated server-side on every `canvas_navigated` envelope from the
359
+ * iframe. Drives `ggui_consume`'s active-pipe resolution (consumer
360
+ * picks events targeting the active item, ignoring background
361
+ * cold-gen for items the user has navigated away from) and gates
362
+ * which in-flight `runGeneration` AbortSignals should fire.
363
+ *
364
+ * Distinct from `currentStackIndex`: that field tracks the SERVER's
365
+ * stack mutation cursor (last push location); this tracks the
366
+ * USER's navigation focus. They can diverge when the agent pushes
367
+ * item C while the user is on item B — currentStackIndex points
368
+ * to C, activeStackItemId stays B.
369
+ *
370
+ * Absent for inline sessions + the first push of a canvas session
371
+ * before any `canvas_navigated` lands..
372
+ */
373
+ activeStackItemId?: string;
374
+ }
375
+ /**
376
+ * Session view — clean protocol representation (no internal fields).
377
+ * This is what agents see via getSession.
378
+ */
379
+ export interface SessionView {
380
+ id: string;
381
+ appId: string;
382
+ status: 'active' | 'completed' | 'expired';
383
+ stack: SessionStackEntry[];
384
+ currentStackIndex: number;
385
+ eventSequence: number;
386
+ endUserIdentity?: EndUserIdentity;
387
+ adapterPermissions?: AdapterPermissions;
388
+ createdAt: string;
389
+ lastActivityAt: string;
390
+ expiresAt: string;
391
+ }
392
+ /**
393
+ * A single turn in the agent-user conversation.
394
+ * Platforms SHOULD record conversation turns automatically and forward them to agents.
395
+ *
396
+ * Generic `TToolArgs` defaults to {@link JsonObject} for the tool call arguments type.
397
+ */
398
+ export interface ConversationTurn<TToolArgs = JsonObject> {
399
+ role: 'user' | 'agent';
400
+ content: string;
401
+ toolCalls?: {
402
+ name: string;
403
+ args: TToolArgs;
404
+ }[];
405
+ timestamp: string;
406
+ }
407
+ /**
408
+ * Progress update emitted by a producer during component production.
409
+ * Delivered via the `ggui:logs` bridge event.
410
+ */
411
+ export interface ProgressUpdate {
412
+ sessionId: string;
413
+ stackItemId: string;
414
+ step: 'queued' | 'negotiating' | 'matching' | 'generating' | 'compiling' | 'evaluating' | 'complete' | 'error';
415
+ label: string;
416
+ percent: number;
417
+ message?: string;
418
+ }
419
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/types/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};