@agentclientprotocol/claude-agent-acp 0.94.1-preview.1 → 0.94.1-preview.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -9
- package/dist/acp-agent.d.ts +39 -3
- package/dist/acp-agent.d.ts.map +1 -1
- package/dist/acp-agent.js +178 -66
- package/dist/acp-subagents.d.ts +2 -1
- package/dist/acp-subagents.d.ts.map +1 -1
- package/dist/air-extension.d.ts +5 -0
- package/dist/air-extension.d.ts.map +1 -1
- package/dist/air-extension.js +5 -0
- package/dist/async-tasks.d.ts +6 -3
- package/dist/async-tasks.d.ts.map +1 -1
- package/dist/async-tasks.js +13 -5
- package/dist/clear-context-coordinator.d.ts +1 -0
- package/dist/clear-context-coordinator.d.ts.map +1 -1
- package/dist/clear-context-coordinator.js +1 -0
- package/dist/index.js +2 -3
- package/dist/native-subagents.d.ts +64 -0
- package/dist/native-subagents.d.ts.map +1 -1
- package/dist/native-subagents.js +224 -9
- package/dist/permissions/options/shared.d.ts +3 -0
- package/dist/permissions/options/shared.d.ts.map +1 -1
- package/dist/permissions/options/tools.js +1 -1
- package/dist/serve.d.ts +19 -11
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +26 -18
- package/dist/session-index/activity.d.ts +4 -0
- package/dist/session-index/activity.d.ts.map +1 -1
- package/dist/session-index/activity.js +16 -0
- package/dist/session-index/background-tasks.d.ts +69 -0
- package/dist/session-index/background-tasks.d.ts.map +1 -0
- package/dist/session-index/background-tasks.js +173 -0
- package/dist/session-index/service.d.ts +2 -0
- package/dist/session-index/service.d.ts.map +1 -1
- package/dist/session-index/service.js +6 -1
- package/dist/session-index/session-index.d.ts +14 -0
- package/dist/session-index/session-index.d.ts.map +1 -1
- package/dist/session-index/session-index.js +25 -2
- package/dist/session-index/transcript-scan.d.ts +8 -1
- package/dist/session-index/transcript-scan.d.ts.map +1 -1
- package/dist/session-index/transcript-scan.js +22 -1
- package/dist/session-titles.d.ts +44 -16
- package/dist/session-titles.d.ts.map +1 -1
- package/dist/session-titles.js +89 -27
- package/dist/subagent-history.d.ts +7 -3
- package/dist/subagent-history.d.ts.map +1 -1
- package/dist/subagent-history.js +7 -3
- package/dist/subagent-replay.d.ts +21 -1
- package/dist/subagent-replay.d.ts.map +1 -1
- package/dist/subagent-replay.js +51 -3
- package/dist/task-notifications.d.ts +30 -0
- package/dist/task-notifications.d.ts.map +1 -0
- package/dist/task-notifications.js +62 -0
- package/dist/usage-markdown.d.ts.map +1 -1
- package/dist/usage-markdown.js +18 -0
- package/package.json +6 -6
package/dist/acp-agent.js
CHANGED
|
@@ -5,7 +5,7 @@ import { promptSuggestionsMeta, promptSuggestionText } from "./prompt-suggestion
|
|
|
5
5
|
import { sanitizeTitle, SessionTitles } from "./session-titles.js";
|
|
6
6
|
import { AIR_NATIVE_SUBAGENT_SESSIONS_CAPABILITY, asSdkSessionNotification, clientSupportsSubagents, subagentForm, } from "./acp-subagents.js";
|
|
7
7
|
import { isNativeSubagentControlTool, isNativeSubagentControlUpdate, NativeSubagentRuntime, nativeSubagentState, resumedNativeSubagentId, sendMessageResume, sendMessageResumePrompt, } from "./native-subagents.js";
|
|
8
|
-
import { AIR_ASYNC_TASKS_CAPABILITY, AIR_CUSTOM_INSTRUCTIONS_CAPABILITY, airCustomInstructions, AIR_DIFF_PATCH_CAPABILITY, AIR_PLAN_FILE_CAPABILITY, AIR_GOAL_KEY, AIR_KIND_KEY, AIR_LOAD_REPLAY_END_CAPABILITY, AIR_LOAD_REPLAY_END_KEY, AIR_RECOMMENDED_CONFIG_VALUE_CAPABILITY, AIR_SKILL_PATH_KEY, clientSupportsAirCapability, withAirMeta, } from "./air-extension.js";
|
|
8
|
+
import { AIR_ASYNC_TASKS_CAPABILITY, AIR_BACKGROUND_SUBAGENTS_CAPABILITY, AIR_CUSTOM_INSTRUCTIONS_CAPABILITY, airCustomInstructions, AIR_DIFF_PATCH_CAPABILITY, AIR_PLAN_FILE_CAPABILITY, AIR_GOAL_KEY, AIR_KIND_KEY, AIR_LOAD_REPLAY_END_CAPABILITY, AIR_LOAD_REPLAY_END_KEY, AIR_RECOMMENDED_CONFIG_VALUE_CAPABILITY, AIR_SKILL_PATH_KEY, clientSupportsAirCapability, withAirMeta, } from "./air-extension.js";
|
|
9
9
|
import * as sessionIndex from "./session-index/connection.js";
|
|
10
10
|
import { AsyncTaskRuntime, backgroundBashTaskFromToolResult, backgroundedBashToolCallIds, clientSupportsAsyncTasks, } from "./async-tasks.js";
|
|
11
11
|
import { AUTH_STATUS_PROBE_TIMEOUT_MS, AUTH_STATUS_UPDATE_METHOD, authStatusCapability, fromAccountInfo, fromCliStatus, gatewayAuthStatus, mergeAuthStatus, notLoggedInAuthStatus, sameAuthStatus, } from "./auth-status.js";
|
|
@@ -45,6 +45,7 @@ import { messageLoopYielder, nodeToWebReadable, nodeToWebWritable, Pushable, rac
|
|
|
45
45
|
import { acceptedPlanToolResult, approvedPlan, ExitPlanCoordinator, isExitPlanInterruptionResult, observeExitPlanToolResults, planModeUpdate, } from "./exit-plan.js";
|
|
46
46
|
import { DEFAULT_AGENT_ID } from "./session-config-ids.js";
|
|
47
47
|
import { parseToolResultMeta } from "./tool-result-meta.js";
|
|
48
|
+
import { markerTagText, TASK_NOTIFICATION_TAG, taskNotificationsOf, } from "./task-notifications.js";
|
|
48
49
|
import { formatUsageResponse, isUsageCommandText, parseUsageResponse } from "./usage-markdown.js";
|
|
49
50
|
export { DEFAULT_AGENT_ID } from "./session-config-ids.js";
|
|
50
51
|
import { MCP_AVAILABLE_COMMAND, parseMcpCommand, runMcpCommand } from "./mcp-command.js";
|
|
@@ -200,6 +201,16 @@ function parseRemoteControlCommand(prompt) {
|
|
|
200
201
|
return { action: "disconnect" };
|
|
201
202
|
return argument ? { action: "connect", name: argument } : { action: "connect" };
|
|
202
203
|
}
|
|
204
|
+
/** A top-level message a person typed in another client of the session, such
|
|
205
|
+
* as claude.ai or the Claude mobile app over Remote Control. Tool results and
|
|
206
|
+
* the CLI's own synthetic messages are user-role too, but carry no human
|
|
207
|
+
* origin. */
|
|
208
|
+
function isRemoteHumanMessage(message) {
|
|
209
|
+
return (message.type === "user" &&
|
|
210
|
+
message.origin?.kind === "human" &&
|
|
211
|
+
message.parent_tool_use_id === null &&
|
|
212
|
+
!message.isSynthetic);
|
|
213
|
+
}
|
|
203
214
|
/** Whether Claude Code offers a slash command of this name to an ACP client.
|
|
204
215
|
* This is the rule `getAvailableSlashCommands` applies when it lists the
|
|
205
216
|
* commands, so the adapter stands in for the command exactly when the client
|
|
@@ -332,7 +343,8 @@ const UNREPORTED_FOREGROUND = {
|
|
|
332
343
|
/** Whether this turn's terminal result arrived but its settlement is being
|
|
333
344
|
* held for background subagents it spawned (see Turn.deferredSettle). The
|
|
334
345
|
* single spelling of the hold predicate, shared by the consumer's settle
|
|
335
|
-
* lanes and cancel().
|
|
346
|
+
* lanes and cancel(). Always false for a client with `backgroundSubagents`,
|
|
347
|
+
* because no turn of that client is held. */
|
|
336
348
|
function isHeldOpen(turn) {
|
|
337
349
|
return turn != null && turn.deferredSettle !== undefined && !turn.settled;
|
|
338
350
|
}
|
|
@@ -739,7 +751,6 @@ const LOCAL_COMMAND_MARKERS = [
|
|
|
739
751
|
// model that a background task stopped; live, the SDK `task_notification`
|
|
740
752
|
// frame reports the same stop, so replay restores the task state from it (see
|
|
741
753
|
// taskNotificationsOf) instead of showing it.
|
|
742
|
-
const TASK_NOTIFICATION_TAG = "task-notification";
|
|
743
754
|
const INJECTED_CONTEXT_MARKERS = ["system-reminder", TASK_NOTIFICATION_TAG].map((tag) => ({
|
|
744
755
|
open: `<${tag}>`,
|
|
745
756
|
close: `</${tag}>`,
|
|
@@ -773,17 +784,6 @@ function stripMarkerTags(text) {
|
|
|
773
784
|
}
|
|
774
785
|
return result + text.slice(copiedUpTo);
|
|
775
786
|
}
|
|
776
|
-
function markerTagText(text, tag) {
|
|
777
|
-
const open = `<${tag}>`;
|
|
778
|
-
const close = `</${tag}>`;
|
|
779
|
-
const start = text.indexOf(open);
|
|
780
|
-
if (start === -1)
|
|
781
|
-
return undefined;
|
|
782
|
-
const end = text.indexOf(close, start + open.length);
|
|
783
|
-
if (end === -1)
|
|
784
|
-
return undefined;
|
|
785
|
-
return text.slice(start + open.length, end);
|
|
786
|
-
}
|
|
787
787
|
function hasMarkerTag(text, tag) {
|
|
788
788
|
return markerTagText(text, tag) !== undefined;
|
|
789
789
|
}
|
|
@@ -842,44 +842,6 @@ export function stripLocalCommandMetadata(content) {
|
|
|
842
842
|
export function isLocalCommandMetadata(content) {
|
|
843
843
|
return stripLocalCommandMetadata(content) === null;
|
|
844
844
|
}
|
|
845
|
-
/**
|
|
846
|
-
* Returns each `<task-notification>` in user-message content (a string or its
|
|
847
|
-
* text blocks). The `<result>` body is model context that the live frame does
|
|
848
|
-
* not carry, so the scan stops at it and a tag quoted in it cannot match.
|
|
849
|
-
*/
|
|
850
|
-
function taskNotificationsOf(content) {
|
|
851
|
-
const texts = typeof content === "string"
|
|
852
|
-
? [content]
|
|
853
|
-
: Array.isArray(content)
|
|
854
|
-
? content.flatMap((block) => block?.type === "text" && typeof block.text === "string" ? [block.text] : [])
|
|
855
|
-
: [];
|
|
856
|
-
const open = `<${TASK_NOTIFICATION_TAG}>`;
|
|
857
|
-
const close = `</${TASK_NOTIFICATION_TAG}>`;
|
|
858
|
-
const notifications = [];
|
|
859
|
-
for (const text of texts) {
|
|
860
|
-
let start = text.indexOf(open);
|
|
861
|
-
while (start !== -1) {
|
|
862
|
-
const end = text.indexOf(close, start + open.length);
|
|
863
|
-
if (end === -1)
|
|
864
|
-
break;
|
|
865
|
-
const body = text.slice(start + open.length, end).split("<result>", 1)[0];
|
|
866
|
-
const field = (tag) => markerTagText(body, tag)?.trim() || undefined;
|
|
867
|
-
const taskId = field("task-id");
|
|
868
|
-
const status = field("status");
|
|
869
|
-
if (taskId && status) {
|
|
870
|
-
notifications.push({
|
|
871
|
-
task_id: taskId,
|
|
872
|
-
status,
|
|
873
|
-
tool_use_id: field("tool-use-id"),
|
|
874
|
-
summary: field("summary"),
|
|
875
|
-
output_file: field("output-file"),
|
|
876
|
-
});
|
|
877
|
-
}
|
|
878
|
-
start = text.indexOf(open, end + close.length);
|
|
879
|
-
}
|
|
880
|
-
}
|
|
881
|
-
return notifications;
|
|
882
|
-
}
|
|
883
845
|
/**
|
|
884
846
|
* True for a user record that the CLI wrote to tell the model that a
|
|
885
847
|
* background task stopped. A `subkind` marks the delivery of a prompt, for
|
|
@@ -1232,6 +1194,16 @@ export class ClaudeAcpAgent {
|
|
|
1232
1194
|
interruptSession: (sessionId) => this.cancelTurns({ sessionId }, { awaitInterrupt: false }),
|
|
1233
1195
|
teardownSession: (sessionId) => this.teardownSession(sessionId),
|
|
1234
1196
|
});
|
|
1197
|
+
/**
|
|
1198
|
+
* Whether a turn ends at its result while background subagents that it
|
|
1199
|
+
* spawned or resumed still run. Only an ACP v1 AIR client that declares
|
|
1200
|
+
* `backgroundSubagents` gets this. Every other client keeps the hold of
|
|
1201
|
+
* `Turn.deferredSettle`.
|
|
1202
|
+
*/
|
|
1203
|
+
endsTurnsWithLiveSubagents() {
|
|
1204
|
+
return (!this.v2 &&
|
|
1205
|
+
clientSupportsAirCapability(this.clientCapabilities, AIR_BACKGROUND_SUBAGENTS_CAPABILITY));
|
|
1206
|
+
}
|
|
1235
1207
|
constructor(client, logger, options = {}) {
|
|
1236
1208
|
this.v2 = options.v2 ?? false;
|
|
1237
1209
|
this.foregroundEvents = options.foreground;
|
|
@@ -1456,7 +1428,9 @@ export class ClaudeAcpAgent {
|
|
|
1456
1428
|
// `jetbrains.air`.
|
|
1457
1429
|
_meta: {
|
|
1458
1430
|
...(this.toolCallCapabilities.air.client
|
|
1459
|
-
? withAirMeta(airSessionFailureCapabilityMeta(AGENT_FILE_CHANGE_REPORT_CAPABILITY, AIR_NATIVE_SUBAGENT_SESSIONS_CAPABILITY, AIR_ASYNC_TASKS_CAPABILITY, AIR_CUSTOM_INSTRUCTIONS_CAPABILITY, AIR_RECOMMENDED_CONFIG_VALUE_CAPABILITY, AIR_DIFF_PATCH_CAPABILITY, AIR_PLAN_FILE_CAPABILITY,
|
|
1431
|
+
? withAirMeta(airSessionFailureCapabilityMeta(AGENT_FILE_CHANGE_REPORT_CAPABILITY, AIR_NATIVE_SUBAGENT_SESSIONS_CAPABILITY, AIR_ASYNC_TASKS_CAPABILITY, AIR_CUSTOM_INSTRUCTIONS_CAPABILITY, AIR_RECOMMENDED_CONFIG_VALUE_CAPABILITY, AIR_DIFF_PATCH_CAPABILITY, AIR_PLAN_FILE_CAPABILITY,
|
|
1432
|
+
// ACP v2 keeps the hold (see `src/v2/prompt.ts`).
|
|
1433
|
+
...(this.v2 ? [] : [AIR_BACKGROUND_SUBAGENTS_CAPABILITY]), ...this.sessionIndex.capabilities()), AIR_GOAL_KEY, {
|
|
1460
1434
|
version: GOAL_EXTENSION_VERSION,
|
|
1461
1435
|
controlMethod: GOAL_CONTROL_METHOD,
|
|
1462
1436
|
actions: [...GOAL_ACTIONS],
|
|
@@ -2175,6 +2149,11 @@ export class ClaudeAcpAgent {
|
|
|
2175
2149
|
if (session.remoteControlCommand) {
|
|
2176
2150
|
throw RequestError.invalidRequest(undefined, "Remote Control is already being changed. Try again in a moment.");
|
|
2177
2151
|
}
|
|
2152
|
+
// Once Remote Control is on, other clients can start turns or send
|
|
2153
|
+
// messages on their own. Something has to read the query stream for
|
|
2154
|
+
// those to reach this client, and a command that answers without a turn
|
|
2155
|
+
// would otherwise leave the stream unread until the next prompt.
|
|
2156
|
+
this.ensureConsumer(session, params.sessionId);
|
|
2178
2157
|
// Answered by the adapter without a model turn; v2 clients treat an
|
|
2179
2158
|
// `ended` without a prior `inserted` as a refused prompt.
|
|
2180
2159
|
events.inserted(randomUUID());
|
|
@@ -2271,8 +2250,10 @@ export class ClaudeAcpAgent {
|
|
|
2271
2250
|
};
|
|
2272
2251
|
session.turnQueue ??= [];
|
|
2273
2252
|
session.turnQueue.push(turn);
|
|
2253
|
+
(session.sentUserUuids ??= new Set()).add(promptUuid);
|
|
2274
2254
|
session.input.push(userMessage);
|
|
2275
2255
|
this.ensureConsumer(session, params.sessionId);
|
|
2256
|
+
session.titles.onPromptQueued(session, params.prompt);
|
|
2276
2257
|
// The prompt is queued, so its turn goes ahead even if the client misses
|
|
2277
2258
|
// the goal it sets; the turn's events report the outcome.
|
|
2278
2259
|
await this.publishGoalFromPrompt(params.sessionId, firstText, promptUuid).catch((error) => this.logger.error(`Session ${params.sessionId}: failed to publish the prompt's goal:`, error));
|
|
@@ -2660,6 +2641,7 @@ export class ClaudeAcpAgent {
|
|
|
2660
2641
|
// The held turn's work had ended at its result; the steer resumes it.
|
|
2661
2642
|
this.startForeground(sessionId, turnInFlight);
|
|
2662
2643
|
}
|
|
2644
|
+
(session.sentUserUuids ??= new Set()).add(steeredUuid);
|
|
2663
2645
|
session.input.push(userMessage);
|
|
2664
2646
|
const firstText = params.prompt[0]?.type === "text" ? params.prompt[0].text : "";
|
|
2665
2647
|
await this.publishGoalFromPrompt(sessionId, firstText, steeredUuid);
|
|
@@ -2776,10 +2758,29 @@ export class ClaudeAcpAgent {
|
|
|
2776
2758
|
// Tool-use blocks start streaming before their JSON input. Keep the
|
|
2777
2759
|
// partial input per parent message and block index so completed top-level
|
|
2778
2760
|
// fields can refine the pending tool call while it streams. Entries are
|
|
2779
|
-
// dropped at block/message boundaries; the
|
|
2761
|
+
// dropped at block/message boundaries; the map is swept when a turn
|
|
2780
2762
|
// settles, since an interrupted subagent stream (keyed by a
|
|
2781
2763
|
// parent_tool_use_id that never recurs) has no boundary event of its own.
|
|
2782
2764
|
const streamedToolInputs = new Map();
|
|
2765
|
+
/** Sweeps `streamedToolInputs` when a turn ends. A turn of a client with
|
|
2766
|
+
* `backgroundSubagents` can end while its subagents still stream tool
|
|
2767
|
+
* input, so the sweep keeps the lanes of live subagents, unless the turn
|
|
2768
|
+
* ends cancelled. Their own message boundaries drop them later. */
|
|
2769
|
+
const sweepStreamedToolInputs = (turnStopReason) => {
|
|
2770
|
+
if (turnStopReason === "cancelled" || !this.endsTurnsWithLiveSubagents()) {
|
|
2771
|
+
streamedToolInputs.clear();
|
|
2772
|
+
return;
|
|
2773
|
+
}
|
|
2774
|
+
const liveLanes = new Set();
|
|
2775
|
+
for (const task of session.liveBackgroundTasks.values()) {
|
|
2776
|
+
if (task.isSubagent && task.parentToolUseId)
|
|
2777
|
+
liveLanes.add(task.parentToolUseId);
|
|
2778
|
+
}
|
|
2779
|
+
for (const lane of streamedToolInputs.keys()) {
|
|
2780
|
+
if (!liveLanes.has(lane))
|
|
2781
|
+
streamedToolInputs.delete(lane);
|
|
2782
|
+
}
|
|
2783
|
+
};
|
|
2783
2784
|
// Stop reason accumulated for the active turn (result subtype, refusal,
|
|
2784
2785
|
// max_tokens, …). Reset per turn; read when the turn settles at idle.
|
|
2785
2786
|
let stopReason = "end_turn";
|
|
@@ -3271,9 +3272,10 @@ export class ClaudeAcpAgent {
|
|
|
3271
3272
|
};
|
|
3272
3273
|
/** Registers a live background task (see `liveBackgroundTasks`). A
|
|
3273
3274
|
* subagent is also recorded on the active turn, so that turn holds until
|
|
3274
|
-
* the subagent settles (see `Turn.spawnedTaskIds`).
|
|
3275
|
-
*
|
|
3276
|
-
*
|
|
3275
|
+
* the subagent settles (see `Turn.spawnedTaskIds`). A client with
|
|
3276
|
+
* `backgroundSubagents` gets no hold (see `turnAwaitingSubagents`).
|
|
3277
|
+
* Its requests may already be open, and where it runs decides
|
|
3278
|
+
* whether they block the foreground work, so that is checked again. */
|
|
3277
3279
|
const registerLiveTask = (taskId, parentToolUseId, isSubagent, placement = {}) => {
|
|
3278
3280
|
session.liveBackgroundTasks.set(taskId, {
|
|
3279
3281
|
parentToolUseId,
|
|
@@ -3321,8 +3323,9 @@ export class ClaudeAcpAgent {
|
|
|
3321
3323
|
};
|
|
3322
3324
|
/** Registers a settled subagent again when the SDK resumes it without a
|
|
3323
3325
|
* new `task_started`. The active turn is the one that resumed it, so it
|
|
3324
|
-
* holds until the subagent settles again
|
|
3325
|
-
*
|
|
3326
|
+
* holds until the subagent settles again, unless the client declared
|
|
3327
|
+
* `backgroundSubagents`. A repeated resume signal finds the subagent live
|
|
3328
|
+
* and changes nothing. */
|
|
3326
3329
|
const resumeLiveTask = (taskId) => {
|
|
3327
3330
|
if (session.liveBackgroundTasks.has(taskId))
|
|
3328
3331
|
return;
|
|
@@ -3334,9 +3337,12 @@ export class ClaudeAcpAgent {
|
|
|
3334
3337
|
/** Whether any background subagent this turn spawned is still live —
|
|
3335
3338
|
* while true, the turn's settlement stays deferred so the subagent's
|
|
3336
3339
|
* output and permission requests land inside it (see
|
|
3337
|
-
* Turn.deferredSettle).
|
|
3340
|
+
* Turn.deferredSettle). Always false for a client that declared
|
|
3341
|
+
* `backgroundSubagents`: its turns end at their result, and the subagent
|
|
3342
|
+
* traffic goes out after the prompt response. This is the single gate of
|
|
3343
|
+
* the hold, so no turn of such a client is ever held open. */
|
|
3338
3344
|
const turnAwaitingSubagents = (turn) => {
|
|
3339
|
-
if (!turn.spawnedTaskIds?.size) {
|
|
3345
|
+
if (this.endsTurnsWithLiveSubagents() || !turn.spawnedTaskIds?.size) {
|
|
3340
3346
|
return false;
|
|
3341
3347
|
}
|
|
3342
3348
|
for (const taskId of turn.spawnedTaskIds) {
|
|
@@ -3367,7 +3373,8 @@ export class ClaudeAcpAgent {
|
|
|
3367
3373
|
* turn open (see Turn.deferredSettle). Every result-time settle of a
|
|
3368
3374
|
* turn that can have spawned subagents must route through here: a site
|
|
3369
3375
|
* calling settleActive directly bypasses the hold and re-opens the
|
|
3370
|
-
* out-of-turn permission deadlock (issue #866) through its lane.
|
|
3376
|
+
* out-of-turn permission deadlock (issue #866) through its lane. For a
|
|
3377
|
+
* client with `backgroundSubagents` this always settles now. */
|
|
3371
3378
|
const settleOrDefer = async (outcome) => {
|
|
3372
3379
|
// No result ends a steered turn: the steer aborted the cycle this result
|
|
3373
3380
|
// may belong to, and the steered one is still to come. Record the outcome
|
|
@@ -3646,7 +3653,7 @@ export class ClaudeAcpAgent {
|
|
|
3646
3653
|
disarmForceCancel(session);
|
|
3647
3654
|
session.turnQueue = (session.turnQueue ?? []).filter((t) => t !== turn);
|
|
3648
3655
|
session.activeTurn = null;
|
|
3649
|
-
|
|
3656
|
+
sweepStreamedToolInputs(result.stopReason);
|
|
3650
3657
|
if (wasHeld) {
|
|
3651
3658
|
// Settling a held turn is its delivery-stretch boundary: the turn's
|
|
3652
3659
|
// answer finished long ago, so text streamed since the last boundary
|
|
@@ -3677,7 +3684,7 @@ export class ClaudeAcpAgent {
|
|
|
3677
3684
|
turn.settled = true;
|
|
3678
3685
|
session.turnQueue = (session.turnQueue ?? []).filter((t) => t !== turn);
|
|
3679
3686
|
session.activeTurn = null;
|
|
3680
|
-
|
|
3687
|
+
sweepStreamedToolInputs();
|
|
3681
3688
|
// A failed turn's stretch is over, and some failure lanes (the issue
|
|
3682
3689
|
// #825 idle-fail) never see the result whose `finally` would close it —
|
|
3683
3690
|
// start the next stretch clean, or its stale delivery record would
|
|
@@ -3954,6 +3961,18 @@ export class ClaudeAcpAgent {
|
|
|
3954
3961
|
const frame = message;
|
|
3955
3962
|
switch (frame.state) {
|
|
3956
3963
|
case "started": {
|
|
3964
|
+
// CLIs 2.1.307+ (capability lifecycle_wakeup_source_v1) mark a
|
|
3965
|
+
// command that a scheduler fire started. With no prompt of ours
|
|
3966
|
+
// open, it starts an autonomous turn: name the fire as its cause,
|
|
3967
|
+
// whether `session_state_changed` already opened the task or not.
|
|
3968
|
+
const cause = scheduledFireCause(frame);
|
|
3969
|
+
if (cause &&
|
|
3970
|
+
asyncTasks.enabled &&
|
|
3971
|
+
!session.cancelled &&
|
|
3972
|
+
!session.activeTurn &&
|
|
3973
|
+
!firstUnsettledQueuedTurn()) {
|
|
3974
|
+
await asyncTasks.autonomousTurnStarted(cause);
|
|
3975
|
+
}
|
|
3957
3976
|
// Remember dispatch on the live turn so a cancel() that orphans
|
|
3958
3977
|
// it seeds the right state (see Turn.commandStarted)...
|
|
3959
3978
|
const queued = findUnsettledTurn(frame.command_uuid);
|
|
@@ -5153,6 +5172,33 @@ export class ClaudeAcpAgent {
|
|
|
5153
5172
|
await settleOrDefer({ ...heldTurn.deferredSettle, stopReason: "cancelled" });
|
|
5154
5173
|
break;
|
|
5155
5174
|
}
|
|
5175
|
+
// The same followup with no held turn: the client declared
|
|
5176
|
+
// `backgroundSubagents`, or the hold already ended. A user
|
|
5177
|
+
// turn that took the cycle over owns the request (see
|
|
5178
|
+
// `requestOwnerTurn`), so it continues the accepted plan in a
|
|
5179
|
+
// fresh context, as the user lane does. With no such turn
|
|
5180
|
+
// the user answered out of a turn, and the interrupt only
|
|
5181
|
+
// stops this autonomous cycle. Drop the markers, so that a
|
|
5182
|
+
// later user-turn result is not read as this interruption.
|
|
5183
|
+
// `canUseTool` offers no clear-context option to a request
|
|
5184
|
+
// without an owner turn, so a reset here is only a race with
|
|
5185
|
+
// the end of a turn.
|
|
5186
|
+
if (pendingExitPlanModeInterruption &&
|
|
5187
|
+
isExitPlanInterruptionResult(message, pendingExitPlanModeInterruption)) {
|
|
5188
|
+
session.pendingExitPlanModeInterruption = undefined;
|
|
5189
|
+
const ownerTurn = this.requestOwnerTurn(params.sessionId, session);
|
|
5190
|
+
if (pendingExitPlanContextReset?.toolUseId ===
|
|
5191
|
+
pendingExitPlanModeInterruption.toolUseId &&
|
|
5192
|
+
ownerTurn !== undefined &&
|
|
5193
|
+
ownerTurn === session.activeTurn) {
|
|
5194
|
+
await this.exitPlan.restart(params.sessionId, session, pendingExitPlanContextReset);
|
|
5195
|
+
return;
|
|
5196
|
+
}
|
|
5197
|
+
if (pendingExitPlanContextReset) {
|
|
5198
|
+
session.pendingExitPlanContextReset = undefined;
|
|
5199
|
+
this.logger.error(`Session ${params.sessionId}: no turn to continue the accepted plan in a fresh context`);
|
|
5200
|
+
}
|
|
5201
|
+
}
|
|
5156
5202
|
// CLI 2.1.274+ answers background-task completions that were
|
|
5157
5203
|
// already queued with ONE model call: every queued
|
|
5158
5204
|
// notification still gets its own result, but all except the
|
|
@@ -5406,7 +5452,9 @@ export class ClaudeAcpAgent {
|
|
|
5406
5452
|
// permission requests, and the model's promised summary all land
|
|
5407
5453
|
// inside the turn. `session/cancel` and the next prompt's echo
|
|
5408
5454
|
// hand-off still settle a deferred turn early, so a long-running
|
|
5409
|
-
// subagent never holds the prompt hostage.
|
|
5455
|
+
// subagent never holds the prompt hostage. A client with
|
|
5456
|
+
// `backgroundSubagents` gets no hold: the turn settles here, and
|
|
5457
|
+
// the subagent traffic goes out after the prompt response.
|
|
5410
5458
|
//
|
|
5411
5459
|
// is_error/auth already settled via failActive (activeTurn is null
|
|
5412
5460
|
// then, so both branches no-op); a cancelled turn settles at
|
|
@@ -5655,6 +5703,9 @@ export class ClaudeAcpAgent {
|
|
|
5655
5703
|
if (session.pendingGoalUpdate?.commandUuid === message.uuid) {
|
|
5656
5704
|
session.pendingGoalUpdate.started = true;
|
|
5657
5705
|
}
|
|
5706
|
+
// Taken out for every echo, not only in the branch below, so the
|
|
5707
|
+
// set does not grow with each prompt.
|
|
5708
|
+
const sentByAdapter = session.sentUserUuids?.delete(message.uuid) ?? false;
|
|
5658
5709
|
const queued = findUnsettledTurn(message.uuid);
|
|
5659
5710
|
if (queued) {
|
|
5660
5711
|
// Only (re)activate if this isn't already the active turn — a
|
|
@@ -5740,7 +5791,25 @@ export class ClaudeAcpAgent {
|
|
|
5740
5791
|
session.activeTurn.steeredEchoes.delete(message.uuid)) {
|
|
5741
5792
|
session.activeTurn.steeredAwaitingResult = true;
|
|
5742
5793
|
}
|
|
5743
|
-
//
|
|
5794
|
+
// A message typed in another client of the session (Remote
|
|
5795
|
+
// Control from claude.ai or the mobile app). The adapter's own
|
|
5796
|
+
// prompts and steers are stamped human too, so they are told
|
|
5797
|
+
// apart by uuid: a steer matches no turn, and a turn can settle
|
|
5798
|
+
// before its echo comes.
|
|
5799
|
+
const remoteContent = !sentByAdapter && isRemoteHumanMessage(message)
|
|
5800
|
+
? stripLocalCommandMetadata(message.message.content)
|
|
5801
|
+
: null;
|
|
5802
|
+
if (remoteContent !== null) {
|
|
5803
|
+
for (const notification of toAcpNotifications(remoteContent, "user", params.sessionId, session.toolUseCache, routedNotificationClient, this.logger, {
|
|
5804
|
+
clientCapabilities: this.clientCapabilities,
|
|
5805
|
+
toolCallCapabilities: this.toolCallCapabilities,
|
|
5806
|
+
cwd: session.cwd,
|
|
5807
|
+
messageId: messageIdForGrouping(message),
|
|
5808
|
+
})) {
|
|
5809
|
+
await sendUpdate(notification);
|
|
5810
|
+
}
|
|
5811
|
+
}
|
|
5812
|
+
// Otherwise an unrelated replay (e.g. the echo of an already-settled turn).
|
|
5744
5813
|
break;
|
|
5745
5814
|
}
|
|
5746
5815
|
}
|
|
@@ -7119,6 +7188,8 @@ export class ClaudeAcpAgent {
|
|
|
7119
7188
|
isNativeSubagentControlTool(toolName)) {
|
|
7120
7189
|
continue;
|
|
7121
7190
|
}
|
|
7191
|
+
if (rfdReplay && (await rfdReplay.toolCallUpdate(notification.update, child)))
|
|
7192
|
+
continue;
|
|
7122
7193
|
await this.client.sessionUpdate({ ...notification, sessionId: replayTargetSessionId });
|
|
7123
7194
|
}
|
|
7124
7195
|
// The history of each subagent is in its own transcript. The replay
|
|
@@ -7410,6 +7481,21 @@ export class ClaudeAcpAgent {
|
|
|
7410
7481
|
runsAutonomousCycle(sessionId) {
|
|
7411
7482
|
return this.foregroundWork.get(sessionId)?.owner === AUTONOMOUS_CYCLE;
|
|
7412
7483
|
}
|
|
7484
|
+
/** The ACP turn that owns a root request of the session now, if any. A
|
|
7485
|
+
* model cycle that Claude Code started on its own owns no turn. A turn that
|
|
7486
|
+
* took a cycle over owns it. A queued turn owns the request too, because
|
|
7487
|
+
* Claude Code can ask for a queued prompt before the consumer reaches its
|
|
7488
|
+
* echo (see `recordForegroundToolCall`). The ExitPlanMode request and the
|
|
7489
|
+
* result of its interruption use this one rule, so an offered
|
|
7490
|
+
* clear-context option always has a turn to continue. */
|
|
7491
|
+
requestOwnerTurn(sessionId, session) {
|
|
7492
|
+
if (this.runsAutonomousCycle(sessionId))
|
|
7493
|
+
return undefined;
|
|
7494
|
+
const active = session.activeTurn;
|
|
7495
|
+
if (active && !active.settled)
|
|
7496
|
+
return active;
|
|
7497
|
+
return session.turnQueue?.find((queued) => !queued.settled);
|
|
7498
|
+
}
|
|
7413
7499
|
/** Forward a permission request to the client, wiring the tool call's
|
|
7414
7500
|
* `signal` through as a `cancellationSignal`. When the turn is cancelled
|
|
7415
7501
|
* while the client's prompt is still open the signal aborts, the SDK sends
|
|
@@ -7694,6 +7780,11 @@ export class ClaudeAcpAgent {
|
|
|
7694
7780
|
defaultToNo,
|
|
7695
7781
|
availableModes: this.sessionModes.availableModeIds(session.modes),
|
|
7696
7782
|
prePlanMode: session.prePlanMode,
|
|
7783
|
+
// A fresh context continues the ACP turn that owns the request. With
|
|
7784
|
+
// `backgroundSubagents` a followup cycle can ask out of a turn, and
|
|
7785
|
+
// then there is no turn to continue.
|
|
7786
|
+
allowContextReset: !this.endsTurnsWithLiveSubagents() ||
|
|
7787
|
+
this.requestOwnerTurn(sessionId, session) !== undefined,
|
|
7697
7788
|
contextUsedPercent: session.contextUsedTokens === undefined || session.contextWindowSize <= 0
|
|
7698
7789
|
? undefined
|
|
7699
7790
|
: Math.max(0, Math.min(100, Math.round((session.contextUsedTokens / session.contextWindowSize) * 100))),
|
|
@@ -10683,3 +10774,24 @@ function getMatchingModelUsage(modelUsage, currentModel) {
|
|
|
10683
10774
|
return { key: bestKey, usage: modelUsage[bestKey] };
|
|
10684
10775
|
}
|
|
10685
10776
|
}
|
|
10777
|
+
/**
|
|
10778
|
+
* What a `command_lifecycle` "started" frame says started the command: a
|
|
10779
|
+
* ScheduleWakeup (dynamic `/loop`) wakeup, with the time it was set for in
|
|
10780
|
+
* epoch milliseconds, or another scheduled task such as a cron job. Undefined
|
|
10781
|
+
* for any other command, and for a value this adapter does not know. The time
|
|
10782
|
+
* is given in UTC because the agent does not know the client's time zone.
|
|
10783
|
+
*/
|
|
10784
|
+
function scheduledFireCause(frame) {
|
|
10785
|
+
switch (frame.wakeup_source) {
|
|
10786
|
+
case "loop_wakeup": {
|
|
10787
|
+
const scheduledFor = typeof frame.scheduled_for === "number" ? new Date(frame.scheduled_for) : undefined;
|
|
10788
|
+
return scheduledFor && !Number.isNaN(scheduledFor.getTime())
|
|
10789
|
+
? `A scheduled wakeup fired (set for ${scheduledFor.toISOString()}).`
|
|
10790
|
+
: "A scheduled wakeup fired.";
|
|
10791
|
+
}
|
|
10792
|
+
case "schedule_wakeup":
|
|
10793
|
+
return "A scheduled task fired.";
|
|
10794
|
+
default:
|
|
10795
|
+
return undefined;
|
|
10796
|
+
}
|
|
10797
|
+
}
|
package/dist/acp-subagents.d.ts
CHANGED
|
@@ -6,7 +6,8 @@ export { AIR_NATIVE_SUBAGENT_SESSIONS_CAPABILITY } from "./air-extension.js";
|
|
|
6
6
|
* - `rfd`: the subagents RFD (agentclientprotocol/agent-client-protocol#1992,
|
|
7
7
|
* as revised): `subagent_update` and `session_message`, which the SDK types.
|
|
8
8
|
* A client that declares `clientCapabilities.subagents` and is not AIR gets
|
|
9
|
-
* it. (ACP v2
|
|
9
|
+
* it. (An ACP v2 client gets it without declaring anything, since subagents
|
|
10
|
+
* are part of v2's baseline.)
|
|
10
11
|
* - `air`: the earlier draft of that RFD, which AIR implements:
|
|
11
12
|
* `subagent_spawned` and `subagent_state_update`, typed below. AIR gets it,
|
|
12
13
|
* whichever capability it declares (`docs/air-extensions.md`).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acp-subagents.d.ts","sourceRoot":"","sources":["../src/acp-subagents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,mCAAmC,CAAC;AAO3C,OAAO,EAAE,uCAAuC,EAAE,MAAM,oBAAoB,CAAC;AAE7E
|
|
1
|
+
{"version":3,"file":"acp-subagents.d.ts","sourceRoot":"","sources":["../src/acp-subagents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,mCAAmC,CAAC;AAO3C,OAAO,EAAE,uCAAuC,EAAE,MAAM,oBAAoB,CAAC;AAE7E;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,KAAK,CAAC;AAEzC,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,YAAY,CAAC,EAAE,kBAAkB,GAAG,IAAI,GAAG,YAAY,GAAG,SAAS,CAG/F;AAED;;;GAGG;AACH,MAAM,MAAM,2BAA2B,GAAG;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,aAAa,EAAE,kBAAkB,CAAC;IAClC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,2BAA2B,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,cAAc,CAAC;AAElF,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,uBAAuB,CAAC;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEvF,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,EAAE,oBAAoB,CAAC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,aAAa,EAAE,qBAAqB,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE,4DAA4D;IAC5D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,yBAAyB,CAAC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB,mBAAmB,CAAC,QAAQ,CAAC,GAC7B,qBAAqB,GACrB,mBAAmB,GACnB,sBAAsB,GACtB,uBAAuB,GACvB,oBAAoB,CAAC;AAEzB,MAAM,MAAM,sBAAsB,GAAG,IAAI,CAAC,mBAAmB,EAAE,QAAQ,CAAC,GAAG;IACzE,MAAM,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG,mBAAmB,GAAG;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CACnC,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,YAAY,CAAC,EAAE,kBAAkB,GAAG,IAAI,GAAG,OAAO,CASzF;AAED,yEAAyE;AACzE,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,sBAAsB,GACnC,mBAAmB,CAErB"}
|
package/dist/air-extension.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
export declare const AIR_NATIVE_SUBAGENT_SESSIONS_CAPABILITY = "nativeSubagentSessions";
|
|
2
2
|
export declare const AIR_ASYNC_TASKS_CAPABILITY = "asyncTasks";
|
|
3
|
+
/**
|
|
4
|
+
* A prompt turn ends at its result also while its background subagents run.
|
|
5
|
+
* The subagent updates and requests then go out after the prompt response.
|
|
6
|
+
*/
|
|
7
|
+
export declare const AIR_BACKGROUND_SUBAGENTS_CAPABILITY = "backgroundSubagents";
|
|
3
8
|
export declare const AIR_SESSION_FAILURE_CAPABILITY = "sessionFailure";
|
|
4
9
|
export declare const AIR_RECOMMENDED_CONFIG_VALUE_CAPABILITY = "recommendedValue";
|
|
5
10
|
export declare const AIR_CUSTOM_INSTRUCTIONS_CAPABILITY = "customInstructions";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"air-extension.d.ts","sourceRoot":"","sources":["../src/air-extension.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uCAAuC,2BAA2B,CAAC;AAChF,eAAO,MAAM,0BAA0B,eAAe,CAAC;AACvD,eAAO,MAAM,8BAA8B,mBAAmB,CAAC;AAC/D,eAAO,MAAM,uCAAuC,qBAAqB,CAAC;AAC1E,eAAO,MAAM,kCAAkC,uBAAuB,CAAC;AACvE,eAAO,MAAM,yBAAyB,cAAc,CAAC;AACrD,4EAA4E;AAC5E,eAAO,MAAM,kCAAkC,sBAAsB,CAAC;AACtE;;;GAGG;AACH,eAAO,MAAM,wBAAwB,aAAa,CAAC;AACnD;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,iBAAiB,CAAC;AAC3D;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,mBAAmB,CAAC;AAC/D;;;GAGG;AACH,eAAO,MAAM,6BAA6B,kBAAkB,CAAC;AAC7D;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,yBAAyB,CAAC;AAC5E;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,qBAAqB,CAAC;AACnE;;;;;;GAMG;AACH,eAAO,MAAM,8BAA8B,kBAAkB,CAAC;AAE9D,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AACpD,eAAO,MAAM,gBAAgB,aAAa,CAAC;AAC3C,eAAO,MAAM,aAAa,UAAU,CAAC;AACrC,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,0BAA0B,sBAAsB,CAAC;AAC9D,eAAO,MAAM,YAAY,SAAS,CAAC;AACnC,eAAO,MAAM,YAAY,SAAS,CAAC;AACnC,6FAA6F;AAC7F,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAC9C,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AACpD,oFAAoF;AACpF,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AACvD;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAQ3E,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,GAAG,YAAY,EAAE,MAAM,EAAE,2BAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EAChD,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAE1D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,OAAO,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAErC;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAKnF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAY9F;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIvE"}
|
|
1
|
+
{"version":3,"file":"air-extension.d.ts","sourceRoot":"","sources":["../src/air-extension.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uCAAuC,2BAA2B,CAAC;AAChF,eAAO,MAAM,0BAA0B,eAAe,CAAC;AACvD;;;GAGG;AACH,eAAO,MAAM,mCAAmC,wBAAwB,CAAC;AACzE,eAAO,MAAM,8BAA8B,mBAAmB,CAAC;AAC/D,eAAO,MAAM,uCAAuC,qBAAqB,CAAC;AAC1E,eAAO,MAAM,kCAAkC,uBAAuB,CAAC;AACvE,eAAO,MAAM,yBAAyB,cAAc,CAAC;AACrD,4EAA4E;AAC5E,eAAO,MAAM,kCAAkC,sBAAsB,CAAC;AACtE;;;GAGG;AACH,eAAO,MAAM,wBAAwB,aAAa,CAAC;AACnD;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,iBAAiB,CAAC;AAC3D;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,mBAAmB,CAAC;AAC/D;;;GAGG;AACH,eAAO,MAAM,6BAA6B,kBAAkB,CAAC;AAC7D;;;;GAIG;AACH,eAAO,MAAM,qCAAqC,yBAAyB,CAAC;AAC5E;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,qBAAqB,CAAC;AACnE;;;;;;GAMG;AACH,eAAO,MAAM,8BAA8B,kBAAkB,CAAC;AAE9D,8EAA8E;AAC9E,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AACpD,eAAO,MAAM,gBAAgB,aAAa,CAAC;AAC3C,eAAO,MAAM,aAAa,UAAU,CAAC;AACrC,eAAO,MAAM,WAAW,QAAQ,CAAC;AACjC,eAAO,MAAM,0BAA0B,sBAAsB,CAAC;AAC9D,eAAO,MAAM,YAAY,SAAS,CAAC;AACnC,eAAO,MAAM,YAAY,SAAS,CAAC;AACnC,6FAA6F;AAC7F,eAAO,MAAM,kBAAkB,cAAc,CAAC;AAC9C,eAAO,MAAM,kBAAkB,eAAe,CAAC;AAC/C,eAAO,MAAM,qBAAqB,iBAAiB,CAAC;AACpD,oFAAoF;AACpF,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AACvD;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,iCAAiC,CAAC;AAQ3E,2EAA2E;AAC3E,wBAAgB,iBAAiB,CAAC,GAAG,YAAY,EAAE,MAAM,EAAE,2BAE1D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EAChD,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAE1D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,OAAO,EAClB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAErC;AAED,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAKnF;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAY9F;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIvE"}
|
package/dist/air-extension.js
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
export const AIR_NATIVE_SUBAGENT_SESSIONS_CAPABILITY = "nativeSubagentSessions";
|
|
2
2
|
export const AIR_ASYNC_TASKS_CAPABILITY = "asyncTasks";
|
|
3
|
+
/**
|
|
4
|
+
* A prompt turn ends at its result also while its background subagents run.
|
|
5
|
+
* The subagent updates and requests then go out after the prompt response.
|
|
6
|
+
*/
|
|
7
|
+
export const AIR_BACKGROUND_SUBAGENTS_CAPABILITY = "backgroundSubagents";
|
|
3
8
|
export const AIR_SESSION_FAILURE_CAPABILITY = "sessionFailure";
|
|
4
9
|
export const AIR_RECOMMENDED_CONFIG_VALUE_CAPABILITY = "recommendedValue";
|
|
5
10
|
export const AIR_CUSTOM_INSTRUCTIONS_CAPABILITY = "customInstructions";
|
package/dist/async-tasks.d.ts
CHANGED
|
@@ -128,10 +128,13 @@ export declare class AsyncTaskRuntime {
|
|
|
128
128
|
* example to answer a task notification. ACP v1 has no session state, and
|
|
129
129
|
* the client already got the stop reason of its last prompt, so this task is
|
|
130
130
|
* the only sign that the agent works. The tool calls of the turn are in the
|
|
131
|
-
* transcript already, so the task is not shown there.
|
|
132
|
-
*
|
|
131
|
+
* transcript already, so the task is not shown there.
|
|
132
|
+
*
|
|
133
|
+
* [cause] names what started the turn when Claude Code says so, for example
|
|
134
|
+
* "A scheduled wakeup fired." It replaces the description of a task that is
|
|
135
|
+
* already open; without it, an open task is left as it is.
|
|
133
136
|
*/
|
|
134
|
-
autonomousTurnStarted(): Promise<void>;
|
|
137
|
+
autonomousTurnStarted(cause?: string): Promise<void>;
|
|
135
138
|
/** Whether the task of an autonomous turn is open. */
|
|
136
139
|
get autonomousTurnOpen(): boolean;
|
|
137
140
|
/** Ends the task of the autonomous turn that runs now, if there is one. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"async-tasks.d.ts","sourceRoot":"","sources":["../src/async-tasks.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"async-tasks.d.ts","sourceRoot":"","sources":["../src/async-tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/async-tasks.js
CHANGED
|
@@ -317,19 +317,27 @@ export class AsyncTaskRuntime {
|
|
|
317
317
|
* example to answer a task notification. ACP v1 has no session state, and
|
|
318
318
|
* the client already got the stop reason of its last prompt, so this task is
|
|
319
319
|
* the only sign that the agent works. The tool calls of the turn are in the
|
|
320
|
-
* transcript already, so the task is not shown there.
|
|
321
|
-
*
|
|
320
|
+
* transcript already, so the task is not shown there.
|
|
321
|
+
*
|
|
322
|
+
* [cause] names what started the turn when Claude Code says so, for example
|
|
323
|
+
* "A scheduled wakeup fired." It replaces the description of a task that is
|
|
324
|
+
* already open; without it, an open task is left as it is.
|
|
322
325
|
*/
|
|
323
|
-
async autonomousTurnStarted() {
|
|
324
|
-
if (!this.enabled
|
|
326
|
+
async autonomousTurnStarted(cause) {
|
|
327
|
+
if (!this.enabled)
|
|
325
328
|
return;
|
|
329
|
+
if (this.autonomousTurn) {
|
|
330
|
+
if (cause)
|
|
331
|
+
await this.publishProgress(this.autonomousTurn, { description: cause });
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
326
334
|
const task = this.task(`autonomous-turn-${randomUUID()}`);
|
|
327
335
|
task.autonomousTurn = true;
|
|
328
336
|
task.startedObserved = true;
|
|
329
337
|
task.name = "Claude is working";
|
|
330
338
|
task.taskType = "turn";
|
|
331
339
|
task.description =
|
|
332
|
-
this.lastNotificationSummary ?? "Claude Code started a turn without a prompt.";
|
|
340
|
+
cause ?? this.lastNotificationSummary ?? "Claude Code started a turn without a prompt.";
|
|
333
341
|
task.showInTranscript = false;
|
|
334
342
|
this.lastNotificationSummary = undefined;
|
|
335
343
|
this.autonomousTurn = task;
|
|
@@ -36,6 +36,7 @@ export type ClearContextSession<Turn extends ClearContextTurn = ClearContextTurn
|
|
|
36
36
|
turnQueue?: Turn[];
|
|
37
37
|
pendingExitPlanContextReset?: ClearContextReset;
|
|
38
38
|
contextUsedTokens?: number;
|
|
39
|
+
sentUserUuids?: Set<string>;
|
|
39
40
|
input: {
|
|
40
41
|
push(message: SDKUserMessage): unknown;
|
|
41
42
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clear-context-coordinator.d.ts","sourceRoot":"","sources":["../src/clear-context-coordinator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"clear-context-coordinator.d.ts","sourceRoot":"","sources":["../src/clear-context-coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -73,6 +73,7 @@ export async function continuePlanInFreshContext(sessionId, oldSession, reset, h
|
|
|
73
73
|
host.logError("Failed to publish clear-context session state:", error);
|
|
74
74
|
}
|
|
75
75
|
assertRestartActive(freshSession);
|
|
76
|
+
(freshSession.sentUserUuids ??= new Set()).add(turn.promptUuid);
|
|
76
77
|
freshSession.input.push(host.continuationMessage(sessionId, reset.plan, turn.promptUuid));
|
|
77
78
|
assertRestartActive(freshSession);
|
|
78
79
|
host.ensureConsumer(freshSession, sessionId);
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { claudeCliPath } from "./acp-agent.js";
|
|
3
3
|
import { applyManagedPolicyEnv } from "./managed-policy.js";
|
|
4
|
-
import { serveAcp } from "./serve.js";
|
|
4
|
+
import { acpProtocolsFromEnv, serveAcp } from "./serve.js";
|
|
5
5
|
import packageJson from "../package.json" with { type: "json" };
|
|
6
6
|
import { appendFileSync, mkdirSync } from "node:fs";
|
|
7
7
|
import { join } from "node:path";
|
|
@@ -78,9 +78,8 @@ else {
|
|
|
78
78
|
})()
|
|
79
79
|
: undefined;
|
|
80
80
|
logger?.log("Claude ACP started");
|
|
81
|
-
// The draft ACP v2 is opt-in while it is a draft.
|
|
82
81
|
const acp = serveAcp(logger, {
|
|
83
|
-
|
|
82
|
+
protocols: acpProtocolsFromEnv(process.env.CLAUDE_AGENT_ACP_PROTOCOL),
|
|
84
83
|
});
|
|
85
84
|
async function shutdown() {
|
|
86
85
|
await acp.dispose().catch((err) => {
|