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.
Files changed (108) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +167 -0
  3. package/README.zh-CN.md +163 -0
  4. package/dist/backend/client.d.ts +103 -0
  5. package/dist/backend/client.d.ts.map +1 -0
  6. package/dist/backend/client.js +344 -0
  7. package/dist/backend/client.js.map +1 -0
  8. package/dist/backend/credentials.d.ts +31 -0
  9. package/dist/backend/credentials.d.ts.map +1 -0
  10. package/dist/backend/credentials.js +93 -0
  11. package/dist/backend/credentials.js.map +1 -0
  12. package/dist/backend/index.d.ts +7 -0
  13. package/dist/backend/index.d.ts.map +1 -0
  14. package/dist/backend/index.js +6 -0
  15. package/dist/backend/index.js.map +1 -0
  16. package/dist/backend/listener.d.ts +63 -0
  17. package/dist/backend/listener.d.ts.map +1 -0
  18. package/dist/backend/listener.js +138 -0
  19. package/dist/backend/listener.js.map +1 -0
  20. package/dist/backend/resolve.d.ts +11 -0
  21. package/dist/backend/resolve.d.ts.map +1 -0
  22. package/dist/backend/resolve.js +116 -0
  23. package/dist/backend/resolve.js.map +1 -0
  24. package/dist/backend/types.d.ts +164 -0
  25. package/dist/backend/types.d.ts.map +1 -0
  26. package/dist/backend/types.js +15 -0
  27. package/dist/backend/types.js.map +1 -0
  28. package/dist/config/model-cache.d.ts +20 -0
  29. package/dist/config/model-cache.d.ts.map +1 -0
  30. package/dist/config/model-cache.js +62 -0
  31. package/dist/config/model-cache.js.map +1 -0
  32. package/dist/config/options.d.ts +36 -0
  33. package/dist/config/options.d.ts.map +1 -0
  34. package/dist/config/options.js +171 -0
  35. package/dist/config/options.js.map +1 -0
  36. package/dist/config/runtime-model.d.ts +33 -0
  37. package/dist/config/runtime-model.d.ts.map +1 -0
  38. package/dist/config/runtime-model.js +96 -0
  39. package/dist/config/runtime-model.js.map +1 -0
  40. package/dist/handlers/dispatch.d.ts +15 -0
  41. package/dist/handlers/dispatch.d.ts.map +1 -0
  42. package/dist/handlers/dispatch.js +183 -0
  43. package/dist/handlers/dispatch.js.map +1 -0
  44. package/dist/handlers/extensions.d.ts +43 -0
  45. package/dist/handlers/extensions.d.ts.map +1 -0
  46. package/dist/handlers/extensions.js +310 -0
  47. package/dist/handlers/extensions.js.map +1 -0
  48. package/dist/handlers/io.d.ts +40 -0
  49. package/dist/handlers/io.d.ts.map +1 -0
  50. package/dist/handlers/io.js +55 -0
  51. package/dist/handlers/io.js.map +1 -0
  52. package/dist/handlers/server-requests.d.ts +34 -0
  53. package/dist/handlers/server-requests.d.ts.map +1 -0
  54. package/dist/handlers/server-requests.js +357 -0
  55. package/dist/handlers/server-requests.js.map +1 -0
  56. package/dist/handlers/session.d.ts +46 -0
  57. package/dist/handlers/session.d.ts.map +1 -0
  58. package/dist/handlers/session.js +738 -0
  59. package/dist/handlers/session.js.map +1 -0
  60. package/dist/handlers/slash.d.ts +16 -0
  61. package/dist/handlers/slash.d.ts.map +1 -0
  62. package/dist/handlers/slash.js +107 -0
  63. package/dist/handlers/slash.js.map +1 -0
  64. package/dist/index.d.ts +11 -0
  65. package/dist/index.d.ts.map +1 -0
  66. package/dist/index.js +93 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/interaction/adapter.d.ts +136 -0
  69. package/dist/interaction/adapter.d.ts.map +1 -0
  70. package/dist/interaction/adapter.js +353 -0
  71. package/dist/interaction/adapter.js.map +1 -0
  72. package/dist/server.d.ts +73 -0
  73. package/dist/server.d.ts.map +1 -0
  74. package/dist/server.js +97 -0
  75. package/dist/server.js.map +1 -0
  76. package/dist/tasks-index.d.ts +39 -0
  77. package/dist/tasks-index.d.ts.map +1 -0
  78. package/dist/tasks-index.js +152 -0
  79. package/dist/tasks-index.js.map +1 -0
  80. package/dist/translators/event-translator.d.ts +40 -0
  81. package/dist/translators/event-translator.d.ts.map +1 -0
  82. package/dist/translators/event-translator.js +214 -0
  83. package/dist/translators/event-translator.js.map +1 -0
  84. package/dist/translators/index.d.ts +6 -0
  85. package/dist/translators/index.d.ts.map +1 -0
  86. package/dist/translators/index.js +5 -0
  87. package/dist/translators/index.js.map +1 -0
  88. package/dist/translators/projection-differ.d.ts +48 -0
  89. package/dist/translators/projection-differ.d.ts.map +1 -0
  90. package/dist/translators/projection-differ.js +239 -0
  91. package/dist/translators/projection-differ.js.map +1 -0
  92. package/dist/translators/tool-helpers.d.ts +60 -0
  93. package/dist/translators/tool-helpers.d.ts.map +1 -0
  94. package/dist/translators/tool-helpers.js +308 -0
  95. package/dist/translators/tool-helpers.js.map +1 -0
  96. package/dist/translators/types.d.ts +58 -0
  97. package/dist/translators/types.d.ts.map +1 -0
  98. package/dist/translators/types.js +27 -0
  99. package/dist/translators/types.js.map +1 -0
  100. package/dist/utils.d.ts +111 -0
  101. package/dist/utils.d.ts.map +1 -0
  102. package/dist/utils.js +110 -0
  103. package/dist/utils.js.map +1 -0
  104. package/docs/ARCHITECTURE.md +299 -0
  105. package/docs/DEVELOPMENT.md +193 -0
  106. package/docs/PROTOCOL.md +649 -0
  107. package/docs/TROUBLESHOOTING.md +251 -0
  108. package/package.json +66 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * configOptions + modes construction and session/set_config_option dispatch.
3
+ *
4
+ * Reads `session/read` `settings.*` for current values (NOT projection.mode,
5
+ * which is a zombie value), with config.json fallbacks for the model list.
6
+ * set_config_option: mode/thought forward to setMode/setThoughtLevel; model
7
+ * routes through `runtimeModel` (runtime-model.ts) because the backend rejects
8
+ * the persistence path. After a change, re-builds the option and emits a
9
+ * `config_option_update` (+ `current_mode_update` for mode) so the editor UI
10
+ * reflects the new state.
11
+ */
12
+ import { readFileSync } from "node:fs";
13
+ import { CONFIG_DISPATCH, CONFIG_META, ZCODE_CREDS_PATH } from "../utils.js";
14
+ import { sendSessionUpdate } from "../handlers/io.js";
15
+ /** Read the config.json contents (UTF-8). Throws on read/parse failure. */
16
+ function readConfig() {
17
+ return JSON.parse(readFileSync(ZCODE_CREDS_PATH, "utf8"));
18
+ }
19
+ /** Read the model id list for the enabled provider from config.json. */
20
+ export function loadProviderModels() {
21
+ try {
22
+ const cfg = readConfig();
23
+ const models = cfg.provider?.["builtin:bigmodel-coding-plan"]?.models ?? {};
24
+ const keys = Object.keys(models);
25
+ return keys.length > 0 ? keys : ["GLM-5.2"];
26
+ }
27
+ catch {
28
+ return ["GLM-5.2"];
29
+ }
30
+ }
31
+ /** Read the context-window size for a model from config.json (limit.context). */
32
+ export function modelContextWindow(modelId) {
33
+ try {
34
+ const cfg = readConfig();
35
+ const models = cfg.provider?.["builtin:bigmodel-coding-plan"]?.models ?? {};
36
+ const entry = models[modelId];
37
+ return entry?.limit?.context ?? 0;
38
+ }
39
+ catch {
40
+ return 0;
41
+ }
42
+ }
43
+ /** Build the ACP SessionModeState ({currentModeId, availableModes}). */
44
+ export async function buildModes(server, zcodeSid) {
45
+ let currentMode = "yolo";
46
+ try {
47
+ const read = await sessionRead(server, zcodeSid);
48
+ const settings = (read.settings ?? {});
49
+ const modeSet = settings.mode ?? {};
50
+ currentMode = modeSet.current ?? currentMode;
51
+ }
52
+ catch {
53
+ // keep default
54
+ }
55
+ return {
56
+ currentModeId: currentMode,
57
+ availableModes: ["plan", "build", "edit", "yolo"].map((m) => ({ id: m, name: capitalize(m) })),
58
+ };
59
+ }
60
+ /** Build the ACP configOptions array (3 items: model/mode/thought). */
61
+ export async function buildConfigOptions(server, zcodeSid) {
62
+ let currentModel = "GLM-5.2";
63
+ let currentMode = "build";
64
+ let currentThought = "high";
65
+ let thoughtOptions = null;
66
+ try {
67
+ const read = await sessionRead(server, zcodeSid);
68
+ const settings = (read.settings ?? {});
69
+ const modeSet = settings.mode ?? {};
70
+ currentMode = modeSet.current ?? currentMode;
71
+ const modelSet = settings.model ?? {};
72
+ const cur = modelSet.current ?? {};
73
+ if (cur.modelId)
74
+ currentModel = cur.modelId;
75
+ const tlSet = settings.thoughtLevel ?? {};
76
+ currentThought = tlSet.current ?? currentThought;
77
+ const tlAvail = tlSet.available ?? [];
78
+ if (tlAvail.length > 0) {
79
+ thoughtOptions = tlAvail.map((a) => ({ value: a.value, name: a.label ?? a.value }));
80
+ }
81
+ }
82
+ catch {
83
+ // keep defaults
84
+ }
85
+ // Model options: config.json is authoritative (settings.model.available is incomplete).
86
+ let modelOptions = loadProviderModels().map((k) => ({ value: k, name: k }));
87
+ if (!modelOptions.some((o) => o.value === currentModel)) {
88
+ modelOptions = [{ value: currentModel, name: currentModel }, ...modelOptions];
89
+ }
90
+ if (!thoughtOptions)
91
+ thoughtOptions = [...CONFIG_META.thought.options];
92
+ return [
93
+ {
94
+ id: "model",
95
+ name: CONFIG_META.model.name,
96
+ category: "model",
97
+ type: "select",
98
+ currentValue: currentModel,
99
+ options: modelOptions,
100
+ },
101
+ {
102
+ id: "mode",
103
+ name: CONFIG_META.mode.name,
104
+ category: "mode",
105
+ type: "select",
106
+ currentValue: currentMode,
107
+ options: [...CONFIG_META.mode.options],
108
+ },
109
+ {
110
+ id: "thought",
111
+ name: CONFIG_META.thought.name,
112
+ category: "thought",
113
+ type: "select",
114
+ currentValue: currentThought,
115
+ options: thoughtOptions,
116
+ },
117
+ ];
118
+ }
119
+ /**
120
+ * Dispatch session/set_config_option. mode/thought forward to setMode/
121
+ * setThoughtLevel; model routes through applyModelSwitch (runtime-model.ts).
122
+ *
123
+ * Returns `{ kind, currentValue, options }` so the caller can emit the update
124
+ * notifications, or null when the configId is unknown / model switch fails.
125
+ */
126
+ export async function setConfigOption(server, zcodeSid, configId, value) {
127
+ if (configId === "model") {
128
+ const { applyModelSwitch } = await import("./runtime-model.js");
129
+ const ok = await applyModelSwitch(server, zcodeSid, value);
130
+ if (!ok)
131
+ return null;
132
+ return { kind: "model", currentValue: value };
133
+ }
134
+ const dispatch = CONFIG_DISPATCH[configId];
135
+ if (!dispatch)
136
+ return null;
137
+ const backend = server.ensureBackend();
138
+ const resp = await backend.request(server.nextId(), dispatch.method, { sessionId: zcodeSid, [dispatch.paramKey]: value }, 15000);
139
+ if (resp.error)
140
+ return null;
141
+ return { kind: configId, currentValue: value };
142
+ }
143
+ /** Emit a config_option_update (+ current_mode_update for mode) after a change.
144
+ * Returns the rebuilt options so the caller can include them in the response. */
145
+ export async function emitConfigOptionUpdate(server, cx, acpSid, zcodeSid, kind) {
146
+ const options = await buildConfigOptions(server, zcodeSid);
147
+ await sendSessionUpdate(cx, acpSid, {
148
+ sessionUpdate: "config_option_update",
149
+ configOptions: options,
150
+ });
151
+ if (kind === "mode") {
152
+ const modes = await buildModes(server, zcodeSid);
153
+ await sendSessionUpdate(cx, acpSid, {
154
+ sessionUpdate: "current_mode_update",
155
+ currentModeId: modes.currentModeId,
156
+ });
157
+ }
158
+ return options;
159
+ }
160
+ // ---------- helpers ----------
161
+ async function sessionRead(server, zcodeSid) {
162
+ const backend = server.ensureBackend();
163
+ const resp = await backend.request(server.nextId(), "session/read", { sessionId: zcodeSid }, 5000);
164
+ if (resp.error)
165
+ throw new Error(resp.error.message);
166
+ return (resp.result ?? {});
167
+ }
168
+ function capitalize(s) {
169
+ return s.charAt(0).toUpperCase() + s.slice(1);
170
+ }
171
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/config/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * runtimeModel overlay plumbing.
3
+ *
4
+ * The backend resolves auth from its OAuth token store, so the `runtimeModel`
5
+ * provider deliberately carries NO `apiKey` (the config.json apiKey is the
6
+ * legacy plain key and has expired → 401). Two uses:
7
+ *
8
+ * 1. Resume overlay (`buildResumeRuntimeModel`): a resumed session may carry
9
+ * a stale provider id in its history that the backend can no longer
10
+ * authenticate. Sending the *current* enabled provider's runtimeModel at
11
+ * resume makes the backend overlay it and use its own OAuth creds.
12
+ *
13
+ * 2. Model switch (`applyModelSwitch`): UI/slash model switching goes through
14
+ * `session/updateRuntimeModelConfig` with `applyModelSelection:true` (a
15
+ * runtime-only change, sidestepping `session/setModel`'s "no loaded config
16
+ * file" persistence failure).
17
+ */
18
+ import type { ZcodeAcpServer } from "../server.js";
19
+ /** Build a runtimeModel overlay object for the enabled provider. */
20
+ export declare function buildRuntimeModel(modelId?: string, revision?: string): unknown | null;
21
+ /** Build the resume-time overlay (current enabled provider, default model). */
22
+ export declare function buildResumeRuntimeModel(): unknown | null;
23
+ /**
24
+ * Switch a session's model via session/updateRuntimeModelConfig.
25
+ *
26
+ * Uses `applyModelSelection:true` so the change applies at runtime without
27
+ * persistence — sidestepping `session/setModel`'s "no loaded config file"
28
+ * failure. Invalidates the model cache on success. Returns true on success.
29
+ */
30
+ export declare function applyModelSwitch(server: ZcodeAcpServer, zcodeSid: string, modelId: string): Promise<boolean>;
31
+ /** Invalidate the session-level model cache after a switch. */
32
+ export declare function invalidateModelCache(server: ZcodeAcpServer, zcodeSid: string): void;
33
+ //# sourceMappingURL=runtime-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-model.d.ts","sourceRoot":"","sources":["../../src/config/runtime-model.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAoDnD,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,SAAW,GAAG,OAAO,GAAG,IAAI,CAcvF;AAED,+EAA+E;AAC/E,wBAAgB,uBAAuB,IAAI,OAAO,GAAG,IAAI,CAExD;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAmBlB;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEnF"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * runtimeModel overlay plumbing.
3
+ *
4
+ * The backend resolves auth from its OAuth token store, so the `runtimeModel`
5
+ * provider deliberately carries NO `apiKey` (the config.json apiKey is the
6
+ * legacy plain key and has expired → 401). Two uses:
7
+ *
8
+ * 1. Resume overlay (`buildResumeRuntimeModel`): a resumed session may carry
9
+ * a stale provider id in its history that the backend can no longer
10
+ * authenticate. Sending the *current* enabled provider's runtimeModel at
11
+ * resume makes the backend overlay it and use its own OAuth creds.
12
+ *
13
+ * 2. Model switch (`applyModelSwitch`): UI/slash model switching goes through
14
+ * `session/updateRuntimeModelConfig` with `applyModelSelection:true` (a
15
+ * runtime-only change, sidestepping `session/setModel`'s "no loaded config
16
+ * file" persistence failure).
17
+ */
18
+ import { readFileSync } from "node:fs";
19
+ import { ZCODE_CREDS_PATH, log, warn } from "../utils.js";
20
+ const DEFAULTS = {
21
+ providerId: "builtin:bigmodel-coding-plan",
22
+ kind: "anthropic",
23
+ baseURL: "https://open.bigmodel.cn/api/anthropic",
24
+ modelId: "GLM-5.2",
25
+ models: ["GLM-5.2"],
26
+ };
27
+ /** Read the enabled provider's config from config.json (no apiKey). */
28
+ function readEnabledProvider() {
29
+ try {
30
+ const cfg = JSON.parse(readFileSync(ZCODE_CREDS_PATH, "utf8"));
31
+ for (const [pid, p] of Object.entries(cfg.provider ?? {})) {
32
+ if (p?.enabled) {
33
+ const opts = p.options ?? {};
34
+ const modelKeys = Object.keys(p.models ?? {});
35
+ return {
36
+ providerId: pid,
37
+ kind: p.kind ?? DEFAULTS.kind,
38
+ baseURL: opts.baseURL || DEFAULTS.baseURL,
39
+ modelId: modelKeys[0] ?? DEFAULTS.modelId,
40
+ models: modelKeys.length > 0 ? modelKeys : DEFAULTS.models,
41
+ };
42
+ }
43
+ }
44
+ }
45
+ catch (e) {
46
+ log(`runtime-model: read config.json failed (${e instanceof Error ? e.message : String(e)})`);
47
+ }
48
+ return DEFAULTS;
49
+ }
50
+ /** Build a runtimeModel overlay object for the enabled provider. */
51
+ export function buildRuntimeModel(modelId, revision = "bridge") {
52
+ const pc = readEnabledProvider();
53
+ const targetModel = modelId ?? pc.modelId;
54
+ return {
55
+ revision,
56
+ generatedAt: Date.now(),
57
+ model: { providerId: pc.providerId, modelId: targetModel },
58
+ provider: {
59
+ providerId: pc.providerId,
60
+ kind: pc.kind,
61
+ baseURL: pc.baseURL,
62
+ models: pc.models.map((m) => ({ modelId: m })),
63
+ },
64
+ };
65
+ }
66
+ /** Build the resume-time overlay (current enabled provider, default model). */
67
+ export function buildResumeRuntimeModel() {
68
+ return buildRuntimeModel(undefined, "bridge-resume");
69
+ }
70
+ /**
71
+ * Switch a session's model via session/updateRuntimeModelConfig.
72
+ *
73
+ * Uses `applyModelSelection:true` so the change applies at runtime without
74
+ * persistence — sidestepping `session/setModel`'s "no loaded config file"
75
+ * failure. Invalidates the model cache on success. Returns true on success.
76
+ */
77
+ export async function applyModelSwitch(server, zcodeSid, modelId) {
78
+ const runtimeModel = buildRuntimeModel(modelId, "bridge-switch");
79
+ if (runtimeModel === null) {
80
+ log("runtime-model: cannot read provider config (config.json)");
81
+ return false;
82
+ }
83
+ const backend = server.ensureBackend();
84
+ const resp = await backend.request(server.nextId(), "session/updateRuntimeModelConfig", { sessionId: zcodeSid, runtimeModel, applyModelSelection: true }, 15000);
85
+ if (resp.error) {
86
+ warn(`runtime-model: switch failed: ${resp.error.message}`);
87
+ return false;
88
+ }
89
+ invalidateModelCache(server, zcodeSid);
90
+ return true;
91
+ }
92
+ /** Invalidate the session-level model cache after a switch. */
93
+ export function invalidateModelCache(server, zcodeSid) {
94
+ server.modelCache.delete(zcodeSid);
95
+ }
96
+ //# sourceMappingURL=runtime-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-model.js","sourceRoot":"","sources":["../../src/config/runtime-model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * dispatchEvent — the single funnel that turns an InternalEvent into an ACP
3
+ * `session/update` notification.
4
+ *
5
+ * Each event kind is serialised here so the translation layers stay focused
6
+ * on producing the internal shape. The Bash terminal-output protocol (the
7
+ * 2-notification split: terminal_output + terminal_exit) is fully implemented
8
+ * below in dispatchTerminalUpdate.
9
+ */
10
+ import type * as acp from "@agentclientprotocol/sdk";
11
+ import type { InternalEvent } from "../translators/types.js";
12
+ import type { ZcodeAcpServer } from "../server.js";
13
+ /** Dispatch one internal event to the ACP client as a session/update. */
14
+ export declare function dispatchEvent(server: ZcodeAcpServer, cx: acp.AgentContext, acpSid: string, ev: InternalEvent, chunkMsgId: string): Promise<void>;
15
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/handlers/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,KAAK,GAAG,MAAM,0BAA0B,CAAC;AAKrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,yEAAyE;AACzE,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,EAAE,EAAE,GAAG,CAAC,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,aAAa,EACjB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAmCf"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * dispatchEvent — the single funnel that turns an InternalEvent into an ACP
3
+ * `session/update` notification.
4
+ *
5
+ * Each event kind is serialised here so the translation layers stay focused
6
+ * on producing the internal shape. The Bash terminal-output protocol (the
7
+ * 2-notification split: terminal_output + terminal_exit) is fully implemented
8
+ * below in dispatchTerminalUpdate.
9
+ */
10
+ import { randomUUID } from "node:crypto";
11
+ import { currentModelCached } from "../config/model-cache.js";
12
+ import { modelContextWindow } from "../config/options.js";
13
+ import { extractExitCode, TOOL_KIND_MAP } from "../translators/tool-helpers.js";
14
+ import { sendSessionUpdate } from "./io.js";
15
+ /** Dispatch one internal event to the ACP client as a session/update. */
16
+ export async function dispatchEvent(server, cx, acpSid, ev, chunkMsgId) {
17
+ switch (ev.kind) {
18
+ case "ToolCallNew":
19
+ await dispatchToolCallNew(server, cx, acpSid, ev);
20
+ break;
21
+ case "ToolCallUpdate":
22
+ await dispatchToolCallUpdate(server, cx, acpSid, ev);
23
+ break;
24
+ case "UsageDelta":
25
+ await dispatchUsageDelta(server, cx, acpSid, ev);
26
+ break;
27
+ case "TextDelta":
28
+ await sendSessionUpdate(cx, acpSid, {
29
+ sessionUpdate: "agent_message_chunk",
30
+ content: { type: "text", text: ev.text },
31
+ messageId: chunkMsgId,
32
+ });
33
+ break;
34
+ case "ReasoningDelta":
35
+ await sendSessionUpdate(cx, acpSid, {
36
+ sessionUpdate: "agent_thought_chunk",
37
+ content: { type: "text", text: ev.text },
38
+ messageId: `thought_${chunkMsgId}`,
39
+ });
40
+ break;
41
+ case "PlanUpdate":
42
+ await sendSessionUpdate(cx, acpSid, {
43
+ sessionUpdate: "plan",
44
+ entries: ev.entries,
45
+ });
46
+ break;
47
+ case "FilesChanged":
48
+ await dispatchFilesChanged(cx, acpSid, ev);
49
+ break;
50
+ }
51
+ }
52
+ function dispatchToolCallNew(server, cx, acpSid, ev) {
53
+ const termSupported = server.supportsTerminalOutput() && (ev.tool === "Bash" || ev.tool === "bash");
54
+ const meta = { claudeCode: { toolName: ev.tool } };
55
+ if (termSupported)
56
+ meta["terminal_info"] = { terminal_id: ev.callId };
57
+ const update = {
58
+ sessionUpdate: "tool_call",
59
+ toolCallId: ev.callId,
60
+ title: ev.title,
61
+ kind: (TOOL_KIND_MAP[ev.tool] ?? "other"),
62
+ status: ev.status,
63
+ rawInput: ev.input,
64
+ _meta: meta,
65
+ };
66
+ if (termSupported) {
67
+ update.content = [{ type: "terminal", terminalId: ev.callId }];
68
+ }
69
+ else if (ev.diffContent && ev.diffContent.length > 0) {
70
+ update.content = ev.diffContent;
71
+ }
72
+ else if (ev.content && ev.content.length > 0) {
73
+ update.content = ev.content;
74
+ }
75
+ if (ev.locations && ev.locations.length > 0)
76
+ update.locations = ev.locations;
77
+ return sendSessionUpdate(cx, acpSid, update);
78
+ }
79
+ function dispatchToolCallUpdate(server, cx, acpSid, ev) {
80
+ const toolName = ev.tool ?? "";
81
+ const termSupported = server.supportsTerminalOutput() && (toolName === "Bash" || toolName === "bash");
82
+ if (termSupported) {
83
+ // Bash terminal protocol (full 2-notification split arrives in Commit 5).
84
+ // For now emit the terminal_output data + the standard update with status.
85
+ return dispatchTerminalUpdate(server, cx, acpSid, ev, toolName);
86
+ }
87
+ const update = {
88
+ sessionUpdate: "tool_call_update",
89
+ toolCallId: ev.callId,
90
+ status: ev.status,
91
+ };
92
+ const meta = {};
93
+ if (toolName)
94
+ meta["claudeCode"] = { toolName };
95
+ if (ev.output !== undefined)
96
+ update.rawOutput = ev.output;
97
+ if (ev.diffContent && ev.diffContent.length > 0) {
98
+ update.content = ev.diffContent;
99
+ }
100
+ else if (ev.content && ev.content.length > 0) {
101
+ update.content = ev.content;
102
+ }
103
+ if (Object.keys(meta).length > 0)
104
+ update._meta = meta;
105
+ if (ev.locations && ev.locations.length > 0)
106
+ update.locations = ev.locations;
107
+ return sendSessionUpdate(cx, acpSid, update);
108
+ }
109
+ /**
110
+ * Bash terminal update — the 2-notification split (matches acp-agent.ts:5061-5094
111
+ * and the Python bridge's _dispatch_event). Zed correlates by terminal_id, so
112
+ * the two notifications MUST be separate:
113
+ * ① terminal_output — pure data, no status/content. Sent on BOTH progress and
114
+ * result states (whenever there's data) so live output streams.
115
+ * ② terminal_exit — terminal state only: status + content[type:terminal] +
116
+ * _meta.terminal_exit (with exitCode) + rawOutput text fallback. Sent ONLY
117
+ * on completed/failed.
118
+ *
119
+ * Merging them into one notification causes Zed to clear the content once the
120
+ * turn completes (the original bug); splitting keeps the output visible.
121
+ */
122
+ async function dispatchTerminalUpdate(_server, cx, acpSid, ev, toolName) {
123
+ // ① terminal_output (pure data) — progress and result both emit it.
124
+ let termData = ev.rawOutput ?? ev.rawResult;
125
+ if (termData && typeof termData === "object" && !Array.isArray(termData)) {
126
+ termData = termData["content"] ?? "";
127
+ }
128
+ if (termData) {
129
+ await sendSessionUpdate(cx, acpSid, {
130
+ sessionUpdate: "tool_call_update",
131
+ toolCallId: ev.callId,
132
+ _meta: { terminal_output: { terminal_id: ev.callId, data: String(termData) } },
133
+ });
134
+ }
135
+ // ② terminal_exit (terminal state) — only on completed/failed.
136
+ if (ev.status === "completed" || ev.status === "failed") {
137
+ const exitCode = extractExitCode(ev.rawResult, ev.status === "failed");
138
+ const exitUpdate = {
139
+ sessionUpdate: "tool_call_update",
140
+ toolCallId: ev.callId,
141
+ status: ev.status,
142
+ content: [{ type: "terminal", terminalId: ev.callId }],
143
+ _meta: {
144
+ claudeCode: { toolName },
145
+ terminal_exit: { terminal_id: ev.callId, exit_code: exitCode, signal: null },
146
+ },
147
+ };
148
+ // rawOutput gives Zed a text fallback outside the terminal render path.
149
+ if (ev.output !== undefined)
150
+ exitUpdate.rawOutput = ev.output;
151
+ await sendSessionUpdate(cx, acpSid, exitUpdate);
152
+ }
153
+ }
154
+ async function dispatchUsageDelta(server, cx, acpSid, ev) {
155
+ // The backend often returns contextWindow=0; fill from the model's
156
+ // config.json limit.context so the editor can render the context bar.
157
+ let size = ev.size;
158
+ if (!size) {
159
+ const modelId = await currentModelCached(server, acpSid);
160
+ size = modelContextWindow(modelId);
161
+ }
162
+ await sendSessionUpdate(cx, acpSid, {
163
+ sessionUpdate: "usage_update",
164
+ used: ev.used,
165
+ size,
166
+ });
167
+ }
168
+ function dispatchFilesChanged(cx, acpSid, ev) {
169
+ const files = ev.files;
170
+ const preview = files.slice(0, 3).join(", ");
171
+ const ellipsis = files.length > 3 ? "..." : "";
172
+ return sendSessionUpdate(cx, acpSid, {
173
+ sessionUpdate: "tool_call",
174
+ toolCallId: `files_${randomUUID().slice(0, 8)}`,
175
+ title: `changed files (${files.length}): ${preview}${ellipsis}`,
176
+ kind: "edit",
177
+ status: "completed",
178
+ content: [
179
+ { type: "content", content: { type: "text", text: "affected files:\n" + files.join("\n") } },
180
+ ],
181
+ });
182
+ }
183
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/handlers/dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
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 type * as acp from "@agentclientprotocol/sdk";
14
+ import type { ZcodeAcpServer } from "../server.js";
15
+ interface ExtensionParams {
16
+ sessionId: string;
17
+ [key: string]: unknown;
18
+ }
19
+ type Result = Record<string, unknown>;
20
+ /** session/fork → zcode session/fork: branch a new session from a checkpoint. */
21
+ export declare function fork(server: ZcodeAcpServer, params: ExtensionParams): Promise<Result>;
22
+ /** session/rewind → zcode session/rewind: restore workspace files to a checkpoint. */
23
+ export declare function rewind(server: ZcodeAcpServer, params: ExtensionParams): Promise<Result>;
24
+ /** session/rewindCascade → zcode session/rewindCascade: cascade rewind. */
25
+ export declare function rewindCascade(server: ZcodeAcpServer, params: ExtensionParams): Promise<Result>;
26
+ /** session/goal → zcode session/goal: read/set/replace/clear/pause/resume the goal. */
27
+ export declare function goal(server: ZcodeAcpServer, params: ExtensionParams): Promise<Result>;
28
+ /** session/compact → zcode session/compact + wait for the internal AI turn. */
29
+ export declare function compact(server: ZcodeAcpServer, params: ExtensionParams, cx: acp.AgentContext): Promise<Result>;
30
+ /** session/steer → zcode session/steer: append instructions to a running turn. */
31
+ export declare function steer(server: ZcodeAcpServer, params: ExtensionParams): Promise<Result>;
32
+ /** session/cancelBackgroundTask → zcode session/cancelBackgroundTask. */
33
+ export declare function cancelBackgroundTask(server: ZcodeAcpServer, params: ExtensionParams): Promise<Result>;
34
+ /** session/setThoughtLevel → zcode session/setThoughtLevel. */
35
+ export declare function setThoughtLevel(server: ZcodeAcpServer, params: ExtensionParams): Promise<Result>;
36
+ /** session/updateRuntimeModelConfig → same: runtime overlay of session model config. */
37
+ export declare function updateRuntimeModelConfig(server: ZcodeAcpServer, params: ExtensionParams): Promise<Result>;
38
+ /** session/setModel → applyModelSwitch (runtime overlay, not persistence). */
39
+ export declare function setModel(server: ZcodeAcpServer, params: ExtensionParams): Promise<Result>;
40
+ /** session/setMode → zcode session/setMode + emit config_option/current_mode updates. */
41
+ export declare function setMode(server: ZcodeAcpServer, params: ExtensionParams, cx: acp.AgentContext): Promise<Result>;
42
+ export {};
43
+ //# sourceMappingURL=extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../src/handlers/extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,KAAK,GAAG,MAAM,0BAA0B,CAAC;AAOrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAiBnD,UAAU,eAAe;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEtC,iFAAiF;AACjF,wBAAsB,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAc3F;AAED,sFAAsF;AACtF,wBAAsB,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAa7F;AAED,2EAA2E;AAC3E,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,MAAM,CAAC,CAcjB;AAED,uFAAuF;AACvF,wBAAsB,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB3F;AAED,+EAA+E;AAC/E,wBAAsB,OAAO,CAC3B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,eAAe,EACvB,EAAE,EAAE,GAAG,CAAC,YAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CAiCjB;AAED,kFAAkF;AAClF,wBAAsB,KAAK,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAW5F;AAED,yEAAyE;AACzE,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED,+DAA+D;AAC/D,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,MAAM,CAAC,CAejB;AAED,wFAAwF;AACxF,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,MAAM,CAAC,CAajB;AAED,8EAA8E;AAC9E,wBAAsB,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ/F;AAED,yFAAyF;AACzF,wBAAsB,OAAO,CAC3B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,eAAe,EACvB,EAAE,EAAE,GAAG,CAAC,YAAY,GACnB,OAAO,CAAC,MAAM,CAAC,CA0BjB"}