@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.
- package/LICENSE.txt +87 -0
- package/README.md +291 -0
- package/dist/agents/resolve-orchestrator-url.d.ts +22 -0
- package/dist/agents/resolve-orchestrator-url.js +38 -0
- package/dist/agents/resolve-orchestrator-url.js.map +1 -0
- package/dist/capabilities/integration-metadata.d.ts +28 -0
- package/dist/capabilities/integration-metadata.js +174 -0
- package/dist/capabilities/integration-metadata.js.map +1 -0
- package/dist/capabilities/lifecycle.d.ts +93 -0
- package/dist/capabilities/lifecycle.js +3450 -0
- package/dist/capabilities/lifecycle.js.map +1 -0
- package/dist/capabilities/query-integration.d.ts +14 -0
- package/dist/capabilities/query-integration.js +172 -0
- package/dist/capabilities/query-integration.js.map +1 -0
- package/dist/capabilities/source-files-archive.d.ts +11 -0
- package/dist/capabilities/source-files-archive.js +54 -0
- package/dist/capabilities/source-files-archive.js.map +1 -0
- package/dist/capabilities/types.d.ts +542 -0
- package/dist/capabilities/types.js +86 -0
- package/dist/capabilities/types.js.map +1 -0
- package/dist/capture/browser-contract.d.ts +46 -0
- package/dist/capture/browser-contract.js +34 -0
- package/dist/capture/browser-contract.js.map +1 -0
- package/dist/capture/browser-instructions.d.ts +10 -0
- package/dist/capture/browser-instructions.js +18 -0
- package/dist/capture/browser-instructions.js.map +1 -0
- package/dist/capture/capture-library-probe.d.ts +55 -0
- package/dist/capture/capture-library-probe.js +177 -0
- package/dist/capture/capture-library-probe.js.map +1 -0
- package/dist/capture/capture-library.d.ts +52 -0
- package/dist/capture/capture-library.js +249 -0
- package/dist/capture/capture-library.js.map +1 -0
- package/dist/capture/classify-library-paint.d.ts +21 -0
- package/dist/capture/classify-library-paint.js +13 -0
- package/dist/capture/classify-library-paint.js.map +1 -0
- package/dist/capture/host-mcp-scan.d.ts +16 -0
- package/dist/capture/host-mcp-scan.js +64 -0
- package/dist/capture/host-mcp-scan.js.map +1 -0
- package/dist/capture/library-parent-script.d.ts +35 -0
- package/dist/capture/library-parent-script.js +82 -0
- package/dist/capture/library-parent-script.js.map +1 -0
- package/dist/capture/mode.d.ts +29 -0
- package/dist/capture/mode.js +65 -0
- package/dist/capture/mode.js.map +1 -0
- package/dist/config.d.ts +148 -0
- package/dist/config.js +111 -0
- package/dist/config.js.map +1 -0
- package/dist/debug.d.ts +2 -0
- package/dist/debug.js +9 -0
- package/dist/debug.js.map +1 -0
- package/dist/deps.d.ts +38 -0
- package/dist/deps.js +2 -0
- package/dist/deps.js.map +1 -0
- package/dist/health/readiness.d.ts +99 -0
- package/dist/health/readiness.js +202 -0
- package/dist/health/readiness.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/filters.d.ts +8 -0
- package/dist/integrations/filters.js +40 -0
- package/dist/integrations/filters.js.map +1 -0
- package/dist/integrations/map.d.ts +27 -0
- package/dist/integrations/map.js +43 -0
- package/dist/integrations/map.js.map +1 -0
- package/dist/integrations/profile-key.d.ts +19 -0
- package/dist/integrations/profile-key.js +35 -0
- package/dist/integrations/profile-key.js.map +1 -0
- package/dist/integrations/read-only-postgres-query.d.ts +2 -0
- package/dist/integrations/read-only-postgres-query.js +164 -0
- package/dist/integrations/read-only-postgres-query.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +5 -0
- package/dist/main.js.map +1 -0
- package/dist/orchestrator/client.d.ts +62 -0
- package/dist/orchestrator/client.js +160 -0
- package/dist/orchestrator/client.js.map +1 -0
- package/dist/playwright/ensure-chromium.d.ts +24 -0
- package/dist/playwright/ensure-chromium.js +60 -0
- package/dist/playwright/ensure-chromium.js.map +1 -0
- package/dist/preview/capture-screenshot.d.ts +67 -0
- package/dist/preview/capture-screenshot.js +179 -0
- package/dist/preview/capture-screenshot.js.map +1 -0
- package/dist/preview/viewer-url.d.ts +82 -0
- package/dist/preview/viewer-url.js +130 -0
- package/dist/preview/viewer-url.js.map +1 -0
- package/dist/process/fault-barrier.d.ts +55 -0
- package/dist/process/fault-barrier.js +113 -0
- package/dist/process/fault-barrier.js.map +1 -0
- package/dist/sabs/agent-facing-text.d.ts +35 -0
- package/dist/sabs/agent-facing-text.js +165 -0
- package/dist/sabs/agent-facing-text.js.map +1 -0
- package/dist/sabs/app-state.d.ts +126 -0
- package/dist/sabs/app-state.js +332 -0
- package/dist/sabs/app-state.js.map +1 -0
- package/dist/sabs/awaited-decision.d.ts +47 -0
- package/dist/sabs/awaited-decision.js +124 -0
- package/dist/sabs/awaited-decision.js.map +1 -0
- package/dist/sabs/browser-context.d.ts +53 -0
- package/dist/sabs/browser-context.js +92 -0
- package/dist/sabs/browser-context.js.map +1 -0
- package/dist/sabs/editor-client-methods.d.ts +164 -0
- package/dist/sabs/editor-client-methods.js +750 -0
- package/dist/sabs/editor-client-methods.js.map +1 -0
- package/dist/sabs/editor-socket.d.ts +84 -0
- package/dist/sabs/editor-socket.js +64 -0
- package/dist/sabs/editor-socket.js.map +1 -0
- package/dist/sabs/recent-tool-runs.d.ts +14 -0
- package/dist/sabs/recent-tool-runs.js +61 -0
- package/dist/sabs/recent-tool-runs.js.map +1 -0
- package/dist/sabs/session-peer.d.ts +392 -0
- package/dist/sabs/session-peer.js +11 -0
- package/dist/sabs/session-peer.js.map +1 -0
- package/dist/sabs/streamed-reply.d.ts +42 -0
- package/dist/sabs/streamed-reply.js +110 -0
- package/dist/sabs/streamed-reply.js.map +1 -0
- package/dist/sabs/turn-collector.d.ts +169 -0
- package/dist/sabs/turn-collector.js +506 -0
- package/dist/sabs/turn-collector.js.map +1 -0
- package/dist/sabs/websocket-session-peer.d.ts +540 -0
- package/dist/sabs/websocket-session-peer.js +3289 -0
- package/dist/sabs/websocket-session-peer.js.map +1 -0
- package/dist/security/constant-time.d.ts +9 -0
- package/dist/security/constant-time.js +13 -0
- package/dist/security/constant-time.js.map +1 -0
- package/dist/server/client.d.ts +405 -0
- package/dist/server/client.js +684 -0
- package/dist/server/client.js.map +1 -0
- package/dist/server/identity-reads.d.ts +76 -0
- package/dist/server/identity-reads.js +209 -0
- package/dist/server/identity-reads.js.map +1 -0
- package/dist/start.d.ts +24 -0
- package/dist/start.js +81 -0
- package/dist/start.js.map +1 -0
- package/dist/stores/memory.d.ts +42 -0
- package/dist/stores/memory.js +121 -0
- package/dist/stores/memory.js.map +1 -0
- package/dist/stores/types.d.ts +74 -0
- package/dist/stores/types.js +11 -0
- package/dist/stores/types.js.map +1 -0
- package/dist/telemetry/mcp-client.d.ts +22 -0
- package/dist/telemetry/mcp-client.js +140 -0
- package/dist/telemetry/mcp-client.js.map +1 -0
- package/dist/telemetry/metrics.d.ts +41 -0
- package/dist/telemetry/metrics.js +103 -0
- package/dist/telemetry/metrics.js.map +1 -0
- package/dist/telemetry/runtime.d.ts +9 -0
- package/dist/telemetry/runtime.js +118 -0
- package/dist/telemetry/runtime.js.map +1 -0
- package/dist/transports/mcp/admin-tools.d.ts +56 -0
- package/dist/transports/mcp/admin-tools.js +252 -0
- package/dist/transports/mcp/admin-tools.js.map +1 -0
- package/dist/transports/mcp/app-status-html.d.ts +11 -0
- package/dist/transports/mcp/app-status-html.js +899 -0
- package/dist/transports/mcp/app-status-html.js.map +1 -0
- package/dist/transports/mcp/client-presentation.d.ts +16 -0
- package/dist/transports/mcp/client-presentation.js +13 -0
- package/dist/transports/mcp/client-presentation.js.map +1 -0
- package/dist/transports/mcp/cowork-editor-url.d.ts +6 -0
- package/dist/transports/mcp/cowork-editor-url.js +10 -0
- package/dist/transports/mcp/cowork-editor-url.js.map +1 -0
- package/dist/transports/mcp/decision-card-html.d.ts +26 -0
- package/dist/transports/mcp/decision-card-html.js +876 -0
- package/dist/transports/mcp/decision-card-html.js.map +1 -0
- package/dist/transports/mcp/decision-elicitation.d.ts +116 -0
- package/dist/transports/mcp/decision-elicitation.js +292 -0
- package/dist/transports/mcp/decision-elicitation.js.map +1 -0
- package/dist/transports/mcp/dispatch-probe.d.ts +24 -0
- package/dist/transports/mcp/dispatch-probe.js +48 -0
- package/dist/transports/mcp/dispatch-probe.js.map +1 -0
- package/dist/transports/mcp/editor-document-probe.d.ts +4 -0
- package/dist/transports/mcp/editor-document-probe.js +35 -0
- package/dist/transports/mcp/editor-document-probe.js.map +1 -0
- package/dist/transports/mcp/editor-integration-setup-url.d.ts +8 -0
- package/dist/transports/mcp/editor-integration-setup-url.js +23 -0
- package/dist/transports/mcp/editor-integration-setup-url.js.map +1 -0
- package/dist/transports/mcp/format-tool-content.d.ts +20 -0
- package/dist/transports/mcp/format-tool-content.js +89 -0
- package/dist/transports/mcp/format-tool-content.js.map +1 -0
- package/dist/transports/mcp/instructions/index.d.ts +23 -0
- package/dist/transports/mcp/instructions/index.js +81 -0
- package/dist/transports/mcp/instructions/index.js.map +1 -0
- package/dist/transports/mcp/instructions/result.d.ts +18 -0
- package/dist/transports/mcp/instructions/result.js +58 -0
- package/dist/transports/mcp/instructions/result.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/ask-user.d.ts +2 -0
- package/dist/transports/mcp/instructions/tools/ask-user.js +17 -0
- package/dist/transports/mcp/instructions/tools/ask-user.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/check-app-progress.d.ts +3 -0
- package/dist/transports/mcp/instructions/tools/check-app-progress.js +75 -0
- package/dist/transports/mcp/instructions/tools/check-app-progress.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/check-publish-progress.d.ts +3 -0
- package/dist/transports/mcp/instructions/tools/check-publish-progress.js +23 -0
- package/dist/transports/mcp/instructions/tools/check-publish-progress.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/copy.d.ts +14 -0
- package/dist/transports/mcp/instructions/tools/copy.js +35 -0
- package/dist/transports/mcp/instructions/tools/copy.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/create-integration.d.ts +4 -0
- package/dist/transports/mcp/instructions/tools/create-integration.js +41 -0
- package/dist/transports/mcp/instructions/tools/create-integration.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/edit-app.d.ts +2 -0
- package/dist/transports/mcp/instructions/tools/edit-app.js +18 -0
- package/dist/transports/mcp/instructions/tools/edit-app.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/get-app.d.ts +3 -0
- package/dist/transports/mcp/instructions/tools/get-app.js +47 -0
- package/dist/transports/mcp/instructions/tools/get-app.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/get-integration-metadata.d.ts +2 -0
- package/dist/transports/mcp/instructions/tools/get-integration-metadata.js +13 -0
- package/dist/transports/mcp/instructions/tools/get-integration-metadata.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/index.d.ts +7 -0
- package/dist/transports/mcp/instructions/tools/index.js +26 -0
- package/dist/transports/mcp/instructions/tools/index.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/preview-app.d.ts +3 -0
- package/dist/transports/mcp/instructions/tools/preview-app.js +14 -0
- package/dist/transports/mcp/instructions/tools/preview-app.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/publish-app.d.ts +3 -0
- package/dist/transports/mcp/instructions/tools/publish-app.js +23 -0
- package/dist/transports/mcp/instructions/tools/publish-app.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/start-app.d.ts +2 -0
- package/dist/transports/mcp/instructions/tools/start-app.js +22 -0
- package/dist/transports/mcp/instructions/tools/start-app.js.map +1 -0
- package/dist/transports/mcp/instructions/tools/upload-artifact.d.ts +2 -0
- package/dist/transports/mcp/instructions/tools/upload-artifact.js +13 -0
- package/dist/transports/mcp/instructions/tools/upload-artifact.js.map +1 -0
- package/dist/transports/mcp/mcp-app-brand-css.d.ts +1 -0
- package/dist/transports/mcp/mcp-app-brand-css.js +180 -0
- package/dist/transports/mcp/mcp-app-brand-css.js.map +1 -0
- package/dist/transports/mcp/mount.d.ts +22 -0
- package/dist/transports/mcp/mount.js +1040 -0
- package/dist/transports/mcp/mount.js.map +1 -0
- package/dist/transports/mcp/native-browser-presence.d.ts +45 -0
- package/dist/transports/mcp/native-browser-presence.js +158 -0
- package/dist/transports/mcp/native-browser-presence.js.map +1 -0
- package/dist/transports/mcp/plan-approval.d.ts +38 -0
- package/dist/transports/mcp/plan-approval.js +175 -0
- package/dist/transports/mcp/plan-approval.js.map +1 -0
- package/dist/transports/mcp/progress-notifier.d.ts +39 -0
- package/dist/transports/mcp/progress-notifier.js +52 -0
- package/dist/transports/mcp/progress-notifier.js.map +1 -0
- package/dist/transports/mcp/session-directory.d.ts +7 -0
- package/dist/transports/mcp/session-directory.js +18 -0
- package/dist/transports/mcp/session-directory.js.map +1 -0
- package/dist/transports/mcp/tool-names.d.ts +2 -0
- package/dist/transports/mcp/tool-names.js +2 -0
- package/dist/transports/mcp/tool-names.js.map +1 -0
- package/package.json +78 -0
- package/skills/superblocks-build/SKILL.md +59 -0
- 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":"AAAA;;;;;;GAMG;AAEH,uEAAuE;AACvE,MAAM,eAAe,GAAa;IAChC,oEAAoE;IACpE,+EAA+E;IAC/E,0CAA0C;IAC1C,2BAA2B;IAC3B,uBAAuB;IACvB,wCAAwC;IACxC,iDAAiD;IACjD,sFAAsF;IACtF,0CAA0C;IAC1C,qFAAqF;CACtF,CAAC;AAEF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,SAAS;IACT,QAAQ;IACR,eAAe;IACf,IAAI;IACJ,MAAM;IACN,kBAAkB;IAClB,KAAK;IACL,sBAAsB;IACtB,WAAW;IACX,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,OAAO;IACP,WAAW;CACZ,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC;IAChC,mBAAmB;IACnB,eAAe;IACf,WAAW;IACX,WAAW;IACX,aAAa;IACb,aAAa;IACb,WAAW;IACX,YAAY;CACb,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAC7C,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,CAAC;QACtC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,YAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IAC/D,IAAI,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,CACL,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACxC,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC/B,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7B,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC5B,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC7B,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;QAChC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC;QAClC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC/B,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC;QACjC,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAc;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CACvC,KAAgC,CACjC,EAAE,CAAC;YACF,MAAM,eAAe,GAAG,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,IAAI,IAAI,CAAC;YACpE,IAAI,CAAC,eAAe,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9C,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;gBACpB,SAAS;YACX,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/E,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,gCAAgC,CAC9C,KAA8B;IAE9B,OAAO,0BAA0B,CAAC,KAAK,CAA4B,CAAC;AACtE,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAc;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK;aACT,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;aACxC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IACD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC5E,IACE,OAAO,KAAK,KAAK,SAAS;YAC1B,KAAK,IAAI,IAAI;YACb,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,EAC/C,CAAC;YACD,SAAS;QACX,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -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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"}
|