@superblocksteam/gateway 2.0.174-next.0 → 2.0.175-next.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 (212) hide show
  1. package/README.md +43 -18
  2. package/dist/agents/resolve-orchestrator-url.d.ts +1 -0
  3. package/dist/agents/resolve-orchestrator-url.d.ts.map +1 -0
  4. package/dist/capabilities/integration-metadata.d.ts +1 -0
  5. package/dist/capabilities/integration-metadata.d.ts.map +1 -0
  6. package/dist/capabilities/lifecycle.d.ts +2 -0
  7. package/dist/capabilities/lifecycle.d.ts.map +1 -0
  8. package/dist/capabilities/lifecycle.js +10 -6
  9. package/dist/capabilities/lifecycle.js.map +1 -1
  10. package/dist/capabilities/live-state-attaches.d.ts +1 -0
  11. package/dist/capabilities/live-state-attaches.d.ts.map +1 -0
  12. package/dist/capabilities/query-integration.d.ts +1 -0
  13. package/dist/capabilities/query-integration.d.ts.map +1 -0
  14. package/dist/capabilities/source-files-archive.d.ts +1 -0
  15. package/dist/capabilities/source-files-archive.d.ts.map +1 -0
  16. package/dist/capabilities/tool-permission-reply.d.ts +1 -0
  17. package/dist/capabilities/tool-permission-reply.d.ts.map +1 -0
  18. package/dist/capabilities/types.d.ts +1 -0
  19. package/dist/capabilities/types.d.ts.map +1 -0
  20. package/dist/capture/browser-contract.d.ts +1 -0
  21. package/dist/capture/browser-contract.d.ts.map +1 -0
  22. package/dist/capture/browser-instructions.d.ts +1 -0
  23. package/dist/capture/browser-instructions.d.ts.map +1 -0
  24. package/dist/capture/capture-library-probe.d.ts +1 -0
  25. package/dist/capture/capture-library-probe.d.ts.map +1 -0
  26. package/dist/capture/capture-library.d.ts +1 -0
  27. package/dist/capture/capture-library.d.ts.map +1 -0
  28. package/dist/capture/classify-library-paint.d.ts +1 -0
  29. package/dist/capture/classify-library-paint.d.ts.map +1 -0
  30. package/dist/capture/cowork-editor-url.d.ts +1 -0
  31. package/dist/capture/cowork-editor-url.d.ts.map +1 -0
  32. package/dist/capture/host-mcp-scan.d.ts +1 -0
  33. package/dist/capture/host-mcp-scan.d.ts.map +1 -0
  34. package/dist/capture/library-parent-script.d.ts +1 -0
  35. package/dist/capture/library-parent-script.d.ts.map +1 -0
  36. package/dist/capture/mode.d.ts +1 -0
  37. package/dist/capture/mode.d.ts.map +1 -0
  38. package/dist/config.d.ts +7 -0
  39. package/dist/config.d.ts.map +1 -0
  40. package/dist/config.js +1 -0
  41. package/dist/config.js.map +1 -1
  42. package/dist/deadline.d.ts +1 -0
  43. package/dist/deadline.d.ts.map +1 -0
  44. package/dist/debug.d.ts +1 -0
  45. package/dist/debug.d.ts.map +1 -0
  46. package/dist/deps.d.ts +4 -3
  47. package/dist/deps.d.ts.map +1 -0
  48. package/dist/health/readiness.d.ts +1 -0
  49. package/dist/health/readiness.d.ts.map +1 -0
  50. package/dist/http/main.d.ts +3 -0
  51. package/dist/http/main.d.ts.map +1 -0
  52. package/dist/http/main.js +8 -0
  53. package/dist/http/main.js.map +1 -0
  54. package/dist/http/serve.d.ts +26 -0
  55. package/dist/http/serve.d.ts.map +1 -0
  56. package/dist/http/serve.js +255 -0
  57. package/dist/http/serve.js.map +1 -0
  58. package/dist/index.d.ts +1 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/integrations/filters.d.ts +1 -0
  61. package/dist/integrations/filters.d.ts.map +1 -0
  62. package/dist/integrations/filters.js +1 -16
  63. package/dist/integrations/filters.js.map +1 -1
  64. package/dist/integrations/map.d.ts +10 -4
  65. package/dist/integrations/map.d.ts.map +1 -0
  66. package/dist/integrations/map.js +8 -6
  67. package/dist/integrations/map.js.map +1 -1
  68. package/dist/integrations/profile-key.d.ts +1 -0
  69. package/dist/integrations/profile-key.d.ts.map +1 -0
  70. package/dist/integrations/read-only-postgres-query.d.ts +1 -0
  71. package/dist/integrations/read-only-postgres-query.d.ts.map +1 -0
  72. package/dist/integrations/resolve-profile.d.ts +1 -0
  73. package/dist/integrations/resolve-profile.d.ts.map +1 -0
  74. package/dist/main.d.ts +1 -0
  75. package/dist/main.d.ts.map +1 -0
  76. package/dist/orchestrator/client.d.ts +1 -0
  77. package/dist/orchestrator/client.d.ts.map +1 -0
  78. package/dist/playwright/ensure-chromium.d.ts +1 -0
  79. package/dist/playwright/ensure-chromium.d.ts.map +1 -0
  80. package/dist/preview/capture-screenshot.d.ts +1 -0
  81. package/dist/preview/capture-screenshot.d.ts.map +1 -0
  82. package/dist/preview/capture-screenshot.js +1 -1
  83. package/dist/preview/capture-screenshot.js.map +1 -1
  84. package/dist/preview/viewer-url.d.ts +1 -0
  85. package/dist/preview/viewer-url.d.ts.map +1 -0
  86. package/dist/process/fault-barrier.d.ts +1 -0
  87. package/dist/process/fault-barrier.d.ts.map +1 -0
  88. package/dist/sabs/agent-facing-text.d.ts +1 -0
  89. package/dist/sabs/agent-facing-text.d.ts.map +1 -0
  90. package/dist/sabs/app-state.d.ts +3 -0
  91. package/dist/sabs/app-state.d.ts.map +1 -0
  92. package/dist/sabs/app-state.js +5 -0
  93. package/dist/sabs/app-state.js.map +1 -1
  94. package/dist/sabs/awaited-decision.d.ts +1 -0
  95. package/dist/sabs/awaited-decision.d.ts.map +1 -0
  96. package/dist/sabs/browser-context.d.ts +1 -0
  97. package/dist/sabs/browser-context.d.ts.map +1 -0
  98. package/dist/sabs/editor-client-methods.d.ts +1 -0
  99. package/dist/sabs/editor-client-methods.d.ts.map +1 -0
  100. package/dist/sabs/editor-client-methods.js +5 -3
  101. package/dist/sabs/editor-client-methods.js.map +1 -1
  102. package/dist/sabs/editor-socket.d.ts +1 -0
  103. package/dist/sabs/editor-socket.d.ts.map +1 -0
  104. package/dist/sabs/recent-tool-runs.d.ts +1 -0
  105. package/dist/sabs/recent-tool-runs.d.ts.map +1 -0
  106. package/dist/sabs/session-peer.d.ts +8 -0
  107. package/dist/sabs/session-peer.d.ts.map +1 -0
  108. package/dist/sabs/streamed-reply.d.ts +1 -0
  109. package/dist/sabs/streamed-reply.d.ts.map +1 -0
  110. package/dist/sabs/turn-collector.d.ts +1 -0
  111. package/dist/sabs/turn-collector.d.ts.map +1 -0
  112. package/dist/sabs/websocket-session-peer.d.ts +2 -0
  113. package/dist/sabs/websocket-session-peer.d.ts.map +1 -0
  114. package/dist/sabs/websocket-session-peer.js +5 -0
  115. package/dist/sabs/websocket-session-peer.js.map +1 -1
  116. package/dist/security/constant-time.d.ts +1 -0
  117. package/dist/security/constant-time.d.ts.map +1 -0
  118. package/dist/server/client.d.ts +10 -0
  119. package/dist/server/client.d.ts.map +1 -0
  120. package/dist/server/client.js +9 -0
  121. package/dist/server/client.js.map +1 -1
  122. package/dist/server/identity-reads.d.ts +1 -0
  123. package/dist/server/identity-reads.d.ts.map +1 -0
  124. package/dist/start.d.ts +6 -1
  125. package/dist/start.d.ts.map +1 -0
  126. package/dist/start.js +22 -9
  127. package/dist/start.js.map +1 -1
  128. package/dist/stores/memory.d.ts +1 -0
  129. package/dist/stores/memory.d.ts.map +1 -0
  130. package/dist/stores/types.d.ts +1 -0
  131. package/dist/stores/types.d.ts.map +1 -0
  132. package/dist/telemetry/mcp-client.d.ts +1 -0
  133. package/dist/telemetry/mcp-client.d.ts.map +1 -0
  134. package/dist/telemetry/mcp-usage.d.ts +22 -0
  135. package/dist/telemetry/mcp-usage.d.ts.map +1 -0
  136. package/dist/telemetry/mcp-usage.js +102 -0
  137. package/dist/telemetry/mcp-usage.js.map +1 -0
  138. package/dist/telemetry/metrics.d.ts +4 -0
  139. package/dist/telemetry/metrics.d.ts.map +1 -0
  140. package/dist/telemetry/metrics.js +11 -0
  141. package/dist/telemetry/metrics.js.map +1 -1
  142. package/dist/telemetry/runtime.d.ts +3 -1
  143. package/dist/telemetry/runtime.d.ts.map +1 -0
  144. package/dist/telemetry/runtime.js +12 -5
  145. package/dist/telemetry/runtime.js.map +1 -1
  146. package/dist/transports/mcp/admin-tools.d.ts +4 -7
  147. package/dist/transports/mcp/admin-tools.d.ts.map +1 -0
  148. package/dist/transports/mcp/admin-tools.js +5 -51
  149. package/dist/transports/mcp/admin-tools.js.map +1 -1
  150. package/dist/transports/mcp/app-status-html.d.ts +1 -0
  151. package/dist/transports/mcp/app-status-html.d.ts.map +1 -0
  152. package/dist/transports/mcp/client-presentation.d.ts +1 -0
  153. package/dist/transports/mcp/client-presentation.d.ts.map +1 -0
  154. package/dist/transports/mcp/decision-card-html.d.ts +1 -0
  155. package/dist/transports/mcp/decision-card-html.d.ts.map +1 -0
  156. package/dist/transports/mcp/decision-elicitation.d.ts +1 -0
  157. package/dist/transports/mcp/decision-elicitation.d.ts.map +1 -0
  158. package/dist/transports/mcp/dispatch-probe.d.ts +1 -0
  159. package/dist/transports/mcp/dispatch-probe.d.ts.map +1 -0
  160. package/dist/transports/mcp/editor-document-probe.d.ts +1 -0
  161. package/dist/transports/mcp/editor-document-probe.d.ts.map +1 -0
  162. package/dist/transports/mcp/editor-integration-setup-url.d.ts +1 -0
  163. package/dist/transports/mcp/editor-integration-setup-url.d.ts.map +1 -0
  164. package/dist/transports/mcp/format-tool-content.d.ts +1 -0
  165. package/dist/transports/mcp/format-tool-content.d.ts.map +1 -0
  166. package/dist/transports/mcp/instructions/index.d.ts +1 -0
  167. package/dist/transports/mcp/instructions/index.d.ts.map +1 -0
  168. package/dist/transports/mcp/instructions/result.d.ts +1 -0
  169. package/dist/transports/mcp/instructions/result.d.ts.map +1 -0
  170. package/dist/transports/mcp/instructions/tools/ask-user.d.ts +1 -0
  171. package/dist/transports/mcp/instructions/tools/ask-user.d.ts.map +1 -0
  172. package/dist/transports/mcp/instructions/tools/build-app.d.ts +1 -0
  173. package/dist/transports/mcp/instructions/tools/build-app.d.ts.map +1 -0
  174. package/dist/transports/mcp/instructions/tools/check-app-progress.d.ts +1 -0
  175. package/dist/transports/mcp/instructions/tools/check-app-progress.d.ts.map +1 -0
  176. package/dist/transports/mcp/instructions/tools/check-publish-progress.d.ts +1 -0
  177. package/dist/transports/mcp/instructions/tools/check-publish-progress.d.ts.map +1 -0
  178. package/dist/transports/mcp/instructions/tools/copy.d.ts +1 -0
  179. package/dist/transports/mcp/instructions/tools/copy.d.ts.map +1 -0
  180. package/dist/transports/mcp/instructions/tools/create-integration.d.ts +1 -0
  181. package/dist/transports/mcp/instructions/tools/create-integration.d.ts.map +1 -0
  182. package/dist/transports/mcp/instructions/tools/edit-app.d.ts +1 -0
  183. package/dist/transports/mcp/instructions/tools/edit-app.d.ts.map +1 -0
  184. package/dist/transports/mcp/instructions/tools/get-app.d.ts +1 -0
  185. package/dist/transports/mcp/instructions/tools/get-app.d.ts.map +1 -0
  186. package/dist/transports/mcp/instructions/tools/get-integration-metadata.d.ts +1 -0
  187. package/dist/transports/mcp/instructions/tools/get-integration-metadata.d.ts.map +1 -0
  188. package/dist/transports/mcp/instructions/tools/index.d.ts +1 -0
  189. package/dist/transports/mcp/instructions/tools/index.d.ts.map +1 -0
  190. package/dist/transports/mcp/instructions/tools/publish-app.d.ts +1 -0
  191. package/dist/transports/mcp/instructions/tools/publish-app.d.ts.map +1 -0
  192. package/dist/transports/mcp/instructions/tools/start-app.d.ts +1 -0
  193. package/dist/transports/mcp/instructions/tools/start-app.d.ts.map +1 -0
  194. package/dist/transports/mcp/instructions/tools/upload-artifact.d.ts +1 -0
  195. package/dist/transports/mcp/instructions/tools/upload-artifact.d.ts.map +1 -0
  196. package/dist/transports/mcp/mcp-app-brand-css.d.ts +1 -0
  197. package/dist/transports/mcp/mcp-app-brand-css.d.ts.map +1 -0
  198. package/dist/transports/mcp/mount.d.ts +3 -13
  199. package/dist/transports/mcp/mount.d.ts.map +1 -0
  200. package/dist/transports/mcp/mount.js +73 -38
  201. package/dist/transports/mcp/mount.js.map +1 -1
  202. package/dist/transports/mcp/native-browser-presence.d.ts +1 -0
  203. package/dist/transports/mcp/native-browser-presence.d.ts.map +1 -0
  204. package/dist/transports/mcp/plan-approval.d.ts +1 -0
  205. package/dist/transports/mcp/plan-approval.d.ts.map +1 -0
  206. package/dist/transports/mcp/progress-notifier.d.ts +1 -0
  207. package/dist/transports/mcp/progress-notifier.d.ts.map +1 -0
  208. package/dist/transports/mcp/session-directory.d.ts +1 -0
  209. package/dist/transports/mcp/session-directory.d.ts.map +1 -0
  210. package/dist/transports/mcp/tool-names.d.ts +1 -0
  211. package/dist/transports/mcp/tool-names.d.ts.map +1 -0
  212. package/package.json +22 -19
@@ -55,7 +55,7 @@ function environmentFromHostname(hostname) {
55
55
  if (hostname.match(/^dev\.superblocks(?:hq)?\.com$/u)) {
56
56
  return "dev";
57
57
  }
58
- if (hostname.match(/^pr-[0-9]+\.superblocks(?:hq)?\.dev$/u)) {
58
+ if (hostname.match(/^pr-[0-9]+(?:-cp)?\.superblocks(?:hq)?\.dev$/u)) {
59
59
  return "ephemeral";
60
60
  }
61
61
  if (hostname === "localhost" || hostname === "127.0.0.1") {
@@ -99,11 +99,18 @@ export function startGatewayTelemetry(input) {
99
99
  logger: stderrLogger,
100
100
  logsEnabled: false,
101
101
  metricsEnabled: true,
102
- otlpHeaders: getAccessToken
103
- ? async () => ({ Authorization: `Bearer ${await getAccessToken()}` })
104
- : { Authorization: `Bearer ${input.apiKey}` },
102
+ ...(getAccessToken
103
+ ? {
104
+ otlpHeaders: async () => ({
105
+ Authorization: `Bearer ${await getAccessToken()}`,
106
+ }),
107
+ }
108
+ : input.apiKey
109
+ ? { otlpHeaders: { Authorization: `Bearer ${input.apiKey}` } }
110
+ : {}),
105
111
  ...(otlpUrl ? { otlpUrl } : {}),
106
- serviceName: "gateway",
112
+ // Hosted on AgentCore, kept apart from the gateways on users' machines.
113
+ serviceName: input.config.hosted ? "platform-mcp" : "gateway",
107
114
  serviceVersion: "0.0.1",
108
115
  }, getDefaultPolicy(deploymentType));
109
116
  const mcpTelemetry = new McpClientTelemetry(telemetry.getTracer("gateway.mcp"), { recordToolIo: deploymentType === DeploymentType.CLOUD });
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/telemetry/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/telemetry/runtime.ts"],"names":[],"mappings":"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"}
@@ -6,8 +6,8 @@ import { type ToolRegistry } from "@superblocksteam/mcp-server";
6
6
  import type { ClientProfile } from "./client-presentation.js";
7
7
  export type RegisterAdminToolsOptions = {
8
8
  /**
9
- * Superblocks Server base URL injected as `base_url` when the caller omits it.
10
- * Models should not invent environments; the gateway already knows the control plane.
9
+ * Superblocks Server every Admin call runs against. The shared registry
10
+ * sends it as `base_url`, so models never pick an environment.
11
11
  */
12
12
  serverUrl: string | (() => string);
13
13
  /**
@@ -33,15 +33,11 @@ export type RegisterAdminToolsOptions = {
33
33
  */
34
34
  resolveEditorIntegrationSetupUrl?: (integrationId: string, applicationId: string | undefined) => string | undefined | Promise<string | undefined>;
35
35
  };
36
- export type JsonSchemaToZodShapeOptions = {
37
- /** Advertised as optional no matter what the source schema requires. */
38
- optionalKeys?: readonly string[];
39
- };
40
36
  /**
41
37
  * Loose JSON-Schema -> Zod conversion so `registerTool` can list Admin tools
42
38
  * with usable shapes. Handlers still validate through `@superblocksteam/mcp-server`.
43
39
  */
44
- export declare function jsonSchemaToZodShape(inputSchema: Tool["inputSchema"], options?: JsonSchemaToZodShapeOptions): Record<string, z.ZodType>;
40
+ export declare function jsonSchemaToZodShape(inputSchema: Tool["inputSchema"]): Record<string, z.ZodType>;
45
41
  /**
46
42
  * Gateway product copy names the builder Superblocks. Admin tool definitions
47
43
  * still mention the retired "Clark" alias in places; rewrite for this surface
@@ -56,3 +52,4 @@ export declare function completeToolAnnotations(annotations: ToolAnnotations | u
56
52
  * downstream credential, against the `serverUrl` that credential belongs to.
57
53
  */
58
54
  export declare function registerAdminTools(server: McpServer, options: RegisterAdminToolsOptions): ToolRegistry;
55
+ //# sourceMappingURL=admin-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-tools.d.ts","sourceRoot":"","sources":["../../../src/transports/mcp/admin-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gDAAgD,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAEV,IAAI,EACJ,eAAe,EAChB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAK9D,MAAM,MAAM,yBAAyB,GAAG;IACtC;;;OAGG;IACH,SAAS,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACnC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChE;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,aAAa,CAAC;IACpC;;;;OAIG;IACH,gCAAgC,CAAC,EAAE,CACjC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,GAAG,SAAS,KAC9B,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CACvD,CAAC;AAcF;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,GAC/B,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAiB3B;AAqED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,uEAAuE;AACvE,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,eAAe,GAAG,SAAS,GACvC,eAAe,CAUjB;AAsFD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,yBAAyB,GACjC,YAAY,CAuHd"}
@@ -8,12 +8,9 @@ import { isPublicIntegration } from "./instructions/tools/create-integration.js"
8
8
  * Loose JSON-Schema -> Zod conversion so `registerTool` can list Admin tools
9
9
  * with usable shapes. Handlers still validate through `@superblocksteam/mcp-server`.
10
10
  */
11
- export function jsonSchemaToZodShape(inputSchema, options = {}) {
11
+ export function jsonSchemaToZodShape(inputSchema) {
12
12
  const properties = inputSchema?.properties ?? {};
13
13
  const required = new Set(inputSchema?.required ?? []);
14
- for (const key of options.optionalKeys ?? []) {
15
- required.delete(key);
16
- }
17
14
  const shape = {};
18
15
  for (const [key, prop] of Object.entries(properties)) {
19
16
  let field = jsonSchemaPropertyToZod(prop ?? {});
@@ -24,14 +21,6 @@ export function jsonSchemaToZodShape(inputSchema, options = {}) {
24
21
  }
25
22
  return shape;
26
23
  }
27
- /**
28
- * Arguments the gateway fills in itself, so the model never has to go find
29
- * them. A required `base_url` reads as missing information: rather than call
30
- * the tool it was asked for, a client goes hunting for the environment first.
31
- */
32
- const GATEWAY_SUPPLIED_ARGUMENTS = {
33
- base_url: "Omit this. The gateway always sends its own Superblocks Server URL; any value here is replaced.",
34
- };
35
24
  /**
36
25
  * Gateway-only argument on `create_integration`, and the one thing this process
37
26
  * cannot work out for itself: which application the conversation is building.
@@ -40,32 +29,6 @@ const GATEWAY_SUPPLIED_ARGUMENTS = {
40
29
  const CREATE_INTEGRATION_APPLICATION_ID = "application_id";
41
30
  const CREATE_INTEGRATION_APPLICATION_ID_DESCRIPTION = "The application this conversation is building, when there is one. Pass it so credential entry opens on the Integrations tab inside that editor and the user stays where they are. Omit it when this conversation has not started or edited an application: the result then links the org Integrations page. Never pass an application another conversation is working on.";
42
31
  const CREATE_INTEGRATION_GUIDANCE = " When this conversation has already started or edited an application, pass its applicationId as application_id so credential entry opens inside that editor.";
43
- /**
44
- * Admin tools the gateway keeps to itself.
45
- *
46
- * `get_auth_status` answers questions already settled before the model sees a
47
- * tool (the CLI session already authenticated; the gateway injects its Server URL).
48
- *
49
- * `checkout_application` writes caller-controlled paths on the gateway host
50
- * filesystem. Keep that off stdio MCP until a sandboxed destination model lands;
51
- * use the CLI/workspace checkout path instead.
52
- */
53
- const OMITTED_ADMIN_TOOLS = new Set([
54
- "checkout_application",
55
- "get_auth_status",
56
- ]);
57
- function gatewayAdminInputShape(inputSchema) {
58
- const shape = jsonSchemaToZodShape(inputSchema, {
59
- optionalKeys: Object.keys(GATEWAY_SUPPLIED_ARGUMENTS),
60
- });
61
- for (const [key, description] of Object.entries(GATEWAY_SUPPLIED_ARGUMENTS)) {
62
- const field = shape[key];
63
- if (field) {
64
- shape[key] = field.describe(description);
65
- }
66
- }
67
- return shape;
68
- }
69
32
  function jsonSchemaPropertyToZod(prop) {
70
33
  if (prop.enum && prop.enum.length > 0) {
71
34
  const values = prop.enum.filter((v) => typeof v === "string");
@@ -200,15 +163,13 @@ function withCreateIntegrationBrowserNavigation(result) {
200
163
  */
201
164
  export function registerAdminTools(server, options) {
202
165
  const registry = buildToolRegistry(toolDefinitions, "customer", {
166
+ embedded: true,
203
167
  requireEntitledPlan: options.localAgentMode !== true,
204
168
  });
205
169
  const serverUrl = () => (typeof options.serverUrl === "function"
206
170
  ? options.serverUrl()
207
171
  : options.serverUrl).replace(/\/$/, "");
208
172
  for (const tool of registry.listTools()) {
209
- if (OMITTED_ADMIN_TOOLS.has(tool.name)) {
210
- continue;
211
- }
212
173
  const definition = toolDefinitions.find((d) => d.name === tool.name);
213
174
  const isCreateIntegration = tool.name === "create_integration";
214
175
  server.registerTool(tool.name, {
@@ -217,14 +178,14 @@ export function registerAdminTools(server, options) {
217
178
  (isCreateIntegration ? CREATE_INTEGRATION_GUIDANCE : ""),
218
179
  inputSchema: isCreateIntegration
219
180
  ? {
220
- ...gatewayAdminInputShape(tool.inputSchema),
181
+ ...jsonSchemaToZodShape(tool.inputSchema),
221
182
  [CREATE_INTEGRATION_APPLICATION_ID]: z
222
183
  .string()
223
184
  .uuid()
224
185
  .optional()
225
186
  .describe(CREATE_INTEGRATION_APPLICATION_ID_DESCRIPTION),
226
187
  }
227
- : gatewayAdminInputShape(tool.inputSchema),
188
+ : jsonSchemaToZodShape(tool.inputSchema),
228
189
  title: tool.title ?? definition?.title,
229
190
  }, async (args, extra) => {
230
191
  gatewayDebugStack("admin tool started", {
@@ -240,14 +201,7 @@ export function registerAdminTools(server, options) {
240
201
  typeof rawArgs[CREATE_INTEGRATION_APPLICATION_ID] === "string"
241
202
  ? rawArgs[CREATE_INTEGRATION_APPLICATION_ID]
242
203
  : undefined;
243
- const callArgs = {
244
- ...rawArgs,
245
- // Overwritten, never merged. The credential this call runs with belongs
246
- // to the Gateway's own control plane, so a base_url from the model
247
- // would send that credential to a host the model chose - reachable
248
- // through any prompt injection that gets as far as a tool call.
249
- base_url: baseUrl,
250
- };
204
+ const callArgs = { ...rawArgs };
251
205
  if (isCreateIntegration) {
252
206
  // The shared Admin schema is strict and knows nothing about it.
253
207
  delete callArgs[CREATE_INTEGRATION_APPLICATION_ID];
@@ -1 +1 @@
1
- {"version":3,"file":"admin-tools.js","sourceRoot":"","sources":["../../../src/transports/mcp/admin-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-tools.js","sourceRoot":"","sources":["../../../src/transports/mcp/admin-tools.ts"],"names":[],"mappings":"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"}
@@ -9,3 +9,4 @@
9
9
  */
10
10
  export declare const APP_STATUS_RESOURCE_URI = "ui://gateway/app-status-v38.html";
11
11
  export declare const APP_STATUS_HTML = "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Superblocks app</title>\n <style>\n .head {\n display: flex;\n min-width: 0;\n align-items: center;\n gap: 8px;\n }\n h1 {\n flex: 1;\n margin: 0;\n font-size: var(--font-text-md-size, 14px);\n font-weight: var(--font-weight-semibold, 600);\n }\n .status {\n padding: 2px 8px;\n border: var(--border-width-regular, 1px) solid var(--sb-app-border);\n border-radius: var(--border-radius-full, 999px);\n background: var(--sb-app-background-subtle);\n color: var(--sb-app-text-secondary);\n font-size: var(--font-text-xs-size, 12px);\n text-transform: lowercase;\n }\n .status[data-tone=\"info\"] {\n border-color: var(--sb-app-info-border);\n background: var(--sb-app-info-background);\n color: var(--sb-app-info-text);\n }\n .status[data-tone=\"success\"] {\n border-color: var(--sb-app-success-border);\n background: var(--sb-app-success-background);\n color: var(--sb-app-success-text);\n }\n .status[data-tone=\"warning\"] {\n border-color: var(--sb-app-warning-border);\n background: var(--sb-app-warning-background);\n color: var(--sb-app-warning-text);\n }\n .status[data-tone=\"danger\"] {\n border-color: var(--sb-app-danger-border);\n background: var(--sb-app-danger-background);\n color: var(--sb-app-danger-text);\n }\n .meta {\n color: var(--sb-app-text-tertiary);\n font-size: var(--font-text-xs-size, 12px);\n }\n .note {\n color: var(--sb-app-warning-text);\n font-size: var(--font-text-xs-size, 12px);\n }\n .shot {\n display: none;\n max-width: 100%;\n width: 100%;\n border: var(--border-width-regular, 1px) solid var(--sb-app-border);\n border-radius: var(--border-radius-md, 8px);\n }\n .shot.shown {\n display: block;\n }\n .actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n }\n @media (max-width: 360px) {\n .head {\n align-items: flex-start;\n flex-direction: column;\n }\n }\n\n :root {\n color-scheme: light dark;\n --sb-app-background: var(\n --color-background-primary,\n light-dark(#ffffff, #1b1c1f)\n );\n --sb-app-background-subtle: var(\n --color-background-secondary,\n light-dark(#f9fafb, #24272b)\n );\n --sb-app-background-hover: var(\n --color-background-tertiary,\n light-dark(#f3f4f6, #2f3437)\n );\n --sb-app-background-inverse: var(\n --color-background-inverse,\n light-dark(#121517, #f9fafb)\n );\n --sb-app-text: var(\n --color-text-primary,\n light-dark(#121517, #f9fafb)\n );\n --sb-app-text-secondary: var(\n --color-text-secondary,\n light-dark(#5a6272, #c6cad2)\n );\n --sb-app-text-tertiary: var(\n --color-text-tertiary,\n light-dark(#6b7280, #a4aab7)\n );\n --sb-app-text-inverse: var(\n --color-text-inverse,\n light-dark(#ffffff, #121517)\n );\n --sb-app-border: var(\n --color-border-primary,\n light-dark(#e8eaed, #454d5f)\n );\n --sb-app-ring: var(\n --color-ring-primary,\n light-dark(#0077b6, #27bbff)\n );\n --sb-app-info-background: var(\n --color-background-info,\n light-dark(#e6f5ff, #083a50)\n );\n --sb-app-info-text: var(\n --color-text-info,\n light-dark(#00679e, #7dd3fc)\n );\n --sb-app-info-border: var(\n --color-border-info,\n light-dark(#c2e7ff, #075985)\n );\n --sb-app-success-background: var(\n --color-background-success,\n light-dark(#e8f8ef, #0a3926)\n );\n --sb-app-success-text: var(\n --color-text-success,\n light-dark(#087a43, #6ee7b7)\n );\n --sb-app-success-border: var(\n --color-border-success,\n light-dark(#b8e8cf, #087a43)\n );\n --sb-app-warning-background: var(\n --color-background-warning,\n light-dark(#fff7e6, #49350a)\n );\n --sb-app-warning-text: var(\n --color-text-warning,\n light-dark(#946200, #fcd34d)\n );\n --sb-app-warning-border: var(\n --color-border-warning,\n light-dark(#f5d996, #946200)\n );\n --sb-app-danger-background: var(\n --color-background-danger,\n light-dark(#fff1f1, #4a1d1d)\n );\n --sb-app-danger-text: var(\n --color-text-danger,\n light-dark(#c54141, #fca5a5)\n );\n --sb-app-danger-border: var(\n --color-border-danger,\n light-dark(#ffcaca, #c54141)\n );\n }\n * {\n box-sizing: border-box;\n }\n body {\n min-width: 0;\n margin: 0;\n overflow-x: hidden;\n background: transparent;\n color: var(--sb-app-text);\n font-family: var(--font-sans, system-ui, -apple-system, sans-serif);\n font-size: var(--font-text-sm-size, 13px);\n line-height: var(--font-text-sm-line-height, 1.45);\n }\n .card {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n border: var(--border-width-regular, 1px) solid var(--sb-app-border);\n border-radius: var(--border-radius-lg, 12px);\n background: var(--sb-app-background);\n box-shadow: var(--shadow-sm, 0 1px 2px rgba(18, 21, 23, 0.08));\n }\n h1,\n .meta,\n .note {\n min-width: 0;\n overflow-wrap: anywhere;\n }\n .note:empty {\n position: absolute;\n }\n button,\n textarea {\n font: inherit;\n }\n button {\n appearance: none;\n min-width: 0;\n padding: 8px 12px;\n border: var(--border-width-regular, 1px) solid var(--sb-app-border);\n border-radius: var(--border-radius-md, 8px);\n background: var(--sb-app-background-subtle);\n color: var(--sb-app-text);\n font-weight: var(--font-weight-medium, 500);\n line-height: var(--font-text-sm-line-height, 1.45);\n cursor: pointer;\n }\n button:hover:not(:disabled) {\n background: var(--sb-app-background-hover);\n }\n .button-primary {\n border-color: var(--sb-app-background-inverse);\n background: var(--sb-app-background-inverse);\n color: var(--sb-app-text-inverse);\n }\n .button-primary:hover:not(:disabled) {\n border-color: var(--sb-app-background-inverse);\n background: var(--sb-app-background-inverse);\n }\n button:focus-visible,\n textarea:focus-visible,\n a:focus-visible {\n outline: 2px solid var(--sb-app-ring);\n outline-offset: 2px;\n }\n button:disabled {\n opacity: 0.48;\n cursor: not-allowed;\n }\n .actions {\n min-width: 0;\n }\n .actions > button {\n overflow-wrap: anywhere;\n }\n @media (max-width: 360px) {\n .actions {\n flex-direction: column;\n flex-wrap: nowrap;\n }\n .actions > button {\n width: 100%;\n }\n }\n\n </style>\n</head>\n<body>\n <div class=\"card\">\n <div class=\"head\">\n <h1>Superblocks app</h1>\n <span id=\"status\" class=\"status\" data-tone=\"info\" aria-live=\"polite\">loading</span>\n </div>\n <div id=\"appId\" class=\"meta\"></div>\n <img id=\"shot\" class=\"shot\" alt=\"Preview of the running app\" />\n <div id=\"note\" class=\"note\" aria-live=\"polite\"></div>\n <div class=\"actions\">\n <button id=\"openEditor\" class=\"button-secondary\" type=\"button\" disabled>Open editor</button>\n <button id=\"openPreview\" class=\"button-secondary\" type=\"button\" disabled>Open preview</button>\n <button id=\"publishApp\" class=\"button-primary\" type=\"button\" disabled>Publish app</button>\n </div>\n </div>\n <script>\n (() => {\n const PROTOCOL_VERSION = \"2026-01-26\";\n // Statuses with no usable build to publish. \"building\" is deliberately\n // absent because a stale badge should not strand the button.\n const UNBUILT_STATUSES = [\n \"cancelled\",\n \"checkpoint_failed\",\n \"detached\",\n \"failed\",\n \"live_edit_terminated\",\n \"needs_decision\",\n \"no_changes\",\n \"timeout\",\n ];\n const BLOCKED_ACTIONS = [\n \"answer_question\",\n \"approve_plan\",\n \"open_editor\",\n \"retry_build\",\n ];\n const STATUS_TONES = {\n building: \"info\",\n cancelled: \"warning\",\n checkpoint_failed: \"danger\",\n deployed: \"success\",\n detached: \"warning\",\n failed: \"danger\",\n live_edit_terminated: \"danger\",\n loading: \"info\",\n needs_decision: \"warning\",\n no_changes: \"warning\",\n publish_failed: \"danger\",\n publishing: \"info\",\n ready: \"success\",\n timeout: \"danger\",\n waiting: \"info\",\n };\n let nextId = 1;\n const pending = new Map();\n let applicationId = \"\";\n let appName = \"\";\n let branch = \"\";\n let commitId = \"\";\n let directoryHash = \"\";\n let pendingAction = \"\";\n let editUrl = \"\";\n let previewUrl = \"\";\n let publishUrl = \"\";\n let canOpenLinks = false;\n let canCallTools = false;\n let publishing = false;\n let teardownRequested = false;\n let lastHeight = 0;\n let buildWatchStartedAtMs;\n let refreshInFlightGeneration = -1;\n let refreshTimer = 0;\n let refreshGeneration = 0;\n const BUILD_WATCH_MS = 20 * 60_000;\n const POLL_INTERVAL_MS = 2000;\n\n function post(message) {\n window.parent.postMessage(message, \"*\");\n }\n\n function notify(method, params) {\n post({ jsonrpc: \"2.0\", method, params });\n }\n\n function request(method, params) {\n const id = nextId++;\n return new Promise((resolve, reject) => {\n pending.set(id, { resolve, reject });\n post({ jsonrpc: \"2.0\", id, method, params });\n });\n }\n\n function element(id) {\n return document.getElementById(id);\n }\n\n function show(id, on) {\n const node = element(id);\n if (node && node.classList) {\n node.classList.toggle(\"shown\", on);\n }\n }\n\n function renderStatus(status) {\n const badge = element(\"status\");\n badge.textContent = status;\n badge.setAttribute(\n \"data-tone\",\n Object.hasOwn(STATUS_TONES, status) ? STATUS_TONES[status] : \"neutral\",\n );\n }\n\n // Hosts size the card from this notification alone; without it the card\n // is laid out at zero height and never appears.\n function reportSize() {\n if (teardownRequested) {\n return;\n }\n const height = Math.ceil(document.documentElement.scrollHeight || 0);\n if (height <= 0 || height === lastHeight) {\n return;\n }\n lastHeight = height;\n notify(\"ui/notifications/size-changed\", {\n height,\n width: Math.ceil(window.innerWidth || 0),\n });\n }\n\n function note(text) {\n element(\"note\").textContent = text;\n show(\"note\", Boolean(text));\n reportSize();\n }\n\n function isPlainHttp(url) {\n return url.slice(0, 5).toLowerCase() === \"http:\";\n }\n\n /** A UUID says nothing; the name the user asked Superblocks for does. */\n function renderIdentity() {\n element(\"appId\").textContent = appName || applicationId;\n }\n\n /**\n * Draws the screenshot the tool captured.\n *\n * Hosts that render an MCP App render it *instead of* the tool's content\n * blocks, so the image block get_app returns never reaches the user on\n * its own \u2014 the card has to take it out of the result and show it.\n */\n function showScreenshot(dataBase64, mimeType) {\n if (typeof dataBase64 !== \"string\" || !dataBase64) {\n return;\n }\n element(\"shot\").src =\n \"data:\" + (mimeType || \"image/jpeg\") + \";base64,\" + dataBase64;\n show(\"shot\", true);\n reportSize();\n }\n\n /** Applies every part of an MCP content array the card understands. */\n function applyContent(content) {\n for (const part of content || []) {\n if (!part) {\n continue;\n }\n if (part.type === \"text\" && typeof part.text === \"string\") {\n applyPayload(part.text);\n }\n if (part.type === \"image\") {\n showScreenshot(part.data, part.mimeType);\n }\n }\n }\n\n /**\n * True when publishing would deploy the empty starter template.\n * pendingAction is the server's own \"nothing to preview\" signal;\n * wait_for_build is the building exception. Status is only a fallback\n * when the payload omitted pendingAction. loading/waiting with no\n * preview fail closed so Publish is not clickable before get_app\n * returns.\n */\n function nothingToPublish() {\n const badge = element(\"status\").textContent;\n if (UNBUILT_STATUSES.indexOf(badge) !== -1) {\n return true;\n }\n if (previewUrl || publishUrl) {\n return false;\n }\n if (pendingAction === \"wait_for_build\") {\n return false;\n }\n if (BLOCKED_ACTIONS.indexOf(pendingAction) !== -1) {\n return true;\n }\n if (!badge || badge === \"loading\" || badge === \"waiting\") {\n return true;\n }\n return false;\n }\n\n /**\n * Keep URLs in memory for openLink \u2014 never print them (preview JWTs are\n * huge and ugly in the card).\n */\n function renderActions() {\n const status = element(\"status\").textContent;\n const previewReady = status === \"ready\";\n const rollingOut = status === \"publishing\";\n const published = Boolean(publishUrl) && !rollingOut;\n element(\"openEditor\").disabled = !editUrl || !canOpenLinks;\n element(\"openPreview\").disabled =\n !previewReady || !previewUrl || !canOpenLinks;\n // Once the app is live, publishing again is not what anyone wants from\n // this button \u2014 going to the live app is.\n element(\"publishApp\").textContent = rollingOut\n ? \"Publishing...\"\n : published\n ? \"Open published app\"\n : \"Publish app\";\n element(\"publishApp\").disabled = rollingOut\n ? true\n : published\n ? !canOpenLinks\n : !applicationId ||\n !canCallTools ||\n publishing ||\n nothingToPublish();\n // Only warn about what is actually broken. Hosts that do open links\n // handle local http fine; if one refuses, refused() says so then.\n if (!canOpenLinks && (editUrl || previewUrl) && !publishUrl) {\n note(\"This host cannot open links for me \u2014 ask the model for an https preview URL.\");\n }\n reportSize();\n }\n\n /** Only ever ask the host to open a real web address. */\n function webUrl(candidate) {\n try {\n const parsed = new URL(candidate);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\"\n ? candidate\n : \"\";\n } catch {\n return \"\";\n }\n }\n\n /**\n * Merges whatever the host sent. Hosts replay tool input as well as tool\n * results, and the input carries no status or URLs \u2014 overwriting from a\n * partial payload is what showed the card as \"unknown\".\n *\n * Hosts also disagree on the shape: some pass the capability JSON, some\n * pass the MCP content/text envelope (Claude Desktop on initialize), and\n * some nest that under structuredContent.\n */\n function applyPayload(raw) {\n let data = raw;\n if (typeof raw === \"string\") {\n try {\n data = JSON.parse(raw);\n } catch {\n return;\n }\n }\n if (!data || typeof data !== \"object\") {\n return;\n }\n // MCP tool-result / initialize toolResult envelope.\n if (Array.isArray(data.content)) {\n applyContent(data.content);\n if (data.structuredContent) {\n applyPayload(data.structuredContent);\n }\n return;\n }\n if (data.result && typeof data.result === \"object\") {\n applyPayload(data.result);\n return;\n }\n const value = data.kind === \"ok\" ? data.value : data;\n if (!value || typeof value !== \"object\") {\n return;\n }\n if (\n value.browserNavigation &&\n typeof value.browserNavigation === \"object\" &&\n value.browserNavigation.action === \"open_editor\"\n ) {\n if (!teardownRequested) {\n teardownRequested = true;\n refreshGeneration += 1;\n clearRefreshTimer();\n document.body.hidden = true;\n notify(\"ui/notifications/size-changed\", { height: 0, width: 0 });\n notify(\"ui/notifications/request-teardown\", {});\n }\n return;\n }\n if (teardownRequested) {\n return;\n }\n if (typeof value.status === \"string\") {\n if (value.status !== \"building\") {\n buildWatchStartedAtMs = undefined;\n }\n renderStatus(value.status);\n }\n if (typeof value.applicationId === \"string\") {\n applicationId = value.applicationId;\n renderIdentity();\n }\n if (typeof value.name === \"string\" && value.name) {\n appName = value.name;\n renderIdentity();\n }\n if (typeof value.branch === \"string\") {\n branch = value.branch;\n }\n if (typeof value.directoryHash === \"string\") {\n directoryHash = value.directoryHash;\n }\n if (\n typeof value.commitId === \"string\" ||\n typeof value.previewUrl === \"string\" ||\n (typeof value.applicationId === \"string\" &&\n typeof value.status === \"string\")\n ) {\n commitId =\n typeof value.commitId === \"string\" ? value.commitId : \"\";\n }\n if (typeof value.pendingAction === \"string\") {\n pendingAction = value.pendingAction;\n } else if (typeof value.status === \"string\") {\n pendingAction = \"\";\n }\n if (typeof value.screenshotBase64 === \"string\") {\n showScreenshot(value.screenshotBase64, \"image/jpeg\");\n }\n if (typeof value.editUrl === \"string\") {\n editUrl = webUrl(value.editUrl);\n }\n if (typeof value.previewUrl === \"string\") {\n previewUrl = webUrl(value.previewUrl);\n } else if (typeof value.status === \"string\" && !commitId) {\n previewUrl = \"\";\n }\n if (typeof value.publishUrl === \"string\") {\n publishUrl = webUrl(value.publishUrl);\n }\n // Hosts that deliver URLs without a status left the badge on the HTML\n // default (\"loading\") even after the app was built.\n const badge = element(\"status\").textContent;\n if (\n !value.status &&\n editUrl &&\n (badge === \"\" || badge === \"loading\" || badge === \"waiting\")\n ) {\n renderStatus(previewUrl ? \"ready\" : \"building\");\n }\n renderActions();\n if (\n canCallTools &&\n commitId &&\n element(\"status\").textContent === \"publishing\"\n ) {\n scheduleRefresh(retryDelay());\n }\n }\n\n /**\n * Ask the app-only status tool when the host gave us no result, or while\n * status is still building.\n */\n function clearRefreshTimer() {\n if (refreshTimer) {\n clearTimeout(refreshTimer);\n refreshTimer = 0;\n }\n }\n\n function retryDelay() {\n return POLL_INTERVAL_MS;\n }\n\n function scheduleRefresh(delayMs) {\n clearRefreshTimer();\n if (\n element(\"status\").textContent !== \"publishing\" &&\n buildWatchStartedAtMs !== undefined &&\n Date.now() - buildWatchStartedAtMs >= BUILD_WATCH_MS\n ) {\n note(\"Stopped checking whether the app is still building.\");\n return;\n }\n refreshTimer = setTimeout(() => {\n refreshTimer = 0;\n refreshFromServer();\n }, delayMs);\n }\n\n function refreshFromServer() {\n clearRefreshTimer();\n if (\n teardownRequested ||\n !canCallTools ||\n refreshInFlightGeneration === refreshGeneration ||\n publishing\n ) {\n return;\n }\n if (typeof document.hidden === \"boolean\" && document.hidden) {\n scheduleRefresh(retryDelay());\n return;\n }\n const badge = element(\"status\").textContent;\n const publishStatus = badge === \"publishing\";\n if (editUrl && badge !== \"building\" && !publishStatus) {\n buildWatchStartedAtMs = undefined;\n return;\n }\n if (!publishStatus) {\n if (badge === \"building\") {\n if (buildWatchStartedAtMs === undefined) {\n buildWatchStartedAtMs = Date.now();\n }\n } else {\n buildWatchStartedAtMs = undefined;\n }\n if (\n buildWatchStartedAtMs !== undefined &&\n Date.now() - buildWatchStartedAtMs >= BUILD_WATCH_MS\n ) {\n note(\"Stopped checking whether the app is still building.\");\n return;\n }\n }\n const generation = refreshGeneration;\n refreshInFlightGeneration = generation;\n const previewStatus = !publishStatus && Boolean(commitId && directoryHash);\n request(\"tools/call\", {\n name: publishStatus\n ? \"check_publish_progress\"\n : previewStatus\n ? \"get_preview_status\"\n : \"get_app_status\",\n arguments: {\n ...(applicationId ? { applicationId } : {}),\n ...(!publishStatus && branch ? { branch } : {}),\n ...(publishStatus && commitId ? { commitId } : {}),\n ...(previewStatus ? { commitId, directoryHash, wait: false } : {}),\n },\n })\n .then((result) => {\n if (refreshInFlightGeneration === generation) {\n refreshInFlightGeneration = -1;\n }\n if (generation !== refreshGeneration) {\n if (\n !publishing &&\n element(\"status\").textContent === \"building\" &&\n refreshInFlightGeneration !== refreshGeneration\n ) {\n scheduleRefresh(retryDelay());\n }\n return;\n }\n const publishError = publishStatus\n ? terminalPublishErrorOf(result)\n : \"\";\n if (publishError) {\n refreshGeneration += 1;\n clearRefreshTimer();\n publishUrl = \"\";\n renderStatus(\"publish_failed\");\n note(publishError);\n renderActions();\n return;\n }\n if (!result || result.isError) {\n scheduleRefresh(retryDelay());\n return;\n }\n applyPayload(result);\n if (result.structuredContent) {\n applyPayload(result.structuredContent);\n }\n const status = element(\"status\").textContent;\n if (status === \"deployed\") {\n note(\n publishUrl\n ? \"Published - open the live app with Open published app.\"\n : \"Published - the app is live.\",\n );\n return;\n }\n if (status === \"publishing\") {\n scheduleRefresh(retryDelay());\n return;\n }\n if (status !== \"building\") {\n return;\n }\n scheduleRefresh(retryDelay());\n })\n .catch(() => {\n if (refreshInFlightGeneration === generation) {\n refreshInFlightGeneration = -1;\n }\n if (generation !== refreshGeneration) {\n return;\n }\n scheduleRefresh(retryDelay());\n });\n }\n\n function applyHostContext(context) {\n if (!context || typeof context !== \"object\") {\n return;\n }\n const root = document.documentElement;\n if (context.theme === \"light\" || context.theme === \"dark\") {\n root.setAttribute(\"data-theme\", context.theme);\n root.style.colorScheme = context.theme;\n }\n const variables = context.styles && context.styles.variables;\n const style = root.style;\n if (variables && style && typeof style.setProperty === \"function\") {\n for (const name of Object.keys(variables)) {\n const value = variables[name];\n if (typeof value === \"string\") {\n style.setProperty(name, value);\n }\n }\n }\n const fonts = context.styles && context.styles.css?.fonts;\n if (typeof fonts === \"string\") {\n let fontStyle = document.getElementById(\"__mcp-host-fonts\");\n if (!fontStyle) {\n fontStyle = document.createElement(\"style\");\n fontStyle.id = \"__mcp-host-fonts\";\n document.head.appendChild(fontStyle);\n }\n fontStyle.textContent = fonts;\n }\n reportSize();\n }\n\n function capabilityFailureOf(result) {\n if (!result || !Array.isArray(result.content)) {\n return null;\n }\n for (const block of result.content) {\n if (!block || block.type !== \"text\" || !block.text) {\n continue;\n }\n try {\n const parsed = JSON.parse(block.text);\n if (parsed && parsed.kind === \"error\") {\n return {\n code: parsed.code || \"\",\n message: parsed.message || parsed.code || \"Tool call failed.\",\n };\n }\n } catch {\n continue;\n }\n }\n return null;\n }\n\n function capabilityErrorOf(result) {\n return capabilityFailureOf(result)?.message || \"\";\n }\n\n function terminalPublishErrorOf(result) {\n const failure = capabilityFailureOf(result);\n if (\n !failure ||\n ![\n \"publish_failed\",\n \"publish_needs_acknowledgement\",\n \"publish_timeout\",\n ].includes(failure.code)\n ) {\n return \"\";\n }\n return failure.message;\n }\n\n /** First text block of a failed tool result, for the note line. */\n function errorTextOf(result, fallback) {\n const capabilityError = capabilityErrorOf(result);\n if (capabilityError) {\n return capabilityError;\n }\n const first =\n result && Array.isArray(result.content) ? result.content[0] : null;\n return first && first.text ? String(first.text).slice(0, 280) : fallback;\n }\n\n function refused(url) {\n note(\n isPlainHttp(url)\n ? \"This host only opens https links, and this app is served over http \u2014 ask for an https preview URL.\"\n : \"The host could not open the link \u2014 try again or ask the model for another URL.\",\n );\n }\n\n function openLink(url) {\n if (!url || !canOpenLinks) {\n return;\n }\n request(\"ui/open-link\", { url })\n .then((result) => {\n if (result && result.isError) {\n refused(url);\n return;\n }\n note(\"\");\n })\n .catch(() => refused(url));\n }\n\n /**\n * Asks the host to proxy publish_app back to this MCP server. A named\n * commit is published as-is. Otherwise the card supplies a fixed\n * commitMessage: the button is a click, so there is no model turn here\n * to summarize what changed.\n */\n function publish() {\n if (!applicationId || !canCallTools || publishing) {\n return;\n }\n if (nothingToPublish()) {\n note(\"Nothing to publish yet: this turn did not build the app.\");\n return;\n }\n publishing = true;\n refreshGeneration += 1;\n clearRefreshTimer();\n renderActions();\n note(\"Publishing\u2026\");\n const args = {\n applicationId,\n idempotencyKey:\n \"mcp-app-publish:\" + applicationId + \":\" + Date.now(),\n };\n if (commitId) {\n args.commitId = commitId;\n } else {\n args.commitMessage = \"Publish application\";\n }\n if (branch) {\n args.branch = branch;\n }\n request(\"tools/call\", { name: \"publish_app\", arguments: args })\n .then((result) => {\n publishing = false;\n const publishError = capabilityErrorOf(result);\n if (!result || result.isError || publishError) {\n note(errorTextOf(result, \"Publish failed.\"));\n renderActions();\n refreshFromServer();\n return;\n }\n applyContent(result.content || []);\n if (result.structuredContent) {\n applyPayload(result.structuredContent);\n }\n const status = element(\"status\").textContent;\n note(\n status === \"publishing\"\n ? \"Publish accepted; the deploy is still rolling out.\"\n : publishUrl\n ? \"Published - open the live app with Open published app.\"\n : \"Published - the app is live.\",\n );\n renderActions();\n })\n .catch((error) => {\n publishing = false;\n note(\n (error && error.message) ||\n \"The host could not call publish_app.\",\n );\n renderActions();\n refreshFromServer();\n });\n }\n\n function handleHostMessage(event) {\n // App documents are opaque-origin, so the host window is the only\n // identity available to authenticate a message against.\n if (event.source !== window.parent) {\n return;\n }\n const data = event.data;\n if (!data || typeof data !== \"object\") {\n return;\n }\n if (data.method === \"ping\") {\n post({ jsonrpc: \"2.0\", id: data.id, result: {} });\n return;\n }\n if (data.id != null && pending.has(data.id)) {\n const waiter = pending.get(data.id);\n pending.delete(data.id);\n if (data.error) {\n waiter.reject(data.error);\n } else {\n waiter.resolve(data.result);\n }\n return;\n }\n const method = data.method;\n const params = data.params || {};\n if (\n method === \"ui/notifications/tool-result\" ||\n method === \"ui/tool-result\" ||\n method === \"tools/call\"\n ) {\n applyContent(params.content || params.result?.content || []);\n if (params.structuredContent) {\n applyPayload(params.structuredContent);\n }\n refreshGeneration += 1;\n if (element(\"status\").textContent === \"building\") {\n refreshFromServer();\n }\n }\n if (method === \"ui/notifications/tool-input\" && params.arguments) {\n applyPayload(params.arguments);\n refreshFromServer();\n }\n if (method === \"ui/notifications/host-context-changed\") {\n applyHostContext(params);\n }\n }\n\n window.addEventListener(\"message\", handleHostMessage);\n\n element(\"openEditor\").addEventListener(\"click\", () => openLink(editUrl));\n element(\"openPreview\").addEventListener(\"click\", () =>\n openLink(previewUrl),\n );\n element(\"publishApp\").addEventListener(\"click\", () => {\n if (element(\"status\").textContent === \"publishing\") {\n return;\n }\n if (publishUrl) {\n openLink(publishUrl);\n return;\n }\n publish();\n });\n\n if (typeof ResizeObserver === \"function\") {\n new ResizeObserver(reportSize).observe(document.documentElement);\n }\n\n void request(\"ui/initialize\", {\n appCapabilities: {\n availableDisplayModes: [\"inline\"],\n },\n appInfo: { name: \"gateway-app-status\", version: \"0.0.8\" },\n protocolVersion: PROTOCOL_VERSION,\n })\n .then((result) => {\n // Hosts hold back tool results until the app confirms it is ready.\n notify(\"ui/notifications/initialized\", {});\n // Buttons that cannot work are worse than no buttons: hosts without\n // openLinks silently drop ui/open-link.\n canOpenLinks = Boolean(\n result && result.hostCapabilities && result.hostCapabilities.openLinks,\n );\n canCallTools = Boolean(\n result &&\n result.hostCapabilities &&\n result.hostCapabilities.serverTools,\n );\n if (result && result.toolResult) {\n applyPayload(result.toolResult);\n }\n if (teardownRequested) {\n return;\n }\n applyHostContext(result && result.hostContext);\n renderActions();\n const badge = element(\"status\").textContent;\n if (badge === \"publishing\") {\n return;\n }\n if (!applicationId && (!badge || badge === \"loading\")) {\n scheduleRefresh(500);\n } else {\n refreshFromServer();\n }\n })\n .catch(() => {\n // Hosts that push tool results via notification still work.\n })\n .finally(reportSize);\n })();\n </script>\n</body>\n</html>\n";
12
+ //# sourceMappingURL=app-status-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-status-html.d.ts","sourceRoot":"","sources":["../../../src/transports/mcp/app-status-html.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,eAAO,MAAM,uBAAuB,qCAAqC,CAAC;AAE1E,eAAO,MAAM,eAAe,2mlCA23B3B,CAAC"}
@@ -22,3 +22,4 @@ export declare function collectsUserApproval(profile: ClientProfile): boolean;
22
22
  export declare function clientPresentationCapabilities(client: {
23
23
  name: string;
24
24
  } | undefined): ClientPresentationCapabilities;
25
+ //# sourceMappingURL=client-presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-presentation.d.ts","sourceRoot":"","sources":["../../../src/transports/mcp/client-presentation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,8BAA8B,GAAG;IAC3C,6FAA6F;IAC7F,gBAAgB,EAAE,OAAO,CAAC;IAC1B,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,sEAAsE;AACtE,MAAM,MAAM,aAAa,GAAG,8BAA8B,GAAG;IAC3D,kFAAkF;IAClF,oBAAoB,EAAE,OAAO,CAAC;IAC9B,uBAAuB,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAMpE;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GACnC,8BAA8B,CAQhC"}
@@ -26,3 +26,4 @@ export declare const PLAN_MARKUP_META_KEY = "superblocks/plan-markup";
26
26
  export declare const CONFIRM_PLAN_APPROVAL_TOOL = "confirm_plan_approval";
27
27
  export declare const APP_DECISION_RESOURCE_URI = "ui://gateway/decision-v26.html";
28
28
  export declare const APP_DECISION_HTML = "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Superblocks needs an answer</title>\n <style>\n h1 {\n margin: 0;\n font-size: var(--font-text-md-size, 14px);\n font-weight: var(--font-weight-semibold, 600);\n }\n .meta {\n color: var(--sb-app-text-tertiary);\n font-size: var(--font-text-xs-size, 12px);\n }\n .reply {\n display: none;\n color: var(--sb-app-text-secondary);\n }\n .reply.shown {\n display: block;\n }\n .plan {\n display: none;\n max-height: 340px;\n margin: 0;\n overflow: auto;\n padding: 10px;\n border: var(--border-width-regular, 1px) solid var(--sb-app-border);\n border-radius: var(--border-radius-md, 8px);\n background: var(--sb-app-background-subtle);\n font-size: var(--font-text-xs-size, 12px);\n word-break: break-word;\n }\n .plan.shown {\n display: block;\n }\n .plan > :first-child,\n .question > :first-child {\n margin-top: 0;\n }\n .plan > :last-child,\n .question > :last-child {\n margin-bottom: 0;\n }\n .plan h1,\n .plan h2,\n .plan h3,\n .plan p,\n .question h1,\n .question h2,\n .question h3,\n .question p {\n margin: 10px 0;\n }\n .plan h1,\n .plan h2,\n .plan h3,\n .question h1,\n .question h2,\n .question h3 {\n font-size: inherit;\n font-weight: var(--font-weight-semibold, 600);\n }\n .plan ul,\n .plan ol,\n .question ul,\n .question ol {\n margin: 10px 0;\n padding-left: 20px;\n }\n .plan blockquote,\n .question blockquote {\n margin: 10px 0;\n padding-left: 10px;\n border-left: 3px solid var(--sb-app-border);\n color: var(--sb-app-text-secondary);\n }\n .plan pre,\n .question pre {\n overflow: auto;\n padding: 8px;\n border-radius: var(--border-radius-md, 8px);\n background: var(--sb-app-background);\n }\n .plan a,\n .question a {\n color: var(--sb-app-info-text);\n }\n .entity-tag {\n display: inline-flex;\n align-items: center;\n padding: 0 4px;\n max-width: 100%;\n overflow-wrap: anywhere;\n border: var(--border-width-regular, 1px) solid var(--sb-app-border);\n border-radius: 4px;\n background: var(--sb-app-background);\n color: var(--sb-app-info-text);\n font-weight: 400;\n line-height: 18px;\n vertical-align: middle;\n white-space: normal;\n }\n .task {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n }\n .task input {\n margin: 0;\n }\n .plan code,\n .question code,\n button code {\n font-family: var(--font-mono, ui-monospace, SFMono-Regular, monospace);\n }\n .question {\n display: none;\n overflow-wrap: anywhere;\n font-weight: var(--font-weight-medium, 500);\n }\n .question.shown {\n display: block;\n }\n .actions {\n display: none;\n flex-wrap: wrap;\n gap: 8px;\n }\n .actions.shown {\n display: flex;\n }\n #options {\n flex-direction: column;\n flex-wrap: nowrap;\n }\n #options > .option-button {\n width: 100%;\n overflow-wrap: anywhere;\n text-align: left;\n }\n .refine {\n display: none;\n flex-direction: column;\n gap: 8px;\n }\n .refine.shown {\n display: flex;\n }\n textarea {\n width: 100%;\n box-sizing: border-box;\n min-height: 64px;\n padding: 8px;\n border: var(--border-width-regular, 1px) solid var(--sb-app-border);\n border-radius: var(--border-radius-md, 8px);\n background: var(--sb-app-background);\n color: var(--sb-app-text);\n font: inherit;\n resize: vertical;\n }\n .note {\n color: var(--sb-app-text-secondary);\n font-size: var(--font-text-xs-size, 12px);\n }\n\n :root {\n color-scheme: light dark;\n --sb-app-background: var(\n --color-background-primary,\n light-dark(#ffffff, #1b1c1f)\n );\n --sb-app-background-subtle: var(\n --color-background-secondary,\n light-dark(#f9fafb, #24272b)\n );\n --sb-app-background-hover: var(\n --color-background-tertiary,\n light-dark(#f3f4f6, #2f3437)\n );\n --sb-app-background-inverse: var(\n --color-background-inverse,\n light-dark(#121517, #f9fafb)\n );\n --sb-app-text: var(\n --color-text-primary,\n light-dark(#121517, #f9fafb)\n );\n --sb-app-text-secondary: var(\n --color-text-secondary,\n light-dark(#5a6272, #c6cad2)\n );\n --sb-app-text-tertiary: var(\n --color-text-tertiary,\n light-dark(#6b7280, #a4aab7)\n );\n --sb-app-text-inverse: var(\n --color-text-inverse,\n light-dark(#ffffff, #121517)\n );\n --sb-app-border: var(\n --color-border-primary,\n light-dark(#e8eaed, #454d5f)\n );\n --sb-app-ring: var(\n --color-ring-primary,\n light-dark(#0077b6, #27bbff)\n );\n --sb-app-info-background: var(\n --color-background-info,\n light-dark(#e6f5ff, #083a50)\n );\n --sb-app-info-text: var(\n --color-text-info,\n light-dark(#00679e, #7dd3fc)\n );\n --sb-app-info-border: var(\n --color-border-info,\n light-dark(#c2e7ff, #075985)\n );\n --sb-app-success-background: var(\n --color-background-success,\n light-dark(#e8f8ef, #0a3926)\n );\n --sb-app-success-text: var(\n --color-text-success,\n light-dark(#087a43, #6ee7b7)\n );\n --sb-app-success-border: var(\n --color-border-success,\n light-dark(#b8e8cf, #087a43)\n );\n --sb-app-warning-background: var(\n --color-background-warning,\n light-dark(#fff7e6, #49350a)\n );\n --sb-app-warning-text: var(\n --color-text-warning,\n light-dark(#946200, #fcd34d)\n );\n --sb-app-warning-border: var(\n --color-border-warning,\n light-dark(#f5d996, #946200)\n );\n --sb-app-danger-background: var(\n --color-background-danger,\n light-dark(#fff1f1, #4a1d1d)\n );\n --sb-app-danger-text: var(\n --color-text-danger,\n light-dark(#c54141, #fca5a5)\n );\n --sb-app-danger-border: var(\n --color-border-danger,\n light-dark(#ffcaca, #c54141)\n );\n }\n * {\n box-sizing: border-box;\n }\n body {\n min-width: 0;\n margin: 0;\n overflow-x: hidden;\n background: transparent;\n color: var(--sb-app-text);\n font-family: var(--font-sans, system-ui, -apple-system, sans-serif);\n font-size: var(--font-text-sm-size, 13px);\n line-height: var(--font-text-sm-line-height, 1.45);\n }\n .card {\n display: flex;\n min-width: 0;\n flex-direction: column;\n gap: 12px;\n padding: 16px;\n border: var(--border-width-regular, 1px) solid var(--sb-app-border);\n border-radius: var(--border-radius-lg, 12px);\n background: var(--sb-app-background);\n box-shadow: var(--shadow-sm, 0 1px 2px rgba(18, 21, 23, 0.08));\n }\n h1,\n .meta,\n .note {\n min-width: 0;\n overflow-wrap: anywhere;\n }\n .note:empty {\n position: absolute;\n }\n button,\n textarea {\n font: inherit;\n }\n button {\n appearance: none;\n min-width: 0;\n padding: 8px 12px;\n border: var(--border-width-regular, 1px) solid var(--sb-app-border);\n border-radius: var(--border-radius-md, 8px);\n background: var(--sb-app-background-subtle);\n color: var(--sb-app-text);\n font-weight: var(--font-weight-medium, 500);\n line-height: var(--font-text-sm-line-height, 1.45);\n cursor: pointer;\n }\n button:hover:not(:disabled) {\n background: var(--sb-app-background-hover);\n }\n .button-primary {\n border-color: var(--sb-app-background-inverse);\n background: var(--sb-app-background-inverse);\n color: var(--sb-app-text-inverse);\n }\n .button-primary:hover:not(:disabled) {\n border-color: var(--sb-app-background-inverse);\n background: var(--sb-app-background-inverse);\n }\n button:focus-visible,\n textarea:focus-visible,\n a:focus-visible {\n outline: 2px solid var(--sb-app-ring);\n outline-offset: 2px;\n }\n button:disabled {\n opacity: 0.48;\n cursor: not-allowed;\n }\n .actions {\n min-width: 0;\n }\n .actions > button {\n overflow-wrap: anywhere;\n }\n @media (max-width: 360px) {\n .actions {\n flex-direction: column;\n flex-wrap: nowrap;\n }\n .actions > button {\n width: 100%;\n }\n }\n\n </style>\n</head>\n<body>\n <div class=\"card\">\n <h1 id=\"heading\">Superblocks</h1>\n <div id=\"appId\" class=\"meta\"></div>\n <div id=\"reply\" class=\"reply\"></div>\n <div id=\"plan\" class=\"plan\"></div>\n <div id=\"question\" class=\"question\"></div>\n <div id=\"options\" class=\"actions\"></div>\n <div id=\"planActions\" class=\"actions\">\n <button id=\"approve\" class=\"button-primary\" type=\"button\">Build it</button>\n <button id=\"refine\" class=\"button-secondary\" type=\"button\">Change something</button>\n </div>\n <div id=\"refineBox\" class=\"refine\">\n <textarea id=\"feedback\" placeholder=\"What should change?\"></textarea>\n <button id=\"sendRefine\" class=\"button-primary\" type=\"button\">Send</button>\n </div>\n <div id=\"note\" class=\"note\" aria-live=\"polite\"></div>\n </div>\n <script>\n (() => {\n const PROTOCOL_VERSION = \"2026-01-26\";\n let nextId = 1;\n const pending = new Map();\n let applicationId = \"\";\n let branch;\n let appName = \"\";\n let reply = \"\";\n let decision = null;\n let status = \"\";\n let refining = false;\n let sending = false;\n let answered = false;\n let approvalToken = \"\";\n let planMarkup = \"\";\n let confirmedApprovalToken = \"\";\n let optionButtons = [];\n let lastHeight = 0;\n\n function post(message) {\n window.parent.postMessage(message, \"*\");\n }\n\n function notify(method, params) {\n post({ jsonrpc: \"2.0\", method, params });\n }\n\n function request(method, params) {\n const id = nextId++;\n return new Promise((resolve, reject) => {\n pending.set(id, { resolve, reject });\n post({ jsonrpc: \"2.0\", id, method, params });\n });\n }\n\n function element(id) {\n return document.getElementById(id);\n }\n\n function show(id, on) {\n const node = element(id);\n if (node && node.classList) {\n node.classList.toggle(\"shown\", on);\n }\n }\n\n // Hosts size the card from this notification alone; without it the card\n // is laid out at zero height and never appears.\n function reportSize() {\n const height = Math.ceil(document.documentElement.scrollHeight || 0);\n if (height <= 0 || height === lastHeight) {\n return;\n }\n lastHeight = height;\n notify(\"ui/notifications/size-changed\", {\n height,\n width: Math.ceil(window.innerWidth || 0),\n });\n }\n\n function note(text) {\n element(\"note\").textContent = text;\n show(\"note\", Boolean(text));\n reportSize();\n }\n\n function applyHostContext(context) {\n if (!context || typeof context !== \"object\") {\n return;\n }\n const root = document.documentElement;\n if (context.theme === \"light\" || context.theme === \"dark\") {\n root.setAttribute(\"data-theme\", context.theme);\n root.style.colorScheme = context.theme;\n }\n const variables = context.styles && context.styles.variables;\n if (variables && root.style) {\n for (const name of Object.keys(variables)) {\n const value = variables[name];\n if (typeof value === \"string\") {\n root.style.setProperty(name, value);\n }\n }\n }\n const fonts = context.styles && context.styles.css?.fonts;\n if (typeof fonts === \"string\") {\n let fontStyle = document.getElementById(\"__mcp-host-fonts\");\n if (!fontStyle) {\n fontStyle = document.createElement(\"style\");\n fontStyle.id = \"__mcp-host-fonts\";\n document.head.appendChild(fontStyle);\n }\n fontStyle.textContent = fonts;\n }\n reportSize();\n }\n\n function setBusy(on) {\n element(\"approve\").disabled = on;\n element(\"refine\").disabled = on;\n element(\"sendRefine\").disabled = on;\n for (const button of optionButtons) {\n button.disabled = on;\n }\n }\n\n /**\n * Posts the answer as the user's own turn.\n *\n * The host must receive a user turn so it continues following the build.\n */\n function answer(text) {\n if (!text || sending || answered) {\n return;\n }\n sending = true;\n setBusy(true);\n note(\"Sending your answer\u2026\");\n request(\"ui/message\", {\n content: [{ text: text, type: \"text\" }],\n role: \"user\",\n })\n .then((result) => {\n sending = false;\n if (result && result.isError) {\n refused();\n return;\n }\n answered = true;\n setBusy(true);\n // The host taking the message is not the same as the user's turn\n // going anywhere: Claude Desktop leaves it in the composer as a\n // draft. Claiming it was sent strands the user on a build that is\n // waiting for their enter key.\n note(\"Your answer is in the chat \u2014 press enter there to send it.\");\n })\n .catch(refused);\n }\n\n function refused() {\n sending = false;\n setBusy(false);\n note(\n \"This host would not take your answer from the card \u2014 reply in the chat instead.\",\n );\n }\n\n function approvalRefused() {\n sending = false;\n setBusy(false);\n note(\n \"This host could not verify your approval - approve this plan in the Superblocks editor instead.\",\n );\n }\n\n /**\n * Confirms the user's approval of the current challenge, once per token:\n * a confirmed challenge stays confirmed while a send that never went out\n * is retried, and confirming it again is refused.\n */\n async function confirmApproval() {\n if (!approvalToken) {\n return false;\n }\n if (confirmedApprovalToken === approvalToken) {\n return true;\n }\n const token = approvalToken;\n const confirmation = await request(\"tools/call\", {\n arguments: { approvalToken: token },\n name: \"confirm_plan_approval\",\n });\n if (confirmation && confirmation.isError) {\n return false;\n }\n confirmedApprovalToken = token;\n return true;\n }\n\n async function approve() {\n if (sending || answered) {\n return;\n }\n if (!approvalToken) {\n approvalRefused();\n return;\n }\n sending = true;\n setBusy(true);\n note(\"Confirming your approval...\");\n try {\n const confirmed = await confirmApproval();\n sending = false;\n if (!confirmed) {\n approvalRefused();\n return;\n }\n answer(\"Build it \u2014 approve the Superblocks plan as written.\");\n } catch {\n approvalRefused();\n }\n }\n\n function renderOptions(options) {\n const host = element(\"options\");\n host.replaceChildren();\n optionButtons = [];\n const permissionMessageId = decision && decision.kind === \"tool_permission\"\n ? decision.messageId\n : undefined;\n options.forEach((option, index) => {\n const button = document.createElement(\"button\");\n button.id = \"option-\" + index;\n button.className = \"button-secondary option-button\";\n button.type = \"button\";\n button.innerHTML = markdownInline(option, false);\n // Verbatim: an option Superblocks did not offer reaches it as a\n // prompt answering a question it never asked.\n button.addEventListener(\"click\", () => permissionMessageId\n ? answerPermission(option, permissionMessageId)\n : answer(option));\n host.appendChild(button);\n optionButtons.push(button);\n });\n show(\"options\", options.length > 0);\n }\n\n async function answerPermission(text, permissionMessageId) {\n if (sending || answered) {\n return;\n }\n sending = true;\n setBusy(true);\n note(\"Submitting your response...\");\n const refused = () => {\n sending = false;\n setBusy(false);\n note(\"This request could not be submitted. Ask the chat to show the current approval request again.\");\n };\n try {\n if (text === \"Approve\" && !(await confirmApproval())) {\n refused();\n return;\n }\n const result = await request(\"tools/call\", {\n name: \"edit_app\",\n arguments: { applicationId, ...(branch ? { branch } : {}), permissionMessageId, prompt: text },\n });\n if (result?.isError || result?.structuredContent?.status !== \"building\") {\n refused();\n return;\n }\n sending = false;\n answer(\"My response to the approval request is queued. Please check the build's progress to confirm it was accepted.\");\n } catch {\n refused();\n }\n }\n\n function waitingNote() {\n if (status === \"building\") {\n return \"Superblocks is still building \u2014 nothing to answer yet.\";\n }\n // Something opened this card, so \"nothing is waiting on you\" is a dead\n // end: say where the answer to that actually is.\n return \"Nothing to answer here \u2014 the chat has the latest.\";\n }\n\n function escapeHtml(text) {\n return String(text).replace(/[&<>\"']/g, (character) => {\n return {\n \"&\": \"&amp;\",\n \"<\": \"&lt;\",\n \">\": \"&gt;\",\n '\"': \"&quot;\",\n \"'\": \"&#39;\",\n }[character];\n });\n }\n\n function markdownInline(text, allowLinks = true) {\n const codeDelimiter = String.fromCharCode(96);\n const emphasis = (text) =>\n text\n .replace(/\\*\\*([^*]+)\\*\\*/g, \"<strong>$1</strong>\")\n .replace(/__([^_]+)__/g, \"<strong>$1</strong>\")\n .replace(/(^|[^*])\\*([^*]+)\\*(?!\\*)/g, \"$1<em>$2</em>\")\n .replace(\n /(^|[^A-Za-z0-9_])_([^_]+)_(?![A-Za-z0-9_])/g,\n \"$1<em>$2</em>\",\n );\n const safeLink = (url) => {\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"https:\" && Boolean(parsed.hostname);\n } catch {\n return false;\n }\n };\n const entities = /@((?:(?!\\[id=)[^@\\r\\n])+?(?<!\\s))\\[id=[^\\]\\r\\n]+\\]/gu;\n const links = /\\[([^\\]]+)\\]\\(([^\\s)]+)\\)/g;\n const renderLinks = (value, allowLinks) => {\n const output = [];\n let offset = 0;\n const text = String(value);\n for (const match of text.matchAll(links)) {\n const index = match.index ?? 0;\n if (text[index - 1] === \"!\") {\n continue;\n }\n output.push(emphasis(escapeHtml(text.slice(offset, index))));\n const label = match[1];\n const url = match[2];\n if (safeLink(url)) {\n output.push(\n allowLinks\n ? '<a href=\"' +\n escapeHtml(url) +\n '\" target=\"_blank\" rel=\"noopener noreferrer\">' +\n markdownInline(label, false) +\n \"</a>\"\n : markdownInline(label, false),\n );\n } else {\n output.push(emphasis(escapeHtml(match[0])));\n }\n offset = index + match[0].length;\n }\n output.push(emphasis(escapeHtml(text.slice(offset))));\n return output.join(\"\");\n };\n const renderText = (value, allowLinks) => {\n const text = String(value);\n let placeholderDelimiter = String.fromCharCode(0);\n while (text.includes(placeholderDelimiter)) {\n placeholderDelimiter += String.fromCharCode(0);\n }\n const linkDestinations = Array.from(text.matchAll(links), (match) => {\n const start = (match.index ?? 0) + match[1].length + 3;\n return { start, end: start + match[2].length };\n });\n const entityTags = [];\n const tokenized = text.replace(entities, (match, label, index) => {\n if (\n linkDestinations.some(\n ({ start, end }) => index >= start && index < end,\n )\n ) {\n return match;\n }\n const placeholder =\n placeholderDelimiter + entityTags.length + placeholderDelimiter;\n entityTags.push(\n '<span class=\"entity-tag\">' + escapeHtml(label) + \"</span>\",\n );\n return placeholder;\n });\n return entityTags.reduce(\n (html, tag, index) =>\n html.replace(\n placeholderDelimiter + index + placeholderDelimiter,\n () => tag,\n ),\n renderLinks(tokenized, allowLinks),\n );\n };\n return String(text)\n .split(/(\\x60[^\\x60]+\\x60)/)\n .map((part) =>\n part.startsWith(codeDelimiter) && part.endsWith(codeDelimiter)\n ? \"<code>\" + escapeHtml(part.slice(1, -1)) + \"</code>\"\n : renderText(part, allowLinks),\n )\n .join(\"\");\n }\n\n function markdownHtml(markdown) {\n const lines = String(markdown).replace(/\\r/g, \"\").split(\"\\n\");\n const output = [];\n const lists = [];\n let paragraph = [];\n const closeParagraph = () => {\n if (paragraph.length > 0) {\n output.push(\"<p>\" + markdownInline(paragraph.join(\" \")) + \"</p>\");\n paragraph = [];\n }\n };\n const closeList = () => {\n const list = lists.pop();\n if (!list) {\n return;\n }\n if (list.open) {\n output.push(\"</li>\");\n }\n output.push(\"</\" + list.tag + \">\");\n };\n const closeLists = () => {\n while (lists.length > 0) {\n closeList();\n }\n };\n const listItem = (line) => {\n const match = /^(\\s*)([-*+]|\\d+\\.)\\s+(.+)$/.exec(line);\n if (!match) {\n return undefined;\n }\n return {\n content: match[3],\n indent: match[1].replace(/\\t/g, \" \").length,\n tag: /\\d+\\./.test(match[2]) ? \"ol\" : \"ul\",\n };\n };\n const renderListItem = (item) => {\n while (\n lists.length > 0 &&\n item.indent < lists[lists.length - 1].indent\n ) {\n closeList();\n }\n let list = lists[lists.length - 1];\n if (\n !list ||\n item.indent > list.indent ||\n (item.indent === list.indent && item.tag !== list.tag)\n ) {\n if (list && item.indent === list.indent) {\n closeList();\n }\n output.push(\"<\" + item.tag + \">\");\n list = { indent: item.indent, open: false, tag: item.tag };\n lists.push(list);\n }\n if (list.open) {\n output.push(\"</li>\");\n }\n const task = /^\\[([ xX])\\]\\s+(.+)$/.exec(item.content);\n output.push(\n \"<li>\" +\n (task\n ? '<label class=\"task\"><input type=\"checkbox\" disabled' +\n (task[1].toLowerCase() === \"x\" ? \" checked\" : \"\") +\n \">\" +\n markdownInline(task[2]) +\n \"</label>\"\n : markdownInline(item.content)),\n );\n list.open = true;\n };\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index];\n const fence = /^\\x60{3}[^\\x60]*\\s*$/.exec(line);\n if (fence) {\n closeParagraph();\n closeLists();\n const code = [];\n while (\n index + 1 < lines.length &&\n !/^\\x60{3}\\s*$/.test(lines[index + 1])\n ) {\n index += 1;\n code.push(lines[index]);\n }\n if (index + 1 < lines.length) {\n index += 1;\n }\n output.push(\n \"<pre><code>\" + escapeHtml(code.join(\"\\n\")) + \"</code></pre>\",\n );\n continue;\n }\n const heading = /^(#{1,3})\\s+(.+?)\\s*$/.exec(line);\n const quote = /^>\\s?(.*)$/.exec(line);\n const item = listItem(line);\n const rule = /^(---+|\\*\\*\\*+|___+)$/.test(line.trim());\n if (heading) {\n closeParagraph();\n closeLists();\n const level = heading[1].length;\n output.push(\"<h\" + level + \">\" + markdownInline(heading[2]) + \"</h\" + level + \">\");\n } else if (quote) {\n closeParagraph();\n closeLists();\n const quoted = [];\n while (index < lines.length) {\n const next = /^>\\s?(.*)$/.exec(lines[index]);\n if (!next) {\n break;\n }\n quoted.push(next[1]);\n index += 1;\n }\n index -= 1;\n output.push(\"<blockquote>\" + markdownHtml(quoted.join(\"\\n\")) + \"</blockquote>\");\n } else if (item) {\n closeParagraph();\n renderListItem(item);\n } else if (rule) {\n closeParagraph();\n closeLists();\n output.push(\"<hr>\");\n } else if (line.trim()) {\n closeLists();\n paragraph.push(line.trim());\n } else {\n closeParagraph();\n closeLists();\n }\n }\n closeParagraph();\n closeLists();\n return output.join(\"\");\n }\n\n function render() {\n const waiting = status === \"needs_decision\";\n const plan =\n waiting && decision && decision.kind === \"plan\" ? decision : null;\n const permission =\n waiting && decision && decision.kind === \"tool_permission\"\n ? decision\n : null;\n const choice = waiting\n ? (decision &&\n decision.kind === \"multi_choice\" &&\n decision) ||\n (permission && {\n options: [\"Approve\", \"Decline\"],\n question: permission.question,\n })\n : null;\n\n element(\"heading\").textContent = plan\n ? \"Superblocks proposed a plan\"\n : permission\n ? \"Superblocks needs your approval\"\n : choice\n ? \"Superblocks has a question\"\n : waiting\n ? \"Superblocks is waiting on you\"\n : \"Superblocks\";\n element(\"appId\").textContent = appName || applicationId;\n // Superblocks narrates its whole working session into the reply. Once\n // there is a plan or a question, that narration is preamble in front\n // of the thing being asked, so it is dropped: the ask is the ask. It\n // survives only when there is nothing structured, where the reply is\n // itself the whole question and hiding it leaves a blank card.\n const narrationOnly = Boolean(plan || choice);\n element(\"reply\").textContent = narrationOnly ? \"\" : reply;\n show(\"reply\", Boolean(reply) && !narrationOnly);\n element(\"plan\").innerHTML = plan\n ? markdownHtml(planMarkup || plan.plan)\n : \"\";\n show(\"plan\", Boolean(plan));\n element(\"question\").innerHTML = choice\n ? markdownHtml(choice.question)\n : \"\";\n show(\"question\", Boolean(choice));\n show(\"planActions\", Boolean(plan));\n renderOptions(choice ? choice.options : []);\n // A turn can stop waiting on the user having streamed its plan or\n // question as chat text, leaving nothing structured to lay out. The\n // reply is then the whole ask, so free text is the only honest form.\n show(\"refineBox\", plan ? refining : waiting && !choice);\n setBusy(answered || sending);\n if (!answered && !sending) {\n note(waiting ? \"\" : waitingNote());\n }\n reportSize();\n }\n\n function applyPayload(payload) {\n let value = payload;\n if (typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch (error) {\n return;\n }\n }\n if (!value || typeof value !== \"object\") {\n return;\n }\n if (Array.isArray(value.content)) {\n applyContent(value.content);\n if (value.structuredContent) {\n applyPayload(value.structuredContent);\n }\n return;\n }\n if (value.result && typeof value.result === \"object\") {\n applyPayload(value.result);\n return;\n }\n if (value.kind === \"ok\" && value.value) {\n value = value.value;\n }\n if (typeof value.applicationId === \"string\") {\n applicationId = value.applicationId;\n branch = typeof value.branch === \"string\" ? value.branch : undefined;\n }\n if (typeof value.name === \"string\") {\n appName = value.name;\n }\n if (typeof value.reply === \"string\") {\n reply = value.reply;\n }\n if (typeof value.status === \"string\") {\n status = value.status;\n }\n if (\"decision\" in value) {\n decision =\n value.decision && typeof value.decision === \"object\"\n ? value.decision\n : null;\n }\n render();\n }\n\n function applyContent(content) {\n for (const part of content || []) {\n if (part && part.type === \"text\" && typeof part.text === \"string\") {\n applyPayload(part.text);\n }\n }\n }\n\n function applyResultMetadata(value) {\n const metadata = value && typeof value === \"object\" ? value._meta : null;\n if (\n metadata &&\n typeof metadata[\"superblocks/plan-approval-token\"] === \"string\"\n ) {\n approvalToken = metadata[\"superblocks/plan-approval-token\"];\n }\n if (metadata && typeof metadata[\"superblocks/plan-markup\"] === \"string\") {\n planMarkup = metadata[\"superblocks/plan-markup\"];\n }\n }\n\n function handleHostMessage(event) {\n // App documents are opaque-origin, so the host window is the only\n // identity available to authenticate a message against.\n if (event.source !== window.parent) {\n return;\n }\n const data = event.data;\n if (!data || typeof data !== \"object\") {\n return;\n }\n if (data.method === \"ping\") {\n post({ jsonrpc: \"2.0\", id: data.id, result: {} });\n return;\n }\n if (data.id != null && pending.has(data.id)) {\n const waiter = pending.get(data.id);\n pending.delete(data.id);\n if (data.error) {\n waiter.reject(data.error);\n } else {\n waiter.resolve(data.result);\n }\n return;\n }\n const method = data.method;\n const params = data.params || {};\n if (\n method === \"ui/notifications/tool-result\" ||\n method === \"ui/tool-result\" ||\n method === \"tools/call\"\n ) {\n approvalToken = \"\";\n planMarkup = \"\";\n applyResultMetadata(params);\n applyResultMetadata(params.result);\n applyContent(params.content || (params.result || {}).content || []);\n if (params.structuredContent) {\n applyPayload(params.structuredContent);\n }\n }\n if (method === \"ui/notifications/tool-input\" && params.arguments) {\n applyPayload(params.arguments);\n }\n if (method === \"ui/notifications/host-context-changed\") {\n applyHostContext(params);\n }\n }\n\n window.addEventListener(\"message\", handleHostMessage);\n\n element(\"approve\").addEventListener(\"click\", approve);\n element(\"refine\").addEventListener(\"click\", () => {\n refining = true;\n element(\"approve\").className = \"button-secondary\";\n show(\"refineBox\", true);\n element(\"feedback\").focus();\n reportSize();\n });\n element(\"sendRefine\").addEventListener(\"click\", () => {\n const feedback = (element(\"feedback\").value || \"\").trim();\n if (!feedback) {\n return;\n }\n answer(\n decision && decision.kind === \"plan\"\n ? \"Change the Superblocks plan: \" + feedback\n : feedback,\n );\n });\n\n if (typeof ResizeObserver === \"function\") {\n new ResizeObserver(reportSize).observe(document.documentElement);\n }\n\n void request(\"ui/initialize\", {\n appCapabilities: { availableDisplayModes: [\"inline\"] },\n appInfo: { name: \"gateway-decision\", version: \"0.0.1\" },\n protocolVersion: PROTOCOL_VERSION,\n })\n .then((result) => {\n // Hosts hold back tool results until the app confirms it is ready.\n notify(\"ui/notifications/initialized\", {});\n applyHostContext(result && result.hostContext);\n if (result && result.toolResult) {\n approvalToken = \"\";\n planMarkup = \"\";\n applyResultMetadata(result.toolResult);\n applyPayload(result.toolResult);\n }\n })\n .catch(() => {\n // Hosts that push tool results via notification still work.\n })\n .finally(reportSize);\n })();\n </script>\n</body>\n</html>\n";
29
+ //# sourceMappingURL=decision-card-html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-card-html.d.ts","sourceRoot":"","sources":["../../../src/transports/mcp/decision-card-html.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,4BAA4B,oCAAoC,CAAC;AAC9E,oFAAoF;AACpF,eAAO,MAAM,oBAAoB,4BAA4B,CAAC;AAC9D,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAClE,eAAO,MAAM,yBAAyB,mCAAmC,CAAC;AAE1E,eAAO,MAAM,iBAAiB,mtmCAg6B7B,CAAC"}
@@ -115,3 +115,4 @@ export declare function resolveDecisionByElicitation(args: {
115
115
  elicit: (request: DecisionElicitationRequest) => Promise<ElicitationOutcome>;
116
116
  }): Promise<CapabilityResult<unknown> | undefined>;
117
117
  export {};
118
+ //# sourceMappingURL=decision-elicitation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decision-elicitation.d.ts","sourceRoot":"","sources":["../../../src/transports/mcp/decision-elicitation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EAChB,MAAM,6BAA6B,CAAC;AAGrC,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAChE;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,GACnB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEzC,KAAK,YAAY,GAAG;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,cAAc,CAAC,CAAC;QAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,IAAI,EAAE,QAAQ,CAAC;KAChB,CAAC;CACH,CAAC;AAEF,mDAAmD;AACnD,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,6BAA6B,CAC3C,YAAY,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,SAAS,GAClE,OAAO,CAuBT;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAC7B,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAChC,eAAe,GAAG,SAAS,CA8B7B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAChC,MAAM,GAAG,SAAS,CAUpB;AAED,wBAAgB,YAAY,CAC1B,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAChC,MAAM,GAAG,SAAS,CAUpB;AAED,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,eAAe,GACxB,0BAA0B,GAAG,SAAS,CA8FxC;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,kBAAkB,GAC1B,cAAc,GAAG,SAAS,CAuF5B;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B,SAAU,CAAC;AAElD,qFAAqF;AACrF,KAAK,cAAc,GAAG;IACpB,WAAW,EAAE,CACX,OAAO,EAAE;QACP,MAAM,EAAE,oBAAoB,CAAC;QAC7B,MAAM,EAAE,0BAA0B,CAAC;KACpC,EACD,YAAY,EAAE,OAAO,kBAAkB,EACvC,OAAO,EAAE;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAC9C,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACjC,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,cAAc,GACpB,CAAC,OAAO,EAAE,0BAA0B,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAOtE;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAAC,IAAI,EAAE;IACvD,KAAK,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,CAAC,OAAO,EAAE,0BAA0B,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC9E,GAAG,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,CAgDjD"}
@@ -22,3 +22,4 @@ import type { DispatchProbe } from "../../health/readiness.js";
22
22
  export declare function createMcpDispatchProbe(deps: AppDeps, options?: {
23
23
  createServer?: () => McpServer;
24
24
  }): DispatchProbe;
25
+ //# sourceMappingURL=dispatch-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-probe.d.ts","sourceRoot":"","sources":["../../../src/transports/mcp/dispatch-probe.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,EACb,OAAO,GAAE;IAAE,YAAY,CAAC,EAAE,MAAM,SAAS,CAAA;CAAO,GAC/C,aAAa,CA2Bf"}
@@ -2,3 +2,4 @@ export type EditorDocumentProbe = (editUrl: string, signal?: AbortSignal) => Pro
2
2
  export declare function createEditorDocumentProbe(options?: {
3
3
  fetchImpl?: typeof fetch;
4
4
  }): EditorDocumentProbe;
5
+ //# sourceMappingURL=editor-document-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-document-probe.d.ts","sourceRoot":"","sources":["../../../src/transports/mcp/editor-document-probe.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,KACjB,OAAO,CAAC,OAAO,CAAC,CAAC;AAItB,wBAAgB,yBAAyB,CACvC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAO,GACzC,mBAAmB,CAkCrB"}
@@ -12,3 +12,4 @@ export declare function editorIntegrationSetupUrl(input: {
12
12
  uiBaseUrl: string;
13
13
  }): string;
14
14
  export declare function isEditorIntegrationSetupUrl(url: string): boolean;
15
+ //# sourceMappingURL=editor-integration-setup-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-integration-setup-url.d.ts","sourceRoot":"","sources":["../../../src/transports/mcp/editor-integration-setup-url.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,iCAAiC,QAAiB,CAAC;AAEhE,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAC/C,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAYT;AAED,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUhE"}
@@ -25,3 +25,4 @@ export declare function formatMcpToolContent(result: CapabilityResult<unknown>,
25
25
  * both get this copy. The decision card gets the tagged plan through `_meta`.
26
26
  */
27
27
  export declare function withDisplayedMentions(result: CapabilityResult<unknown>): CapabilityResult<unknown>;
28
+ //# sourceMappingURL=format-tool-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-tool-content.d.ts","sourceRoot":"","sources":["../../../src/transports/mcp/format-tool-content.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAMvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9D;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,EACjC,QAAQ,GAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAM,EACvD,OAAO,CAAC,EAAE,aAAa,GACtB,YAAY,EAAE,CA0ChB;AA0BD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAChC,gBAAgB,CAAC,OAAO,CAAC,CAsB3B"}
@@ -21,3 +21,4 @@ export declare function attachAgentInstructions(tool: ToolName, result: Capabili
21
21
  * a capability result, so the payload is parsed and rewritten.
22
22
  */
23
23
  export declare function attachAdminAgentInstructions(tool: ToolName, result: CallToolResult, profile: ClientProfile): CallToolResult;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/transports/mcp/instructions/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAWjD,6EAA6E;AAC7E,wBAAgB,cAAc,CAC5B,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,EACjC,OAAO,EAAE,aAAa,GACrB,MAAM,GAAG,SAAS,CAOpB;AAcD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,EACjC,OAAO,EAAE,aAAa,GACrB,gBAAgB,CAAC,OAAO,CAAC,CAkB3B;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,aAAa,GACrB,cAAc,CA8ChB"}
@@ -16,3 +16,4 @@ export type ToolResult = {
16
16
  };
17
17
  export declare function readResult(result: CapabilityResult<unknown>): ToolResult;
18
18
  export declare function isRecord(value: unknown): value is Record<string, unknown>;
19
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../../../src/transports/mcp/instructions/result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EACjB,MAAM,gCAAgC,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CAAC;AAEF,wBAAgB,UAAU,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,UAAU,CAwBxE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE"}
@@ -1,3 +1,4 @@
1
1
  import { type ClientProfile } from "../../client-presentation.js";
2
2
  import type { ToolResult } from "../result.js";
3
3
  export declare function instructAskUser(result: ToolResult, profile: ClientProfile): string | undefined;
4
+ //# sourceMappingURL=ask-user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask-user.d.ts","sourceRoot":"","sources":["../../../../../src/transports/mcp/instructions/tools/ask-user.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAO/C,wBAAgB,eAAe,CAC7B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,aAAa,GACrB,MAAM,GAAG,SAAS,CAuBpB"}
@@ -2,3 +2,4 @@ import type { ClientProfile } from "../../client-presentation.js";
2
2
  import type { ToolResult } from "../result.js";
3
3
  export declare function instructBuildApp(result: ToolResult, profile: ClientProfile): string | undefined;
4
4
  export declare function instructGetPreviewStatus(result: ToolResult, profile: ClientProfile): string | undefined;
5
+ //# sourceMappingURL=build-app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-app.d.ts","sourceRoot":"","sources":["../../../../../src/transports/mcp/instructions/tools/build-app.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAK/C,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,aAAa,GACrB,MAAM,GAAG,SAAS,CA0BpB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,aAAa,GACrB,MAAM,GAAG,SAAS,CAcpB"}
@@ -1,3 +1,4 @@
1
1
  import type { ClientProfile } from "../../client-presentation.js";
2
2
  import type { ToolResult } from "../result.js";
3
3
  export declare function instructCheckAppProgress(result: ToolResult, profile: ClientProfile): string | undefined;
4
+ //# sourceMappingURL=check-app-progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-app-progress.d.ts","sourceRoot":"","sources":["../../../../../src/transports/mcp/instructions/tools/check-app-progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAU/C,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,aAAa,GACrB,MAAM,GAAG,SAAS,CAepB"}
@@ -1,3 +1,4 @@
1
1
  import type { ClientProfile } from "../../client-presentation.js";
2
2
  import type { ToolResult } from "../result.js";
3
3
  export declare function instructCheckPublishProgress(result: ToolResult, profile: ClientProfile): string | undefined;
4
+ //# sourceMappingURL=check-publish-progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-publish-progress.d.ts","sourceRoot":"","sources":["../../../../../src/transports/mcp/instructions/tools/check-publish-progress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,aAAa,GACrB,MAAM,GAAG,SAAS,CAOpB"}
@@ -21,3 +21,4 @@ export declare function failedApiRunInstructions(result: ToolResult): string | u
21
21
  */
22
22
  export declare function instructPublishDetails(result: ToolResult, profile: ClientProfile): string | undefined;
23
23
  export declare function instructUserDecision(result: ToolResult, profile: ClientProfile): string | undefined;
24
+ //# sourceMappingURL=copy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../../../../src/transports/mcp/instructions/tools/copy.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAG1D,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,eAAO,MAAM,cAAc,sZAC0X,CAAC;AAEtZ,eAAO,MAAM,kBAAkB,upBACunB,CAAC;AAEvpB,eAAO,MAAM,yBAAyB,8JACuH,CAAC;AAG9J,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAO/D;AAED,eAAO,MAAM,iBAAiB,4LAC6J,CAAC;AAE5L,eAAO,MAAM,gBAAgB,2bAC6Z,CAAC;AAK3b,eAAO,MAAM,0BAA0B,6dACqb,CAAC;AAE7d,eAAO,MAAM,yBAAyB,8QACuO,CAAC;AAE9Q,eAAO,MAAM,uBAAuB,uHACkF,CAAC;AAEvH,eAAO,MAAM,eAAe,gRACmP,CAAC;AAEhR,eAAO,MAAM,kBAAkB,yNACyL,CAAC;AAEzN,eAAO,MAAM,2BAA2B,sJAC6G,CAAC;AAEtJ,eAAO,MAAM,kBAAkB,yQACyO,CAAC;AA+BzQ,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,UAAU,GACjB,MAAM,GAAG,SAAS,CAEpB;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,aAAa,GACrB,MAAM,GAAG,SAAS,CAWpB;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,aAAa,GACrB,MAAM,GAAG,SAAS,CAuBpB"}
@@ -2,3 +2,4 @@ import type { ClientProfile } from "../../client-presentation.js";
2
2
  import { type ToolResult } from "../result.js";
3
3
  export declare function instructCreateIntegration(result: ToolResult, profile: ClientProfile): string | undefined;
4
4
  export declare function isPublicIntegration(value: Record<string, unknown>): boolean;
5
+ //# sourceMappingURL=create-integration.d.ts.map