@superblocksteam/gateway 2.0.0-SNAPSHOT.1d4c72c0ab174c21

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 (248) hide show
  1. package/LICENSE.txt +87 -0
  2. package/README.md +291 -0
  3. package/dist/agents/resolve-orchestrator-url.d.ts +22 -0
  4. package/dist/agents/resolve-orchestrator-url.js +38 -0
  5. package/dist/agents/resolve-orchestrator-url.js.map +1 -0
  6. package/dist/capabilities/integration-metadata.d.ts +28 -0
  7. package/dist/capabilities/integration-metadata.js +174 -0
  8. package/dist/capabilities/integration-metadata.js.map +1 -0
  9. package/dist/capabilities/lifecycle.d.ts +93 -0
  10. package/dist/capabilities/lifecycle.js +3450 -0
  11. package/dist/capabilities/lifecycle.js.map +1 -0
  12. package/dist/capabilities/query-integration.d.ts +14 -0
  13. package/dist/capabilities/query-integration.js +172 -0
  14. package/dist/capabilities/query-integration.js.map +1 -0
  15. package/dist/capabilities/source-files-archive.d.ts +11 -0
  16. package/dist/capabilities/source-files-archive.js +54 -0
  17. package/dist/capabilities/source-files-archive.js.map +1 -0
  18. package/dist/capabilities/types.d.ts +542 -0
  19. package/dist/capabilities/types.js +86 -0
  20. package/dist/capabilities/types.js.map +1 -0
  21. package/dist/capture/browser-contract.d.ts +46 -0
  22. package/dist/capture/browser-contract.js +34 -0
  23. package/dist/capture/browser-contract.js.map +1 -0
  24. package/dist/capture/browser-instructions.d.ts +10 -0
  25. package/dist/capture/browser-instructions.js +18 -0
  26. package/dist/capture/browser-instructions.js.map +1 -0
  27. package/dist/capture/capture-library-probe.d.ts +55 -0
  28. package/dist/capture/capture-library-probe.js +177 -0
  29. package/dist/capture/capture-library-probe.js.map +1 -0
  30. package/dist/capture/capture-library.d.ts +52 -0
  31. package/dist/capture/capture-library.js +249 -0
  32. package/dist/capture/capture-library.js.map +1 -0
  33. package/dist/capture/classify-library-paint.d.ts +21 -0
  34. package/dist/capture/classify-library-paint.js +13 -0
  35. package/dist/capture/classify-library-paint.js.map +1 -0
  36. package/dist/capture/host-mcp-scan.d.ts +16 -0
  37. package/dist/capture/host-mcp-scan.js +64 -0
  38. package/dist/capture/host-mcp-scan.js.map +1 -0
  39. package/dist/capture/library-parent-script.d.ts +35 -0
  40. package/dist/capture/library-parent-script.js +82 -0
  41. package/dist/capture/library-parent-script.js.map +1 -0
  42. package/dist/capture/mode.d.ts +29 -0
  43. package/dist/capture/mode.js +65 -0
  44. package/dist/capture/mode.js.map +1 -0
  45. package/dist/config.d.ts +148 -0
  46. package/dist/config.js +111 -0
  47. package/dist/config.js.map +1 -0
  48. package/dist/debug.d.ts +2 -0
  49. package/dist/debug.js +9 -0
  50. package/dist/debug.js.map +1 -0
  51. package/dist/deps.d.ts +38 -0
  52. package/dist/deps.js +2 -0
  53. package/dist/deps.js.map +1 -0
  54. package/dist/health/readiness.d.ts +99 -0
  55. package/dist/health/readiness.js +202 -0
  56. package/dist/health/readiness.js.map +1 -0
  57. package/dist/index.d.ts +8 -0
  58. package/dist/index.js +8 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/integrations/filters.d.ts +8 -0
  61. package/dist/integrations/filters.js +40 -0
  62. package/dist/integrations/filters.js.map +1 -0
  63. package/dist/integrations/map.d.ts +27 -0
  64. package/dist/integrations/map.js +43 -0
  65. package/dist/integrations/map.js.map +1 -0
  66. package/dist/integrations/profile-key.d.ts +19 -0
  67. package/dist/integrations/profile-key.js +35 -0
  68. package/dist/integrations/profile-key.js.map +1 -0
  69. package/dist/integrations/read-only-postgres-query.d.ts +2 -0
  70. package/dist/integrations/read-only-postgres-query.js +164 -0
  71. package/dist/integrations/read-only-postgres-query.js.map +1 -0
  72. package/dist/main.d.ts +2 -0
  73. package/dist/main.js +5 -0
  74. package/dist/main.js.map +1 -0
  75. package/dist/orchestrator/client.d.ts +62 -0
  76. package/dist/orchestrator/client.js +160 -0
  77. package/dist/orchestrator/client.js.map +1 -0
  78. package/dist/playwright/ensure-chromium.d.ts +24 -0
  79. package/dist/playwright/ensure-chromium.js +60 -0
  80. package/dist/playwright/ensure-chromium.js.map +1 -0
  81. package/dist/preview/capture-screenshot.d.ts +67 -0
  82. package/dist/preview/capture-screenshot.js +179 -0
  83. package/dist/preview/capture-screenshot.js.map +1 -0
  84. package/dist/preview/viewer-url.d.ts +82 -0
  85. package/dist/preview/viewer-url.js +130 -0
  86. package/dist/preview/viewer-url.js.map +1 -0
  87. package/dist/process/fault-barrier.d.ts +55 -0
  88. package/dist/process/fault-barrier.js +113 -0
  89. package/dist/process/fault-barrier.js.map +1 -0
  90. package/dist/sabs/agent-facing-text.d.ts +35 -0
  91. package/dist/sabs/agent-facing-text.js +165 -0
  92. package/dist/sabs/agent-facing-text.js.map +1 -0
  93. package/dist/sabs/app-state.d.ts +126 -0
  94. package/dist/sabs/app-state.js +332 -0
  95. package/dist/sabs/app-state.js.map +1 -0
  96. package/dist/sabs/awaited-decision.d.ts +47 -0
  97. package/dist/sabs/awaited-decision.js +124 -0
  98. package/dist/sabs/awaited-decision.js.map +1 -0
  99. package/dist/sabs/browser-context.d.ts +53 -0
  100. package/dist/sabs/browser-context.js +92 -0
  101. package/dist/sabs/browser-context.js.map +1 -0
  102. package/dist/sabs/editor-client-methods.d.ts +164 -0
  103. package/dist/sabs/editor-client-methods.js +750 -0
  104. package/dist/sabs/editor-client-methods.js.map +1 -0
  105. package/dist/sabs/editor-socket.d.ts +84 -0
  106. package/dist/sabs/editor-socket.js +64 -0
  107. package/dist/sabs/editor-socket.js.map +1 -0
  108. package/dist/sabs/recent-tool-runs.d.ts +14 -0
  109. package/dist/sabs/recent-tool-runs.js +61 -0
  110. package/dist/sabs/recent-tool-runs.js.map +1 -0
  111. package/dist/sabs/session-peer.d.ts +392 -0
  112. package/dist/sabs/session-peer.js +11 -0
  113. package/dist/sabs/session-peer.js.map +1 -0
  114. package/dist/sabs/streamed-reply.d.ts +42 -0
  115. package/dist/sabs/streamed-reply.js +110 -0
  116. package/dist/sabs/streamed-reply.js.map +1 -0
  117. package/dist/sabs/turn-collector.d.ts +169 -0
  118. package/dist/sabs/turn-collector.js +506 -0
  119. package/dist/sabs/turn-collector.js.map +1 -0
  120. package/dist/sabs/websocket-session-peer.d.ts +540 -0
  121. package/dist/sabs/websocket-session-peer.js +3289 -0
  122. package/dist/sabs/websocket-session-peer.js.map +1 -0
  123. package/dist/security/constant-time.d.ts +9 -0
  124. package/dist/security/constant-time.js +13 -0
  125. package/dist/security/constant-time.js.map +1 -0
  126. package/dist/server/client.d.ts +405 -0
  127. package/dist/server/client.js +684 -0
  128. package/dist/server/client.js.map +1 -0
  129. package/dist/server/identity-reads.d.ts +76 -0
  130. package/dist/server/identity-reads.js +209 -0
  131. package/dist/server/identity-reads.js.map +1 -0
  132. package/dist/start.d.ts +24 -0
  133. package/dist/start.js +81 -0
  134. package/dist/start.js.map +1 -0
  135. package/dist/stores/memory.d.ts +42 -0
  136. package/dist/stores/memory.js +121 -0
  137. package/dist/stores/memory.js.map +1 -0
  138. package/dist/stores/types.d.ts +74 -0
  139. package/dist/stores/types.js +11 -0
  140. package/dist/stores/types.js.map +1 -0
  141. package/dist/telemetry/mcp-client.d.ts +22 -0
  142. package/dist/telemetry/mcp-client.js +140 -0
  143. package/dist/telemetry/mcp-client.js.map +1 -0
  144. package/dist/telemetry/metrics.d.ts +41 -0
  145. package/dist/telemetry/metrics.js +103 -0
  146. package/dist/telemetry/metrics.js.map +1 -0
  147. package/dist/telemetry/runtime.d.ts +9 -0
  148. package/dist/telemetry/runtime.js +118 -0
  149. package/dist/telemetry/runtime.js.map +1 -0
  150. package/dist/transports/mcp/admin-tools.d.ts +56 -0
  151. package/dist/transports/mcp/admin-tools.js +252 -0
  152. package/dist/transports/mcp/admin-tools.js.map +1 -0
  153. package/dist/transports/mcp/app-status-html.d.ts +11 -0
  154. package/dist/transports/mcp/app-status-html.js +899 -0
  155. package/dist/transports/mcp/app-status-html.js.map +1 -0
  156. package/dist/transports/mcp/client-presentation.d.ts +16 -0
  157. package/dist/transports/mcp/client-presentation.js +13 -0
  158. package/dist/transports/mcp/client-presentation.js.map +1 -0
  159. package/dist/transports/mcp/cowork-editor-url.d.ts +6 -0
  160. package/dist/transports/mcp/cowork-editor-url.js +10 -0
  161. package/dist/transports/mcp/cowork-editor-url.js.map +1 -0
  162. package/dist/transports/mcp/decision-card-html.d.ts +26 -0
  163. package/dist/transports/mcp/decision-card-html.js +876 -0
  164. package/dist/transports/mcp/decision-card-html.js.map +1 -0
  165. package/dist/transports/mcp/decision-elicitation.d.ts +116 -0
  166. package/dist/transports/mcp/decision-elicitation.js +292 -0
  167. package/dist/transports/mcp/decision-elicitation.js.map +1 -0
  168. package/dist/transports/mcp/dispatch-probe.d.ts +24 -0
  169. package/dist/transports/mcp/dispatch-probe.js +48 -0
  170. package/dist/transports/mcp/dispatch-probe.js.map +1 -0
  171. package/dist/transports/mcp/editor-document-probe.d.ts +4 -0
  172. package/dist/transports/mcp/editor-document-probe.js +35 -0
  173. package/dist/transports/mcp/editor-document-probe.js.map +1 -0
  174. package/dist/transports/mcp/editor-integration-setup-url.d.ts +8 -0
  175. package/dist/transports/mcp/editor-integration-setup-url.js +23 -0
  176. package/dist/transports/mcp/editor-integration-setup-url.js.map +1 -0
  177. package/dist/transports/mcp/format-tool-content.d.ts +20 -0
  178. package/dist/transports/mcp/format-tool-content.js +89 -0
  179. package/dist/transports/mcp/format-tool-content.js.map +1 -0
  180. package/dist/transports/mcp/instructions/index.d.ts +23 -0
  181. package/dist/transports/mcp/instructions/index.js +81 -0
  182. package/dist/transports/mcp/instructions/index.js.map +1 -0
  183. package/dist/transports/mcp/instructions/result.d.ts +18 -0
  184. package/dist/transports/mcp/instructions/result.js +58 -0
  185. package/dist/transports/mcp/instructions/result.js.map +1 -0
  186. package/dist/transports/mcp/instructions/tools/ask-user.d.ts +2 -0
  187. package/dist/transports/mcp/instructions/tools/ask-user.js +17 -0
  188. package/dist/transports/mcp/instructions/tools/ask-user.js.map +1 -0
  189. package/dist/transports/mcp/instructions/tools/check-app-progress.d.ts +3 -0
  190. package/dist/transports/mcp/instructions/tools/check-app-progress.js +75 -0
  191. package/dist/transports/mcp/instructions/tools/check-app-progress.js.map +1 -0
  192. package/dist/transports/mcp/instructions/tools/check-publish-progress.d.ts +3 -0
  193. package/dist/transports/mcp/instructions/tools/check-publish-progress.js +23 -0
  194. package/dist/transports/mcp/instructions/tools/check-publish-progress.js.map +1 -0
  195. package/dist/transports/mcp/instructions/tools/copy.d.ts +14 -0
  196. package/dist/transports/mcp/instructions/tools/copy.js +35 -0
  197. package/dist/transports/mcp/instructions/tools/copy.js.map +1 -0
  198. package/dist/transports/mcp/instructions/tools/create-integration.d.ts +4 -0
  199. package/dist/transports/mcp/instructions/tools/create-integration.js +41 -0
  200. package/dist/transports/mcp/instructions/tools/create-integration.js.map +1 -0
  201. package/dist/transports/mcp/instructions/tools/edit-app.d.ts +2 -0
  202. package/dist/transports/mcp/instructions/tools/edit-app.js +18 -0
  203. package/dist/transports/mcp/instructions/tools/edit-app.js.map +1 -0
  204. package/dist/transports/mcp/instructions/tools/get-app.d.ts +3 -0
  205. package/dist/transports/mcp/instructions/tools/get-app.js +47 -0
  206. package/dist/transports/mcp/instructions/tools/get-app.js.map +1 -0
  207. package/dist/transports/mcp/instructions/tools/get-integration-metadata.d.ts +2 -0
  208. package/dist/transports/mcp/instructions/tools/get-integration-metadata.js +13 -0
  209. package/dist/transports/mcp/instructions/tools/get-integration-metadata.js.map +1 -0
  210. package/dist/transports/mcp/instructions/tools/index.d.ts +7 -0
  211. package/dist/transports/mcp/instructions/tools/index.js +26 -0
  212. package/dist/transports/mcp/instructions/tools/index.js.map +1 -0
  213. package/dist/transports/mcp/instructions/tools/preview-app.d.ts +3 -0
  214. package/dist/transports/mcp/instructions/tools/preview-app.js +14 -0
  215. package/dist/transports/mcp/instructions/tools/preview-app.js.map +1 -0
  216. package/dist/transports/mcp/instructions/tools/publish-app.d.ts +3 -0
  217. package/dist/transports/mcp/instructions/tools/publish-app.js +23 -0
  218. package/dist/transports/mcp/instructions/tools/publish-app.js.map +1 -0
  219. package/dist/transports/mcp/instructions/tools/start-app.d.ts +2 -0
  220. package/dist/transports/mcp/instructions/tools/start-app.js +22 -0
  221. package/dist/transports/mcp/instructions/tools/start-app.js.map +1 -0
  222. package/dist/transports/mcp/instructions/tools/upload-artifact.d.ts +2 -0
  223. package/dist/transports/mcp/instructions/tools/upload-artifact.js +13 -0
  224. package/dist/transports/mcp/instructions/tools/upload-artifact.js.map +1 -0
  225. package/dist/transports/mcp/mcp-app-brand-css.d.ts +1 -0
  226. package/dist/transports/mcp/mcp-app-brand-css.js +180 -0
  227. package/dist/transports/mcp/mcp-app-brand-css.js.map +1 -0
  228. package/dist/transports/mcp/mount.d.ts +22 -0
  229. package/dist/transports/mcp/mount.js +1040 -0
  230. package/dist/transports/mcp/mount.js.map +1 -0
  231. package/dist/transports/mcp/native-browser-presence.d.ts +45 -0
  232. package/dist/transports/mcp/native-browser-presence.js +158 -0
  233. package/dist/transports/mcp/native-browser-presence.js.map +1 -0
  234. package/dist/transports/mcp/plan-approval.d.ts +38 -0
  235. package/dist/transports/mcp/plan-approval.js +175 -0
  236. package/dist/transports/mcp/plan-approval.js.map +1 -0
  237. package/dist/transports/mcp/progress-notifier.d.ts +39 -0
  238. package/dist/transports/mcp/progress-notifier.js +52 -0
  239. package/dist/transports/mcp/progress-notifier.js.map +1 -0
  240. package/dist/transports/mcp/session-directory.d.ts +7 -0
  241. package/dist/transports/mcp/session-directory.js +18 -0
  242. package/dist/transports/mcp/session-directory.js.map +1 -0
  243. package/dist/transports/mcp/tool-names.d.ts +2 -0
  244. package/dist/transports/mcp/tool-names.js +2 -0
  245. package/dist/transports/mcp/tool-names.js.map +1 -0
  246. package/package.json +78 -0
  247. package/skills/superblocks-build/SKILL.md +59 -0
  248. package/skills/superblocks-import/SKILL.md +88 -0
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Sanitize text that may be echoed into Claude / MCP tool results.
3
+ *
4
+ * Downstream orchestrator and integration payloads can carry secrets, control
5
+ * characters, and prompt-injection wrappers. Strip those before any agent sees
6
+ * the string.
7
+ */
8
+ /** JWT / opaque bearer-ish tokens and common vendor API key shapes. */
9
+ const SECRET_PATTERNS = [
10
+ /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g,
11
+ // Vendor keys often embed hyphens inside the secret (sk-proj-..., sk-ant-...).
12
+ /\b(?:sk|rk|pk)[-_][A-Za-z0-9_-]{16,}\b/gi,
13
+ /\bsbp_[A-Za-z0-9]{16,}\b/g,
14
+ /\bAKIA[0-9A-Z]{16}\b/g,
15
+ /\bBearer\s+[A-Za-z0-9._~+/=-]{16,}\b/gi,
16
+ // Plain assignments: password=... / api_key: ...
17
+ /(?<=(?:password|passwd|secret|token|api[_-]?key)\s*[:=]\s*)["']?[^\s"',;]{8,}["']?/gi,
18
+ // JSON-ish quoted keys: "password": "..."
19
+ /(?<=["'](?:password|passwd|secret|token|api[_-]?key)["']\s*:\s*)["'][^"']{4,}["']/gi,
20
+ ];
21
+ const SECRET_FIELD_KEYS = new Set([
22
+ "api_key",
23
+ "apikey",
24
+ "authorization",
25
+ "ca",
26
+ "cert",
27
+ "connectionstring",
28
+ "dsn",
29
+ "googleserviceaccount",
30
+ "masterkey",
31
+ "passwd",
32
+ "password",
33
+ "secret",
34
+ "token",
35
+ "urlstring",
36
+ ]);
37
+ /**
38
+ * Field names that end in a credential word but carry a cursor or a count.
39
+ * Redacting these would hide the paging state Clark needs to keep listing.
40
+ */
41
+ const CURSOR_FIELD_KEYS = new Set([
42
+ "continuationtoken",
43
+ "nextpagetoken",
44
+ "nexttoken",
45
+ "pagetoken",
46
+ "pagingtoken",
47
+ "resumetoken",
48
+ "synctoken",
49
+ "tokencount",
50
+ ]);
51
+ const REDACTED = "[REDACTED]";
52
+ /**
53
+ * Removes C0 control characters (keeps tab/LF/CR) so logs and prompts stay printable.
54
+ * Implemented without a control-character regex so eslint no-control-regex stays clean.
55
+ */
56
+ export function stripUnsafeChars(text) {
57
+ let out = "";
58
+ for (let i = 0; i < text.length; i += 1) {
59
+ const code = text.charCodeAt(i);
60
+ if (code === 9 || code === 10 || code === 13) {
61
+ out += text[i];
62
+ continue;
63
+ }
64
+ if (code < 32 || code === 127) {
65
+ continue;
66
+ }
67
+ out += text[i];
68
+ }
69
+ return out;
70
+ }
71
+ /**
72
+ * Replaces common secret-shaped substrings with a fixed redaction token.
73
+ */
74
+ export function scrubSecrets(text) {
75
+ let next = text;
76
+ for (const pattern of SECRET_PATTERNS) {
77
+ next = next.replace(pattern, REDACTED);
78
+ }
79
+ return next;
80
+ }
81
+ /**
82
+ * Full agent-facing sanitize: scrub secrets, strip controls, neutralize backticks.
83
+ */
84
+ export function sanitizeAgentFacingText(text) {
85
+ return scrubSecrets(stripUnsafeChars(text)).replace(/`/g, "'");
86
+ }
87
+ function isSecretFieldKey(key) {
88
+ const normalized = key.toLowerCase().replace(/[^a-z0-9]/g, "");
89
+ if (CURSOR_FIELD_KEYS.has(normalized)) {
90
+ return false;
91
+ }
92
+ return (SECRET_FIELD_KEYS.has(key.toLowerCase()) ||
93
+ SECRET_FIELD_KEYS.has(normalized) ||
94
+ normalized.endsWith("password") ||
95
+ normalized.endsWith("passphrase") ||
96
+ normalized.endsWith("secret") ||
97
+ normalized.endsWith("token") ||
98
+ normalized.endsWith("apikey") ||
99
+ normalized.includes("accesskey") ||
100
+ normalized.includes("certificate") ||
101
+ normalized.includes("password") ||
102
+ normalized.includes("privatekey") ||
103
+ normalized.includes("secret"));
104
+ }
105
+ /**
106
+ * Deep-sanitize string leaves in tool results returned to Clark / MCP.
107
+ *
108
+ * A secret-named field is redacted whole, since the value need not look like a
109
+ * secret to be one, and a wrapper around it is no safer than the bare value: an
110
+ * object or array under `password` is replaced rather than walked, or its leaves
111
+ * would pass under names of their own that read as harmless.
112
+ *
113
+ * Booleans are the exception. A flag such as `hasPassword` reports whether a
114
+ * credential exists rather than carrying it, and redacting it hides state Clark
115
+ * needs without hiding a secret.
116
+ */
117
+ export function sanitizeAgentFacingValue(value) {
118
+ if (typeof value === "string") {
119
+ return sanitizeAgentFacingText(value);
120
+ }
121
+ if (Array.isArray(value)) {
122
+ return value.map((entry) => sanitizeAgentFacingValue(entry));
123
+ }
124
+ if (value && typeof value === "object") {
125
+ const out = {};
126
+ for (const [key, entry] of Object.entries(value)) {
127
+ const carriesNoSecret = typeof entry === "boolean" || entry == null;
128
+ if (!carriesNoSecret && isSecretFieldKey(key)) {
129
+ out[key] = REDACTED;
130
+ continue;
131
+ }
132
+ out[key] = sanitizeAgentFacingValue(entry);
133
+ }
134
+ return out;
135
+ }
136
+ return value;
137
+ }
138
+ function isPemMaterial(value) {
139
+ return typeof value === "string" && /-----BEGIN [A-Z0-9 ]+-----/.test(value);
140
+ }
141
+ /** Deep-sanitize a configuration while omitting credential fields entirely. */
142
+ export function sanitizeAgentFacingConfiguration(value) {
143
+ return sanitizeConfigurationValue(value);
144
+ }
145
+ function sanitizeConfigurationValue(value) {
146
+ if (Array.isArray(value)) {
147
+ return value
148
+ .filter((entry) => !isPemMaterial(entry))
149
+ .map(sanitizeConfigurationValue);
150
+ }
151
+ if (!value || typeof value !== "object") {
152
+ return sanitizeAgentFacingValue(value);
153
+ }
154
+ const out = {};
155
+ for (const [key, entry] of Object.entries(value)) {
156
+ if (typeof entry !== "boolean" &&
157
+ entry != null &&
158
+ (isSecretFieldKey(key) || isPemMaterial(entry))) {
159
+ continue;
160
+ }
161
+ out[key] = sanitizeConfigurationValue(entry);
162
+ }
163
+ return out;
164
+ }
165
+ //# sourceMappingURL=agent-facing-text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-facing-text.js","sourceRoot":"","sources":["../../src/sabs/agent-facing-text.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
1
+ import type { RecentToolRun } from "../capabilities/types.js";
2
+ import type { FinishedTurn, RetryAction, TurnDecision } from "./session-peer.js";
3
+ /**
4
+ * How long a dead start stays the answer for an application.
5
+ *
6
+ * Long enough to outlive the poll that follows a failed prompt, short enough
7
+ * that an app abandoned after a failure is not still reporting it later.
8
+ */
9
+ export declare const DEFAULT_FAILED_START_TTL_MS: number;
10
+ /**
11
+ * Cap on remembered dead starts, because nothing else evicts: an app whose
12
+ * start failed and that is never retried would otherwise hold its entry for
13
+ * the life of the process.
14
+ */
15
+ export declare const MAX_FAILED_STARTS = 256;
16
+ /**
17
+ * How long an acknowledged start may go without its live owner renewing it.
18
+ * Long enough for a cold sandbox boot, short enough that a background start
19
+ * killed without recording anything stops pinning the app at "building".
20
+ */
21
+ export declare const DEFAULT_PENDING_START_TTL_MS: number;
22
+ /**
23
+ * Whose prompt died. Scoped to the caller because `connectLiveEdit` is where
24
+ * Superblocks authorizes them, per application - so a caller with no rights to
25
+ * this one still reaches that path, and a record keyed any wider becomes the
26
+ * status everyone who does have rights reads.
27
+ */
28
+ export type FailedStartScope = {
29
+ applicationId: string;
30
+ branch?: string;
31
+ organizationId: string;
32
+ userId: string;
33
+ };
34
+ type FailedStart = FinishedTurn & {
35
+ branch?: string;
36
+ };
37
+ export type PendingPlan = {
38
+ branch?: string;
39
+ messageId?: string;
40
+ plan: string;
41
+ title?: string;
42
+ };
43
+ export type PendingDecision = {
44
+ branch?: string;
45
+ decision: TurnDecision;
46
+ recentRuns?: RecentToolRun[];
47
+ reply: string;
48
+ };
49
+ export type AppStateOptions = {
50
+ failedStartTtlMs?: number;
51
+ maxFailedStarts?: number;
52
+ now?: () => number;
53
+ pendingStartTtlMs?: number;
54
+ };
55
+ /**
56
+ * What Gateway remembers about an application between turns.
57
+ *
58
+ * None of this is transport state, and none of it can be pushed onto the
59
+ * caller. Each entry compensates for something the protocol does not carry:
60
+ *
61
+ * - The plan, because approving one means re-sending it as `planContext`, and
62
+ * a caller asked to echo markdown back paraphrases it - which silently
63
+ * changes what gets built.
64
+ * - The dead start, because the call that failed has already returned. It is
65
+ * the *next* call - a poll, or `get_app` - that would otherwise report
66
+ * `unknown` and preview the untouched starter template as a finished app.
67
+ *
68
+ * It lives here rather than on the session peer so a socket owns a socket. It
69
+ * is a concrete class with no optional members: a collaborator that is always
70
+ * present cannot be confused at a call site with a fact that is absent.
71
+ */
72
+ export declare class AppState {
73
+ private readonly acceptedStarts;
74
+ private readonly plans;
75
+ private readonly decisions;
76
+ private readonly publishes;
77
+ private readonly failedStarts;
78
+ private readonly pendingStarts;
79
+ private readonly failedStartTtlMs;
80
+ private readonly maxFailedStarts;
81
+ private readonly now;
82
+ private readonly pendingStartTtlMs;
83
+ private revision;
84
+ constructor(options?: AppStateOptions);
85
+ pendingPlan(applicationId: string, requestedBranch?: string): PendingPlan | undefined;
86
+ setPendingPlan(applicationId: string, plan: PendingPlan): void;
87
+ pendingDecision(applicationId: string, requestedBranch?: string): PendingDecision | undefined;
88
+ setPendingDecision(applicationId: string, decision: PendingDecision): void;
89
+ /**
90
+ * The commit whose deploy `publish_app` handed back still running, so
91
+ * `check_publish_progress` can follow it without the caller carrying the id.
92
+ */
93
+ publishInFlight(applicationId: string): string | undefined;
94
+ publishStartedAtMs(applicationId: string, claim: number): number | undefined;
95
+ setPublishInFlight(applicationId: string, commitId: string, startedAtMs?: number): number;
96
+ claimPublishInFlight(applicationId: string, commitId: string, startedAtMs?: number): number;
97
+ noteMissingPublishStatus(applicationId: string, claim: number, atMs: number): number | undefined;
98
+ noteVisiblePublishStatus(applicationId: string, claim: number): void;
99
+ clearPublishInFlight(applicationId: string, claim: number): void;
100
+ /**
101
+ * Drop the plan alone, for a turn that ended on a decision that is not one.
102
+ * The decision it ended on is written separately and must survive this.
103
+ */
104
+ clearPendingPlan(applicationId: string): void;
105
+ /** Both go together: a plan is one kind of decision Clark waits on. */
106
+ clearPending(applicationId: string): void;
107
+ markTurnStarted(): number;
108
+ failedStart(scope: FailedStartScope, newerThanRevision?: number): FailedStart | undefined;
109
+ recordFailedStart(scope: FailedStartScope, turn: FinishedTurn, revision?: number): void;
110
+ claimReplacementEntitlement(scope: Omit<FailedStartScope, "branch">, replyWhileClaimed: string): (() => void) | undefined;
111
+ /** Forget every caller's dead start for the accepted application branch. */
112
+ clearFailedStarts(applicationId: string, branch?: string, throughRevision?: number): void;
113
+ pendingStart(scope: FailedStartScope, idempotencyKey?: string, token?: number): {
114
+ idempotencyKey?: string;
115
+ retryAction?: RetryAction;
116
+ token: number;
117
+ } | undefined;
118
+ recordPendingStart(scope: FailedStartScope, value?: {
119
+ idempotencyKey?: string;
120
+ retryAction?: RetryAction;
121
+ }): number;
122
+ keepPendingStartAlive(scope: FailedStartScope, token: number): () => void;
123
+ clearPendingStart(scope: FailedStartScope, idempotencyKey?: string, throughRevision?: number, token?: number): boolean;
124
+ clearPendingStartsThrough(applicationId: string, revision: number): void;
125
+ }
126
+ export {};
@@ -0,0 +1,332 @@
1
+ /**
2
+ * How long a dead start stays the answer for an application.
3
+ *
4
+ * Long enough to outlive the poll that follows a failed prompt, short enough
5
+ * that an app abandoned after a failure is not still reporting it later.
6
+ */
7
+ export const DEFAULT_FAILED_START_TTL_MS = 30 * 60 * 1000;
8
+ /**
9
+ * Cap on remembered dead starts, because nothing else evicts: an app whose
10
+ * start failed and that is never retried would otherwise hold its entry for
11
+ * the life of the process.
12
+ */
13
+ export const MAX_FAILED_STARTS = 256;
14
+ const DEFAULT_BRANCH_KEY = "default";
15
+ /**
16
+ * How long an acknowledged start may go without its live owner renewing it.
17
+ * Long enough for a cold sandbox boot, short enough that a background start
18
+ * killed without recording anything stops pinning the app at "building".
19
+ */
20
+ export const DEFAULT_PENDING_START_TTL_MS = 5 * 60 * 1000;
21
+ /**
22
+ * What Gateway remembers about an application between turns.
23
+ *
24
+ * None of this is transport state, and none of it can be pushed onto the
25
+ * caller. Each entry compensates for something the protocol does not carry:
26
+ *
27
+ * - The plan, because approving one means re-sending it as `planContext`, and
28
+ * a caller asked to echo markdown back paraphrases it - which silently
29
+ * changes what gets built.
30
+ * - The dead start, because the call that failed has already returned. It is
31
+ * the *next* call - a poll, or `get_app` - that would otherwise report
32
+ * `unknown` and preview the untouched starter template as a finished app.
33
+ *
34
+ * It lives here rather than on the session peer so a socket owns a socket. It
35
+ * is a concrete class with no optional members: a collaborator that is always
36
+ * present cannot be confused at a call site with a fact that is absent.
37
+ */
38
+ export class AppState {
39
+ acceptedStarts = new Map();
40
+ plans = new Map();
41
+ decisions = new Map();
42
+ publishes = new Map();
43
+ failedStarts = new Map();
44
+ pendingStarts = new Map();
45
+ failedStartTtlMs;
46
+ maxFailedStarts;
47
+ now;
48
+ pendingStartTtlMs;
49
+ revision = 0;
50
+ constructor(options = {}) {
51
+ this.failedStartTtlMs =
52
+ options.failedStartTtlMs ?? DEFAULT_FAILED_START_TTL_MS;
53
+ this.maxFailedStarts = options.maxFailedStarts ?? MAX_FAILED_STARTS;
54
+ this.now = options.now ?? (() => Date.now());
55
+ this.pendingStartTtlMs =
56
+ options.pendingStartTtlMs ?? DEFAULT_PENDING_START_TTL_MS;
57
+ }
58
+ pendingPlan(applicationId, requestedBranch) {
59
+ const plan = this.plans.get(applicationId);
60
+ return requestedBranch === undefined || plan?.branch === requestedBranch
61
+ ? plan
62
+ : undefined;
63
+ }
64
+ setPendingPlan(applicationId, plan) {
65
+ this.plans.set(applicationId, plan);
66
+ }
67
+ pendingDecision(applicationId, requestedBranch) {
68
+ const decision = this.decisions.get(applicationId);
69
+ return requestedBranch === undefined || decision?.branch === requestedBranch
70
+ ? decision
71
+ : undefined;
72
+ }
73
+ setPendingDecision(applicationId, decision) {
74
+ this.decisions.set(applicationId, decision);
75
+ }
76
+ /**
77
+ * The commit whose deploy `publish_app` handed back still running, so
78
+ * `check_publish_progress` can follow it without the caller carrying the id.
79
+ */
80
+ publishInFlight(applicationId) {
81
+ return this.publishes.get(applicationId)?.commitId;
82
+ }
83
+ publishStartedAtMs(applicationId, claim) {
84
+ const publish = this.publishes.get(applicationId);
85
+ return publish?.claim === claim ? publish.startedAtMs : undefined;
86
+ }
87
+ setPublishInFlight(applicationId, commitId, startedAtMs = this.now()) {
88
+ const claim = ++this.revision;
89
+ this.publishes.set(applicationId, {
90
+ claim,
91
+ commitId,
92
+ missingSinceMs: undefined,
93
+ startedAtMs,
94
+ });
95
+ return claim;
96
+ }
97
+ claimPublishInFlight(applicationId, commitId, startedAtMs = this.now()) {
98
+ const current = this.publishes.get(applicationId);
99
+ const claim = ++this.revision;
100
+ this.publishes.set(applicationId, {
101
+ claim,
102
+ commitId,
103
+ missingSinceMs: current?.commitId === commitId ? current.missingSinceMs : undefined,
104
+ startedAtMs: current?.commitId === commitId ? current.startedAtMs : startedAtMs,
105
+ });
106
+ return claim;
107
+ }
108
+ noteMissingPublishStatus(applicationId, claim, atMs) {
109
+ const publish = this.publishes.get(applicationId);
110
+ if (publish?.claim !== claim) {
111
+ return undefined;
112
+ }
113
+ publish.missingSinceMs ??= atMs;
114
+ return Math.max(0, atMs - publish.missingSinceMs);
115
+ }
116
+ noteVisiblePublishStatus(applicationId, claim) {
117
+ const publish = this.publishes.get(applicationId);
118
+ if (publish?.claim === claim) {
119
+ publish.missingSinceMs = undefined;
120
+ }
121
+ }
122
+ clearPublishInFlight(applicationId, claim) {
123
+ if (this.publishes.get(applicationId)?.claim === claim) {
124
+ this.publishes.delete(applicationId);
125
+ }
126
+ }
127
+ /**
128
+ * Drop the plan alone, for a turn that ended on a decision that is not one.
129
+ * The decision it ended on is written separately and must survive this.
130
+ */
131
+ clearPendingPlan(applicationId) {
132
+ this.plans.delete(applicationId);
133
+ }
134
+ /** Both go together: a plan is one kind of decision Clark waits on. */
135
+ clearPending(applicationId) {
136
+ this.plans.delete(applicationId);
137
+ this.decisions.delete(applicationId);
138
+ }
139
+ markTurnStarted() {
140
+ return ++this.revision;
141
+ }
142
+ failedStart(scope, newerThanRevision) {
143
+ const keys = scope.branch === undefined
144
+ ? [...this.failedStarts.keys()].reverse()
145
+ : [failedStartKey(scope)];
146
+ const prefix = failedStartPrefix(scope);
147
+ let latest;
148
+ let latestRevision = Number.NEGATIVE_INFINITY;
149
+ for (const key of keys) {
150
+ if (!key.startsWith(prefix)) {
151
+ continue;
152
+ }
153
+ const entry = this.failedStarts.get(key);
154
+ if (!entry) {
155
+ continue;
156
+ }
157
+ if (this.now() - entry.atMs >= this.failedStartTtlMs) {
158
+ this.failedStarts.delete(key);
159
+ continue;
160
+ }
161
+ if (newerThanRevision !== undefined &&
162
+ entry.revision <= newerThanRevision) {
163
+ continue;
164
+ }
165
+ if (entry.revision > latestRevision) {
166
+ latest = entry.turn;
167
+ latestRevision = entry.revision;
168
+ }
169
+ }
170
+ return latest;
171
+ }
172
+ recordFailedStart(scope, turn, revision = this.markTurnStarted()) {
173
+ const key = failedStartKey(scope);
174
+ const acceptedRevision = this.acceptedStarts.get(acceptedStartKey(scope.applicationId, scope.branch));
175
+ if (acceptedRevision !== undefined && revision <= acceptedRevision) {
176
+ return;
177
+ }
178
+ const current = this.failedStarts.get(key);
179
+ if (current && current.revision > revision) {
180
+ return;
181
+ }
182
+ // Re-inserted rather than updated in place, so this key becomes the newest
183
+ // and the eviction below stays in insertion order.
184
+ this.failedStarts.delete(key);
185
+ this.failedStarts.set(key, {
186
+ atMs: this.now(),
187
+ revision,
188
+ turn: {
189
+ ...(scope.branch === undefined ? {} : { branch: scope.branch }),
190
+ ...turn,
191
+ },
192
+ });
193
+ for (const oldest of this.failedStarts.keys()) {
194
+ if (this.failedStarts.size <= this.maxFailedStarts) {
195
+ break;
196
+ }
197
+ this.failedStarts.delete(oldest);
198
+ }
199
+ }
200
+ claimReplacementEntitlement(scope, replyWhileClaimed) {
201
+ const turn = this.failedStart(scope);
202
+ if (turn?.recoveryAction !== "start_new_app") {
203
+ return undefined;
204
+ }
205
+ const replyBeforeConsumption = turn.reply;
206
+ delete turn.recoveryAction;
207
+ turn.reply = replyWhileClaimed;
208
+ return () => {
209
+ turn.recoveryAction = "start_new_app";
210
+ turn.reply = replyBeforeConsumption;
211
+ };
212
+ }
213
+ /** Forget every caller's dead start for the accepted application branch. */
214
+ clearFailedStarts(applicationId, branch, throughRevision = Number.POSITIVE_INFINITY) {
215
+ const acceptedKey = acceptedStartKey(applicationId, branch);
216
+ const acceptedRevision = this.acceptedStarts.get(acceptedKey);
217
+ if (acceptedRevision === undefined || throughRevision > acceptedRevision) {
218
+ this.acceptedStarts.delete(acceptedKey);
219
+ this.acceptedStarts.set(acceptedKey, throughRevision);
220
+ }
221
+ const suffix = `\u0000${failedStartBranchKey(branch)}`;
222
+ for (const key of [...this.failedStarts.keys()]) {
223
+ const entry = this.failedStarts.get(key);
224
+ if (entry &&
225
+ entry.revision <= throughRevision &&
226
+ key.startsWith(`${applicationId}\u0000`) &&
227
+ key.endsWith(suffix)) {
228
+ this.failedStarts.delete(key);
229
+ }
230
+ }
231
+ }
232
+ pendingStart(scope, idempotencyKey, token) {
233
+ const keys = scope.branch === undefined
234
+ ? [...this.pendingStarts.keys()].reverse()
235
+ : [failedStartKey(scope)];
236
+ const prefix = failedStartPrefix(scope);
237
+ for (const key of keys) {
238
+ if (!key.startsWith(prefix)) {
239
+ continue;
240
+ }
241
+ const entry = this.pendingStarts.get(key);
242
+ if (!entry) {
243
+ continue;
244
+ }
245
+ if (this.now() - entry.atMs >= this.pendingStartTtlMs) {
246
+ this.pendingStarts.delete(key);
247
+ continue;
248
+ }
249
+ if ((idempotencyKey !== undefined &&
250
+ entry.idempotencyKey !== idempotencyKey) ||
251
+ (token !== undefined && entry.revision !== token)) {
252
+ continue;
253
+ }
254
+ return {
255
+ ...(entry.idempotencyKey === undefined
256
+ ? {}
257
+ : { idempotencyKey: entry.idempotencyKey }),
258
+ ...(entry.retryAction ? { retryAction: entry.retryAction } : {}),
259
+ token: entry.revision,
260
+ };
261
+ }
262
+ return undefined;
263
+ }
264
+ recordPendingStart(scope, value = {}) {
265
+ const now = this.now();
266
+ for (const [pendingKey, pending] of this.pendingStarts) {
267
+ if (now - pending.atMs >= this.pendingStartTtlMs) {
268
+ this.pendingStarts.delete(pendingKey);
269
+ }
270
+ }
271
+ const key = failedStartKey(scope);
272
+ this.pendingStarts.delete(key);
273
+ const revision = ++this.revision;
274
+ this.pendingStarts.set(key, {
275
+ atMs: now,
276
+ revision,
277
+ ...value,
278
+ });
279
+ return revision;
280
+ }
281
+ keepPendingStartAlive(scope, token) {
282
+ const key = failedStartKey(scope);
283
+ const timer = setInterval(() => {
284
+ const pending = this.pendingStarts.get(key);
285
+ if (pending?.revision !== token) {
286
+ clearInterval(timer);
287
+ return;
288
+ }
289
+ pending.atMs = this.now();
290
+ }, Math.max(1, Math.floor(this.pendingStartTtlMs / 2)));
291
+ timer.unref();
292
+ return () => clearInterval(timer);
293
+ }
294
+ clearPendingStart(scope, idempotencyKey, throughRevision = Number.POSITIVE_INFINITY, token) {
295
+ const key = failedStartKey(scope);
296
+ const pending = this.pendingStarts.get(key);
297
+ if (pending &&
298
+ pending.revision <= throughRevision &&
299
+ (token === undefined || pending.revision === token) &&
300
+ (idempotencyKey === undefined ||
301
+ pending.idempotencyKey === idempotencyKey)) {
302
+ return this.pendingStarts.delete(key);
303
+ }
304
+ return false;
305
+ }
306
+ clearPendingStartsThrough(applicationId, revision) {
307
+ for (const [key, pending] of this.pendingStarts) {
308
+ if (pending.revision <= revision &&
309
+ key.startsWith(`${applicationId}\u0000`)) {
310
+ this.pendingStarts.delete(key);
311
+ }
312
+ }
313
+ }
314
+ }
315
+ /**
316
+ * Separated by NUL because no id can contain one. Any printable separator is a
317
+ * character an id could carry, and an id that carried it would key two
318
+ * different callers to the same entry.
319
+ */
320
+ function failedStartKey(scope) {
321
+ return `${failedStartPrefix(scope)}${failedStartBranchKey(scope.branch)}`;
322
+ }
323
+ function acceptedStartKey(applicationId, branch) {
324
+ return `${applicationId}\u0000${failedStartBranchKey(branch)}`;
325
+ }
326
+ function failedStartPrefix(scope) {
327
+ return `${scope.applicationId}\u0000${scope.organizationId}\u0000${scope.userId}\u0000`;
328
+ }
329
+ function failedStartBranchKey(branch) {
330
+ return branch === undefined ? DEFAULT_BRANCH_KEY : `branch:${branch}`;
331
+ }
332
+ //# sourceMappingURL=app-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-state.js","sourceRoot":"","sources":["../../src/sabs/app-state.ts"],"names":[],"mappings":"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"}