@ggui-ai/mcp-server-handlers 0.6.2 → 0.7.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 (48) hide show
  1. package/dist/ops-apps/delete-app.d.ts +26 -9
  2. package/dist/ops-apps/delete-app.d.ts.map +1 -1
  3. package/dist/ops-apps/delete-app.js +34 -11
  4. package/dist/ops-apps/index.d.ts +1 -1
  5. package/dist/ops-apps/index.d.ts.map +1 -1
  6. package/dist/ops-apps/index.js +1 -1
  7. package/dist/ops-apps/types.d.ts +32 -1
  8. package/dist/ops-apps/types.d.ts.map +1 -1
  9. package/dist/ops-apps/types.js +16 -0
  10. package/dist/ops-blueprint/generate.d.ts.map +1 -1
  11. package/dist/ops-blueprint/generate.js +6 -2
  12. package/dist/ops-blueprint/register.d.ts.map +1 -1
  13. package/dist/ops-blueprint/register.js +7 -2
  14. package/dist/ops-connector-keys/types.d.ts +7 -0
  15. package/dist/ops-connector-keys/types.d.ts.map +1 -1
  16. package/dist/renders/blueprint-durability.d.ts +111 -0
  17. package/dist/renders/blueprint-durability.d.ts.map +1 -0
  18. package/dist/renders/blueprint-durability.js +85 -0
  19. package/dist/renders/blueprint-registry.d.ts +24 -0
  20. package/dist/renders/blueprint-registry.d.ts.map +1 -1
  21. package/dist/renders/blueprint-registry.js +9 -0
  22. package/dist/renders/code-delivery-events.d.ts +76 -0
  23. package/dist/renders/code-delivery-events.d.ts.map +1 -0
  24. package/dist/renders/code-delivery-events.js +60 -0
  25. package/dist/renders/fetch-gadget-types.d.ts +7 -3
  26. package/dist/renders/fetch-gadget-types.d.ts.map +1 -1
  27. package/dist/renders/fetch-gadget-types.js +7 -3
  28. package/dist/renders/generation-cache.d.ts +9 -0
  29. package/dist/renders/generation-cache.d.ts.map +1 -1
  30. package/dist/renders/handshake.d.ts +5 -3
  31. package/dist/renders/handshake.d.ts.map +1 -1
  32. package/dist/renders/handshake.js +9 -4
  33. package/dist/renders/index.d.ts +3 -0
  34. package/dist/renders/index.d.ts.map +1 -1
  35. package/dist/renders/index.js +13 -0
  36. package/dist/renders/render-identity.d.ts +178 -0
  37. package/dist/renders/render-identity.d.ts.map +1 -0
  38. package/dist/renders/render-identity.js +136 -0
  39. package/dist/renders/render.d.ts +39 -5
  40. package/dist/renders/render.d.ts.map +1 -1
  41. package/dist/renders/render.js +198 -83
  42. package/dist/renders/sync-context.d.ts +13 -1
  43. package/dist/renders/sync-context.d.ts.map +1 -1
  44. package/dist/renders/sync-context.js +6 -1
  45. package/dist/renders/update.d.ts +15 -1
  46. package/dist/renders/update.d.ts.map +1 -1
  47. package/dist/renders/update.js +6 -1
  48. package/package.json +7 -7
@@ -1,23 +1,38 @@
1
1
  /**
2
- * `ggui_ops_delete_app` — hard-delete a `GguiApp` row owned by the
2
+ * `ggui_ops_delete_app` — hard-delete an app record owned by the
3
3
  * caller.
4
4
  *
5
5
  * Tenancy: cross-tenant probes return the success shape WITHOUT
6
6
  * touching the row (uniform shape; no existence leak). Idempotent —
7
7
  * a second delete of the same id resolves cleanly.
8
8
  *
9
- * What the cloud adapter additionally does on top of this seam (NOT
10
- * the responsibility of the handler):
11
- * - Cascade-revoke per-app `GguiUserApiKey` rows
12
- * - Cascade-clean per-app provider keys, blueprints, renders
13
- * The handler stays narrow; the adapter's `delete()` implementation
14
- * orchestrates the cascade.
9
+ * Default-app lock: REJECTED when the target is the caller's default
10
+ * app. `defaultAppId` is what the universal route resolves on every
11
+ * request, so deleting the app it names strands that route.
15
12
  *
16
- * Pure over the {@link AppsSource} seam.
13
+ * The check runs AFTER the ownership read. `getDefault(ownerSub)`
14
+ * only ever reads the caller's own row, so ordering is not what keeps
15
+ * another tenant's default secret — nothing here could read it under
16
+ * any ordering. What ordering buys is SHAPE UNIFORMITY in the one
17
+ * state where the two branches disagree: the caller's own default
18
+ * naming an app the caller does not own. Ownership first answers that
19
+ * with the same `{deleted: true}` every other foreign id gets;
20
+ * lock-first would answer with a distinguishable error, and the
21
+ * difference is itself the signal.
22
+ *
23
+ * Scope: this handler removes the APP RECORD, through
24
+ * {@link AppsSource.delete}, and claims nothing beyond it. Whether
25
+ * data other stores hold for the same app disappears with it is the
26
+ * bound implementation's business, spelled out in that method's
27
+ * contract. `{deleted: true}` means the app record is gone — read no
28
+ * cascade into it.
29
+ *
30
+ * Pure over the {@link AppsSource} + {@link UserDefaultAppSource}
31
+ * seams.
17
32
  */
18
33
  import { z } from 'zod';
19
34
  import type { SharedHandler } from '../types.js';
20
- import type { AppsSource } from './types.js';
35
+ import type { AppsSource, UserDefaultAppSource } from './types.js';
21
36
  declare const inputSchema: {
22
37
  readonly appId: z.ZodString;
23
38
  };
@@ -29,6 +44,8 @@ export interface DeleteAppOutput {
29
44
  }
30
45
  export interface DeleteAppDeps {
31
46
  readonly apps: AppsSource;
47
+ /** Read side only — the default-app lock reads `defaultAppId`, never writes it. */
48
+ readonly userDefaultApp: UserDefaultAppSource;
32
49
  }
33
50
  export declare function createDeleteAppHandler(deps: DeleteAppDeps): SharedHandler<typeof inputSchema, typeof outputSchema, DeleteAppOutput>;
34
51
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"delete-app.d.ts","sourceRoot":"","sources":["../../src/ops-apps/delete-app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,QAAA,MAAM,WAAW;;CAOP,CAAC;AAEX,QAAA,MAAM,YAAY;;CAER,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;CAC3B;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,aAAa,GAClB,aAAa,CAAC,OAAO,WAAW,EAAE,OAAO,YAAY,EAAE,eAAe,CAAC,CA8BzE"}
1
+ {"version":3,"file":"delete-app.d.ts","sourceRoot":"","sources":["../../src/ops-apps/delete-app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjE,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEnE,QAAA,MAAM,WAAW;;CAOP,CAAC;AAEX,QAAA,MAAM,YAAY;;CAER,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,mFAAmF;IACnF,QAAQ,CAAC,cAAc,EAAE,oBAAoB,CAAC;CAC/C;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,aAAa,GAClB,aAAa,CAAC,OAAO,WAAW,EAAE,OAAO,YAAY,EAAE,eAAe,CAAC,CAqCzE"}
@@ -1,22 +1,38 @@
1
1
  /**
2
- * `ggui_ops_delete_app` — hard-delete a `GguiApp` row owned by the
2
+ * `ggui_ops_delete_app` — hard-delete an app record owned by the
3
3
  * caller.
4
4
  *
5
5
  * Tenancy: cross-tenant probes return the success shape WITHOUT
6
6
  * touching the row (uniform shape; no existence leak). Idempotent —
7
7
  * a second delete of the same id resolves cleanly.
8
8
  *
9
- * What the cloud adapter additionally does on top of this seam (NOT
10
- * the responsibility of the handler):
11
- * - Cascade-revoke per-app `GguiUserApiKey` rows
12
- * - Cascade-clean per-app provider keys, blueprints, renders
13
- * The handler stays narrow; the adapter's `delete()` implementation
14
- * orchestrates the cascade.
9
+ * Default-app lock: REJECTED when the target is the caller's default
10
+ * app. `defaultAppId` is what the universal route resolves on every
11
+ * request, so deleting the app it names strands that route.
15
12
  *
16
- * Pure over the {@link AppsSource} seam.
13
+ * The check runs AFTER the ownership read. `getDefault(ownerSub)`
14
+ * only ever reads the caller's own row, so ordering is not what keeps
15
+ * another tenant's default secret — nothing here could read it under
16
+ * any ordering. What ordering buys is SHAPE UNIFORMITY in the one
17
+ * state where the two branches disagree: the caller's own default
18
+ * naming an app the caller does not own. Ownership first answers that
19
+ * with the same `{deleted: true}` every other foreign id gets;
20
+ * lock-first would answer with a distinguishable error, and the
21
+ * difference is itself the signal.
22
+ *
23
+ * Scope: this handler removes the APP RECORD, through
24
+ * {@link AppsSource.delete}, and claims nothing beyond it. Whether
25
+ * data other stores hold for the same app disappears with it is the
26
+ * bound implementation's business, spelled out in that method's
27
+ * contract. `{deleted: true}` means the app record is gone — read no
28
+ * cascade into it.
29
+ *
30
+ * Pure over the {@link AppsSource} + {@link UserDefaultAppSource}
31
+ * seams.
17
32
  */
18
33
  import { z } from 'zod';
19
34
  import { resolveOwnerSub } from './identity.js';
35
+ import { DefaultAppDeleteBlockedError } from './types.js';
20
36
  const inputSchema = {
21
37
  appId: z
22
38
  .string()
@@ -31,7 +47,7 @@ export function createDeleteAppHandler(deps) {
31
47
  name: 'ggui_ops_delete_app',
32
48
  title: 'Delete app',
33
49
  audience: ['ops'],
34
- description: "Hard-delete an app owned by the calling user. Idempotent — a second delete returns `{deleted: true}`. Cross-tenant probes return the same shape without touching foreign rows (no existence leak). Cascades per-app keys / blueprints / renders at the cloud adapter layer.",
50
+ description: "Hard-delete an app owned by the calling user. Removes the APP RECORD only — data other stores hold for that app (saved blueprints, per-app provider keys, marketplace installs, issued keys) is not removed by this call, and whether the deployment cleans it up separately is the deployment's own policy. Idempotent — a second delete returns `{deleted: true}`. Cross-tenant probes return the same shape without touching foreign rows (no existence leak). Throws `default_app_delete_blocked` when the target is the caller's default app — set a different default first.",
35
51
  inputSchema,
36
52
  outputSchema,
37
53
  async handler(rawInput, ctx) {
@@ -44,10 +60,17 @@ export function createDeleteAppHandler(deps) {
44
60
  if (!existing) {
45
61
  // Either the row doesn't exist or it lives under a different
46
62
  // owner. Either way: return the success shape without
47
- // touching DDB. Uniform across "missing" and "cross-tenant"
48
- // prevents id-existence leak.
63
+ // touching the store. Uniform across "missing" and
64
+ // "cross-tenant" prevents id-existence leak.
49
65
  return { deleted: true };
50
66
  }
67
+ // AFTER the ownership read, so a caller whose own default names
68
+ // a foreign app gets the same uniform shape as any other foreign
69
+ // id rather than a distinguishable lock error.
70
+ const currentDefault = await deps.userDefaultApp.getDefault(ownerSub);
71
+ if (currentDefault === parsed.appId) {
72
+ throw new DefaultAppDeleteBlockedError(parsed.appId);
73
+ }
51
74
  await deps.apps.delete({ appId: parsed.appId, ownerSub });
52
75
  return { deleted: true };
53
76
  },
@@ -14,7 +14,7 @@
14
14
  * - `createSetDefaultAppHandler` → `ggui_ops_set_default_app`
15
15
  */
16
16
  export type { AppRecord, AppsSource, AppUpdatePatch, UserDefaultAppSource, } from './types.js';
17
- export { AppNotFoundError, OpsAppsAccessDeniedError } from './types.js';
17
+ export { AppNotFoundError, DefaultAppDeleteBlockedError, OpsAppsAccessDeniedError, } from './types.js';
18
18
  export { createListAppsHandler } from './list-apps.js';
19
19
  export type { ListAppsDeps, ListAppsOutput } from './list-apps.js';
20
20
  export { createCreateAppHandler } from './create-app.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ops-apps/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,YAAY,EACV,SAAS,EACT,UAAU,EACV,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAExE,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,YAAY,EACV,eAAe,EACf,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,YAAY,EACV,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ops-apps/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,YAAY,EACV,SAAS,EACT,UAAU,EACV,cAAc,EACd,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,gBAAgB,EAChB,4BAA4B,EAC5B,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEnE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,YAAY,EACV,eAAe,EACf,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AAClE,YAAY,EACV,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,sBAAsB,CAAC"}
@@ -13,7 +13,7 @@
13
13
  * - `createDeleteAppHandler` → `ggui_ops_delete_app`
14
14
  * - `createSetDefaultAppHandler` → `ggui_ops_set_default_app`
15
15
  */
16
- export { AppNotFoundError, OpsAppsAccessDeniedError } from './types.js';
16
+ export { AppNotFoundError, DefaultAppDeleteBlockedError, OpsAppsAccessDeniedError, } from './types.js';
17
17
  export { createListAppsHandler } from './list-apps.js';
18
18
  export { createCreateAppHandler } from './create-app.js';
19
19
  export { createUpdateAppHandler } from './update-app.js';
@@ -99,7 +99,25 @@ export interface AppsSource {
99
99
  ownerSub: string;
100
100
  patch: AppUpdatePatch;
101
101
  }): Promise<AppRecord>;
102
- /** Hard delete. No-throw idempotent — second delete of the same id resolves. */
102
+ /**
103
+ * Hard delete. No-throw idempotent — a second delete of the same id
104
+ * resolves. Rejects cross-tenant.
105
+ *
106
+ * Scope of the obligation, stated because a caller cannot see it:
107
+ * this seam owns the APP RECORD and nothing else. Whatever other
108
+ * stores hold keyed by the same `appId` — saved blueprints, per-app
109
+ * provider keys, marketplace installs, issued keys — is outside it.
110
+ *
111
+ * An implementation MAY cascade those away inside its own `delete`,
112
+ * and MAY complete that cascade asynchronously after resolving. One
113
+ * that leaves rows behind — permanently or until an asynchronous
114
+ * sweep lands — MUST make that observable: a named, structured event
115
+ * naming the row classes left in place, emitted on the delete that
116
+ * orphaned them, carrying an indication of whether asynchronous
117
+ * completion was arranged. Returning silently is the contract
118
+ * violation — not the orphaning itself. Orphaned rows an operator
119
+ * can enumerate are debt; orphaned rows nobody can find are loss.
120
+ */
103
121
  delete(args: {
104
122
  appId: string;
105
123
  ownerSub: string;
@@ -143,6 +161,19 @@ export declare class AppNotFoundError extends Error {
143
161
  readonly code: "app_not_found";
144
162
  constructor(appId: string);
145
163
  }
164
+ /**
165
+ * Thrown when the delete target IS the caller's default app.
166
+ *
167
+ * `defaultAppId` is what the universal route resolves on every
168
+ * 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.
172
+ */
173
+ export declare class DefaultAppDeleteBlockedError extends Error {
174
+ readonly code: "default_app_delete_blocked";
175
+ constructor(appId: string);
176
+ }
146
177
  /**
147
178
  * Thrown by adapters that prefer surfacing access denial over the
148
179
  * "treat as not-found" privacy posture. Handlers translate to the
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ops-apps/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ops-apps/types.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,22 @@ export class AppNotFoundError extends Error {
9
9
  this.name = 'AppNotFoundError';
10
10
  }
11
11
  }
12
+ /**
13
+ * Thrown when the delete target IS the caller's default app.
14
+ *
15
+ * `defaultAppId` is what the universal route resolves on every
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.
20
+ */
21
+ export class DefaultAppDeleteBlockedError extends Error {
22
+ code = 'default_app_delete_blocked';
23
+ constructor(appId) {
24
+ super(`default_app_delete_blocked: app ${JSON.stringify(appId)} is the calling user's default — set a different default app first, then delete this one`);
25
+ this.name = 'DefaultAppDeleteBlockedError';
26
+ }
27
+ }
12
28
  /**
13
29
  * Thrown by adapters that prefer surfacing access denial over the
14
30
  * "treat as not-found" privacy posture. Handlers translate to the
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;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,EAGjB,KAAK,0BAA0B,EAChC,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,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjE,QAAA,MAAM,cAAc;;;;;;;;CAAwC,CAAC;AAC7D,QAAA,MAAM,eAAe;;;;;;;;;CAWb,CAAC;AAET;;;;;;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;CACzC;AAmCD,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,4BAA4B,GACjC,aAAa,CAAC,OAAO,cAAc,EAAE,OAAO,eAAe,EAAE,0BAA0B,CAAC,CAqP1F"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;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,EAGjB,KAAK,0BAA0B,EAChC,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,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAQjE,QAAA,MAAM,cAAc;;;;;;;;CAAwC,CAAC;AAC7D,QAAA,MAAM,eAAe;;;;;;;;;CAWb,CAAC;AAET;;;;;;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;CACzC;AAmCD,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,4BAA4B,GACjC,aAAa,CAAC,OAAO,cAAc,EAAE,OAAO,eAAe,EAAE,0BAA0B,CAAC,CAyP1F"}
@@ -123,8 +123,9 @@ export function createGguiOpsGenerateBlueprintHandler(deps) {
123
123
  // in `renders/`.
124
124
  assertContractNoRetiredFields(parsed.contract);
125
125
  // 0. Every `contract.clientCapabilities.gadgets[*]` MUST
126
- // resolve in `App.gadgets` by the full `(hook, package,
127
- // version)` tuple. Throws a precise reject when an
126
+ // resolve in `App.gadgets` by `(package, export name)` — the
127
+ // wire carries no version; the operator's catalog is the
128
+ // version pin. Throws a precise reject when an
128
129
  // unregistered wrapper is referenced. No-op when
129
130
  // `appMetadataStore` is unset.
130
131
  //
@@ -268,7 +269,10 @@ export function createGguiOpsGenerateBlueprintHandler(deps) {
268
269
  // Operator-DISPATCHED but engine-GENERATED: the code came
269
270
  // out of `generator.generate(...)`, so provenance is the
270
271
  // llm arm — the same `source` stamped on the MVB row above.
272
+ // The two axes disagree here on purpose, which is exactly
273
+ // why `createdBy` cannot be derived from `source`.
271
274
  source,
275
+ createdBy: "operator",
272
276
  });
273
277
  }
274
278
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,YAAY,EAEjB,KAAK,0BAA0B,EAEhC,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAqB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,QAAA,MAAM,cAAc;;;;;;;;CAAwC,CAAC;AAC7D,QAAA,MAAM,eAAe;;;;;;CAIb,CAAC;AAST;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC;;;OAGG;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;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAC/B;;;;;;;;OAQG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAAC;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;IACnC;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;CACzC;AAED,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,4BAA4B,GACjC,aAAa,CAAC,OAAO,cAAc,EAAE,OAAO,eAAe,EAAE,0BAA0B,CAAC,CA8K1F"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/ops-blueprint/register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,YAAY,EAEjB,KAAK,0BAA0B,EAEhC,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAqB,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,KAAK,EAAkB,aAAa,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,QAAA,MAAM,cAAc;;;;;;;;CAAwC,CAAC;AAC7D,QAAA,MAAM,eAAe;;;;;;CAIb,CAAC;AAST;;;;;GAKG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IACxC;;;OAGG;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;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC;IAC/B;;;;;;;;OAQG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,qBAAqB,CAAC;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;IACnC;;OAEG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B;;OAEG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,MAAM,CAAC;CACzC;AAED,wBAAgB,qCAAqC,CACnD,IAAI,EAAE,4BAA4B,GACjC,aAAa,CAAC,OAAO,cAAc,EAAE,OAAO,eAAe,EAAE,0BAA0B,CAAC,CAmL1F"}
@@ -78,8 +78,9 @@ export function createGguiOpsRegisterBlueprintHandler(deps) {
78
78
  // in `renders/`.
79
79
  assertContractNoRetiredFields(parsed.contract);
80
80
  // Every `contract.clientCapabilities.gadgets[*]` MUST resolve
81
- // in `App.gadgets` by the full `(hook, package, version)`
82
- // tuple. Fails fast with a precise reject before any state
81
+ // in `App.gadgets` by `(package, export name)` — the wire
82
+ // carries no version; the operator's catalog is the version
83
+ // pin. Fails fast with a precise reject before any state
83
84
  // mutation. No-op when no `appMetadataStore` is bound.
84
85
  if (deps.appMetadataStore) {
85
86
  const appRecord = await deps.appMetadataStore.get(ctx.appId);
@@ -166,6 +167,10 @@ export function createGguiOpsRegisterBlueprintHandler(deps) {
166
167
  // Same user-arm provenance as the MVB row above — one
167
168
  // handler call, one provenance claim across both stores.
168
169
  source: USER_SOURCE,
170
+ // An operator invoked this tool. Without it the durable
171
+ // record would claim the standard agent flow minted a row
172
+ // that is retained permanently.
173
+ createdBy: "operator",
169
174
  });
170
175
  }
171
176
  catch (err) {
@@ -57,6 +57,13 @@ export interface IssueConnectorKeyResult {
57
57
  * - `revoke` is idempotent — re-revoking a `revoked` row returns the
58
58
  * same row with `alreadyRevoked: true`. Cross-user revoke is
59
59
  * rejected with `ConnectorKeyAccessDeniedError`.
60
+ * - When `issue` is asked to bind the key to an app (`appId` set),
61
+ * the implementation MUST verify the subject owns that app before
62
+ * minting, and MUST reject with `ConnectorKeyAccessDeniedError`
63
+ * when it does not or when the deployment cannot verify. A key
64
+ * bound to an app the subject does not own is a credential for
65
+ * someone else's data — refusing the mint is the contract, not a
66
+ * quality-of-implementation choice.
60
67
  */
61
68
  export interface ConnectorKeysSource {
62
69
  list(ownerSub: string): Promise<readonly ConnectorKeySummary[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ops-connector-keys/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,2BAA2B;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IACtC,qBAAqB;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,mBAAmB,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACxE;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,EAAG,6BAA6B,CAAU;gBAC3C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,EAAG,yBAAyB,CAAU;gBACvC,KAAK,EAAE,MAAM;CAM1B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ops-connector-keys/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,2BAA2B;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,gCAAgC;IAChC,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IACtC,qBAAqB;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,0DAA0D;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,mEAAmE;IACnE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,kCAAkC;IAClC,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,mBAAmB,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACxE;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,EAAG,6BAA6B,CAAU;gBAC3C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,EAAG,yBAAyB,CAAU;gBACvC,KAAK,EAAE,MAAM;CAM1B"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Durable write-through for freshly registered blueprints (#430 slice
3
+ * 2).
4
+ *
5
+ * The blueprint registry (`blueprint-registry.ts`) is a CAPPED vector
6
+ * store: registering past `maxPerKind` evicts the lowest-hit entry, and
7
+ * a deployment whose vector store is process-local loses the whole
8
+ * bucket on restart. That is the right shape for a match cache — a miss
9
+ * costs one regeneration. It is the wrong shape for anything that needs
10
+ * to resolve a blueprint by id LATER, because "later" is exactly when
11
+ * the entry is gone.
12
+ *
13
+ * So a registration that mints a fresh row also writes it through to a
14
+ * durable pair: metadata to a {@link BlueprintStore}, the compiled body
15
+ * to a {@link CodeStore} keyed by content hash. Deployments that bind
16
+ * neither keep today's behavior exactly.
17
+ *
18
+ * ## Two `Blueprint` types, and the projection between them
19
+ *
20
+ * The registry's {@link RegistryBlueprint} and the protocol's
21
+ * `Blueprint` share a name and almost nothing else. The registry row is
22
+ * a match candidate: `id`, `kind`, `intent`, `componentCode` inline, a
23
+ * `hitCount`. The protocol row is a persistence record: `blueprintId`,
24
+ * `appId`, `contractHash`, a `codeHash` POINTER to the body. The
25
+ * projection below is where they meet on the DURABLE-WRITE path, and
26
+ * it is where the registry's `contractKey` becomes the protocol's
27
+ * `contractHash` — one value, two spellings, same 16-char blueprintKey
28
+ * domain.
29
+ *
30
+ * Not the only such hop in the codebase: `decide-handshake.ts` makes
31
+ * the same translation projecting a matched blueprint onto
32
+ * `blueprintMeta`, and predates this module. The claim is scoped on
33
+ * purpose — a docstring that overstates its reach is how a reader
34
+ * concludes a rename is contained when it is not.
35
+ *
36
+ * ## Best-effort, and what "best" means when it fails
37
+ *
38
+ * Registration must never fail because durability hiccuped: the render
39
+ * that triggered it already produced working code and already
40
+ * committed. Both writes are therefore try/caught into named events.
41
+ *
42
+ * The order is body first, then metadata, and that is load-bearing. A
43
+ * body with no row is an orphan — invisible, reclaimable, harmless. A
44
+ * row naming a `codeHash` with no object behind it is a LIE: a later
45
+ * resolve finds the record, fetches the body, gets nothing, and fails
46
+ * at the point where it looked like it would succeed. So when the body
47
+ * write fails, the row is still written but WITHOUT `codeHash`, which
48
+ * reads as "metadata recorded, no body stored" — a state the protocol
49
+ * type already models and consumers already branch on.
50
+ *
51
+ * ## Backfill posture — documented, not built
52
+ *
53
+ * Blueprints registered before this shipped exist only in the capped
54
+ * vector registry. Their records carry a `blueprintId` that resolves to
55
+ * nothing durable, so a re-mint against them lands in
56
+ * `blueprint_unresolvable`. No backfill job exists, deliberately: the
57
+ * affected rows are sandbox-only, the cost of the miss is one
58
+ * regeneration, and a job to walk a capped in-memory registry would be
59
+ * writing whatever survived rather than what was actually registered.
60
+ * If real data ever needs it, the job is a scope scan of the vector
61
+ * store through this same projection — but not until then.
62
+ */
63
+ import type { BlueprintStore, CodeStore } from '@ggui-ai/mcp-server-core';
64
+ import type { Blueprint as DurableBlueprint } from '@ggui-ai/protocol';
65
+ import type { Blueprint as RegistryBlueprint } from './blueprint-registry.js';
66
+ /**
67
+ * Every event this module can emit. Closed union — a new emitter picks
68
+ * from these or extends the type, which is what makes a rename a
69
+ * compile error rather than an alert filter that quietly stops
70
+ * matching.
71
+ */
72
+ export type BlueprintDurabilityEvent = 'blueprint_durable_write_failed' | 'blueprint_code_write_failed';
73
+ /**
74
+ * The event names as values, so every emitter — in this package or a
75
+ * storage backend elsewhere — spells them from one place.
76
+ */
77
+ export declare const BLUEPRINT_DURABILITY_EVENTS: {
78
+ /** Metadata row rejected. The blueprint is not durably resolvable. */
79
+ readonly durableWriteFailed: "blueprint_durable_write_failed";
80
+ /** Body rejected. The row still lands, without a `codeHash`. */
81
+ readonly codeWriteFailed: "blueprint_code_write_failed";
82
+ };
83
+ /**
84
+ * The durable pair. Both optional at the binding site — a deployment
85
+ * may have neither (no durability), or metadata without a body store
86
+ * (rows persist, bodies do not).
87
+ */
88
+ export interface BlueprintDurabilityDeps {
89
+ readonly blueprintStore?: BlueprintStore;
90
+ readonly codeStore?: CodeStore;
91
+ }
92
+ /**
93
+ * Project a registry row onto the durable record.
94
+ *
95
+ * `codeHash` is passed rather than derived so the caller can omit it
96
+ * when the body write failed — the record then honestly says no body
97
+ * is stored. `codeS3Url` is deliberately NOT set here: it names a
98
+ * location only the storage adapter knows, and the adapter composes it
99
+ * on read.
100
+ */
101
+ export declare function projectDurableBlueprint(blueprint: RegistryBlueprint, appId: string, codeHash: string | undefined, createdBy?: DurableBlueprint['createdBy']): DurableBlueprint;
102
+ /**
103
+ * Write a freshly minted blueprint through to durable storage.
104
+ *
105
+ * Never throws and never retries: one round-trip per store, both
106
+ * try/caught. An unbound store is a no-op — not an error, and not an
107
+ * event, because a deployment that never bound one is not failing at
108
+ * anything.
109
+ */
110
+ export declare function writeBlueprintDurably(deps: BlueprintDurabilityDeps | undefined, appId: string, blueprint: RegistryBlueprint, createdBy?: DurableBlueprint['createdBy']): Promise<void>;
111
+ //# sourceMappingURL=blueprint-durability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint-durability.d.ts","sourceRoot":"","sources":["../../src/renders/blueprint-durability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6DG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,IAAI,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE9E;;;;;GAKG;AACH,MAAM,MAAM,wBAAwB,GAChC,gCAAgC,GAChC,6BAA6B,CAAC;AAElC;;;GAGG;AACH,eAAO,MAAM,2BAA2B;IACtC,sEAAsE;;IAEtE,gEAAgE;;CAEL,CAAC;AAQ9D;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,iBAAiB,EAC5B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,GAAE,gBAAgB,CAAC,WAAW,CAAW,GACjD,gBAAgB,CAmBlB;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,uBAAuB,GAAG,SAAS,EACzC,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,iBAAiB,EAC5B,SAAS,GAAE,gBAAgB,CAAC,WAAW,CAAW,GACjD,OAAO,CAAC,IAAI,CAAC,CAyBf"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * The event names as values, so every emitter — in this package or a
3
+ * storage backend elsewhere — spells them from one place.
4
+ */
5
+ export const BLUEPRINT_DURABILITY_EVENTS = {
6
+ /** Metadata row rejected. The blueprint is not durably resolvable. */
7
+ durableWriteFailed: 'blueprint_durable_write_failed',
8
+ /** Body rejected. The row still lands, without a `codeHash`. */
9
+ codeWriteFailed: 'blueprint_code_write_failed',
10
+ };
11
+ const DURABLE_WRITE_FAILED = BLUEPRINT_DURABILITY_EVENTS.durableWriteFailed;
12
+ const CODE_WRITE_FAILED = BLUEPRINT_DURABILITY_EVENTS.codeWriteFailed;
13
+ /**
14
+ * Project a registry row onto the durable record.
15
+ *
16
+ * `codeHash` is passed rather than derived so the caller can omit it
17
+ * when the body write failed — the record then honestly says no body
18
+ * is stored. `codeS3Url` is deliberately NOT set here: it names a
19
+ * location only the storage adapter knows, and the adapter composes it
20
+ * on read.
21
+ */
22
+ export function projectDurableBlueprint(blueprint, appId, codeHash, createdBy = 'agent') {
23
+ return {
24
+ blueprintId: blueprint.id,
25
+ appId,
26
+ // Registry `contractKey` → protocol `contractHash`. Same 16-char
27
+ // blueprintKey value; see the module docstring.
28
+ contractHash: blueprint.contractKey,
29
+ source: blueprint.source,
30
+ variance: blueprint.variance,
31
+ createdAt: blueprint.createdAt,
32
+ // WHO initiated the mint — a different axis from `source`, which
33
+ // records what produced the code. An operator-invoked registration
34
+ // is `createdBy: 'operator'` even when `source.kind` is `'llm'`.
35
+ // Defaulted rather than derived: the registry row does not carry
36
+ // this, and only the caller knows which tool it is serving.
37
+ createdBy,
38
+ contract: blueprint.contract,
39
+ ...(codeHash !== undefined ? { codeHash } : {}),
40
+ };
41
+ }
42
+ /**
43
+ * Write a freshly minted blueprint through to durable storage.
44
+ *
45
+ * Never throws and never retries: one round-trip per store, both
46
+ * try/caught. An unbound store is a no-op — not an error, and not an
47
+ * event, because a deployment that never bound one is not failing at
48
+ * anything.
49
+ */
50
+ export async function writeBlueprintDurably(deps, appId, blueprint, createdBy = 'agent') {
51
+ const blueprintStore = deps?.blueprintStore;
52
+ if (!blueprintStore)
53
+ return;
54
+ // Body first — see the module docstring on why an orphan body beats a
55
+ // row that points at nothing.
56
+ let codeHash;
57
+ const codeStore = deps?.codeStore;
58
+ if (codeStore && blueprint.componentCode.length > 0) {
59
+ try {
60
+ const hash = codeStore.hashOf(blueprint.componentCode);
61
+ await codeStore.put(hash, blueprint.componentCode);
62
+ codeHash = hash;
63
+ }
64
+ catch (err) {
65
+ logDurabilityFailure(CODE_WRITE_FAILED, blueprint, appId, err);
66
+ }
67
+ }
68
+ try {
69
+ await blueprintStore.put(projectDurableBlueprint(blueprint, appId, codeHash, createdBy));
70
+ }
71
+ catch (err) {
72
+ logDurabilityFailure(DURABLE_WRITE_FAILED, blueprint, appId, err);
73
+ }
74
+ }
75
+ function logDurabilityFailure(event, blueprint, appId, err) {
76
+ // eslint-disable-next-line no-console -- structured single-line event for log-pipeline pickup
77
+ console.warn(JSON.stringify({
78
+ msg: event,
79
+ blueprintId: blueprint.id,
80
+ contractKey: blueprint.contractKey,
81
+ appId,
82
+ source: blueprint.source.kind,
83
+ error: err instanceof Error ? err.message : String(err),
84
+ }));
85
+ }
@@ -2,6 +2,7 @@ import type { BlueprintIndex, EmbeddingProvider, EnumerableVectorStore, VectorSt
2
2
  export type { BlueprintIndex } from '@ggui-ai/mcp-server-core';
3
3
  import { type BlueprintSource, type BlueprintVariance, type DataContract } from '@ggui-ai/protocol';
4
4
  import { type ContractValidationFinding, type ContractValidationResult } from '@ggui-ai/negotiator';
5
+ import { type BlueprintDurabilityDeps } from './blueprint-durability.js';
5
6
  /**
6
7
  * Atomic-design level. The runtime currently writes only
7
8
  * `'template'` — the full-component case. Smaller-grain kinds are
@@ -112,6 +113,17 @@ export interface BlueprintRegistryDeps {
112
113
  * indexed exact lookup that consume it land next wave.
113
114
  */
114
115
  readonly index: BlueprintIndex;
116
+ /**
117
+ * Durable write-through target (#430 slice 2). When bound, a fresh
118
+ * mint is also written to a {@link BlueprintStore} (+ optional
119
+ * {@link CodeStore} for the body) so it stays resolvable by id after
120
+ * the capped registry has evicted it or the process has restarted.
121
+ *
122
+ * Optional and best-effort: absent ⇒ no write, no event; present and
123
+ * failing ⇒ a named event and a registration that still succeeds.
124
+ * See `blueprint-durability.ts`.
125
+ */
126
+ readonly durability?: BlueprintDurabilityDeps;
115
127
  }
116
128
  /** Input for {@link registerBlueprint}. */
117
129
  export interface RegisterBlueprintInput {
@@ -140,6 +152,18 @@ export interface RegisterBlueprintInput {
140
152
  * empty variance as one stable sentinel.
141
153
  */
142
154
  readonly variance?: BlueprintVariance;
155
+ /**
156
+ * WHO initiated this mint, for the durable record. `'agent'` is the
157
+ * standard handshake → render flow; the operator tools
158
+ * (`ggui_ops_register_blueprint` / `ggui_ops_generate_blueprint`)
159
+ * pass `'operator'`.
160
+ *
161
+ * A different axis from {@link source}, which records what PRODUCED
162
+ * the code: an operator-invoked generation is `createdBy: 'operator'`
163
+ * AND `source.kind: 'llm'`. Defaults to `'agent'` — the registry row
164
+ * itself does not carry the field, so only the caller knows.
165
+ */
166
+ readonly createdBy?: 'agent' | 'operator';
143
167
  }
144
168
  /**
145
169
  * Compose the deterministic exact-lookup key — the `(scope, exactKey)`
@@ -1 +1 @@
1
- {"version":3,"file":"blueprint-registry.d.ts","sourceRoot":"","sources":["../../src/renders/blueprint-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blueprint-registry.d.ts","sourceRoot":"","sources":["../../src/renders/blueprint-registry.ts"],"names":[],"mappings":"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"}