@agentclientprotocol/claude-agent-acp 0.99.2-preview.10 → 0.99.2-preview.12

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.
@@ -0,0 +1,248 @@
1
+ /**
2
+ * The background work of a session: the work that Claude Code keeps running
3
+ * independently of the session's foreground work, which ACP v2 lists on every
4
+ * `state_update` of the session as `background` (the v2 prompt lifecycle,
5
+ * "Background work").
6
+ *
7
+ * The lists are built from Claude Code's live background task set
8
+ * (`background_tasks_changed`), without the tasks it marks `ambient`, which
9
+ * are housekeeping that it started on its own. The root session and each
10
+ * announced subagent session (the subagents RFD form) has its own list. Each
11
+ * task is listed once, in the list of the session that runs it:
12
+ *
13
+ * - A command that went to the background: its display terminal, from the
14
+ * Bash tool result until its task ends (`Session.backgroundTerminals`).
15
+ * - A detached subagent: its child session, in its parent's list, while it
16
+ * works, and while it is idle with background work of its own.
17
+ * - Any other task, such as a `Monitor` or a `Workflow`: a `_claude/task`
18
+ * item with the task's id and description. Its tool call ended at its tool
19
+ * result, so it cannot be listed as a tool call.
20
+ *
21
+ * Only a session whose interrupt spares background tasks reports its lists
22
+ * (`Session.reportsBackground`): `session/cancel` must leave listed work
23
+ * running.
24
+ */
25
+ import { RequestError } from "@agentclientprotocol/sdk/unstable";
26
+ /** The level of a `background_tasks_changed` payload. */
27
+ export function backgroundLevel(tasks) {
28
+ return new Map(tasks.map((task) => [
29
+ task.task_id,
30
+ {
31
+ ambient: task.ambient === true,
32
+ taskType: task.task_type,
33
+ description: task.description,
34
+ ...(task.parent_task_id !== undefined ? { parentTaskId: task.parent_task_id } : {}),
35
+ },
36
+ ]));
37
+ }
38
+ /**
39
+ * The `background` list of the root session `rootSessionId` and of each of
40
+ * its announced subagent sessions, by session id, deeper sessions first and
41
+ * the root last. Each list is empty while
42
+ * the level has not been reported: Claude Code sends none before the first
43
+ * background task starts.
44
+ */
45
+ export function backgroundLists(session, rootSessionId) {
46
+ const children = [...(session.nativeSubagentsByTaskId ?? [])].filter(([, child]) => child.announced);
47
+ const childByTask = new Map(children);
48
+ const childByToolUse = new Map(children.flatMap(([, child]) => child.parentToolUseId ? [[child.parentToolUseId, child]] : []));
49
+ const lists = new Map([
50
+ [rootSessionId, []],
51
+ ...children.map(([, child]) => [child.sessionId, []]),
52
+ ]);
53
+ const level = session.backgroundLevel ?? new Map();
54
+ for (const [taskId, task] of level) {
55
+ if (task.ambient)
56
+ continue;
57
+ const terminal = session.backgroundTerminals?.get(taskId);
58
+ if (terminal) {
59
+ // A subagent's command runs on the child's stream.
60
+ const owner = terminal.parentToolUseId
61
+ ? childByToolUse.get(terminal.parentToolUseId)?.sessionId
62
+ : rootSessionId;
63
+ if (owner)
64
+ lists.get(owner).push({ type: "terminal", terminalId: terminal.toolCallId });
65
+ continue;
66
+ }
67
+ // A command without a terminal yet is one that foreground work waits on.
68
+ // A subagent is listed below, as its session.
69
+ if (task.taskType === "local_bash" || task.taskType === "local_agent")
70
+ continue;
71
+ const parent = task.parentTaskId ? childByTask.get(task.parentTaskId) : undefined;
72
+ lists
73
+ .get(parent?.sessionId ?? rootSessionId)
74
+ .push({ type: "_claude/task", taskId, description: task.description });
75
+ }
76
+ // A child is listed in its parent's list while it works in the background,
77
+ // and while it is idle with background work of its own. Deeper children
78
+ // first, so a child's list is whole before its parent's reads it.
79
+ const sessions = new Map(children.map(([, child]) => [child.sessionId, child]));
80
+ const depth = (child) => {
81
+ const parent = sessions.get(child.parentSessionId);
82
+ return parent ? depth(parent) + 1 : 0;
83
+ };
84
+ for (const [taskId, child] of children.sort(([, a], [, b]) => depth(b) - depth(a))) {
85
+ const task = level.get(taskId);
86
+ const working = child.workState !== undefined &&
87
+ child.workState !== "idle" &&
88
+ task !== undefined &&
89
+ !task.ambient;
90
+ if (working || lists.get(child.sessionId).length > 0) {
91
+ lists.get(child.parentSessionId)?.push({ type: "subagent", sessionId: child.sessionId });
92
+ }
93
+ }
94
+ // In the same order, the root last: a child's own list goes out before its
95
+ // parent's list drops it.
96
+ return new Map([
97
+ ...children.map(([, child]) => [
98
+ child.sessionId,
99
+ lists.get(child.sessionId),
100
+ ]),
101
+ [rootSessionId, lists.get(rootSessionId)],
102
+ ]);
103
+ }
104
+ /**
105
+ * The tasks of the terminals that `level` does not hold: Claude Code no
106
+ * longer runs them, so their terminals exit before a list drops them, as v2
107
+ * requires. A terminal is registered at its Bash result, after its task
108
+ * joined the level, so a later level without the task means that it ended.
109
+ * Claude Code usually sends a task's end before that level, which ends the
110
+ * terminal first, but the SDK does not promise that order.
111
+ */
112
+ export function droppedTerminalTasks(session, level) {
113
+ return [...(session.backgroundTerminals?.keys() ?? [])].filter((taskId) => !level.has(taskId));
114
+ }
115
+ /**
116
+ * Removes the terminal of the background command `taskId` of the session
117
+ * `sessionId`, and returns the update that exits it, or undefined when the
118
+ * command has no terminal. Claude Code reports no exit code for it, and
119
+ * `completed` does not mean 0: Claude Code accepts some non-zero codes as a
120
+ * success, such as grep's 1.
121
+ */
122
+ export function takeBackgroundTerminalExit(session, sessionId, taskId) {
123
+ const terminal = session.backgroundTerminals?.get(taskId);
124
+ if (!terminal)
125
+ return undefined;
126
+ session.backgroundTerminals.delete(taskId);
127
+ return {
128
+ sessionId,
129
+ update: {
130
+ sessionUpdate: "tool_call_update",
131
+ toolCallId: terminal.toolCallId,
132
+ _meta: {
133
+ ...(terminal.parentToolUseId
134
+ ? { claudeCode: { parentToolUseId: terminal.parentToolUseId } }
135
+ : {}),
136
+ terminal_exit: { terminal_id: terminal.toolCallId, exit_code: null, signal: null },
137
+ },
138
+ },
139
+ };
140
+ }
141
+ /**
142
+ * Ends the background work of a session whose query closed: Claude Code's
143
+ * background tasks end with its process. Returns the updates that exit the
144
+ * root session's terminals, and empties the level, so the next lists are
145
+ * empty. A subagent's command is left as it was: its terminal is on the
146
+ * child's stream, which the closed query's routing owned.
147
+ */
148
+ export function endBackgroundWork(session, sessionId) {
149
+ if (!session.reportsBackground)
150
+ return [];
151
+ const exits = [...(session.backgroundTerminals ?? [])].flatMap(([taskId, terminal]) => {
152
+ const exit = terminal.parentToolUseId
153
+ ? undefined
154
+ : takeBackgroundTerminalExit(session, sessionId, taskId);
155
+ return exit ? [exit] : [];
156
+ });
157
+ session.backgroundLevel = undefined;
158
+ return exits;
159
+ }
160
+ /**
161
+ * Stops the background command whose terminal `terminalId` the session
162
+ * `sessionId` lists (v2 `terminal/cancel`). `sessions` are the root sessions,
163
+ * by id: a subagent session's list is built with its root's. The terminal
164
+ * exits when Claude Code reports the task stopped.
165
+ */
166
+ export async function cancelBackgroundTerminal(sessions, sessionId, terminalId) {
167
+ const notCancellable = () => RequestError.invalidParams({ sessionId, terminalId }, `Terminal ${terminalId} is not a command running in the background, so it cannot be cancelled.`);
168
+ const listed = (root, session) => session.reportsBackground === true &&
169
+ (backgroundLists(session, root)
170
+ .get(sessionId)
171
+ ?.some((item) => item.type === "terminal" && item.terminalId === terminalId) ??
172
+ false);
173
+ const owner = Object.entries(sessions).find(([root, session]) => listed(root, session));
174
+ if (!owner)
175
+ throw notCancellable();
176
+ const [root, session] = owner;
177
+ const taskId = [...(session.backgroundTerminals ?? [])].find(([, terminal]) => terminal.toolCallId === terminalId)[0];
178
+ try {
179
+ await session.query.stopTask(taskId);
180
+ }
181
+ catch (error) {
182
+ // The command ended meanwhile: it has exited, or is about to.
183
+ if (!listed(root, session))
184
+ throw notCancellable();
185
+ throw error;
186
+ }
187
+ }
188
+ /**
189
+ * Publishes the lists of each session that reports them, each time one
190
+ * changes. The sink sends them to the client synchronously, so a list follows
191
+ * the updates sent before it.
192
+ */
193
+ export class BackgroundWorkReporter {
194
+ sink;
195
+ /** The list last published for each session, as JSON, and the root session it is built with. */
196
+ published = new Map();
197
+ constructor(sink) {
198
+ this.sink = sink;
199
+ }
200
+ /** Whether the lists are reported at all. */
201
+ get enabled() {
202
+ return this.sink !== undefined;
203
+ }
204
+ /**
205
+ * Publishes each list of the root session `rootSessionId` that changed. The
206
+ * first call for a session publishes its list, also when it is empty.
207
+ * `rootState` is the root session's state now.
208
+ */
209
+ sync(rootSessionId, session, rootState) {
210
+ if (!this.sink || !session.reportsBackground)
211
+ return;
212
+ const children = new Map([...(session.nativeSubagentsByTaskId?.values() ?? [])].map((child) => [
213
+ child.sessionId,
214
+ child,
215
+ ]));
216
+ for (const [sessionId, items] of backgroundLists(session, rootSessionId)) {
217
+ const json = JSON.stringify(items);
218
+ if (this.published.get(sessionId)?.json === json)
219
+ continue;
220
+ this.published.set(sessionId, { json, root: rootSessionId });
221
+ const child = children.get(sessionId);
222
+ this.sink.changed({
223
+ sessionId,
224
+ items,
225
+ state: child ? workStateName(child.workState) : rootState,
226
+ ...(child ? { parentSessionId: child.parentSessionId } : {}),
227
+ });
228
+ }
229
+ }
230
+ /** The root session `rootSessionId` ended, and its subagent sessions with it. */
231
+ forget(rootSessionId) {
232
+ for (const [sessionId, { root }] of this.published) {
233
+ if (root !== rootSessionId)
234
+ continue;
235
+ this.published.delete(sessionId);
236
+ this.sink?.forget(sessionId);
237
+ }
238
+ }
239
+ }
240
+ /** A child's work state, when it is one that v2 names. */
241
+ function workStateName(state) {
242
+ return state === "idle" ||
243
+ state === "running" ||
244
+ state === "requires_action" ||
245
+ state === "unknown"
246
+ ? state
247
+ : undefined;
248
+ }
@@ -218,6 +218,13 @@ export declare class NativeSubagentRuntime {
218
218
  * `sessionId` of this live session, or undefined when no such child runs here.
219
219
  */
220
220
  liveWorkState(sessionId: string): WorkState["state"] | undefined;
221
+ /**
222
+ * The RFD form: the `subagent_update` that tells a client that holds nothing
223
+ * of the announced child `sessionId` of this live session what it is now:
224
+ * its labels, its directory, its `cancel` capability, and its work state.
225
+ * Undefined when no such child runs here.
226
+ */
227
+ currentUpdate(sessionId: string): AcpSessionNotification | undefined;
221
228
  /**
222
229
  * Reports the model of a child response, an exact model id, as the entry of
223
230
  * the root session's `model` option that matches it, else as the id (see
@@ -1 +1 @@
1
- {"version":3,"file":"native-subagents.d.ts","sourceRoot":"","sources":["../src/native-subagents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"native-subagents.d.ts","sourceRoot":"","sources":["../src/native-subagents.ts"],"names":[],"mappings":"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"}
@@ -123,6 +123,31 @@ export class NativeSubagentRuntime {
123
123
  const child = this.children.get(sessionId);
124
124
  return child?.announced ? child.workState : undefined;
125
125
  }
126
+ /**
127
+ * The RFD form: the `subagent_update` that tells a client that holds nothing
128
+ * of the announced child `sessionId` of this live session what it is now:
129
+ * its labels, its directory, its `cancel` capability, and its work state.
130
+ * Undefined when no such child runs here.
131
+ */
132
+ currentUpdate(sessionId) {
133
+ if (this.form !== "rfd")
134
+ return undefined;
135
+ const child = this.childOfSession(sessionId);
136
+ if (!child?.announced || !child.workState)
137
+ return undefined;
138
+ return {
139
+ sessionId: child.parentSessionId,
140
+ update: {
141
+ sessionUpdate: "subagent_update",
142
+ sessionId: child.sessionId,
143
+ ...(child.title ? { title: child.title } : {}),
144
+ ...(child.description ? { description: child.description } : {}),
145
+ ...(child.reportedCwd ? { cwd: child.reportedCwd } : {}),
146
+ capabilities: { cancel: {} },
147
+ state: { state: child.workState },
148
+ },
149
+ };
150
+ }
126
151
  /**
127
152
  * Reports the model of a child response, an exact model id, as the entry of
128
153
  * the root session's `model` option that matches it, else as the id (see
@@ -1 +1 @@
1
- {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/v2/agent.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,MAAM,mDAAmD,CAAC;AACxE,OAAO,EAAE,cAAc,EAAkB,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAqB9E;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GACvC,EAAE,CAAC,QAAQ,CA4Gb"}
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/v2/agent.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,MAAM,mDAAmD,CAAC;AACxE,OAAO,EAAE,cAAc,EAAkB,KAAK,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAsB9E;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,GACvC,EAAE,CAAC,QAAQ,CAiIb"}
package/dist/v2/agent.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as v2 from "@agentclientprotocol/sdk/experimental/v2/unstable";
2
2
  import { ClaudeAcpAgent } from "../acp-agent.js";
3
+ import { stateUpdate, V2Background } from "./background.js";
3
4
  import { v1InitializeRequest, v2InitializeResponse } from "./initialize.js";
4
5
  import { v1PermissionResponse, v2PermissionRequest } from "./permission.js";
5
6
  import { v2Foreground, v2Prompt } from "./prompt.js";
@@ -29,6 +30,14 @@ export function v2AgentApp(logger, onAgent) {
29
30
  foreground: (sessionId) => v2Foreground((update) => {
30
31
  void client.send({ sessionId, update });
31
32
  }),
33
+ background: {
34
+ changed: (report) => {
35
+ for (const notification of client.background.changed(report)) {
36
+ void client.send(notification);
37
+ }
38
+ },
39
+ forget: (sessionId) => client.background.forget(sessionId),
40
+ },
32
41
  });
33
42
  onAgent(agent);
34
43
  })
@@ -57,10 +66,16 @@ export function v2AgentApp(logger, onAgent) {
57
66
  await agent.publishCurrentSessionInfo(params.sessionId);
58
67
  // v2 requires a snapshot of the foreground state after the replay and
59
68
  // before the response, also without a replay: a resumed live session can
60
- // be running a turn, or waiting on a permission request.
69
+ // be running a turn, or waiting on a permission request. The current
70
+ // state of each subagent and terminal it lists comes first, as v2
71
+ // requires. The subagents' go again after the response (see below).
72
+ await agent.publishLiveSubagents(params.sessionId, client.background.listedSubagents(params.sessionId));
73
+ for (const notification of client.background.currentTerminals(params.sessionId)) {
74
+ void client.send(notification);
75
+ }
61
76
  void client.send({
62
77
  sessionId: params.sessionId,
63
- update: stateSnapshot(agent.foregroundState(params.sessionId)),
78
+ update: stateUpdate(agent.foregroundState(params.sessionId)),
64
79
  });
65
80
  const commands = await setupCommands(agent, params.sessionId, logger);
66
81
  // The response ends a replay. The subagents RFD treats the replayed
@@ -103,16 +118,12 @@ export function v2AgentApp(logger, onAgent) {
103
118
  .onRequest(v2.methods.agent.session.prompt, ({ params }) => v2Prompt(agent, params, (update) => {
104
119
  void client.send({ sessionId: params.sessionId, update });
105
120
  }))
121
+ .onRequest(v2.methods.agent.terminal.cancel, async ({ params }) => {
122
+ await agent.cancelBackgroundTerminal(params);
123
+ return {};
124
+ })
106
125
  .onNotification(v2.methods.agent.session.cancel, ({ params }) => agent.cancel(params));
107
126
  }
108
- /** The `state_update` that reports `state` as the current foreground state. */
109
- function stateSnapshot(state) {
110
- if (state === "idle")
111
- return { sessionUpdate: "state_update", state: "idle" };
112
- if (state === "running")
113
- return { sessionUpdate: "state_update", state: "running" };
114
- return { sessionUpdate: "state_update", state: "requires_action" };
115
- }
116
127
  /**
117
128
  * The `availableCommands` of a setup response, which v2 requires when the
118
129
  * session has commands. The agent sends a v1 client the same list as an
@@ -179,6 +190,8 @@ class V2ClientConnection {
179
190
  terminals = new V2Terminals();
180
191
  /** The `_meta` that the client stores for each tool call. */
181
192
  toolCallMeta = new V2ToolCallMeta();
193
+ /** The `background` list of each session's `state_update`s. */
194
+ background = new V2Background(this.terminals);
182
195
  constructor(ctx, logger) {
183
196
  this.ctx = ctx;
184
197
  this.logger = logger;
@@ -225,7 +238,9 @@ class V2ClientConnection {
225
238
  * request opening.)
226
239
  */
227
240
  send(notification) {
228
- return this.ctx.notify(v2.methods.client.session.update, notification).catch((error) => {
241
+ return this.ctx
242
+ .notify(v2.methods.client.session.update, this.background.stamp(notification))
243
+ .catch((error) => {
229
244
  this.logger.error(`Failed to send a ${notification.update.sessionUpdate} update:`, error);
230
245
  });
231
246
  }
@@ -257,11 +272,13 @@ class V2ClientConnection {
257
272
  childState = undefined;
258
273
  }
259
274
  // Every update goes to the connection before any is awaited, so an update
260
- // that another call sends meanwhile cannot come between them.
261
- await Promise.all([
262
- ...updates.map((v2Update) => this.ctx.notify(v2.methods.client.session.update, { ...notification, update: v2Update })),
263
- ...(childState ? [this.ctx.notify(v2.methods.client.session.update, childState)] : []),
264
- ]);
275
+ // that another call sends meanwhile cannot come between them. The parent's
276
+ // copy is stamped first: a child's announcement starts its list.
277
+ const stamped = [
278
+ ...updates.map((v2Update) => this.background.stamp({ ...notification, update: v2Update })),
279
+ ...(childState ? [this.background.stamp(childState)] : []),
280
+ ];
281
+ await Promise.all(stamped.map((v2Notification) => this.ctx.notify(v2.methods.client.session.update, v2Notification)));
265
282
  }
266
283
  /**
267
284
  * The v2 updates of a v1 update: for a tool call report, the updates of its
@@ -316,7 +333,7 @@ class V2ClientConnection {
316
333
  async requestPermission(params, signal) {
317
334
  // The subject is an update of the tool call, with its stored `_meta`.
318
335
  const toolCall = this.toolCallMeta.subject(params.sessionId, params.toolCall);
319
- const response = await this.ctx.request(v2.methods.client.session.requestPermission, v2PermissionRequest({ ...params, toolCall }), { cancellationSignal: signal });
336
+ const response = await this.ctx.request(v2.methods.client.session.requestPermission, v2PermissionRequest({ ...params, toolCall }), { cancellationSignal: signal, stopWaitingOnCancel: true });
320
337
  return v1PermissionResponse(response);
321
338
  }
322
339
  // Elicitation is the same in v1 and v2.
@@ -325,7 +342,7 @@ class V2ClientConnection {
325
342
  // The v1 types accept a property schema with any tag; the v2 types accept
326
343
  // one only in a received value. As on v1, an MCP server's schema is
327
344
  // relayed here unchanged, so this cast does not check it.
328
- params, { cancellationSignal: signal });
345
+ params, { cancellationSignal: signal, stopWaitingOnCancel: true });
329
346
  }
330
347
  completeElicitation(params) {
331
348
  return this.ctx.notify(v2.methods.client.elicitation.complete, params);
@@ -0,0 +1,54 @@
1
+ /**
2
+ * The `background` lists of the v2 sessions of a connection (see
3
+ * `background-work.ts`, which builds them).
4
+ *
5
+ * A session that reports its background work gets its list on every
6
+ * `state_update` of its own stream, as v2 requires, from the list the agent
7
+ * reports when the session starts. A subagent session of such a session
8
+ * reports its own list from its announcement on, also in the parent's mirror
9
+ * of its state (`subagent_update.state`).
10
+ */
11
+ import type * as v2 from "@agentclientprotocol/sdk/experimental/v2/unstable";
12
+ import type { BackgroundReport, WorkStateName } from "../background-work.js";
13
+ import type { V2Terminals } from "./terminal.js";
14
+ /** The `state_update` that reports `state` as the session's current work state. */
15
+ export declare function stateUpdate(state: WorkStateName): v2.SessionUpdate;
16
+ export declare class V2Background {
17
+ private readonly terminals;
18
+ /**
19
+ * The latest list of each session that reports one, whether a state of the
20
+ * session carried it, and the parent of a subagent session.
21
+ */
22
+ private readonly sessions;
23
+ constructor(terminals: V2Terminals);
24
+ /**
25
+ * `notification` with the session's list, when it is a `state_update` of a
26
+ * session that reports one, or a `subagent_update` that mirrors the state of
27
+ * such a child. A child of a session that reports its list reports its own
28
+ * from its announcement on: empty, until the agent reports it.
29
+ */
30
+ stamp(notification: v2.UpdateSessionNotification): v2.UpdateSessionNotification;
31
+ /**
32
+ * Records the new list of a session, and returns the updates that report it:
33
+ *
34
+ * - For each terminal that the list adds, a `terminal_update` that lets the
35
+ * client cancel it. It also comes before the first list that names the
36
+ * terminal, as v2 requires: the terminal's own updates came earlier.
37
+ * - Once a state of the session carried a list, the state again with the
38
+ * new list, without a stop reason: a repeated `idle` is no new
39
+ * completion. A subagent's goes to its parent's mirror first, as its
40
+ * other states do.
41
+ */
42
+ changed(report: BackgroundReport): v2.UpdateSessionNotification[];
43
+ /**
44
+ * The current `terminal_update` of each terminal that the session
45
+ * `sessionId` lists. v2 requires it before the state snapshot of
46
+ * `session/resume`, as a replay may not have delivered it.
47
+ */
48
+ currentTerminals(sessionId: string): v2.UpdateSessionNotification[];
49
+ /** The subagent sessions that the session `sessionId` lists. */
50
+ listedSubagents(sessionId: string): string[];
51
+ /** Forgets the list of a session, and those of its subagent sessions. */
52
+ forget(sessionId: string): void;
53
+ }
54
+ //# sourceMappingURL=background.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background.d.ts","sourceRoot":"","sources":["../../src/v2/background.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,KAAK,EAAE,MAAM,mDAAmD,CAAC;AAC7E,OAAO,KAAK,EAAkB,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAUjD,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,EAAE,CAAC,aAAa,CAElE;AAOD,qBAAa,YAAY;IAUX,OAAO,CAAC,QAAQ,CAAC,SAAS;IATtC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAGrB;gBAEyB,SAAS,EAAE,WAAW;IAEnD;;;;;OAKG;IACH,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC,yBAAyB,GAAG,EAAE,CAAC,yBAAyB;IAyB/E;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,EAAE,CAAC,yBAAyB,EAAE;IA6BjE;;;;OAIG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,EAAE,CAAC,yBAAyB,EAAE;IAQnE,gEAAgE;IAChE,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAM5C,yEAAyE;IACzE,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAMhC"}
@@ -0,0 +1,123 @@
1
+ /** `state` as the current work state of a session, with no stop reason. */
2
+ function currentState(state) {
3
+ if (state === "idle")
4
+ return { state: "idle" };
5
+ if (state === "running")
6
+ return { state: "running" };
7
+ if (state === "requires_action")
8
+ return { state: "requires_action" };
9
+ return { state: "unknown" };
10
+ }
11
+ /** The `state_update` that reports `state` as the session's current work state. */
12
+ export function stateUpdate(state) {
13
+ return { sessionUpdate: "state_update", ...currentState(state) };
14
+ }
15
+ /** `state` with the list `background`. */
16
+ function withBackground(state, background) {
17
+ return { ...state, background };
18
+ }
19
+ export class V2Background {
20
+ terminals;
21
+ /**
22
+ * The latest list of each session that reports one, whether a state of the
23
+ * session carried it, and the parent of a subagent session.
24
+ */
25
+ sessions = new Map();
26
+ constructor(terminals) {
27
+ this.terminals = terminals;
28
+ }
29
+ /**
30
+ * `notification` with the session's list, when it is a `state_update` of a
31
+ * session that reports one, or a `subagent_update` that mirrors the state of
32
+ * such a child. A child of a session that reports its list reports its own
33
+ * from its announcement on: empty, until the agent reports it.
34
+ */
35
+ stamp(notification) {
36
+ const { sessionId, update } = notification;
37
+ if (update.sessionUpdate === "state_update") {
38
+ const session = this.sessions.get(sessionId);
39
+ if (!session)
40
+ return notification;
41
+ session.reported = true;
42
+ return { ...notification, update: { ...update, background: session.items } };
43
+ }
44
+ if (update.sessionUpdate === "subagent_update" && this.sessions.has(sessionId)) {
45
+ const subagent = update;
46
+ let child = this.sessions.get(subagent.sessionId);
47
+ if (!child) {
48
+ child = { items: [], reported: false, parent: sessionId };
49
+ this.sessions.set(subagent.sessionId, child);
50
+ }
51
+ if (subagent.state) {
52
+ return {
53
+ ...notification,
54
+ update: { ...subagent, state: withBackground(subagent.state, child.items) },
55
+ };
56
+ }
57
+ }
58
+ return notification;
59
+ }
60
+ /**
61
+ * Records the new list of a session, and returns the updates that report it:
62
+ *
63
+ * - For each terminal that the list adds, a `terminal_update` that lets the
64
+ * client cancel it. It also comes before the first list that names the
65
+ * terminal, as v2 requires: the terminal's own updates came earlier.
66
+ * - Once a state of the session carried a list, the state again with the
67
+ * new list, without a stop reason: a repeated `idle` is no new
68
+ * completion. A subagent's goes to its parent's mirror first, as its
69
+ * other states do.
70
+ */
71
+ changed(report) {
72
+ const { sessionId, items, state, parentSessionId } = report;
73
+ const session = this.sessions.get(sessionId);
74
+ const unchanged = session && JSON.stringify(session.items) === JSON.stringify(items);
75
+ this.sessions.set(sessionId, {
76
+ items,
77
+ reported: session?.reported ?? false,
78
+ parent: parentSessionId ?? session?.parent,
79
+ });
80
+ const known = new Set((session?.items ?? []).flatMap((item) => (item.type === "terminal" ? [item.terminalId] : [])));
81
+ const updates = items.flatMap((item) => {
82
+ if (item.type !== "terminal" || known.has(item.terminalId))
83
+ return [];
84
+ const update = this.terminals.advertiseCancel(sessionId, item.terminalId);
85
+ return update ? [{ sessionId, update }] : [];
86
+ });
87
+ if (session?.reported && state && !unchanged) {
88
+ if (parentSessionId) {
89
+ updates.push({
90
+ sessionId: parentSessionId,
91
+ update: { sessionUpdate: "subagent_update", sessionId, state: currentState(state) },
92
+ });
93
+ }
94
+ updates.push({ sessionId, update: stateUpdate(state) });
95
+ }
96
+ return updates;
97
+ }
98
+ /**
99
+ * The current `terminal_update` of each terminal that the session
100
+ * `sessionId` lists. v2 requires it before the state snapshot of
101
+ * `session/resume`, as a replay may not have delivered it.
102
+ */
103
+ currentTerminals(sessionId) {
104
+ return (this.sessions.get(sessionId)?.items ?? []).flatMap((item) => {
105
+ if (item.type !== "terminal")
106
+ return [];
107
+ const update = this.terminals.advertiseCancel(sessionId, item.terminalId, true);
108
+ return update ? [{ sessionId, update }] : [];
109
+ });
110
+ }
111
+ /** The subagent sessions that the session `sessionId` lists. */
112
+ listedSubagents(sessionId) {
113
+ return (this.sessions.get(sessionId)?.items ?? []).flatMap((item) => item.type === "subagent" ? [item.sessionId] : []);
114
+ }
115
+ /** Forgets the list of a session, and those of its subagent sessions. */
116
+ forget(sessionId) {
117
+ this.sessions.delete(sessionId);
118
+ for (const [child, { parent }] of this.sessions) {
119
+ if (parent === sessionId)
120
+ this.forget(child);
121
+ }
122
+ }
123
+ }
@@ -35,6 +35,14 @@ export declare class V2Terminals {
35
35
  terminal: v2.SessionUpdate[];
36
36
  report: V1ToolCallReport | undefined;
37
37
  };
38
+ /**
39
+ * The `terminal_update` that lets the client cancel the running terminal
40
+ * `terminalId` of the session `sessionId` with `terminal/cancel`, with its
41
+ * command, or undefined when the terminal is not running. `again` sends it
42
+ * also when the terminal advertises the capability already, as the current
43
+ * state of the terminal.
44
+ */
45
+ advertiseCancel(sessionId: string, terminalId: string, again?: boolean): v2.SessionUpdate | undefined;
38
46
  /** Forgets the terminals of a session. */
39
47
  forget(sessionId: string): void;
40
48
  }