zcode-acp-server 0.76.2 → 0.77.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -29
- package/README.zh-CN.md +22 -22
- package/dist/account-setup.d.ts +9 -0
- package/dist/account-setup.d.ts.map +1 -0
- package/dist/account-setup.js +80 -0
- package/dist/account-setup.js.map +1 -0
- package/dist/backend/credentials.d.ts +3 -3
- package/dist/backend/credentials.d.ts.map +1 -1
- package/dist/backend/credentials.js +5 -5
- package/dist/backend/credentials.js.map +1 -1
- package/dist/backend/resolve.d.ts +11 -1
- package/dist/backend/resolve.d.ts.map +1 -1
- package/dist/backend/resolve.js +14 -1
- package/dist/backend/resolve.js.map +1 -1
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -1
- package/dist/cli.js.map +1 -1
- package/dist/code-fingerprint.json +2 -2
- package/dist/config/account-provider.d.ts +32 -0
- package/dist/config/account-provider.d.ts.map +1 -1
- package/dist/config/account-provider.js +36 -6
- package/dist/config/account-provider.js.map +1 -1
- package/dist/config/bridge-accounts.d.ts +40 -0
- package/dist/config/bridge-accounts.d.ts.map +1 -0
- package/dist/config/bridge-accounts.js +193 -0
- package/dist/config/bridge-accounts.js.map +1 -0
- package/dist/config/options.d.ts.map +1 -1
- package/dist/config/options.js +2 -1
- package/dist/config/options.js.map +1 -1
- package/dist/config/provider-registry.d.ts.map +1 -1
- package/dist/config/provider-registry.js +2 -2
- package/dist/config/provider-registry.js.map +1 -1
- package/dist/handlers/session-titles.d.ts.map +1 -1
- package/dist/handlers/session-titles.js +6 -0
- package/dist/handlers/session-titles.js.map +1 -1
- package/dist/handlers/session.d.ts +0 -26
- package/dist/handlers/session.d.ts.map +1 -1
- package/dist/handlers/session.js +91 -126
- package/dist/handlers/session.js.map +1 -1
- package/dist/remote/session-close-endpoint.d.ts.map +1 -1
- package/dist/remote/session-close-endpoint.js +5 -2
- package/dist/remote/session-close-endpoint.js.map +1 -1
- package/dist/server.d.ts +29 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +42 -0
- package/dist/server.js.map +1 -1
- package/dist/tasks-index.d.ts.map +1 -1
- package/dist/tasks-index.js +5 -2
- package/dist/tasks-index.js.map +1 -1
- package/docs/BACKLOG.md +45 -6
- package/docs/adr/0006-remote-session-close.md +18 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/config/provider-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"provider-registry.js","sourceRoot":"","sources":["../../src/config/provider-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-titles.d.ts","sourceRoot":"","sources":["../../src/handlers/session-titles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAoBnD,qBAAa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM;IAKpD,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;YAWtB,cAAc;
|
|
1
|
+
{"version":3,"file":"session-titles.d.ts","sourceRoot":"","sources":["../../src/handlers/session-titles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAoBnD,qBAAa,oBAAqB,YAAW,aAAa;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEd,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM;IAKpD,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;YAWtB,cAAc;CAqE7B"}
|
|
@@ -100,6 +100,12 @@ export class SessionTitleListener {
|
|
|
100
100
|
return;
|
|
101
101
|
for (const sid of aliases) {
|
|
102
102
|
this.server.sessionTitles.set(sid, title);
|
|
103
|
+
// A trailing title push from the dying conversation must not resurrect
|
|
104
|
+
// an alias retired by a remote close (ADR-0006) — a summary recreated
|
|
105
|
+
// here with a title would re-advertise it. The stamp clears on the
|
|
106
|
+
// next genuine use (markSessionActive).
|
|
107
|
+
if (this.server.discoveryRetiredAt.has(sid))
|
|
108
|
+
continue;
|
|
103
109
|
this.server.touchSessionSummary(sid, title);
|
|
104
110
|
refreshTerminalTabTitle(this.server, sid);
|
|
105
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-titles.js","sourceRoot":"","sources":["../../src/handlers/session-titles.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"session-titles.js","sourceRoot":"","sources":["../../src/handlers/session-titles.ts"],"names":[],"mappings":"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"}
|
|
@@ -284,32 +284,6 @@ export declare function withPreemptLock(server: ZcodeAcpServer, zcodeSid: string
|
|
|
284
284
|
* Exported for unit tests (multi-turn pendingTurns scenarios).
|
|
285
285
|
*/
|
|
286
286
|
export declare function preemptInFlightTurn(server: ZcodeAcpServer, zcodeSid: string, selfRequestId: number | string): boolean;
|
|
287
|
-
/** Concatenate text from ACP ContentBlock[] into a prompt string.
|
|
288
|
-
* Legacy compatibility helper; runtime prompts use convertPromptContent instead. */
|
|
289
|
-
export declare function extractPromptText(blocks: acp.ContentBlock[] | undefined): string;
|
|
290
|
-
/**
|
|
291
|
-
* ACP `ContentBlock::Image` → zcode `session/send` attachment.
|
|
292
|
-
*
|
|
293
|
-
* zcode's per-attachment normalizer accepts either a `localPath` (absolute FS
|
|
294
|
-
* path, preferred) or `dataBase64` + `mimeType` (raw base64, no data: prefix).
|
|
295
|
-
* ACP `ImageContent` carries `data` (base64) and an optional `uri`; when the
|
|
296
|
-
* uri is a file:// pointer we send localPath so the backend streams from disk
|
|
297
|
-
* instead of re-encoding.
|
|
298
|
-
*/
|
|
299
|
-
export interface ImageAttachment {
|
|
300
|
-
kind: "image";
|
|
301
|
-
filename: string;
|
|
302
|
-
mimeType: string;
|
|
303
|
-
sizeBytes?: number;
|
|
304
|
-
dataBase64?: string;
|
|
305
|
-
localPath?: string;
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* Extract image attachments from ACP ContentBlock[]. Non-image blocks are
|
|
309
|
-
* ignored (text/resource_link/resource stay owned by `extractPromptText`).
|
|
310
|
-
* Exported for unit testing.
|
|
311
|
-
*/
|
|
312
|
-
export declare function extractAttachments(blocks: acp.ContentBlock[] | undefined): ImageAttachment[];
|
|
313
287
|
/**
|
|
314
288
|
* Reload a session into the backend subprocess via `session/resume` — the
|
|
315
289
|
* recovery path after the backend evicted the resident runtime (idle timeout
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/handlers/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,KAAK,GAAG,MAAM,0BAA0B,CAAC;AAGrD,OAAO,EAAwB,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAGxF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/handlers/session.ts"],"names":[],"mappings":"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"}
|
package/dist/handlers/session.js
CHANGED
|
@@ -19,6 +19,7 @@ import { RequestError } from "@agentclientprotocol/sdk";
|
|
|
19
19
|
import { convertPromptContent } from "./prompt-content.js";
|
|
20
20
|
import { backendCapabilities } from "../backend/adapter.js";
|
|
21
21
|
import { EventStreamListener, TurnMonitor } from "../backend/listener.js";
|
|
22
|
+
import { disallowedToolList } from "../backend/resolve.js";
|
|
22
23
|
import { resolveReal } from "../backend/sandbox.js";
|
|
23
24
|
import { buildModes, buildConfigOptions, DEFAULT_MODEL_ID, DEFAULT_PROVIDER_ID, formatModelValue, loadAllModels, modelContextWindow, parseModelValue, } from "../config/options.js";
|
|
24
25
|
import { currentModelCached, emitInitialUsage } from "../config/model-cache.js";
|
|
@@ -85,6 +86,53 @@ async function workflowFlag(server) {
|
|
|
85
86
|
}
|
|
86
87
|
return { dynamicWorkflowEnabled: true };
|
|
87
88
|
}
|
|
89
|
+
/**
|
|
90
|
+
* Per-session tool denylist (#340). The app-server command path parses
|
|
91
|
+
* `--disallowed-tools` but never consumes it (upstream cli/src/run.ts hands
|
|
92
|
+
* `toolDisallowlist` to the prompt/TUI paths only), so the merged
|
|
93
|
+
* ZCODE_DISALLOWED_TOOLS + Cron* default list was silently dropped and every
|
|
94
|
+
* "disallowed" tool still reached the model. session/create AND session/resume
|
|
95
|
+
* take `toolDenylist` and project it onto `runtimeConfig.toolDisallowlist` — a
|
|
96
|
+
* registry-level removal (upstream server-operations.ts createRecord), the
|
|
97
|
+
* right layer for a process-wide policy. Resume must carry it too: a cold-
|
|
98
|
+
* recovered runtime is rebuilt from the resume params alone.
|
|
99
|
+
*
|
|
100
|
+
* Deliberately NOT sent on session/send: that per-turn list is only a
|
|
101
|
+
* provider-visibility hint, and a turn list holding every Cron mutation tool
|
|
102
|
+
* is upstream's "automation turn" signal (isAutomationMutationRestrictedTurn),
|
|
103
|
+
* which ordinary prompts must not spoof. Residual: session/fork has no
|
|
104
|
+
* tool-face field and its `inherit` does not copy the list, so a fork runs
|
|
105
|
+
* without it until its next resume.
|
|
106
|
+
*
|
|
107
|
+
* Omitted outright once this backend generation rejected the key
|
|
108
|
+
* (`server.toolDenylistRejected`) — see rejectsToolDenylistKey.
|
|
109
|
+
*/
|
|
110
|
+
function toolDenylistParam(server) {
|
|
111
|
+
if (server.toolDenylistRejected)
|
|
112
|
+
return {};
|
|
113
|
+
const list = disallowedToolList();
|
|
114
|
+
return list.length > 0 ? { toolDenylist: list } : {};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Pre-toolDenylist backend: strict zod rejects the key ("Unrecognized key:
|
|
118
|
+
* toolDenylist", quoted or bare). Word-bounded so an unrelated unrecognized
|
|
119
|
+
* key does not trigger the drop-and-retry.
|
|
120
|
+
*/
|
|
121
|
+
function rejectsToolDenylistKey(message) {
|
|
122
|
+
return !!message && /unrecognized/i.test(message) && /\btoolDenylist\b/i.test(message);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Record a toolDenylist schema rejection for this backend generation and say
|
|
126
|
+
* so ONCE — the user's tool policy is not applied on such a backend, which
|
|
127
|
+
* must not pass silently.
|
|
128
|
+
*/
|
|
129
|
+
function noteToolDenylistRejected(server, method) {
|
|
130
|
+
if (!server.toolDenylistRejected) {
|
|
131
|
+
warn(`${method}: backend rejects toolDenylist — retrying without it; ` +
|
|
132
|
+
`ZCODE_DISALLOWED_TOOLS / the Cron* default are NOT applied on this backend`);
|
|
133
|
+
}
|
|
134
|
+
server.toolDenylistRejected = true;
|
|
135
|
+
}
|
|
88
136
|
/**
|
|
89
137
|
* Cold-bridge menu catch-up: the `/` menu snapshot sent at session/new is
|
|
90
138
|
* filtered against the workflow gate, and on a COLD bridge (lazy session/new,
|
|
@@ -104,15 +152,17 @@ export function resendMenuAfterGateSettled(server, acpSid) {
|
|
|
104
152
|
}
|
|
105
153
|
/**
|
|
106
154
|
* Shared `session/resume` params builder: {sessionId, workspace} + optional
|
|
107
|
-
* session-lifetime mcpServers + the conditional dynamic-workflow flag
|
|
108
|
-
* resume construction site (session/resume,
|
|
109
|
-
* eviction/respawn reload) goes through here
|
|
155
|
+
* session-lifetime mcpServers + the conditional dynamic-workflow flag + the
|
|
156
|
+
* per-session tool denylist. Every resume construction site (session/resume,
|
|
157
|
+
* /resume adoption, session/load, eviction/respawn reload) goes through here
|
|
158
|
+
* so the param shape cannot drift.
|
|
110
159
|
*/
|
|
111
160
|
async function resumeParams(server, zcodeSid, cwd, mcpServers) {
|
|
112
161
|
const params = {
|
|
113
162
|
sessionId: zcodeSid,
|
|
114
163
|
workspace: workspaceFor(cwd),
|
|
115
164
|
...(await workflowFlag(server)),
|
|
165
|
+
...toolDenylistParam(server),
|
|
116
166
|
};
|
|
117
167
|
if (mcpServers)
|
|
118
168
|
params.mcpServers = mcpServers;
|
|
@@ -652,6 +702,7 @@ export async function ensureRealSession(server, acpSid, opts = {}) {
|
|
|
652
702
|
// Dynamic-workflow enable rides create only when the gate says so —
|
|
653
703
|
// workflowFlag writes nothing otherwise (strict zod).
|
|
654
704
|
...(await workflowFlag(server)),
|
|
705
|
+
...toolDenylistParam(server),
|
|
655
706
|
};
|
|
656
707
|
if (pending.mcpServers && pending.mcpServers.length > 0) {
|
|
657
708
|
createParams.mcpServers = pending.mcpServers;
|
|
@@ -666,16 +717,25 @@ export async function ensureRealSession(server, acpSid, opts = {}) {
|
|
|
666
717
|
log(`session/create carrying ${remembered.length} remembered client MCP server(s)`);
|
|
667
718
|
}
|
|
668
719
|
}
|
|
669
|
-
|
|
670
|
-
|
|
720
|
+
// Compat retries build on the params ACTUALLY sent last, so a second
|
|
721
|
+
// rejection does not resurrect a key the first retry already dropped.
|
|
722
|
+
let sent = createParams;
|
|
723
|
+
let resp = await backend.request(server.nextId(), "session/create", sent, 15000);
|
|
724
|
+
if (resp.error && sent.mode === "guarded" && rejectsModeGuarded(resp.error.message)) {
|
|
671
725
|
// 3.15.1's `guarded` on a pre-3.15 backend: the strict mode enum rejects
|
|
672
726
|
// it and the whole create dies. Retry without the mode key (the backend
|
|
673
727
|
// default then applies) and say so once — a session that works beats a
|
|
674
728
|
// configured mode that bricks session/new.
|
|
675
729
|
warn('session/create: backend rejects mode "guarded" — retrying with its default mode');
|
|
676
|
-
|
|
677
|
-
delete
|
|
678
|
-
resp = await backend.request(server.nextId(), "session/create",
|
|
730
|
+
sent = { ...sent };
|
|
731
|
+
delete sent.mode;
|
|
732
|
+
resp = await backend.request(server.nextId(), "session/create", sent, 15000);
|
|
733
|
+
}
|
|
734
|
+
if (resp.error && "toolDenylist" in sent && rejectsToolDenylistKey(resp.error.message)) {
|
|
735
|
+
noteToolDenylistRejected(server, "session/create");
|
|
736
|
+
sent = { ...sent };
|
|
737
|
+
delete sent.toolDenylist;
|
|
738
|
+
resp = await backend.request(server.nextId(), "session/create", sent, 15000);
|
|
679
739
|
}
|
|
680
740
|
if (resp.error) {
|
|
681
741
|
throw new Error(`zcode create failed: ${resp.error.message ?? ""}`);
|
|
@@ -1833,13 +1893,21 @@ export async function runOneTurn(server, opts) {
|
|
|
1833
1893
|
server.pendingTurns.delete(requestId);
|
|
1834
1894
|
// Turn end = session activity — refresh the discovery summary and mark the
|
|
1835
1895
|
// session discoverable regardless of outcome (end_turn, cancelled, retries
|
|
1836
|
-
// exhausted).
|
|
1837
|
-
//
|
|
1838
|
-
//
|
|
1839
|
-
//
|
|
1840
|
-
//
|
|
1841
|
-
//
|
|
1842
|
-
server.
|
|
1896
|
+
// exhausted). EXCEPT when a remote close retired the conversation while
|
|
1897
|
+
// this turn was running (ADR-0006 force close): the close deletes the
|
|
1898
|
+
// summary and only waits a bounded ~3s for the turn, so a turn settling
|
|
1899
|
+
// after that would re-advertise a conversation the user ended — the
|
|
1900
|
+
// desktop's row that vanished, resurrected, then lingered (2026-10-22).
|
|
1901
|
+
// A turn STARTED after the retirement is genuine new use and re-arms.
|
|
1902
|
+
if (!server.wasDiscoveryRetiredSince(acpSid, turnStartedAt)) {
|
|
1903
|
+
server.markSessionActive(acpSid);
|
|
1904
|
+
}
|
|
1905
|
+
// Refresh the backend-loaded verification — but only on an instance this
|
|
1906
|
+
// turn proved resident (a successful subscribe) that is STILL the live
|
|
1907
|
+
// backend: an unconditional stamp let a failed backend-lost recovery
|
|
1908
|
+
// vouch for a session the respawned backend never loaded (empty replays
|
|
1909
|
+
// for the whole TTL window — same family as the respawn-stamp bug, found
|
|
1910
|
+
// in review 2026-10).
|
|
1843
1911
|
if (residentBackend && residentBackend === server.backend && !residentBackend.isDead) {
|
|
1844
1912
|
server.markBackendLoaded(acpSid);
|
|
1845
1913
|
}
|
|
@@ -2571,117 +2639,6 @@ export function preemptInFlightTurn(server, zcodeSid, selfRequestId) {
|
|
|
2571
2639
|
return found;
|
|
2572
2640
|
}
|
|
2573
2641
|
// ---------- internals ----------
|
|
2574
|
-
/** Concatenate text from ACP ContentBlock[] into a prompt string.
|
|
2575
|
-
* Legacy compatibility helper; runtime prompts use convertPromptContent instead. */
|
|
2576
|
-
export function extractPromptText(blocks) {
|
|
2577
|
-
const parts = [];
|
|
2578
|
-
for (const block of blocks ?? []) {
|
|
2579
|
-
// ACP ContentBlock is a discriminated union on `type`. The resource_link
|
|
2580
|
-
// variant carries `name` + `uri` flat on the block itself (NOT nested under
|
|
2581
|
-
// a `resource_link` key — see ACP schema $defs.ResourceLink). Accessing
|
|
2582
|
-
// `block.resource_link` silently dropped every dragged-file attachment.
|
|
2583
|
-
const b = block;
|
|
2584
|
-
if (b.type === "text" && b.text) {
|
|
2585
|
-
parts.push(b.text);
|
|
2586
|
-
}
|
|
2587
|
-
else if (b.type === "resource_link" && b.uri) {
|
|
2588
|
-
// Convert file:// URIs to absolute paths so the model treats them as
|
|
2589
|
-
// readable filesystem locations rather than opaque hyperlinks. Fall
|
|
2590
|
-
// back to the path when name is missing OR empty — the ACP schema
|
|
2591
|
-
// requires `name`, but a non-compliant client still deserves useful
|
|
2592
|
-
// prompt text rather than `[related resource: ](/path)`.
|
|
2593
|
-
const path = b.uri.startsWith("file://") ? fileUriToPath(b.uri) : b.uri;
|
|
2594
|
-
const label = b.name || path;
|
|
2595
|
-
parts.push(`[related resource: ${label}](${path})`);
|
|
2596
|
-
}
|
|
2597
|
-
else if (b.type === "resource" && b.resource) {
|
|
2598
|
-
// Legacy extraction only (not the runtime converter): accept text
|
|
2599
|
-
// payloads defensively in case a client sends them anyway. Binary
|
|
2600
|
-
// payloads (BlobResourceContents) are never decoded — the base64 blob is
|
|
2601
|
-
// useless to the model — so rewrite the resource uri into a readable
|
|
2602
|
-
// filesystem location (same treatment as resource_link). Dropping it
|
|
2603
|
-
// entirely left the prompt empty, which errored on a binary-only drag.
|
|
2604
|
-
const r = b.resource;
|
|
2605
|
-
if (r.text) {
|
|
2606
|
-
parts.push(r.text);
|
|
2607
|
-
}
|
|
2608
|
-
else if (r.blob && r.uri) {
|
|
2609
|
-
const path = r.uri.startsWith("file://") ? fileUriToPath(r.uri) : r.uri;
|
|
2610
|
-
const label = basename(path) || path;
|
|
2611
|
-
parts.push(`[related resource: ${label}](${path})`);
|
|
2612
|
-
}
|
|
2613
|
-
}
|
|
2614
|
-
}
|
|
2615
|
-
return parts.join("\n").trim();
|
|
2616
|
-
}
|
|
2617
|
-
/** Extension inferred from mimeType for synthesizing a filename. */
|
|
2618
|
-
const MIME_EXT = {
|
|
2619
|
-
"image/png": "png",
|
|
2620
|
-
"image/jpeg": "jpg",
|
|
2621
|
-
"image/gif": "gif",
|
|
2622
|
-
"image/webp": "webp",
|
|
2623
|
-
"image/bmp": "bmp",
|
|
2624
|
-
"image/svg+xml": "svg",
|
|
2625
|
-
};
|
|
2626
|
-
/**
|
|
2627
|
-
* Extract image attachments from ACP ContentBlock[]. Non-image blocks are
|
|
2628
|
-
* ignored (text/resource_link/resource stay owned by `extractPromptText`).
|
|
2629
|
-
* Exported for unit testing.
|
|
2630
|
-
*/
|
|
2631
|
-
export function extractAttachments(blocks) {
|
|
2632
|
-
const out = [];
|
|
2633
|
-
let imageIndex = 0;
|
|
2634
|
-
for (const block of blocks ?? []) {
|
|
2635
|
-
const b = block;
|
|
2636
|
-
if (b.type !== "image")
|
|
2637
|
-
continue;
|
|
2638
|
-
imageIndex += 1;
|
|
2639
|
-
const mimeType = b.mimeType ?? "image/png";
|
|
2640
|
-
// Prefer a file:// uri → localPath so the backend streams from disk.
|
|
2641
|
-
const uri = typeof b.uri === "string" ? b.uri : "";
|
|
2642
|
-
if (uri.startsWith("file://")) {
|
|
2643
|
-
const localPath = fileUriToPath(uri);
|
|
2644
|
-
out.push({
|
|
2645
|
-
kind: "image",
|
|
2646
|
-
filename: basename(localPath) ?? `image-${imageIndex}.${MIME_EXT[mimeType] ?? "png"}`,
|
|
2647
|
-
mimeType,
|
|
2648
|
-
localPath,
|
|
2649
|
-
});
|
|
2650
|
-
continue;
|
|
2651
|
-
}
|
|
2652
|
-
// Otherwise fall back to the base64 payload.
|
|
2653
|
-
if (b.data) {
|
|
2654
|
-
out.push({
|
|
2655
|
-
kind: "image",
|
|
2656
|
-
filename: uri
|
|
2657
|
-
? (basename(uri) ?? `image-${imageIndex}.${MIME_EXT[mimeType] ?? "png"}`)
|
|
2658
|
-
: `image-${imageIndex}.${MIME_EXT[mimeType] ?? "png"}`,
|
|
2659
|
-
mimeType,
|
|
2660
|
-
dataBase64: b.data,
|
|
2661
|
-
sizeBytes: Math.floor((b.data.length * 3) / 4),
|
|
2662
|
-
});
|
|
2663
|
-
}
|
|
2664
|
-
// An image block with neither a usable uri nor data is dropped defensively.
|
|
2665
|
-
}
|
|
2666
|
-
return out;
|
|
2667
|
-
}
|
|
2668
|
-
/** Best-effort basename from a path/uri (no node:path import for a tiny helper). */
|
|
2669
|
-
function basename(p) {
|
|
2670
|
-
const clean = p.replace(/\/+$/, "");
|
|
2671
|
-
const slash = clean.lastIndexOf("/");
|
|
2672
|
-
const name = slash >= 0 ? clean.slice(slash + 1) : clean;
|
|
2673
|
-
return name || null;
|
|
2674
|
-
}
|
|
2675
|
-
/** Convert a file:// URI to an absolute filesystem path. */
|
|
2676
|
-
function fileUriToPath(uri) {
|
|
2677
|
-
try {
|
|
2678
|
-
return decodeURIComponent(new URL(uri).pathname);
|
|
2679
|
-
}
|
|
2680
|
-
catch {
|
|
2681
|
-
// Not a valid URL — return as-is (best-effort).
|
|
2682
|
-
return uri;
|
|
2683
|
-
}
|
|
2684
|
-
}
|
|
2685
2642
|
/**
|
|
2686
2643
|
* Resume a zcode session with retry on transient timeouts.
|
|
2687
2644
|
*
|
|
@@ -2702,6 +2659,14 @@ async function resumeBackendSession(server, zcParams) {
|
|
|
2702
2659
|
const resp = await backend.request(server.nextId(), "session/resume", zcParams, ATTEMPT_TIMEOUT_MS);
|
|
2703
2660
|
if (!resp.error)
|
|
2704
2661
|
return (resp.result ?? {});
|
|
2662
|
+
if ("toolDenylist" in zcParams && rejectsToolDenylistKey(resp.error.message)) {
|
|
2663
|
+
// Schema-compat retry (pre-toolDenylist backend). Bounded by
|
|
2664
|
+
// construction: the stripped params can no longer match this guard.
|
|
2665
|
+
noteToolDenylistRejected(server, "session/resume");
|
|
2666
|
+
const rest = { ...zcParams };
|
|
2667
|
+
delete rest.toolDenylist;
|
|
2668
|
+
return resumeBackendSession(server, rest);
|
|
2669
|
+
}
|
|
2705
2670
|
const isTimeout = resp.error.message === "timeout";
|
|
2706
2671
|
if (!isTimeout || attempt === MAX_ATTEMPTS) {
|
|
2707
2672
|
throw new Error(`zcode resume failed: ${resp.error.message ?? ""}`);
|