zcode-acp-server 0.1.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/LICENSE +201 -0
- package/README.md +167 -0
- package/README.zh-CN.md +163 -0
- package/dist/backend/client.d.ts +103 -0
- package/dist/backend/client.d.ts.map +1 -0
- package/dist/backend/client.js +344 -0
- package/dist/backend/client.js.map +1 -0
- package/dist/backend/credentials.d.ts +31 -0
- package/dist/backend/credentials.d.ts.map +1 -0
- package/dist/backend/credentials.js +93 -0
- package/dist/backend/credentials.js.map +1 -0
- package/dist/backend/index.d.ts +7 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +6 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/listener.d.ts +63 -0
- package/dist/backend/listener.d.ts.map +1 -0
- package/dist/backend/listener.js +138 -0
- package/dist/backend/listener.js.map +1 -0
- package/dist/backend/resolve.d.ts +11 -0
- package/dist/backend/resolve.d.ts.map +1 -0
- package/dist/backend/resolve.js +116 -0
- package/dist/backend/resolve.js.map +1 -0
- package/dist/backend/types.d.ts +164 -0
- package/dist/backend/types.d.ts.map +1 -0
- package/dist/backend/types.js +15 -0
- package/dist/backend/types.js.map +1 -0
- package/dist/config/model-cache.d.ts +20 -0
- package/dist/config/model-cache.d.ts.map +1 -0
- package/dist/config/model-cache.js +62 -0
- package/dist/config/model-cache.js.map +1 -0
- package/dist/config/options.d.ts +36 -0
- package/dist/config/options.d.ts.map +1 -0
- package/dist/config/options.js +171 -0
- package/dist/config/options.js.map +1 -0
- package/dist/config/runtime-model.d.ts +33 -0
- package/dist/config/runtime-model.d.ts.map +1 -0
- package/dist/config/runtime-model.js +96 -0
- package/dist/config/runtime-model.js.map +1 -0
- package/dist/handlers/dispatch.d.ts +15 -0
- package/dist/handlers/dispatch.d.ts.map +1 -0
- package/dist/handlers/dispatch.js +183 -0
- package/dist/handlers/dispatch.js.map +1 -0
- package/dist/handlers/extensions.d.ts +43 -0
- package/dist/handlers/extensions.d.ts.map +1 -0
- package/dist/handlers/extensions.js +310 -0
- package/dist/handlers/extensions.js.map +1 -0
- package/dist/handlers/io.d.ts +40 -0
- package/dist/handlers/io.d.ts.map +1 -0
- package/dist/handlers/io.js +55 -0
- package/dist/handlers/io.js.map +1 -0
- package/dist/handlers/server-requests.d.ts +34 -0
- package/dist/handlers/server-requests.d.ts.map +1 -0
- package/dist/handlers/server-requests.js +357 -0
- package/dist/handlers/server-requests.js.map +1 -0
- package/dist/handlers/session.d.ts +46 -0
- package/dist/handlers/session.d.ts.map +1 -0
- package/dist/handlers/session.js +738 -0
- package/dist/handlers/session.js.map +1 -0
- package/dist/handlers/slash.d.ts +16 -0
- package/dist/handlers/slash.d.ts.map +1 -0
- package/dist/handlers/slash.js +107 -0
- package/dist/handlers/slash.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction/adapter.d.ts +136 -0
- package/dist/interaction/adapter.d.ts.map +1 -0
- package/dist/interaction/adapter.js +353 -0
- package/dist/interaction/adapter.js.map +1 -0
- package/dist/server.d.ts +73 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +97 -0
- package/dist/server.js.map +1 -0
- package/dist/tasks-index.d.ts +39 -0
- package/dist/tasks-index.d.ts.map +1 -0
- package/dist/tasks-index.js +152 -0
- package/dist/tasks-index.js.map +1 -0
- package/dist/translators/event-translator.d.ts +40 -0
- package/dist/translators/event-translator.d.ts.map +1 -0
- package/dist/translators/event-translator.js +214 -0
- package/dist/translators/event-translator.js.map +1 -0
- package/dist/translators/index.d.ts +6 -0
- package/dist/translators/index.d.ts.map +1 -0
- package/dist/translators/index.js +5 -0
- package/dist/translators/index.js.map +1 -0
- package/dist/translators/projection-differ.d.ts +48 -0
- package/dist/translators/projection-differ.d.ts.map +1 -0
- package/dist/translators/projection-differ.js +239 -0
- package/dist/translators/projection-differ.js.map +1 -0
- package/dist/translators/tool-helpers.d.ts +60 -0
- package/dist/translators/tool-helpers.d.ts.map +1 -0
- package/dist/translators/tool-helpers.js +308 -0
- package/dist/translators/tool-helpers.js.map +1 -0
- package/dist/translators/types.d.ts +58 -0
- package/dist/translators/types.d.ts.map +1 -0
- package/dist/translators/types.js +27 -0
- package/dist/translators/types.js.map +1 -0
- package/dist/utils.d.ts +111 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +110 -0
- package/dist/utils.js.map +1 -0
- package/docs/ARCHITECTURE.md +299 -0
- package/docs/DEVELOPMENT.md +193 -0
- package/docs/PROTOCOL.md +649 -0
- package/docs/TROUBLESHOOTING.md +251 -0
- package/package.json +66 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ZCode-specific session method handlers (non-standard ACP extensions).
|
|
3
|
+
*
|
|
4
|
+
* Thin passthroughs for the extended session/* methods (0.14.8+):
|
|
5
|
+
* fork/rewind/rewindCascade/goal/compact/steer/cancelBackgroundTask +
|
|
6
|
+
* 0.15.0+: setThoughtLevel/updateRuntimeModelConfig/setModel/setMode.
|
|
7
|
+
*
|
|
8
|
+
* These share a near-identical shape (resolve sid → build params → forward →
|
|
9
|
+
* check error). Only the genuine per-method differences are spelled out:
|
|
10
|
+
* fork's new sid mapping, compact/goal(set)'s internal-turn lock wait, and
|
|
11
|
+
* setModel rerouting through updateRuntimeModelConfig.
|
|
12
|
+
*/
|
|
13
|
+
import { emitInitialUsage } from "../config/model-cache.js";
|
|
14
|
+
import { applyModelSwitch } from "../config/runtime-model.js";
|
|
15
|
+
import { buildConfigOptions, buildModes } from "../config/options.js";
|
|
16
|
+
import { ProjectionDiffer } from "../translators/projection-differ.js";
|
|
17
|
+
import { log, warn } from "../utils.js";
|
|
18
|
+
import { sendSessionUpdate } from "./io.js";
|
|
19
|
+
/** Build the zcode `target` object from ACP params (checkpoint or latest). */
|
|
20
|
+
function buildCheckpointTarget(params) {
|
|
21
|
+
if (params.checkpointId)
|
|
22
|
+
return { kind: "checkpoint", checkpointId: params.checkpointId };
|
|
23
|
+
if (params.target)
|
|
24
|
+
return params.target;
|
|
25
|
+
return { kind: "latestCheckpoint" };
|
|
26
|
+
}
|
|
27
|
+
/** Resolve zcode sid from ACP params; throw if unknown. */
|
|
28
|
+
function resolveSidOrThrow(server, params) {
|
|
29
|
+
const sid = server.resolveSid(params.sessionId);
|
|
30
|
+
if (!sid)
|
|
31
|
+
throw new Error(`session ${params.sessionId} not found`);
|
|
32
|
+
return sid;
|
|
33
|
+
}
|
|
34
|
+
/** session/fork → zcode session/fork: branch a new session from a checkpoint. */
|
|
35
|
+
export async function fork(server, params) {
|
|
36
|
+
const zcodeSid = resolveSidOrThrow(server, params);
|
|
37
|
+
const backend = server.ensureBackend();
|
|
38
|
+
const resp = await backend.request(server.nextId(), "session/fork", { sessionId: zcodeSid, target: buildCheckpointTarget(params) }, 15000);
|
|
39
|
+
if (resp.error)
|
|
40
|
+
throw new Error(`fork failed: ${resp.error.message}`);
|
|
41
|
+
const result = (resp.result ?? {});
|
|
42
|
+
if (result.sessionId)
|
|
43
|
+
server.sessionMap.set(result.sessionId, result.sessionId);
|
|
44
|
+
log(`session/fork → ${result.sessionId ?? "?"}`);
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
/** session/rewind → zcode session/rewind: restore workspace files to a checkpoint. */
|
|
48
|
+
export async function rewind(server, params) {
|
|
49
|
+
const zcodeSid = resolveSidOrThrow(server, params);
|
|
50
|
+
const zcParams = {
|
|
51
|
+
sessionId: zcodeSid,
|
|
52
|
+
target: buildCheckpointTarget(params),
|
|
53
|
+
};
|
|
54
|
+
if (params.expectedRevision !== undefined)
|
|
55
|
+
zcParams.expectedRevision = params.expectedRevision;
|
|
56
|
+
const resp = await server
|
|
57
|
+
.ensureBackend()
|
|
58
|
+
.request(server.nextId(), "session/rewind", zcParams, 15000);
|
|
59
|
+
if (resp.error)
|
|
60
|
+
throw new Error(`rewind failed: ${resp.error.message}`);
|
|
61
|
+
log("session/rewind → ok");
|
|
62
|
+
return (resp.result ?? {});
|
|
63
|
+
}
|
|
64
|
+
/** session/rewindCascade → zcode session/rewindCascade: cascade rewind. */
|
|
65
|
+
export async function rewindCascade(server, params) {
|
|
66
|
+
const zcodeSid = resolveSidOrThrow(server, params);
|
|
67
|
+
const zcParams = {
|
|
68
|
+
sessionId: zcodeSid,
|
|
69
|
+
target: buildCheckpointTarget(params),
|
|
70
|
+
};
|
|
71
|
+
if (params.scope)
|
|
72
|
+
zcParams.scope = params.scope;
|
|
73
|
+
if (params.expectedRevision !== undefined)
|
|
74
|
+
zcParams.expectedRevision = params.expectedRevision;
|
|
75
|
+
const resp = await server
|
|
76
|
+
.ensureBackend()
|
|
77
|
+
.request(server.nextId(), "session/rewindCascade", zcParams, 15000);
|
|
78
|
+
if (resp.error)
|
|
79
|
+
throw new Error(`rewindCascade failed: ${resp.error.message}`);
|
|
80
|
+
log("session/rewindCascade → ok");
|
|
81
|
+
return (resp.result ?? {});
|
|
82
|
+
}
|
|
83
|
+
/** session/goal → zcode session/goal: read/set/replace/clear/pause/resume the goal. */
|
|
84
|
+
export async function goal(server, params) {
|
|
85
|
+
const zcodeSid = resolveSidOrThrow(server, params);
|
|
86
|
+
const action = params.action ?? "show";
|
|
87
|
+
const zcParams = { sessionId: zcodeSid, action };
|
|
88
|
+
if ((action === "set" || action === "replace") && params.objective !== undefined) {
|
|
89
|
+
zcParams.objective = params.objective;
|
|
90
|
+
}
|
|
91
|
+
const resp = await server
|
|
92
|
+
.ensureBackend()
|
|
93
|
+
.request(server.nextId(), "session/goal", zcParams, 15000);
|
|
94
|
+
if (resp.error)
|
|
95
|
+
throw new Error(`goal failed: ${resp.error.message}`);
|
|
96
|
+
// set/replace start an internal AI turn → wait for the prompt lock to release.
|
|
97
|
+
if (action === "set" || action === "replace") {
|
|
98
|
+
// timeout is in MILLISECONDS here (Date.now()-based), not seconds — Python's
|
|
99
|
+
// timeout=60 becomes 60000. A bare 60 would expire on the first probe.
|
|
100
|
+
const released = await waitForTurnIdle(server, zcodeSid, 60_000, "session/goal", false);
|
|
101
|
+
if (released) {
|
|
102
|
+
log(`session/goal action=${action} → ok (lock released)`);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
warn(`session/goal action=${action} → ⚠ lock wait timeout`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
log(`session/goal action=${action} → ok`);
|
|
110
|
+
}
|
|
111
|
+
return (resp.result ?? {});
|
|
112
|
+
}
|
|
113
|
+
/** session/compact → zcode session/compact + wait for the internal AI turn. */
|
|
114
|
+
export async function compact(server, params, cx) {
|
|
115
|
+
const acpSid = params.sessionId;
|
|
116
|
+
const zcodeSid = resolveSidOrThrow(server, params);
|
|
117
|
+
const resp = await server
|
|
118
|
+
.ensureBackend()
|
|
119
|
+
.request(server.nextId(), "session/compact", { sessionId: zcodeSid }, 30000);
|
|
120
|
+
if (resp.error)
|
|
121
|
+
throw new Error(`compact failed: ${resp.error.message}`);
|
|
122
|
+
// compact's internal AI turn (read history → LLM compress → write back) can
|
|
123
|
+
// take minutes; expectLock=true avoids the startup-delay false-success window.
|
|
124
|
+
// timeout is in MILLISECONDS (Date.now()-based), not seconds — Python's
|
|
125
|
+
// timeout=300 becomes 300000. A bare 300 expires on the first probe sleep,
|
|
126
|
+
// making compact return "✓" while the internal turn lock is still held.
|
|
127
|
+
const released = await waitForTurnIdle(server, zcodeSid, 300_000, "session/goal", true);
|
|
128
|
+
if (released) {
|
|
129
|
+
log("session/compact → ok (lock released)");
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
warn("session/compact → ⚠ lock wait timeout (backend may still be compacting)");
|
|
133
|
+
}
|
|
134
|
+
if (released) {
|
|
135
|
+
// Refresh usage so the UI reflects the reduced contextUsed post-compact.
|
|
136
|
+
// Ensure a differ exists (compact may be the first action on a fresh session)
|
|
137
|
+
// and sync its usage baseline so the next turn won't re-emit the same value.
|
|
138
|
+
let differ = server.differs.get(zcodeSid);
|
|
139
|
+
if (!differ) {
|
|
140
|
+
differ = new ProjectionDiffer();
|
|
141
|
+
server.differs.set(zcodeSid, differ);
|
|
142
|
+
}
|
|
143
|
+
await emitInitialUsage(server, cx, acpSid, zcodeSid, differ);
|
|
144
|
+
}
|
|
145
|
+
// Surface the lock-timeout to the slash-command path so it can warn the user
|
|
146
|
+
// (the ACP method path ignores this non-standard flag). Mirrors Python's
|
|
147
|
+
// "⚠ 压缩超时" branch in _handle_slash_command.
|
|
148
|
+
return { ...(resp.result ?? {}), __lockTimeout: !released };
|
|
149
|
+
}
|
|
150
|
+
/** session/steer → zcode session/steer: append instructions to a running turn. */
|
|
151
|
+
export async function steer(server, params) {
|
|
152
|
+
const zcodeSid = resolveSidOrThrow(server, params);
|
|
153
|
+
const content = String(params.content ?? "");
|
|
154
|
+
if (!content.trim())
|
|
155
|
+
throw new Error("steer requires content");
|
|
156
|
+
const resp = await server
|
|
157
|
+
.ensureBackend()
|
|
158
|
+
.request(server.nextId(), "session/steer", { sessionId: zcodeSid, content }, 15000);
|
|
159
|
+
if (resp.error)
|
|
160
|
+
throw new Error(`steer failed: ${resp.error.message}`);
|
|
161
|
+
const result = (resp.result ?? {});
|
|
162
|
+
log(`session/steer → kind=${result.kind ?? "?"}`);
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
165
|
+
/** session/cancelBackgroundTask → zcode session/cancelBackgroundTask. */
|
|
166
|
+
export async function cancelBackgroundTask(server, params) {
|
|
167
|
+
const zcodeSid = resolveSidOrThrow(server, params);
|
|
168
|
+
const taskId = params.taskId;
|
|
169
|
+
if (!taskId)
|
|
170
|
+
throw new Error("cancelBackgroundTask requires taskId");
|
|
171
|
+
const resp = await server
|
|
172
|
+
.ensureBackend()
|
|
173
|
+
.request(server.nextId(), "session/cancelBackgroundTask", { sessionId: zcodeSid, taskId }, 15000);
|
|
174
|
+
if (resp.error)
|
|
175
|
+
throw new Error(`cancelBackgroundTask failed: ${resp.error.message}`);
|
|
176
|
+
log(`session/cancelBackgroundTask → cancelled=${resp.result?.cancelled}`);
|
|
177
|
+
return (resp.result ?? {});
|
|
178
|
+
}
|
|
179
|
+
/** session/setThoughtLevel → zcode session/setThoughtLevel. */
|
|
180
|
+
export async function setThoughtLevel(server, params) {
|
|
181
|
+
const zcodeSid = resolveSidOrThrow(server, params);
|
|
182
|
+
const thoughtLevel = params.thoughtLevel;
|
|
183
|
+
if (!thoughtLevel)
|
|
184
|
+
throw new Error("setThoughtLevel requires thoughtLevel");
|
|
185
|
+
const resp = await server
|
|
186
|
+
.ensureBackend()
|
|
187
|
+
.request(server.nextId(), "session/setThoughtLevel", { sessionId: zcodeSid, thoughtLevel }, 15000);
|
|
188
|
+
if (resp.error)
|
|
189
|
+
throw new Error(`setThoughtLevel failed: ${resp.error.message}`);
|
|
190
|
+
log("session/setThoughtLevel → ok");
|
|
191
|
+
return (resp.result ?? {});
|
|
192
|
+
}
|
|
193
|
+
/** session/updateRuntimeModelConfig → same: runtime overlay of session model config. */
|
|
194
|
+
export async function updateRuntimeModelConfig(server, params) {
|
|
195
|
+
const zcodeSid = resolveSidOrThrow(server, params);
|
|
196
|
+
const runtimeModel = params.runtimeModel;
|
|
197
|
+
if (!runtimeModel)
|
|
198
|
+
throw new Error("updateRuntimeModelConfig requires runtimeModel");
|
|
199
|
+
const zcParams = { sessionId: zcodeSid, runtimeModel };
|
|
200
|
+
if (params.applyModelSelection !== undefined)
|
|
201
|
+
zcParams.applyModelSelection = params.applyModelSelection;
|
|
202
|
+
const resp = await server
|
|
203
|
+
.ensureBackend()
|
|
204
|
+
.request(server.nextId(), "session/updateRuntimeModelConfig", zcParams, 15000);
|
|
205
|
+
if (resp.error)
|
|
206
|
+
throw new Error(`updateRuntimeModelConfig failed: ${resp.error.message}`);
|
|
207
|
+
log("session/updateRuntimeModelConfig → ok");
|
|
208
|
+
return (resp.result ?? {});
|
|
209
|
+
}
|
|
210
|
+
/** session/setModel → applyModelSwitch (runtime overlay, not persistence). */
|
|
211
|
+
export async function setModel(server, params) {
|
|
212
|
+
const zcodeSid = resolveSidOrThrow(server, params);
|
|
213
|
+
const modelId = params.modelId;
|
|
214
|
+
if (!modelId)
|
|
215
|
+
throw new Error("setModel requires modelId");
|
|
216
|
+
const ok = await applyModelSwitch(server, zcodeSid, modelId);
|
|
217
|
+
if (!ok)
|
|
218
|
+
throw new Error("setModel failed (model switch rejected)");
|
|
219
|
+
log(`session/setModel → ${modelId} (updateRuntimeModelConfig)`);
|
|
220
|
+
return {};
|
|
221
|
+
}
|
|
222
|
+
/** session/setMode → zcode session/setMode + emit config_option/current_mode updates. */
|
|
223
|
+
export async function setMode(server, params, cx) {
|
|
224
|
+
const acpSid = params.sessionId;
|
|
225
|
+
const zcodeSid = resolveSidOrThrow(server, params);
|
|
226
|
+
const mode = params.mode;
|
|
227
|
+
if (!mode)
|
|
228
|
+
throw new Error("setMode requires mode");
|
|
229
|
+
const resp = await server
|
|
230
|
+
.ensureBackend()
|
|
231
|
+
.request(server.nextId(), "session/setMode", { sessionId: zcodeSid, mode }, 15000);
|
|
232
|
+
if (resp.error)
|
|
233
|
+
throw new Error(`setMode failed: ${resp.error.message}`);
|
|
234
|
+
log(`session/setMode → ${mode}`);
|
|
235
|
+
// Re-build configOptions (settings.mode.current is now updated) and emit
|
|
236
|
+
// config_option_update + current_mode_update so the editor UI reflects it.
|
|
237
|
+
const options = await buildConfigOptions(server, zcodeSid);
|
|
238
|
+
await sendSessionUpdate(cx, acpSid, {
|
|
239
|
+
sessionUpdate: "config_option_update",
|
|
240
|
+
configOptions: options,
|
|
241
|
+
});
|
|
242
|
+
const modes = await buildModes(server, zcodeSid);
|
|
243
|
+
await sendSessionUpdate(cx, acpSid, {
|
|
244
|
+
sessionUpdate: "current_mode_update",
|
|
245
|
+
currentModeId: modes.currentModeId,
|
|
246
|
+
});
|
|
247
|
+
// Record the advertised mode so the turn-completion reconciliation knows the
|
|
248
|
+
// client has already been told about this value.
|
|
249
|
+
server.lastMode.set(acpSid, modes.currentModeId);
|
|
250
|
+
return (resp.result ?? {});
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Wait for a zcode session's internal AI turn to release its prompt lock.
|
|
254
|
+
*
|
|
255
|
+
* `session/goal(set)` and `session/compact` start an internal AI turn that
|
|
256
|
+
* keeps running after the request() response. projection.status=idle does NOT
|
|
257
|
+
* mean the lock is released (goal set often shows idle quickly while the lock
|
|
258
|
+
* persists 10-25s). The reliable check: retry a probe call (goal show) until it
|
|
259
|
+
* no longer reports "prompt is running".
|
|
260
|
+
*
|
|
261
|
+
* `expectLock` (compact): compact's turn has a startup delay — at this moment
|
|
262
|
+
* the lock isn't held yet, so a probe succeeds immediately (false "released").
|
|
263
|
+
* With expectLock=true, we first require observing "prompt is running" once
|
|
264
|
+
* (proving the turn truly started) before trusting a later success.
|
|
265
|
+
*/
|
|
266
|
+
async function waitForTurnIdle(server, zcodeSid, timeoutMs, probeMethod, expectLock) {
|
|
267
|
+
const backend = server.ensureBackend();
|
|
268
|
+
const t0 = Date.now();
|
|
269
|
+
let lockSeen = !expectLock;
|
|
270
|
+
let probeCount = 0;
|
|
271
|
+
log(` [probe] start waitForTurnIdle timeout=${Math.round(timeoutMs / 1000)}s expectLock=${expectLock} probeMethod=${probeMethod}`);
|
|
272
|
+
while (Date.now() - t0 < timeoutMs) {
|
|
273
|
+
probeCount++;
|
|
274
|
+
const elapsed = Math.round((Date.now() - t0) / 100) / 10;
|
|
275
|
+
const resp = await backend.request(server.nextId(), probeMethod, { sessionId: zcodeSid, action: "show" }, 10000);
|
|
276
|
+
const errMsg = resp.error?.message ?? "";
|
|
277
|
+
if (errMsg.includes("prompt is running")) {
|
|
278
|
+
log(` [probe] #${probeCount} @${elapsed}s: LOCK HELD ("${errMsg.slice(0, 60)}") → lockSeen=true`);
|
|
279
|
+
lockSeen = true;
|
|
280
|
+
await sleep(2000);
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
if (errMsg.toLowerCase().includes("timeout")) {
|
|
284
|
+
log(` [probe] #${probeCount} @${elapsed}s: probe timeout, continue`);
|
|
285
|
+
await sleep(2000);
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
if (resp.error) {
|
|
289
|
+
if (lockSeen) {
|
|
290
|
+
log(` [probe] #${probeCount} @${elapsed}s: NON-LOCK error after lock → released (err="${errMsg.slice(0, 50)}")`);
|
|
291
|
+
return true;
|
|
292
|
+
}
|
|
293
|
+
log(` [probe] #${probeCount} @${elapsed}s: NON-LOCK error, lockSeen=false → wait for lock (err="${errMsg.slice(0, 50)}")`);
|
|
294
|
+
await sleep(500);
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
if (lockSeen) {
|
|
298
|
+
log(` [probe] #${probeCount} @${elapsed}s: probe success after lock → released`);
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
log(` [probe] #${probeCount} @${elapsed}s: probe success, lockSeen=false → wait for lock (still in startup window)`);
|
|
302
|
+
await sleep(500);
|
|
303
|
+
}
|
|
304
|
+
log(` [probe] wait timed out (${Math.round(timeoutMs / 1000)}s), lock may still be held`);
|
|
305
|
+
return false;
|
|
306
|
+
}
|
|
307
|
+
function sleep(ms) {
|
|
308
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
309
|
+
}
|
|
310
|
+
//# sourceMappingURL=extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/handlers/extensions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP client I/O helpers — thin wrappers over the AgentContext (cx) that the
|
|
3
|
+
* ACP SDK passes to each handler.
|
|
4
|
+
*
|
|
5
|
+
* The SDK exposes `cx.notify(method, params)` and `cx.request(method, params)`;
|
|
6
|
+
* these helpers name the common notifications/requests we send and centralise
|
|
7
|
+
* the JSON shape so handlers stay readable.
|
|
8
|
+
*/
|
|
9
|
+
import type * as acp from "@agentclientprotocol/sdk";
|
|
10
|
+
import type { ZcodeAcpServer } from "../server.js";
|
|
11
|
+
/** Send a `session/update` notification to the client. */
|
|
12
|
+
export declare function sendSessionUpdate(cx: acp.AgentContext, sessionId: string, update: acp.SessionUpdate): Promise<void>;
|
|
13
|
+
/** Send an `agent_message_chunk` text notification. */
|
|
14
|
+
export declare function sendTextChunk(cx: acp.AgentContext, sessionId: string, text: string, messageId: string): Promise<void>;
|
|
15
|
+
/** Shape of a slash command entry (matches ACP's AvailableCommand). */
|
|
16
|
+
interface SlashCommandEntry {
|
|
17
|
+
name: string;
|
|
18
|
+
description: string;
|
|
19
|
+
input?: {
|
|
20
|
+
hint: string;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** Send an `available_commands_update` notification listing our slash commands. */
|
|
24
|
+
export declare function sendAvailableCommands(cx: acp.AgentContext, sessionId: string, commands: ReadonlyArray<SlashCommandEntry>): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Send `available_commands_update` after a short delay so it lands after the
|
|
27
|
+
* session response. ACP clients initialize their session state machine on the
|
|
28
|
+
* response; a notification arriving earlier can be dropped, leaving the `/`
|
|
29
|
+
* completion menu empty. Mirrors the Python bridge's deferred-notification
|
|
30
|
+
* queue + 50ms drain. Fire-and-forget (returns void).
|
|
31
|
+
*/
|
|
32
|
+
export declare function sendAvailableCommandsDeferred(cx: acp.AgentContext, sessionId: string, commands: ReadonlyArray<SlashCommandEntry>): void;
|
|
33
|
+
/** Throw a JSON-RPC error from a handler (the SDK converts it to an error response). */
|
|
34
|
+
export declare function throwError(code: number, message: string): never;
|
|
35
|
+
/** Server instance attached to the running agent (set by index.ts on connect). */
|
|
36
|
+
export interface ServerHolder {
|
|
37
|
+
server: ZcodeAcpServer;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=io.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../../src/handlers/io.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,KAAK,GAAG,MAAM,0BAA0B,CAAC;AAGrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,GAAG,CAAC,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,GAAG,CAAC,aAAa,GACxB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,uDAAuD;AACvD,wBAAgB,aAAa,CAC3B,EAAE,EAAE,GAAG,CAAC,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAMf;AAED,uEAAuE;AACvE,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1B;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,GAAG,CAAC,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,CAAC,iBAAiB,CAAC,GACzC,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAC3C,EAAE,EAAE,GAAG,CAAC,YAAY,EACpB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,CAAC,iBAAiB,CAAC,GACzC,IAAI,CAMN;AAED,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,KAAK,CAE/D;AAED,kFAAkF;AAClF,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,cAAc,CAAC;CACxB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ACP client I/O helpers — thin wrappers over the AgentContext (cx) that the
|
|
3
|
+
* ACP SDK passes to each handler.
|
|
4
|
+
*
|
|
5
|
+
* The SDK exposes `cx.notify(method, params)` and `cx.request(method, params)`;
|
|
6
|
+
* these helpers name the common notifications/requests we send and centralise
|
|
7
|
+
* the JSON shape so handlers stay readable.
|
|
8
|
+
*/
|
|
9
|
+
import { RequestError } from "@agentclientprotocol/sdk";
|
|
10
|
+
/** Send a `session/update` notification to the client. */
|
|
11
|
+
export function sendSessionUpdate(cx, sessionId, update) {
|
|
12
|
+
return cx.notify("session/update", { sessionId, update });
|
|
13
|
+
}
|
|
14
|
+
/** Send an `agent_message_chunk` text notification. */
|
|
15
|
+
export function sendTextChunk(cx, sessionId, text, messageId) {
|
|
16
|
+
return sendSessionUpdate(cx, sessionId, {
|
|
17
|
+
sessionUpdate: "agent_message_chunk",
|
|
18
|
+
content: { type: "text", text },
|
|
19
|
+
messageId,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
/** Send an `available_commands_update` notification listing our slash commands. */
|
|
23
|
+
export function sendAvailableCommands(cx, sessionId, commands) {
|
|
24
|
+
return sendSessionUpdate(cx, sessionId, {
|
|
25
|
+
sessionUpdate: "available_commands_update",
|
|
26
|
+
availableCommands: commands.map((c) => {
|
|
27
|
+
const out = {
|
|
28
|
+
name: c.name,
|
|
29
|
+
description: c.description,
|
|
30
|
+
};
|
|
31
|
+
if (c.input)
|
|
32
|
+
out.input = c.input;
|
|
33
|
+
return out;
|
|
34
|
+
}),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Send `available_commands_update` after a short delay so it lands after the
|
|
39
|
+
* session response. ACP clients initialize their session state machine on the
|
|
40
|
+
* response; a notification arriving earlier can be dropped, leaving the `/`
|
|
41
|
+
* completion menu empty. Mirrors the Python bridge's deferred-notification
|
|
42
|
+
* queue + 50ms drain. Fire-and-forget (returns void).
|
|
43
|
+
*/
|
|
44
|
+
export function sendAvailableCommandsDeferred(cx, sessionId, commands) {
|
|
45
|
+
const t = setTimeout(() => {
|
|
46
|
+
void sendAvailableCommands(cx, sessionId, commands);
|
|
47
|
+
}, 50);
|
|
48
|
+
// unref so shutdown is not held up by this deferred notification.
|
|
49
|
+
t.unref?.();
|
|
50
|
+
}
|
|
51
|
+
/** Throw a JSON-RPC error from a handler (the SDK converts it to an error response). */
|
|
52
|
+
export function throwError(code, message) {
|
|
53
|
+
throw new RequestError(code, message);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=io.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"io.js","sourceRoot":"","sources":["../../src/handlers/io.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIxD,0DAA0D;AAC1D,MAAM,UAAU,iBAAiB,CAC/B,EAAoB,EACpB,SAAiB,EACjB,MAAyB;IAEzB,OAAO,EAAE,CAAC,MAAM,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,aAAa,CAC3B,EAAoB,EACpB,SAAiB,EACjB,IAAY,EACZ,SAAiB;IAEjB,OAAO,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE;QACtC,aAAa,EAAE,qBAAqB;QACpC,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;QAC/B,SAAS;KACV,CAAC,CAAC;AACL,CAAC;AASD,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CACnC,EAAoB,EACpB,SAAiB,EACjB,QAA0C;IAE1C,OAAO,iBAAiB,CAAC,EAAE,EAAE,SAAS,EAAE;QACtC,aAAa,EAAE,2BAA2B;QAC1C,iBAAiB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,MAAM,GAAG,GAAoE;gBAC3E,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC;YACF,IAAI,CAAC,CAAC,KAAK;gBAAE,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;YACjC,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAC3C,EAAoB,EACpB,SAAiB,EACjB,QAA0C;IAE1C,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE;QACxB,KAAK,qBAAqB,CAAC,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACtD,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,kEAAkE;IAClE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;AACd,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAe;IACtD,MAAM,IAAI,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Handle zcode-initiated server→client requests during a turn.
|
|
3
|
+
*
|
|
4
|
+
* ZCode's interaction broker dispatches three request kinds, all bridged onto
|
|
5
|
+
* ACP `session/requestPermission` (Zed supports it natively; elicitation is
|
|
6
|
+
* not supported):
|
|
7
|
+
* - interaction/requestPermission (tool auth) → direct option mapping
|
|
8
|
+
* - interaction/requestUserInput (ExitPlanMode) → approve/reject options
|
|
9
|
+
* - interaction/requestUserInput (AskUserQuestion) → per-question popups
|
|
10
|
+
* (single-select: one popup; multi-select: per-option Include/Skip)
|
|
11
|
+
*
|
|
12
|
+
* Reannounce dedup: ZCode reannounces unanswered requests every ~1s sharing
|
|
13
|
+
* the same requestId/toolCallId. The first request forwards to the client;
|
|
14
|
+
* reannounces either get the cached result (if it arrived) or just record
|
|
15
|
+
* their zcode id for a later unified reply.
|
|
16
|
+
*/
|
|
17
|
+
import type * as acp from "@agentclientprotocol/sdk";
|
|
18
|
+
import type { ZcodeBackend } from "../backend/client.js";
|
|
19
|
+
import type { ZcodeInteractionResponse } from "../backend/types.js";
|
|
20
|
+
import type { PendingTurn, ZcodeAcpServer } from "../server.js";
|
|
21
|
+
/** A dedup entry tracking reannounced zcode ids + the cached result. */
|
|
22
|
+
interface DedupEntry {
|
|
23
|
+
zcodeIds: number[];
|
|
24
|
+
result?: ZcodeInteractionResponse;
|
|
25
|
+
}
|
|
26
|
+
/** Per-server reannounce dedup state (lazy-initialised). */
|
|
27
|
+
export declare function getPendingInteractions(server: ZcodeAcpServer): Map<string, DedupEntry>;
|
|
28
|
+
/**
|
|
29
|
+
* Drain and handle all pending zcode server→client requests. Returns true if
|
|
30
|
+
* any were handled (used by the turn loop to refresh the no-progress timer).
|
|
31
|
+
*/
|
|
32
|
+
export declare function handleServerRequests(server: ZcodeAcpServer, backend: ZcodeBackend, cx: acp.AgentContext, acpSid: string, turn?: PendingTurn): Promise<boolean>;
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=server-requests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-requests.d.ts","sourceRoot":"","sources":["../../src/handlers/server-requests.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,KAAK,GAAG,MAAM,0BAA0B,CAAC;AAErD,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAEV,wBAAwB,EAEzB,MAAM,qBAAqB,CAAC;AAkB7B,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGhE,wEAAwE;AACxE,UAAU,UAAU;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,wBAAwB,CAAC;CACnC;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAQtF;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,YAAY,EACrB,EAAE,EAAE,GAAG,CAAC,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,OAAO,CAAC,CAUlB"}
|