@agentclientprotocol/claude-agent-acp 0.66.0 → 0.67.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.
@@ -238,6 +238,11 @@ type Session = {
238
238
  * cancel() routes orphan accounting to `orphanCommands` (exact, per-uuid)
239
239
  * instead of `pendingOrphanResults` (count, coalescing-blind). */
240
240
  msgLifecycleV1?: boolean;
241
+ /** Latched from `system`/init `terminal_slash_commands` (CLI 2.1.232+):
242
+ * names of advertised slash commands whose UX is bound to the CLI's own
243
+ * terminal (e.g. /doctor, /color). ACP clients aren't that terminal, so
244
+ * these are filtered out of `available_commands_update` payloads. */
245
+ terminalSlashCommands?: string[];
241
246
  /** The long-lived consumer task. Lazily started on the first `prompt()` and
242
247
  * kept alive for the session so between-turn/background messages are still
243
248
  * drained and forwarded. */
@@ -553,6 +558,8 @@ export type ToolUpdateMeta = {
553
558
  nonExecutionKind?: string;
554
559
  userFeedback?: string;
555
560
  subagent?: true;
561
+ skill?: string;
562
+ skillPath?: string;
556
563
  };
557
564
  terminal_info?: {
558
565
  terminal_id: string;
@@ -706,6 +713,7 @@ export declare class ClaudeAcpAgent {
706
713
  prompt(params: PromptRequest): Promise<PromptResponse>;
707
714
  goal(params: GoalRequest): Promise<GoalControlResponse>;
708
715
  private publishGoal;
716
+ private publishTaskPlan;
709
717
  private publishGoalFromPrompt;
710
718
  private publishRuntimeGoal;
711
719
  /** Steer the session per the ACP steering wire protocol: inject a follow-up
@@ -1 +1 @@
1
- {"version":3,"file":"acp-agent.d.ts","sourceRoot":"","sources":["../src/acp-agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"acp-agent.d.ts","sourceRoot":"","sources":["../src/acp-agent.ts"],"names":[],"mappings":"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"}
package/dist/acp-agent.js CHANGED
@@ -3,6 +3,7 @@ import { deleteSession, getSessionInfo, getSessionMessages, listSessions, query,
3
3
  import { GOAL_ACTIONS, GOAL_CONTROL_METHOD, GOAL_EXTENSION_VERSION, goalUpdateFromPrompt, parseGoalRequest, toGoalSnapshot, } from "./goal-extension.js";
4
4
  import { execFile } from "node:child_process";
5
5
  import { randomUUID } from "node:crypto";
6
+ import { existsSync } from "node:fs";
6
7
  import * as fs from "node:fs/promises";
7
8
  import * as os from "node:os";
8
9
  import * as path from "node:path";
@@ -10,7 +11,7 @@ import { promisify } from "node:util";
10
11
  import packageJson from "../package.json" with { type: "json" };
11
12
  import { applyAskElicitationResponse, askUserQuestionsToCreateRequest, createElicitationResponseToElicitResult, extractAskUserQuestions, extractRefusalFallbackPrompt, mcpElicitationToCreateRequest, REFUSAL_FALLBACK_DIALOG_KIND, refusalFallbackResultFromResponse, refusalFallbackToCreateRequest, } from "./elicitation.js";
12
13
  import { SettingsManager } from "./settings.js";
13
- import { applyTaskCreate, applyTaskUpdate, createPostToolUseHook, createTaskHook, parseTaskCreateOutput, planEntries, registerHookCallback, taskStateToPlanEntries, toolInfoFromToolUse, toolUpdateFromDiffToolResponse, toolUpdateFromToolResult, } from "./tools.js";
14
+ import { applyTaskCreate, applyTaskList, applyTaskUpdate, createPostToolUseHook, createTaskHook, parseTaskCreateOutput, parseTaskListOutput, parseTaskUpdateOutput, planEntries, registerHookCallback, taskStateToPlanEntries, toolInfoFromToolUse, toolUpdateFromDiffToolResponse, toolUpdateFromToolResult, } from "./tools.js";
14
15
  import { nodeToWebReadable, nodeToWebWritable, Pushable, unreachable } from "./utils.js";
15
16
  export const CLAUDE_CONFIG_DIR = process.env.CLAUDE_CONFIG_DIR ?? path.join(os.homedir(), ".claude");
16
17
  const execFileAsync = promisify(execFile);
@@ -100,11 +101,13 @@ function parseSteerRequest(params) {
100
101
  * result is the turn's real terminal.
101
102
  *
102
103
  * Deliberately fail-OPEN: an unknown future kind defaults to the user
103
- * lane. Misrouting a USER result into the autonomous lane hangs the
104
- * prompt un-detectably (the result is skipped, its trailing idle absorbed
105
- * as owed, so the #825 detector can't fire); misrouting an autonomous
106
- * result into the user lane is the bounded misattribution class this set
107
- * exists to reduce. */
104
+ * lane — including `unclassified` (SDK 0.3.232+), the CLI's own "couldn't
105
+ * attribute this" marker, which gets the same safe default. Misrouting a
106
+ * USER result into the autonomous lane hangs the prompt un-detectably
107
+ * (the result is skipped, its trailing idle absorbed as owed, so the
108
+ * #825 detector can't fire); misrouting an autonomous result into the
109
+ * user lane is the bounded misattribution class this set exists to
110
+ * reduce. */
108
111
  const AUTONOMOUS_RESULT_ORIGINS = new Set([
109
112
  "task-notification",
110
113
  "peer",
@@ -155,9 +158,118 @@ const PROVIDER_ID = "main";
155
158
  */
156
159
  const SUPPORTED_PROTOCOLS = ["anthropic", "bedrock", "vertex"];
157
160
  const SUBAGENT_TRANSCRIPT_CAPABILITY = "subagent-transcript";
161
+ // This is a protocol namespace, not user-facing branding: `jetbrains` owns the
162
+ // non-standard contract and `air` identifies the client defining its rendering
163
+ // semantics, without affecting unrelated JetBrains ACP clients.
164
+ const JETBRAINS_META_KEY = "jetbrains";
165
+ const AIR_META_KEY = "air";
166
+ const AIR_EXTENSION_VERSION_KEY = "version";
167
+ const AIR_EXTENSION_CAPABILITIES_KEY = "capabilities";
168
+ const AIR_SESSION_FAILURE_KEY = "sessionFailure";
169
+ const AIR_EXTENSION_VERSION = 1;
158
170
  function supportsSubagentTranscript(capabilities) {
159
171
  return capabilities?._meta?.[SUBAGENT_TRANSCRIPT_CAPABILITY] === true;
160
172
  }
173
+ const AIR_FAILURE_PRESENTATION = {
174
+ // A non-fatal notice whose wording comes from the adapter or the SDK, so this message is only the
175
+ // fallback for an advisory published without one.
176
+ advisory: {
177
+ message: "Claude reported a notice.",
178
+ retryable: false,
179
+ actions: [],
180
+ },
181
+ auth_required: {
182
+ message: "Sign in to continue using Claude.",
183
+ retryable: false,
184
+ actions: ["login"],
185
+ },
186
+ bad_request: {
187
+ message: "Claude could not process this request.",
188
+ retryable: false,
189
+ actions: ["new_turn"],
190
+ },
191
+ budget_exhausted: {
192
+ message: "This Claude session reached its configured budget.",
193
+ retryable: false,
194
+ actions: ["new_session"],
195
+ },
196
+ context_exhausted: {
197
+ message: "This Claude turn reached its configured limit.",
198
+ retryable: false,
199
+ actions: ["new_turn"],
200
+ },
201
+ internal_error: {
202
+ message: "Claude Agent encountered an internal error.",
203
+ retryable: true,
204
+ actions: ["retry"],
205
+ },
206
+ overloaded: {
207
+ message: "Claude is temporarily overloaded.",
208
+ retryable: true,
209
+ actions: ["retry"],
210
+ },
211
+ provider_error: {
212
+ message: "The model provider reported an error.",
213
+ retryable: true,
214
+ actions: ["retry"],
215
+ },
216
+ quota_exhausted: {
217
+ message: "The Claude account has no available quota.",
218
+ retryable: false,
219
+ actions: ["new_session"],
220
+ },
221
+ rate_limited: {
222
+ message: "Claude is temporarily rate limited.",
223
+ retryable: true,
224
+ actions: ["retry"],
225
+ },
226
+ transport_lost: {
227
+ message: "The connection to Claude was lost.",
228
+ retryable: false,
229
+ actions: ["new_session"],
230
+ },
231
+ worker_shutdown: {
232
+ message: "The Claude worker is shutting down.",
233
+ retryable: false,
234
+ actions: ["new_session"],
235
+ },
236
+ };
237
+ function supportsAirSessionFailures(capabilities) {
238
+ const jetbrains = capabilities?._meta?.[JETBRAINS_META_KEY];
239
+ const air = jetbrains?.[AIR_META_KEY];
240
+ const version = air?.[AIR_EXTENSION_VERSION_KEY];
241
+ const advertised = air?.[AIR_EXTENSION_CAPABILITIES_KEY];
242
+ return (typeof version === "number" &&
243
+ Number.isFinite(version) &&
244
+ Number.isInteger(version) &&
245
+ version >= AIR_EXTENSION_VERSION &&
246
+ Array.isArray(advertised) &&
247
+ advertised.some((capability) => capability === AIR_SESSION_FAILURE_KEY));
248
+ }
249
+ function providerFailureCategory(errorKind) {
250
+ switch (errorKind) {
251
+ case "authentication_failed":
252
+ case "oauth_org_not_allowed":
253
+ return "auth_required";
254
+ case "billing_error":
255
+ return "quota_exhausted";
256
+ case "rate_limit":
257
+ return "rate_limited";
258
+ case "overloaded":
259
+ return "overloaded";
260
+ case "invalid_request":
261
+ case "model_not_found":
262
+ return "bad_request";
263
+ case "max_output_tokens":
264
+ return "context_exhausted";
265
+ case "server_error":
266
+ case "unknown":
267
+ case undefined:
268
+ return "provider_error";
269
+ default:
270
+ return "provider_error";
271
+ }
272
+ }
161
273
  function parentToolUseIdOf(message) {
162
274
  if (!("parent_tool_use_id" in message))
163
275
  return null;
@@ -734,6 +846,12 @@ export class ClaudeAcpAgent {
734
846
  // steering extension contract: advertises the `_session/steering` request
735
847
  // so clients know they may inject a follow-up into a running turn.
736
848
  _meta: {
849
+ [JETBRAINS_META_KEY]: {
850
+ [AIR_META_KEY]: {
851
+ [AIR_EXTENSION_VERSION_KEY]: AIR_EXTENSION_VERSION,
852
+ [AIR_EXTENSION_CAPABILITIES_KEY]: [AIR_SESSION_FAILURE_KEY],
853
+ },
854
+ },
737
855
  steering: {
738
856
  supported: true,
739
857
  },
@@ -966,6 +1084,9 @@ export class ClaudeAcpAgent {
966
1084
  if (session.queryClosed) {
967
1085
  throw RequestError.internalError(undefined, SESSION_ENDED_MESSAGE);
968
1086
  }
1087
+ if (Array.from(session.taskState.values()).some((task) => task.status !== "completed")) {
1088
+ await this.publishTaskPlan(params.sessionId, session.taskState);
1089
+ }
969
1090
  const userMessage = promptToClaude(params);
970
1091
  const promptUuid = randomUUID();
971
1092
  userMessage.uuid = promptUuid;
@@ -1021,6 +1142,15 @@ export class ClaudeAcpAgent {
1021
1142
  },
1022
1143
  });
1023
1144
  }
1145
+ async publishTaskPlan(sessionId, taskState) {
1146
+ await this.client.sessionUpdate({
1147
+ sessionId,
1148
+ update: {
1149
+ sessionUpdate: "plan",
1150
+ entries: taskStateToPlanEntries(taskState),
1151
+ },
1152
+ });
1153
+ }
1024
1154
  async publishGoalFromPrompt(sessionId, prompt, commandUuid) {
1025
1155
  const goalUpdate = goalUpdateFromPrompt(prompt);
1026
1156
  if (goalUpdate !== undefined) {
@@ -1221,6 +1351,115 @@ export class ClaudeAcpAgent {
1221
1351
  }
1222
1352
  await this.client.sessionUpdate(notification);
1223
1353
  };
1354
+ const isAdvisory = (failure) => failure.severity === "warning";
1355
+ const failureRevisions = new Map();
1356
+ const sessionFailureEpoch = randomUUID();
1357
+ const activeSessionFailures = new Map();
1358
+ let pendingWorkerShutdown = false;
1359
+ const isCurrentConsumer = () => this.sessions[params.sessionId] === session;
1360
+ const sessionFailureMeta = (failure, phase) => {
1361
+ const presentation = AIR_FAILURE_PRESENTATION[failure.category];
1362
+ return {
1363
+ [JETBRAINS_META_KEY]: {
1364
+ [AIR_META_KEY]: {
1365
+ [AIR_EXTENSION_VERSION_KEY]: AIR_EXTENSION_VERSION,
1366
+ [AIR_SESSION_FAILURE_KEY]: {
1367
+ id: failure.id,
1368
+ revision: failure.revision,
1369
+ phase,
1370
+ category: failure.category,
1371
+ source: "claude",
1372
+ safeMessage: failure.safeMessage ?? presentation.message,
1373
+ retryable: presentation.retryable,
1374
+ actions: presentation.actions,
1375
+ ...(failure.turnId ? { turnId: failure.turnId } : {}),
1376
+ ...(failure.severity ? { severity: failure.severity } : {}),
1377
+ },
1378
+ },
1379
+ },
1380
+ };
1381
+ };
1382
+ const emitSessionFailure = async (failure, phase) => {
1383
+ if (!isCurrentConsumer()) {
1384
+ this.logger.error(`Session ${params.sessionId}: ignored AIR session failure from a stale query consumer`);
1385
+ return false;
1386
+ }
1387
+ try {
1388
+ await sendUpdate({
1389
+ sessionId: params.sessionId,
1390
+ update: {
1391
+ sessionUpdate: "session_info_update",
1392
+ _meta: sessionFailureMeta(failure, phase),
1393
+ },
1394
+ });
1395
+ return true;
1396
+ }
1397
+ catch (error) {
1398
+ this.logger.error(`Session ${params.sessionId}: failed to publish AIR session failure: ${error}`);
1399
+ return false;
1400
+ }
1401
+ };
1402
+ const clearSessionFailure = async (shouldClear = () => true) => {
1403
+ if (!supportsAirSessionFailures(this.clientCapabilities))
1404
+ return;
1405
+ for (const failure of [...activeSessionFailures.values()]) {
1406
+ if (!shouldClear(failure))
1407
+ continue;
1408
+ const cleared = {
1409
+ ...failure,
1410
+ revision: failure.revision + 1,
1411
+ };
1412
+ if (await emitSessionFailure(cleared, "cleared")) {
1413
+ failureRevisions.set(cleared.id, cleared.revision);
1414
+ activeSessionFailures.delete(cleared.id);
1415
+ }
1416
+ }
1417
+ };
1418
+ const createSessionFailure = async (category, options = {}) => {
1419
+ if (!supportsAirSessionFailures(this.clientCapabilities) || !isCurrentConsumer()) {
1420
+ return undefined;
1421
+ }
1422
+ // An advisory is not a failure of the turn: it keeps its own id namespace and its own slot, so
1423
+ // it neither clears an actionable error nor is cleared by one. Only the newest advisory
1424
+ // matters, so they all share one id and bump its revision.
1425
+ if (category === "advisory") {
1426
+ const id = `${params.sessionId}:notice:${sessionFailureEpoch}`;
1427
+ return {
1428
+ id,
1429
+ revision: (failureRevisions.get(id) ?? 0) + 1,
1430
+ category,
1431
+ severity: "warning",
1432
+ ...(options.safeMessage ? { safeMessage: options.safeMessage } : {}),
1433
+ };
1434
+ }
1435
+ const turnId = options.turnScoped === false ? undefined : session.activeTurn?.promptUuid;
1436
+ const id = turnId
1437
+ ? `${turnId}:error`
1438
+ : `${params.sessionId}:session-error:${sessionFailureEpoch}`;
1439
+ await clearSessionFailure((failure) => failure.id !== id && !isAdvisory(failure));
1440
+ return {
1441
+ id,
1442
+ revision: (failureRevisions.get(id) ?? 0) + 1,
1443
+ category,
1444
+ ...(turnId ? { turnId } : {}),
1445
+ };
1446
+ };
1447
+ const publishSessionFailure = async (category, options = {}) => {
1448
+ const failure = await createSessionFailure(category, options);
1449
+ if (!failure)
1450
+ return;
1451
+ if (await emitSessionFailure(failure, "active")) {
1452
+ failureRevisions.set(failure.id, failure.revision);
1453
+ activeSessionFailures.set(failure.id, failure);
1454
+ }
1455
+ };
1456
+ const clearFailuresFromEarlierTurns = async () => {
1457
+ const activeTurnId = session.activeTurn?.promptUuid;
1458
+ // Advisories carry no turnId, so without the guard every turn boundary would sweep them away.
1459
+ // They are session-scoped and stay until superseded or dismissed by the user.
1460
+ await clearSessionFailure((failure) => failure.turnId !== activeTurnId && !isAdvisory(failure));
1461
+ };
1462
+ const internalErrorForClient = (data, rawDetail) => RequestError.internalError(data, supportsAirSessionFailures(this.clientCapabilities) ? undefined : rawDetail);
1224
1463
  const resetTurnScratch = () => {
1225
1464
  lastAssistantTotalUsage = null;
1226
1465
  lastAssistantUsage = null;
@@ -1504,6 +1743,7 @@ export class ClaudeAcpAgent {
1504
1743
  disarmForceCancel(session);
1505
1744
  const turn = session.activeTurn;
1506
1745
  if (!turn || turn.settled) {
1746
+ this.logger.error(`Session ${params.sessionId}: cannot fail active turn because no unsettled active turn exists: ${error}`);
1507
1747
  return;
1508
1748
  }
1509
1749
  turn.settled = true;
@@ -1517,6 +1757,32 @@ export class ClaudeAcpAgent {
1517
1757
  session.emittedAssistantText = false;
1518
1758
  turn.reject(error);
1519
1759
  };
1760
+ /** Complete a negotiated terminal failure on the prompt response itself,
1761
+ * which is the canonical AIR carrier. Legacy clients keep the historical
1762
+ * JSON-RPC rejection path. */
1763
+ const failActiveWithSessionFailure = async (category, error) => {
1764
+ if (!supportsAirSessionFailures(this.clientCapabilities)) {
1765
+ failActive(error);
1766
+ return;
1767
+ }
1768
+ if (!session.activeTurn || session.activeTurn.settled) {
1769
+ this.logger.error(`Session ${params.sessionId}: cannot attach ${category} to a prompt response because no active turn exists; publishing a session-scoped failure`);
1770
+ await publishSessionFailure(category, { turnScoped: false });
1771
+ return;
1772
+ }
1773
+ const failure = await createSessionFailure(category);
1774
+ if (!failure) {
1775
+ failActive(error);
1776
+ return;
1777
+ }
1778
+ failureRevisions.set(failure.id, failure.revision);
1779
+ activeSessionFailures.set(failure.id, failure);
1780
+ settleActive({
1781
+ stopReason: "end_turn",
1782
+ usage: sessionUsage(session),
1783
+ _meta: sessionFailureMeta(failure, "active"),
1784
+ });
1785
+ };
1520
1786
  /** Reject every in-flight turn — used when the stream dies. */
1521
1787
  const failAllTurns = (error) => {
1522
1788
  disarmForceCancel(session);
@@ -1634,6 +1900,24 @@ export class ClaudeAcpAgent {
1634
1900
  pendingNext = null;
1635
1901
  const { value: message, done } = raced.result;
1636
1902
  if (done || !message) {
1903
+ if (pendingWorkerShutdown) {
1904
+ pendingWorkerShutdown = false;
1905
+ if (session.activeTurn) {
1906
+ if (!isHeldOpen(session.activeTurn)) {
1907
+ await failActiveWithSessionFailure("worker_shutdown", internalErrorForClient({ errorKind: "worker_shutdown" }));
1908
+ }
1909
+ else {
1910
+ // The held turn already has its authoritative terminal outcome,
1911
+ // but EOF permanently closes the non-revivable Query. Preserve
1912
+ // the turn result below and report the independent session-health
1913
+ // failure without a turnId so AIR can offer a new session.
1914
+ await publishSessionFailure("worker_shutdown", { turnScoped: false });
1915
+ }
1916
+ }
1917
+ else {
1918
+ await publishSessionFailure("worker_shutdown", { turnScoped: false });
1919
+ }
1920
+ }
1637
1921
  // The stream ended. Settle the in-flight turns FIRST, then release the
1638
1922
  // stream resources — same order as the error paths (failAllTurns before
1639
1923
  // closeQueryStream). Settling is the user-facing contract; resource
@@ -1785,6 +2069,23 @@ export class ClaudeAcpAgent {
1785
2069
  // updated Fast mode state; reconcile it with what we seeded at
1786
2070
  // session creation.
1787
2071
  await this.syncFastModeState(message.session_id, session, message.fast_mode_state, message.fast_mode_disabled_reason);
2072
+ // Terminal-bound slash commands (absent when none, and on
2073
+ // older CLIs). The session/new advertisement runs before any
2074
+ // init frame can be observed, so the first latch (or a
2075
+ // genuine change) re-publishes the now-filtered list.
2076
+ if (message.terminal_slash_commands &&
2077
+ JSON.stringify(message.terminal_slash_commands) !==
2078
+ JSON.stringify(session.terminalSlashCommands)) {
2079
+ session.terminalSlashCommands = message.terminal_slash_commands;
2080
+ try {
2081
+ await this.sendAvailableCommandsUpdate(message.session_id);
2082
+ }
2083
+ catch (error) {
2084
+ // Advisory reconcile only — the client keeps its current
2085
+ // (unfiltered) list; never fail the turn over it.
2086
+ this.logger.error(`Failed to re-advertise slash commands: ${error}`);
2087
+ }
2088
+ }
1788
2089
  break;
1789
2090
  case "status": {
1790
2091
  // These banners count as delivered text (via sendUpdate), so
@@ -1977,7 +2278,7 @@ export class ClaudeAcpAgent {
1977
2278
  // the next prompt; only a timer could tell those apart.
1978
2279
  this.logger.error(`Session ${params.sessionId}: SDK went idle without emitting a result ` +
1979
2280
  `for the active turn; failing the in-flight prompt (issue #825)`);
1980
- failActive(RequestError.internalError(errorKindData("no_result"), TURN_NO_RESULT_MESSAGE));
2281
+ await failActiveWithSessionFailure("internal_error", RequestError.internalError(errorKindData("no_result"), TURN_NO_RESULT_MESSAGE));
1981
2282
  }
1982
2283
  // The SDK generates the session title in a background task and
1983
2284
  // persists it to the session file; `idle` is the turn-over
@@ -2035,7 +2336,7 @@ export class ClaudeAcpAgent {
2035
2336
  sessionId: message.session_id,
2036
2337
  update: {
2037
2338
  sessionUpdate: "available_commands_update",
2038
- availableCommands: getAvailableSlashCommands(message.commands),
2339
+ availableCommands: getAvailableSlashCommands(message.commands, session.terminalSlashCommands),
2039
2340
  },
2040
2341
  });
2041
2342
  break;
@@ -2177,9 +2478,14 @@ export class ClaudeAcpAgent {
2177
2478
  }
2178
2479
  break;
2179
2480
  case "worker_shutting_down":
2180
- // A Remote Control worker announced a graceful teardown. This is a
2181
- // live-tail signal for remote clients to explain why a session went
2182
- // away; it's not meaningful for a local stdio ACP session.
2481
+ // Defer until stream end. The announcement is durable and may be
2482
+ // replayed before later frames, but those frames do not prove that
2483
+ // a new worker epoch began: they can be buffered output from the
2484
+ // shutting-down worker. Keep the signal armed until the transport
2485
+ // actually ends. Deliberately do not add a quiet-period timer: the
2486
+ // iterator has no replay/live boundary, so a timeout could publish
2487
+ // while a slow replay is still in flight.
2488
+ pendingWorkerShutdown = true;
2183
2489
  break;
2184
2490
  case "elicitation_complete": {
2185
2491
  // A url-mode MCP elicitation finished server-side. Let the client
@@ -2216,7 +2522,15 @@ export class ClaudeAcpAgent {
2216
2522
  // CLIs, where "revert" marked a turn-only fallback — for that
2217
2523
  // direction the session stays on the original model, so skip
2218
2524
  // the persistent-swap claim and the state sync.
2219
- const persistent = message.direction !== "revert";
2525
+ //
2526
+ // `scope` (CLI 2.1.232+) marks WHERE the fallback happened:
2527
+ // "local" means a subagent / side-question / background fork
2528
+ // response fell back and the session model is unchanged, so
2529
+ // syncing the picker would advertise a model the session
2530
+ // isn't running. Absent scope means an older CLI, where every
2531
+ // retry was a session-level swap — treat as "session".
2532
+ const local = message.scope === "local";
2533
+ const persistent = message.direction !== "revert" && !local;
2220
2534
  const category = message.api_refusal_category
2221
2535
  ? ` (${message.api_refusal_category})`
2222
2536
  : "";
@@ -2225,17 +2539,29 @@ export class ClaudeAcpAgent {
2225
2539
  : "";
2226
2540
  const outcome = persistent
2227
2541
  ? `The session will continue on ${message.fallback_model}.`
2228
- : `The session stays on ${message.original_model}.`;
2229
- await sendUpdate({
2230
- sessionId: message.session_id,
2231
- update: {
2232
- sessionUpdate: "agent_message_chunk",
2233
- content: {
2234
- type: "text",
2235
- text: `**Model fallback:** ${message.original_model} declined this request${category}; retried with ${message.fallback_model}. ${outcome}${explanation}`,
2542
+ : local
2543
+ ? `Only that response came from ${message.fallback_model}; the session stays on ${message.original_model}.`
2544
+ : `The session stays on ${message.original_model}.`;
2545
+ const fallbackNotice = `${message.original_model} declined this request${category}; ` +
2546
+ `retried with ${message.fallback_model}. ${outcome}${explanation}`;
2547
+ // A silent model swap is a session-level advisory, not something the model said.
2548
+ // Clients that negotiated typed records get it as one; the rest keep the bold-label
2549
+ // transcript line, which was the only way to flag it before.
2550
+ if (supportsAirSessionFailures(this.clientCapabilities)) {
2551
+ await publishSessionFailure("advisory", { safeMessage: fallbackNotice });
2552
+ }
2553
+ else {
2554
+ await sendUpdate({
2555
+ sessionId: message.session_id,
2556
+ update: {
2557
+ sessionUpdate: "agent_message_chunk",
2558
+ content: {
2559
+ type: "text",
2560
+ text: `**Model fallback:** ${fallbackNotice}`,
2561
+ },
2236
2562
  },
2237
- },
2238
- });
2563
+ });
2564
+ }
2239
2565
  if (persistent) {
2240
2566
  await this.syncModelAfterRefusalFallback(params.sessionId, session, message.fallback_model);
2241
2567
  }
@@ -2473,6 +2799,7 @@ export class ClaudeAcpAgent {
2473
2799
  }
2474
2800
  if (session.cancelled) {
2475
2801
  if (!isAutonomousResult) {
2802
+ await clearFailuresFromEarlierTurns();
2476
2803
  stopReason = "cancelled";
2477
2804
  }
2478
2805
  break;
@@ -2508,6 +2835,7 @@ export class ClaudeAcpAgent {
2508
2835
  }
2509
2836
  break;
2510
2837
  }
2838
+ await clearFailuresFromEarlierTurns();
2511
2839
  // A refusal can arrive on any result subtype (and may even set
2512
2840
  // is_error), so handle it before the subtype switch — otherwise the
2513
2841
  // is_error throw below would surface it as an internal error. The
@@ -2544,10 +2872,13 @@ export class ClaudeAcpAgent {
2544
2872
  settleOrDefer({ stopReason: "end_turn", usage: sessionUsage(session) });
2545
2873
  break;
2546
2874
  }
2875
+ if (!message.is_error) {
2876
+ await clearSessionFailure();
2877
+ }
2547
2878
  switch (message.subtype) {
2548
2879
  case "success": {
2549
2880
  if (message.result.includes("Please run /login")) {
2550
- failActive(RequestError.authRequired());
2881
+ await failActiveWithSessionFailure("auth_required", RequestError.authRequired());
2551
2882
  break;
2552
2883
  }
2553
2884
  if (message.stop_reason === "max_tokens") {
@@ -2555,7 +2886,7 @@ export class ClaudeAcpAgent {
2555
2886
  break;
2556
2887
  }
2557
2888
  if (message.is_error) {
2558
- failActive(RequestError.internalError(errorKindData(lastAssistantError), message.result));
2889
+ await failActiveWithSessionFailure(providerFailureCategory(lastAssistantError), internalErrorForClient(errorKindData(lastAssistantError), message.result));
2559
2890
  break;
2560
2891
  }
2561
2892
  // The result text is forwarded in two cases. Local-only
@@ -2591,17 +2922,29 @@ export class ClaudeAcpAgent {
2591
2922
  break;
2592
2923
  }
2593
2924
  if (message.is_error) {
2594
- failActive(RequestError.internalError(errorKindData(lastAssistantError), message.errors.join(", ") || message.subtype));
2925
+ await failActiveWithSessionFailure(providerFailureCategory(lastAssistantError), internalErrorForClient(errorKindData(lastAssistantError), message.errors.join(", ") || message.subtype));
2595
2926
  break;
2596
2927
  }
2597
2928
  stopReason = "end_turn";
2598
2929
  break;
2599
2930
  }
2600
2931
  case "error_max_budget_usd":
2932
+ if (message.is_error) {
2933
+ await failActiveWithSessionFailure("budget_exhausted", internalErrorForClient(errorKindData(lastAssistantError), message.errors.join(", ") || message.subtype));
2934
+ break;
2935
+ }
2936
+ stopReason = "max_turn_requests";
2937
+ break;
2601
2938
  case "error_max_turns":
2939
+ if (message.is_error) {
2940
+ await failActiveWithSessionFailure("provider_error", internalErrorForClient(errorKindData(lastAssistantError), message.errors.join(", ") || message.subtype));
2941
+ break;
2942
+ }
2943
+ stopReason = "max_turn_requests";
2944
+ break;
2602
2945
  case "error_max_structured_output_retries":
2603
2946
  if (message.is_error) {
2604
- failActive(RequestError.internalError(errorKindData(lastAssistantError), message.errors.join(", ") || message.subtype));
2947
+ await failActiveWithSessionFailure("provider_error", internalErrorForClient(errorKindData(lastAssistantError), message.errors.join(", ") || message.subtype));
2605
2948
  break;
2606
2949
  }
2607
2950
  stopReason = "max_turn_requests";
@@ -2933,7 +3276,7 @@ export class ClaudeAcpAgent {
2933
3276
  break;
2934
3277
  }
2935
3278
  if (message.type === "assistant" && isSyntheticLoginMessage(message.message)) {
2936
- failActive(RequestError.authRequired());
3279
+ await failActiveWithSessionFailure("auth_required", RequestError.authRequired());
2937
3280
  break;
2938
3281
  }
2939
3282
  let content;
@@ -3095,13 +3438,22 @@ export class ClaudeAcpAgent {
3095
3438
  }
3096
3439
  break;
3097
3440
  }
3098
- // `conversation_reset` (from `/clear`, plan-mode exit, fresh-session
3099
- // flows) is safe to drop: turn lifecycle here is driven by
3100
- // results/idle, and the client owns its own transcript view.
3441
+ case "conversation_reset": {
3442
+ // The SDK has switched to a fresh conversation, whose Task* IDs
3443
+ // and task store are independent of the previous transcript.
3444
+ // Clear both the in-memory snapshot and the client's visible plan
3445
+ // before any follow-up prompt can republish stale tasks.
3446
+ session.taskState.clear();
3447
+ await this.publishTaskPlan(params.sessionId, session.taskState);
3448
+ break;
3449
+ }
3101
3450
  case "tool_use_summary":
3102
- case "auth_status":
3103
3451
  case "prompt_suggestion":
3104
- case "conversation_reset":
3452
+ break;
3453
+ case "auth_status":
3454
+ if (!message.isAuthenticating && message.error === undefined) {
3455
+ await clearSessionFailure((failure) => failure.category === "auth_required");
3456
+ }
3105
3457
  break;
3106
3458
  default:
3107
3459
  unreachable(message, this.logger);
@@ -3123,6 +3475,19 @@ export class ClaudeAcpAgent {
3123
3475
  message.includes("process exited with") ||
3124
3476
  message.includes("process terminated by signal") ||
3125
3477
  message.includes("Failed to write to process stdin"));
3478
+ if (supportsAirSessionFailures(this.clientCapabilities) && session.activeTurn) {
3479
+ if (!isHeldOpen(session.activeTurn)) {
3480
+ await failActiveWithSessionFailure("transport_lost", internalErrorForClient({ errorKind: "transport_lost" }));
3481
+ }
3482
+ else {
3483
+ // The held turn keeps its recorded PromptResponse outcome, while the
3484
+ // exhausted Query makes the session independently unrecoverable.
3485
+ await publishSessionFailure("transport_lost", { turnScoped: false });
3486
+ }
3487
+ }
3488
+ else {
3489
+ await publishSessionFailure("transport_lost", { turnScoped: false });
3490
+ }
3126
3491
  // Either way the query iterator is finished and the consumer is exiting,
3127
3492
  // so release its resources via closeQueryStream (idempotent). A process
3128
3493
  // death is unrecoverable, so additionally evict the session so the client
@@ -3136,7 +3501,9 @@ export class ClaudeAcpAgent {
3136
3501
  }
3137
3502
  else {
3138
3503
  this.logger.error(`Session ${params.sessionId}: query stream error: ${message}`);
3139
- failAllTurns(error);
3504
+ failAllTurns(supportsAirSessionFailures(this.clientCapabilities)
3505
+ ? internalErrorForClient({ errorKind: "transport_lost" })
3506
+ : error);
3140
3507
  this.closeQueryStream(session);
3141
3508
  }
3142
3509
  }
@@ -3992,7 +4359,7 @@ export class ClaudeAcpAgent {
3992
4359
  sessionId,
3993
4360
  update: {
3994
4361
  sessionUpdate: "available_commands_update",
3995
- availableCommands: getAvailableSlashCommands(commands),
4362
+ availableCommands: getAvailableSlashCommands(commands, session.terminalSlashCommands),
3996
4363
  },
3997
4364
  });
3998
4365
  }
@@ -4506,15 +4873,7 @@ export class ClaudeAcpAgent {
4506
4873
  hooks: [
4507
4874
  createTaskHook({
4508
4875
  taskState,
4509
- onChange: async () => {
4510
- await this.client.sessionUpdate({
4511
- sessionId,
4512
- update: {
4513
- sessionUpdate: "plan",
4514
- entries: taskStateToPlanEntries(taskState),
4515
- },
4516
- });
4517
- },
4876
+ onChange: () => this.publishTaskPlan(sessionId, taskState),
4518
4877
  }),
4519
4878
  ],
4520
4879
  },
@@ -4525,15 +4884,7 @@ export class ClaudeAcpAgent {
4525
4884
  hooks: [
4526
4885
  createTaskHook({
4527
4886
  taskState,
4528
- onChange: async () => {
4529
- await this.client.sessionUpdate({
4530
- sessionId,
4531
- update: {
4532
- sessionUpdate: "plan",
4533
- entries: taskStateToPlanEntries(taskState),
4534
- },
4535
- });
4536
- },
4887
+ onChange: () => this.publishTaskPlan(sessionId, taskState),
4537
4888
  }),
4538
4889
  ],
4539
4890
  },
@@ -5113,11 +5464,21 @@ export function buildConfigOptions(modes, models, modelInfos, currentEffortLevel
5113
5464
  category: "model",
5114
5465
  type: "select",
5115
5466
  currentValue: models.currentModelId,
5116
- options: models.availableModels.map((m) => ({
5117
- value: m.modelId,
5118
- name: m.name,
5119
- description: m.description ?? undefined,
5120
- })),
5467
+ options: models.availableModels.map((m) => {
5468
+ if (m.modelId === "default") {
5469
+ const defaultInfo = modelInfos.find((mi) => mi.value === "default");
5470
+ const resolvedModel = defaultInfo?.resolvedModel;
5471
+ if (resolvedModel) {
5472
+ const namedMatch = modelInfos.find((mi) => mi.value !== "default" && mi.resolvedModel === resolvedModel);
5473
+ return {
5474
+ value: m.modelId,
5475
+ name: m.name,
5476
+ description: namedMatch?.displayName ?? resolvedModel,
5477
+ };
5478
+ }
5479
+ }
5480
+ return { value: m.modelId, name: m.name, description: m.description ?? undefined };
5481
+ }),
5121
5482
  },
5122
5483
  ];
5123
5484
  // Add effort level option based on the currently selected model
@@ -5549,7 +5910,11 @@ async function getAvailableModels(query, models, sdkModels, settingsManager, log
5549
5910
  resumedContextWindow,
5550
5911
  };
5551
5912
  }
5552
- function getAvailableSlashCommands(commands) {
5913
+ function getAvailableSlashCommands(commands,
5914
+ // Names the CLI tagged terminal-bound on `system`/init (their UX lives in
5915
+ // the CLI's own terminal, which ACP clients aren't) — filtered alongside
5916
+ // the static list. Raw CLI names, matched before the MCP rename.
5917
+ terminalCommands) {
5553
5918
  const UNSUPPORTED_COMMANDS = [
5554
5919
  "clear",
5555
5920
  "cost",
@@ -5561,6 +5926,7 @@ function getAvailableSlashCommands(commands) {
5561
5926
  "todos",
5562
5927
  ];
5563
5928
  return commands
5929
+ .filter((command) => !terminalCommands?.includes(command.name))
5564
5930
  .map((command) => {
5565
5931
  const input = command.argumentHint
5566
5932
  ? {
@@ -5739,7 +6105,7 @@ function shouldEmitToolCall(toolName) {
5739
6105
  * are kept out of ACP's standard `title`, which clients may use as the shell
5740
6106
  * command preview, while still giving clients access to Claude's concise
5741
6107
  * human-readable title. */
5742
- function claudeCodeMetaFromToolUse(toolUse) {
6108
+ function claudeCodeMetaFromToolUse(toolUse, cwd) {
5743
6109
  const description = toolUse.name === "Bash" &&
5744
6110
  toolUse.input !== null &&
5745
6111
  typeof toolUse.input === "object" &&
@@ -5747,12 +6113,54 @@ function claudeCodeMetaFromToolUse(toolUse) {
5747
6113
  typeof toolUse.input.description === "string"
5748
6114
  ? toolUse.input.description
5749
6115
  : undefined;
6116
+ const skillName = toolUse.name === "Skill"
6117
+ ? toolUse.input?.skill
6118
+ : undefined;
6119
+ const skillPath = skillName ? resolveSkillPath(skillName, cwd) : undefined;
5750
6120
  return {
5751
6121
  toolName: toolUse.name,
5752
6122
  ...(description ? { title: description } : {}),
5753
6123
  ...((toolUse.name === "Agent" || toolUse.name === "Task") && { subagent: true }),
6124
+ ...(skillName ? { skill: skillName } : {}),
6125
+ ...(skillPath ? { skillPath } : {}),
5754
6126
  };
5755
6127
  }
6128
+ /** Roots a skill's directory may sit under, relative to the directory the scope resolves to. */
6129
+ const SKILL_CONTAINER_DIRS = [".claude/skills", ".agents/skills"];
6130
+ /**
6131
+ * Absolute path of a skill's `SKILL.md`, or `undefined` when none of the known layouts holds one.
6132
+ *
6133
+ * The `Skill` tool reports only the skill's name, so the file has to be located by probing the layouts skills
6134
+ * actually use: project- and user-level `.claude/skills` (plus this repo's `.agents/skills` source of truth), and
6135
+ * for a `<prefix>:<name>` spelling either a plugin (`.claude/plugins/<prefix>/skills/<name>`) or a
6136
+ * directory-scoped skill (`<prefix>/.claude/skills/<name>`), which share that spelling. Only a path that exists
6137
+ * on disk is returned, so a wrong guess costs nothing and clients never render a link to a missing file.
6138
+ */
6139
+ function resolveSkillPath(skillName, cwd) {
6140
+ if (!cwd) {
6141
+ return undefined;
6142
+ }
6143
+ const colon = skillName.indexOf(":");
6144
+ const scope = colon < 0 ? undefined : skillName.slice(0, colon);
6145
+ const name = colon < 0 ? skillName : skillName.slice(colon + 1);
6146
+ if (!name) {
6147
+ return undefined;
6148
+ }
6149
+ const candidates = [];
6150
+ const addCandidates = (base) => {
6151
+ for (const container of SKILL_CONTAINER_DIRS) {
6152
+ candidates.push(path.join(base, container, name, "SKILL.md"));
6153
+ }
6154
+ };
6155
+ if (scope) {
6156
+ // A `<prefix>:<name>` skill is either directory-scoped or a plugin's; both spellings look identical.
6157
+ addCandidates(path.join(cwd, scope));
6158
+ candidates.push(path.join(cwd, ".claude/plugins", scope, "skills", name, "SKILL.md"));
6159
+ }
6160
+ addCandidates(cwd);
6161
+ addCandidates(os.homedir());
6162
+ return candidates.find((candidate) => existsSync(candidate));
6163
+ }
5756
6164
  /** Build the `tool_call` (or, with `refine`, the `tool_call_update`)
5757
6165
  * notification for a tool_use. Shared by every site that surfaces a tool call:
5758
6166
  * the streamed tool_use path (first encounter → tool_call, later encounter →
@@ -5763,7 +6171,7 @@ function claudeCodeMetaFromToolUse(toolUse) {
5763
6171
  function toolCallNotification(toolUse, rawInput, supportsTerminalOutput, cwd, refine = false) {
5764
6172
  if (refine) {
5765
6173
  return {
5766
- _meta: { claudeCode: claudeCodeMetaFromToolUse(toolUse) },
6174
+ _meta: { claudeCode: claudeCodeMetaFromToolUse(toolUse, cwd) },
5767
6175
  toolCallId: toolUse.id,
5768
6176
  sessionUpdate: "tool_call_update",
5769
6177
  rawInput,
@@ -5772,7 +6180,7 @@ function toolCallNotification(toolUse, rawInput, supportsTerminalOutput, cwd, re
5772
6180
  }
5773
6181
  return {
5774
6182
  _meta: {
5775
- claudeCode: claudeCodeMetaFromToolUse(toolUse),
6183
+ claudeCode: claudeCodeMetaFromToolUse(toolUse, cwd),
5776
6184
  ...(toolUse.name === "Bash" && supportsTerminalOutput
5777
6185
  ? { terminal_info: { terminal_id: toolUse.id } }
5778
6186
  : {}),
@@ -5798,7 +6206,7 @@ function streamedInputRefinement(toolUse, input, supportsTerminalOutput, cwd) {
5798
6206
  const { title, kind, locations } = toolInfoFromToolUse({ ...toolUse, input }, supportsTerminalOutput, cwd);
5799
6207
  return {
5800
6208
  _meta: {
5801
- claudeCode: claudeCodeMetaFromToolUse({ ...toolUse, input }),
6209
+ claudeCode: claudeCodeMetaFromToolUse({ ...toolUse, input }, cwd),
5802
6210
  },
5803
6211
  toolCallId: toolUse.id,
5804
6212
  sessionUpdate: "tool_call_update",
@@ -6081,20 +6489,40 @@ export function toAcpNotifications(content, role, sessionId, toolUseCache, clien
6081
6489
  }
6082
6490
  if (isTaskTool(toolUse.name)) {
6083
6491
  // Headless/SDK sessions emit Task* tools instead of TodoWrite.
6084
- // TaskCreate / TaskUpdate mutate the accumulated task list; TaskList
6085
- // and TaskGet are read-only so we just suppress their tool_call /
6086
- // tool_result events. The plan update is emitted as a snapshot of
6087
- // the accumulated state, mirroring the legacy TodoWrite behavior.
6492
+ // TaskCreate / TaskUpdate mutate the accumulated task list. TaskList
6493
+ // reconciles it from the SDK's authoritative snapshot, which repairs
6494
+ // resumed or compacted sessions whose creating calls are no longer in
6495
+ // replay history. TaskGet is read-only and remains suppressed. Plan
6496
+ // updates always carry the full accumulated snapshot, mirroring the
6497
+ // legacy TodoWrite behavior.
6088
6498
  const isError = "is_error" in chunk && chunk.is_error;
6499
+ let shouldEmitTaskPlan = false;
6089
6500
  if (!isError) {
6090
6501
  if (toolUse.name === "TaskCreate") {
6091
- applyTaskCreate(taskState, toolUse.input, parseTaskCreateOutput(chunk.content));
6502
+ applyTaskCreate(taskState, toolUse.input, parseTaskCreateOutput(toolUseResult) ?? parseTaskCreateOutput(chunk.content));
6503
+ shouldEmitTaskPlan = true;
6092
6504
  }
6093
6505
  else if (toolUse.name === "TaskUpdate") {
6094
- applyTaskUpdate(taskState, toolUse.input);
6506
+ const input = toolUse.input;
6507
+ const output = parseTaskUpdateOutput(toolUseResult, input?.taskId) ??
6508
+ parseTaskUpdateOutput(chunk.content, input?.taskId);
6509
+ // Older CLI transcripts have no structured output, so retain the
6510
+ // input-based fallback. When an output is available, only apply a
6511
+ // confirmed update for the same task.
6512
+ if (!output || (output.success && output.taskId === input?.taskId)) {
6513
+ applyTaskUpdate(taskState, input);
6514
+ shouldEmitTaskPlan = true;
6515
+ }
6516
+ }
6517
+ else if (toolUse.name === "TaskList") {
6518
+ const output = parseTaskListOutput(toolUseResult) ?? parseTaskListOutput(chunk.content);
6519
+ if (output) {
6520
+ applyTaskList(taskState, output);
6521
+ shouldEmitTaskPlan = true;
6522
+ }
6095
6523
  }
6096
6524
  }
6097
- if (!isError && (toolUse.name === "TaskCreate" || toolUse.name === "TaskUpdate")) {
6525
+ if (shouldEmitTaskPlan) {
6098
6526
  update = {
6099
6527
  sessionUpdate: "plan",
6100
6528
  entries: taskStateToPlanEntries(taskState),
package/dist/tools.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { PlanEntry, ToolCallContent, ToolCallLocation, ToolKind } from "@agentclientprotocol/sdk";
2
2
  import { HookCallback } from "@anthropic-ai/claude-agent-sdk";
3
- import { TaskCreateInput, TaskCreateOutput, TaskUpdateInput } from "@anthropic-ai/claude-agent-sdk/sdk-tools.js";
3
+ import { TaskCreateInput, TaskCreateOutput, TaskListOutput, TaskUpdateInput, TaskUpdateOutput } from "@anthropic-ai/claude-agent-sdk/sdk-tools.js";
4
4
  import { ToolResultBlockParam, WebSearchToolResultBlockParam } from "@anthropic-ai/sdk/resources";
5
5
  import { BetaBashCodeExecutionToolResultBlockParam, BetaCodeExecutionToolResultBlockParam, BetaRequestMCPToolResultBlockParam, BetaTextEditorCodeExecutionToolResultBlockParam, BetaToolResultBlockParam, BetaToolSearchToolResultBlockParam, BetaWebFetchToolResultBlockParam, BetaWebSearchToolResultBlockParam } from "@anthropic-ai/sdk/resources/beta.mjs";
6
6
  interface ToolInfo {
@@ -57,14 +57,12 @@ export type TaskEntry = {
57
57
  description?: string;
58
58
  };
59
59
  export type TaskState = Map<string, TaskEntry>;
60
- /**
61
- * Best-effort parse of a TaskCreate tool_result content into the structured
62
- * TaskCreateOutput. The SDK delivers tool outputs either as a string or as
63
- * an array of TextBlockParam-like blocks containing JSON text; try both.
64
- */
65
60
  export declare function parseTaskCreateOutput(content: unknown): TaskCreateOutput | undefined;
61
+ export declare function parseTaskListOutput(content: unknown): TaskListOutput | undefined;
62
+ export declare function parseTaskUpdateOutput(content: unknown, expectedTaskId?: string): TaskUpdateOutput | undefined;
66
63
  export declare function applyTaskCreate(state: TaskState, input: TaskCreateInput | undefined, output: TaskCreateOutput | undefined): void;
67
64
  export declare function applyTaskUpdate(state: TaskState, input: TaskUpdateInput | undefined): void;
65
+ export declare function applyTaskList(state: TaskState, output: TaskListOutput): void;
68
66
  export declare function taskStateToPlanEntries(state: TaskState): PlanEntry[];
69
67
  export declare function markdownEscape(text: string): string;
70
68
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/dist/tools.js CHANGED
@@ -96,7 +96,7 @@ export function toolInfoFromToolUse(toolUse, supportsTerminalOutput = false, cwd
96
96
  }
97
97
  const displayPath = input?.file_path ? toDisplayPath(input.file_path, cwd) : undefined;
98
98
  return {
99
- title: displayPath ? `Write ${displayPath}` : "Write",
99
+ title: displayPath ? `Write ${displayPath}` : "Preparing file…",
100
100
  kind: "edit",
101
101
  content,
102
102
  locations: input?.file_path ? [{ path: input.file_path }] : [],
@@ -291,6 +291,15 @@ export function toolInfoFromToolUse(toolUse, supportsTerminalOutput = false, cwd
291
291
  : [],
292
292
  };
293
293
  }
294
+ case "Skill": {
295
+ const input = toolUse.input;
296
+ const skillName = input?.skill;
297
+ return {
298
+ title: skillName ? `Load skill: ${skillName}` : "Load skill",
299
+ kind: "other",
300
+ content: [],
301
+ };
302
+ }
294
303
  case "AskUserQuestion": {
295
304
  const input = toolUse.input;
296
305
  const questions = Array.isArray(input?.questions) ? input.questions : [];
@@ -658,6 +667,9 @@ export function toolUpdateFromToolResult(toolResult, toolUse, supportsTerminalOu
658
667
  // renders, no worse than before.
659
668
  return toAcpContentUpdate(stripAgentTrailerFromContent(toolResult.content), "is_error" in toolResult ? toolResult.is_error : false);
660
669
  }
670
+ case "Skill": {
671
+ return {};
672
+ }
661
673
  case "Edit": // Edit is handled in hooks
662
674
  case "Write": {
663
675
  return {};
@@ -798,35 +810,32 @@ function toAcpContentBlock(content, isError) {
798
810
  }
799
811
  export function planEntries(input) {
800
812
  return (input?.todos ?? []).map((todo) => ({
801
- content: todo.content,
813
+ content: todo.status === "in_progress" && todo.activeForm ? todo.activeForm : todo.content,
802
814
  status: todo.status,
803
815
  priority: "medium",
804
816
  }));
805
817
  }
806
818
  /**
807
- * Best-effort parse of a TaskCreate tool_result content into the structured
808
- * TaskCreateOutput. The SDK delivers tool outputs either as a string or as
809
- * an array of TextBlockParam-like blocks containing JSON text; try both.
819
+ * Best-effort parse of a structured Task* tool_result. The SDK delivers tool
820
+ * outputs either as a string or as an array of TextBlockParam-like blocks
821
+ * containing JSON text; try both.
810
822
  */
811
- export function parseTaskCreateOutput(content) {
823
+ function parseJsonToolOutput(content, isExpectedOutput) {
812
824
  const tryParse = (text) => {
813
825
  try {
814
826
  const parsed = JSON.parse(text);
815
- if (parsed &&
816
- typeof parsed === "object" &&
817
- parsed.task &&
818
- typeof parsed.task.id === "string") {
819
- return parsed;
820
- }
827
+ return isExpectedOutput(parsed) ? parsed : undefined;
821
828
  }
822
829
  catch {
823
- // ignore
830
+ return undefined;
824
831
  }
825
- return undefined;
826
832
  };
827
833
  if (typeof content === "string") {
828
834
  return tryParse(content);
829
835
  }
836
+ if (content && typeof content === "object" && !Array.isArray(content)) {
837
+ return isExpectedOutput(content) ? content : undefined;
838
+ }
830
839
  if (Array.isArray(content)) {
831
840
  for (const block of content) {
832
841
  if (block && typeof block === "object" && "type" in block && block.type === "text") {
@@ -841,6 +850,96 @@ export function parseTaskCreateOutput(content) {
841
850
  }
842
851
  return undefined;
843
852
  }
853
+ function toolOutputTexts(content) {
854
+ if (typeof content === "string")
855
+ return [content];
856
+ if (!Array.isArray(content))
857
+ return [];
858
+ return content.flatMap((block) => block &&
859
+ typeof block === "object" &&
860
+ "type" in block &&
861
+ block.type === "text" &&
862
+ "text" in block &&
863
+ typeof block.text === "string"
864
+ ? [block.text]
865
+ : []);
866
+ }
867
+ export function parseTaskCreateOutput(content) {
868
+ const structured = parseJsonToolOutput(content, (parsed) => Boolean(parsed &&
869
+ typeof parsed === "object" &&
870
+ "task" in parsed &&
871
+ parsed.task &&
872
+ typeof parsed.task === "object" &&
873
+ "id" in parsed.task &&
874
+ typeof parsed.task.id === "string"));
875
+ if (structured)
876
+ return structured;
877
+ for (const text of toolOutputTexts(content)) {
878
+ const match = /^Task #(\S+) created successfully: (.+)$/.exec(text.trim());
879
+ if (match)
880
+ return { task: { id: match[1], subject: match[2] } };
881
+ }
882
+ return undefined;
883
+ }
884
+ export function parseTaskListOutput(content) {
885
+ const validStatuses = new Set(["pending", "in_progress", "completed"]);
886
+ const structured = parseJsonToolOutput(content, (parsed) => Boolean(parsed &&
887
+ typeof parsed === "object" &&
888
+ "tasks" in parsed &&
889
+ Array.isArray(parsed.tasks) &&
890
+ parsed.tasks.every((task) => task &&
891
+ typeof task === "object" &&
892
+ typeof task.id === "string" &&
893
+ typeof task.subject === "string" &&
894
+ typeof task.status === "string" &&
895
+ validStatuses.has(task.status))));
896
+ if (structured)
897
+ return structured;
898
+ for (const text of toolOutputTexts(content)) {
899
+ if (text.trim() === "No tasks found")
900
+ return { tasks: [] };
901
+ const tasks = [];
902
+ const lines = text.trim().split("\n");
903
+ for (const line of lines) {
904
+ const match = /^#(\S+) \[(pending|in_progress|completed)\] (.+?)(?: \(([^()]*)\))?(?: \[blocked by ((?:#[^,\]]+(?:, )?)+)\])?$/.exec(line);
905
+ if (!match) {
906
+ tasks.length = 0;
907
+ break;
908
+ }
909
+ tasks.push({
910
+ id: match[1],
911
+ subject: match[3],
912
+ status: match[2],
913
+ ...(match[4] ? { owner: match[4] } : {}),
914
+ blockedBy: match[5] ? match[5].split(", ").map((id) => id.slice(1)) : [],
915
+ });
916
+ }
917
+ if (tasks.length > 0)
918
+ return { tasks };
919
+ }
920
+ return undefined;
921
+ }
922
+ export function parseTaskUpdateOutput(content, expectedTaskId) {
923
+ const structured = parseJsonToolOutput(content, (parsed) => Boolean(parsed &&
924
+ typeof parsed === "object" &&
925
+ "success" in parsed &&
926
+ typeof parsed.success === "boolean" &&
927
+ "taskId" in parsed &&
928
+ typeof parsed.taskId === "string" &&
929
+ "updatedFields" in parsed &&
930
+ Array.isArray(parsed.updatedFields) &&
931
+ parsed.updatedFields.every((field) => typeof field === "string")));
932
+ if (structured)
933
+ return structured;
934
+ for (const text of toolOutputTexts(content)) {
935
+ const notFound = /^Task #(\S+) not found$/.exec(text.trim());
936
+ const taskId = notFound?.[1] ?? expectedTaskId;
937
+ if (taskId && (notFound || text.trim() === "Failed to delete task")) {
938
+ return { success: false, taskId, updatedFields: [], error: text.trim() };
939
+ }
940
+ }
941
+ return undefined;
942
+ }
844
943
  export function applyTaskCreate(state, input, output) {
845
944
  const taskId = output?.task?.id;
846
945
  if (!taskId || !input)
@@ -872,9 +971,22 @@ export function applyTaskUpdate(state, input) {
872
971
  description: input.description ?? existing?.description,
873
972
  });
874
973
  }
974
+ export function applyTaskList(state, output) {
975
+ const previous = new Map(state);
976
+ state.clear();
977
+ for (const task of output.tasks) {
978
+ const existing = previous.get(task.id);
979
+ state.set(task.id, {
980
+ subject: task.subject,
981
+ status: task.status,
982
+ activeForm: existing?.activeForm,
983
+ description: existing?.description,
984
+ });
985
+ }
986
+ }
875
987
  export function taskStateToPlanEntries(state) {
876
988
  return Array.from(state.values()).map((task) => ({
877
- content: task.subject,
989
+ content: task.status === "in_progress" && task.activeForm ? task.activeForm : task.subject,
878
990
  status: task.status,
879
991
  priority: "medium",
880
992
  }));
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.66.0",
6
+ "version": "0.67.0",
7
7
  "description": "An ACP-compatible coding agent powered by the Claude Agent SDK (TypeScript)",
8
8
  "main": "dist/lib.js",
9
9
  "types": "dist/lib.d.ts",
@@ -66,19 +66,19 @@
66
66
  },
67
67
  "dependencies": {
68
68
  "@agentclientprotocol/sdk": "1.3.0",
69
- "@anthropic-ai/claude-agent-sdk": "0.3.220",
69
+ "@anthropic-ai/claude-agent-sdk": "0.3.232",
70
70
  "zod": "^3.25.0 || ^4.0.0"
71
71
  },
72
72
  "devDependencies": {
73
- "@anthropic-ai/sdk": "0.115.0",
73
+ "@anthropic-ai/sdk": "0.117.1",
74
74
  "@eslint/js": "10.0.1",
75
75
  "@tsconfig/node22": "22.0.5",
76
- "@types/node": "26.1.2",
77
- "@typescript-eslint/eslint-plugin": "8.65.0",
78
- "@typescript-eslint/parser": "8.65.0",
79
- "eslint": "10.8.0",
76
+ "@types/node": "26.2.0",
77
+ "@typescript-eslint/eslint-plugin": "8.67.0",
78
+ "@typescript-eslint/parser": "8.67.0",
79
+ "eslint": "10.8.1",
80
80
  "eslint-config-prettier": "10.1.8",
81
- "globals": "17.9.0",
81
+ "globals": "17.11.0",
82
82
  "prettier": "3.9.6",
83
83
  "ts-node": "10.9.2",
84
84
  "typescript": "6.0.3",