@agentclientprotocol/claude-agent-acp 0.68.0 → 0.69.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.
- package/dist/acp-agent.d.ts +18 -0
- package/dist/acp-agent.d.ts.map +1 -1
- package/dist/acp-agent.js +199 -23
- package/dist/file-change-audit.d.ts +56 -0
- package/dist/file-change-audit.d.ts.map +1 -0
- package/dist/file-change-audit.js +379 -0
- package/dist/session-failure-extension.d.ts +1 -1
- package/dist/session-failure-extension.d.ts.map +1 -1
- package/dist/session-failure-extension.js +2 -2
- package/package.json +1 -1
package/dist/acp-agent.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { ContentBlockParam } from "@anthropic-ai/sdk/resources";
|
|
|
5
5
|
import { BetaContentBlock, BetaRawContentBlockDelta } from "@anthropic-ai/sdk/resources/beta.mjs";
|
|
6
6
|
import { SettingsManager } from "./settings.js";
|
|
7
7
|
import { type SessionFailureState } from "./session-failure-extension.js";
|
|
8
|
+
import { type FileChangeAuditSupport, type FileChangeAuditTurnState } from "./file-change-audit.js";
|
|
8
9
|
import { TaskState } from "./tools.js";
|
|
9
10
|
import { Pushable } from "./utils.js";
|
|
10
11
|
export declare const CLAUDE_CONFIG_DIR: string;
|
|
@@ -74,6 +75,10 @@ type Turn = {
|
|
|
74
75
|
* so the consumer can't promote them via the replay; it falls back to
|
|
75
76
|
* promoting the queue head when the result arrives. */
|
|
76
77
|
isLocalOnlyCommand: boolean;
|
|
78
|
+
/** Optional hidden, model-authored file-change audit requested by the ACP
|
|
79
|
+
* client for this turn. The state is turn-owned so a late tool call can
|
|
80
|
+
* never be rebound to a newer prompt. */
|
|
81
|
+
fileChangeAudit?: FileChangeAuditTurnState;
|
|
77
82
|
/** Set once the deferred has been resolved/rejected, so the consumer never
|
|
78
83
|
* settles a turn twice (idle + handoff + stream-end can all race). */
|
|
79
84
|
settled: boolean;
|
|
@@ -181,6 +186,14 @@ type Session = {
|
|
|
181
186
|
/** The turn whose messages the consumer is currently attributing output to
|
|
182
187
|
* (the head of `turnQueue` once its user message has been echoed). */
|
|
183
188
|
activeTurn?: Turn | null;
|
|
189
|
+
/** Request ids already accepted for hidden agent file-change reports. Kept
|
|
190
|
+
* for the session lifetime so a redelivered prompt cannot publish the same
|
|
191
|
+
* audit twice or bind a late report to another turn. */
|
|
192
|
+
fileChangeReportRequestIds: Set<string>;
|
|
193
|
+
/** Session-owned publisher for negotiated file-change audits. Turn state
|
|
194
|
+
* stays on each Turn; this controller supplies the single idempotent
|
|
195
|
+
* unavailable terminal used by every non-report settlement path. */
|
|
196
|
+
fileChangeAuditSupport?: FileChangeAuditSupport;
|
|
184
197
|
/** Optimistic goal state published for a submitted `/goal` command whose
|
|
185
198
|
* matching runtime update has not arrived yet. Runtime updates for the old
|
|
186
199
|
* goal are suppressed until this command is echoed or completes, otherwise
|
|
@@ -730,6 +743,11 @@ export declare class ClaudeAcpAgent {
|
|
|
730
743
|
* `session/prompt`. Without the opt-in, the existing detached `prompt()` and
|
|
731
744
|
* `startedNewTurn` result are preserved for compatibility. */
|
|
732
745
|
steer(params: SteerRequest): Promise<SteerResponse>;
|
|
746
|
+
/** Publish the audit terminal for every turn path that did not reach the
|
|
747
|
+
* report tool. The support flips the turn state synchronously before its
|
|
748
|
+
* transport await, so callers can stay fail-open and settle the ACP prompt
|
|
749
|
+
* immediately without allowing a racing lifecycle path to publish twice. */
|
|
750
|
+
private finishFileChangeAudit;
|
|
733
751
|
/** Lazily start the per-session consumer that drains the SDK query stream for
|
|
734
752
|
* the session's whole life. Idempotent: only the first `prompt()` starts it. */
|
|
735
753
|
private ensureConsumer;
|
package/dist/acp-agent.d.ts.map
CHANGED
|
@@ -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
|
@@ -12,6 +12,7 @@ import packageJson from "../package.json" with { type: "json" };
|
|
|
12
12
|
import { applyAskElicitationResponse, askUserQuestionsToCreateRequest, createElicitationResponseToElicitResult, extractAskUserQuestions, extractRefusalFallbackPrompt, mcpElicitationToCreateRequest, REFUSAL_FALLBACK_DIALOG_KIND, refusalFallbackResultFromResponse, refusalFallbackToCreateRequest, } from "./elicitation.js";
|
|
13
13
|
import { SettingsManager } from "./settings.js";
|
|
14
14
|
import { activeUsageLimitMessage, airSessionFailureCapabilityMeta, assistantMessageText, createSessionFailureState, isSyntheticUsageLimitMessage, providerFailureCategory, SessionFailureController, sessionFailureMeta, supportsAirSessionFailures, } from "./session-failure-extension.js";
|
|
15
|
+
import { AGENT_FILE_CHANGE_REPORT_CAPABILITY, agentFileChangeReportMeta, agentFileChangeReportRequestId, containsFileChangeAuditMarker, createFileChangeAuditSupport, createFileChangeAuditTurnState, FILE_CHANGE_AUDIT_SERVER_NAME, isFileChangeAuditReportPhase, isFileChangeAuditTool, supportsAgentFileChangeReport, } from "./file-change-audit.js";
|
|
15
16
|
import { applyTaskCreate, applyTaskList, applyTaskUpdate, createPostToolUseHook, createTaskHook, parseTaskCreateOutput, parseTaskListOutput, parseTaskUpdateOutput, planEntries, registerHookCallback, taskStateToPlanEntries, toolInfoFromToolUse, toolUpdateFromDiffToolResponse, toolUpdateFromToolResult, } from "./tools.js";
|
|
16
17
|
import { nodeToWebReadable, nodeToWebWritable, Pushable, unreachable } from "./utils.js";
|
|
17
18
|
export const CLAUDE_CONFIG_DIR = process.env.CLAUDE_CONFIG_DIR ?? path.join(os.homedir(), ".claude");
|
|
@@ -729,7 +730,7 @@ export class ClaudeAcpAgent {
|
|
|
729
730
|
// steering extension contract: advertises the `_session/steering` request
|
|
730
731
|
// so clients know they may inject a follow-up into a running turn.
|
|
731
732
|
_meta: {
|
|
732
|
-
...airSessionFailureCapabilityMeta(),
|
|
733
|
+
...airSessionFailureCapabilityMeta(AGENT_FILE_CHANGE_REPORT_CAPABILITY),
|
|
733
734
|
steering: {
|
|
734
735
|
supported: true,
|
|
735
736
|
},
|
|
@@ -977,6 +978,15 @@ export class ClaudeAcpAgent {
|
|
|
977
978
|
// user message, so the consumer can't promote the turn from the echo.
|
|
978
979
|
const firstText = params.prompt[0]?.type === "text" ? params.prompt[0].text : "";
|
|
979
980
|
const isLocalOnlyCommand = firstText.startsWith("/") && LOCAL_ONLY_COMMANDS.has(firstText.split(" ", 1)[0]);
|
|
981
|
+
const fileChangeReportRequestId = supportsAgentFileChangeReport(this.clientCapabilities)
|
|
982
|
+
? agentFileChangeReportRequestId(params._meta)
|
|
983
|
+
: undefined;
|
|
984
|
+
let fileChangeAudit;
|
|
985
|
+
if (fileChangeReportRequestId &&
|
|
986
|
+
!session.fileChangeReportRequestIds.has(fileChangeReportRequestId)) {
|
|
987
|
+
session.fileChangeReportRequestIds.add(fileChangeReportRequestId);
|
|
988
|
+
fileChangeAudit = createFileChangeAuditTurnState(fileChangeReportRequestId);
|
|
989
|
+
}
|
|
980
990
|
// Each prompt is a Turn whose deferred the persistent consumer settles once
|
|
981
991
|
// the turn's outcome is known. `prompt()` owns no loop: it enqueues the
|
|
982
992
|
// turn, pushes the user message onto the streaming input, makes sure the
|
|
@@ -984,6 +994,7 @@ export class ClaudeAcpAgent {
|
|
|
984
994
|
const turn = {
|
|
985
995
|
promptUuid,
|
|
986
996
|
isLocalOnlyCommand,
|
|
997
|
+
...(fileChangeAudit ? { fileChangeAudit } : {}),
|
|
987
998
|
settled: false,
|
|
988
999
|
resolve: () => { },
|
|
989
1000
|
reject: () => { },
|
|
@@ -1147,6 +1158,15 @@ export class ClaudeAcpAgent {
|
|
|
1147
1158
|
await this.publishGoalFromPrompt(sessionId, firstText, steeredUuid);
|
|
1148
1159
|
return { outcome: "injected" };
|
|
1149
1160
|
}
|
|
1161
|
+
/** Publish the audit terminal for every turn path that did not reach the
|
|
1162
|
+
* report tool. The support flips the turn state synchronously before its
|
|
1163
|
+
* transport await, so callers can stay fail-open and settle the ACP prompt
|
|
1164
|
+
* immediately without allowing a racing lifecycle path to publish twice. */
|
|
1165
|
+
finishFileChangeAudit(session, turn, reason) {
|
|
1166
|
+
if (!turn.fileChangeAudit || !session.fileChangeAuditSupport)
|
|
1167
|
+
return;
|
|
1168
|
+
void session.fileChangeAuditSupport.finishUnavailable(turn.fileChangeAudit, reason);
|
|
1169
|
+
}
|
|
1150
1170
|
/** Lazily start the per-session consumer that drains the SDK query stream for
|
|
1151
1171
|
* the session's whole life. Idempotent: only the first `prompt()` starts it. */
|
|
1152
1172
|
ensureConsumer(session, sessionId) {
|
|
@@ -1228,6 +1248,14 @@ export class ClaudeAcpAgent {
|
|
|
1228
1248
|
* as the turn's answer. */
|
|
1229
1249
|
const sendUpdate = async (notification) => {
|
|
1230
1250
|
const { update } = notification;
|
|
1251
|
+
if (isFileChangeAuditReportPhase(session.activeTurn?.fileChangeAudit) &&
|
|
1252
|
+
(update.sessionUpdate === "agent_message_chunk" ||
|
|
1253
|
+
update.sessionUpdate === "agent_thought_chunk" ||
|
|
1254
|
+
update.sessionUpdate === "user_message_chunk" ||
|
|
1255
|
+
update.sessionUpdate === "tool_call" ||
|
|
1256
|
+
update.sessionUpdate === "tool_call_update")) {
|
|
1257
|
+
return;
|
|
1258
|
+
}
|
|
1231
1259
|
if (update.sessionUpdate === "agent_message_chunk") {
|
|
1232
1260
|
const claudeMeta = update._meta?.claudeCode;
|
|
1233
1261
|
if (!claudeMeta?.parentToolUseId) {
|
|
@@ -1523,11 +1551,14 @@ export class ClaudeAcpAgent {
|
|
|
1523
1551
|
};
|
|
1524
1552
|
/** Settle the active turn's deferred exactly once, disarm the force-cancel
|
|
1525
1553
|
* backstop (the turn is over), and drop it from the queue. */
|
|
1526
|
-
const settleActive = (result
|
|
1554
|
+
const settleActive = (result, auditReason = result.stopReason === "cancelled"
|
|
1555
|
+
? "cancelled"
|
|
1556
|
+
: "notReported") => {
|
|
1527
1557
|
const turn = session.activeTurn;
|
|
1528
1558
|
if (!turn || turn.settled) {
|
|
1529
1559
|
return;
|
|
1530
1560
|
}
|
|
1561
|
+
this.finishFileChangeAudit(session, turn, auditReason);
|
|
1531
1562
|
// Captured before the settled flip below (isHeldOpen tests !settled).
|
|
1532
1563
|
const wasHeld = isHeldOpen(turn);
|
|
1533
1564
|
turn.settled = true;
|
|
@@ -1561,6 +1592,7 @@ export class ClaudeAcpAgent {
|
|
|
1561
1592
|
this.logger.error(`Session ${params.sessionId}: cannot fail active turn because no unsettled active turn exists: ${error}`);
|
|
1562
1593
|
return;
|
|
1563
1594
|
}
|
|
1595
|
+
this.finishFileChangeAudit(session, turn, "providerError");
|
|
1564
1596
|
turn.settled = true;
|
|
1565
1597
|
session.turnQueue = (session.turnQueue ?? []).filter((t) => t !== turn);
|
|
1566
1598
|
session.activeTurn = null;
|
|
@@ -1595,7 +1627,7 @@ export class ClaudeAcpAgent {
|
|
|
1595
1627
|
stopReason: "end_turn",
|
|
1596
1628
|
usage: sessionUsage(session),
|
|
1597
1629
|
_meta: sessionFailureMeta(failure),
|
|
1598
|
-
});
|
|
1630
|
+
}, "providerError");
|
|
1599
1631
|
};
|
|
1600
1632
|
/** Reject every in-flight turn — used when the stream dies. */
|
|
1601
1633
|
const failAllTurns = (error) => {
|
|
@@ -1607,6 +1639,7 @@ export class ClaudeAcpAgent {
|
|
|
1607
1639
|
session.turnQueue = [];
|
|
1608
1640
|
for (const turn of turns) {
|
|
1609
1641
|
if (!turn.settled) {
|
|
1642
|
+
this.finishFileChangeAudit(session, turn, "providerError");
|
|
1610
1643
|
const wasHeld = isHeldOpen(turn);
|
|
1611
1644
|
turn.settled = true;
|
|
1612
1645
|
if (wasHeld) {
|
|
@@ -1755,6 +1788,7 @@ export class ClaudeAcpAgent {
|
|
|
1755
1788
|
// still here was enqueued afterward and was not part of the cancel.)
|
|
1756
1789
|
for (const queued of [...(session.turnQueue ?? [])]) {
|
|
1757
1790
|
if (!queued.settled) {
|
|
1791
|
+
this.finishFileChangeAudit(session, queued, "providerError");
|
|
1758
1792
|
queued.settled = true;
|
|
1759
1793
|
queued.reject(RequestError.internalError(undefined, SESSION_ENDED_MESSAGE));
|
|
1760
1794
|
}
|
|
@@ -3417,6 +3451,7 @@ export class ClaudeAcpAgent {
|
|
|
3417
3451
|
if (session.turnQueue) {
|
|
3418
3452
|
for (const turn of session.turnQueue) {
|
|
3419
3453
|
if (turn !== session.activeTurn && !turn.settled) {
|
|
3454
|
+
this.finishFileChangeAudit(session, turn, "cancelled");
|
|
3420
3455
|
turn.settled = true;
|
|
3421
3456
|
// Deliberately no `usage`: a queued turn never ran, so the session
|
|
3422
3457
|
// accumulator (the active turn's tally) is not its spend.
|
|
@@ -3478,6 +3513,7 @@ export class ClaudeAcpAgent {
|
|
|
3478
3513
|
{
|
|
3479
3514
|
const active = session.activeTurn;
|
|
3480
3515
|
if (isHeldOpen(active)) {
|
|
3516
|
+
this.finishFileChangeAudit(session, active, "cancelled");
|
|
3481
3517
|
active.settled = true;
|
|
3482
3518
|
// Mirror settleActive's invariants (it is consumer-scoped and
|
|
3483
3519
|
// unreachable from here): disarm the backstop — none should be
|
|
@@ -3815,6 +3851,13 @@ export class ClaudeAcpAgent {
|
|
|
3815
3851
|
})
|
|
3816
3852
|
: undefined;
|
|
3817
3853
|
let replayTurnId;
|
|
3854
|
+
// Stop-hook additionalContext is persisted as an internal user message.
|
|
3855
|
+
// Once that marker (or the internal tool itself) appears, suppress the
|
|
3856
|
+
// whole audit exchange until its tool result. This also hides a disobedient
|
|
3857
|
+
// model's separate prose message, while an ordinary next user prompt safely
|
|
3858
|
+
// ends an incomplete audit lane.
|
|
3859
|
+
let replayingFileChangeAudit = false;
|
|
3860
|
+
const replayFileChangeAuditToolUseIds = new Set();
|
|
3818
3861
|
for (const message of messages) {
|
|
3819
3862
|
if (message.type === "user" &&
|
|
3820
3863
|
message.parent_tool_use_id === null &&
|
|
@@ -3864,6 +3907,57 @@ export class ClaudeAcpAgent {
|
|
|
3864
3907
|
if (content === null)
|
|
3865
3908
|
continue;
|
|
3866
3909
|
}
|
|
3910
|
+
const auditBlocks = Array.isArray(content)
|
|
3911
|
+
? content.filter((block) => typeof block === "object" && block !== null)
|
|
3912
|
+
: [];
|
|
3913
|
+
const hasFileChangeAuditMarker = (typeof content === "string" && containsFileChangeAuditMarker(content)) ||
|
|
3914
|
+
auditBlocks.some((block) => typeof block.text === "string" && containsFileChangeAuditMarker(block.text));
|
|
3915
|
+
const fileChangeAuditToolUseIds = auditBlocks.flatMap((block) => (block.type === "tool_use" ||
|
|
3916
|
+
block.type === "server_tool_use" ||
|
|
3917
|
+
block.type === "mcp_tool_use") &&
|
|
3918
|
+
typeof block.name === "string" &&
|
|
3919
|
+
isFileChangeAuditTool(block.name) &&
|
|
3920
|
+
typeof block.id === "string"
|
|
3921
|
+
? [block.id]
|
|
3922
|
+
: []);
|
|
3923
|
+
const replayMessageRole = message.message
|
|
3924
|
+
?.role;
|
|
3925
|
+
if (hasFileChangeAuditMarker || fileChangeAuditToolUseIds.length > 0) {
|
|
3926
|
+
replayingFileChangeAudit = true;
|
|
3927
|
+
for (const toolUseId of fileChangeAuditToolUseIds) {
|
|
3928
|
+
replayFileChangeAuditToolUseIds.add(toolUseId);
|
|
3929
|
+
}
|
|
3930
|
+
continue;
|
|
3931
|
+
}
|
|
3932
|
+
if (replayingFileChangeAudit) {
|
|
3933
|
+
const toolResultIds = auditBlocks.flatMap((block) => (block.type === "tool_result" || block.type === "mcp_tool_result") &&
|
|
3934
|
+
typeof block.tool_use_id === "string"
|
|
3935
|
+
? [block.tool_use_id]
|
|
3936
|
+
: []);
|
|
3937
|
+
let completedReport = false;
|
|
3938
|
+
for (const toolUseId of toolResultIds) {
|
|
3939
|
+
if (replayFileChangeAuditToolUseIds.delete(toolUseId))
|
|
3940
|
+
completedReport = true;
|
|
3941
|
+
}
|
|
3942
|
+
if (completedReport && replayFileChangeAuditToolUseIds.size === 0) {
|
|
3943
|
+
replayingFileChangeAudit = false;
|
|
3944
|
+
continue;
|
|
3945
|
+
}
|
|
3946
|
+
// A denied attempt to call another tool is still part of the hidden
|
|
3947
|
+
// lane. Its result must not end replay suppression before the report.
|
|
3948
|
+
if (toolResultIds.length > 0) {
|
|
3949
|
+
continue;
|
|
3950
|
+
}
|
|
3951
|
+
// The next real user prompt is already represented by the client and
|
|
3952
|
+
// starts a new turn; do not let a missing audit result hide it or the
|
|
3953
|
+
// rest of the replay.
|
|
3954
|
+
if (replayMessageRole === "user") {
|
|
3955
|
+
replayingFileChangeAudit = false;
|
|
3956
|
+
}
|
|
3957
|
+
else {
|
|
3958
|
+
continue;
|
|
3959
|
+
}
|
|
3960
|
+
}
|
|
3867
3961
|
for (const notification of toAcpNotifications(
|
|
3868
3962
|
// @ts-expect-error - untyped in SDK but we handle all of these
|
|
3869
3963
|
content,
|
|
@@ -3957,6 +4051,26 @@ export class ClaudeAcpAgent {
|
|
|
3957
4051
|
message: "Session not found",
|
|
3958
4052
|
};
|
|
3959
4053
|
}
|
|
4054
|
+
const fileChangeAudit = session.activeTurn?.fileChangeAudit;
|
|
4055
|
+
if (isFileChangeAuditReportPhase(fileChangeAudit)) {
|
|
4056
|
+
// The hidden continuation is an audit-only lane: it may submit the
|
|
4057
|
+
// wrapper-owned report, but it must not run another command after the
|
|
4058
|
+
// user-visible answer has already completed.
|
|
4059
|
+
if (isFileChangeAuditTool(toolName) && fileChangeAudit?.phase === "collecting") {
|
|
4060
|
+
return { behavior: "allow", updatedInput: toolInput };
|
|
4061
|
+
}
|
|
4062
|
+
return {
|
|
4063
|
+
behavior: "deny",
|
|
4064
|
+
message: "Only the internal file-change report is allowed during the audit.",
|
|
4065
|
+
};
|
|
4066
|
+
}
|
|
4067
|
+
// The tool is intentionally unusable outside a negotiated audit turn.
|
|
4068
|
+
if (isFileChangeAuditTool(toolName)) {
|
|
4069
|
+
return {
|
|
4070
|
+
behavior: "deny",
|
|
4071
|
+
message: "No file-change report was requested for this turn.",
|
|
4072
|
+
};
|
|
4073
|
+
}
|
|
3960
4074
|
// When the tool call originates inside a subagent, attribute the eagerly
|
|
3961
4075
|
// emitted tool_call (and the permission request itself) to the Agent/Task
|
|
3962
4076
|
// tool call that spawned the subagent, mirroring the streamed subagent
|
|
@@ -4654,6 +4768,30 @@ export class ClaudeAcpAgent {
|
|
|
4654
4768
|
// below) so the TaskCreated/TaskCompleted hook callbacks can close over
|
|
4655
4769
|
// the same Map that the streaming message handler will read from.
|
|
4656
4770
|
const taskState = new Map();
|
|
4771
|
+
// Resolve every workspace root once. The hidden report tool uses this same
|
|
4772
|
+
// set for lexical path validation, and the SDK receives it below.
|
|
4773
|
+
const acpAdditionalDirectories = params.additionalDirectories ?? sessionMeta?.additionalRoots ?? [];
|
|
4774
|
+
const additionalDirectories = [
|
|
4775
|
+
...(userProvidedOptions?.additionalDirectories ?? []),
|
|
4776
|
+
...acpAdditionalDirectories,
|
|
4777
|
+
];
|
|
4778
|
+
const fileChangeAuditSupport = supportsAgentFileChangeReport(this.clientCapabilities)
|
|
4779
|
+
? createFileChangeAuditSupport({
|
|
4780
|
+
cwd: params.cwd,
|
|
4781
|
+
additionalDirectories,
|
|
4782
|
+
getActiveState: () => this.sessions[sessionId]?.activeTurn?.fileChangeAudit,
|
|
4783
|
+
publish: async (result) => {
|
|
4784
|
+
await this.client.sessionUpdate({
|
|
4785
|
+
sessionId,
|
|
4786
|
+
update: {
|
|
4787
|
+
sessionUpdate: "session_info_update",
|
|
4788
|
+
_meta: agentFileChangeReportMeta(result),
|
|
4789
|
+
},
|
|
4790
|
+
});
|
|
4791
|
+
},
|
|
4792
|
+
logError: (message) => this.logger.error(message),
|
|
4793
|
+
})
|
|
4794
|
+
: undefined;
|
|
4657
4795
|
// The exact env the query will be created with. Built (and the provider
|
|
4658
4796
|
// cache key derived from it, below) in one place so the key always
|
|
4659
4797
|
// describes the backend this query actually talks to: `providers/set`,
|
|
@@ -4697,7 +4835,13 @@ export class ClaudeAcpAgent {
|
|
|
4697
4835
|
cwd: params.cwd,
|
|
4698
4836
|
includePartialMessages: true,
|
|
4699
4837
|
forwardSubagentText,
|
|
4700
|
-
mcpServers: {
|
|
4838
|
+
mcpServers: {
|
|
4839
|
+
...(userProvidedOptions?.mcpServers || {}),
|
|
4840
|
+
...mcpServers,
|
|
4841
|
+
...(fileChangeAuditSupport
|
|
4842
|
+
? { [FILE_CHANGE_AUDIT_SERVER_NAME]: fileChangeAuditSupport.mcpServer }
|
|
4843
|
+
: {}),
|
|
4844
|
+
},
|
|
4701
4845
|
// If we want bypassPermissions to be an option, we have to allow it here.
|
|
4702
4846
|
// But it doesn't work in root mode, so we only activate it if it will work.
|
|
4703
4847
|
allowDangerouslySkipPermissions: ALLOW_BYPASS,
|
|
@@ -4731,6 +4875,14 @@ export class ClaudeAcpAgent {
|
|
|
4731
4875
|
tools,
|
|
4732
4876
|
hooks: {
|
|
4733
4877
|
...userProvidedOptions?.hooks,
|
|
4878
|
+
...(fileChangeAuditSupport
|
|
4879
|
+
? {
|
|
4880
|
+
PreToolUse: [
|
|
4881
|
+
...(userProvidedOptions?.hooks?.PreToolUse || []),
|
|
4882
|
+
{ hooks: [fileChangeAuditSupport.preToolUseHook] },
|
|
4883
|
+
],
|
|
4884
|
+
}
|
|
4885
|
+
: {}),
|
|
4734
4886
|
PostToolUse: [
|
|
4735
4887
|
...(userProvidedOptions?.hooks?.PostToolUse || []),
|
|
4736
4888
|
{
|
|
@@ -4750,6 +4902,14 @@ export class ClaudeAcpAgent {
|
|
|
4750
4902
|
],
|
|
4751
4903
|
},
|
|
4752
4904
|
],
|
|
4905
|
+
...(fileChangeAuditSupport
|
|
4906
|
+
? {
|
|
4907
|
+
Stop: [
|
|
4908
|
+
...(userProvidedOptions?.hooks?.Stop || []),
|
|
4909
|
+
{ hooks: [fileChangeAuditSupport.stopHook] },
|
|
4910
|
+
],
|
|
4911
|
+
}
|
|
4912
|
+
: {}),
|
|
4753
4913
|
TaskCreated: [
|
|
4754
4914
|
...(userProvidedOptions?.hooks?.TaskCreated || []),
|
|
4755
4915
|
{
|
|
@@ -4780,11 +4940,7 @@ export class ClaudeAcpAgent {
|
|
|
4780
4940
|
// legacy `_meta.additionalRoots` extension for clients that haven't been
|
|
4781
4941
|
// updated yet. Either source is merged with directories supplied via
|
|
4782
4942
|
// `_meta.claudeCode.options.additionalDirectories` (SDK pass-through).
|
|
4783
|
-
|
|
4784
|
-
options.additionalDirectories = [
|
|
4785
|
-
...(userProvidedOptions?.additionalDirectories ?? []),
|
|
4786
|
-
...acpAdditionalDirectories,
|
|
4787
|
-
];
|
|
4943
|
+
options.additionalDirectories = additionalDirectories;
|
|
4788
4944
|
if (creationOpts?.resume === undefined || creationOpts?.forkSession) {
|
|
4789
4945
|
// Set our own session id if not resuming an existing session.
|
|
4790
4946
|
options.sessionId = sessionId;
|
|
@@ -4997,6 +5153,8 @@ export class ClaudeAcpAgent {
|
|
|
4997
5153
|
owedTrailingIdles: 0,
|
|
4998
5154
|
messageIdToUuid: new Map(),
|
|
4999
5155
|
sessionFailureState: createSessionFailureState(),
|
|
5156
|
+
fileChangeReportRequestIds: new Set(),
|
|
5157
|
+
fileChangeAuditSupport,
|
|
5000
5158
|
};
|
|
5001
5159
|
return {
|
|
5002
5160
|
sessionId,
|
|
@@ -5983,7 +6141,7 @@ function isTaskTool(toolName) {
|
|
|
5983
6141
|
* permission-surfaced tool_call for them (see `ensureToolCallEmitted`) must be
|
|
5984
6142
|
* resolved explicitly at tool_result time. */
|
|
5985
6143
|
function shouldEmitToolCall(toolName) {
|
|
5986
|
-
return toolName !== "TodoWrite" && !isTaskTool(toolName);
|
|
6144
|
+
return toolName !== "TodoWrite" && !isTaskTool(toolName) && !isFileChangeAuditTool(toolName);
|
|
5987
6145
|
}
|
|
5988
6146
|
/** Build the Claude Code-specific metadata for a tool call. Bash descriptions
|
|
5989
6147
|
* are kept out of ACP's standard `title`, which clients may use as the shell
|
|
@@ -6136,7 +6294,7 @@ export function toAcpNotifications(content, role, sessionId, toolUseCache, clien
|
|
|
6136
6294
|
const registerHooks = options?.registerHooks !== false;
|
|
6137
6295
|
const supportsTerminalOutput = options?.clientCapabilities?._meta?.["terminal_output"] === true;
|
|
6138
6296
|
if (typeof content === "string") {
|
|
6139
|
-
if (content.length === 0) {
|
|
6297
|
+
if (content.length === 0 || containsFileChangeAuditMarker(content)) {
|
|
6140
6298
|
return [];
|
|
6141
6299
|
}
|
|
6142
6300
|
const update = {
|
|
@@ -6170,6 +6328,13 @@ export function toAcpNotifications(content, role, sessionId, toolUseCache, clien
|
|
|
6170
6328
|
// Unlike `tool_use_result`, entries carry their own tool_use_id, so batched
|
|
6171
6329
|
// messages need no single-block guard.
|
|
6172
6330
|
const toolResultMeta = parseToolResultMeta(options?.toolResultMeta);
|
|
6331
|
+
// A report-phase assistant message may contain a short text preface and the
|
|
6332
|
+
// internal tool call in the same content array. Hide the whole message, not
|
|
6333
|
+
// only the tool block, so it stays absent on session replay as well as live.
|
|
6334
|
+
const containsFileChangeAuditToolUse = content.some((chunk) => (chunk.type === "tool_use" ||
|
|
6335
|
+
chunk.type === "server_tool_use" ||
|
|
6336
|
+
chunk.type === "mcp_tool_use") &&
|
|
6337
|
+
isFileChangeAuditTool(chunk.name));
|
|
6173
6338
|
const output = [];
|
|
6174
6339
|
// Only handle the first chunk for streaming; extend as needed for batching
|
|
6175
6340
|
for (const chunk of content) {
|
|
@@ -6177,7 +6342,9 @@ export function toAcpNotifications(content, role, sessionId, toolUseCache, clien
|
|
|
6177
6342
|
switch (chunk.type) {
|
|
6178
6343
|
case "text":
|
|
6179
6344
|
case "text_delta": {
|
|
6180
|
-
if (chunk.text
|
|
6345
|
+
if (chunk.text &&
|
|
6346
|
+
!containsFileChangeAuditToolUse &&
|
|
6347
|
+
!containsFileChangeAuditMarker(chunk.text)) {
|
|
6181
6348
|
update = {
|
|
6182
6349
|
sessionUpdate: role === "assistant" ? "agent_message_chunk" : "user_message_chunk",
|
|
6183
6350
|
content: {
|
|
@@ -6189,21 +6356,22 @@ export function toAcpNotifications(content, role, sessionId, toolUseCache, clien
|
|
|
6189
6356
|
break;
|
|
6190
6357
|
}
|
|
6191
6358
|
case "image":
|
|
6192
|
-
|
|
6193
|
-
|
|
6194
|
-
|
|
6195
|
-
|
|
6196
|
-
|
|
6197
|
-
|
|
6198
|
-
|
|
6199
|
-
|
|
6200
|
-
|
|
6359
|
+
if (!containsFileChangeAuditToolUse)
|
|
6360
|
+
update = {
|
|
6361
|
+
sessionUpdate: role === "assistant" ? "agent_message_chunk" : "user_message_chunk",
|
|
6362
|
+
content: {
|
|
6363
|
+
type: "image",
|
|
6364
|
+
data: chunk.source.type === "base64" ? chunk.source.data : "",
|
|
6365
|
+
mimeType: chunk.source.type === "base64" ? chunk.source.media_type : "",
|
|
6366
|
+
uri: chunk.source.type === "url" ? chunk.source.url : undefined,
|
|
6367
|
+
},
|
|
6368
|
+
};
|
|
6201
6369
|
break;
|
|
6202
6370
|
case "thinking":
|
|
6203
6371
|
case "thinking_delta": {
|
|
6204
6372
|
// Recent models default `thinking.display` to "omitted", which streams
|
|
6205
6373
|
// signature-only thinking blocks whose text is empty.
|
|
6206
|
-
if (chunk.thinking) {
|
|
6374
|
+
if (chunk.thinking && !containsFileChangeAuditToolUse) {
|
|
6207
6375
|
update = {
|
|
6208
6376
|
sessionUpdate: "agent_thought_chunk",
|
|
6209
6377
|
content: {
|
|
@@ -6219,7 +6387,11 @@ export function toAcpNotifications(content, role, sessionId, toolUseCache, clien
|
|
|
6219
6387
|
case "mcp_tool_use": {
|
|
6220
6388
|
const alreadyCached = chunk.id in toolUseCache;
|
|
6221
6389
|
toolUseCache[chunk.id] = chunk;
|
|
6222
|
-
if (chunk.name
|
|
6390
|
+
if (isFileChangeAuditTool(chunk.name)) {
|
|
6391
|
+
// Wrapper-owned audit protocol: never surface or register generic
|
|
6392
|
+
// PostToolUse callbacks for the internal tool.
|
|
6393
|
+
}
|
|
6394
|
+
else if (chunk.name === "TodoWrite") {
|
|
6223
6395
|
// @ts-expect-error - sometimes input is empty object or undefined
|
|
6224
6396
|
if (Array.isArray(chunk.input?.todos)) {
|
|
6225
6397
|
update = {
|
|
@@ -6343,6 +6515,10 @@ export function toAcpNotifications(content, role, sessionId, toolUseCache, clien
|
|
|
6343
6515
|
logger.error(`[claude-agent-acp] Got a tool result for tool use that wasn't tracked: ${chunk.tool_use_id}`);
|
|
6344
6516
|
break;
|
|
6345
6517
|
}
|
|
6518
|
+
if (isFileChangeAuditTool(toolUse.name)) {
|
|
6519
|
+
delete toolUseCache[chunk.tool_use_id];
|
|
6520
|
+
break;
|
|
6521
|
+
}
|
|
6346
6522
|
// A permission request may have surfaced a plan-rendered (TodoWrite) or
|
|
6347
6523
|
// suppressed (Task*) tool as a real tool_call so the request referenced
|
|
6348
6524
|
// a tool call the client knows about (see `ensureToolCallEmitted`,
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { type HookCallback, type McpSdkServerConfigWithInstance } from "@anthropic-ai/claude-agent-sdk";
|
|
2
|
+
export declare const AGENT_FILE_CHANGE_REPORT_CAPABILITY = "agentFileChangeReport";
|
|
3
|
+
export declare const FILE_CHANGE_AUDIT_SERVER_NAME = "claude_agent_acp";
|
|
4
|
+
export declare const FILE_CHANGE_AUDIT_TOOL_NAME = "report_changed_files";
|
|
5
|
+
export declare const FILE_CHANGE_AUDIT_WIRE_TOOL_NAME = "mcp__claude_agent_acp__report_changed_files";
|
|
6
|
+
export declare const AGENT_FILE_CHANGE_REPORT_MAX_BYTES: number;
|
|
7
|
+
export type FileChangeAuditTurnState = {
|
|
8
|
+
requestId: string;
|
|
9
|
+
phase: "requested" | "collecting" | "finished";
|
|
10
|
+
};
|
|
11
|
+
export type FileChangeAuditWorkspace = {
|
|
12
|
+
cwd: string;
|
|
13
|
+
additionalDirectories: string[];
|
|
14
|
+
};
|
|
15
|
+
export type AgentFileChangeReport = {
|
|
16
|
+
paths: string[];
|
|
17
|
+
complete: boolean;
|
|
18
|
+
uncertainty?: string;
|
|
19
|
+
};
|
|
20
|
+
export type AgentFileChangeReportResult = {
|
|
21
|
+
version: 1;
|
|
22
|
+
requestId: string;
|
|
23
|
+
} & ({
|
|
24
|
+
status: "reported";
|
|
25
|
+
paths: string[];
|
|
26
|
+
declaredComplete: boolean;
|
|
27
|
+
truncated: boolean;
|
|
28
|
+
uncertainty?: string;
|
|
29
|
+
} | {
|
|
30
|
+
status: "unavailable";
|
|
31
|
+
reason: FileChangeReportUnavailableReason;
|
|
32
|
+
});
|
|
33
|
+
export type FileChangeReportUnavailableReason = "cancelled" | "timeout" | "invalidOutput" | "notReported" | "providerError";
|
|
34
|
+
type FileChangeAuditSupportOptions = {
|
|
35
|
+
cwd: string;
|
|
36
|
+
additionalDirectories: string[];
|
|
37
|
+
getActiveState: () => FileChangeAuditTurnState | undefined;
|
|
38
|
+
publish: (result: AgentFileChangeReportResult) => Promise<void>;
|
|
39
|
+
logError: (message: string) => void;
|
|
40
|
+
};
|
|
41
|
+
export type FileChangeAuditSupport = {
|
|
42
|
+
mcpServer: McpSdkServerConfigWithInstance;
|
|
43
|
+
preToolUseHook: HookCallback;
|
|
44
|
+
stopHook: HookCallback;
|
|
45
|
+
finishUnavailable: (state: FileChangeAuditTurnState, reason: FileChangeReportUnavailableReason) => Promise<void>;
|
|
46
|
+
};
|
|
47
|
+
export declare function agentFileChangeReportRequestId(meta: unknown): string | undefined;
|
|
48
|
+
export declare function supportsAgentFileChangeReport(capabilities: unknown): boolean;
|
|
49
|
+
export declare function agentFileChangeReportMeta(result: AgentFileChangeReportResult): Record<string, unknown>;
|
|
50
|
+
export declare function createFileChangeAuditTurnState(requestId: string): FileChangeAuditTurnState;
|
|
51
|
+
export declare function isFileChangeAuditReportPhase(state: FileChangeAuditTurnState | undefined): boolean;
|
|
52
|
+
export declare function isFileChangeAuditTool(toolName: string): boolean;
|
|
53
|
+
export declare function containsFileChangeAuditMarker(text: string): boolean;
|
|
54
|
+
export declare function createFileChangeAuditSupport(options: FileChangeAuditSupportOptions): FileChangeAuditSupport;
|
|
55
|
+
export {};
|
|
56
|
+
//# sourceMappingURL=file-change-audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-change-audit.d.ts","sourceRoot":"","sources":["../src/file-change-audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,8BAA8B,EAEpC,MAAM,gCAAgC,CAAC;AAKxC,eAAO,MAAM,mCAAmC,0BAA0B,CAAC;AAC3E,eAAO,MAAM,6BAA6B,qBAAqB,CAAC;AAChE,eAAO,MAAM,2BAA2B,yBAAyB,CAAC;AAClE,eAAO,MAAM,gCAAgC,gDAA0E,CAAC;AAKxH,eAAO,MAAM,kCAAkC,QAAa,CAAC;AAG7D,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,GAAG,EAAE,MAAM,CAAC;IACZ,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,CACA;IACE,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GACD;IACE,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,iCAAiC,CAAC;CAC3C,CACJ,CAAC;AAEF,MAAM,MAAM,iCAAiC,GAC3C,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,aAAa,GAAG,eAAe,CAAC;AAQ9E,KAAK,6BAA6B,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,qBAAqB,EAAE,MAAM,EAAE,CAAC;IAChC,cAAc,EAAE,MAAM,wBAAwB,GAAG,SAAS,CAAC;IAC3D,OAAO,EAAE,CAAC,MAAM,EAAE,2BAA2B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,EAAE,8BAA8B,CAAC;IAC1C,cAAc,EAAE,YAAY,CAAC;IAC7B,QAAQ,EAAE,YAAY,CAAC;IACvB,iBAAiB,EAAE,CACjB,KAAK,EAAE,wBAAwB,EAC/B,MAAM,EAAE,iCAAiC,KACtC,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AAoBF,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAiBhF;AAED,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAW5E;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,2BAA2B,GAClC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASzB;AAYD,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,wBAAwB,CAK1F;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,wBAAwB,GAAG,SAAS,GAAG,OAAO,CAEjG;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,6BAA6B,GACrC,sBAAsB,CAmJxB"}
|
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { createSdkMcpServer, } from "@anthropic-ai/claude-agent-sdk";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
export const AGENT_FILE_CHANGE_REPORT_CAPABILITY = "agentFileChangeReport";
|
|
6
|
+
export const FILE_CHANGE_AUDIT_SERVER_NAME = "claude_agent_acp";
|
|
7
|
+
export const FILE_CHANGE_AUDIT_TOOL_NAME = "report_changed_files";
|
|
8
|
+
export const FILE_CHANGE_AUDIT_WIRE_TOOL_NAME = `mcp__${FILE_CHANGE_AUDIT_SERVER_NAME}__${FILE_CHANGE_AUDIT_TOOL_NAME}`;
|
|
9
|
+
const FILE_CHANGE_AUDIT_MARKER = "claude-agent-acp-file-change-audit";
|
|
10
|
+
const MAX_REPORTED_PATHS = 1024;
|
|
11
|
+
const MAX_REPORTED_PATH_LENGTH = 4096;
|
|
12
|
+
export const AGENT_FILE_CHANGE_REPORT_MAX_BYTES = 256 * 1024;
|
|
13
|
+
const REQUEST_ID_PATTERN = /^[A-Za-z0-9._:-]{1,128}$/;
|
|
14
|
+
const JETBRAINS_META_KEY = "jetbrains";
|
|
15
|
+
const AIR_META_KEY = "air";
|
|
16
|
+
const AIR_EXTENSION_VERSION = 1;
|
|
17
|
+
const AIR_EXTENSION_CAPABILITIES_KEY = "capabilities";
|
|
18
|
+
const AIR_AGENT_FILE_CHANGE_REPORT_KEY = "agentFileChangeReport";
|
|
19
|
+
const reportInputSchema = {
|
|
20
|
+
paths: z
|
|
21
|
+
.array(z.string())
|
|
22
|
+
.describe("Workspace file paths changed during this turn. Use absolute paths or paths relative to cwd."),
|
|
23
|
+
complete: z
|
|
24
|
+
.boolean()
|
|
25
|
+
.describe("True only when paths contains every workspace file changed during this turn."),
|
|
26
|
+
uncertainty: z
|
|
27
|
+
.string()
|
|
28
|
+
.trim()
|
|
29
|
+
.min(1)
|
|
30
|
+
.max(2000)
|
|
31
|
+
.optional()
|
|
32
|
+
.describe("Why the report may be incomplete or uncertain."),
|
|
33
|
+
};
|
|
34
|
+
export function agentFileChangeReportRequestId(meta) {
|
|
35
|
+
const air = airExtension(meta);
|
|
36
|
+
const request = air?.agentFileChangeReportRequest;
|
|
37
|
+
if (!request || typeof request !== "object" || Array.isArray(request))
|
|
38
|
+
return undefined;
|
|
39
|
+
const requestRecord = request;
|
|
40
|
+
const requestKeys = Object.keys(requestRecord);
|
|
41
|
+
if (requestKeys.length !== 2 ||
|
|
42
|
+
!requestKeys.includes("version") ||
|
|
43
|
+
!requestKeys.includes("requestId") ||
|
|
44
|
+
requestRecord.version !== 1)
|
|
45
|
+
return undefined;
|
|
46
|
+
const requestId = requestRecord.requestId;
|
|
47
|
+
return typeof requestId === "string" && REQUEST_ID_PATTERN.test(requestId)
|
|
48
|
+
? requestId
|
|
49
|
+
: undefined;
|
|
50
|
+
}
|
|
51
|
+
export function supportsAgentFileChangeReport(capabilities) {
|
|
52
|
+
if (!capabilities || typeof capabilities !== "object" || Array.isArray(capabilities)) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
const air = airExtension(capabilities._meta);
|
|
56
|
+
const advertised = air?.[AIR_EXTENSION_CAPABILITIES_KEY];
|
|
57
|
+
return (air?.version === AIR_EXTENSION_VERSION &&
|
|
58
|
+
Array.isArray(advertised) &&
|
|
59
|
+
advertised.includes(AGENT_FILE_CHANGE_REPORT_CAPABILITY));
|
|
60
|
+
}
|
|
61
|
+
export function agentFileChangeReportMeta(result) {
|
|
62
|
+
return {
|
|
63
|
+
[JETBRAINS_META_KEY]: {
|
|
64
|
+
[AIR_META_KEY]: {
|
|
65
|
+
version: AIR_EXTENSION_VERSION,
|
|
66
|
+
[AIR_AGENT_FILE_CHANGE_REPORT_KEY]: result,
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function airExtension(meta) {
|
|
72
|
+
if (!meta || typeof meta !== "object" || Array.isArray(meta))
|
|
73
|
+
return undefined;
|
|
74
|
+
const jetbrains = meta[JETBRAINS_META_KEY];
|
|
75
|
+
if (!jetbrains || typeof jetbrains !== "object" || Array.isArray(jetbrains))
|
|
76
|
+
return undefined;
|
|
77
|
+
const air = jetbrains[AIR_META_KEY];
|
|
78
|
+
return air && typeof air === "object" && !Array.isArray(air)
|
|
79
|
+
? air
|
|
80
|
+
: undefined;
|
|
81
|
+
}
|
|
82
|
+
export function createFileChangeAuditTurnState(requestId) {
|
|
83
|
+
return {
|
|
84
|
+
requestId,
|
|
85
|
+
phase: "requested",
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export function isFileChangeAuditReportPhase(state) {
|
|
89
|
+
return state?.phase === "collecting" || state?.phase === "finished";
|
|
90
|
+
}
|
|
91
|
+
export function isFileChangeAuditTool(toolName) {
|
|
92
|
+
return toolName === FILE_CHANGE_AUDIT_WIRE_TOOL_NAME;
|
|
93
|
+
}
|
|
94
|
+
export function containsFileChangeAuditMarker(text) {
|
|
95
|
+
return text.includes(`<${FILE_CHANGE_AUDIT_MARKER}>`);
|
|
96
|
+
}
|
|
97
|
+
export function createFileChangeAuditSupport(options) {
|
|
98
|
+
const workspace = normalizeWorkspace(options.cwd, options.additionalDirectories);
|
|
99
|
+
const finishUnavailable = async (state, reason) => {
|
|
100
|
+
// Claim the terminal outcome before the first await. The report tool, a
|
|
101
|
+
// Stop hook, cancellation, and stream teardown can race, but only the
|
|
102
|
+
// winner may publish for this request id. Publication remains fail-open:
|
|
103
|
+
// an audit transport failure must never hold the user prompt open.
|
|
104
|
+
if (state.phase === "finished")
|
|
105
|
+
return;
|
|
106
|
+
state.phase = "finished";
|
|
107
|
+
try {
|
|
108
|
+
await options.publish({
|
|
109
|
+
version: 1,
|
|
110
|
+
requestId: state.requestId,
|
|
111
|
+
status: "unavailable",
|
|
112
|
+
reason,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
options.logError(`Failed to publish unavailable report ${state.requestId}: ${error}`);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const tool = {
|
|
120
|
+
name: FILE_CHANGE_AUDIT_TOOL_NAME,
|
|
121
|
+
description: "Internal audit tool. Call it only when a stop-hook message explicitly requests the file-change audit.",
|
|
122
|
+
inputSchema: reportInputSchema,
|
|
123
|
+
_meta: {
|
|
124
|
+
"anthropic/alwaysLoad": true,
|
|
125
|
+
"claude/endTurn": true,
|
|
126
|
+
},
|
|
127
|
+
handler: async (report) => {
|
|
128
|
+
const state = options.getActiveState();
|
|
129
|
+
if (!state || state.phase !== "collecting") {
|
|
130
|
+
return {
|
|
131
|
+
isError: true,
|
|
132
|
+
content: [
|
|
133
|
+
{
|
|
134
|
+
type: "text",
|
|
135
|
+
text: `<${FILE_CHANGE_AUDIT_MARKER}>No file-change audit is active.</${FILE_CHANGE_AUDIT_MARKER}>`,
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// Flip before publishing: a client transport failure must not make the
|
|
141
|
+
// model retry the report and produce duplicates. Delivery is audit-only
|
|
142
|
+
// and fail-open; the normal turn must still finish.
|
|
143
|
+
state.phase = "finished";
|
|
144
|
+
const normalized = normalizeReportedPaths(report.paths, workspace);
|
|
145
|
+
const result = fitReportedAgentFileChangeReport({
|
|
146
|
+
version: 1,
|
|
147
|
+
requestId: state.requestId,
|
|
148
|
+
status: "reported",
|
|
149
|
+
paths: normalized.paths,
|
|
150
|
+
declaredComplete: report.complete && !normalized.truncated,
|
|
151
|
+
truncated: normalized.truncated,
|
|
152
|
+
...(report.uncertainty ? { uncertainty: report.uncertainty } : {}),
|
|
153
|
+
});
|
|
154
|
+
try {
|
|
155
|
+
await options.publish(result);
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
options.logError(`Failed to publish file-change report ${state.requestId}: ${error}`);
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
content: [
|
|
162
|
+
{
|
|
163
|
+
type: "text",
|
|
164
|
+
text: `<${FILE_CHANGE_AUDIT_MARKER}>File-change audit recorded.</${FILE_CHANGE_AUDIT_MARKER}>`,
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
structuredContent: result,
|
|
168
|
+
};
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
// canUseTool is not guaranteed to run for tools that the current permission
|
|
172
|
+
// mode auto-allows (notably bypassPermissions). A PreToolUse hook is the
|
|
173
|
+
// enforcement boundary that keeps the hidden continuation read-only in every
|
|
174
|
+
// mode: it can submit the report, but cannot inspect or mutate more files.
|
|
175
|
+
const preToolUseHook = async (input) => {
|
|
176
|
+
if (input.hook_event_name !== "PreToolUse")
|
|
177
|
+
return {};
|
|
178
|
+
const state = options.getActiveState();
|
|
179
|
+
const isReportTool = isFileChangeAuditTool(input.tool_name);
|
|
180
|
+
if (!isReportTool && !isFileChangeAuditReportPhase(state))
|
|
181
|
+
return {};
|
|
182
|
+
const allowReport = state?.phase === "collecting" && isReportTool;
|
|
183
|
+
return {
|
|
184
|
+
hookSpecificOutput: {
|
|
185
|
+
hookEventName: "PreToolUse",
|
|
186
|
+
permissionDecision: allowReport ? "allow" : "deny",
|
|
187
|
+
...(!allowReport
|
|
188
|
+
? {
|
|
189
|
+
permissionDecisionReason: "Only the internal file-change report is allowed during the audit.",
|
|
190
|
+
}
|
|
191
|
+
: {}),
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
};
|
|
195
|
+
const stopHook = async (input) => {
|
|
196
|
+
if (input.hook_event_name !== "Stop")
|
|
197
|
+
return {};
|
|
198
|
+
const state = options.getActiveState();
|
|
199
|
+
if (!state || state.phase === "finished")
|
|
200
|
+
return {};
|
|
201
|
+
// A Stop can be only a pause while a background generator is still
|
|
202
|
+
// running. Keep the request pending so a later final Stop can include its
|
|
203
|
+
// writes instead of declaring a prematurely complete path set.
|
|
204
|
+
if (state.phase === "requested" && (input.background_tasks?.length ?? 0) > 0)
|
|
205
|
+
return {};
|
|
206
|
+
if (state.phase === "collecting" || input.stop_hook_active) {
|
|
207
|
+
await finishUnavailable(state, "notReported");
|
|
208
|
+
return {};
|
|
209
|
+
}
|
|
210
|
+
// Set the phase before returning the continuation so every following SDK
|
|
211
|
+
// message is hidden even if the next stream starts immediately.
|
|
212
|
+
state.phase = "collecting";
|
|
213
|
+
return {
|
|
214
|
+
hookSpecificOutput: {
|
|
215
|
+
hookEventName: "Stop",
|
|
216
|
+
additionalContext: `<${FILE_CHANGE_AUDIT_MARKER}>` +
|
|
217
|
+
`Before stopping, call ${FILE_CHANGE_AUDIT_WIRE_TOOL_NAME} exactly once. ` +
|
|
218
|
+
"Report every workspace file changed during this user turn, including files changed " +
|
|
219
|
+
"by commands, generators, version-control operations, and child processes. " +
|
|
220
|
+
"Do not call any other tool and do not emit user-facing prose. " +
|
|
221
|
+
"Set complete to false and explain uncertainty when you are not sure the list is complete." +
|
|
222
|
+
`</${FILE_CHANGE_AUDIT_MARKER}>`,
|
|
223
|
+
},
|
|
224
|
+
};
|
|
225
|
+
};
|
|
226
|
+
return {
|
|
227
|
+
mcpServer: createSdkMcpServer({
|
|
228
|
+
name: FILE_CHANGE_AUDIT_SERVER_NAME,
|
|
229
|
+
version: "1.0.0",
|
|
230
|
+
tools: [tool],
|
|
231
|
+
alwaysLoad: true,
|
|
232
|
+
}),
|
|
233
|
+
preToolUseHook,
|
|
234
|
+
stopHook,
|
|
235
|
+
finishUnavailable,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
function normalizeWorkspace(cwd, additionalDirectories) {
|
|
239
|
+
const normalizedCwd = canonicalizeWorkspaceRoot(path.resolve(cwd));
|
|
240
|
+
const seen = new Set([pathKey(normalizedCwd)]);
|
|
241
|
+
const normalizedAdditionalDirectories = [];
|
|
242
|
+
for (const directory of additionalDirectories) {
|
|
243
|
+
const normalized = canonicalizeWorkspaceRoot(path.resolve(normalizedCwd, directory));
|
|
244
|
+
const key = pathKey(normalized);
|
|
245
|
+
if (seen.has(key))
|
|
246
|
+
continue;
|
|
247
|
+
seen.add(key);
|
|
248
|
+
normalizedAdditionalDirectories.push(normalized);
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
cwd: normalizedCwd,
|
|
252
|
+
additionalDirectories: normalizedAdditionalDirectories,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
function normalizeReportedPaths(reportedPaths, workspace) {
|
|
256
|
+
const roots = [workspace.cwd, ...workspace.additionalDirectories];
|
|
257
|
+
const seen = new Set();
|
|
258
|
+
const result = [];
|
|
259
|
+
let totalBytes = 0;
|
|
260
|
+
let truncated = false;
|
|
261
|
+
for (const reportedPath of reportedPaths) {
|
|
262
|
+
if (reportedPath.trim().length === 0 ||
|
|
263
|
+
reportedPath.length > MAX_REPORTED_PATH_LENGTH ||
|
|
264
|
+
hasControlCharacter(reportedPath)) {
|
|
265
|
+
truncated = true;
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
let normalized;
|
|
269
|
+
try {
|
|
270
|
+
normalized = canonicalizeReportedPath(path.resolve(workspace.cwd, reportedPath));
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
truncated = true;
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
276
|
+
if (normalized.length > MAX_REPORTED_PATH_LENGTH || hasControlCharacter(normalized)) {
|
|
277
|
+
truncated = true;
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
if (!roots.some((root) => isWithinRoot(normalized, root))) {
|
|
281
|
+
truncated = true;
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
const key = pathKey(normalized);
|
|
285
|
+
if (roots.some((root) => pathKey(root) === key)) {
|
|
286
|
+
truncated = true;
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
if (seen.has(key)) {
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
const pathBytes = Buffer.byteLength(normalized, "utf8");
|
|
293
|
+
if (result.length >= MAX_REPORTED_PATHS ||
|
|
294
|
+
totalBytes + pathBytes > AGENT_FILE_CHANGE_REPORT_MAX_BYTES) {
|
|
295
|
+
truncated = true;
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
seen.add(key);
|
|
299
|
+
result.push(normalized);
|
|
300
|
+
totalBytes += pathBytes;
|
|
301
|
+
}
|
|
302
|
+
return { paths: result, truncated };
|
|
303
|
+
}
|
|
304
|
+
/** Keep the complete serialized report within AIR's wire limit. */
|
|
305
|
+
function fitReportedAgentFileChangeReport(report) {
|
|
306
|
+
const paths = [...report.paths];
|
|
307
|
+
let fitted = report;
|
|
308
|
+
while (Buffer.byteLength(JSON.stringify(fitted), "utf8") > AGENT_FILE_CHANGE_REPORT_MAX_BYTES) {
|
|
309
|
+
if (paths.length === 0) {
|
|
310
|
+
// The fixed fields and bounded uncertainty are far below the cap. Keep
|
|
311
|
+
// this loud if the wire contract changes without updating this helper.
|
|
312
|
+
throw new Error("Agent file-change report exceeds the wire limit without paths");
|
|
313
|
+
}
|
|
314
|
+
paths.pop();
|
|
315
|
+
fitted = {
|
|
316
|
+
...report,
|
|
317
|
+
paths: [...paths],
|
|
318
|
+
declaredComplete: false,
|
|
319
|
+
truncated: true,
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
return fitted;
|
|
323
|
+
}
|
|
324
|
+
function isWithinRoot(candidate, root) {
|
|
325
|
+
const relative = path.relative(root, candidate);
|
|
326
|
+
return !path.isAbsolute(relative) && !relative.startsWith(`..${path.sep}`) && relative !== "..";
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Resolve filesystem aliases in a workspace root, including macOS' /tmp ->
|
|
330
|
+
* /private/tmp alias. For a root that does not exist yet, resolve its nearest
|
|
331
|
+
* existing ancestor and retain the missing suffix.
|
|
332
|
+
*/
|
|
333
|
+
function canonicalizeWorkspaceRoot(value) {
|
|
334
|
+
return canonicalizeFromExistingAncestor(value);
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Canonicalize the parent but not the leaf itself. A changed path may be
|
|
338
|
+
* deleted, or it may be a symlink whose node (rather than target) changed.
|
|
339
|
+
*/
|
|
340
|
+
function canonicalizeReportedPath(value) {
|
|
341
|
+
const parent = canonicalizeFromExistingAncestor(path.dirname(value));
|
|
342
|
+
return path.resolve(parent, path.basename(value));
|
|
343
|
+
}
|
|
344
|
+
function canonicalizeFromExistingAncestor(value) {
|
|
345
|
+
const original = path.resolve(value);
|
|
346
|
+
let current = original;
|
|
347
|
+
const missingSegments = [];
|
|
348
|
+
while (true) {
|
|
349
|
+
try {
|
|
350
|
+
const canonical = fs.realpathSync.native(current);
|
|
351
|
+
return path.resolve(canonical, ...missingSegments.reverse());
|
|
352
|
+
}
|
|
353
|
+
catch (error) {
|
|
354
|
+
if (!isMissingPathError(error))
|
|
355
|
+
return original;
|
|
356
|
+
}
|
|
357
|
+
const parent = path.dirname(current);
|
|
358
|
+
if (parent === current)
|
|
359
|
+
return original;
|
|
360
|
+
missingSegments.push(path.basename(current));
|
|
361
|
+
current = parent;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
function isMissingPathError(error) {
|
|
365
|
+
if (typeof error !== "object" || error === null || !("code" in error))
|
|
366
|
+
return false;
|
|
367
|
+
return error.code === "ENOENT" || error.code === "ENOTDIR";
|
|
368
|
+
}
|
|
369
|
+
function pathKey(value) {
|
|
370
|
+
return process.platform === "win32" ? value.toLowerCase() : value;
|
|
371
|
+
}
|
|
372
|
+
function hasControlCharacter(value) {
|
|
373
|
+
for (let index = 0; index < value.length; index++) {
|
|
374
|
+
const code = value.charCodeAt(index);
|
|
375
|
+
if (code <= 0x1f || (code >= 0x7f && code <= 0x9f))
|
|
376
|
+
return true;
|
|
377
|
+
}
|
|
378
|
+
return false;
|
|
379
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ClientCapabilities, SessionNotification } from "@agentclientprotocol/sdk";
|
|
2
2
|
import { getSessionMessages, type SDKAssistantMessageError } from "@anthropic-ai/claude-agent-sdk";
|
|
3
|
-
export declare function airSessionFailureCapabilityMeta(): {
|
|
3
|
+
export declare function airSessionFailureCapabilityMeta(...additionalCapabilities: string[]): {
|
|
4
4
|
jetbrains: {
|
|
5
5
|
air: {
|
|
6
6
|
version: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-failure-extension.d.ts","sourceRoot":"","sources":["../src/session-failure-extension.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EACL,kBAAkB,EAClB,KAAK,wBAAwB,EAE9B,MAAM,gCAAgC,CAAC;AAUxC,wBAAgB,+BAA+B;;;;;;;
|
|
1
|
+
{"version":3,"file":"session-failure-extension.d.ts","sourceRoot":"","sources":["../src/session-failure-extension.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,12 +6,12 @@ const AIR_EXTENSION_VERSION_KEY = "version";
|
|
|
6
6
|
const AIR_EXTENSION_CAPABILITIES_KEY = "capabilities";
|
|
7
7
|
const AIR_SESSION_FAILURE_KEY = "sessionFailure";
|
|
8
8
|
const AIR_EXTENSION_VERSION = 1;
|
|
9
|
-
export function airSessionFailureCapabilityMeta() {
|
|
9
|
+
export function airSessionFailureCapabilityMeta(...additionalCapabilities) {
|
|
10
10
|
return {
|
|
11
11
|
[JETBRAINS_META_KEY]: {
|
|
12
12
|
[AIR_META_KEY]: {
|
|
13
13
|
[AIR_EXTENSION_VERSION_KEY]: AIR_EXTENSION_VERSION,
|
|
14
|
-
[AIR_EXTENSION_CAPABILITIES_KEY]: [AIR_SESSION_FAILURE_KEY],
|
|
14
|
+
[AIR_EXTENSION_CAPABILITIES_KEY]: [AIR_SESSION_FAILURE_KEY, ...additionalCapabilities],
|
|
15
15
|
},
|
|
16
16
|
},
|
|
17
17
|
};
|
package/package.json
CHANGED