super-dsh 0.1.6 → 0.1.10-e
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/README.md +25 -3
- package/agent-agy/cordis.patch.yml +7 -4
- package/agent-agy/dist/agent.d.ts +12 -11
- package/agent-agy/dist/agy-auth-gateway.d.ts +124 -0
- package/agent-agy/dist/agy-auth-gateway.js +233 -0
- package/agent-agy/dist/agy-auth.d.ts +153 -0
- package/agent-agy/dist/agy-auth.js +179 -0
- package/agent-agy/dist/agy-cli-client.d.ts +39 -9
- package/agent-agy/dist/agy-cli-client.js +82 -18
- package/agent-agy/dist/agy-store.d.ts +8 -0
- package/agent-agy/dist/index.d.ts +46 -16
- package/agent-agy/dist/index.js +82 -56
- package/agent-agy/dist/models.d.ts +70 -0
- package/agent-agy/dist/models.js +102 -3
- package/agent-agy/package.json +7 -5
- package/agent-agy-sdk/cordis.patch.yml +58 -0
- package/agent-agy-sdk/dist/adapter.d.ts +15 -0
- package/agent-agy-sdk/dist/adapter.js +42 -0
- package/agent-agy-sdk/dist/agent-preset-agy.d.ts +27 -0
- package/agent-agy-sdk/dist/agent-preset-agy.js +32 -0
- package/agent-agy-sdk/dist/agent.d.ts +138 -0
- package/agent-agy-sdk/dist/agent.js +494 -0
- package/{agent-agy → agent-agy-sdk}/dist/agy-client.d.ts +26 -6
- package/{agent-agy → agent-agy-sdk}/dist/agy-client.js +43 -25
- package/agent-agy-sdk/dist/agy-sessions.d.ts +25 -0
- package/agent-agy-sdk/dist/agy-sessions.js +107 -0
- package/agent-agy-sdk/dist/agy-store.d.ts +39 -0
- package/agent-agy-sdk/dist/agy-store.js +83 -0
- package/agent-agy-sdk/dist/inbox.d.ts +26 -0
- package/agent-agy-sdk/dist/inbox.js +53 -0
- package/agent-agy-sdk/dist/index.d.ts +93 -0
- package/agent-agy-sdk/dist/index.js +476 -0
- package/agent-agy-sdk/dist/models.d.ts +41 -0
- package/agent-agy-sdk/dist/models.js +74 -0
- package/agent-agy-sdk/dist/sdk-venv.d.ts +76 -0
- package/agent-agy-sdk/dist/sdk-venv.js +173 -0
- package/agent-agy-sdk/dist/world-plugin.d.ts +10 -0
- package/agent-agy-sdk/dist/world-plugin.js +82 -0
- package/agent-agy-sdk/package.json +64 -0
- package/agent-claude/dist/adapter.js +106 -31
- package/agent-claude/dist/agent.js +154 -17
- package/agent-claude/dist/claude-client.js +84 -43
- package/agent-claude/dist/claude-launch.js +101 -0
- package/agent-claude/dist/claude-native-config.js +169 -0
- package/agent-claude/dist/claude-provider-gateway.js +340 -0
- package/agent-claude/dist/claude-providers.js +391 -0
- package/agent-claude/dist/claude-route.js +152 -0
- package/agent-claude/dist/index.js +214 -37
- package/agent-claude/dist/models.js +14 -0
- package/agent-claude/dist/sdk-runtime.js +320 -0
- package/agent-claude/package.json +6 -4
- package/agent-codex/README.md +141 -36
- package/agent-codex/cordis.patch.yml +14 -10
- package/agent-codex/dist/adapter.js +64 -28
- package/agent-codex/dist/agent.js +255 -81
- package/agent-codex/dist/app-server-approvals.js +165 -0
- package/agent-codex/dist/app-server-client.js +723 -0
- package/agent-codex/dist/app-server-events.js +432 -0
- package/agent-codex/dist/app-server-protocol.js +95 -0
- package/agent-codex/dist/app-server-wire.js +299 -0
- package/agent-codex/dist/codex-launch.js +78 -0
- package/agent-codex/dist/codex-native-config.js +392 -0
- package/agent-codex/dist/codex-provider-gateway.js +402 -0
- package/agent-codex/dist/codex-providers.js +376 -0
- package/agent-codex/dist/codex-route.js +86 -0
- package/agent-codex/dist/index.js +256 -115
- package/agent-codex/dist/permission.js +75 -1
- package/agent-codex/package.json +1 -2
- package/agent-codex-sdk/README.md +79 -0
- package/agent-codex-sdk/cordis.patch.yml +81 -0
- package/agent-codex-sdk/dist/adapter.js +91 -0
- package/agent-codex-sdk/dist/agent-preset-codex.js +32 -0
- package/agent-codex-sdk/dist/agent.js +1085 -0
- package/agent-codex-sdk/dist/codex-native-config.js +392 -0
- package/agent-codex-sdk/dist/codex-provider-gateway.js +402 -0
- package/agent-codex-sdk/dist/codex-providers.js +376 -0
- package/agent-codex-sdk/dist/codex-route.js +86 -0
- package/{agent-codex/dist/codex-client.js → agent-codex-sdk/dist/codex-sdk-client.js} +253 -32
- package/agent-codex-sdk/dist/codex-sdk-launch.js +92 -0
- package/agent-codex-sdk/dist/codex-store.js +180 -0
- package/agent-codex-sdk/dist/inbox.js +53 -0
- package/agent-codex-sdk/dist/index.js +739 -0
- package/agent-codex-sdk/dist/permission.js +71 -0
- package/agent-codex-sdk/dist/sdk-runtime.js +307 -0
- package/agent-codex-sdk/dist/session-map.js +167 -0
- package/agent-codex-sdk/dist/world-plugin.js +93 -0
- package/agent-codex-sdk/package.json +79 -0
- package/agent-codex-sdk/scripts/fetch-sdk-runtime.mjs +57 -0
- package/agent-omp/README.md +72 -55
- package/agent-omp/dist/agent.js +36 -11
- package/agent-omp/dist/index.js +92 -52
- package/agent-omp/dist/lazy-rpc.js +11 -4
- package/agent-omp/dist/omp-cli.js +114 -97
- package/agent-omp/dist/omp-store.js +12 -4
- package/agent-omp/dist/permission.js +70 -5
- package/agent-omp/dist/rpc-client.js +409 -0
- package/agent-omp/dist/world-plugin.js +36 -3
- package/agent-omp/package.json +2 -6
- package/agent-omp-sdk/README.md +103 -0
- package/agent-omp-sdk/cordis.patch.yml +108 -0
- package/agent-omp-sdk/dist/adapter.d.ts +21 -0
- package/agent-omp-sdk/dist/adapter.js +36 -0
- package/agent-omp-sdk/dist/agent-preset-omp.d.ts +31 -0
- package/agent-omp-sdk/dist/agent-preset-omp.js +32 -0
- package/agent-omp-sdk/dist/agent.d.ts +64 -0
- package/agent-omp-sdk/dist/agent.js +1178 -0
- package/agent-omp-sdk/dist/discovery.d.ts +57 -0
- package/agent-omp-sdk/dist/discovery.js +116 -0
- package/agent-omp-sdk/dist/inbox.d.ts +28 -0
- package/agent-omp-sdk/dist/inbox.js +53 -0
- package/agent-omp-sdk/dist/index.d.ts +60 -0
- package/agent-omp-sdk/dist/index.js +632 -0
- package/agent-omp-sdk/dist/knobs.d.ts +34 -0
- package/agent-omp-sdk/dist/knobs.js +50 -0
- package/agent-omp-sdk/dist/lazy-rpc.d.ts +98 -0
- package/agent-omp-sdk/dist/lazy-rpc.js +178 -0
- package/agent-omp-sdk/dist/mobile/zoom-guard.d.ts +187 -0
- package/agent-omp-sdk/dist/mobile/zoom-guard.js +294 -0
- package/agent-omp-sdk/dist/mobile-boot.d.ts +49 -0
- package/agent-omp-sdk/dist/mobile-boot.js +38 -0
- package/agent-omp-sdk/dist/models.d.ts +39 -0
- package/agent-omp-sdk/dist/models.js +299 -0
- package/agent-omp-sdk/dist/omp-cli.d.ts +67 -0
- package/agent-omp-sdk/dist/omp-cli.js +164 -0
- package/agent-omp-sdk/dist/omp-disk-discovery.d.ts +27 -0
- package/agent-omp-sdk/dist/omp-disk-discovery.js +178 -0
- package/agent-omp-sdk/dist/omp-executable.d.ts +2 -0
- package/agent-omp-sdk/dist/omp-executable.js +30 -0
- package/agent-omp-sdk/dist/omp-store.d.ts +134 -0
- package/agent-omp-sdk/dist/omp-store.js +526 -0
- package/agent-omp-sdk/dist/pairing.d.ts +7 -0
- package/agent-omp-sdk/dist/pairing.js +45 -0
- package/agent-omp-sdk/dist/permission.d.ts +138 -0
- package/agent-omp-sdk/dist/permission.js +161 -0
- package/agent-omp-sdk/dist/protocol.d.ts +189 -0
- package/agent-omp-sdk/dist/rpc-types.d.ts +77 -0
- package/agent-omp-sdk/dist/rpc-types.js +1 -0
- package/agent-omp-sdk/dist/sdk-client.d.ts +160 -0
- package/{agent-omp → agent-omp-sdk}/dist/sdk-client.js +108 -56
- package/agent-omp-sdk/dist/sdk-runtime.d.ts +211 -0
- package/agent-omp-sdk/dist/sdk-runtime.js +418 -0
- package/agent-omp-sdk/dist/sidecar-client.d.ts +87 -0
- package/agent-omp-sdk/dist/sidecar-client.js +197 -0
- package/agent-omp-sdk/dist/store/adapter.d.ts +17 -0
- package/agent-omp-sdk/dist/store/adapter.js +47 -0
- package/agent-omp-sdk/dist/store/db.d.ts +70 -0
- package/agent-omp-sdk/dist/store/db.js +210 -0
- package/agent-omp-sdk/dist/store/index.d.ts +23 -0
- package/agent-omp-sdk/dist/store/index.js +59 -0
- package/agent-omp-sdk/dist/store/reconcile.d.ts +15 -0
- package/agent-omp-sdk/dist/store/reconcile.js +51 -0
- package/agent-omp-sdk/dist/store/schema.d.ts +8 -0
- package/agent-omp-sdk/dist/store/schema.js +40 -0
- package/agent-omp-sdk/dist/transport.d.ts +49 -0
- package/agent-omp-sdk/dist/transport.js +35 -0
- package/agent-omp-sdk/dist/world-home.d.ts +4 -0
- package/agent-omp-sdk/dist/world-home.js +23 -0
- package/agent-omp-sdk/dist/world-plugin.d.ts +10 -0
- package/agent-omp-sdk/dist/world-plugin.js +137 -0
- package/agent-omp-sdk/package.json +87 -0
- package/client/index.js +1883 -287
- package/cordis.patch.yml +80 -0
- package/package.json +23 -9
- package/superd-hub/dist/a2a-delivery.d.ts +189 -0
- package/superd-hub/dist/a2a-delivery.js +240 -0
- package/superd-hub/dist/a2a-host.d.ts +76 -0
- package/superd-hub/dist/a2a-host.js +145 -0
- package/superd-hub/dist/a2a-ingest.d.ts +31 -0
- package/superd-hub/dist/a2a-ingest.js +636 -0
- package/superd-hub/dist/a2a-log.d.ts +17 -0
- package/superd-hub/dist/a2a-log.js +42 -0
- package/superd-hub/dist/a2a-row.d.ts +65 -0
- package/superd-hub/dist/a2a-row.js +162 -0
- package/superd-hub/dist/a2a-service.d.ts +357 -0
- package/superd-hub/dist/a2a-service.js +980 -0
- package/superd-hub/dist/a2a-wire.d.ts +220 -0
- package/superd-hub/dist/a2a-wire.js +305 -0
- package/superd-hub/dist/agent-ids.d.ts +10 -0
- package/superd-hub/dist/agent-ids.js +68 -0
- package/superd-hub/dist/agent-roster.d.ts +29 -18
- package/superd-hub/dist/agent-roster.js +54 -15
- package/superd-hub/dist/agent-status.d.ts +119 -0
- package/superd-hub/dist/agent-status.js +386 -0
- package/superd-hub/dist/client/agent-settings.d.ts +210 -0
- package/superd-hub/dist/client/agent-settings.js +300 -0
- package/superd-hub/dist/client/mesh-api.d.ts +134 -0
- package/superd-hub/dist/client/mesh-api.js +219 -0
- package/superd-hub/dist/client/mesh-groups.d.ts +63 -0
- package/superd-hub/dist/client/mesh-groups.js +66 -0
- package/superd-hub/dist/client/roster.d.ts +48 -0
- package/superd-hub/dist/client/roster.js +102 -0
- package/superd-hub/dist/client/runtime-settings-api.d.ts +76 -0
- package/superd-hub/dist/client/runtime-settings-api.js +137 -0
- package/superd-hub/dist/client/switch.d.ts +165 -0
- package/superd-hub/dist/client/switch.js +295 -0
- package/superd-hub/dist/exec-pty-channel.d.ts +58 -0
- package/superd-hub/dist/exec-pty-channel.js +162 -0
- package/superd-hub/dist/exec-pty-framing.d.ts +32 -0
- package/superd-hub/dist/exec-pty-framing.js +81 -0
- package/superd-hub/dist/exec-pty-rpc.d.ts +21 -0
- package/superd-hub/dist/exec-pty-rpc.js +128 -0
- package/superd-hub/dist/exec-pty-session.d.ts +76 -0
- package/superd-hub/dist/exec-pty-session.js +234 -0
- package/superd-hub/dist/exec.d.ts +56 -0
- package/superd-hub/dist/exec.js +225 -0
- package/superd-hub/dist/gateway.d.ts +39 -2
- package/superd-hub/dist/gateway.js +62 -3
- package/superd-hub/dist/hub-tool.d.ts +174 -0
- package/superd-hub/dist/hub-tool.js +464 -0
- package/superd-hub/dist/index.d.ts +15 -1
- package/superd-hub/dist/index.js +16 -0
- package/superd-hub/dist/machines.d.ts +45 -0
- package/superd-hub/dist/machines.js +125 -0
- package/superd-hub/dist/mesh-federate.d.ts +138 -0
- package/superd-hub/dist/mesh-federate.js +223 -0
- package/superd-hub/dist/mesh-gateway.d.ts +67 -0
- package/superd-hub/dist/mesh-gateway.js +408 -0
- package/superd-hub/dist/mesh-link.d.ts +274 -0
- package/superd-hub/dist/mesh-link.js +441 -0
- package/superd-hub/dist/mesh-rpc.d.ts +123 -0
- package/superd-hub/dist/mesh-rpc.js +250 -0
- package/superd-hub/dist/mux-client.d.ts +71 -0
- package/superd-hub/dist/mux-client.js +281 -0
- package/superd-hub/dist/pack-version.d.ts +2 -0
- package/superd-hub/dist/pack-version.js +30 -0
- package/superd-hub/dist/roster.d.ts +6 -0
- package/superd-hub/dist/rpc.d.ts +18 -2
- package/superd-hub/dist/rpc.js +34 -4
- package/superd-hub/dist/spawn-world.js +3 -1
- package/superd-hub/dist/switch-core.d.ts +62 -25
- package/superd-hub/dist/switch-core.js +53 -30
- package/superd-hub/dist/system-head.d.ts +22 -12
- package/superd-hub/dist/system-head.js +100 -84
- package/superd-hub/dist/wire-endpoints.d.ts +264 -0
- package/superd-hub/dist/wire-endpoints.js +180 -0
- package/superd-hub/lib/client/index.js +1883 -287
- package/superd-hub/package.json +11 -2
- package/agent-agy/dist/agent-preset-projection.d.ts +0 -31
- package/agent-agy/dist/agent-preset-projection.js +0 -33
- package/agent-claude/dist/agent-preset-projection.js +0 -30
- package/agent-codex/dist/agent-preset-projection.js +0 -37
- package/agent-codex/dist/app-home.js +0 -65
- package/agent-codex/dist/models.js +0 -152
- package/agent-codex/dist/spike.js +0 -46
- package/agent-hermes/dist/agent-preset-projection.js +0 -34
- package/agent-omp/dist/agent-preset-projection.js +0 -36
- package/agent-omp/dist/app-home.js +0 -86
- package/agent-omp/dist/sidecar-client.js +0 -195
- package/agent-pi/dist/agent-preset-projection.js +0 -29
- package/superd-hub/dist/client-shim.d.ts +0 -28
- package/superd-hub/dist/client-shim.js +0 -251
- package/superd-hub/dist/index-pass.d.ts +0 -22
- package/superd-hub/dist/index-pass.js +0 -47
- package/superd-hub/dist/labels.d.ts +0 -45
- package/superd-hub/dist/labels.js +0 -83
- /package/{agent-agy → agent-agy-sdk}/bridge/agy_bridge.py +0 -0
- /package/{agent-agy → agent-agy-sdk}/bridge/gemini_openai_server.mjs +0 -0
- /package/{agent-codex/dist/codex-events.js → agent-codex-sdk/dist/codex-sdk-events.js} +0 -0
- /package/{agent-omp → agent-omp-sdk}/dist/protocol.js +0 -0
- /package/{agent-omp → agent-omp-sdk}/sidecar/main.ts +0 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/** The four server-request method names that carry an approval decision. */
|
|
2
|
+
export const APPROVAL_METHODS = {
|
|
3
|
+
command: ["item/commandExecution/requestApproval", "execCommandApproval"],
|
|
4
|
+
fileChange: ["item/fileChange/requestApproval", "applyPatchApproval"],
|
|
5
|
+
};
|
|
6
|
+
/** Default answer timeout: fail closed (decline) after this long. `0` disables. */
|
|
7
|
+
export const DEFAULT_APPROVAL_TIMEOUT_MS = 300_000;
|
|
8
|
+
/** Parse `CODEX_APPROVAL_TIMEOUT_MS` (invalid/absent → the default). */
|
|
9
|
+
export function parseApprovalTimeout(raw) {
|
|
10
|
+
if (raw === undefined || raw.trim() === "")
|
|
11
|
+
return DEFAULT_APPROVAL_TIMEOUT_MS;
|
|
12
|
+
const value = Number(raw);
|
|
13
|
+
return Number.isFinite(value) && value >= 0 ? value : DEFAULT_APPROVAL_TIMEOUT_MS;
|
|
14
|
+
}
|
|
15
|
+
function asRecord(value) {
|
|
16
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
17
|
+
return null;
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function asString(value) {
|
|
21
|
+
return typeof value === "string" && value !== "" ? value : undefined;
|
|
22
|
+
}
|
|
23
|
+
/** Human-facing command text: the modern single string, or the legacy argv array. */
|
|
24
|
+
function commandText(raw) {
|
|
25
|
+
const direct = asString(raw);
|
|
26
|
+
if (direct !== undefined)
|
|
27
|
+
return direct;
|
|
28
|
+
if (Array.isArray(raw)) {
|
|
29
|
+
const parts = raw.filter((part) => typeof part === "string");
|
|
30
|
+
return parts.length === 0 ? undefined : parts.join(" ");
|
|
31
|
+
}
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Recognize one approval server-request and normalize it; `null` for every
|
|
36
|
+
* other method (the caller answers those with {@link failClosedResponse}).
|
|
37
|
+
*/
|
|
38
|
+
export function describeApprovalRequest(method, params) {
|
|
39
|
+
const record = asRecord(params) ?? {};
|
|
40
|
+
const reason = asString(record["reason"]);
|
|
41
|
+
const itemId = asString(record["itemId"]);
|
|
42
|
+
const callId = itemId ?? asString(record["callId"]);
|
|
43
|
+
switch (method) {
|
|
44
|
+
case "item/commandExecution/requestApproval":
|
|
45
|
+
case "execCommandApproval": {
|
|
46
|
+
const command = commandText(record["command"]);
|
|
47
|
+
const description = reason ?? command;
|
|
48
|
+
return {
|
|
49
|
+
kind: "command",
|
|
50
|
+
toolName: "command_execution",
|
|
51
|
+
...(callId === undefined ? {} : { callId }),
|
|
52
|
+
...(description === undefined ? {} : { reason: description }),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
case "item/fileChange/requestApproval":
|
|
56
|
+
case "applyPatchApproval":
|
|
57
|
+
return {
|
|
58
|
+
kind: "fileChange",
|
|
59
|
+
toolName: "file_change",
|
|
60
|
+
...(callId === undefined ? {} : { callId }),
|
|
61
|
+
...(reason === undefined ? {} : { reason }),
|
|
62
|
+
};
|
|
63
|
+
default:
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Whether a DSH approval outcome grants the action (`allowed-once` is the only grant). */
|
|
68
|
+
export function isGrant(outcome) {
|
|
69
|
+
return outcome === "allowed-once";
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Build the wire answer for one approval request from a DSH outcome.
|
|
73
|
+
* Only an explicit one-shot grant approves; everything else declines.
|
|
74
|
+
*/
|
|
75
|
+
export function approvalResponse(method, outcome) {
|
|
76
|
+
const granted = isGrant(outcome);
|
|
77
|
+
switch (method) {
|
|
78
|
+
case "item/commandExecution/requestApproval":
|
|
79
|
+
case "item/fileChange/requestApproval":
|
|
80
|
+
return { result: { decision: granted ? "accept" : "decline" } };
|
|
81
|
+
case "execCommandApproval":
|
|
82
|
+
case "applyPatchApproval":
|
|
83
|
+
// Legacy `ReviewDecision`: a plain `"approved"`, or a structured denial.
|
|
84
|
+
return { result: { decision: granted ? "approved" : { denied: { rejection: `denied by the user (${outcome})` } } } };
|
|
85
|
+
default:
|
|
86
|
+
return failClosedResponse(method);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* The honest "we cannot service this" answer. Structured declines are used
|
|
91
|
+
* where the protocol defines a no-op shape; everything else gets a JSON-RPC
|
|
92
|
+
* method-not-found so the server resolves the pending request immediately
|
|
93
|
+
* instead of waiting forever.
|
|
94
|
+
*/
|
|
95
|
+
export function failClosedResponse(method) {
|
|
96
|
+
switch (method) {
|
|
97
|
+
case "item/tool/requestUserInput":
|
|
98
|
+
return { result: { answers: {} } };
|
|
99
|
+
case "mcpServer/elicitation/request":
|
|
100
|
+
return { result: { action: "decline", content: null, _meta: null } };
|
|
101
|
+
default:
|
|
102
|
+
return { error: { code: -32601, message: `Super D does not handle the app-server request "${method}"` } };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Race an approval answer against the timeout. On timeout the signal aborts
|
|
107
|
+
* (withdrawing the question from the UI) and we fail closed as `"cancelled"`.
|
|
108
|
+
*/
|
|
109
|
+
async function raceApproval(request, controller, timeoutMs) {
|
|
110
|
+
if (timeoutMs <= 0)
|
|
111
|
+
return request;
|
|
112
|
+
let timer;
|
|
113
|
+
try {
|
|
114
|
+
return await Promise.race([
|
|
115
|
+
request,
|
|
116
|
+
new Promise((resolve) => {
|
|
117
|
+
timer = setTimeout(() => {
|
|
118
|
+
controller.abort();
|
|
119
|
+
resolve("cancelled");
|
|
120
|
+
}, timeoutMs);
|
|
121
|
+
timer.unref?.();
|
|
122
|
+
}),
|
|
123
|
+
]);
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
clearTimeout(timer);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Build the transport-level server-request handler. The returned function never
|
|
131
|
+
* throws: every failure path answers fail-closed.
|
|
132
|
+
*/
|
|
133
|
+
export function makeApprovalHandler(deps) {
|
|
134
|
+
return async (request) => {
|
|
135
|
+
const ask = describeApprovalRequest(request.method, request.params);
|
|
136
|
+
if (ask === null) {
|
|
137
|
+
deps.trace?.(`approval: unsupported server-request ${request.method} → fail-closed answer`);
|
|
138
|
+
return failClosedResponse(request.method);
|
|
139
|
+
}
|
|
140
|
+
const answerer = deps.getApproval();
|
|
141
|
+
if (answerer === undefined) {
|
|
142
|
+
// Fail closed: without an answerer the tool must not run.
|
|
143
|
+
deps.trace?.(`approval: no approval service mounted → decline ${ask.kind}`);
|
|
144
|
+
return approvalResponse(request.method, "unavailable");
|
|
145
|
+
}
|
|
146
|
+
const controller = new AbortController();
|
|
147
|
+
try {
|
|
148
|
+
const outcome = await raceApproval(answerer.request({
|
|
149
|
+
agent: deps.agent,
|
|
150
|
+
toolName: ask.toolName,
|
|
151
|
+
...(ask.callId === undefined || deps.asCallId === undefined ? {} : { callId: deps.asCallId(ask.callId) }),
|
|
152
|
+
...(ask.reason === undefined ? {} : { reason: ask.reason }),
|
|
153
|
+
signal: controller.signal,
|
|
154
|
+
}), controller, deps.timeoutMs);
|
|
155
|
+
deps.trace?.(`approval: ${ask.kind} → ${outcome}`);
|
|
156
|
+
return approvalResponse(request.method, outcome);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
// A synchronous throw (no open turn / audit append failure) still denies
|
|
160
|
+
// rather than hanging Codex.
|
|
161
|
+
deps.trace?.(`approval: request failed (${String(error)}) → decline`);
|
|
162
|
+
return approvalResponse(request.method, "unavailable");
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
}
|