zcode-acp-server 0.1.0 → 0.2.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 (188) hide show
  1. package/README.md +98 -1
  2. package/README.zh-CN.md +81 -1
  3. package/dist/backend/client.d.ts +12 -4
  4. package/dist/backend/client.d.ts.map +1 -1
  5. package/dist/backend/client.js +72 -7
  6. package/dist/backend/client.js.map +1 -1
  7. package/dist/backend/credentials.d.ts.map +1 -1
  8. package/dist/backend/credentials.js +2 -1
  9. package/dist/backend/credentials.js.map +1 -1
  10. package/dist/backend/listener.d.ts +12 -4
  11. package/dist/backend/listener.d.ts.map +1 -1
  12. package/dist/backend/listener.js +68 -12
  13. package/dist/backend/listener.js.map +1 -1
  14. package/dist/backend/types.d.ts +1 -1
  15. package/dist/backend/types.d.ts.map +1 -1
  16. package/dist/bin/quota.d.ts +54 -0
  17. package/dist/bin/quota.d.ts.map +1 -0
  18. package/dist/bin/quota.js +333 -0
  19. package/dist/bin/quota.js.map +1 -0
  20. package/dist/config/auto-compact.d.ts +23 -0
  21. package/dist/config/auto-compact.d.ts.map +1 -0
  22. package/dist/config/auto-compact.js +67 -0
  23. package/dist/config/auto-compact.js.map +1 -0
  24. package/dist/config/mcp-discovery.d.ts +34 -0
  25. package/dist/config/mcp-discovery.d.ts.map +1 -0
  26. package/dist/config/mcp-discovery.js +153 -0
  27. package/dist/config/mcp-discovery.js.map +1 -0
  28. package/dist/config/model-cache.d.ts +12 -1
  29. package/dist/config/model-cache.d.ts.map +1 -1
  30. package/dist/config/model-cache.js +30 -8
  31. package/dist/config/model-cache.js.map +1 -1
  32. package/dist/config/options.d.ts +87 -9
  33. package/dist/config/options.d.ts.map +1 -1
  34. package/dist/config/options.js +248 -45
  35. package/dist/config/options.js.map +1 -1
  36. package/dist/config/plugin-commands.d.ts +24 -0
  37. package/dist/config/plugin-commands.d.ts.map +1 -0
  38. package/dist/config/plugin-commands.js +107 -0
  39. package/dist/config/plugin-commands.js.map +1 -0
  40. package/dist/config/provider-registry.d.ts +60 -0
  41. package/dist/config/provider-registry.d.ts.map +1 -0
  42. package/dist/config/provider-registry.js +128 -0
  43. package/dist/config/provider-registry.js.map +1 -0
  44. package/dist/config/runtime-model.d.ts +54 -18
  45. package/dist/config/runtime-model.d.ts.map +1 -1
  46. package/dist/config/runtime-model.js +105 -61
  47. package/dist/config/runtime-model.js.map +1 -1
  48. package/dist/config/skill-discovery.d.ts +35 -0
  49. package/dist/config/skill-discovery.d.ts.map +1 -0
  50. package/dist/config/skill-discovery.js +188 -0
  51. package/dist/config/skill-discovery.js.map +1 -0
  52. package/dist/handlers/background-tasks.d.ts +72 -0
  53. package/dist/handlers/background-tasks.d.ts.map +1 -0
  54. package/dist/handlers/background-tasks.js +330 -0
  55. package/dist/handlers/background-tasks.js.map +1 -0
  56. package/dist/handlers/dispatch.d.ts.map +1 -1
  57. package/dist/handlers/dispatch.js +134 -22
  58. package/dist/handlers/dispatch.js.map +1 -1
  59. package/dist/handlers/extensions.d.ts +15 -0
  60. package/dist/handlers/extensions.d.ts.map +1 -1
  61. package/dist/handlers/extensions.js +43 -27
  62. package/dist/handlers/extensions.js.map +1 -1
  63. package/dist/handlers/io.d.ts +11 -2
  64. package/dist/handlers/io.d.ts.map +1 -1
  65. package/dist/handlers/io.js +51 -7
  66. package/dist/handlers/io.js.map +1 -1
  67. package/dist/handlers/server-requests.d.ts +20 -4
  68. package/dist/handlers/server-requests.d.ts.map +1 -1
  69. package/dist/handlers/server-requests.js +293 -63
  70. package/dist/handlers/server-requests.js.map +1 -1
  71. package/dist/handlers/session.d.ts +113 -10
  72. package/dist/handlers/session.d.ts.map +1 -1
  73. package/dist/handlers/session.js +876 -220
  74. package/dist/handlers/session.js.map +1 -1
  75. package/dist/handlers/slash.d.ts +14 -0
  76. package/dist/handlers/slash.d.ts.map +1 -1
  77. package/dist/handlers/slash.js +80 -6
  78. package/dist/handlers/slash.js.map +1 -1
  79. package/dist/index.js +38 -4
  80. package/dist/index.js.map +1 -1
  81. package/dist/interaction/adapter.d.ts +19 -33
  82. package/dist/interaction/adapter.d.ts.map +1 -1
  83. package/dist/interaction/adapter.js +80 -79
  84. package/dist/interaction/adapter.js.map +1 -1
  85. package/dist/lazy-sessions.d.ts +35 -0
  86. package/dist/lazy-sessions.d.ts.map +1 -0
  87. package/dist/lazy-sessions.js +98 -0
  88. package/dist/lazy-sessions.js.map +1 -0
  89. package/dist/quota/cache.d.ts +18 -0
  90. package/dist/quota/cache.d.ts.map +1 -0
  91. package/dist/quota/cache.js +32 -0
  92. package/dist/quota/cache.js.map +1 -0
  93. package/dist/quota/client.d.ts +30 -0
  94. package/dist/quota/client.d.ts.map +1 -0
  95. package/dist/quota/client.js +57 -0
  96. package/dist/quota/client.js.map +1 -0
  97. package/dist/quota/color.d.ts +58 -0
  98. package/dist/quota/color.d.ts.map +1 -0
  99. package/dist/quota/color.js +95 -0
  100. package/dist/quota/color.js.map +1 -0
  101. package/dist/quota/combined.d.ts +66 -0
  102. package/dist/quota/combined.d.ts.map +1 -0
  103. package/dist/quota/combined.js +179 -0
  104. package/dist/quota/combined.js.map +1 -0
  105. package/dist/quota/format.d.ts +105 -0
  106. package/dist/quota/format.d.ts.map +1 -0
  107. package/dist/quota/format.js +219 -0
  108. package/dist/quota/format.js.map +1 -0
  109. package/dist/quota/index.d.ts +23 -0
  110. package/dist/quota/index.d.ts.map +1 -0
  111. package/dist/quota/index.js +42 -0
  112. package/dist/quota/index.js.map +1 -0
  113. package/dist/quota/opencode-go/cache.d.ts +17 -0
  114. package/dist/quota/opencode-go/cache.d.ts.map +1 -0
  115. package/dist/quota/opencode-go/cache.js +31 -0
  116. package/dist/quota/opencode-go/cache.js.map +1 -0
  117. package/dist/quota/opencode-go/client.d.ts +28 -0
  118. package/dist/quota/opencode-go/client.d.ts.map +1 -0
  119. package/dist/quota/opencode-go/client.js +48 -0
  120. package/dist/quota/opencode-go/client.js.map +1 -0
  121. package/dist/quota/opencode-go/config.d.ts +37 -0
  122. package/dist/quota/opencode-go/config.d.ts.map +1 -0
  123. package/dist/quota/opencode-go/config.js +58 -0
  124. package/dist/quota/opencode-go/config.js.map +1 -0
  125. package/dist/quota/opencode-go/format.d.ts +36 -0
  126. package/dist/quota/opencode-go/format.d.ts.map +1 -0
  127. package/dist/quota/opencode-go/format.js +87 -0
  128. package/dist/quota/opencode-go/format.js.map +1 -0
  129. package/dist/quota/opencode-go/index.d.ts +30 -0
  130. package/dist/quota/opencode-go/index.d.ts.map +1 -0
  131. package/dist/quota/opencode-go/index.js +108 -0
  132. package/dist/quota/opencode-go/index.js.map +1 -0
  133. package/dist/quota/opencode-go/parse.d.ts +41 -0
  134. package/dist/quota/opencode-go/parse.d.ts.map +1 -0
  135. package/dist/quota/opencode-go/parse.js +75 -0
  136. package/dist/quota/opencode-go/parse.js.map +1 -0
  137. package/dist/quota/opencode-go/types.d.ts +48 -0
  138. package/dist/quota/opencode-go/types.d.ts.map +1 -0
  139. package/dist/quota/opencode-go/types.js +11 -0
  140. package/dist/quota/opencode-go/types.js.map +1 -0
  141. package/dist/quota/parse.d.ts +33 -0
  142. package/dist/quota/parse.d.ts.map +1 -0
  143. package/dist/quota/parse.js +200 -0
  144. package/dist/quota/parse.js.map +1 -0
  145. package/dist/quota/types.d.ts +72 -0
  146. package/dist/quota/types.d.ts.map +1 -0
  147. package/dist/quota/types.js +10 -0
  148. package/dist/quota/types.js.map +1 -0
  149. package/dist/server.d.ts +104 -0
  150. package/dist/server.d.ts.map +1 -1
  151. package/dist/server.js +119 -2
  152. package/dist/server.js.map +1 -1
  153. package/dist/tasks-index.d.ts +14 -4
  154. package/dist/tasks-index.d.ts.map +1 -1
  155. package/dist/tasks-index.js +145 -46
  156. package/dist/tasks-index.js.map +1 -1
  157. package/dist/translators/event-translator.d.ts +33 -0
  158. package/dist/translators/event-translator.d.ts.map +1 -1
  159. package/dist/translators/event-translator.js +101 -0
  160. package/dist/translators/event-translator.js.map +1 -1
  161. package/dist/translators/index.d.ts +1 -1
  162. package/dist/translators/index.d.ts.map +1 -1
  163. package/dist/translators/index.js +1 -1
  164. package/dist/translators/index.js.map +1 -1
  165. package/dist/translators/projection-differ.d.ts +8 -0
  166. package/dist/translators/projection-differ.d.ts.map +1 -1
  167. package/dist/translators/projection-differ.js +19 -9
  168. package/dist/translators/projection-differ.js.map +1 -1
  169. package/dist/translators/tool-helpers.d.ts +28 -0
  170. package/dist/translators/tool-helpers.d.ts.map +1 -1
  171. package/dist/translators/tool-helpers.js +104 -0
  172. package/dist/translators/tool-helpers.js.map +1 -1
  173. package/dist/translators/types.d.ts +38 -1
  174. package/dist/translators/types.d.ts.map +1 -1
  175. package/dist/translators/types.js.map +1 -1
  176. package/dist/utils.d.ts +35 -6
  177. package/dist/utils.d.ts.map +1 -1
  178. package/dist/utils.js +52 -4
  179. package/dist/utils.js.map +1 -1
  180. package/docs/ARCHITECTURE.md +96 -38
  181. package/docs/BACKLOG.md +57 -0
  182. package/docs/DEVELOPMENT.md +5 -0
  183. package/docs/PROTOCOL.md +270 -5
  184. package/docs/TROUBLESHOOTING.md +98 -14
  185. package/docs/agents/domain.md +51 -0
  186. package/docs/agents/issue-tracker.md +22 -0
  187. package/docs/agents/triage-labels.md +15 -0
  188. package/package.json +6 -5
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Skill discovery — scans the same directories ZCode uses to discover Skills,
3
+ * reads each SKILL.md frontmatter, and returns entries suitable for the ACP
4
+ * `available_commands_update` notification.
5
+ *
6
+ * Each discovered skill becomes its own `/skill-name` slash command in the
7
+ * editor's completion menu (matching Claude Code's behaviour). The model
8
+ * resolves the invocation via its `Skill` tool — the bridge just lists them
9
+ * and passes the text through.
10
+ *
11
+ * Discovery sources (in priority order — first occurrence wins on name clash):
12
+ * 1. ~/.zcode/skills/*/SKILL.md (user scope, ZCode native)
13
+ * 2. ~/.agents/skills/*/SKILL.md (user scope, shared agents)
14
+ * 3. enabled plugin <cache>/skills/&#42;/SKILL.md
15
+ * 4. <cwd>/.agents/skills/&#42;/SKILL.md (project scope)
16
+ *
17
+ * Skills explicitly disabled in `~/.zcode/cli/config.json` (skills map with
18
+ * `enable: false`, keyed by absolute SKILL.md path) are excluded.
19
+ */
20
+ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
21
+ import { homedir } from "node:os";
22
+ import path from "node:path";
23
+ import process from "node:process";
24
+ import { compareVersions, log } from "../utils.js";
25
+ const HOME = homedir();
26
+ /** Path to the ZCode CLI config (skills enable/disable, plugins, mcp). */
27
+ const CLI_CONFIG_PATH = path.join(HOME, ".zcode", "cli", "config.json");
28
+ /** Root of the plugin cache directory. */
29
+ const PLUGIN_CACHE_DIR = path.join(HOME, ".zcode", "cli", "plugins", "cache");
30
+ /** Max description length before truncation with ellipsis. */
31
+ const MAX_DESC_LEN = 80;
32
+ /**
33
+ * Parse YAML-like frontmatter from a SKILL.md file.
34
+ * Returns a map of key→string (values have surrounding quotes stripped).
35
+ */
36
+ function parseFrontmatter(content) {
37
+ const fm = {};
38
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
39
+ if (!match)
40
+ return fm;
41
+ const lines = match[1].split(/\r?\n/);
42
+ for (const line of lines) {
43
+ const idx = line.indexOf(":");
44
+ if (idx <= 0)
45
+ continue;
46
+ const key = line.slice(0, idx).trim();
47
+ let val = line.slice(idx + 1).trim();
48
+ if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
49
+ val = val.slice(1, -1);
50
+ }
51
+ if (key)
52
+ fm[key] = val;
53
+ }
54
+ return fm;
55
+ }
56
+ /** Truncate a description to MAX_DESC_LEN, appending "…" if truncated. */
57
+ function truncateDesc(desc) {
58
+ if (desc.length <= MAX_DESC_LEN)
59
+ return desc;
60
+ return desc.slice(0, MAX_DESC_LEN - 1) + "…";
61
+ }
62
+ /** Read the disabled skill paths from config.json (set of absolute paths). */
63
+ function loadDisabledSkillPaths(config) {
64
+ const disabled = new Set();
65
+ if (!config?.skills)
66
+ return disabled;
67
+ for (const [skillPath, cfg] of Object.entries(config.skills)) {
68
+ if (cfg?.enable === false)
69
+ disabled.add(skillPath);
70
+ }
71
+ return disabled;
72
+ }
73
+ /** Scan a directory for skill subdirectories containing SKILL.md. */
74
+ function scanSkillDir(dir, disabledPaths, results, seen) {
75
+ if (!existsSync(dir))
76
+ return;
77
+ let entries;
78
+ try {
79
+ entries = readdirSync(dir);
80
+ }
81
+ catch {
82
+ return;
83
+ }
84
+ for (const entry of entries) {
85
+ const skillDir = path.join(dir, entry);
86
+ try {
87
+ if (!statSync(skillDir).isDirectory())
88
+ continue;
89
+ }
90
+ catch {
91
+ continue;
92
+ }
93
+ const skillMd = path.join(skillDir, "SKILL.md");
94
+ if (!existsSync(skillMd))
95
+ continue;
96
+ // Resolve absolute path for disabled-check.
97
+ const absPath = path.resolve(skillMd);
98
+ if (disabledPaths.has(absPath))
99
+ continue;
100
+ const content = readFileSync(skillMd, "utf8");
101
+ const fm = parseFrontmatter(content);
102
+ const name = fm["name"] ?? entry;
103
+ const description = fm["description"] ?? "";
104
+ if (!description)
105
+ continue;
106
+ // Skip explicitly non-user-invocable skills.
107
+ if (fm["user-invocable"] === "false")
108
+ continue;
109
+ // Prefix with $ so the editor groups skills visually (e.g. "$tdd") and
110
+ // handleSlashCommand can route by prefix.
111
+ const cmdName = `$${name}`;
112
+ if (seen.has(cmdName))
113
+ continue;
114
+ seen.add(cmdName);
115
+ const skillEntry = {
116
+ name: cmdName,
117
+ description: truncateDesc(description),
118
+ };
119
+ // Only request follow-up input when the skill author explicitly declares
120
+ // an argument-hint — matching plugin-commands.ts behaviour. Skills without
121
+ // argument-hint (e.g. $tdd, $setup-matt-pocock-skills) send immediately on
122
+ // selection; skills with one (e.g. $handoff, $teach) wait for user input.
123
+ const hint = fm["argument-hint"];
124
+ if (hint)
125
+ skillEntry.input = { hint };
126
+ results.push(skillEntry);
127
+ }
128
+ }
129
+ /**
130
+ * Discover all enabled skills from the filesystem.
131
+ *
132
+ * Returns entries suitable for `available_commands_update`. Best-effort:
133
+ * failures are logged and swallowed (returns whatever was found).
134
+ */
135
+ export function loadSkillCommands() {
136
+ const results = [];
137
+ const seen = new Set();
138
+ // Load config for disabled-skills list + enabled-plugins list.
139
+ let config = null;
140
+ try {
141
+ if (existsSync(CLI_CONFIG_PATH)) {
142
+ config = JSON.parse(readFileSync(CLI_CONFIG_PATH, "utf8"));
143
+ }
144
+ }
145
+ catch (e) {
146
+ log(`skill-discovery: config read failed (${e instanceof Error ? e.message : String(e)})`);
147
+ }
148
+ const disabledPaths = loadDisabledSkillPaths(config);
149
+ // 1. ~/.zcode/skills/
150
+ scanSkillDir(path.join(HOME, ".zcode", "skills"), disabledPaths, results, seen);
151
+ // 2. ~/.agents/skills/
152
+ scanSkillDir(path.join(HOME, ".agents", "skills"), disabledPaths, results, seen);
153
+ // 3. Enabled plugin skills.
154
+ const enabledPlugins = config?.plugins?.enabledPlugins ?? {};
155
+ for (const [pluginKey, enabledFlag] of Object.entries(enabledPlugins)) {
156
+ if (!enabledFlag)
157
+ continue;
158
+ const atIdx = pluginKey.indexOf("@");
159
+ if (atIdx <= 0)
160
+ continue;
161
+ const pluginName = pluginKey.slice(0, atIdx);
162
+ const marketplace = pluginKey.slice(atIdx + 1);
163
+ const pluginDir = path.join(PLUGIN_CACHE_DIR, marketplace, pluginName);
164
+ if (!existsSync(pluginDir))
165
+ continue;
166
+ // Find the latest version directory.
167
+ let latestVersion = "";
168
+ try {
169
+ for (const entry of readdirSync(pluginDir)) {
170
+ const vDir = path.join(pluginDir, entry);
171
+ if (statSync(vDir).isDirectory() && compareVersions(entry, latestVersion) > 0) {
172
+ latestVersion = entry;
173
+ }
174
+ }
175
+ }
176
+ catch {
177
+ continue;
178
+ }
179
+ if (!latestVersion)
180
+ continue;
181
+ scanSkillDir(path.join(pluginDir, latestVersion, "skills"), disabledPaths, results, seen);
182
+ }
183
+ // 4. Project-level .agents/skills/ (if exists).
184
+ scanSkillDir(path.join(process.cwd(), ".agents", "skills"), disabledPaths, results, seen);
185
+ log(`skill-discovery: loaded ${results.length} skill(s)`);
186
+ return results;
187
+ }
188
+ //# sourceMappingURL=skill-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-discovery.js","sourceRoot":"","sources":["../../src/config/skill-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Session-scoped background-task listener.
3
+ *
4
+ * Background sub-agents (the Agent/Task tool launched with `run_in_background:
5
+ * true`) keep producing events AFTER `session/prompt` has returned: their
6
+ * internal tool calls stream as `tool.updated`, and when they finish the
7
+ * backend auto-triggers a notification turn (`turn.started` with
8
+ * `inputSource:"background_task"`) whose `text_delta` carries the result.
9
+ *
10
+ * The per-prompt turn loop (`runEventTurn`) exits at `turn.completed` and
11
+ * unregisters its listener, so without this module ALL of those post-turn
12
+ * events are silently dropped — the user sees "background task launched" and
13
+ * then nothing.
14
+ *
15
+ * This listener is registered once per session (lives across prompts) and
16
+ * forwards a curated subset to the ACP client as out-of-band `session/update`
17
+ * notifications:
18
+ *
19
+ * - `session.updated` carrying `taskId` → background task status change.
20
+ * First sighting emits a fresh `tool_call` card (`[background] …`);
21
+ * subsequent sightings emit `tool_call_update` with the new status.
22
+ * - `turn.started` with `inputSource:"background_task"` → marks the start
23
+ * of a notification turn; its `model.streaming text_delta` is forwarded
24
+ * as `agent_message_chunk` so the user sees the background result.
25
+ *
26
+ * Everything else is ignored — the turn loop handles normal turns and normal
27
+ * tool calls. Per the design decision, background agents' INTERNAL tool calls
28
+ * are NOT expanded here (only the task-level card + the final result message).
29
+ *
30
+ * All work is best-effort: failures are logged via `warn()` and never thrown
31
+ * into the event loop (would crash the bridge, per AGENTS.md).
32
+ */
33
+ import type { EventListener } from "../backend/client.js";
34
+ import type { ZcodeEvent } from "../backend/types.js";
35
+ import type { ZcodeAcpServer } from "../server.js";
36
+ export declare class BackgroundTaskListener implements EventListener {
37
+ private readonly server;
38
+ readonly zcodeSid: string;
39
+ /** taskId → tracked state. */
40
+ private readonly tasks;
41
+ /**
42
+ * The turnId of the currently-active background notification turn, if any.
43
+ * While set, that turn's `model.streaming text_delta` events are forwarded
44
+ * to the client as `agent_message_chunk`.
45
+ */
46
+ private activeNotifyTurnId;
47
+ constructor(server: ZcodeAcpServer, zcodeSid: string);
48
+ handleEvent(event: ZcodeEvent): void;
49
+ /** Handle a `session.updated` carrying a background task status. */
50
+ private onTaskStatus;
51
+ /**
52
+ * Push a status update for an already-tracked task. For background Bash
53
+ * (reusesLaunchCard), a terminal-state transition also streams the final
54
+ * output via terminal_output and closes the terminal UI with terminal_exit
55
+ * (mirroring dispatchTerminalUpdate's 2-notification split), then clears
56
+ * terminalSentData so the launch card is fully retired.
57
+ */
58
+ private emitStatusUpdate;
59
+ /** Forward a text delta from the active background notification turn. */
60
+ private forwardText;
61
+ private firstMessageId;
62
+ private activeMessageId;
63
+ /**
64
+ * Mark a tracked task as cancelled (used by `session/cancelBackgroundTask`).
65
+ * Emits a final `failed` update with `_meta.backgroundTask.cancelled = true`
66
+ * so the editor card reflects the cancellation, then drops local state. For
67
+ * background Bash reusing a launch terminal card, also emits terminal_exit
68
+ * and clears terminalSentData so the terminal UI closes cleanly.
69
+ */
70
+ markCancelled(taskId: string): Promise<void>;
71
+ }
72
+ //# sourceMappingURL=background-tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-tasks.d.ts","sourceRoot":"","sources":["../../src/handlers/background-tasks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAwEnD,qBAAa,sBAAuB,YAAW,aAAa;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,8BAA8B;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;IACxD;;;;OAIG;IACH,OAAO,CAAC,kBAAkB,CAAuB;gBAErC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM;IAKpD,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAmDpC,oEAAoE;YACtD,YAAY;IAkE1B;;;;;;OAMG;YACW,gBAAgB;IAiG9B,yEAAyE;YAC3D,WAAW;IAczB,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,eAAe;IAIvB;;;;;;OAMG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA+BnD"}
@@ -0,0 +1,330 @@
1
+ /**
2
+ * Session-scoped background-task listener.
3
+ *
4
+ * Background sub-agents (the Agent/Task tool launched with `run_in_background:
5
+ * true`) keep producing events AFTER `session/prompt` has returned: their
6
+ * internal tool calls stream as `tool.updated`, and when they finish the
7
+ * backend auto-triggers a notification turn (`turn.started` with
8
+ * `inputSource:"background_task"`) whose `text_delta` carries the result.
9
+ *
10
+ * The per-prompt turn loop (`runEventTurn`) exits at `turn.completed` and
11
+ * unregisters its listener, so without this module ALL of those post-turn
12
+ * events are silently dropped — the user sees "background task launched" and
13
+ * then nothing.
14
+ *
15
+ * This listener is registered once per session (lives across prompts) and
16
+ * forwards a curated subset to the ACP client as out-of-band `session/update`
17
+ * notifications:
18
+ *
19
+ * - `session.updated` carrying `taskId` → background task status change.
20
+ * First sighting emits a fresh `tool_call` card (`[background] …`);
21
+ * subsequent sightings emit `tool_call_update` with the new status.
22
+ * - `turn.started` with `inputSource:"background_task"` → marks the start
23
+ * of a notification turn; its `model.streaming text_delta` is forwarded
24
+ * as `agent_message_chunk` so the user sees the background result.
25
+ *
26
+ * Everything else is ignored — the turn loop handles normal turns and normal
27
+ * tool calls. Per the design decision, background agents' INTERNAL tool calls
28
+ * are NOT expanded here (only the task-level card + the final result message).
29
+ *
30
+ * All work is best-effort: failures are logged via `warn()` and never thrown
31
+ * into the event loop (would crash the bridge, per AGENTS.md).
32
+ */
33
+ import { randomUUID } from "node:crypto";
34
+ import { log, warn } from "../utils.js";
35
+ /** Map a zcode background task status string to an ACP ToolCallStatus. */
36
+ function toAcpStatus(status) {
37
+ if (status === "completed")
38
+ return "completed";
39
+ if (status === "failed" || status === "error" || status === "cancelled")
40
+ return "failed";
41
+ return "in_progress"; // running / pending / unknown
42
+ }
43
+ /** Build the card title for a background task. */
44
+ function cardTitle(description) {
45
+ const d = (description ?? "").trim();
46
+ return d ? `[background] ${d}` : "[background] task";
47
+ }
48
+ export class BackgroundTaskListener {
49
+ server;
50
+ zcodeSid;
51
+ /** taskId → tracked state. */
52
+ tasks = new Map();
53
+ /**
54
+ * The turnId of the currently-active background notification turn, if any.
55
+ * While set, that turn's `model.streaming text_delta` events are forwarded
56
+ * to the client as `agent_message_chunk`.
57
+ */
58
+ activeNotifyTurnId = null;
59
+ constructor(server, zcodeSid) {
60
+ this.server = server;
61
+ this.zcodeSid = zcodeSid;
62
+ }
63
+ handleEvent(event) {
64
+ try {
65
+ if (event.type === "session.updated") {
66
+ const raw = event.payload;
67
+ if (raw && typeof raw.taskId === "string" && raw.taskId) {
68
+ // taskId is verified string above; cast to the full shape (other
69
+ // fields are optional and read defensively inside onTaskStatus).
70
+ void this.onTaskStatus(raw);
71
+ }
72
+ return;
73
+ }
74
+ if (event.type === "turn.started") {
75
+ const inputSource = event.payload?.["inputSource"];
76
+ const turnId = event.payload?.["turnId"] ?? "";
77
+ if (inputSource === "background_task") {
78
+ this.activeNotifyTurnId = turnId || null;
79
+ if (this.activeNotifyTurnId) {
80
+ log(` [bg] background notification turn started (${turnId.slice(-8)})`);
81
+ }
82
+ }
83
+ return;
84
+ }
85
+ // Inside an active background notification turn → forward text deltas.
86
+ if (this.activeNotifyTurnId) {
87
+ if (event.type === "model.streaming") {
88
+ const kind = event.payload?.["kind"];
89
+ if (kind === "text_delta") {
90
+ const delta = event.payload?.["delta"] ?? "";
91
+ if (delta)
92
+ void this.forwardText(delta);
93
+ }
94
+ return;
95
+ }
96
+ if (event.type === "turn.completed" || event.type === "turn.failed") {
97
+ log(` [bg] background notification turn ended (${event.type})`);
98
+ this.activeNotifyTurnId = null;
99
+ // Reset the result messageId so the NEXT background task in this
100
+ // session gets its own — otherwise the editor would merge/overwrite
101
+ // distinct tasks' outputs under one shared messageId.
102
+ this.firstMessageId = null;
103
+ return;
104
+ }
105
+ }
106
+ }
107
+ catch (e) {
108
+ warn(`BackgroundTaskListener: event handling failed: ${e instanceof Error ? e.message : String(e)}`);
109
+ }
110
+ }
111
+ /** Handle a `session.updated` carrying a background task status. */
112
+ async onTaskStatus(p) {
113
+ const taskId = p.taskId;
114
+ const status = p.status ?? "running";
115
+ const acpStatus = toAcpStatus(status);
116
+ let task = this.tasks.get(taskId);
117
+ if (!task) {
118
+ // First sighting → decide whether to reuse the launch card or mint a
119
+ // fresh bg_* card. Background Bash: the dispatcher seeds
120
+ // `terminalSentData[toolCallId]` when the launch card is created, so its
121
+ // presence means the client already has a terminal card for this call —
122
+ // route the lifecycle back to it instead of creating a duplicate. Sub-
123
+ // agents (Agent/Task tool) have no such launch card → fall back to bg_*.
124
+ const launchToolCallId = p.toolCallId;
125
+ const reusesLaunchCard = !!launchToolCallId && this.server.terminalSentData.has(launchToolCallId);
126
+ if (reusesLaunchCard) {
127
+ task = {
128
+ acpCallId: launchToolCallId,
129
+ sourceToolCallId: launchToolCallId,
130
+ reusesLaunchCard: true,
131
+ description: p.description ?? "",
132
+ lastStatus: "",
133
+ };
134
+ this.tasks.set(taskId, task);
135
+ // The launch card already exists (dispatch created it in the main
136
+ // turn). Don't emit a new tool_call — just push the first status update
137
+ // so the card reflects "running in background" with task metadata.
138
+ await this.emitStatusUpdate(task, acpStatus, p);
139
+ log(` [bg] reusing launch card ${launchToolCallId.slice(-12)} for task ${taskId.slice(-12)}`);
140
+ return;
141
+ }
142
+ // No launch card to reuse → emit a fresh [background] tool_call card.
143
+ task = {
144
+ acpCallId: `bg_${randomUUID().slice(0, 12)}`,
145
+ reusesLaunchCard: false,
146
+ description: p.description ?? "",
147
+ lastStatus: "",
148
+ };
149
+ this.tasks.set(taskId, task);
150
+ const meta = {
151
+ backgroundTask: {
152
+ taskId,
153
+ agentId: p.terminalId ?? undefined,
154
+ outputPath: p.outputPath ?? undefined,
155
+ sourceToolCallId: p.toolCallId ?? undefined,
156
+ },
157
+ };
158
+ const ok = await this.server.notifyByZcodeSid(this.zcodeSid, {
159
+ sessionUpdate: "tool_call",
160
+ toolCallId: task.acpCallId,
161
+ title: cardTitle(task.description),
162
+ kind: "other",
163
+ status: acpStatus,
164
+ _meta: meta,
165
+ });
166
+ task.lastStatus = acpStatus;
167
+ if (ok) {
168
+ log(` [bg] task card emitted: ${taskId.slice(-12)} status=${acpStatus}`);
169
+ }
170
+ return;
171
+ }
172
+ await this.emitStatusUpdate(task, acpStatus, p);
173
+ }
174
+ /**
175
+ * Push a status update for an already-tracked task. For background Bash
176
+ * (reusesLaunchCard), a terminal-state transition also streams the final
177
+ * output via terminal_output and closes the terminal UI with terminal_exit
178
+ * (mirroring dispatchTerminalUpdate's 2-notification split), then clears
179
+ * terminalSentData so the launch card is fully retired.
180
+ */
181
+ async emitStatusUpdate(task, acpStatus, p) {
182
+ // Skip no-op status updates (same as last advertised).
183
+ if (task.lastStatus === acpStatus && !task.reusesLaunchCard)
184
+ return;
185
+ const meta = {
186
+ backgroundTask: { taskId: p.taskId },
187
+ };
188
+ if (p.outputPath)
189
+ meta.backgroundTask["outputPath"] = p.outputPath;
190
+ const isTerminal = acpStatus === "completed" || acpStatus === "failed";
191
+ // Background Bash closing a launch terminal card: stream final output +
192
+ // emit terminal_exit so Zed's terminal UI finalises. The terminal_output
193
+ // diff guard mirrors dispatchTerminalUpdate (only emit the suffix beyond
194
+ // what was already streamed; for a background launch the launch text was
195
+ // already sent, so outputTail here is the real command output).
196
+ if (task.reusesLaunchCard && task.sourceToolCallId) {
197
+ // Stream any new command output via terminal_output. The output is
198
+ // tracked on `task.streamedOutput` (NOT server.terminalSentData) because
199
+ // terminalSentData holds the launch acknowledgement text written by the
200
+ // dispatcher, which is unrelated to the command's actual stdout — they
201
+ // aren't prefix-related, so diffing against the launch text would drop
202
+ // the real output entirely. Each session.updated carries a CUMULATIVE
203
+ // outputTail snapshot, so we diff against what we last streamed and emit
204
+ // only the suffix (mirrors dispatchTerminalUpdate's progress diffing).
205
+ const finalOutput = p.outputTail ?? p.stdoutTail ?? "";
206
+ const lastSent = task.streamedOutput ?? "";
207
+ if (finalOutput) {
208
+ const delta = lastSent && finalOutput.startsWith(lastSent)
209
+ ? finalOutput.slice(lastSent.length)
210
+ : finalOutput;
211
+ if (delta) {
212
+ task.streamedOutput = finalOutput;
213
+ await this.server.notifyByZcodeSid(this.zcodeSid, {
214
+ sessionUpdate: "tool_call_update",
215
+ toolCallId: task.sourceToolCallId,
216
+ _meta: { terminal_output: { terminal_id: task.sourceToolCallId, data: delta } },
217
+ });
218
+ }
219
+ }
220
+ // terminal_exit only fires on a terminal status. A non-terminal (running)
221
+ // update has streamed its progress above; also push an in_progress status
222
+ // update with backgroundTask metadata so the card reflects "running in
223
+ // background" on first sighting (the launch card was left in_progress by
224
+ // the dispatcher, but we still advertise the status to attach taskId).
225
+ if (!isTerminal) {
226
+ await this.server.notifyByZcodeSid(this.zcodeSid, {
227
+ sessionUpdate: "tool_call_update",
228
+ toolCallId: task.sourceToolCallId,
229
+ status: acpStatus,
230
+ _meta: meta,
231
+ });
232
+ task.lastStatus = acpStatus;
233
+ return;
234
+ }
235
+ const exitCode = acpStatus === "failed" ? 1 : 0;
236
+ meta.backgroundTask["completed"] = true;
237
+ await this.server.notifyByZcodeSid(this.zcodeSid, {
238
+ sessionUpdate: "tool_call_update",
239
+ toolCallId: task.sourceToolCallId,
240
+ status: acpStatus,
241
+ content: [{ type: "terminal", terminalId: task.sourceToolCallId }],
242
+ _meta: {
243
+ ...meta,
244
+ claudeCode: { toolName: "Bash" },
245
+ terminal_exit: {
246
+ terminal_id: task.sourceToolCallId,
247
+ exit_code: exitCode,
248
+ signal: null,
249
+ },
250
+ },
251
+ });
252
+ this.server.terminalSentData.delete(task.sourceToolCallId);
253
+ task.lastStatus = acpStatus;
254
+ log(` [bg] launch card ${task.sourceToolCallId.slice(-12)} → ${acpStatus} (terminal_exit)`);
255
+ return;
256
+ }
257
+ // Subsequent sighting (bg_* card) or non-terminal → status update only.
258
+ if (task.lastStatus === acpStatus)
259
+ return;
260
+ const ok = await this.server.notifyByZcodeSid(this.zcodeSid, {
261
+ sessionUpdate: "tool_call_update",
262
+ toolCallId: task.acpCallId,
263
+ status: acpStatus,
264
+ _meta: meta,
265
+ });
266
+ task.lastStatus = acpStatus;
267
+ if (ok) {
268
+ log(` [bg] task status update: ${p.taskId.slice(-12)} → ${acpStatus}`);
269
+ }
270
+ }
271
+ /** Forward a text delta from the active background notification turn. */
272
+ async forwardText(delta) {
273
+ // Allocate the messageId lazily so an empty-result turn emits nothing.
274
+ let msgId = this.activeMessageId();
275
+ if (!msgId) {
276
+ msgId = `bg_msg_${randomUUID().slice(0, 12)}`;
277
+ this.firstMessageId = msgId;
278
+ }
279
+ await this.server.notifyByZcodeSid(this.zcodeSid, {
280
+ sessionUpdate: "agent_message_chunk",
281
+ content: { type: "text", text: delta },
282
+ messageId: msgId,
283
+ });
284
+ }
285
+ firstMessageId = null;
286
+ activeMessageId() {
287
+ return this.firstMessageId;
288
+ }
289
+ /**
290
+ * Mark a tracked task as cancelled (used by `session/cancelBackgroundTask`).
291
+ * Emits a final `failed` update with `_meta.backgroundTask.cancelled = true`
292
+ * so the editor card reflects the cancellation, then drops local state. For
293
+ * background Bash reusing a launch terminal card, also emits terminal_exit
294
+ * and clears terminalSentData so the terminal UI closes cleanly.
295
+ */
296
+ async markCancelled(taskId) {
297
+ const task = this.tasks.get(taskId);
298
+ if (!task)
299
+ return;
300
+ if (task.reusesLaunchCard && task.sourceToolCallId) {
301
+ await this.server.notifyByZcodeSid(this.zcodeSid, {
302
+ sessionUpdate: "tool_call_update",
303
+ toolCallId: task.sourceToolCallId,
304
+ status: "failed",
305
+ content: [{ type: "terminal", terminalId: task.sourceToolCallId }],
306
+ _meta: {
307
+ backgroundTask: { taskId, cancelled: true },
308
+ claudeCode: { toolName: "Bash" },
309
+ terminal_exit: {
310
+ terminal_id: task.sourceToolCallId,
311
+ exit_code: 1,
312
+ signal: null,
313
+ },
314
+ },
315
+ });
316
+ this.server.terminalSentData.delete(task.sourceToolCallId);
317
+ }
318
+ else {
319
+ await this.server.notifyByZcodeSid(this.zcodeSid, {
320
+ sessionUpdate: "tool_call_update",
321
+ toolCallId: task.acpCallId,
322
+ status: "failed",
323
+ _meta: { backgroundTask: { taskId, cancelled: true } },
324
+ });
325
+ }
326
+ this.tasks.delete(taskId);
327
+ log(` [bg] task cancelled: ${taskId.slice(-12)}`);
328
+ }
329
+ }
330
+ //# sourceMappingURL=background-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-tasks.js","sourceRoot":"","sources":["../../src/handlers/background-tasks.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
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;AAcrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAInD,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,CAsCf"}