@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.
- package/dist/acp-agent.d.ts +67 -0
- package/dist/acp-agent.d.ts.map +1 -1
- package/dist/acp-agent.js +141 -1
- package/dist/lib.d.ts +1 -1
- package/dist/lib.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/acp-agent.d.ts
CHANGED
|
@@ -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;
|
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":"AAAA,OAAO,EACL,KAAK,EACL,mBAAmB,EACnB,mBAAmB,EAEnB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EAEnB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EAEpB,oBAAoB,EACpB,qBAAqB,EAErB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,cAAc,EACd,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EACL,UAAU,EAEV,OAAO,EACP,cAAc,EACd,KAAK,EAEL,0BAA0B,EAC1B,cAAc,EACf,MAAM,gCAAgC,CAAC;AAIxC,OAAO,EAAwC,QAAQ,EAAe,MAAM,YAAY,CAAC;AAYzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAIlG,eAAO,MAAM,iBAAiB,QAA2D,CAAC;AAE1F;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC9B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;CACjC;AAED,KAAK,OAAO,GAAG;IACb,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,eAAe,EAAE,eAAe,CAAC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,yGAAyG;IACzG,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
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,
|
|
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