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

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":"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;;GAEG;AACH,KAAK,eAAe,GAAG;IACrB,0DAA0D;IAC1D,OAAO,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,oDAAoD;IACpD,YAAY,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,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;IACzB,qCAAqC;IACrC,UAAU,EAAE,eAAe,CAAC;CAC7B,CAAC;AAEF,KAAK,kBAAkB,GACnB;IACE,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,sBAAsB,GAAG,IAAI,CAAC;CAC3C,GACD;IACE,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;IACrD,aAAa,EAAE,sBAAsB,CAAC;CACvC,CAAC;AAEN;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B;;;OAGG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE;QACX;;;;;;;;;;;;WAYG;QACH,OAAO,CAAC,EAAE,OAAO,CAAC;QAElB;;;WAGG;QACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;KAC/B,CAAC;CACH,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,CAAC,EAAE;QAEX,QAAQ,EAAE,MAAM,CAAC;QAEjB,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,CAAC;CACH,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG;QACb,IAAI,EAAE,UAAU,GAAG,iBAAiB,GAAG,cAAc,CAAC;QACtD,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,GAAG,CAAC;KACZ,CAAC;CACH,CAAC;AAMF,qBAAa,cAAe,YAAW,KAAK;IAC1C,QAAQ,EAAE;QACR,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;IACF,MAAM,EAAE,mBAAmB,CAAC;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,mBAAmB,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAAA;KAAE,CAAM;IAChE,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;gBAEH,MAAM,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,MAAM;IAOlD,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiDnE,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAcxE;;;;OAIG;IACG,oBAAoB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAqGpF;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IA+BhC;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAsC5B;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAsC7B;;;OAGG;YACW,oBAAoB;IAoDlC;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI3E;;;OAGG;IACG,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAe3E;;OAEG;IACG,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAepF,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;IA6LtD,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvD;;;;;;;OAOG;IACG,SAAS,CACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAwBnC;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,mBAAmB;IA2C3B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,0BAA0B;IAwClC;;;;;;;;;;OAUG;YACW,kBAAkB;IA8DhC;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAQ1B;;;;;;OAMG;YACW,kBAAkB;IAW1B,wBAAwB,CAC5B,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC;IAOpC,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IA0B9E,YAAY,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAKxE,aAAa,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAKjF,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU;IAgIzC;;OAEG;YACW,uBAAuB;IAerC;;OAEG;YACW,qBAAqB;YAgCrB,aAAa;CAiR5B;AAwED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CA6EpE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,GAAG,iBAAiB,EAAE,GAAG,gBAAgB,EAAE,GAAG,wBAAwB,EAAE,EACvF,IAAI,EAAE,WAAW,GAAG,MAAM,EAC1B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,MAAM,GACb,mBAAmB,EAAE,CAqKvB;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,0BAA0B,EACnC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,mBAAmB,EAC3B,MAAM,EAAE,MAAM,GACb,mBAAmB,EAAE,CAgCvB;AAED,wBAAgB,MAAM,SAMrB"}
package/dist/acp-agent.js CHANGED
@@ -366,7 +366,16 @@ 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
+ session.compaction.currentTokens = 0;
374
+ session.compaction.isCompacting = false;
375
+ this.logger.log(`[auto-compaction] Compaction completed, token count reset. Previous tokens: ${message.compact_metadata.pre_tokens}`);
376
+ }
377
+ break;
378
+ }
370
379
  case "hook_response":
371
380
  case "status":
372
381
  // Todo: process via status api: https://docs.claude.com/en/docs/claude-code/hooks#hook-output
@@ -380,6 +389,15 @@ export class ClaudeAcpAgent {
380
389
  if (this.sessions[params.sessionId].cancelled) {
381
390
  return { stopReason: "cancelled" };
382
391
  }
392
+ // Track token usage for auto-compaction
393
+ const session = this.sessions[params.sessionId];
394
+ if (session && message.usage) {
395
+ const totalTokens = message.usage.input_tokens +
396
+ message.usage.output_tokens +
397
+ (message.usage.cache_creation_input_tokens ?? 0) +
398
+ (message.usage.cache_read_input_tokens ?? 0);
399
+ session.compaction.currentTokens += totalTokens;
400
+ }
383
401
  switch (message.subtype) {
384
402
  case "success": {
385
403
  if (message.result.includes("Please run /login")) {
@@ -388,6 +406,11 @@ export class ClaudeAcpAgent {
388
406
  if (message.is_error) {
389
407
  throw RequestError.internalError(undefined, message.result);
390
408
  }
409
+ // Check if auto-compaction should be triggered
410
+ if (session && await this.shouldTriggerCompaction(params.sessionId)) {
411
+ await this.triggerAutoCompaction(params.sessionId);
412
+ // Continue processing - the compaction will happen in the background
413
+ }
391
414
  return { stopReason: "end_turn" };
392
415
  }
393
416
  case "error_during_execution":
@@ -480,6 +503,7 @@ export class ClaudeAcpAgent {
480
503
  * Currently supports:
481
504
  * - `_session/inject`: Inject a message into an active session mid-execution
482
505
  * - `_session/flush`: Flush a session to disk for fork-with-flush support
506
+ * - `_session/setCompaction`: Configure automatic context compaction for a session
483
507
  */
484
508
  async extMethod(method, params) {
485
509
  if (method === "_session/inject") {
@@ -488,6 +512,9 @@ export class ClaudeAcpAgent {
488
512
  if (method === "_session/flush") {
489
513
  return this.handleSessionFlush(params);
490
514
  }
515
+ if (method === "_session/setCompaction") {
516
+ return this.handleSessionSetCompaction(params);
517
+ }
491
518
  throw RequestError.methodNotFound(method);
492
519
  }
493
520
  /**
@@ -534,6 +561,43 @@ export class ClaudeAcpAgent {
534
561
  return { success: false, error: String(error) };
535
562
  }
536
563
  }
564
+ /**
565
+ * Configure automatic context compaction for a session.
566
+ *
567
+ * When enabled, the session will automatically trigger compaction when token usage
568
+ * exceeds the configured threshold. This helps manage context window limits during
569
+ * long-running conversations.
570
+ *
571
+ * @param params.sessionId - The session to configure
572
+ * @param params.enabled - Whether automatic compaction is enabled
573
+ * @param params.contextTokenThreshold - Token count that triggers compaction (default: 100000)
574
+ * @param params.customInstructions - Optional instructions for the compaction summary
575
+ * @returns Success status and any error message
576
+ */
577
+ handleSessionSetCompaction(params) {
578
+ const { sessionId, enabled, contextTokenThreshold, customInstructions } = params;
579
+ const session = this.sessions[sessionId];
580
+ if (!session) {
581
+ return { success: false, error: `Session ${sessionId} not found` };
582
+ }
583
+ try {
584
+ // Update the session's compaction configuration
585
+ session.compaction.enabled = enabled;
586
+ if (contextTokenThreshold !== undefined) {
587
+ session.compaction.threshold = contextTokenThreshold;
588
+ }
589
+ if (customInstructions !== undefined) {
590
+ session.compaction.customInstructions = customInstructions;
591
+ }
592
+ this.logger.log(`[claude-code-acp] Updated compaction config for session ${sessionId}: ` +
593
+ `enabled=${enabled}, threshold=${session.compaction.threshold}`);
594
+ return { success: true };
595
+ }
596
+ catch (error) {
597
+ this.logger.error(`[claude-code-acp] Failed to set compaction config for session ${sessionId}:`, error);
598
+ return { success: false, error: String(error) };
599
+ }
600
+ }
537
601
  /**
538
602
  * Flush a session to disk by aborting its query subprocess.
539
603
  *
@@ -777,6 +841,48 @@ export class ClaudeAcpAgent {
777
841
  }
778
842
  };
779
843
  }
844
+ /**
845
+ * Check if auto-compaction should be triggered based on current token usage.
846
+ */
847
+ async shouldTriggerCompaction(sessionId) {
848
+ const session = this.sessions[sessionId];
849
+ if (!session)
850
+ return false;
851
+ const { compaction } = session;
852
+ // Check if auto-compaction is enabled and not already in progress
853
+ if (!compaction.enabled || compaction.isCompacting) {
854
+ return false;
855
+ }
856
+ // Check if current tokens exceed threshold
857
+ return compaction.currentTokens >= compaction.threshold;
858
+ }
859
+ /**
860
+ * Trigger automatic compaction by sending a /compact command.
861
+ */
862
+ async triggerAutoCompaction(sessionId) {
863
+ const session = this.sessions[sessionId];
864
+ if (!session)
865
+ return;
866
+ const { compaction, input } = session;
867
+ // Mark compaction as in progress to prevent multiple triggers
868
+ compaction.isCompacting = true;
869
+ this.logger.log(`[auto-compaction] Triggering compaction. Current tokens: ${compaction.currentTokens}, Threshold: ${compaction.threshold}`);
870
+ // Build the compact command with optional custom instructions
871
+ const compactCommand = compaction.customInstructions
872
+ ? `/compact ${compaction.customInstructions}`
873
+ : "/compact";
874
+ // Inject the compact command as a user message
875
+ const compactMessage = {
876
+ type: "user",
877
+ message: {
878
+ role: "user",
879
+ content: [{ type: "text", text: compactCommand }],
880
+ },
881
+ session_id: sessionId,
882
+ parent_tool_use_id: null,
883
+ };
884
+ input.push(compactMessage);
885
+ }
780
886
  async createSession(params, creationOpts = {}) {
781
887
  // We want to create a new session id unless it is resume,
782
888
  // but not resume + forkSession.
@@ -933,6 +1039,15 @@ export class ClaudeAcpAgent {
933
1039
  prompt: input,
934
1040
  options,
935
1041
  });
1042
+ // Extract compaction config from _meta if provided
1043
+ const compactionConfig = params._meta?.claudeCode?.compaction;
1044
+ const compactionState = {
1045
+ enabled: compactionConfig?.enabled ?? false,
1046
+ threshold: compactionConfig?.contextTokenThreshold ?? 100000,
1047
+ customInstructions: compactionConfig?.customInstructions,
1048
+ currentTokens: 0,
1049
+ isCompacting: false,
1050
+ };
936
1051
  this.sessions[sessionId] = {
937
1052
  query: q,
938
1053
  input: input,
@@ -941,6 +1056,7 @@ export class ClaudeAcpAgent {
941
1056
  settingsManager,
942
1057
  abortController: sessionAbortController,
943
1058
  cwd: params.cwd,
1059
+ compaction: compactionState,
944
1060
  };
945
1061
  const availableCommands = await getAvailableSlashCommands(q);
946
1062
  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.3",
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",