@agentclientprotocol/claude-agent-acp 0.70.0 → 0.72.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.
Files changed (76) hide show
  1. package/README.md +10 -9
  2. package/dist/acp-agent.d.ts +136 -49
  3. package/dist/acp-agent.d.ts.map +1 -1
  4. package/dist/acp-agent.js +1304 -724
  5. package/dist/acp-subagents.d.ts +82 -0
  6. package/dist/acp-subagents.d.ts.map +1 -0
  7. package/dist/acp-subagents.js +13 -0
  8. package/dist/air-extension.d.ts +23 -0
  9. package/dist/air-extension.d.ts.map +1 -0
  10. package/dist/air-extension.js +63 -0
  11. package/dist/async-tasks.d.ts +109 -0
  12. package/dist/async-tasks.d.ts.map +1 -0
  13. package/dist/async-tasks.js +613 -0
  14. package/dist/clear-context-coordinator.d.ts +60 -0
  15. package/dist/clear-context-coordinator.d.ts.map +1 -0
  16. package/dist/clear-context-coordinator.js +80 -0
  17. package/dist/exit-plan.d.ts +42 -0
  18. package/dist/exit-plan.d.ts.map +1 -0
  19. package/dist/exit-plan.js +154 -0
  20. package/dist/file-change-audit.d.ts.map +1 -1
  21. package/dist/file-change-audit.js +4 -33
  22. package/dist/fork-session.d.ts +12 -0
  23. package/dist/fork-session.d.ts.map +1 -0
  24. package/dist/fork-session.js +41 -0
  25. package/dist/native-subagents.d.ts +71 -0
  26. package/dist/native-subagents.d.ts.map +1 -0
  27. package/dist/native-subagents.js +422 -0
  28. package/dist/permissions/effects.d.ts +19 -0
  29. package/dist/permissions/effects.d.ts.map +1 -0
  30. package/dist/permissions/effects.js +166 -0
  31. package/dist/permissions/modes.d.ts +8 -0
  32. package/dist/permissions/modes.d.ts.map +1 -0
  33. package/dist/permissions/modes.js +41 -0
  34. package/dist/permissions/normalization.d.ts +6 -0
  35. package/dist/permissions/normalization.d.ts.map +1 -0
  36. package/dist/permissions/normalization.js +100 -0
  37. package/dist/permissions/options/filesystem.d.ts +9 -0
  38. package/dist/permissions/options/filesystem.d.ts.map +1 -0
  39. package/dist/permissions/options/filesystem.js +124 -0
  40. package/dist/permissions/options/shared.d.ts +39 -0
  41. package/dist/permissions/options/shared.d.ts.map +1 -0
  42. package/dist/permissions/options/shared.js +64 -0
  43. package/dist/permissions/options/shell.d.ts +5 -0
  44. package/dist/permissions/options/shell.d.ts.map +1 -0
  45. package/dist/permissions/options/shell.js +100 -0
  46. package/dist/permissions/options/tools.d.ts +11 -0
  47. package/dist/permissions/options/tools.d.ts.map +1 -0
  48. package/dist/permissions/options/tools.js +135 -0
  49. package/dist/permissions/options.d.ts +5 -0
  50. package/dist/permissions/options.d.ts.map +1 -0
  51. package/dist/permissions/options.js +60 -0
  52. package/dist/permissions/presentation.d.ts +15 -0
  53. package/dist/permissions/presentation.d.ts.map +1 -0
  54. package/dist/permissions/presentation.js +83 -0
  55. package/dist/permissions/response.d.ts +11 -0
  56. package/dist/permissions/response.d.ts.map +1 -0
  57. package/dist/permissions/response.js +19 -0
  58. package/dist/session-config-ids.d.ts +5 -0
  59. package/dist/session-config-ids.d.ts.map +1 -0
  60. package/dist/session-config-ids.js +4 -0
  61. package/dist/session-failure-extension.d.ts +2 -24
  62. package/dist/session-failure-extension.d.ts.map +1 -1
  63. package/dist/session-failure-extension.js +13 -40
  64. package/dist/session-mode.d.ts +66 -0
  65. package/dist/session-mode.d.ts.map +1 -0
  66. package/dist/session-mode.js +234 -0
  67. package/dist/session-titles.d.ts +77 -0
  68. package/dist/session-titles.d.ts.map +1 -0
  69. package/dist/session-titles.js +199 -0
  70. package/dist/tool-result-meta.d.ts +8 -0
  71. package/dist/tool-result-meta.d.ts.map +1 -0
  72. package/dist/tool-result-meta.js +19 -0
  73. package/dist/tools.d.ts +6 -1
  74. package/dist/tools.d.ts.map +1 -1
  75. package/dist/tools.js +144 -20
  76. package/package.json +12 -12
@@ -0,0 +1,60 @@
1
+ import { buildEditPermissionOptions, buildGlobPermissionOptions, buildGrepPermissionOptions, buildNotebookEditPermissionOptions, buildReadPermissionOptions, buildWritePermissionOptions, } from "./options/filesystem.js";
2
+ import { buildBashPermissionOptions, buildPowerShellPermissionOptions } from "./options/shell.js";
3
+ import { buildComputerUseMcpPermissionOptions, buildEnterPlanModePermissionOptions, buildExitPlanModePermissionOptions, buildFallbackPermissionOptions, buildSandboxNetworkPermissionOptions, buildSkillPermissionOptions, buildWebFetchPermissionOptions, isComputerUseMcpTool, } from "./options/tools.js";
4
+ export { PERMISSION_OPTION_ID } from "./options/shared.js";
5
+ export function buildClaudePermissionOptions(context) {
6
+ return buildUnsortedClaudePermissionOptions(context).sort((left, right) => permissionOptionOrder(left) - permissionOptionOrder(right));
7
+ }
8
+ function buildUnsortedClaudePermissionOptions(context) {
9
+ if (isComputerUseMcpTool(context.toolName)) {
10
+ return buildComputerUseMcpPermissionOptions(context);
11
+ }
12
+ switch (context.toolName) {
13
+ case "AskUserQuestion":
14
+ throw new Error("AskUserQuestion must be handled by ACP elicitation, not permission options");
15
+ case "Bash":
16
+ return buildBashPermissionOptions(context);
17
+ case "PowerShell":
18
+ return buildPowerShellPermissionOptions(context);
19
+ case "Read":
20
+ return buildReadPermissionOptions(context);
21
+ case "Glob":
22
+ return buildGlobPermissionOptions(context);
23
+ case "Grep":
24
+ return buildGrepPermissionOptions(context);
25
+ case "Edit":
26
+ return buildEditPermissionOptions(context);
27
+ case "Write":
28
+ return buildWritePermissionOptions(context);
29
+ case "NotebookEdit":
30
+ return buildNotebookEditPermissionOptions(context);
31
+ case "WebFetch":
32
+ return buildWebFetchPermissionOptions(context);
33
+ case "Skill":
34
+ return buildSkillPermissionOptions(context);
35
+ case "EnterPlanMode":
36
+ return buildEnterPlanModePermissionOptions();
37
+ case "ExitPlanMode":
38
+ return buildExitPlanModePermissionOptions(context);
39
+ case "SandboxNetworkAccess":
40
+ return buildSandboxNetworkPermissionOptions(context);
41
+ case "WebSearch":
42
+ case "Agent":
43
+ case "Task":
44
+ default:
45
+ return buildFallbackPermissionOptions(context);
46
+ }
47
+ }
48
+ function permissionOptionOrder(option) {
49
+ switch (option.kind) {
50
+ case "allow_once":
51
+ return 0;
52
+ case "allow_always":
53
+ return 1;
54
+ case "reject_once":
55
+ case "reject_always":
56
+ return 3;
57
+ default:
58
+ return 2;
59
+ }
60
+ }
@@ -0,0 +1,15 @@
1
+ import type { RequestPermissionRequest } from "@agentclientprotocol/sdk";
2
+ export interface ClaudePermissionPresentationInput {
3
+ toolName: string;
4
+ input: Record<string, unknown>;
5
+ toolUseID: string;
6
+ cwd?: string;
7
+ supportsTerminalOutput?: boolean;
8
+ blockedPath?: string;
9
+ title?: string;
10
+ displayName?: string;
11
+ description?: string;
12
+ decisionReason?: string;
13
+ }
14
+ export declare function buildClaudePermissionPresentation(value: ClaudePermissionPresentationInput): Pick<RequestPermissionRequest, "toolCall" | "_meta">;
15
+ //# sourceMappingURL=presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation.d.ts","sourceRoot":"","sources":["../../src/permissions/presentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAoB,MAAM,0BAA0B,CAAC;AAG3F,MAAM,WAAW,iCAAiC;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAqCD,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,iCAAiC,GACvC,IAAI,CAAC,wBAAwB,EAAE,UAAU,GAAG,OAAO,CAAC,CA0DtD"}
@@ -0,0 +1,83 @@
1
+ import { toolInfoFromToolUse } from "../tools.js";
2
+ function humanText(value, maxLength, singleLine = false) {
3
+ if (typeof value !== "string")
4
+ return undefined;
5
+ const withoutControls = Array.from(value)
6
+ .filter((character) => {
7
+ const code = character.charCodeAt(0);
8
+ return !(code <= 0x08 ||
9
+ code === 0x0b ||
10
+ code === 0x0c ||
11
+ (code >= 0x0e && code <= 0x1f) ||
12
+ code === 0x7f);
13
+ })
14
+ .join("");
15
+ const normalized = singleLine
16
+ ? withoutControls.replace(/\s+/gu, " ").trim()
17
+ : withoutControls.trim();
18
+ return normalized && normalized.length <= maxLength ? normalized : undefined;
19
+ }
20
+ function compactText(value) {
21
+ return humanText(value, 160, true);
22
+ }
23
+ function withBlockedPath(locations, blockedPath) {
24
+ const path = humanText(blockedPath, 4_096, true);
25
+ if (!path)
26
+ return locations;
27
+ const result = [...(locations ?? [])];
28
+ if (!result.some((location) => location.path === path))
29
+ result.push({ path });
30
+ return result;
31
+ }
32
+ export function buildClaudePermissionPresentation(value) {
33
+ const info = toolInfoFromToolUse({ id: value.toolUseID, name: value.toolName, input: value.input }, value.supportsTerminalOutput ?? false, value.cwd);
34
+ const host = value.toolName === "SandboxNetworkAccess" ? compactText(value.input.host) : undefined;
35
+ const isComputerUse = value.toolName.startsWith("mcp__computer-use__");
36
+ const subjectTitle = host ?? (isComputerUse ? compactText(value.displayName) : undefined);
37
+ const subjectContent = (host || isComputerUse) && info.content.length === 0
38
+ ? [
39
+ {
40
+ type: "content",
41
+ content: {
42
+ type: "text",
43
+ text: `\`\`\`json\n${JSON.stringify(value.input, null, 2)}\n\`\`\``,
44
+ },
45
+ },
46
+ ]
47
+ : info.content;
48
+ // Reuse the exact standard tool-call heading as the permission heading so
49
+ // the approval never maintains a second, divergent name for the operation.
50
+ // decisionReason is temporarily exposed as the permission description so
51
+ // its actual SDK values can be inspected; it remains diagnostic policy text.
52
+ const shellTitle = value.toolName === "Bash" || value.toolName === "PowerShell"
53
+ ? (compactText(value.input.description) ?? value.toolName)
54
+ : undefined;
55
+ const toolCallTitle = shellTitle ?? subjectTitle ?? info.title;
56
+ const permissionTitle = value.toolName === "ExitPlanMode" ? "Ready to code?" : toolCallTitle;
57
+ const title = humanText(permissionTitle, 4_000, true) ?? "Use tool?";
58
+ const decisionReason = humanText(value.decisionReason, 4_000);
59
+ const description = decisionReason ? `Reason: ${decisionReason}` : undefined;
60
+ return {
61
+ toolCall: {
62
+ toolCallId: value.toolUseID,
63
+ name: value.toolName,
64
+ status: "pending",
65
+ rawInput: value.input,
66
+ ...info,
67
+ title: toolCallTitle,
68
+ content: subjectContent,
69
+ locations: withBlockedPath(info.locations, value.blockedPath),
70
+ },
71
+ ...(title
72
+ ? {
73
+ _meta: {
74
+ permission: {
75
+ version: 1,
76
+ title,
77
+ ...(description ? { description } : {}),
78
+ },
79
+ },
80
+ }
81
+ : {}),
82
+ };
83
+ }
@@ -0,0 +1,11 @@
1
+ import type { RequestPermissionResponse } from "@agentclientprotocol/sdk";
2
+ import type { PermissionOption } from "@agentclientprotocol/sdk";
3
+ import type { PermissionMode, PermissionResult } from "@anthropic-ai/claude-agent-sdk";
4
+ import type { DurablePermissionChangeSet } from "./normalization.js";
5
+ export interface ClaudePermissionDecision {
6
+ permissionResult: PermissionResult;
7
+ contextResetMode?: PermissionMode;
8
+ }
9
+ /** Decode, validate, and interpret an ACP response exactly once. */
10
+ export declare function decodeClaudePermissionResponse(response: RequestPermissionResponse, toolName: string, input: Record<string, unknown>, toolUseID: string, offeredOptions: readonly PermissionOption[], durableChangeSet?: DurablePermissionChangeSet): ClaudePermissionDecision;
11
+ //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/permissions/response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAGrE,MAAM,WAAW,wBAAwB;IACvC,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,CAAC,EAAE,cAAc,CAAC;CACnC;AAED,oEAAoE;AACpE,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,yBAAyB,EACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,SAAS,gBAAgB,EAAE,EAC3C,gBAAgB,CAAC,EAAE,0BAA0B,GAC5C,wBAAwB,CAgB1B"}
@@ -0,0 +1,19 @@
1
+ import { applyClaudePermissionSelection, parseClaudePermissionSelection } from "./effects.js";
2
+ /** Decode, validate, and interpret an ACP response exactly once. */
3
+ export function decodeClaudePermissionResponse(response, toolName, input, toolUseID, offeredOptions, durableChangeSet) {
4
+ const selection = parseClaudePermissionSelection(response, toolName);
5
+ const offeredOption = offeredOptions.find((option) => option.optionId === selection.optionId);
6
+ if (!offeredOption) {
7
+ throw new Error(`Permission option was not offered: ${selection.optionId}`);
8
+ }
9
+ const permissionResult = applyClaudePermissionSelection(selection, {
10
+ toolName,
11
+ input,
12
+ toolUseID,
13
+ durableChangeSet,
14
+ });
15
+ return {
16
+ permissionResult,
17
+ ...(selection.contextResetMode ? { contextResetMode: selection.contextResetMode } : {}),
18
+ };
19
+ }
@@ -0,0 +1,5 @@
1
+ /** Shared sentinels and ids for session preferences managed by the adapter. */
2
+ export declare const DEFAULT_MODEL_ID = "default";
3
+ export declare const DEFAULT_AGENT_ID = "default";
4
+ export declare const EFFORT_CONFIG_ID = "effort";
5
+ //# sourceMappingURL=session-config-ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-config-ids.d.ts","sourceRoot":"","sources":["../src/session-config-ids.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAC1C,eAAO,MAAM,gBAAgB,YAAY,CAAC;AAC1C,eAAO,MAAM,gBAAgB,WAAW,CAAC"}
@@ -0,0 +1,4 @@
1
+ /** Shared sentinels and ids for session preferences managed by the adapter. */
2
+ export const DEFAULT_MODEL_ID = "default";
3
+ export const DEFAULT_AGENT_ID = "default";
4
+ export const EFFORT_CONFIG_ID = "effort";
@@ -1,13 +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(...additionalCapabilities: string[]): {
4
- jetbrains: {
5
- air: {
6
- version: number;
7
- capabilities: string[];
8
- };
9
- };
10
- };
3
+ export declare function airSessionFailureCapabilityMeta(...additionalCapabilities: string[]): Record<string, unknown>;
11
4
  export type ClaudeFailureKind = "advisory" | "auth_required" | "bad_request" | "budget_exhausted" | "context_exhausted" | "internal_error" | "overloaded" | "provider_error" | "quota_exhausted" | "rate_limited" | "transport_lost" | "worker_shutdown";
12
5
  type AirSessionFailureCategory = "connection" | "access" | "limit" | "request" | "service" | "unknown";
13
6
  type AirSessionFailureSeverity = "warning" | "error";
@@ -46,22 +39,7 @@ type Logger = {
46
39
  error: (...args: unknown[]) => void;
47
40
  };
48
41
  export declare function createSessionFailureState(): SessionFailureState;
49
- export declare function sessionFailureMeta(failure: PublishedSessionFailure): {
50
- jetbrains: {
51
- air: {
52
- version: number;
53
- sessionFailure: {
54
- actions: AirSessionFailureAction[];
55
- details?: string | undefined;
56
- id: string;
57
- revision: number;
58
- category: AirSessionFailureCategory;
59
- severity: AirSessionFailureSeverity;
60
- title: string;
61
- };
62
- };
63
- };
64
- };
42
+ export declare function sessionFailureMeta(failure: PublishedSessionFailure): Record<string, unknown>;
65
43
  /** `getSessionMessages` deliberately exposes only the API message and strips
66
44
  * transcript-level `error` / `isApiErrorMessage` fields. The SDK exports the
67
45
  * exact stable prefixes used by its synthetic usage-limit errors, so replay
@@ -1 +1 @@
1
- {"version":3,"file":"session-failure-extension.d.ts","sourceRoot":"","sources":["../src/session-failure-extension.ts"],"names":[],"mappings":"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"}
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;AASxC,wBAAgB,+BAA+B,CAAC,GAAG,sBAAsB,EAAE,MAAM,EAAE,2BAElF;AAED,MAAM,MAAM,iBAAiB,GACzB,UAAU,GACV,eAAe,GACf,aAAa,GACb,kBAAkB,GAClB,mBAAmB,GACnB,gBAAgB,GAChB,YAAY,GACZ,gBAAgB,GAChB,iBAAiB,GACjB,cAAc,GACd,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB,KAAK,yBAAyB,GAC5B,YAAY,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAExE,KAAK,yBAAyB,GAAG,SAAS,GAAG,OAAO,CAAC;AACrD,KAAK,uBAAuB,GAAG,OAAO,GAAG,OAAO,GAAG,aAAa,CAAC;AAEjE,KAAK,4BAA4B,GAC/B,OAAO,GAAG,cAAc,GAAG,oBAAoB,GAAG,aAAa,GAAG,gBAAgB,CAAC;AAErF,MAAM,MAAM,uBAAuB,GAAG;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,yBAAyB,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACnC,cAAc,EAAE,4BAA4B,CAAC;CAC9C,CAAC;AAEF,KAAK,qBAAqB,GAAG;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,yBAAyB,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5C,CAAC;AAEF,KAAK,MAAM,GAAG;IACZ,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACrC,CAAC;AAEF,wBAAgB,yBAAyB,IAAI,mBAAmB,CAM/D;AAwED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,uBAAuB,2BAUlE;AAED;;;iFAGiF;AACjF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAkB5E;AAED,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,OAAO,GAAG,OAAO,CAOzE;AAED,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,GACvD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAmB7C;AAED,wBAAgB,0BAA0B,CAAC,YAAY,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAErF;AAqBD;;+EAE+E;AAC/E,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsB;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuD;IAClF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,OAAO,EAAE;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,mBAAmB,CAAC;QAC3B,YAAY,CAAC,EAAE,kBAAkB,CAAC;QAClC,SAAS,EAAE,MAAM,OAAO,CAAC;QACzB,UAAU,EAAE,CAAC,YAAY,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,EAAE,MAAM,CAAC;KAChB;IASD,OAAO,CAAC,WAAW;YAIL,IAAI;IAwBlB,YAAY,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAO9C,KAAK,CACT,WAAW,GAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,OAAoB,GACtE,OAAO,CAAC,OAAO,CAAC;IAUb,OAAO,CACX,IAAI,EAAE,iBAAiB,EACvB,cAAc,GAAE,qBAA0B,GACzC,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IAkDzC,OAAO,CACX,IAAI,EAAE,iBAAiB,EACvB,cAAc,GAAE,qBAA0B,GACzC,OAAO,CAAC,IAAI,CAAC;IAMV,OAAO,CACX,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,iBAAiB,EACvB,KAAK,EAAE,MAAM,EACb,MAAM,UAAO,GACZ,OAAO,CAAC,OAAO,CAAC;CAsBpB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,CAAC,EAAE,wBAAwB,EACpC,YAAY,UAAQ,GACnB,iBAAiB,CAyBnB"}
@@ -1,20 +1,8 @@
1
1
  import { USAGE_LIMIT_ERROR_PREFIXES, } from "@anthropic-ai/claude-agent-sdk";
2
2
  import { randomUUID } from "node:crypto";
3
- const JETBRAINS_META_KEY = "jetbrains";
4
- const AIR_META_KEY = "air";
5
- const AIR_EXTENSION_VERSION_KEY = "version";
6
- const AIR_EXTENSION_CAPABILITIES_KEY = "capabilities";
7
- const AIR_SESSION_FAILURE_KEY = "sessionFailure";
8
- const AIR_EXTENSION_VERSION = 1;
3
+ import { AIR_SESSION_FAILURE_CAPABILITY, airCapabilityMeta, clientSupportsAirCapability, withAirMeta, } from "./air-extension.js";
9
4
  export function airSessionFailureCapabilityMeta(...additionalCapabilities) {
10
- return {
11
- [JETBRAINS_META_KEY]: {
12
- [AIR_META_KEY]: {
13
- [AIR_EXTENSION_VERSION_KEY]: AIR_EXTENSION_VERSION,
14
- [AIR_EXTENSION_CAPABILITIES_KEY]: [AIR_SESSION_FAILURE_KEY, ...additionalCapabilities],
15
- },
16
- },
17
- };
5
+ return airCapabilityMeta(AIR_SESSION_FAILURE_CAPABILITY, ...additionalCapabilities);
18
6
  }
19
7
  export function createSessionFailureState() {
20
8
  return {
@@ -86,22 +74,15 @@ const AIR_FAILURE_POLICY = {
86
74
  },
87
75
  };
88
76
  export function sessionFailureMeta(failure) {
89
- return {
90
- [JETBRAINS_META_KEY]: {
91
- [AIR_META_KEY]: {
92
- [AIR_EXTENSION_VERSION_KEY]: AIR_EXTENSION_VERSION,
93
- [AIR_SESSION_FAILURE_KEY]: {
94
- id: failure.id,
95
- revision: failure.revision,
96
- category: failure.category,
97
- severity: failure.severity,
98
- title: failure.title,
99
- ...(failure.details ? { details: failure.details } : {}),
100
- actions: failure.actions,
101
- },
102
- },
103
- },
104
- };
77
+ return withAirMeta(undefined, AIR_SESSION_FAILURE_CAPABILITY, {
78
+ id: failure.id,
79
+ revision: failure.revision,
80
+ category: failure.category,
81
+ severity: failure.severity,
82
+ title: failure.title,
83
+ ...(failure.details ? { details: failure.details } : {}),
84
+ actions: failure.actions,
85
+ });
105
86
  }
106
87
  /** `getSessionMessages` deliberately exposes only the API message and strips
107
88
  * transcript-level `error` / `isApiErrorMessage` fields. The SDK exports the
@@ -161,16 +142,7 @@ export function activeUsageLimitMessage(messages) {
161
142
  return active;
162
143
  }
163
144
  export function supportsAirSessionFailures(capabilities) {
164
- const jetbrains = capabilities?._meta?.[JETBRAINS_META_KEY];
165
- const air = jetbrains?.[AIR_META_KEY];
166
- const version = air?.[AIR_EXTENSION_VERSION_KEY];
167
- const advertised = air?.[AIR_EXTENSION_CAPABILITIES_KEY];
168
- return (typeof version === "number" &&
169
- Number.isFinite(version) &&
170
- Number.isInteger(version) &&
171
- version >= AIR_EXTENSION_VERSION &&
172
- Array.isArray(advertised) &&
173
- advertised.some((capability) => capability === AIR_SESSION_FAILURE_KEY));
145
+ return clientSupportsAirCapability(capabilities, AIR_SESSION_FAILURE_CAPABILITY);
174
146
  }
175
147
  function sessionFailureRecoveryPolicy(kind, turnId) {
176
148
  switch (kind) {
@@ -331,6 +303,7 @@ export function providerFailureCategory(errorKind, isUsageLimit = false) {
331
303
  case "oauth_org_not_allowed":
332
304
  return "auth_required";
333
305
  case "billing_error":
306
+ case "account_on_hold":
334
307
  return "quota_exhausted";
335
308
  case "rate_limit":
336
309
  return "rate_limited";
@@ -0,0 +1,66 @@
1
+ import { type SessionConfigOption, type SessionModeState, type SessionNotification, type SetSessionModeRequest, type SetSessionModeResponse } from "@agentclientprotocol/sdk";
2
+ import type { ModelInfo, PermissionMode, PermissionResult, Query } from "@anthropic-ai/claude-agent-sdk";
3
+ export declare const MODE_CONFIG_ID = "mode";
4
+ export declare const AUTO_MODE_FALLBACK: PermissionMode;
5
+ export type SessionMode = {
6
+ query: Pick<Query, "setPermissionMode">;
7
+ queryClosed?: boolean;
8
+ modes: SessionModeState;
9
+ models: {
10
+ currentModelId: string;
11
+ };
12
+ modelInfos: ModelInfo[];
13
+ /** Prevents the model-specific Auto fallback from spamming the transcript. */
14
+ autoModeFallbackWarningShown?: boolean;
15
+ /** Initial mode fallback is reported after session/new, on the first prompt. */
16
+ autoModeFallbackWarningPending?: boolean;
17
+ };
18
+ export type SessionModeManagerOptions<S extends SessionMode> = {
19
+ getSession(sessionId: string): S | undefined;
20
+ sessionEndedMessage: string;
21
+ updateConfigOption(sessionId: string, configId: string, value: string): Promise<void>;
22
+ sessionUpdate(params: SessionNotification): Promise<void>;
23
+ logError(...args: unknown[]): void;
24
+ };
25
+ type ModeConfigSession = SessionMode & {
26
+ configOptions: SessionConfigOption[];
27
+ };
28
+ type InitializeSessionModeParams = {
29
+ query: Pick<Query, "setPermissionMode">;
30
+ requestedMode: PermissionMode;
31
+ currentModelInfo?: ModelInfo;
32
+ currentModelId: string;
33
+ };
34
+ /** Owns session-mode policy and the ACP/SDK synchronization it requires. */
35
+ export declare class SessionModeManager<S extends SessionMode> {
36
+ private readonly options;
37
+ constructor(options: SessionModeManagerOptions<S>);
38
+ initialize({ query, requestedMode, currentModelInfo, currentModelId, }: InitializeSessionModeParams): Promise<{
39
+ modes: SessionModeState;
40
+ autoModeFallbackWarningPending: boolean;
41
+ }>;
42
+ static configOption(modes: SessionModeState): SessionConfigOption;
43
+ syncConfig(session: ModeConfigSession, mode: string): void;
44
+ availableModeIds(modes: SessionModeState): string[];
45
+ effectiveMode(session: SessionMode, requestedMode: PermissionMode): PermissionMode;
46
+ applyPermissionFallback(session: SessionMode, permissionResult: PermissionResult): {
47
+ permissionResult: PermissionResult;
48
+ fallbackApplied: boolean;
49
+ };
50
+ /** Reconcile mode after a model switch. The caller rebuilds config options
51
+ * before publishing the returned state change. */
52
+ reconcileForModel(session: SessionMode, model: ModelInfo | undefined): Promise<boolean>;
53
+ selectMode(sessionId: string, modeId: string): Promise<PermissionMode>;
54
+ setSessionMode(params: SetSessionModeRequest): Promise<SetSessionModeResponse>;
55
+ publishCurrent(sessionId: string, mode: string): Promise<void>;
56
+ publishFallbackWarning(sessionId: string, session: SessionMode): Promise<void>;
57
+ publishFallbackState(sessionId: string, session: SessionMode): Promise<void>;
58
+ private requireOpenSession;
59
+ private isAutoUnavailable;
60
+ private isAvailable;
61
+ private parseMode;
62
+ private buildAvailableModes;
63
+ private trySyncMode;
64
+ }
65
+ export {};
66
+ //# sourceMappingURL=session-mode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-mode.d.ts","sourceRoot":"","sources":["../src/session-mode.ts"],"names":[],"mappings":"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"}