@clinebot/core 0.0.30 → 0.0.33

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 (31) hide show
  1. package/dist/extensions/context/agentic-compaction.d.ts.map +1 -1
  2. package/dist/extensions/context/basic-compaction.d.ts.map +1 -1
  3. package/dist/extensions/context/compaction-shared.d.ts +1 -1
  4. package/dist/extensions/context/compaction-shared.d.ts.map +1 -1
  5. package/dist/extensions/context/compaction.d.ts.map +1 -1
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +213 -215
  9. package/dist/runtime/checkpoint-hooks.d.ts +10 -0
  10. package/dist/runtime/checkpoint-hooks.d.ts.map +1 -1
  11. package/dist/session/default-session-manager.d.ts.map +1 -1
  12. package/dist/session/session-agent-events.d.ts.map +1 -1
  13. package/dist/types/config.d.ts +61 -0
  14. package/dist/types/config.d.ts.map +1 -1
  15. package/dist/types/events.d.ts +4 -0
  16. package/dist/types/events.d.ts.map +1 -1
  17. package/package.json +4 -4
  18. package/src/extensions/context/agentic-compaction.ts +22 -10
  19. package/src/extensions/context/basic-compaction.ts +43 -18
  20. package/src/extensions/context/compaction-shared.ts +1 -1
  21. package/src/extensions/context/compaction.test.ts +16 -10
  22. package/src/extensions/context/compaction.ts +35 -12
  23. package/src/index.ts +2 -0
  24. package/src/providers/local-provider-service.test.ts +4 -4
  25. package/src/runtime/checkpoint-hooks.ts +26 -1
  26. package/src/session/default-session-manager.test.ts +7 -9
  27. package/src/session/default-session-manager.ts +2 -6
  28. package/src/session/persistence-service.test.ts +8 -17
  29. package/src/session/session-agent-events.ts +9 -1
  30. package/src/types/config.ts +69 -0
  31. package/src/types/events.ts +4 -0
@@ -15,6 +15,16 @@ type CreateCheckpointHooksOptions = {
15
15
  logger?: BasicLogger;
16
16
  readSessionMetadata: () => Promise<Record<string, unknown> | undefined>;
17
17
  writeSessionMetadata: (metadata: Record<string, unknown>) => Promise<void> | void;
18
+ /**
19
+ * Optional custom checkpoint implementation. When provided, the built-in
20
+ * git stash/ref logic is skipped entirely and this function is called
21
+ * instead. Return `undefined` to skip writing a checkpoint for that run.
22
+ */
23
+ createCheckpoint?: (context: {
24
+ cwd: string;
25
+ sessionId: string;
26
+ runCount: number;
27
+ }) => Promise<CheckpointEntry | undefined> | CheckpointEntry | undefined;
18
28
  };
19
29
  export declare function createCheckpointHooks(options: CreateCheckpointHooksOptions): AgentHooks;
20
30
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"checkpoint-hooks.d.ts","sourceRoot":"","sources":["../../src/runtime/checkpoint-hooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIhE,MAAM,WAAW,eAAe;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,KAAK,4BAA4B,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,mBAAmB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IACxE,oBAAoB,EAAE,CACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC1B,CAAC;AAoDF,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,4BAA4B,GACnC,UAAU,CAyGZ"}
1
+ {"version":3,"file":"checkpoint-hooks.d.ts","sourceRoot":"","sources":["../../src/runtime/checkpoint-hooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIhE,MAAM,WAAW,eAAe;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC3B;AAED,KAAK,4BAA4B,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,mBAAmB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAAC;IACxE,oBAAoB,EAAE,CACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC7B,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1B;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE;QAC5B,GAAG,EAAE,MAAM,CAAC;QACZ,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KACjB,KAAK,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,GAAG,eAAe,GAAG,SAAS,CAAC;CACzE,CAAC;AAoDF,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,4BAA4B,GACnC,UAAU,CAwHZ"}
@@ -1 +1 @@
1
- {"version":3,"file":"default-session-manager.d.ts","sourceRoot":"","sources":["../../src/session/default-session-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"default-session-manager.d.ts","sourceRoot":"","sources":["../../src/session/default-session-manager.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-agent-events.d.ts","sourceRoot":"","sources":["../../src/session/session-agent-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAON,KAAK,gCAAgC,EACrC,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,OAAO,GACZ,MAAM,GAAG,SAAS,CAOpB;AAED,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;IACvC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACrD,eAAe,EAAE,CAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,CAAC,EAAE,MAAM,KACjB,IAAI,CAAC;IACV,IAAI,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,8BAA8B;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,CAgBA;AAED,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,8BAA8B,GACrC,gCAAgC,GAAG,SAAS,CA4B9C;AAED,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,UAAU,EACjB,SAAS,CAAC,EAAE,8BAA8B,GACxC,IAAI,CAwIN"}
1
+ {"version":3,"file":"session-agent-events.d.ts","sourceRoot":"","sources":["../../src/session/session-agent-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAON,KAAK,gCAAgC,EACrC,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,wBAAgB,6BAA6B,CAC5C,KAAK,EAAE,OAAO,GACZ,MAAM,GAAG,SAAS,CAOpB;AAED,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,EAAE,aAAa,GAAG,SAAS,CAAC;IACvC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;IACrD,eAAe,EAAE,CAChB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,CAAC,EAAE,MAAM,KACjB,IAAI,CAAC;IACV,IAAI,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,8BAA8B;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,GAAG;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB,CAgBA;AAED,wBAAgB,2BAA2B,CAC1C,OAAO,EAAE,8BAA8B,GACrC,gCAAgC,GAAG,SAAS,CA4B9C;AAED,wBAAgB,gBAAgB,CAC/B,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,UAAU,EACjB,SAAS,CAAC,EAAE,8BAA8B,GACxC,IAAI,CAgJN"}
@@ -66,6 +66,66 @@ export interface CoreCompactionConfig {
66
66
  summarizer?: CoreCompactionSummarizerConfig;
67
67
  compact?: (context: CoreCompactionContext) => Promise<CoreCompactionResult | undefined> | CoreCompactionResult | undefined;
68
68
  }
69
+ /**
70
+ * Context passed to a custom `createCheckpoint` implementation.
71
+ */
72
+ export interface CoreCheckpointContext {
73
+ /** Absolute path to the working directory of the session. */
74
+ cwd: string;
75
+ /** The session identifier. */
76
+ sessionId: string;
77
+ /** Monotonically increasing run counter for this session (starts at 1). */
78
+ runCount: number;
79
+ }
80
+ /**
81
+ * Configuration for the built-in git-based checkpoint feature.
82
+ *
83
+ * Checkpoints capture a restorable snapshot of the workspace at the start of
84
+ * each root-agent run so that changes made during a session can be rolled back.
85
+ *
86
+ * @example Disable checkpoints entirely:
87
+ * ```ts
88
+ * checkpoint: { enabled: false }
89
+ * ```
90
+ *
91
+ * @example Bring your own checkpoint implementation:
92
+ * ```ts
93
+ * checkpoint: {
94
+ * createCheckpoint: async ({ cwd, sessionId, runCount }) => {
95
+ * const ref = await mySnapshotFn(cwd);
96
+ * return { ref, createdAt: Date.now(), runCount };
97
+ * },
98
+ * }
99
+ * ```
100
+ */
101
+ export interface CoreCheckpointConfig {
102
+ /**
103
+ * Whether to create checkpoints on each root-agent run start.
104
+ * Defaults to `false` — checkpoints are **opt-in**. Set to `true` to
105
+ * enable the built-in git stash/ref checkpoint behaviour for this session.
106
+ */
107
+ enabled?: boolean;
108
+ /**
109
+ * Replace the built-in git stash/ref checkpoint logic with a custom
110
+ * implementation. Called once at the start of each root-agent run (before
111
+ * the first agent iteration).
112
+ *
113
+ * Return an object with at least `ref`, `createdAt`, and `runCount` to have
114
+ * the entry recorded in session metadata, or return `undefined` to skip
115
+ * writing a checkpoint for that run.
116
+ */
117
+ createCheckpoint?: (context: CoreCheckpointContext) => Promise<{
118
+ ref: string;
119
+ createdAt: number;
120
+ runCount: number;
121
+ kind?: "stash" | "commit";
122
+ } | undefined> | {
123
+ ref: string;
124
+ createdAt: number;
125
+ runCount: number;
126
+ kind?: "stash" | "commit";
127
+ } | undefined;
128
+ }
69
129
  export interface CoreSessionConfig extends CoreModelConfig, CoreRuntimeFeatures, Omit<SessionWorkspaceConfig, "workspaceRoot">, Omit<SessionPromptConfig, "systemPrompt">, Omit<SessionExecutionConfig, "enableTools" | "teamName" | "missionLogIntervalSteps" | "missionLogIntervalMs" | "maxConsecutiveMistakes"> {
70
130
  sessionId?: string;
71
131
  workspaceRoot?: string;
@@ -83,6 +143,7 @@ export interface CoreSessionConfig extends CoreModelConfig, CoreRuntimeFeatures,
83
143
  extensions?: AgentConfig["extensions"];
84
144
  execution?: AgentConfig["execution"];
85
145
  compaction?: CoreCompactionConfig;
146
+ checkpoint?: CoreCheckpointConfig;
86
147
  onTeamEvent?: (event: TeamEvent) => void;
87
148
  onConsecutiveMistakeLimitReached?: (context: ConsecutiveMistakeLimitContext) => Promise<ConsecutiveMistakeLimitDecision> | ConsecutiveMistakeLimitDecision;
88
149
  toolRoutingRules?: ToolRoutingRule[];
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,10 @@ export type CoreSessionEvent = {
51
51
  payload: {
52
52
  sessionId: string;
53
53
  event: import("@clinebot/shared").AgentEvent;
54
+ /** Identifies the named agent within the team (e.g. "educator", "assessor", "coordinator") for both lead and teammate agents */
55
+ teamAgentId?: string;
56
+ /** Whether this is the lead agent or a teammate */
57
+ teamRole?: "lead" | "teammate";
54
58
  };
55
59
  } | {
56
60
  type: "team_progress";
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EACV,WAAW,GACX,aAAa,GACb,WAAW,GACX,aAAa,GACb,kBAAkB,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,wBAAwB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,kBAAkB,EAAE,0BAA0B,CAAC;IACjE,OAAO,EAAE,OAAO,kBAAkB,EAAE,mBAAmB,CAAC;CACxD;AAED,MAAM,WAAW,0BAA0B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;QAC5B,eAAe,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;CACH;AAED,MAAM,WAAW,kCAAkC;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,GACzB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,GAC7C;IACA,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,OAAO,kBAAkB,EAAE,UAAU,CAAC;KAC7C,CAAC;CACD,GACD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,wBAAwB,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,0BAA0B,CAAA;CAAE,GAChE;IACA,IAAI,EAAE,0BAA0B,CAAC;IACjC,OAAO,EAAE,kCAAkC,CAAC;CAC3C,GACD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/types/events.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,gBAAgB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EACV,WAAW,GACX,aAAa,GACb,WAAW,GACX,aAAa,GACb,kBAAkB,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,wBAAwB;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,kBAAkB,EAAE,0BAA0B,CAAC;IACjE,OAAO,EAAE,OAAO,kBAAkB,EAAE,mBAAmB,CAAC;CACxD;AAED,MAAM,WAAW,0BAA0B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;QAC5B,eAAe,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;CACH;AAED,MAAM,WAAW,kCAAkC;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC;IAC5B,eAAe,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,GACzB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,GAC7C;IACA,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,OAAO,kBAAkB,EAAE,UAAU,CAAC;QAC7C,gIAAgI;QAChI,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,mDAAmD;QACnD,QAAQ,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;KAC/B,CAAC;CACD,GACD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,wBAAwB,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,0BAA0B,CAAA;CAAE,GAChE;IACA,IAAI,EAAE,0BAA0B,CAAC;IACjC,OAAO,EAAE,kCAAkC,CAAC;CAC3C,GACD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@clinebot/core",
3
3
  "description": "Cline Core SDK for Node Runtime",
4
- "version": "0.0.30",
4
+ "version": "0.0.33",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
7
7
  "main": "./dist/index.js",
@@ -36,8 +36,8 @@
36
36
  "test:watch": "vitest --config vitest.config.ts"
37
37
  },
38
38
  "dependencies": {
39
- "@clinebot/agents": "0.0.30",
40
- "@clinebot/llms": "0.0.30",
39
+ "@clinebot/agents": "0.0.33",
40
+ "@clinebot/llms": "0.0.33",
41
41
  "@opentelemetry/api": "^1.9.0",
42
42
  "@opentelemetry/api-logs": "^0.214.0",
43
43
  "@opentelemetry/exporter-logs-otlp-http": "^0.214.0",
@@ -58,7 +58,7 @@
58
58
  },
59
59
  "devDependencies": {
60
60
  "@clinebot/rpc": "0.0.28",
61
- "@clinebot/shared": "0.0.30"
61
+ "@clinebot/shared": "0.0.33"
62
62
  },
63
63
  "engines": {
64
64
  "node": ">=22"
@@ -106,14 +106,26 @@ export async function runAgenticCompaction(options: {
106
106
  (total, message) => total + options.estimateMessageTokens(message),
107
107
  0,
108
108
  );
109
- return {
110
- messages: [
111
- buildSummaryMessage({
112
- summary,
113
- fileOps,
114
- tokensBefore,
115
- }),
116
- ...messages.slice(cutIndex),
117
- ],
118
- };
109
+ const resultMessages = [
110
+ buildSummaryMessage({
111
+ summary,
112
+ fileOps,
113
+ tokensBefore,
114
+ }),
115
+ ...messages.slice(cutIndex),
116
+ ];
117
+ const tokensAfter = resultMessages.reduce(
118
+ (total, message) => total + options.estimateMessageTokens(message),
119
+ 0,
120
+ );
121
+ options.logger?.debug("Performed agentic compaction", {
122
+ messagesBefore: messages.length,
123
+ messagesAfter: resultMessages.length,
124
+ messagesSummarized: cutIndex,
125
+ messagesPreserved: messages.length - cutIndex,
126
+ tokensBefore,
127
+ tokensAfter,
128
+ contextWindowTokens: options.context.contextWindowTokens,
129
+ });
130
+ return { messages: resultMessages };
119
131
  }
@@ -33,17 +33,19 @@ function sanitizeMessageForBasic(
33
33
  return text ? { ...message, content: text } : undefined;
34
34
  }
35
35
 
36
- const textParts: string[] = [];
37
- for (const block of message.content) {
38
- if (block.type === "text") {
39
- const text = block.text.trim();
40
- if (text) {
41
- textParts.push(text);
42
- }
43
- }
36
+ // Preserve array structure: keep only text blocks with non-empty content.
37
+ const kept = message.content.filter(
38
+ (block) => block.type === "text" && block.text.trim(),
39
+ );
40
+ if (kept.length === 0) {
41
+ return undefined;
44
42
  }
45
- const text = textParts.join("\n\n").trim();
46
- return text ? { ...message, content: text } : undefined;
43
+ return {
44
+ ...message,
45
+ content: kept.map((block) =>
46
+ block.type === "text" ? { ...block, text: block.text.trim() } : block,
47
+ ),
48
+ };
47
49
  }
48
50
 
49
51
  function getTotalTokens(
@@ -60,14 +62,25 @@ function truncateMessageToTokens(
60
62
  message: MessageWithMetadata,
61
63
  maxTokens: number,
62
64
  ): MessageWithMetadata {
63
- const content = typeof message.content === "string" ? message.content : "";
64
65
  const safeMaxTokens = Math.max(1, maxTokens);
65
66
  const targetChars = Math.max(16, safeMaxTokens * 4);
66
- const truncated = truncateText(content, targetChars).trim();
67
- return {
68
- ...message,
69
- content: truncated || "...",
70
- };
67
+
68
+ if (typeof message.content === "string") {
69
+ const truncated = truncateText(message.content, targetChars).trim();
70
+ return { ...message, content: truncated || "..." };
71
+ }
72
+
73
+ // Preserve content block array structure while truncating text blocks.
74
+ let remaining = targetChars;
75
+ const truncatedBlocks = message.content.map((block) => {
76
+ if (block.type !== "text" || remaining <= 0) {
77
+ return block;
78
+ }
79
+ const truncated = truncateText(block.text, remaining).trim();
80
+ remaining -= truncated.length;
81
+ return { ...block, text: truncated || "..." };
82
+ });
83
+ return { ...message, content: truncatedBlocks };
71
84
  }
72
85
 
73
86
  function buildBasicCandidates(
@@ -265,10 +278,22 @@ export function runBasicCompaction(options: {
265
278
  return undefined;
266
279
  }
267
280
 
281
+ const beforeTokens = getTotalTokens(
282
+ options.context.messages.map((m) => sanitizeMessageForBasic(m) ?? m),
283
+ options.estimateMessageTokens,
284
+ );
285
+ const afterTokens = getTotalTokens(
286
+ nextMessages,
287
+ options.estimateMessageTokens,
288
+ );
268
289
  options.logger?.debug("Performed basic compaction", {
269
- beforeCount: options.context.messages.length,
270
- afterCount: nextMessages.length,
290
+ messagesBefore: options.context.messages.length,
291
+ messagesAfter: nextMessages.length,
292
+ messagesRemoved: options.context.messages.length - nextMessages.length,
293
+ tokensBefore: beforeTokens,
294
+ tokensAfter: afterTokens,
271
295
  targetTokens,
296
+ contextWindowTokens: options.context.contextWindowTokens,
272
297
  });
273
298
 
274
299
  return { messages: nextMessages };
@@ -6,7 +6,7 @@ import type {
6
6
  } from "../../types/config";
7
7
 
8
8
  export const DEFAULT_CONTEXT_WINDOW_TOKENS = 200_000;
9
- export const DEFAULT_THRESHOLD_RATIO = 0.8;
9
+ export const DEFAULT_THRESHOLD_RATIO = 0.95;
10
10
  export const DEFAULT_RESERVE_TOKENS = 16_384;
11
11
  export const DEFAULT_PRESERVE_RECENT_TOKENS = 20_000;
12
12
  export const DEFAULT_SUMMARY_MAX_OUTPUT_TOKENS = 1_024;
@@ -363,16 +363,22 @@ describe("createContextCompactionPrepareTurn", () => {
363
363
  );
364
364
  expect(result?.messages).toBeDefined();
365
365
  expect(result?.messages.length).toBeGreaterThan(0);
366
- expect(
367
- result?.messages.every((message) => typeof message.content === "string"),
368
- ).toBe(true);
369
- expect(
370
- result?.messages.some((message) =>
371
- typeof message.content === "string"
372
- ? message.content.includes("tool output that should be removed")
373
- : false,
374
- ),
375
- ).toBe(false);
366
+ // Compacted messages should not contain tool_result content that was pruned.
367
+ for (const message of result?.messages ?? []) {
368
+ if (typeof message.content === "string") {
369
+ expect(message.content).not.toContain(
370
+ "tool output that should be removed",
371
+ );
372
+ } else {
373
+ for (const block of message.content) {
374
+ if (block.type === "text") {
375
+ expect(block.text).not.toContain(
376
+ "tool output that should be removed",
377
+ );
378
+ }
379
+ }
380
+ }
381
+ }
376
382
  });
377
383
 
378
384
  it("defaults to threshold ratio when reserveTokens is not configured", async () => {
@@ -185,19 +185,42 @@ export function createContextCompactionPrepareTurn(
185
185
  contextWindowTokens,
186
186
  });
187
187
 
188
- if (userCompaction?.compact) {
189
- return await userCompaction.compact(compactionContext);
188
+ const beforeMessageCount = context.messages.length;
189
+
190
+ const result = userCompaction?.compact
191
+ ? await userCompaction.compact(compactionContext)
192
+ : await runBuiltinStrategy({
193
+ context: compactionContext,
194
+ providerConfig: {
195
+ ...providerConfig,
196
+ abortSignal: context.abortSignal,
197
+ },
198
+ compaction: userCompaction,
199
+ estimateMessageTokens,
200
+ logger: config.logger,
201
+ });
202
+
203
+ if (result?.messages) {
204
+ const afterTokens = result.messages.reduce(
205
+ (total: number, message) => total + estimateMessageTokens(message),
206
+ 0,
207
+ );
208
+ config.logger?.log("Context compaction completed", {
209
+ severity: "info",
210
+ strategy: strategy,
211
+ contextWindowTokens,
212
+ inputTokens,
213
+ afterTokens,
214
+ tokensSaved: inputTokens - afterTokens,
215
+ utilizationBefore: `${((inputTokens / contextWindowTokens) * 100).toFixed(1)}%`,
216
+ utilizationAfter: `${((afterTokens / contextWindowTokens) * 100).toFixed(1)}%`,
217
+ thresholdTrigger: `${(triggerState.thresholdRatio * 100).toFixed(1)}%`,
218
+ messagesBefore: beforeMessageCount,
219
+ messagesAfter: result.messages.length,
220
+ messagesRemoved: beforeMessageCount - result.messages.length,
221
+ } as Record<string, unknown>);
190
222
  }
191
223
 
192
- return await runBuiltinStrategy({
193
- context: compactionContext,
194
- providerConfig: {
195
- ...providerConfig,
196
- abortSignal: context.abortSignal,
197
- },
198
- compaction: userCompaction,
199
- estimateMessageTokens,
200
- logger: config.logger,
201
- });
224
+ return result;
202
225
  };
203
226
  }
package/src/index.ts CHANGED
@@ -535,6 +535,8 @@ export type { SessionStatus } from "./types/common";
535
535
  export { SESSION_STATUSES, SessionSource } from "./types/common";
536
536
  export type {
537
537
  CoreAgentMode,
538
+ CoreCheckpointConfig,
539
+ CoreCheckpointContext,
538
540
  CoreCompactionConfig,
539
541
  CoreCompactionContext,
540
542
  CoreCompactionResult,
@@ -922,7 +922,7 @@ describe("listLocalProviders", () => {
922
922
  ).toBe(true);
923
923
  });
924
924
 
925
- it("uses the same built-in model list for cline as vercel-ai-gateway", async () => {
925
+ it("uses the same built-in model list for cline as openrouter", async () => {
926
926
  manager.saveProviderSettings(
927
927
  {
928
928
  provider: "cline",
@@ -935,12 +935,12 @@ describe("listLocalProviders", () => {
935
935
 
936
936
  const { providers } = await listLocalProviders(manager);
937
937
  const cline = providers.find((provider) => provider.id === "cline");
938
- const gateway = providers.find(
939
- (provider) => provider.id === "vercel-ai-gateway",
938
+ const openrouter = providers.find(
939
+ (provider) => provider.id === "openrouter",
940
940
  );
941
941
 
942
942
  expect(cline?.modelList?.length).toBeGreaterThan(0);
943
- expect(cline?.modelList).toEqual(gateway?.modelList);
943
+ expect(cline?.modelList).toEqual(openrouter?.modelList);
944
944
  });
945
945
 
946
946
  it("does not eagerly fetch LiteLLM private models while listing providers", async () => {
@@ -24,6 +24,16 @@ type CreateCheckpointHooksOptions = {
24
24
  writeSessionMetadata: (
25
25
  metadata: Record<string, unknown>,
26
26
  ) => Promise<void> | void;
27
+ /**
28
+ * Optional custom checkpoint implementation. When provided, the built-in
29
+ * git stash/ref logic is skipped entirely and this function is called
30
+ * instead. Return `undefined` to skip writing a checkpoint for that run.
31
+ */
32
+ createCheckpoint?: (context: {
33
+ cwd: string;
34
+ sessionId: string;
35
+ runCount: number;
36
+ }) => Promise<CheckpointEntry | undefined> | CheckpointEntry | undefined;
27
37
  };
28
38
 
29
39
  function warn(logger: BasicLogger | undefined, message: string): void {
@@ -99,6 +109,14 @@ export function createCheckpointHooks(
99
109
  };
100
110
 
101
111
  const createCheckpoint = async (): Promise<CheckpointEntry | undefined> => {
112
+ if (options.createCheckpoint) {
113
+ return await options.createCheckpoint({
114
+ cwd: options.cwd,
115
+ sessionId: options.sessionId,
116
+ runCount,
117
+ });
118
+ }
119
+
102
120
  if (!(await ensureGitRepository())) {
103
121
  return undefined;
104
122
  }
@@ -137,8 +155,15 @@ export function createCheckpointHooks(
137
155
  };
138
156
  }
139
157
 
158
+ // Store the stash commit under a private ref namespace so it is
159
+ // invisible to the user's normal `git stash list` workflow.
160
+ // `refs/stash` is what populates that list; writing to any other
161
+ // ref path keeps the object reachable (GC-safe) without surfacing
162
+ // it to the user. The raw SHA already works with `git stash apply`
163
+ // on the restore path, so no restore-side changes are needed.
164
+ const privateRef = `refs/cline/checkpoints/${options.sessionId}/${runCount}`;
140
165
  try {
141
- await runGit(options.cwd, ["stash", "store", "-m", message, ref]);
166
+ await runGit(options.cwd, ["update-ref", privateRef, ref]);
142
167
  } catch (error) {
143
168
  warn(
144
169
  options.logger,
@@ -150,7 +150,6 @@ describe("DefaultSessionManager", () => {
150
150
  const envSnapshot = {
151
151
  HOME: process.env.HOME,
152
152
  CLINE_DIR: process.env.CLINE_DIR,
153
- CLINE_CHECKPOINT: process.env.CLINE_CHECKPOINT,
154
153
  };
155
154
  let isolatedHomeDir = "";
156
155
 
@@ -158,7 +157,6 @@ describe("DefaultSessionManager", () => {
158
157
  isolatedHomeDir = mkdtempSync(join(tmpdir(), "core-session-home-"));
159
158
  process.env.HOME = isolatedHomeDir;
160
159
  process.env.CLINE_DIR = join(isolatedHomeDir, ".cline");
161
- delete process.env.CLINE_CHECKPOINT;
162
160
  setHomeDir(isolatedHomeDir);
163
161
  setClineDir(process.env.CLINE_DIR);
164
162
  });
@@ -166,7 +164,6 @@ describe("DefaultSessionManager", () => {
166
164
  afterEach(() => {
167
165
  process.env.HOME = envSnapshot.HOME;
168
166
  process.env.CLINE_DIR = envSnapshot.CLINE_DIR;
169
- process.env.CLINE_CHECKPOINT = envSnapshot.CLINE_CHECKPOINT;
170
167
  setHomeDir(envSnapshot.HOME ?? "~");
171
168
  setClineDir(envSnapshot.CLINE_DIR ?? join("~", ".cline"));
172
169
  rmSync(isolatedHomeDir, { recursive: true, force: true });
@@ -652,7 +649,7 @@ describe("DefaultSessionManager", () => {
652
649
  );
653
650
  });
654
651
 
655
- it("does not install checkpoint hooks unless CLINE_CHECKPOINT=true", async () => {
652
+ it("does not install checkpoint hooks when checkpoint.enabled is not set in config", async () => {
656
653
  const sessionId = "sess-checkpoint-default-off";
657
654
  const manifest = createManifest(sessionId);
658
655
  const updateSession = vi.fn().mockResolvedValue({ updated: true });
@@ -737,10 +734,8 @@ describe("DefaultSessionManager", () => {
737
734
  });
738
735
  });
739
736
 
740
- it("installs checkpoint hooks when CLINE_CHECKPOINT=true", async () => {
741
- process.env.CLINE_CHECKPOINT = "true";
742
-
743
- const sessionId = "sess-checkpoint-env-on";
737
+ it("installs checkpoint hooks when checkpoint.enabled=true in config", async () => {
738
+ const sessionId = "sess-checkpoint-config-on";
744
739
  const repoCwd = mkdtempSync(join(isolatedHomeDir, "checkpoint-repo-"));
745
740
  createGitRepo(repoCwd);
746
741
  const manifest = createManifest(sessionId);
@@ -813,7 +808,10 @@ describe("DefaultSessionManager", () => {
813
808
  });
814
809
 
815
810
  await manager.start({
816
- config: createConfig({ sessionId, cwd: repoCwd }),
811
+ config: {
812
+ ...createConfig({ sessionId, cwd: repoCwd }),
813
+ checkpoint: { enabled: true },
814
+ },
817
815
  prompt: "hello",
818
816
  interactive: false,
819
817
  });
@@ -115,11 +115,6 @@ type SessionBackend =
115
115
  const MAX_SCAN_LIMIT = 5000;
116
116
  const MAX_USER_FILE_BYTES = 20 * 1_000 * 1_024;
117
117
 
118
- // NOTE: Temporarily disabled until checkpoint is ready for production.
119
- function isCheckpointFeatureEnabled(): boolean {
120
- return process?.env?.CLINE_CHECKPOINT === "true";
121
- }
122
-
123
118
  async function loadUserFileContent(path: string): Promise<string> {
124
119
  const fileStat = await stat(path);
125
120
  if (!fileStat.isFile()) {
@@ -277,11 +272,12 @@ export class DefaultSessionManager implements SessionManager {
277
272
  };
278
273
  configWithProvider.hooks = mergeAgentHooks([
279
274
  effectiveConfig.hooks,
280
- isCheckpointFeatureEnabled()
275
+ effectiveConfig.checkpoint?.enabled === true
281
276
  ? createCheckpointHooks({
282
277
  cwd: configWithProvider.cwd,
283
278
  sessionId,
284
279
  logger: configWithProvider.logger,
280
+ createCheckpoint: effectiveConfig.checkpoint?.createCheckpoint,
285
281
  readSessionMetadata: async () =>
286
282
  (await this.get(sessionId))?.metadata as
287
283
  | Record<string, unknown>
@@ -160,13 +160,11 @@ describe("UnifiedSessionPersistenceService", () => {
160
160
  row.sessionId.includes("__teamtask__java-haiku-agent__"),
161
161
  )?.sessionId;
162
162
  expect(teammateSessionId).toBeTruthy();
163
- const path = join(
164
- sessionsDir,
165
- rootSessionId,
166
- "java-haiku-agent__" +
167
- teammateSessionId?.slice(teammateSessionId?.lastIndexOf("__") + 2) +
168
- ".messages.json",
163
+ const row = childSessions.find(
164
+ (item) => item.sessionId === teammateSessionId,
169
165
  );
166
+ expect(row?.messagesPath).toBeTruthy();
167
+ const path = row?.messagesPath as string;
170
168
  const payload = JSON.parse(readFileSync(path, "utf8")) as {
171
169
  agent?: string;
172
170
  sessionId?: string;
@@ -195,18 +193,11 @@ describe("UnifiedSessionPersistenceService", () => {
195
193
  cacheWriteTokens: 0,
196
194
  cost: 0.123,
197
195
  });
198
- const row = childSessions.find(
199
- (item) => item.sessionId === teammateSessionId,
200
- );
201
196
  expect(row?.messagesPath).toBe(path);
202
- expect(row?.transcriptPath).toBe(
203
- join(
204
- sessionsDir,
205
- rootSessionId,
206
- "java-haiku-agent__" +
207
- teammateSessionId?.slice(teammateSessionId?.lastIndexOf("__") + 2) +
208
- ".log",
209
- ),
197
+ expect(row?.transcriptPath).toBeTruthy();
198
+ expect(row?.transcriptPath).toContain(
199
+ join(sessionsDir, rootSessionId, "java-haiku-agent__"),
210
200
  );
201
+ expect(row?.transcriptPath).toMatch(/\.log$/);
211
202
  });
212
203
  });
@@ -234,7 +234,15 @@ export function handleAgentEvent(
234
234
 
235
235
  emit({
236
236
  type: "agent_event",
237
- payload: { sessionId, event },
237
+ payload: {
238
+ sessionId,
239
+ event,
240
+ teamAgentId: overrides?.teamAgentId,
241
+ teamRole:
242
+ overrides !== undefined
243
+ ? (overrides.teamRole ?? (isPrimaryAgentEvent ? "lead" : undefined))
244
+ : undefined,
245
+ },
238
246
  });
239
247
  emit({
240
248
  type: "chunk",