@ggui-ai/mcp-server-handlers 0.24.0 → 0.26.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.
Files changed (196) hide show
  1. package/README.md +2 -2
  2. package/dist/blueprints/search-blueprints.d.ts +5 -5
  3. package/dist/blueprints/search-blueprints.js +5 -5
  4. package/dist/credits/index.d.ts +2 -2
  5. package/dist/credits/index.d.ts.map +1 -1
  6. package/dist/credits/index.js +1 -1
  7. package/dist/credits/list-credit-transactions.d.ts +21 -7
  8. package/dist/credits/list-credit-transactions.d.ts.map +1 -1
  9. package/dist/credits/list-credit-transactions.js +12 -2
  10. package/dist/index.d.ts +2 -5
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +5 -9
  13. package/dist/ops-apps/create-app.d.ts +10 -11
  14. package/dist/ops-apps/create-app.d.ts.map +1 -1
  15. package/dist/ops-apps/create-app.js +12 -13
  16. package/dist/ops-apps/identity.d.ts +9 -8
  17. package/dist/ops-apps/identity.d.ts.map +1 -1
  18. package/dist/ops-apps/identity.js +2 -1
  19. package/dist/ops-apps/index.d.ts +2 -2
  20. package/dist/ops-apps/index.js +2 -2
  21. package/dist/ops-apps/list-apps.d.ts +5 -6
  22. package/dist/ops-apps/list-apps.d.ts.map +1 -1
  23. package/dist/ops-apps/list-apps.js +6 -7
  24. package/dist/ops-apps/set-app-theme.d.ts +12 -8
  25. package/dist/ops-apps/set-app-theme.d.ts.map +1 -1
  26. package/dist/ops-apps/set-app-theme.js +11 -7
  27. package/dist/ops-apps/set-default-app.d.ts +1 -2
  28. package/dist/ops-apps/set-default-app.d.ts.map +1 -1
  29. package/dist/ops-apps/set-default-app.js +1 -2
  30. package/dist/ops-apps/types.d.ts +20 -23
  31. package/dist/ops-apps/types.d.ts.map +1 -1
  32. package/dist/ops-apps/types.js +4 -6
  33. package/dist/ops-blueprint/cache-mirror.d.ts +41 -0
  34. package/dist/ops-blueprint/cache-mirror.d.ts.map +1 -0
  35. package/dist/ops-blueprint/cache-mirror.js +19 -0
  36. package/dist/ops-blueprint/delete.d.ts +18 -0
  37. package/dist/ops-blueprint/delete.d.ts.map +1 -1
  38. package/dist/ops-blueprint/delete.js +21 -2
  39. package/dist/ops-blueprint/errors.d.ts +23 -0
  40. package/dist/ops-blueprint/errors.d.ts.map +1 -1
  41. package/dist/ops-blueprint/errors.js +29 -0
  42. package/dist/ops-blueprint/generate.d.ts +1 -3
  43. package/dist/ops-blueprint/generate.d.ts.map +1 -1
  44. package/dist/ops-blueprint/generate.js +47 -58
  45. package/dist/ops-blueprint/index.d.ts +1 -1
  46. package/dist/ops-blueprint/index.d.ts.map +1 -1
  47. package/dist/ops-blueprint/index.js +1 -1
  48. package/dist/ops-blueprint/list.d.ts.map +1 -1
  49. package/dist/ops-blueprint/list.js +1 -2
  50. package/dist/ops-blueprint/register.d.ts +83 -6
  51. package/dist/ops-blueprint/register.d.ts.map +1 -1
  52. package/dist/ops-blueprint/register.js +261 -158
  53. package/dist/ops-blueprint/update.d.ts +3 -2
  54. package/dist/ops-blueprint/update.d.ts.map +1 -1
  55. package/dist/ops-blueprint/update.js +4 -3
  56. package/dist/renders/blueprint-coverage.d.ts +23 -4
  57. package/dist/renders/blueprint-coverage.d.ts.map +1 -1
  58. package/dist/renders/blueprint-coverage.js +45 -5
  59. package/dist/renders/blueprint-durability.d.ts.map +1 -1
  60. package/dist/renders/blueprint-durability.js +36 -21
  61. package/dist/renders/blueprint-matcher.d.ts +57 -7
  62. package/dist/renders/blueprint-matcher.d.ts.map +1 -1
  63. package/dist/renders/blueprint-matcher.js +154 -36
  64. package/dist/renders/blueprint-registry.d.ts +154 -1
  65. package/dist/renders/blueprint-registry.d.ts.map +1 -1
  66. package/dist/renders/blueprint-registry.js +337 -10
  67. package/dist/renders/build-seed-pool.d.ts.map +1 -1
  68. package/dist/renders/build-seed-pool.js +6 -0
  69. package/dist/renders/cache-trace-sink.d.ts +12 -0
  70. package/dist/renders/cache-trace-sink.d.ts.map +1 -1
  71. package/dist/renders/cache-trace-sink.js +15 -1
  72. package/dist/renders/consume.d.ts +3 -2
  73. package/dist/renders/consume.d.ts.map +1 -1
  74. package/dist/renders/consume.js +50 -15
  75. package/dist/renders/cross-app-refused.d.ts +17 -0
  76. package/dist/renders/cross-app-refused.d.ts.map +1 -0
  77. package/dist/renders/cross-app-refused.js +23 -0
  78. package/dist/renders/decide-handshake.d.ts +47 -1
  79. package/dist/renders/decide-handshake.d.ts.map +1 -1
  80. package/dist/renders/decide-handshake.js +74 -6
  81. package/dist/renders/declare-tool-catalog.d.ts.map +1 -1
  82. package/dist/renders/declare-tool-catalog.js +20 -17
  83. package/dist/renders/export-registry.d.ts +8 -1
  84. package/dist/renders/export-registry.d.ts.map +1 -1
  85. package/dist/renders/export-registry.js +3 -0
  86. package/dist/renders/fits.d.ts +60 -0
  87. package/dist/renders/fits.d.ts.map +1 -0
  88. package/dist/renders/fits.js +114 -0
  89. package/dist/renders/handshake-generation-inputs.d.ts +89 -0
  90. package/dist/renders/handshake-generation-inputs.d.ts.map +1 -0
  91. package/dist/renders/handshake-generation-inputs.js +65 -0
  92. package/dist/renders/handshake.d.ts +6 -42
  93. package/dist/renders/handshake.d.ts.map +1 -1
  94. package/dist/renders/handshake.js +1 -1
  95. package/dist/renders/index.d.ts +10 -5
  96. package/dist/renders/index.d.ts.map +1 -1
  97. package/dist/renders/index.js +10 -3
  98. package/dist/renders/installed-blueprints-provider.d.ts.map +1 -1
  99. package/dist/renders/installed-blueprints-provider.js +3 -1
  100. package/dist/renders/match-precision/pairs.d.ts +6 -5
  101. package/dist/renders/match-precision/pairs.d.ts.map +1 -1
  102. package/dist/renders/match-precision/run-probe.js +1 -2
  103. package/dist/renders/match-precision/topk-probe.js +13 -8
  104. package/dist/renders/record-committed-one-shot.d.ts +18 -3
  105. package/dist/renders/record-committed-one-shot.d.ts.map +1 -1
  106. package/dist/renders/record-committed-one-shot.js +14 -7
  107. package/dist/renders/refresh-ws-token.d.ts +66 -87
  108. package/dist/renders/refresh-ws-token.d.ts.map +1 -1
  109. package/dist/renders/refresh-ws-token.js +93 -89
  110. package/dist/renders/render-identity.d.ts +16 -5
  111. package/dist/renders/render-identity.d.ts.map +1 -1
  112. package/dist/renders/render-identity.js +26 -10
  113. package/dist/renders/render-read-gate.d.ts +85 -0
  114. package/dist/renders/render-read-gate.d.ts.map +1 -0
  115. package/dist/renders/render-read-gate.js +57 -0
  116. package/dist/renders/render.d.ts +77 -27
  117. package/dist/renders/render.d.ts.map +1 -1
  118. package/dist/renders/render.js +269 -95
  119. package/dist/renders/report-render-failure.d.ts +69 -0
  120. package/dist/renders/report-render-failure.d.ts.map +1 -0
  121. package/dist/renders/report-render-failure.js +83 -0
  122. package/dist/renders/runtime-pull.d.ts.map +1 -1
  123. package/dist/renders/runtime-pull.js +6 -0
  124. package/dist/renders/slice-meta-derivation.d.ts +8 -1
  125. package/dist/renders/slice-meta-derivation.d.ts.map +1 -1
  126. package/dist/renders/slice-meta-derivation.js +1 -0
  127. package/dist/renders/submit-action.d.ts +47 -78
  128. package/dist/renders/submit-action.d.ts.map +1 -1
  129. package/dist/renders/submit-action.js +312 -84
  130. package/dist/renders/sync-context.d.ts +3 -1
  131. package/dist/renders/sync-context.d.ts.map +1 -1
  132. package/dist/renders/sync-context.js +53 -20
  133. package/dist/types.d.ts +71 -1
  134. package/dist/types.d.ts.map +1 -1
  135. package/dist/types.js +32 -0
  136. package/package.json +8 -20
  137. package/dist/ops-connector-keys/in-memory-fake.test-util.d.ts +0 -26
  138. package/dist/ops-connector-keys/in-memory-fake.test-util.d.ts.map +0 -1
  139. package/dist/ops-connector-keys/in-memory-fake.test-util.js +0 -60
  140. package/dist/ops-connector-keys/index.d.ts +0 -19
  141. package/dist/ops-connector-keys/index.d.ts.map +0 -1
  142. package/dist/ops-connector-keys/index.js +0 -14
  143. package/dist/ops-connector-keys/issue-connector-key.d.ts +0 -76
  144. package/dist/ops-connector-keys/issue-connector-key.d.ts.map +0 -1
  145. package/dist/ops-connector-keys/issue-connector-key.js +0 -84
  146. package/dist/ops-connector-keys/list-connector-keys.d.ts +0 -58
  147. package/dist/ops-connector-keys/list-connector-keys.d.ts.map +0 -1
  148. package/dist/ops-connector-keys/list-connector-keys.js +0 -39
  149. package/dist/ops-connector-keys/revoke-connector-key.d.ts +0 -32
  150. package/dist/ops-connector-keys/revoke-connector-key.d.ts.map +0 -1
  151. package/dist/ops-connector-keys/revoke-connector-key.js +0 -49
  152. package/dist/ops-connector-keys/types.d.ts +0 -91
  153. package/dist/ops-connector-keys/types.d.ts.map +0 -1
  154. package/dist/ops-connector-keys/types.js +0 -24
  155. package/dist/ops-coupon/in-memory-fake.test-util.d.ts +0 -28
  156. package/dist/ops-coupon/in-memory-fake.test-util.d.ts.map +0 -1
  157. package/dist/ops-coupon/in-memory-fake.test-util.js +0 -66
  158. package/dist/ops-coupon/index.d.ts +0 -15
  159. package/dist/ops-coupon/index.d.ts.map +0 -1
  160. package/dist/ops-coupon/index.js +0 -12
  161. package/dist/ops-coupon/redeem-coupon.d.ts +0 -51
  162. package/dist/ops-coupon/redeem-coupon.d.ts.map +0 -1
  163. package/dist/ops-coupon/redeem-coupon.js +0 -61
  164. package/dist/ops-coupon/types.d.ts +0 -59
  165. package/dist/ops-coupon/types.d.ts.map +0 -1
  166. package/dist/ops-coupon/types.js +0 -38
  167. package/dist/ops-orgs/create-org.d.ts +0 -45
  168. package/dist/ops-orgs/create-org.d.ts.map +0 -1
  169. package/dist/ops-orgs/create-org.js +0 -55
  170. package/dist/ops-orgs/get-org-balance.d.ts +0 -29
  171. package/dist/ops-orgs/get-org-balance.d.ts.map +0 -1
  172. package/dist/ops-orgs/get-org-balance.js +0 -45
  173. package/dist/ops-orgs/in-memory-fake.test-util.d.ts +0 -84
  174. package/dist/ops-orgs/in-memory-fake.test-util.d.ts.map +0 -1
  175. package/dist/ops-orgs/in-memory-fake.test-util.js +0 -209
  176. package/dist/ops-orgs/index.d.ts +0 -33
  177. package/dist/ops-orgs/index.d.ts.map +0 -1
  178. package/dist/ops-orgs/index.js +0 -24
  179. package/dist/ops-orgs/invite-to-org.d.ts +0 -56
  180. package/dist/ops-orgs/invite-to-org.d.ts.map +0 -1
  181. package/dist/ops-orgs/invite-to-org.js +0 -72
  182. package/dist/ops-orgs/list-orgs.d.ts +0 -53
  183. package/dist/ops-orgs/list-orgs.d.ts.map +0 -1
  184. package/dist/ops-orgs/list-orgs.js +0 -38
  185. package/dist/ops-orgs/remove-org-member.d.ts +0 -42
  186. package/dist/ops-orgs/remove-org-member.d.ts.map +0 -1
  187. package/dist/ops-orgs/remove-org-member.js +0 -67
  188. package/dist/ops-orgs/rename-org.d.ts +0 -33
  189. package/dist/ops-orgs/rename-org.d.ts.map +0 -1
  190. package/dist/ops-orgs/rename-org.js +0 -57
  191. package/dist/ops-orgs/revoke-invite.d.ts +0 -38
  192. package/dist/ops-orgs/revoke-invite.d.ts.map +0 -1
  193. package/dist/ops-orgs/revoke-invite.js +0 -53
  194. package/dist/ops-orgs/types.d.ts +0 -209
  195. package/dist/ops-orgs/types.d.ts.map +0 -1
  196. package/dist/ops-orgs/types.js +0 -60
@@ -1,26 +1,25 @@
1
1
  /**
2
- * Seam types for the `ops-apps` MCP tool family. Mirrors the
3
- * data-model rows that back the console's Apps + Account surfaces
4
- * (the `GguiApp` and `GguiUser` records). Pure over
5
- * `@ggui-ai/protocol` shapes — NO AWS / database imports. Cloud
6
- * deployments bind an AWS-backed implementation; tests bind
2
+ * Seam types for the `ops-apps` MCP tool family: an app record
3
+ * (`GguiApp`) and the user's default-app setting (`GguiUser`). Pure over
4
+ * `@ggui-ai/protocol` shapes — no storage or database imports. A
5
+ * deployment binds an implementation over its own store; tests bind
7
6
  * in-memory fakes.
8
7
  *
9
8
  * Why an explicit seam vs threading a database client directly: the
10
- * shared-handler layer must be the same code path with or without a
11
- * cloud backend. The `AppsSource` interface IS the boundary — wired
12
- * to a real datastore in production, wired to a Map in tests.
9
+ * shared-handler layer must be the same code path whatever store sits
10
+ * behind it. The `AppsSource` interface IS the boundary — wired to a
11
+ * real datastore in production, wired to a Map in tests.
13
12
  */
14
13
  import type { AppTheme } from '@ggui-ai/protocol';
15
14
  /**
16
15
  * One app record, projected for MCP-tool readers. Pure data — no
17
- * relations, no backend-internal fields. Cloud adapters map the
18
- * stored model row onto this shape; tests construct it directly.
16
+ * relations, no store-internal fields. An adapter maps its stored row
17
+ * onto this shape; tests construct it directly.
19
18
  */
20
19
  export interface AppRecord {
21
- /** Opaque base62 `<8 chars>` — server-minted when the app is provisioned. */
20
+ /** Opaque id, minted by the store when the app is created; never caller-supplied. */
22
21
  readonly appId: string;
23
- /** FK to the owning user's Cognito sub. Used for ownership gates. */
22
+ /** The owning user's id (`resolveOwnerSub`). Used for ownership gates. */
24
23
  readonly ownerSub: string;
25
24
  /** User-editable label. */
26
25
  readonly displayName: string;
@@ -58,7 +57,7 @@ export interface AppUpdatePatch {
58
57
  readonly rateLimitPerMinute?: number;
59
58
  }
60
59
  /**
61
- * Read+write seam for `GguiApp` rows. Cloud deployments bind a
60
+ * Read+write seam for `GguiApp` rows. A deployment binds a
62
61
  * datastore-backed implementation; tests implement it against
63
62
  * in-memory state.
64
63
  *
@@ -66,8 +65,8 @@ export interface AppUpdatePatch {
66
65
  * - `list(ownerSub)` returns only the rows the caller owns. The
67
66
  * implementation does NOT leak rows from other users.
68
67
  * - `create({ ownerSub, displayName })` mints a fresh `appId`
69
- * server-side (cloud: base62 + collision retry; in-memory: any
70
- * unique string). Argument-supplied appIds are NOT honored — that
68
+ * server-side (a database store: its own id format, with a retry
69
+ * on collision; in-memory: any unique string). Argument-supplied appIds are NOT honored — that
71
70
  * would be an app-takeover vector.
72
71
  * - `update`, `delete`, `setTheme` reject when the row's
73
72
  * `ownerSub` doesn't match the caller's. Implementations either
@@ -138,8 +137,8 @@ export interface AppsSource {
138
137
  /**
139
138
  * Read+write seam for the `defaultAppId` column on `GguiUser`. Separate
140
139
  * interface from `AppsSource` because the column lives on a different
141
- * table — keeping the seams disjoint lets the cloud adapter bind two
142
- * unrelated mutations without one interface dragging in the other.
140
+ * record — keeping the seams disjoint lets an adapter bind two
141
+ * unrelated writes without one interface dragging in the other.
143
142
  *
144
143
  * The handler chains `AppsSource.get` (verify the user owns the target)
145
144
  * before calling `setDefault` so writes never point at a foreign app.
@@ -166,9 +165,8 @@ export declare class AppNotFoundError extends Error {
166
165
  *
167
166
  * `defaultAppId` is what the universal route resolves on every
168
167
  * request; deleting the app it names would leave that route pointing
169
- * at a row that no longer exists. Same lock the console's Delete
170
- * enforces — the operator picks a different default first, then
171
- * deletes.
168
+ * at a row that no longer exists. A UI's delete should enforce the same
169
+ * lock — the operator picks a different default first, then deletes.
172
170
  */
173
171
  export declare class DefaultAppDeleteBlockedError extends Error {
174
172
  readonly code: "default_app_delete_blocked";
@@ -177,9 +175,8 @@ export declare class DefaultAppDeleteBlockedError extends Error {
177
175
  /**
178
176
  * Thrown by adapters that prefer surfacing access denial over the
179
177
  * "treat as not-found" privacy posture. Handlers translate to the
180
- * uniform "not found" shape — the error class exists so cloud
181
- * adapters can be specific in their logs without callers parsing
182
- * strings.
178
+ * uniform "not found" shape — the error class exists so adapters can
179
+ * be specific in their logs without callers parsing strings.
183
180
  */
184
181
  export declare class OpsAppsAccessDeniedError extends Error {
185
182
  readonly code: "ops_apps_access_denied";
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ops-apps/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,6EAA6E;IAC7E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,+CAA+C;IAC/C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,UAAU;IACzB,2DAA2D;IAC3D,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IACtD,0FAA0F;IAC1F,GAAG,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC1E,0DAA0D;IAC1D,MAAM,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7E;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,cAAc,CAAC;KACvB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACvB;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE;QACb,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,QAAQ,CAAC;KACjB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,UAAU,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,0EAA0E;IAC1E,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACtD;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAG,eAAe,CAAU;gBAC7B,KAAK,EAAE,MAAM;CAI1B;AAED;;;;;;;;GAQG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,QAAQ,CAAC,IAAI,EAAG,4BAA4B,CAAU;gBAC1C,KAAK,EAAE,MAAM;CAM1B;AAED;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAG,wBAAwB,CAAU;gBACtC,OAAO,EAAE,MAAM;CAI5B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ops-apps/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,qFAAqF;IACrF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2BAA2B;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,+CAA+C;IAC/C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,cAAc;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,oEAAoE;IACpE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CACtC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,UAAU;IACzB,2DAA2D;IAC3D,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IACtD,0FAA0F;IAC1F,GAAG,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC1E,0DAA0D;IAC1D,MAAM,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7E;;;;;OAKG;IACH,MAAM,CAAC,IAAI,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,cAAc,CAAC;KACvB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACvB;;;;;;;;;;;;;;;;;;OAkBG;IACH,MAAM,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE;QACb,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,QAAQ,CAAC;KACjB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnD;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,UAAU,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,0EAA0E;IAC1E,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACtD;AAED;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,IAAI,EAAG,eAAe,CAAU;gBAC7B,KAAK,EAAE,MAAM;CAI1B;AAED;;;;;;;GAOG;AACH,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,QAAQ,CAAC,IAAI,EAAG,4BAA4B,CAAU;gBAC1C,KAAK,EAAE,MAAM;CAM1B;AAED;;;;;GAKG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAG,wBAAwB,CAAU;gBACtC,OAAO,EAAE,MAAM;CAI5B"}
@@ -14,9 +14,8 @@ export class AppNotFoundError extends Error {
14
14
  *
15
15
  * `defaultAppId` is what the universal route resolves on every
16
16
  * request; deleting the app it names would leave that route pointing
17
- * at a row that no longer exists. Same lock the console's Delete
18
- * enforces — the operator picks a different default first, then
19
- * deletes.
17
+ * at a row that no longer exists. A UI's delete should enforce the same
18
+ * lock — the operator picks a different default first, then deletes.
20
19
  */
21
20
  export class DefaultAppDeleteBlockedError extends Error {
22
21
  code = 'default_app_delete_blocked';
@@ -28,9 +27,8 @@ export class DefaultAppDeleteBlockedError extends Error {
28
27
  /**
29
28
  * Thrown by adapters that prefer surfacing access denial over the
30
29
  * "treat as not-found" privacy posture. Handlers translate to the
31
- * uniform "not found" shape — the error class exists so cloud
32
- * adapters can be specific in their logs without callers parsing
33
- * strings.
30
+ * uniform "not found" shape — the error class exists so adapters can
31
+ * be specific in their logs without callers parsing strings.
34
32
  */
35
33
  export class OpsAppsAccessDeniedError extends Error {
36
34
  code = 'ops_apps_access_denied';
@@ -0,0 +1,41 @@
1
+ /**
2
+ * How an ops writer mirrors its durable row into the cache registry
3
+ * (ggui#1497): under ONE id.
4
+ *
5
+ * `ggui_ops_register_blueprint` (with `createRegisterGeneratedBlueprint`,
6
+ * which shares its core) and `ggui_ops_generate_blueprint` each put the
7
+ * durable row first, then mirror it into the cache so the exact-key probe
8
+ * finds it. The mirror used to mint an id of its own, so a render served
9
+ * from that cache row recorded an id the writer's store never held. The
10
+ * mirror now takes the writer's id (`mintId`), and what else it writes
11
+ * depends on where re-mint reads:
12
+ *
13
+ * - The mirror's registry writes through to a durable store OTHER than the
14
+ * writer's (a server that keeps its re-mint store apart from the ops
15
+ * store): the full write-through runs, now under the shared id, so the
16
+ * store re-mint reads holds the row and the compiled body under the id
17
+ * the cache serves.
18
+ * - It writes through to the writer's OWN store: the row is already there
19
+ * under this id, and the store refuses a second put of it, so the mirror
20
+ * skips the row but still puts the compiled body into its code store,
21
+ * where re-mint reads it.
22
+ * - No durable store (a code store at most): nothing more is written; the
23
+ * writer's own store and body are what re-mint reads.
24
+ *
25
+ * The authored source still reaches a bound code store in every case
26
+ * (ggui#1493). A dedup is unchanged: an exact key already bound returns its
27
+ * existing id, and nothing more is written for it.
28
+ */
29
+ import type { BlueprintStore } from "@ggui-ai/mcp-server-core";
30
+ import { type BlueprintRegistryDeps, type RegisterBlueprintInput, type RegisteredBlueprint } from "../renders/blueprint-registry.js";
31
+ export declare function mirrorIntoCache(args: {
32
+ /** The cache registry the writer mirrors into. */
33
+ readonly cacheRegistry: BlueprintRegistryDeps;
34
+ /** The store the writer already put the durable row in, under `blueprintId`. */
35
+ readonly writerStore: BlueprintStore;
36
+ readonly appId: string;
37
+ /** The writer's durable row id: the cache row takes it. */
38
+ readonly blueprintId: string;
39
+ readonly input: RegisterBlueprintInput;
40
+ }): Promise<RegisteredBlueprint>;
41
+ //# sourceMappingURL=cache-mirror.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache-mirror.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/cache-mirror.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACzB,MAAM,kCAAkC,CAAC;AAE1C,wBAAsB,eAAe,CAAC,IAAI,EAAE;IAC1C,kDAAkD;IAClD,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC;IAC9C,gFAAgF;IAChF,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,sBAAsB,CAAC;CACxC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkB/B"}
@@ -0,0 +1,19 @@
1
+ import { registerBlueprint, } from "../renders/blueprint-registry.js";
2
+ export async function mirrorIntoCache(args) {
3
+ const durability = args.cacheRegistry.durability;
4
+ const sharesWriterStore = durability?.blueprintStore !== undefined && durability.blueprintStore === args.writerStore;
5
+ const deps = sharesWriterStore
6
+ ? {
7
+ ...args.cacheRegistry,
8
+ durability: durability.codeStore !== undefined ? { codeStore: durability.codeStore } : {},
9
+ }
10
+ : args.cacheRegistry;
11
+ const registered = await registerBlueprint(deps, args.appId, args.input, {
12
+ mintId: () => args.blueprintId,
13
+ });
14
+ const codeStore = durability?.codeStore;
15
+ if (sharesWriterStore && !registered.deduped && codeStore !== undefined && args.input.componentCode.length > 0) {
16
+ await codeStore.put(codeStore.hashOf(args.input.componentCode), args.input.componentCode);
17
+ }
18
+ return registered;
19
+ }
@@ -18,12 +18,23 @@
18
18
  * a foreign `appId` input the authorizer denies surfaces the denial
19
19
  * error before the row lookup ever runs.
20
20
  *
21
+ * ## Out of reuse (ggui#1541)
22
+ *
23
+ * `ggui_ops_register_blueprint` and `ggui_ops_generate_blueprint` write a
24
+ * blueprint twice: the durable row, and a mirror in the cache registry, the
25
+ * store the handshake's exact-key probe matches from. So a delete removes
26
+ * both, the cache row first: a cache delete that fails fails the call
27
+ * before the durable row goes, and a retry completes it. An id whose
28
+ * durable row is already gone still has its cache row cleared in the
29
+ * caller's own app scope, which heals a row an earlier delete left behind.
30
+ *
21
31
  * ## Audience
22
32
  *
23
33
  * `['ops']` — served on `/control`. NOT visible to agents on `/mcp`.
24
34
  */
25
35
  import { z } from 'zod';
26
36
  import type { BlueprintStore } from '@ggui-ai/mcp-server-core';
37
+ import { type BlueprintRegistryDeps } from '../renders/blueprint-registry.js';
27
38
  import { type OpsBlueprintAppAuthorizer } from './app-access.js';
28
39
  /**
29
40
  * Deps for `ggui_ops_delete_blueprint`.
@@ -45,6 +56,13 @@ export interface GguiOpsDeleteBlueprintDeps {
45
56
  * the target row belongs to a different app (no existence leak).
46
57
  */
47
58
  readonly authorizeAppAccess?: OpsBlueprintAppAuthorizer;
59
+ /**
60
+ * The cache registry the writers mirror into (ggui#1541): the SAME one
61
+ * `ggui_ops_register_blueprint` and `ggui_ops_generate_blueprint` are
62
+ * given. When bound, a delete removes the blueprint's cache row (its
63
+ * vector and its exact-key binding) so the handshake stops reusing it.
64
+ */
65
+ readonly cacheRegistry?: Pick<BlueprintRegistryDeps, 'vectorStore' | 'index'>;
48
66
  }
49
67
  export declare function createGguiOpsDeleteBlueprintHandler(deps: GguiOpsDeleteBlueprintDeps): import("../types.js").SharedHandler<{
50
68
  appId: z.ZodOptional<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/delete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAOxF;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;CACzD;AAED,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,0BAA0B;;;;;;;GAwCjC"}
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/delete.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAmB,KAAK,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE/F,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAOxF;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;IACxD;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,aAAa,GAAG,OAAO,CAAC,CAAC;CAC/E;AAED,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,0BAA0B;;;;;;;GA8CjC"}
@@ -18,12 +18,23 @@
18
18
  * a foreign `appId` input the authorizer denies surfaces the denial
19
19
  * error before the row lookup ever runs.
20
20
  *
21
+ * ## Out of reuse (ggui#1541)
22
+ *
23
+ * `ggui_ops_register_blueprint` and `ggui_ops_generate_blueprint` write a
24
+ * blueprint twice: the durable row, and a mirror in the cache registry, the
25
+ * store the handshake's exact-key probe matches from. So a delete removes
26
+ * both, the cache row first: a cache delete that fails fails the call
27
+ * before the durable row goes, and a retry completes it. An id whose
28
+ * durable row is already gone still has its cache row cleared in the
29
+ * caller's own app scope, which heals a row an earlier delete left behind.
30
+ *
21
31
  * ## Audience
22
32
  *
23
33
  * `['ops']` — served on `/control`. NOT visible to agents on `/mcp`.
24
34
  */
25
35
  import { z } from 'zod';
26
36
  import { opsDeleteBlueprintInputSchema, } from '@ggui-ai/protocol';
37
+ import { deleteBlueprint } from '../renders/blueprint-registry.js';
27
38
  import { defineHandler } from '../types.js';
28
39
  import { resolveEffectiveAppId } from './app-access.js';
29
40
  const opsInputSchema = opsDeleteBlueprintInputSchema.shape;
@@ -35,7 +46,7 @@ export function createGguiOpsDeleteBlueprintHandler(deps) {
35
46
  name: 'ggui_ops_delete_blueprint',
36
47
  title: 'Delete blueprint',
37
48
  audience: ['ops'],
38
- description: "Remove a blueprint row by id. Idempotent — a second delete for the same id returns `{deleted: true}` without throwing. Cross-app probes return the same shape (no existence leak across apps). Mirrors `BlueprintStore.delete`'s no-throw contract. App-scoped variant curation for an app you operate — distinct from the personal saved-blueprint library (the _my_ tools).",
49
+ description: "Remove a blueprint by id: its durable row, and its entry in the cache the handshake reuses blueprints from, so it is no longer reused. Idempotent — a second delete for the same id returns `{deleted: true}` without throwing. Cross-app probes return the same shape (no existence leak across apps). Mirrors `BlueprintStore.delete`'s no-throw contract. App-scoped variant curation for an app you operate — distinct from the personal saved-blueprint library (the _my_ tools).",
39
50
  inputSchema: opsInputSchema,
40
51
  outputSchema: opsOutputSchema,
41
52
  async handler(rawInput, ctx) {
@@ -48,7 +59,11 @@ export function createGguiOpsDeleteBlueprintHandler(deps) {
48
59
  });
49
60
  const existing = await deps.blueprintStore.get(parsed.blueprintId);
50
61
  if (existing === null) {
51
- // Unknown id — idempotent. Return the success shape.
62
+ // Unknown id — idempotent. Its cache row may outlive it (an earlier
63
+ // delete removed the durable row only): clear it in the caller's
64
+ // own app scope, which says nothing about any other app.
65
+ if (deps.cacheRegistry)
66
+ await deleteBlueprint(deps.cacheRegistry, appId, parsed.blueprintId);
52
67
  return { deleted: true };
53
68
  }
54
69
  if (existing.appId !== appId) {
@@ -58,6 +73,10 @@ export function createGguiOpsDeleteBlueprintHandler(deps) {
58
73
  // leak across app boundaries.
59
74
  return { deleted: true };
60
75
  }
76
+ // Out of reuse first, then the durable row: a cache delete that fails
77
+ // fails the call with the durable row intact, so a retry completes it.
78
+ if (deps.cacheRegistry)
79
+ await deleteBlueprint(deps.cacheRegistry, appId, parsed.blueprintId);
61
80
  await deps.blueprintStore.delete(parsed.blueprintId);
62
81
  return { deleted: true };
63
82
  },
@@ -45,6 +45,29 @@ export declare class GeneratorNotFoundError extends Error {
45
45
  * `ggui_ops_set_provider_key`, or run the handler in an environment
46
46
  * whose `resolveLlm` dep returns a pool credential.
47
47
  */
48
+ /**
49
+ * ggui#1427 — `directionScope` names which direction `directionDigest`
50
+ * hashes; sent without a digest it is a scope for nothing, and the door
51
+ * refuses it rather than storing a fact about a value it does not have. A
52
+ * digest without a scope is accepted (absent = no scope). Enforced here
53
+ * because the handler mounts the input schema's raw shape, where a
54
+ * cross-field rule cannot live.
55
+ */
56
+ export declare class DirectionScopeWithoutDigestError extends Error {
57
+ readonly code: "direction_scope_without_digest";
58
+ constructor();
59
+ }
60
+ /**
61
+ * ggui#1570 — a registration named a parent (`clonedFrom`) this registration
62
+ * cannot record: an empty id, the row's own id, or an id that is not a row of
63
+ * the registering app in the durable store. One answer for all of them, and
64
+ * the same text for a missing row and another app's, so the refusal says
65
+ * nothing about another app's rows. Refused before anything is persisted.
66
+ */
67
+ export declare class ClonedFromRefusedError extends Error {
68
+ readonly code: "cloned_from_refused";
69
+ constructor(clonedFrom: string);
70
+ }
48
71
  export declare class MissingCredentialsError extends Error {
49
72
  readonly code: "missing_credentials";
50
73
  constructor(message?: string);
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAG,qBAAqB,CAAU;gBACnC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE;CAM7D;AAED;;;;;;;;;;GAUG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAG,qBAAqB,CAAU;gBACnC,OAAO,CAAC,EAAE,MAAM;CAO7B;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAG,mBAAmB,CAAU;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;gBACZ,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAK5C"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAG,qBAAqB,CAAU;gBACnC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,MAAM,EAAE;CAM7D;AAED;;;;;;;;;;GAUG;AACH;;;;;;;GAOG;AACH,qBAAa,gCAAiC,SAAQ,KAAK;IACzD,QAAQ,CAAC,IAAI,EAAG,gCAAgC,CAAU;;CAO3D;AAED;;;;;;GAMG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAG,qBAAqB,CAAU;gBACnC,UAAU,EAAE,MAAM;CAM/B;AAED,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,IAAI,EAAG,qBAAqB,CAAU;gBACnC,OAAO,CAAC,EAAE,MAAM;CAO7B;AAED;;;;;GAKG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,QAAQ,CAAC,IAAI,EAAG,mBAAmB,CAAU;IAC7C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;gBACZ,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAK5C"}
@@ -48,6 +48,35 @@ export class GeneratorNotFoundError extends Error {
48
48
  * `ggui_ops_set_provider_key`, or run the handler in an environment
49
49
  * whose `resolveLlm` dep returns a pool credential.
50
50
  */
51
+ /**
52
+ * ggui#1427 — `directionScope` names which direction `directionDigest`
53
+ * hashes; sent without a digest it is a scope for nothing, and the door
54
+ * refuses it rather than storing a fact about a value it does not have. A
55
+ * digest without a scope is accepted (absent = no scope). Enforced here
56
+ * because the handler mounts the input schema's raw shape, where a
57
+ * cross-field rule cannot live.
58
+ */
59
+ export class DirectionScopeWithoutDigestError extends Error {
60
+ code = "direction_scope_without_digest";
61
+ constructor() {
62
+ super("direction_scope_without_digest: `directionScope` was sent without `directionDigest` — a scope names which direction the digest hashes, so send both or neither.");
63
+ this.name = "DirectionScopeWithoutDigestError";
64
+ }
65
+ }
66
+ /**
67
+ * ggui#1570 — a registration named a parent (`clonedFrom`) this registration
68
+ * cannot record: an empty id, the row's own id, or an id that is not a row of
69
+ * the registering app in the durable store. One answer for all of them, and
70
+ * the same text for a missing row and another app's, so the refusal says
71
+ * nothing about another app's rows. Refused before anything is persisted.
72
+ */
73
+ export class ClonedFromRefusedError extends Error {
74
+ code = "cloned_from_refused";
75
+ constructor(clonedFrom) {
76
+ super(`cloned_from_refused: clonedFrom "${clonedFrom}" is not another row of this app — a copy names a row of its own app, other than itself, that the store holds.`);
77
+ this.name = "ClonedFromRefusedError";
78
+ }
79
+ }
51
80
  export class MissingCredentialsError extends Error {
52
81
  code = "missing_credentials";
53
82
  constructor(message) {
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Operator UX entry point. Dispatches through the bound
5
5
  * {@link GeneratorRegistry} to mint a blueprint variant with
6
- * operator-authored variance tags + optional default-pin.
6
+ * operator-authored variance tags + an optional operator-default mark.
7
7
  *
8
8
  * ## Behavior
9
9
  *
@@ -177,7 +177,6 @@ export declare function createGguiOpsGenerateBlueprintHandler(deps: GguiOpsGener
177
177
  }, {
178
178
  blueprintId: z.ZodString;
179
179
  codeHash: z.ZodOptional<z.ZodString>;
180
- validatorScore: z.ZodOptional<z.ZodNumber>;
181
180
  source: z.ZodObject<{
182
181
  kind: z.ZodLiteral<"llm">;
183
182
  generator: z.ZodString;
@@ -187,6 +186,5 @@ export declare function createGguiOpsGenerateBlueprintHandler(deps: GguiOpsGener
187
186
  blueprintId: string;
188
187
  source: import("@ggui-ai/protocol").LlmBlueprintSource;
189
188
  codeHash?: string | undefined;
190
- validatorScore?: number | undefined;
191
189
  }>;
192
190
  //# sourceMappingURL=generate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,aAAa,EAGd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,YAAY,EAIlB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAsBxF;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC;;;;;;;OAOG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IAC1E;;;;;;;OAOG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,CACnB,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,GAAG,qBAAqB,GAAG,IAAI,CAAC;IAC1E;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAC/B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAAC;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;IACxC;;;;;;;OAOG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;CACzD;AA2CD,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;GA0SnC"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,aAAa,EAGd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,YAAY,EAIlB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC3B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAqBxF;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC;;;;;;;OAOG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAAC;IAC1E;;;;;;;OAOG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IAC7C;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,EAAE,CACnB,GAAG,EAAE,cAAc,KAChB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,GAAG,qBAAqB,GAAG,IAAI,CAAC;IAC1E;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAC/B;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAAC;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;IACnC;;;OAGG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;IACxC;;;;;;;OAOG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;CACzD;AA0BD,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,4BAA4B;;;;;;;;;;;;;;;;;;;;;;GAkTnC"}
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Operator UX entry point. Dispatches through the bound
5
5
  * {@link GeneratorRegistry} to mint a blueprint variant with
6
- * operator-authored variance tags + optional default-pin.
6
+ * operator-authored variance tags + an optional operator-default mark.
7
7
  *
8
8
  * ## Behavior
9
9
  *
@@ -52,7 +52,8 @@ import { createHash, randomUUID } from "node:crypto";
52
52
  import { z } from "zod";
53
53
  import { assertContractNoRetiredFields } from "../renders/assert-contract-no-retired-fields.js";
54
54
  import { assertGadgetsRegistered } from "../renders/assert-gadgets.js";
55
- import { registerBlueprint, } from "../renders/index.js";
55
+ import { admitGeneratorBuild, } from "../renders/index.js";
56
+ import { mirrorIntoCache } from "./cache-mirror.js";
56
57
  import { defineHandler } from "../types.js";
57
58
  import { resolveEffectiveAppId } from "./app-access.js";
58
59
  import { GenerationFailedError, GeneratorNotFoundError, MissingCredentialsError, } from "./errors.js";
@@ -61,7 +62,6 @@ const opsInputSchema = opsGenerateBlueprintInputSchema.shape;
61
62
  const opsOutputSchema = z.object({
62
63
  blueprintId: z.string().min(1),
63
64
  codeHash: z.string().optional(),
64
- validatorScore: z.number().min(0).max(1).optional(),
65
65
  source: z
66
66
  .object({
67
67
  kind: z.literal("llm"),
@@ -70,26 +70,6 @@ const opsOutputSchema = z.object({
70
70
  })
71
71
  .strict(),
72
72
  }).shape;
73
- /**
74
- * Read the optional `validatorScore` carried on
75
- * {@link GenerationMetadata} by the advanced generator, which does
76
- * not yet have an explicit field on the canonical interface. Until
77
- * that lands the score arrives as a structural pass-through on
78
- * `metadata` — the read is type-guarded here so the cast is
79
- * confined to one place and the call sites stay clean.
80
- */
81
- function readValidatorScore(metadata) {
82
- if (!metadata || typeof metadata !== "object")
83
- return undefined;
84
- const candidate = metadata.validatorScore;
85
- if (typeof candidate !== "number")
86
- return undefined;
87
- if (!Number.isFinite(candidate))
88
- return undefined;
89
- if (candidate < 0 || candidate > 1)
90
- return undefined;
91
- return candidate;
92
- }
93
73
  /**
94
74
  * Resolve which generator to dispatch. Throws {@link GeneratorNotFoundError}
95
75
  * with a clear "did you mean…" payload when the slug is unknown.
@@ -117,7 +97,7 @@ export function createGguiOpsGenerateBlueprintHandler(deps) {
117
97
  name: "ggui_ops_generate_blueprint",
118
98
  title: "Generate blueprint",
119
99
  audience: ["ops"],
120
- description: "Author a new blueprint variant for the target app (the caller's bound app by default, or an explicitly named app the deployment's authorization policy accepts). Dispatches through the registry's selected generator (defaults to `registry.defaultGenerator()` when the slug is omitted) and persists the resulting code body + metadata against a fresh `blueprintId`. Optionally pins the new blueprint as the operator default for its `(appId, contractHash)` group. Persona tags are normalized (lowercase + trim); near-duplicates surface a warning via telemetry. Returns the new id + content-hash + validator score + the stamped provenance (`source`, llm arm: engine generator slug + model, from the engine's own metadata stamp) — code body lives in the bound store, fetched via render's fast-path on cache hit. App-scoped variant curation for an app you operate — distinct from the personal saved-blueprint library (the _my_ tools).",
100
+ description: "Author a new blueprint variant for the target app (the caller's bound app by default, or an explicitly named app the deployment's authorization policy accepts). Dispatches through the registry's selected generator (defaults to `registry.defaultGenerator()` when the slug is omitted) and persists the resulting code body + metadata against a fresh `blueprintId`. Optionally marks the new blueprint as the operator default for its `(appId, contractHash)` group (the mark orders blueprint listings; it does not decide which blueprint serves a render). Persona tags are normalized (lowercase + trim); near-duplicates surface a warning via telemetry. Returns the new id + content-hash + validator score + the stamped provenance (`source`, llm arm: engine generator slug + model, from the engine's own metadata stamp) — code body lives in the bound store, fetched via render's fast-path on cache hit. App-scoped variant curation for an app you operate — distinct from the personal saved-blueprint library (the _my_ tools).",
121
101
  inputSchema: opsInputSchema,
122
102
  outputSchema: opsOutputSchema,
123
103
  async handler(rawInput, ctx) {
@@ -255,12 +235,6 @@ export function createGguiOpsGenerateBlueprintHandler(deps) {
255
235
  // bytes. A 32-hex prefix here (ggui#1287) was refused by every
256
236
  // conforming code store.
257
237
  const codeHash = createHash("sha256").update(componentCode).digest("hex");
258
- // The advanced generator tunnels `validatorScore` through
259
- // `metadata` until the UiGenerator interface widens to carry
260
- // it explicitly. Read it via the typed helper so the default
261
- // generator (which never sets it) and the advanced generator
262
- // (which does) both round-trip cleanly.
263
- const validatorScore = readValidatorScore(result.metadata);
264
238
  // Engine-GENERATED code: provenance is the llm arm, stamped from
265
239
  // the engine's own metadata claim — the SAME values the cache-
266
240
  // registry mirror below records, so the two stores can never
@@ -270,6 +244,13 @@ export function createGguiOpsGenerateBlueprintHandler(deps) {
270
244
  generator: result.metadata.generator,
271
245
  model: result.metadata.model,
272
246
  };
247
+ // ggui#1280 — the minting engine's build, through the registry's one
248
+ // admission rule. The durable row below carries it. The cache mirror's
249
+ // registration receives the same value: it rides that registry's
250
+ // vector-store row (ggui#1476) and, when the mirror writes through to a
251
+ // separate durable store, the row it writes there under this same id
252
+ // (ggui#1497, see `mirrorIntoCache`).
253
+ const build = admitGeneratorBuild(source, result.metadata.build);
273
254
  const blueprintId = mintBlueprintId();
274
255
  const blueprint = {
275
256
  blueprintId,
@@ -286,7 +267,7 @@ export function createGguiOpsGenerateBlueprintHandler(deps) {
286
267
  createdAt: now(),
287
268
  createdBy: "operator",
288
269
  contract,
289
- ...(validatorScore !== undefined ? { validatorScore } : {}),
270
+ ...(build !== undefined ? { build } : {}),
290
271
  };
291
272
  await deps.blueprintStore.put(blueprint);
292
273
  if (deps.putCode) {
@@ -305,31 +286,40 @@ export function createGguiOpsGenerateBlueprintHandler(deps) {
305
286
  parsed.seedPrompt ??
306
287
  normalizedPersona ??
307
288
  `operator-authored blueprint (${blueprintId})`;
308
- await registerBlueprint(deps.cacheRegistry, appId, {
309
- kind: "template",
310
- contract,
311
- intent: intentForCache,
312
- // ggui#1275 — an explicit intent or a seed prompt states the
313
- // UI's task; a persona or the placeholder is a stand-in the
314
- // matcher's judge never sees.
315
- intentSource: parsed.intent !== undefined || parsed.seedPrompt !== undefined
316
- ? "authored"
317
- : "fallback",
318
- componentCode,
319
- // The cache row MUST carry the same variance as the MVB
320
- // row: `registerBlueprint` keys the exact-lookup on
321
- // `variantKey(variance)`, so omitting it here filed every
322
- // operator-authored variant under the default-variant
323
- // sentinel — invisible to any request that asks for the
324
- // persona it was minted for.
325
- variance: blueprint.variance,
326
- // Operator-DISPATCHED but engine-GENERATED: the code came
327
- // out of `generator.generate(...)`, so provenance is the
328
- // llm arm — the same `source` stamped on the MVB row above.
329
- // The two axes disagree here on purpose, which is exactly
330
- // why `createdBy` cannot be derived from `source`.
331
- source,
332
- createdBy: "operator",
289
+ // ggui#1497 — ONE id per generation: the cache row serves the
290
+ // durable row's id (see `mirrorIntoCache` for what else it writes).
291
+ await mirrorIntoCache({
292
+ cacheRegistry: deps.cacheRegistry,
293
+ writerStore: deps.blueprintStore,
294
+ appId,
295
+ blueprintId,
296
+ input: {
297
+ kind: "template",
298
+ contract,
299
+ intent: intentForCache,
300
+ // ggui#1275 — an explicit intent or a seed prompt states the
301
+ // UI's task; a persona or the placeholder is a stand-in the
302
+ // matcher's judge never sees.
303
+ intentSource: parsed.intent !== undefined || parsed.seedPrompt !== undefined
304
+ ? "authored"
305
+ : "fallback",
306
+ componentCode,
307
+ // The cache row MUST carry the same variance as the MVB
308
+ // row: `registerBlueprint` keys the exact-lookup on
309
+ // `variantKey(variance)`, so omitting it here filed every
310
+ // operator-authored variant under the default-variant
311
+ // sentinel — invisible to any request that asks for the
312
+ // persona it was minted for.
313
+ variance: blueprint.variance,
314
+ // Operator-DISPATCHED but engine-GENERATED: the code came
315
+ // out of `generator.generate(...)`, so provenance is the
316
+ // llm arm — the same `source` stamped on the MVB row above.
317
+ // The two axes disagree here on purpose, which is exactly
318
+ // why `createdBy` cannot be derived from `source`.
319
+ source,
320
+ ...(build !== undefined ? { build } : {}),
321
+ createdBy: "operator",
322
+ },
333
323
  });
334
324
  }
335
325
  catch (err) {
@@ -352,7 +342,7 @@ export function createGguiOpsGenerateBlueprintHandler(deps) {
352
342
  }
353
343
  }
354
344
  }
355
- // 7. Pin as operator default when requested.
345
+ // 7. Mark as operator default when requested.
356
346
  if (parsed.setAsOperatorDefault === true) {
357
347
  await deps.blueprintStore.setOperatorDefault(blueprintId);
358
348
  }
@@ -381,7 +371,6 @@ export function createGguiOpsGenerateBlueprintHandler(deps) {
381
371
  blueprintId,
382
372
  codeHash,
383
373
  source,
384
- ...(validatorScore !== undefined ? { validatorScore } : {}),
385
374
  };
386
375
  return output;
387
376
  },
@@ -27,7 +27,7 @@
27
27
  * enforces their ownership model.
28
28
  */
29
29
  export { createGguiOpsGenerateBlueprintHandler, type GguiOpsGenerateBlueprintDeps, type PutCodeHook, } from './generate.js';
30
- export { createGguiOpsRegisterBlueprintHandler, type GguiOpsRegisterBlueprintDeps, } from './register.js';
30
+ export { createGguiOpsRegisterBlueprintHandler, createRegisterGeneratedBlueprint, type GeneratedBlueprintBytes, type GguiOpsRegisterBlueprintDeps, type RegisterGeneratedBlueprint, type RegisterGeneratedBlueprintOutput, } from './register.js';
31
31
  export { createGguiOpsListBlueprintsHandler, type GguiOpsListBlueprintsDeps, } from './list.js';
32
32
  export { createGguiOpsUpdateBlueprintHandler, type GguiOpsUpdateBlueprintDeps, BlueprintAppMismatchError, } from './update.js';
33
33
  export { createGguiOpsDeleteBlueprintHandler, type GguiOpsDeleteBlueprintDeps, } from './delete.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EACL,qCAAqC,EACrC,KAAK,4BAA4B,EACjC,KAAK,WAAW,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qCAAqC,EACrC,KAAK,4BAA4B,GAClC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kCAAkC,EAClC,KAAK,yBAAyB,GAC/B,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,mCAAmC,EACnC,KAAK,0BAA0B,EAC/B,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mCAAmC,EACnC,KAAK,0BAA0B,GAChC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,wBAAwB,EACxB,KAAK,yBAAyB,GAC/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,gCAAgC,EAChC,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,GAC/B,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EACL,qCAAqC,EACrC,KAAK,4BAA4B,EACjC,KAAK,WAAW,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qCAAqC,EACrC,gCAAgC,EAChC,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,0BAA0B,EAC/B,KAAK,gCAAgC,GACtC,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kCAAkC,EAClC,KAAK,yBAAyB,GAC/B,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,mCAAmC,EACnC,KAAK,0BAA0B,EAC/B,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,mCAAmC,EACnC,KAAK,0BAA0B,GAChC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,wBAAwB,EACxB,KAAK,yBAAyB,GAC/B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,qBAAqB,EACrB,gCAAgC,EAChC,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,GAC/B,MAAM,iBAAiB,CAAC"}
@@ -27,7 +27,7 @@
27
27
  * enforces their ownership model.
28
28
  */
29
29
  export { createGguiOpsGenerateBlueprintHandler, } from './generate.js';
30
- export { createGguiOpsRegisterBlueprintHandler, } from './register.js';
30
+ export { createGguiOpsRegisterBlueprintHandler, createRegisterGeneratedBlueprint, } from './register.js';
31
31
  export { createGguiOpsListBlueprintsHandler, } from './list.js';
32
32
  export { createGguiOpsUpdateBlueprintHandler, BlueprintAppMismatchError, } from './update.js';
33
33
  export { createGguiOpsDeleteBlueprintHandler, } from './delete.js';
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,SAAS,EAGf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAQxF;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C;;;;;;;OAOG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;CACzD;AAmBD,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,yBAAyB;;;;;;;;;;GAyFhC"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/list.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,KAAK,SAAS,EAGf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EACf,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAyB,KAAK,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAQxF;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC;;;;;;OAMG;IACH,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;IAC1C;;;;;;;OAOG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;CACzD;AAkBD,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,yBAAyB;;;;;;;;;;GAyFhC"}