@agentclientprotocol/claude-agent-acp 0.32.0 → 0.33.1
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 +2 -1
- package/dist/acp-agent.d.ts.map +1 -1
- package/dist/acp-agent.js +85 -11
- package/dist/settings.d.ts +1 -0
- package/dist/settings.d.ts.map +1 -1
- package/dist/settings.js +8 -0
- package/package.json +4 -4
package/dist/acp-agent.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Agent, AgentSideConnection, AuthenticateRequest, CancelNotification, ClientCapabilities, ForkSessionRequest, ForkSessionResponse, InitializeRequest, InitializeResponse, ListSessionsRequest, ListSessionsResponse, LoadSessionRequest, LoadSessionResponse, NewSessionRequest, NewSessionResponse, PromptRequest, PromptResponse, ReadTextFileRequest, ReadTextFileResponse, ResumeSessionRequest, ResumeSessionResponse, SessionConfigOption, SessionModelState, SessionModeState, SessionNotification, SetSessionConfigOptionRequest, SetSessionConfigOptionResponse, SetSessionModelRequest, SetSessionModelResponse, SetSessionModeRequest, SetSessionModeResponse, CloseSessionRequest, CloseSessionResponse, TerminalHandle, TerminalOutputResponse, WriteTextFileRequest, WriteTextFileResponse } from "@agentclientprotocol/sdk";
|
|
2
|
-
import { CanUseTool, ModelInfo, Options, PermissionMode, PermissionUpdate, Query, SDKPartialAssistantMessage, SDKUserMessage } from "@anthropic-ai/claude-agent-sdk";
|
|
2
|
+
import { CanUseTool, ModelInfo, Options, PermissionMode, PermissionUpdate, Query, SDKMessageOrigin, SDKPartialAssistantMessage, SDKUserMessage } from "@anthropic-ai/claude-agent-sdk";
|
|
3
3
|
import { ContentBlockParam } from "@anthropic-ai/sdk/resources";
|
|
4
4
|
import { BetaContentBlock, BetaRawContentBlockDelta } from "@anthropic-ai/sdk/resources/beta.mjs";
|
|
5
5
|
import { SettingsManager } from "./settings.js";
|
|
@@ -58,6 +58,7 @@ type BackgroundTerminal = {
|
|
|
58
58
|
export type SDKMessageFilter = {
|
|
59
59
|
type: string;
|
|
60
60
|
subtype?: string;
|
|
61
|
+
origin?: SDKMessageOrigin["kind"];
|
|
61
62
|
};
|
|
62
63
|
/**
|
|
63
64
|
* Extra metadata that can be given when creating a new session.
|
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
|
@@ -558,6 +558,11 @@ export class ClaudeAcpAgent {
|
|
|
558
558
|
if (matchingModelUsage) {
|
|
559
559
|
session.contextWindowSize = matchingModelUsage.contextWindow;
|
|
560
560
|
}
|
|
561
|
+
// Task-notification followups are autonomous work triggered by a
|
|
562
|
+
// task-notification system message, not by the user's prompt.
|
|
563
|
+
// They should not influence the user-turn lifecycle (stop reason,
|
|
564
|
+
// slash-command output forwarding) but their cost is real.
|
|
565
|
+
const isTaskNotification = message.origin?.kind === "task-notification";
|
|
561
566
|
// Send usage_update notification
|
|
562
567
|
if (lastAssistantTotalUsage !== null) {
|
|
563
568
|
await this.client.sessionUpdate({
|
|
@@ -570,11 +575,16 @@ export class ClaudeAcpAgent {
|
|
|
570
575
|
amount: message.total_cost_usd,
|
|
571
576
|
currency: "USD",
|
|
572
577
|
},
|
|
578
|
+
...(message.origin && {
|
|
579
|
+
_meta: { "_claude/origin": message.origin },
|
|
580
|
+
}),
|
|
573
581
|
},
|
|
574
582
|
});
|
|
575
583
|
}
|
|
576
584
|
if (session.cancelled) {
|
|
577
|
-
|
|
585
|
+
if (!isTaskNotification) {
|
|
586
|
+
stopReason = "cancelled";
|
|
587
|
+
}
|
|
578
588
|
break;
|
|
579
589
|
}
|
|
580
590
|
switch (message.subtype) {
|
|
@@ -583,7 +593,9 @@ export class ClaudeAcpAgent {
|
|
|
583
593
|
throw RequestError.authRequired();
|
|
584
594
|
}
|
|
585
595
|
if (message.stop_reason === "max_tokens") {
|
|
586
|
-
|
|
596
|
+
if (!isTaskNotification) {
|
|
597
|
+
stopReason = "max_tokens";
|
|
598
|
+
}
|
|
587
599
|
break;
|
|
588
600
|
}
|
|
589
601
|
if (message.is_error) {
|
|
@@ -591,7 +603,9 @@ export class ClaudeAcpAgent {
|
|
|
591
603
|
}
|
|
592
604
|
// For local-only commands (no model invocation), the result
|
|
593
605
|
// text is the command output — forward it to the client.
|
|
594
|
-
|
|
606
|
+
// Task-notification followups never originate from a user
|
|
607
|
+
// slash command, so skip the forwarding for them.
|
|
608
|
+
if (isLocalOnlyCommand && !isTaskNotification) {
|
|
595
609
|
for (const notification of toAcpNotifications(message.result, "assistant", params.sessionId, this.toolUseCache, this.client, this.logger)) {
|
|
596
610
|
await this.client.sessionUpdate(notification);
|
|
597
611
|
}
|
|
@@ -600,13 +614,17 @@ export class ClaudeAcpAgent {
|
|
|
600
614
|
}
|
|
601
615
|
case "error_during_execution": {
|
|
602
616
|
if (message.stop_reason === "max_tokens") {
|
|
603
|
-
|
|
617
|
+
if (!isTaskNotification) {
|
|
618
|
+
stopReason = "max_tokens";
|
|
619
|
+
}
|
|
604
620
|
break;
|
|
605
621
|
}
|
|
606
622
|
if (message.is_error) {
|
|
607
623
|
throw RequestError.internalError(errorKindData(lastAssistantError), message.errors.join(", ") || message.subtype);
|
|
608
624
|
}
|
|
609
|
-
|
|
625
|
+
if (!isTaskNotification) {
|
|
626
|
+
stopReason = "end_turn";
|
|
627
|
+
}
|
|
610
628
|
break;
|
|
611
629
|
}
|
|
612
630
|
case "error_max_budget_usd":
|
|
@@ -615,7 +633,9 @@ export class ClaudeAcpAgent {
|
|
|
615
633
|
if (message.is_error) {
|
|
616
634
|
throw RequestError.internalError(errorKindData(lastAssistantError), message.errors.join(", ") || message.subtype);
|
|
617
635
|
}
|
|
618
|
-
|
|
636
|
+
if (!isTaskNotification) {
|
|
637
|
+
stopReason = "max_turn_requests";
|
|
638
|
+
}
|
|
619
639
|
break;
|
|
620
640
|
default:
|
|
621
641
|
unreachable(message, this.logger);
|
|
@@ -1437,10 +1457,19 @@ export class ClaudeAcpAgent {
|
|
|
1437
1457
|
!this.gatewayAuthMeta) {
|
|
1438
1458
|
throw RequestError.authRequired(undefined, "This integration does not support using claude.ai subscriptions.");
|
|
1439
1459
|
}
|
|
1440
|
-
|
|
1460
|
+
// Apply user's `availableModels` allowlist from settings.json before any
|
|
1461
|
+
// downstream model handling. The SDK only enforces this allowlist in its
|
|
1462
|
+
// own UI, not in `initializationResult.models`, so we filter here to keep
|
|
1463
|
+
// configOptions, the current-model resolver, and the stored modelInfos
|
|
1464
|
+
// consistent with what the user configured.
|
|
1465
|
+
const settingsAvailableModels = settingsManager.getSettings().availableModels;
|
|
1466
|
+
const allowedModels = Array.isArray(settingsAvailableModels)
|
|
1467
|
+
? applyAvailableModelsAllowlist(initializationResult.models, settingsAvailableModels)
|
|
1468
|
+
: initializationResult.models;
|
|
1469
|
+
const models = await getAvailableModels(q, allowedModels, settingsManager, this.logger);
|
|
1441
1470
|
// Gate `auto` (and future model-specific modes) on the resolved model's
|
|
1442
1471
|
// `ModelInfo`. See `buildAvailableModes` for the canonical SDK signal.
|
|
1443
|
-
const currentModelInfo =
|
|
1472
|
+
const currentModelInfo = allowedModels.find((m) => m.value === models.currentModelId);
|
|
1444
1473
|
const availableModes = buildAvailableModes(currentModelInfo);
|
|
1445
1474
|
// Clamp `permissionMode` if the resolved session does not offer it. The
|
|
1446
1475
|
// common case is `permissions.defaultMode: "auto"` resolving to a model
|
|
@@ -1473,7 +1502,7 @@ export class ClaudeAcpAgent {
|
|
|
1473
1502
|
currentModeId: effectiveMode,
|
|
1474
1503
|
availableModes,
|
|
1475
1504
|
};
|
|
1476
|
-
const configOptions = buildConfigOptions(modes, models,
|
|
1505
|
+
const configOptions = buildConfigOptions(modes, models, allowedModels, settingsManager.getSettings().effortLevel);
|
|
1477
1506
|
// Apply the initial effort level to the SDK so it matches the UI default
|
|
1478
1507
|
const initialEffort = configOptions.find((o) => o.id === "effort");
|
|
1479
1508
|
if (initialEffort && typeof initialEffort.currentValue === "string") {
|
|
@@ -1496,7 +1525,7 @@ export class ClaudeAcpAgent {
|
|
|
1496
1525
|
},
|
|
1497
1526
|
modes,
|
|
1498
1527
|
models,
|
|
1499
|
-
modelInfos:
|
|
1528
|
+
modelInfos: allowedModels,
|
|
1500
1529
|
configOptions,
|
|
1501
1530
|
promptRunning: false,
|
|
1502
1531
|
pendingMessages: new Map(),
|
|
@@ -1518,7 +1547,9 @@ function shouldEmitRawMessage(config, message) {
|
|
|
1518
1547
|
return true;
|
|
1519
1548
|
if (config === false)
|
|
1520
1549
|
return false;
|
|
1521
|
-
return config.some((f) => f.type === message.type &&
|
|
1550
|
+
return config.some((f) => f.type === message.type &&
|
|
1551
|
+
(f.subtype === undefined || f.subtype === message.subtype) &&
|
|
1552
|
+
(f.origin === undefined || f.origin === message.origin?.kind));
|
|
1522
1553
|
}
|
|
1523
1554
|
function sessionUsage(session) {
|
|
1524
1555
|
return {
|
|
@@ -1764,6 +1795,49 @@ function resolveSettingsModel(models, settingsModel, logger) {
|
|
|
1764
1795
|
}
|
|
1765
1796
|
return resolveModelPreference(models, settingsModel);
|
|
1766
1797
|
}
|
|
1798
|
+
/**
|
|
1799
|
+
* Restrict the SDK's model list to the user's `availableModels` allowlist
|
|
1800
|
+
* (already merged-and-deduped across settings sources by `SettingsManager`).
|
|
1801
|
+
* The user's exact entries become the model IDs surfaced via configOptions
|
|
1802
|
+
* and passed to `setModel`, which prevents Claude Code from silently
|
|
1803
|
+
* substituting a date-pinned variant (e.g. `haiku` →
|
|
1804
|
+
* `claude-haiku-4-5-20251001`) that the user may not have access to.
|
|
1805
|
+
*
|
|
1806
|
+
* Display info and capability flags are copied from the closest SDK match so
|
|
1807
|
+
* the UI still renders sensible names and effort levels.
|
|
1808
|
+
*
|
|
1809
|
+
* Semantics from https://code.claude.com/docs/en/model-config#restrict-model-selection:
|
|
1810
|
+
* - `undefined` is handled by the caller (no allowlist applied).
|
|
1811
|
+
* - The Default option is unaffected by `availableModels` — it always remains
|
|
1812
|
+
* available, even when the allowlist is `[]`.
|
|
1813
|
+
*/
|
|
1814
|
+
function applyAvailableModelsAllowlist(sdkModels, allowlist) {
|
|
1815
|
+
// Default is always preserved per the docs. Synthesize one if the SDK
|
|
1816
|
+
// didn't surface it so downstream code (e.g. `getAvailableModels` picking
|
|
1817
|
+
// `models[0]` as a fallback) still has something to work with.
|
|
1818
|
+
const defaultModel = sdkModels.find((m) => m.value === "default") ?? {
|
|
1819
|
+
value: "default",
|
|
1820
|
+
displayName: "Default",
|
|
1821
|
+
description: "",
|
|
1822
|
+
};
|
|
1823
|
+
const result = [defaultModel];
|
|
1824
|
+
const seen = new Set([defaultModel.value]);
|
|
1825
|
+
const sdkModelsWithoutDefault = sdkModels.filter((m) => m.value !== "default");
|
|
1826
|
+
for (const entry of allowlist) {
|
|
1827
|
+
const trimmed = entry.trim();
|
|
1828
|
+
if (!trimmed || seen.has(trimmed))
|
|
1829
|
+
continue;
|
|
1830
|
+
const sdkMatch = resolveModelPreference(sdkModelsWithoutDefault, trimmed);
|
|
1831
|
+
if (sdkMatch) {
|
|
1832
|
+
result.push({ ...sdkMatch, value: trimmed });
|
|
1833
|
+
}
|
|
1834
|
+
else {
|
|
1835
|
+
result.push({ value: trimmed, displayName: trimmed, description: "" });
|
|
1836
|
+
}
|
|
1837
|
+
seen.add(trimmed);
|
|
1838
|
+
}
|
|
1839
|
+
return result;
|
|
1840
|
+
}
|
|
1767
1841
|
async function getAvailableModels(query, models, settingsManager, logger) {
|
|
1768
1842
|
const settings = settingsManager.getSettings();
|
|
1769
1843
|
let currentModel = models[0];
|
package/dist/settings.d.ts
CHANGED
package/dist/settings.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../src/settings.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AA2BD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAW/C;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE;QAAE,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;QAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;KAAE,CAAC;CAC7E;AAED;;;;;;;;;;GAUG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,YAAY,CAA0B;IAC9C,OAAO,CAAC,eAAe,CAA0B;IACjD,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,kBAAkB,CAA0B;IACpD,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,QAAQ,CAAC,CAAa;IAC9B,OAAO,CAAC,MAAM,CAAqE;IACnF,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,WAAW,CAA8B;gBAErC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB;IAMzD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBjC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAI9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;YACW,eAAe;IAgB7B;;;;OAIG;IACH,OAAO,CAAC,aAAa;IA2CrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAkCrB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;OAEG;IACH,WAAW,IAAI,kBAAkB;IAIjC;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxC;;OAEG;IACH,OAAO,IAAI,IAAI;CAehB"}
|
package/dist/settings.js
CHANGED
|
@@ -141,6 +141,14 @@ export class SettingsManager {
|
|
|
141
141
|
if (settings.effortLevel !== undefined) {
|
|
142
142
|
merged.effortLevel = settings.effortLevel;
|
|
143
143
|
}
|
|
144
|
+
if (settings.availableModels !== undefined) {
|
|
145
|
+
// Per Claude Code docs: "When `availableModels` is set at multiple
|
|
146
|
+
// levels, such as user settings and project settings, arrays are
|
|
147
|
+
// merged and deduplicated."
|
|
148
|
+
// https://code.claude.com/docs/en/model-config#merge-behavior
|
|
149
|
+
const combined = [...(merged.availableModels ?? []), ...settings.availableModels];
|
|
150
|
+
merged.availableModels = Array.from(new Set(combined));
|
|
151
|
+
}
|
|
144
152
|
if (settings.permissions?.defaultMode !== undefined) {
|
|
145
153
|
merged.permissions = {
|
|
146
154
|
...merged.permissions,
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.33.1",
|
|
7
7
|
"description": "An ACP-compatible coding agent powered by the Claude Agent SDK (TypeScript)",
|
|
8
8
|
"main": "dist/lib.js",
|
|
9
9
|
"types": "dist/lib.d.ts",
|
|
@@ -61,15 +61,15 @@
|
|
|
61
61
|
"license": "Apache-2.0",
|
|
62
62
|
"dependencies": {
|
|
63
63
|
"@agentclientprotocol/sdk": "0.21.0",
|
|
64
|
-
"@anthropic-ai/claude-agent-sdk": "0.2.
|
|
64
|
+
"@anthropic-ai/claude-agent-sdk": "0.2.132",
|
|
65
65
|
"zod": "^3.25.0 || ^4.0.0"
|
|
66
66
|
},
|
|
67
67
|
"devDependencies": {
|
|
68
68
|
"@anthropic-ai/sdk": "0.89.0",
|
|
69
69
|
"@eslint/js": "10.0.1",
|
|
70
70
|
"@types/node": "25.6.0",
|
|
71
|
-
"@typescript-eslint/eslint-plugin": "8.59.
|
|
72
|
-
"@typescript-eslint/parser": "8.59.
|
|
71
|
+
"@typescript-eslint/eslint-plugin": "8.59.2",
|
|
72
|
+
"@typescript-eslint/parser": "8.59.2",
|
|
73
73
|
"eslint": "10.3.0",
|
|
74
74
|
"eslint-config-prettier": "10.1.8",
|
|
75
75
|
"globals": "17.6.0",
|