@sudocode-ai/claude-code-acp 0.13.2 → 0.13.4

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.
@@ -12,6 +12,21 @@ export interface Logger {
12
12
  log: (...args: any[]) => void;
13
13
  error: (...args: any[]) => void;
14
14
  }
15
+ /**
16
+ * Internal state for tracking compaction.
17
+ */
18
+ type CompactionState = {
19
+ /** Whether auto-compaction is enabled for this session */
20
+ enabled: boolean;
21
+ /** Token threshold that triggers compaction */
22
+ threshold: number;
23
+ /** Custom instructions for compaction summary */
24
+ customInstructions?: string;
25
+ /** Current total token count for this session */
26
+ currentTokens: number;
27
+ /** Whether a compaction is currently in progress */
28
+ isCompacting: boolean;
29
+ };
15
30
  type Session = {
16
31
  query: Query;
17
32
  input: Pushable<SDKUserMessage>;
@@ -22,6 +37,8 @@ type Session = {
22
37
  cwd: string;
23
38
  /** Optional: the actual session file path (for forked sessions where filename differs from sessionId) */
24
39
  sessionFilePath?: string;
40
+ /** Auto-compaction state tracking */
41
+ compaction: CompactionState;
25
42
  };
26
43
  type BackgroundTerminal = {
27
44
  handle: TerminalHandle;
@@ -31,6 +48,28 @@ type BackgroundTerminal = {
31
48
  status: "aborted" | "exited" | "killed" | "timedOut";
32
49
  pendingOutput: TerminalOutputResponse;
33
50
  };
51
+ /**
52
+ * Configuration for automatic context compaction.
53
+ * When enabled, the session will automatically trigger compaction when token usage exceeds the threshold.
54
+ */
55
+ export type CompactionConfig = {
56
+ /**
57
+ * Whether automatic compaction is enabled.
58
+ * @default false
59
+ */
60
+ enabled: boolean;
61
+ /**
62
+ * Token threshold that triggers automatic compaction.
63
+ * When the total token count exceeds this value, a /compact command is automatically sent.
64
+ * @default 100000
65
+ */
66
+ contextTokenThreshold?: number;
67
+ /**
68
+ * Optional custom instructions for the compaction summary.
69
+ * These instructions guide how Claude summarizes the conversation.
70
+ */
71
+ customInstructions?: string;
72
+ };
34
73
  /**
35
74
  * Extra metadata that can be given to Claude Code when creating a new session.
36
75
  */
@@ -50,6 +89,11 @@ export type NewSessionMeta = {
50
89
  * - mcpServers (merged with ACP's mcpServers)
51
90
  */
52
91
  options?: Options;
92
+ /**
93
+ * Configuration for automatic context compaction.
94
+ * When enabled, automatically triggers /compact when token usage exceeds the threshold.
95
+ */
96
+ compaction?: CompactionConfig;
53
97
  };
54
98
  };
55
99
  /**
@@ -137,6 +181,7 @@ export declare class ClaudeAcpAgent implements Agent {
137
181
  * Currently supports:
138
182
  * - `_session/inject`: Inject a message into an active session mid-execution
139
183
  * - `_session/flush`: Flush a session to disk for fork-with-flush support
184
+ * - `_session/setCompaction`: Configure automatic context compaction for a session
140
185
  */
141
186
  extMethod(method: string, params: Record<string, unknown>): Promise<Record<string, unknown>>;
142
187
  /**
@@ -156,6 +201,20 @@ export declare class ClaudeAcpAgent implements Agent {
156
201
  * @returns Success status and any error message
157
202
  */
158
203
  private handleSessionInject;
204
+ /**
205
+ * Configure automatic context compaction for a session.
206
+ *
207
+ * When enabled, the session will automatically trigger compaction when token usage
208
+ * exceeds the configured threshold. This helps manage context window limits during
209
+ * long-running conversations.
210
+ *
211
+ * @param params.sessionId - The session to configure
212
+ * @param params.enabled - Whether automatic compaction is enabled
213
+ * @param params.contextTokenThreshold - Token count that triggers compaction (default: 100000)
214
+ * @param params.customInstructions - Optional instructions for the compaction summary
215
+ * @returns Success status and any error message
216
+ */
217
+ private handleSessionSetCompaction;
159
218
  /**
160
219
  * Flush a session to disk by aborting its query subprocess.
161
220
  *
@@ -191,6 +250,14 @@ export declare class ClaudeAcpAgent implements Agent {
191
250
  readTextFile(params: ReadTextFileRequest): Promise<ReadTextFileResponse>;
192
251
  writeTextFile(params: WriteTextFileRequest): Promise<WriteTextFileResponse>;
193
252
  canUseTool(sessionId: string): CanUseTool;
253
+ /**
254
+ * Check if auto-compaction should be triggered based on current token usage.
255
+ */
256
+ private shouldTriggerCompaction;
257
+ /**
258
+ * Trigger automatic compaction by sending a /compact command.
259
+ */
260
+ private triggerAutoCompaction;
194
261
  private createSession;
195
262
  }
196
263
  export declare function promptToClaude(prompt: PromptRequest): SDKUserMessage;
@@ -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
@@ -366,7 +366,28 @@ export class ClaudeAcpAgent {
366
366
  switch (message.subtype) {
367
367
  case "init":
368
368
  break;
369
- case "compact_boundary":
369
+ case "compact_boundary": {
370
+ // Reset token count after compaction
371
+ const session = this.sessions[params.sessionId];
372
+ if (session) {
373
+ const preTokens = message.compact_metadata.pre_tokens;
374
+ const trigger = message.compact_metadata.trigger;
375
+ session.compaction.currentTokens = 0;
376
+ session.compaction.isCompacting = false;
377
+ this.logger.log(`[auto-compaction] Compaction completed, token count reset. Previous tokens: ${preTokens}`);
378
+ // Emit compaction_completed event to client
379
+ await this.client.sessionUpdate({
380
+ sessionId: params.sessionId,
381
+ update: {
382
+ sessionUpdate: "compaction_completed",
383
+ sessionId: params.sessionId,
384
+ trigger: trigger,
385
+ preTokens: preTokens,
386
+ },
387
+ });
388
+ }
389
+ break;
390
+ }
370
391
  case "hook_response":
371
392
  case "status":
372
393
  // Todo: process via status api: https://docs.claude.com/en/docs/claude-code/hooks#hook-output
@@ -380,6 +401,15 @@ export class ClaudeAcpAgent {
380
401
  if (this.sessions[params.sessionId].cancelled) {
381
402
  return { stopReason: "cancelled" };
382
403
  }
404
+ // Track token usage for auto-compaction
405
+ const session = this.sessions[params.sessionId];
406
+ if (session && message.usage) {
407
+ const totalTokens = message.usage.input_tokens +
408
+ message.usage.output_tokens +
409
+ (message.usage.cache_creation_input_tokens ?? 0) +
410
+ (message.usage.cache_read_input_tokens ?? 0);
411
+ session.compaction.currentTokens += totalTokens;
412
+ }
383
413
  switch (message.subtype) {
384
414
  case "success": {
385
415
  if (message.result.includes("Please run /login")) {
@@ -388,6 +418,11 @@ export class ClaudeAcpAgent {
388
418
  if (message.is_error) {
389
419
  throw RequestError.internalError(undefined, message.result);
390
420
  }
421
+ // Check if auto-compaction should be triggered
422
+ if (session && await this.shouldTriggerCompaction(params.sessionId)) {
423
+ await this.triggerAutoCompaction(params.sessionId);
424
+ // Continue processing - the compaction will happen in the background
425
+ }
391
426
  return { stopReason: "end_turn" };
392
427
  }
393
428
  case "error_during_execution":
@@ -480,6 +515,7 @@ export class ClaudeAcpAgent {
480
515
  * Currently supports:
481
516
  * - `_session/inject`: Inject a message into an active session mid-execution
482
517
  * - `_session/flush`: Flush a session to disk for fork-with-flush support
518
+ * - `_session/setCompaction`: Configure automatic context compaction for a session
483
519
  */
484
520
  async extMethod(method, params) {
485
521
  if (method === "_session/inject") {
@@ -488,6 +524,9 @@ export class ClaudeAcpAgent {
488
524
  if (method === "_session/flush") {
489
525
  return this.handleSessionFlush(params);
490
526
  }
527
+ if (method === "_session/setCompaction") {
528
+ return this.handleSessionSetCompaction(params);
529
+ }
491
530
  throw RequestError.methodNotFound(method);
492
531
  }
493
532
  /**
@@ -534,6 +573,43 @@ export class ClaudeAcpAgent {
534
573
  return { success: false, error: String(error) };
535
574
  }
536
575
  }
576
+ /**
577
+ * Configure automatic context compaction for a session.
578
+ *
579
+ * When enabled, the session will automatically trigger compaction when token usage
580
+ * exceeds the configured threshold. This helps manage context window limits during
581
+ * long-running conversations.
582
+ *
583
+ * @param params.sessionId - The session to configure
584
+ * @param params.enabled - Whether automatic compaction is enabled
585
+ * @param params.contextTokenThreshold - Token count that triggers compaction (default: 100000)
586
+ * @param params.customInstructions - Optional instructions for the compaction summary
587
+ * @returns Success status and any error message
588
+ */
589
+ handleSessionSetCompaction(params) {
590
+ const { sessionId, enabled, contextTokenThreshold, customInstructions } = params;
591
+ const session = this.sessions[sessionId];
592
+ if (!session) {
593
+ return { success: false, error: `Session ${sessionId} not found` };
594
+ }
595
+ try {
596
+ // Update the session's compaction configuration
597
+ session.compaction.enabled = enabled;
598
+ if (contextTokenThreshold !== undefined) {
599
+ session.compaction.threshold = contextTokenThreshold;
600
+ }
601
+ if (customInstructions !== undefined) {
602
+ session.compaction.customInstructions = customInstructions;
603
+ }
604
+ this.logger.log(`[claude-code-acp] Updated compaction config for session ${sessionId}: ` +
605
+ `enabled=${enabled}, threshold=${session.compaction.threshold}`);
606
+ return { success: true };
607
+ }
608
+ catch (error) {
609
+ this.logger.error(`[claude-code-acp] Failed to set compaction config for session ${sessionId}:`, error);
610
+ return { success: false, error: String(error) };
611
+ }
612
+ }
537
613
  /**
538
614
  * Flush a session to disk by aborting its query subprocess.
539
615
  *
@@ -777,6 +853,60 @@ export class ClaudeAcpAgent {
777
853
  }
778
854
  };
779
855
  }
856
+ /**
857
+ * Check if auto-compaction should be triggered based on current token usage.
858
+ */
859
+ async shouldTriggerCompaction(sessionId) {
860
+ const session = this.sessions[sessionId];
861
+ if (!session)
862
+ return false;
863
+ const { compaction } = session;
864
+ // Check if auto-compaction is enabled and not already in progress
865
+ if (!compaction.enabled || compaction.isCompacting) {
866
+ return false;
867
+ }
868
+ // Check if current tokens exceed threshold
869
+ return compaction.currentTokens >= compaction.threshold;
870
+ }
871
+ /**
872
+ * Trigger automatic compaction by sending a /compact command.
873
+ */
874
+ async triggerAutoCompaction(sessionId) {
875
+ const session = this.sessions[sessionId];
876
+ if (!session)
877
+ return;
878
+ const { compaction, input } = session;
879
+ // Mark compaction as in progress to prevent multiple triggers
880
+ compaction.isCompacting = true;
881
+ const preTokens = compaction.currentTokens;
882
+ this.logger.log(`[auto-compaction] Triggering compaction. Current tokens: ${preTokens}, Threshold: ${compaction.threshold}`);
883
+ // Emit compaction_started event to client
884
+ await this.client.sessionUpdate({
885
+ sessionId,
886
+ update: {
887
+ sessionUpdate: "compaction_started",
888
+ sessionId,
889
+ trigger: "auto",
890
+ preTokens: preTokens,
891
+ threshold: compaction.threshold,
892
+ },
893
+ });
894
+ // Build the compact command with optional custom instructions
895
+ const compactCommand = compaction.customInstructions
896
+ ? `/compact ${compaction.customInstructions}`
897
+ : "/compact";
898
+ // Inject the compact command as a user message
899
+ const compactMessage = {
900
+ type: "user",
901
+ message: {
902
+ role: "user",
903
+ content: [{ type: "text", text: compactCommand }],
904
+ },
905
+ session_id: sessionId,
906
+ parent_tool_use_id: null,
907
+ };
908
+ input.push(compactMessage);
909
+ }
780
910
  async createSession(params, creationOpts = {}) {
781
911
  // We want to create a new session id unless it is resume,
782
912
  // but not resume + forkSession.
@@ -933,6 +1063,15 @@ export class ClaudeAcpAgent {
933
1063
  prompt: input,
934
1064
  options,
935
1065
  });
1066
+ // Extract compaction config from _meta if provided
1067
+ const compactionConfig = params._meta?.claudeCode?.compaction;
1068
+ const compactionState = {
1069
+ enabled: compactionConfig?.enabled ?? false,
1070
+ threshold: compactionConfig?.contextTokenThreshold ?? 100000,
1071
+ customInstructions: compactionConfig?.customInstructions,
1072
+ currentTokens: 0,
1073
+ isCompacting: false,
1074
+ };
936
1075
  this.sessions[sessionId] = {
937
1076
  query: q,
938
1077
  input: input,
@@ -941,6 +1080,7 @@ export class ClaudeAcpAgent {
941
1080
  settingsManager,
942
1081
  abortController: sessionAbortController,
943
1082
  cwd: params.cwd,
1083
+ compaction: compactionState,
944
1084
  };
945
1085
  const availableCommands = await getAvailableSlashCommands(q);
946
1086
  const models = await getAvailableModels(q);
package/dist/lib.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { ClaudeAcpAgent, runAcp, toAcpNotifications, streamEventToAcpNotifications, type ToolUpdateMeta, type NewSessionMeta, } from "./acp-agent.js";
1
+ export { ClaudeAcpAgent, runAcp, toAcpNotifications, streamEventToAcpNotifications, type ToolUpdateMeta, type NewSessionMeta, type CompactionConfig, } from "./acp-agent.js";
2
2
  export { loadManagedSettings, applyEnvironmentSettings, nodeToWebReadable, nodeToWebWritable, Pushable, unreachable, } from "./utils.js";
3
3
  export { createMcpServer } from "./mcp-server.js";
4
4
  export { toolInfoFromToolUse, planEntries, toolUpdateFromToolResult, createPreToolUseHook, acpToolNames as toolNames, } from "./tools.js";
package/dist/lib.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,MAAM,EACN,kBAAkB,EAClB,6BAA6B,EAC7B,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,IAAI,SAAS,GAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAC;AAGvB,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../src/lib.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,MAAM,EACN,kBAAkB,EAClB,6BAA6B,EAC7B,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,QAAQ,EACR,WAAW,GACZ,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,mBAAmB,EACnB,WAAW,EACX,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,IAAI,SAAS,GAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,GAC5B,MAAM,eAAe,CAAC;AAGvB,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.13.2",
6
+ "version": "0.13.4",
7
7
  "description": "An ACP-compatible coding agent powered by the Claude Code SDK (TypeScript)",
8
8
  "main": "dist/lib.js",
9
9
  "types": "dist/lib.d.ts",