@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,259 @@
1
+ /**
2
+ * Zod input + output schemas for the operator-class blueprint tools.
3
+ * Four tools, all `audience: 'ops'`, all served on `/ops`:
4
+ *
5
+ * - `ggui_ops_generate_blueprint` — author a new blueprint by
6
+ * dispatching through the registry's selected generator and
7
+ * persisting the result. Optionally pins as the operator default
8
+ * for its `(appId, contractHash)` group.
9
+ * - `ggui_ops_list_blueprints` — enumerate blueprint metadata
10
+ * (no code body) under tenancy + optional filters. Sorted by
11
+ * `createdAt desc`.
12
+ * - `ggui_ops_update_blueprint` — toggle the operator-default flag
13
+ * and/or patch variance tags. Immutable fields (contractHash,
14
+ * appId, codeS3Url, codeHash, generator, createdAt, createdBy)
15
+ * never mutate; the tool MUST refuse them on input.
16
+ * - `ggui_ops_delete_blueprint` — idempotent removal. Second delete
17
+ * for the same id returns `{deleted: true}` — never throws.
18
+ *
19
+ * The schemas live in `@ggui-ai/protocol` (not the handler package)
20
+ * for the same reason all wire-shape schemas do: the protocol package
21
+ * is the source of truth for every MCP wire surface, and consumers
22
+ * (cloud pod handlers, console UI, fixture authors) can import from
23
+ * one place. Handler package wraps these into `SharedHandler`
24
+ * factories.
25
+ */
26
+ import { z } from 'zod';
27
+ import { dataContractSchema, jsonValueSchema, } from './data-contract.js';
28
+ import { blueprintSchema, blueprintVarianceSchema } from './blueprint.js';
29
+ /**
30
+ * `ggui_ops_generate_blueprint` input. Operator picks the contract +
31
+ * optional generator override + variance tags. `setAsOperatorDefault`
32
+ * pins the newly-minted blueprint as the default for its
33
+ * `(appId, contractHash)` group (the store clears any prior default
34
+ * in the same group, mirroring `BlueprintStore.setOperatorDefault`).
35
+ *
36
+ * `persona` is a top-level convenience field — handlers fold it into
37
+ * the `variance.persona` slot after normalization (lowercase + trim
38
+ * + Levenshtein near-dup warning).
39
+ *
40
+ * `appId` is NOT on the input shape — the handler reads it off
41
+ * `ctx.appId` resolved by the upstream auth adapter. Cross-tenant
42
+ * authorship would be a security-boundary violation.
43
+ */
44
+ export const opsGenerateBlueprintInputSchema = z
45
+ .object({
46
+ contract: dataContractSchema,
47
+ generator: z
48
+ .string()
49
+ .min(1)
50
+ .optional()
51
+ .describe('Generator slug (e.g. `ui-gen-default-haiku-4-5`). When omitted, dispatches through `GeneratorRegistry.defaultGenerator()`.'),
52
+ persona: z
53
+ .string()
54
+ .optional()
55
+ .describe("Free-form persona tag (e.g. 'minimalist', 'data-dense'). Normalized via lowercase+trim before persistence; logged as a warning when within Levenshtein distance < 2 of an existing tag for the same appId."),
56
+ aesthetic: z
57
+ .string()
58
+ .optional()
59
+ .describe("Free-form aesthetic tag (e.g. 'glassmorphic', 'brutalist', 'editorial'). Persisted on `Blueprint.variance.aesthetic`. Distinct from persona — persona names the user mental model; aesthetic names the visual treatment."),
60
+ context: z
61
+ .record(z.string(), jsonValueSchema)
62
+ .optional()
63
+ .describe('Small structured signal carried alongside the persona. Persisted on `Blueprint.variance.context`.'),
64
+ seedPrompt: z
65
+ .string()
66
+ .optional()
67
+ .describe("The raw operator prompt that produced this variant. Round-trip input for the variant-selector + audit trail."),
68
+ setAsOperatorDefault: z
69
+ .boolean()
70
+ .optional()
71
+ .describe('When true, pins the new blueprint as the operator default for its `(appId, contractHash)` group, clearing any prior default in the same group.'),
72
+ })
73
+ .strict();
74
+ /**
75
+ * `ggui_ops_generate_blueprint` output. Metadata-only — the code body
76
+ * lives in S3 (cloud) or the in-memory code map (OSS) and is fetched
77
+ * via the existing push fast-path on cache hit.
78
+ */
79
+ export const opsGenerateBlueprintOutputSchema = z
80
+ .object({
81
+ blueprintId: z.string().min(1),
82
+ codeHash: z
83
+ .string()
84
+ .optional()
85
+ .describe('Content hash of the generated code body. Absent when the generator returned a non-`ok` result and persistence skipped — the failure mode is surfaced through generator-level error reporting elsewhere.'),
86
+ validatorScore: z
87
+ .number()
88
+ .min(0)
89
+ .max(1)
90
+ .optional()
91
+ .describe("Advanced generator's iterative-loop validator score (0-1). Absent for default-generator output."),
92
+ generator: z
93
+ .string()
94
+ .min(1)
95
+ .describe('Slug of the generator the dispatch resolved to.'),
96
+ })
97
+ .strict();
98
+ /**
99
+ * `ggui_ops_register_blueprint` input. Sibling of `*_generate_*` — no
100
+ * LLM dispatch, no generator. The operator supplies the COMPONENT
101
+ * CODE BYTES directly and the handler persists them under the same
102
+ * `(appId, contractHash)` slot. Use cases:
103
+ *
104
+ * - Seeding pre-vetted blueprints at deploy time (fixture corpus,
105
+ * migration imports).
106
+ * - Round-tripping export+reimport — operator exports a blueprint
107
+ * from one tenant and re-registers it in another.
108
+ * - Reapplying a fixed version of a blueprint after live edits
109
+ * (manual recovery from a bad generate run).
110
+ *
111
+ * Same tenancy + variance + default-pin semantics as
112
+ * `*_generate_*`; the only difference is the LLM/generator dispatch
113
+ * is replaced with a verbatim accept of the operator's
114
+ * `componentCode` string.
115
+ *
116
+ * `generator` is OPTIONAL here too — when omitted, the handler stamps
117
+ * the registry default's slug onto the persisted Blueprint so
118
+ * downstream `*_list_blueprints` consumers see a stable provenance
119
+ * field. `validatorScore` is never populated (no validator ran);
120
+ * operators wanting validator metadata should round-trip through
121
+ * `*_generate_*` instead.
122
+ */
123
+ export const opsRegisterBlueprintInputSchema = z
124
+ .object({
125
+ contract: dataContractSchema,
126
+ componentCode: z
127
+ .string()
128
+ .min(1)
129
+ .describe('Verbatim component-code body to persist. Stored as-is — no LLM call, no validator pass. Operator owns correctness; the handler computes the canonical sha256 codeHash and routes the bytes through the same persistence seams as `*_generate_*`.'),
130
+ generator: z
131
+ .string()
132
+ .min(1)
133
+ .optional()
134
+ .describe('Optional generator slug to stamp on the persisted Blueprint.generator field — purely an audit/provenance hint for downstream `*_list_blueprints` consumers. Defaults to the registry default slug.'),
135
+ persona: z
136
+ .string()
137
+ .optional()
138
+ .describe("Free-form persona tag (e.g. 'minimalist', 'data-dense'). Normalized via lowercase+trim before persistence; logged as a warning when within Levenshtein distance < 2 of an existing tag for the same appId."),
139
+ aesthetic: z
140
+ .string()
141
+ .optional()
142
+ .describe("Free-form aesthetic tag. Persisted on `Blueprint.variance.aesthetic`."),
143
+ context: z
144
+ .record(z.string(), jsonValueSchema)
145
+ .optional()
146
+ .describe('Small structured signal carried alongside the persona. Persisted on `Blueprint.variance.context`.'),
147
+ seedPrompt: z
148
+ .string()
149
+ .optional()
150
+ .describe('Optional originating prompt for audit + round-tripping (e.g. the prose the operator originally fed into `*_generate_*` before exporting).'),
151
+ setAsOperatorDefault: z
152
+ .boolean()
153
+ .optional()
154
+ .describe('When true, pins the new blueprint as the operator default for its `(appId, contractHash)` group, clearing any prior default in the same group.'),
155
+ })
156
+ .strict();
157
+ /**
158
+ * `ggui_ops_register_blueprint` output. Same shape as
159
+ * `*_generate_*` minus `validatorScore` (no validator runs on the
160
+ * register path).
161
+ */
162
+ export const opsRegisterBlueprintOutputSchema = z
163
+ .object({
164
+ blueprintId: z.string().min(1),
165
+ codeHash: z
166
+ .string()
167
+ .min(1)
168
+ .describe('Content hash of the persisted code body (full sha256 hex).'),
169
+ generator: z
170
+ .string()
171
+ .min(1)
172
+ .describe('Resolved generator slug stamped on the Blueprint.generator field — either the supplied input or the registry default.'),
173
+ })
174
+ .strict();
175
+ /**
176
+ * `ggui_ops_list_blueprints` input. `appId` is NOT carried on the
177
+ * wire — handlers scope from `ctx.appId`. The filters below are AND-
178
+ * composed against the matching `(appId, *)` view of the store.
179
+ *
180
+ * Behavior split:
181
+ * - When `contractHash` is the ONLY filter (no semantic keywords
182
+ * or persona), handlers dispatch through
183
+ * `BlueprintStore.list(appId, contractHash)` for the indexed
184
+ * fast path.
185
+ * - When `intentKeywords` or `persona` carry semantic intent,
186
+ * handlers dispatch through `BlueprintSearch.search()` and
187
+ * return the matching rows (sorted by score desc, then
188
+ * `createdAt desc`).
189
+ * - When no filter is supplied, handlers enumerate every blueprint
190
+ * under `appId` via the search seam (which scopes by appId
191
+ * internally), sorted `createdAt desc`.
192
+ */
193
+ export const opsListBlueprintsInputSchema = z
194
+ .object({
195
+ contractHash: z
196
+ .string()
197
+ .min(1)
198
+ .optional()
199
+ .describe('Filter to a single `(appId, contractHash)` group. Combine with `generator` / `persona` to narrow within the group.'),
200
+ generator: z
201
+ .string()
202
+ .min(1)
203
+ .optional()
204
+ .describe('Filter to blueprints produced by a specific generator slug.'),
205
+ persona: z
206
+ .string()
207
+ .optional()
208
+ .describe('Filter on `variance.persona`. Normalized to match persisted form (lowercase+trim).'),
209
+ intentKeywords: z
210
+ .array(z.string().min(1))
211
+ .optional()
212
+ .describe('Semantic-search tokens. When set, dispatches through `BlueprintSearch.search()` rather than indexed `list()`.'),
213
+ })
214
+ .strict();
215
+ export const opsListBlueprintsOutputSchema = z
216
+ .object({
217
+ blueprints: z.array(blueprintSchema),
218
+ })
219
+ .strict();
220
+ /**
221
+ * `ggui_ops_update_blueprint` input. Only mutable fields are present
222
+ * here — `contractHash`, `appId`, `codeS3Url`, `codeHash`,
223
+ * `generator`, `createdAt`, `createdBy` are immutable invariants
224
+ * and the schema does NOT accept them. Operators who want to
225
+ * "replace" a row delete + re-generate.
226
+ */
227
+ export const opsUpdateBlueprintInputSchema = z
228
+ .object({
229
+ blueprintId: z.string().min(1),
230
+ isOperatorDefault: z
231
+ .literal(true)
232
+ .optional()
233
+ .describe('When `true`, pins this blueprint as the operator default for its `(appId, contractHash)` group. Clears any prior default. Cannot set to `false` — to unpin, set another blueprint in the same group as default, or delete this one.'),
234
+ variance: blueprintVarianceSchema
235
+ .optional()
236
+ .describe('Partial-merge into the existing variance. Supplied keys overwrite; omitted keys preserve. Pass `{persona: ""}` to clear a persona (handler treats empty string as removal).'),
237
+ })
238
+ .strict();
239
+ export const opsUpdateBlueprintOutputSchema = z
240
+ .object({
241
+ blueprintId: z.string().min(1),
242
+ updatedAt: z.string().min(1),
243
+ })
244
+ .strict();
245
+ /**
246
+ * `ggui_ops_delete_blueprint` input + output. Idempotent: the handler
247
+ * returns `{deleted: true}` regardless of whether the row existed,
248
+ * matching `BlueprintStore.delete`'s no-throw contract.
249
+ */
250
+ export const opsDeleteBlueprintInputSchema = z
251
+ .object({
252
+ blueprintId: z.string().min(1),
253
+ })
254
+ .strict();
255
+ export const opsDeleteBlueprintOutputSchema = z
256
+ .object({
257
+ deleted: z.literal(true),
258
+ })
259
+ .strict();
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Schema Sync Check
4
+ *
5
+ * Verifies that Zod schemas and TypeScript types define the same fields.
6
+ * Run: pnpm --filter @ggui-ai/protocol sync-check
7
+ *
8
+ * Exits with code 1 if any fields are out of sync.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=sync-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-check.d.ts","sourceRoot":"","sources":["../../src/schemas/sync-check.ts"],"names":[],"mappings":";AAEA;;;;;;;GAOG"}
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env tsx
2
+ /* eslint-disable no-console */
3
+ /**
4
+ * Schema Sync Check
5
+ *
6
+ * Verifies that Zod schemas and TypeScript types define the same fields.
7
+ * Run: pnpm --filter @ggui-ai/protocol sync-check
8
+ *
9
+ * Exits with code 1 if any fields are out of sync.
10
+ */
11
+ import { blueprintDraftObjectSchema } from './handshake-suggestion.js';
12
+ // Extract Zod field names from schema .shape
13
+ function zodKeys(schema) {
14
+ return Object.keys(schema.shape).sort();
15
+ }
16
+ // Expected TypeScript type fields (manually listed — single maintenance point)
17
+ // If you add a field to the TypeScript type, add it here too.
18
+ // BlueprintDraft fields — agent's draft on the handshake input.
19
+ const BLUEPRINT_DRAFT_KEYS = [
20
+ 'contract',
21
+ 'variance',
22
+ 'generator',
23
+ ].sort();
24
+ function diff(zodFields, tsFields) {
25
+ const zodSet = new Set(zodFields);
26
+ const tsSet = new Set(tsFields);
27
+ return {
28
+ inZodOnly: zodFields.filter((k) => !tsSet.has(k)),
29
+ inTsOnly: tsFields.filter((k) => !zodSet.has(k)),
30
+ };
31
+ }
32
+ let failed = false;
33
+ function check(name, schema, tsKeys) {
34
+ const zKeys = zodKeys(schema);
35
+ const { inZodOnly, inTsOnly } = diff(zKeys, tsKeys);
36
+ if (inZodOnly.length === 0 && inTsOnly.length === 0) {
37
+ console.log(` ✓ ${name}: ${zKeys.length} fields in sync`);
38
+ }
39
+ else {
40
+ console.log(` ✗ ${name}: OUT OF SYNC`);
41
+ if (inZodOnly.length > 0)
42
+ console.log(` In Zod but not TypeScript: ${inZodOnly.join(', ')}`);
43
+ if (inTsOnly.length > 0)
44
+ console.log(` In TypeScript but not Zod: ${inTsOnly.join(', ')}`);
45
+ failed = true;
46
+ }
47
+ }
48
+ // handshakeInputSchema / pushInputSchema are flat top-level shapes — z.infer
49
+ // derives the TS type directly so they stay in sync structurally without a
50
+ // keylist double-bookkeeping. Sub-schemas (blueprintDraft) are checked here.
51
+ console.log('\nSchema Sync Check\n');
52
+ // `BlueprintDraft` lives at the inner `.shape` of the zod object wrapper.
53
+ check('BlueprintDraft', blueprintDraftObjectSchema, BLUEPRINT_DRAFT_KEYS);
54
+ console.log('');
55
+ if (failed) {
56
+ console.log('Fix: update both packages/protocol/src/schemas/handshake-suggestion.ts AND packages/protocol/src/types/handshake-suggestion.ts\n');
57
+ console.log('');
58
+ }
59
+ if (failed)
60
+ process.exit(1);
@@ -0,0 +1,22 @@
1
+ /**
2
+ * `defineScreenBlueprint()` — authoring helper.
3
+ *
4
+ * Pass-through identity function. Exists purely to give IDE autocomplete
5
+ * and type-checking on blueprint manifest files in
6
+ * `cloud/amplify/data/screen-blueprints/*.ts`.
7
+ *
8
+ * The helper is narrow by design — it preserves the literal type of the
9
+ * blueprint so consumers can do precise inference (e.g. a future typed
10
+ * seeder that knows which prop names exist in which blueprint).
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * export default defineScreenBlueprint({
15
+ * id: "plan-my-week",
16
+ * ...
17
+ * });
18
+ * ```
19
+ */
20
+ import type { ScreenBlueprint } from "./types.js";
21
+ export declare function defineScreenBlueprint<const T extends ScreenBlueprint>(blueprint: T): T;
22
+ //# sourceMappingURL=define.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.d.ts","sourceRoot":"","sources":["../../src/screen-blueprints/define.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,CAAC,SAAS,eAAe,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAEtF"}
@@ -0,0 +1,3 @@
1
+ export function defineScreenBlueprint(blueprint) {
2
+ return blueprint;
3
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./types.js";
2
+ export * from "./define.js";
3
+ export * from "./match.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/screen-blueprints/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./types.js";
2
+ export * from "./define.js";
3
+ export * from "./match.js";
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Blueprint matcher — pure algorithm.
3
+ *
4
+ * Given a list of candidate `McpScreenBlueprint` rows (retrieved from DDB
5
+ * via `byPrimaryDataTool` GSI) and the agent's `sourceTools`, return the
6
+ * best matching blueprint.
7
+ *
8
+ * I/O-free. The DDB query layer lives in `core/src/blueprint-matcher.ts`;
9
+ * that module's only job is fetching candidates and calling this function.
10
+ */
11
+ import type { ScreenBlueprintSource } from "./types.js";
12
+ /** Subset of `McpScreenBlueprintRow` the matcher needs. Keeps tests isolated. */
13
+ export interface MatchableBlueprint {
14
+ blueprintId: string;
15
+ serverId: string;
16
+ dataTools: string[];
17
+ status: "active" | "stale" | "retired";
18
+ source?: ScreenBlueprintSource;
19
+ /** Engagement / selection rate populated by the ranker. Undefined = 0. */
20
+ score?: number;
21
+ }
22
+ /**
23
+ * Select the best-matching blueprint from `candidates` given the agent's
24
+ * `sourceTools`. Returns `null` if no candidate's `dataTools` is a subset
25
+ * of `sourceTools`.
26
+ *
27
+ * Subset match semantics: the agent can bring extra tools. A blueprint
28
+ * matches if every one of its `dataTools` appears in `sourceTools`.
29
+ *
30
+ * Ranking: `overlap × source_weight × (score || 1)`. Overlap is the blueprint's
31
+ * dataTools count (all must match to be a candidate, so higher counts signal
32
+ * more-specific blueprints). Ties broken by stable input order.
33
+ */
34
+ export declare function matchBlueprint<T extends MatchableBlueprint>(candidates: readonly T[], sourceTools: readonly string[]): T | null;
35
+ //# sourceMappingURL=match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match.d.ts","sourceRoot":"","sources":["../../src/screen-blueprints/match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,iFAAiF;AACjF,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;IACvC,MAAM,CAAC,EAAE,qBAAqB,CAAC;IAC/B,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoBD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,kBAAkB,EACzD,UAAU,EAAE,SAAS,CAAC,EAAE,EACxB,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,CAAC,GAAG,IAAI,CAmBV"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Source weights — curated designs outrank generated ones when everything
3
+ * else ties. Matches the spec: "curated generally wins when everything else
4
+ * ties — because a human made a design call."
5
+ */
6
+ const SOURCE_WEIGHT = {
7
+ curated: 3,
8
+ llm: 2,
9
+ heuristic: 1,
10
+ };
11
+ /**
12
+ * Select the best-matching blueprint from `candidates` given the agent's
13
+ * `sourceTools`. Returns `null` if no candidate's `dataTools` is a subset
14
+ * of `sourceTools`.
15
+ *
16
+ * Subset match semantics: the agent can bring extra tools. A blueprint
17
+ * matches if every one of its `dataTools` appears in `sourceTools`.
18
+ *
19
+ * Ranking: `overlap × source_weight × (score || 1)`. Overlap is the blueprint's
20
+ * dataTools count (all must match to be a candidate, so higher counts signal
21
+ * more-specific blueprints). Ties broken by stable input order.
22
+ */
23
+ export function matchBlueprint(candidates, sourceTools) {
24
+ if (sourceTools.length === 0 || candidates.length === 0)
25
+ return null;
26
+ const available = new Set(sourceTools);
27
+ const scored = [];
28
+ for (const bp of candidates) {
29
+ if (bp.status !== "active")
30
+ continue;
31
+ if (!isSubset(bp.dataTools, available))
32
+ continue;
33
+ const overlap = bp.dataTools.length;
34
+ const weight = SOURCE_WEIGHT[bp.source ?? "curated"];
35
+ const score = bp.score ?? 1;
36
+ scored.push({ blueprint: bp, overlap, rankScore: overlap * weight * score });
37
+ }
38
+ if (scored.length === 0)
39
+ return null;
40
+ // Stable sort: highest rankScore first, preserving input order on ties.
41
+ scored.sort((a, b) => b.rankScore - a.rankScore);
42
+ return scored[0].blueprint;
43
+ }
44
+ /** `needles ⊆ haystack` — every element of `needles` appears in `haystack`. */
45
+ function isSubset(needles, haystack) {
46
+ for (const n of needles) {
47
+ if (!haystack.has(n))
48
+ return false;
49
+ }
50
+ return true;
51
+ }
@@ -0,0 +1,164 @@
1
+ /**
2
+ * ScreenBlueprint — authored design for a ggui screen.
3
+ *
4
+ * A blueprint describes:
5
+ * - which MCP tools provide the data
6
+ * - which MCP tools the agent SHOULD call after each user gesture
7
+ * (`actionSpec[*].nextStep` hints surfaced on `ggui_consume`)
8
+ * - the intent, interaction mechanic, and a free-form layout hint
9
+ *
10
+ * Blueprints compile deterministically into {@link DataContract}. They are the
11
+ * authoring surface of the Screen Designer pipeline — human-curated, heuristic,
12
+ * or LLM-produced. All three producers emit the same shape.
13
+ */
14
+ import type { JsonSchema } from "../types/data-contract.js";
15
+ /**
16
+ * UI interaction mechanic hint. Tiny enum — generation uses it to select
17
+ * primitives (draggable cards vs swipe stack vs live-polling hook).
18
+ * Layout details live in {@link ScreenBlueprint.layoutHint} (free text).
19
+ */
20
+ export type ScreenMechanic = "static" | "drag" | "swipe" | "live" | "form";
21
+ /**
22
+ * Provenance — who authored this blueprint. Same shape, different producers.
23
+ *
24
+ * - `curated`: hand-written TS in `cloud/amplify/data/screen-blueprints/*.ts`
25
+ * - `heuristic`: rule-based composer ("every `list_*` → default list view")
26
+ * - `llm`: LLM-driven designer for novel compositions
27
+ */
28
+ export type ScreenBlueprintSource = "curated" | "heuristic" | "llm";
29
+ /**
30
+ * Data source for a single prop slot. The tool's outputSchema becomes the
31
+ * prop's schema (optionally unwrapped via `pick`). For `live` mechanic,
32
+ * `refresh` declares polling/subscription cadence.
33
+ */
34
+ export interface ScreenBlueprintDataSource {
35
+ /** MCP tool name that produces this prop's data. */
36
+ tool: string;
37
+ /**
38
+ * Optional field path into the tool's outputSchema to use as the prop.
39
+ * Example: `tool: "todoist_list_tasks"` returns `{ tasks, nextPageToken }`.
40
+ * `pick: "tasks"` uses just the `tasks` array schema as the prop.
41
+ */
42
+ pick?: string;
43
+ /**
44
+ * Refresh cadence for live widgets. Only meaningful with `mechanic: "live"`.
45
+ * `poll` = seconds between re-fetches. `subscribe` = agent pushes via stream.
46
+ */
47
+ refresh?: {
48
+ poll?: number;
49
+ subscribe?: boolean;
50
+ };
51
+ }
52
+ /**
53
+ * Direct action — one user interaction fires one MCP tool call. By convention,
54
+ * the payload keys match the tool's inputSchema keys (identity mapping). If a
55
+ * future blueprint needs to reshape the payload before dispatch, add a
56
+ * `payloadMapping` field here AND wire it through the compiler + contract in
57
+ * the same change.
58
+ */
59
+ export interface ScreenBlueprintDirectAction {
60
+ /** MCP tool to invoke when the user triggers this action. */
61
+ tool: string;
62
+ /** Human-readable description; drives the button label fallback. */
63
+ description?: string;
64
+ /**
65
+ * Optional JSON Schema for the user-side payload. If omitted, the tool's
66
+ * inputSchema is used as the payload shape directly.
67
+ */
68
+ payload?: JsonSchema;
69
+ /** Show confirmation prompt before firing. */
70
+ confirm?: boolean;
71
+ }
72
+ /**
73
+ * Orchestrated action — one user interaction fires N MCP tool calls.
74
+ * Dispatch is agent-owned: the host renders the interaction and emits a
75
+ * consume event; the agent receives the event + `fires` hint and
76
+ * sequences the tool calls itself. No multi-tool dispatch protocol in v1.
77
+ */
78
+ export interface ScreenBlueprintOrchestratedAction {
79
+ /** Human-readable description; drives the button label. Required here. */
80
+ description: string;
81
+ /** User-side payload shape. Required — the agent needs it to orchestrate. */
82
+ payload: JsonSchema;
83
+ /**
84
+ * Advisory hint: which MCP tools the agent is expected to fire. Not
85
+ * dispatched by the host — metadata for docs, admin UI, and the agent's
86
+ * orchestration reasoning.
87
+ */
88
+ fires: string[];
89
+ /** Show confirmation prompt before firing. */
90
+ confirm?: boolean;
91
+ }
92
+ /** Deep-link-only action — opens a URL, no tool call. */
93
+ export interface ScreenBlueprintDeepLinkAction {
94
+ /** URL template. May contain placeholders `{prop.path}` resolved at render. */
95
+ deepLink: string;
96
+ /** Human-readable description; drives the button label. */
97
+ description?: string;
98
+ }
99
+ /**
100
+ * Action variants — the three ways a user interaction can be wired.
101
+ *
102
+ * Discriminated by presence of `tool` / `fires` / `deepLink`. Compiler
103
+ * uses the discriminator to pick an ActionEntry shape.
104
+ */
105
+ export type ScreenBlueprintAction = ScreenBlueprintDirectAction | ScreenBlueprintOrchestratedAction | ScreenBlueprintDeepLinkAction;
106
+ /**
107
+ * A screen blueprint — the authored design record.
108
+ *
109
+ * @example
110
+ * ```ts
111
+ * export default defineScreenBlueprint({
112
+ * id: "plan-my-week",
113
+ * server: "_composed",
114
+ * displayName: "Plan My Week",
115
+ * intent: "Drag tasks onto a weekly calendar to schedule focus blocks",
116
+ * mechanic: "drag",
117
+ * data: {
118
+ * tasks: { tool: "todoist_list_tasks", pick: "tasks" },
119
+ * events: { tool: "gcal_list_events", pick: "events" },
120
+ * },
121
+ * actions: {
122
+ * scheduleTask: {
123
+ * description: "Schedule a task as a calendar focus block",
124
+ * payload: { type: "object", properties: { ... } },
125
+ * fires: ["todoist_update_task", "gcal_create_event"],
126
+ * },
127
+ * completeTask: { tool: "todoist_complete_task" },
128
+ * },
129
+ * layoutHint: "Left: task cards. Right: 7-day grid. Drag to schedule.",
130
+ * });
131
+ * ```
132
+ */
133
+ export interface ScreenBlueprint {
134
+ /** Unique identifier within `server`. URL-safe. */
135
+ id: string;
136
+ /**
137
+ * Owning MCP server's `serverId`, or `"_composed"` for cross-server
138
+ * blueprints (blueprints that draw from multiple servers, like Plan My Week
139
+ * using Todoist + Google Calendar).
140
+ */
141
+ server: string;
142
+ /** Human-readable name shown in admin UI / docs. */
143
+ displayName: string;
144
+ /** Concise purpose — becomes `DataContract.intent`. Used for caching. */
145
+ intent: string;
146
+ /** Interaction mechanic hint for the generator. Defaults to `"static"`. */
147
+ mechanic?: ScreenMechanic;
148
+ /**
149
+ * Data sources keyed by prop name. Each source's tool outputSchema becomes
150
+ * the prop schema (optionally unwrapped via `pick`).
151
+ */
152
+ data: Record<string, ScreenBlueprintDataSource>;
153
+ /** User-triggerable actions keyed by action name. */
154
+ actions?: Record<string, ScreenBlueprintAction>;
155
+ /** Free-form layout guidance passed to the generator as prompt context. */
156
+ layoutHint?: string;
157
+ /**
158
+ * Provenance. Set automatically by each producer (curated producer = this
159
+ * file's co-location; heuristic + llm producers set explicitly). Included
160
+ * here for the compiler's downstream use.
161
+ */
162
+ source?: ScreenBlueprintSource;
163
+ }
164
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/screen-blueprints/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAE3E;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAAG,SAAS,GAAG,WAAW,GAAG,KAAK,CAAC;AAEpE;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CAClD;AAED;;;;;;GAMG;AACH,MAAM,WAAW,2BAA2B;IAC1C,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iCAAiC;IAChD,0EAA0E;IAC1E,WAAW,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,OAAO,EAAE,UAAU,CAAC;IACpB;;;;OAIG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,yDAAyD;AACzD,MAAM,WAAW,6BAA6B;IAC5C,+EAA+E;IAC/E,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,MAAM,MAAM,qBAAqB,GAC7B,2BAA2B,GAC3B,iCAAiC,GACjC,6BAA6B,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,eAAe;IAC9B,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IACX;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B;;;OAGG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAChD,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAChD,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,qBAAqB,CAAC;CAChC"}
@@ -0,0 +1 @@
1
+ export {};