zcode-acp-server 0.74.0 → 0.75.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 +1 -1
- package/dist/code-fingerprint.json +1 -1
- package/dist/handlers/replay.d.ts.map +1 -1
- package/dist/handlers/replay.js +7 -0
- package/dist/handlers/replay.js.map +1 -1
- package/dist/handlers/session.d.ts +16 -0
- package/dist/handlers/session.d.ts.map +1 -1
- package/dist/handlers/session.js +21 -14
- package/dist/handlers/session.js.map +1 -1
- package/dist/quota/cliproxy/client.d.ts.map +1 -1
- package/dist/quota/cliproxy/client.js +10 -4
- package/dist/quota/cliproxy/client.js.map +1 -1
- package/dist/remote/hub-server.d.ts.map +1 -1
- package/dist/remote/hub-server.js +68 -26
- package/dist/remote/hub-server.js.map +1 -1
- package/dist/remote/session-close-endpoint.d.ts +8 -0
- package/dist/remote/session-close-endpoint.d.ts.map +1 -1
- package/dist/remote/session-close-endpoint.js +62 -4
- package/dist/remote/session-close-endpoint.js.map +1 -1
- package/docs/BACKLOG.md +34 -0
- package/docs/adr/0006-remote-session-close.md +14 -0
- package/package.json +1 -1
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
* one stays gone. A running turn is the one case we CAN observe and reject.
|
|
20
20
|
*/
|
|
21
21
|
import process from "node:process";
|
|
22
|
+
import { cancelSessionTurns } from "../handlers/session.js";
|
|
22
23
|
import { log } from "../utils.js";
|
|
23
24
|
import { stopPollersForSession } from "../workflow/poller.js";
|
|
24
25
|
function sendText(res, code, message) {
|
|
@@ -37,6 +38,36 @@ function sendJson(res, code, body) {
|
|
|
37
38
|
}
|
|
38
39
|
/** Grace before the bridge exits itself when the TUI group signal missed. */
|
|
39
40
|
const SELF_EXIT_MS = 1_500;
|
|
41
|
+
/**
|
|
42
|
+
* Force close: how long to wait for the cancelled turn(s) to settle before
|
|
43
|
+
* evicting the resident runtime anyway (the eviction kills any generation
|
|
44
|
+
* that ignored the stop pair). Test hook override via the setter below.
|
|
45
|
+
*/
|
|
46
|
+
export let forceSettleMs = 3_000;
|
|
47
|
+
/** Test hook: shrink the force-close settle bound so tests don't sleep. */
|
|
48
|
+
export function setForceSettleMsForTests(ms) {
|
|
49
|
+
forceSettleMs = ms;
|
|
50
|
+
}
|
|
51
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
52
|
+
const MAX_CLOSE_BODY_BYTES = 256;
|
|
53
|
+
/**
|
|
54
|
+
* Read the optional close body without trusting Content-Type (the hub's
|
|
55
|
+
* forward-and-relay proxy pipes bytes through without forwarding headers).
|
|
56
|
+
* Empty body → undefined; anything malformed throws for the 400 path.
|
|
57
|
+
*/
|
|
58
|
+
async function readCloseBody(req) {
|
|
59
|
+
const chunks = [];
|
|
60
|
+
let size = 0;
|
|
61
|
+
for await (const chunk of req) {
|
|
62
|
+
size += chunk.length;
|
|
63
|
+
if (size > MAX_CLOSE_BODY_BYTES)
|
|
64
|
+
throw new Error("body too large");
|
|
65
|
+
chunks.push(chunk);
|
|
66
|
+
}
|
|
67
|
+
if (chunks.length === 0)
|
|
68
|
+
return undefined;
|
|
69
|
+
return JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
70
|
+
}
|
|
40
71
|
/**
|
|
41
72
|
* Should closing a session TERMINATE this bridge? Only for remote-incubated
|
|
42
73
|
* instances (ZCODE_ACP_REMOTE_ORIGIN=serve, ADR-0016): their CLI was spawned
|
|
@@ -129,8 +160,18 @@ function terminateAfterFlush(decision, res) {
|
|
|
129
160
|
run();
|
|
130
161
|
}
|
|
131
162
|
async function handleClose(server, req, res, sessionId) {
|
|
132
|
-
//
|
|
133
|
-
|
|
163
|
+
// Optional JSON body: {force: true} stops an in-flight turn before closing
|
|
164
|
+
// (an explicit terminate gesture — the desktop's End session). Absent body
|
|
165
|
+
// keeps the plain ADR-0006 contract.
|
|
166
|
+
let body;
|
|
167
|
+
try {
|
|
168
|
+
body = await readCloseBody(req);
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
sendText(res, 400, "invalid body");
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const force = body?.force === true;
|
|
134
175
|
// An empty REMOTE-created placeholder (no turn yet) has no summary but IS
|
|
135
176
|
// advertised by discovery — it must be closable too, or it blocks the
|
|
136
177
|
// last-close CLI termination forever (advertisedSessionCount never drops).
|
|
@@ -139,10 +180,27 @@ async function handleClose(server, req, res, sessionId) {
|
|
|
139
180
|
return;
|
|
140
181
|
}
|
|
141
182
|
const zcodeSid = server.resolveSid(sessionId);
|
|
142
|
-
|
|
143
|
-
|
|
183
|
+
const running = zcodeSid !== undefined &&
|
|
184
|
+
[...server.pendingTurns.values()].some((t) => t.zcodeSid === zcodeSid);
|
|
185
|
+
if (running && !force) {
|
|
186
|
+
sendText(res, 409, 'session is running — cancel the turn first (or send {"force":true})');
|
|
144
187
|
return;
|
|
145
188
|
}
|
|
189
|
+
if (running && zcodeSid !== undefined) {
|
|
190
|
+
// Force close (ADR-0006 amendment): ESC semantics without a client
|
|
191
|
+
// connection — flag the turns cancelled, fire the stop pair, then give
|
|
192
|
+
// them a bounded window to settle (the stop's terminal event persists
|
|
193
|
+
// partial output cleanly) before the runtime eviction below proceeds
|
|
194
|
+
// regardless. The eviction kills any generation that ignored the stop.
|
|
195
|
+
cancelSessionTurns(server, zcodeSid);
|
|
196
|
+
log(`remote: force close cancelling in-flight turn(s) for ${zcodeSid}`);
|
|
197
|
+
const deadline = Date.now() + forceSettleMs;
|
|
198
|
+
while (Date.now() < deadline) {
|
|
199
|
+
if (![...server.pendingTurns.values()].some((t) => t.zcodeSid === zcodeSid))
|
|
200
|
+
break;
|
|
201
|
+
await sleep(50);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
146
204
|
server.sessionSummaries.delete(sessionId);
|
|
147
205
|
server.remoteCreatedSessions.delete(sessionId);
|
|
148
206
|
// Workflow-run progress pollers address this session's journal — stop them
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-close-endpoint.js","sourceRoot":"","sources":["../../src/remote/session-close-endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,OAAO,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"session-close-endpoint.js","sourceRoot":"","sources":["../../src/remote/session-close-endpoint.ts"],"names":[],"mappings":"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"}
|
package/docs/BACKLOG.md
CHANGED
|
@@ -109,6 +109,40 @@ New in 3.15.1, bridge-relevant:
|
|
|
109
109
|
v3 payloads gained only OPTIONAL fields (`turn.started.executionStartedAt`,
|
|
110
110
|
permission `approvalMode`, `session/read` `contentProfile`).
|
|
111
111
|
|
|
112
|
+
**3.16.1 sync (2026-10-19, commit `0a1fc56d` — checkout synced, protocol
|
|
113
|
+
surface audited, no bridge action)**: first CLI bump since 3.14 — app-server
|
|
114
|
+
`0.16.9` → `0.17.0` (source root 3.15.1 → 3.16.1; 4,502 files, mostly desktop
|
|
115
|
+
E2E/UI). The desktop on this machine is 3.15.3 (still bundles the 0.16.9-era
|
|
116
|
+
`zcode.cjs`) — nothing changes for a running bridge today; this note covers the
|
|
117
|
+
next desktop update. Protocol drift is small and additive except ONE param
|
|
118
|
+
removal: `session/list` dropped `includeArchived` and now filters `deleted`
|
|
119
|
+
rows itself (plus parent-chain ownership proofs for explicit `sessionIds`
|
|
120
|
+
queries — `listSessions` rewrite). The bridge never sends `includeArchived`
|
|
121
|
+
and applies its own tasks-index tombstone filter, so both are no-ops here.
|
|
122
|
+
Additive surface: `additionalDirectories` (optional) on `session/create` +
|
|
123
|
+
`session/resume`; `toolSearchMode` (default `"off"`) + `additionalDirectories`
|
|
124
|
+
on the `session/requestRuntimePreferences` RESULT schema — the bridge's
|
|
125
|
+
three-field auto-reply (`src/backend/client.ts`) still validates: the schema
|
|
126
|
+
stays `.strict()`, every sent key is known, new fields carry defaults; new
|
|
127
|
+
`provider/refreshRegistry` method (worker rebuilds its in-process registry
|
|
128
|
+
from the Environment's config store — a host-side companion to
|
|
129
|
+
`provider/updateAccountConfig`, which is unchanged); MCP server `alwaysLoad`;
|
|
130
|
+
runtime capability `historyFirst`. Verified zero-diff on every Gotchas-cited
|
|
131
|
+
behavior file: the provider bootstrap quartet (`provider-runtime-env.ts`,
|
|
132
|
+
`runtime-paths.ts`, `zcode-builtin-provider-config-source.ts`,
|
|
133
|
+
`registry-service.ts`), `model-catalog-port.ts` (the `values.at(-1)`
|
|
134
|
+
default-level rule), `session-mode-port.ts`, `execution-state.ts`, the
|
|
135
|
+
setModel/resume schemas, and the runtime-headers path. `server-operations.ts`
|
|
136
|
+
moved 238 lines but no hunk touches the stop/compact/send-busy turn loop
|
|
137
|
+
(`sendPrompt`'s `activeAbortController`, compact's `state.updated` swallow,
|
|
138
|
+
the `-32010` window) — hunks are listSessions, createWithProjection,
|
|
139
|
+
activateSessionForResume, background-turn allowlist, runtime-prefs resolution.
|
|
140
|
+
`session-flow.ts` (+31/−9) is Highspeed selection queueing (queue items keep
|
|
141
|
+
only the ordinary selection; execution bundles stay in-memory) — internal v4
|
|
142
|
+
queue mechanics, the v4 stop path is untouched. Model-selection persistence
|
|
143
|
+
semantics unchanged (`ensureSessionPersisted` / `restorePersistedModelSelection`;
|
|
144
|
+
`turn-model.ts` adds Highspeed/off-peak capture, not persistence).
|
|
145
|
+
|
|
112
146
|
**3.14.0 audit (2026-09-20, app-server 0.16.9 — live-probed end to end)**: the
|
|
113
147
|
dynamic-workflow family (ten model tools led by `CreateWorkflow`) is OFF by
|
|
114
148
|
default headless and enabled per PROCESS via
|
|
@@ -26,6 +26,20 @@ in-use signal, a pending turn, is rejected outright (409). A bridge-restart
|
|
|
26
26
|
auto-resume alone does not resurrect a closed session — `registerSession`
|
|
27
27
|
writes a summary with `hasActivity` unset.
|
|
28
28
|
|
|
29
|
+
Amendment (2026-10-20) — force close. The 409 guard protects conversations
|
|
30
|
+
from a mere list refresh, but it also blocks the client that MEANT to
|
|
31
|
+
terminate: a desktop user pressing "End session" on a running conversation
|
|
32
|
+
got the refusal and no path to act on it (observed live: the session kept
|
|
33
|
+
generating until the user walked to the hosting CLI window and stopped it
|
|
34
|
+
there). A close body `{"force":true}` now opts an explicit gesture through:
|
|
35
|
+
the bridge applies ESC semantics without a client connection (flag the
|
|
36
|
+
session's in-flight turns cancelled, fire the stop pair), waits a bounded
|
|
37
|
+
~3s for them to settle so the stop's terminal event persists partial output,
|
|
38
|
+
then proceeds with the eviction regardless — the `session/close` runtime
|
|
39
|
+
eviction already documented as the drain gate's kill escalation finishes any
|
|
40
|
+
generation that ignored the stop. Plain close keeps the refuse-when-running
|
|
41
|
+
contract; nothing changes for clients that send no body.
|
|
42
|
+
|
|
29
43
|
The hub stays a router (ADR-0002): the POST is forwarded by instance id and
|
|
30
44
|
session id only; the running guard and retirement semantics live in the
|
|
31
45
|
bridge. One implementation note for future write proxies: aborting the
|