@cline/core 0.0.66 → 0.0.67

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 (33) hide show
  1. package/dist/ClineCore.d.ts +12 -0
  2. package/dist/extensions/context/compaction-shared.d.ts +3 -0
  3. package/dist/extensions/context/compaction.d.ts +8 -1
  4. package/dist/extensions/mcp/index.d.ts +3 -2
  5. package/dist/extensions/mcp/timeout.d.ts +2 -0
  6. package/dist/extensions/mcp/types.d.ts +9 -0
  7. package/dist/extensions/plugin/plugin-sandbox.d.ts +7 -0
  8. package/dist/extensions/plugin-sandbox-bootstrap.js +1 -1
  9. package/dist/extensions/tools/definitions.d.ts +1 -1
  10. package/dist/extensions/tools/executors/index.d.ts +1 -1
  11. package/dist/extensions/tools/index.d.ts +1 -1
  12. package/dist/extensions/tools/schemas.d.ts +45 -45
  13. package/dist/extensions/tools/types.d.ts +8 -1
  14. package/dist/hooks/checkpoint-hooks.d.ts +1 -7
  15. package/dist/hooks/hook-file-hooks.d.ts +3 -2
  16. package/dist/hub/daemon/entry.js +184 -184
  17. package/dist/hub/index.js +181 -181
  18. package/dist/index.d.ts +5 -4
  19. package/dist/index.js +180 -180
  20. package/dist/runtime/host/local/agent-event-bridge.d.ts +10 -1
  21. package/dist/runtime/host/local-runtime-host.d.ts +1 -0
  22. package/dist/runtime/host/runtime-host.d.ts +10 -0
  23. package/dist/services/llms/provider-settings.d.ts +4 -0
  24. package/dist/services/providers/local-provider-registry.d.ts +0 -3
  25. package/dist/services/telemetry/TelemetryService.d.ts +6 -0
  26. package/dist/services/telemetry/distinct-id.d.ts +1 -0
  27. package/dist/services/telemetry/index.d.ts +1 -1
  28. package/dist/services/telemetry/index.js +1 -1
  29. package/dist/session/checkpoint-restore.d.ts +14 -1
  30. package/dist/session/session-versioning-service.d.ts +3 -1
  31. package/dist/session/user-run-messages.d.ts +20 -0
  32. package/package.json +4 -4
  33. package/dist/services/telemetry/tool-context.d.ts +0 -3
@@ -25,6 +25,15 @@ export declare class AgentEventBridge {
25
25
  handlePluginEvent(rootSessionId: string, event: {
26
26
  name: string;
27
27
  payload?: unknown;
28
- }, fallbackAutomation?: NonNullable<CoreSessionConfig["extensionContext"]>["automation"]): Promise<void>;
28
+ }, fallbackAutomation?: NonNullable<CoreSessionConfig["extensionContext"]>["automation"], fallbackTelemetry?: CoreSessionConfig["telemetry"]): Promise<void>;
29
+ /**
30
+ * Route `plugin_telemetry` events emitted by the sandbox-side telemetry
31
+ * bridge into the host telemetry service. Sandboxed plugins cannot hold
32
+ * the live service (it is not JSON-serializable across the IPC boundary),
33
+ * so their capture/record calls arrive as events. All plugin events are
34
+ * namespaced under `plugin.` and stamped with the plugin name so they
35
+ * cannot impersonate first-party events.
36
+ */
37
+ handlePluginTelemetry(rootSessionId: string, payload: unknown, fallbackTelemetry?: CoreSessionConfig["telemetry"]): void;
29
38
  handlePluginLog(rootSessionId: string, payload: unknown, fallbackLogger?: BasicLogger): void;
30
39
  }
@@ -81,6 +81,7 @@ export declare class LocalRuntimeHost implements RuntimeHost {
81
81
  private canPersistCompactionState;
82
82
  private persistActiveSessionCompactionState;
83
83
  private enqueueCompactionStateWrite;
84
+ readLiveSessionMessages(sessionId: string): Promise<LlmsProviders.Message[]>;
84
85
  readSessionMessages(sessionId: string): Promise<LlmsProviders.Message[]>;
85
86
  dispatchHookEvent(payload: HookEventPayload): Promise<void>;
86
87
  subscribe(listener: (event: CoreSessionEvent) => void, options?: RuntimeHostSubscribeOptions): () => void;
@@ -188,6 +188,16 @@ export interface RuntimeHost {
188
188
  }>;
189
189
  readSessionCompactionState(sessionId: string): Promise<SessionCompactionState | undefined>;
190
190
  readSessionMessages(sessionId: string): Promise<LlmsProviders.Message[]>;
191
+ /**
192
+ * Like {@link readSessionMessages}, but prefers the resident session's
193
+ * in-memory conversation over the persisted transcript. Disk persistence
194
+ * happens at assistant-message/turn boundaries (and abort() does not
195
+ * flush), so this is the accurate read for callers that need the
196
+ * conversation of an in-flight or just-aborted turn — e.g. rebuilding a
197
+ * session for a mode switch. Optional: hosts without live-session access
198
+ * (e.g. hub clients) fall back to the persisted transcript.
199
+ */
200
+ readLiveSessionMessages?(sessionId: string): Promise<LlmsProviders.Message[]>;
191
201
  dispatchHookEvent(payload: HookEventPayload): Promise<void>;
192
202
  subscribe(listener: (event: CoreSessionEvent) => void, options?: RuntimeHostSubscribeOptions): () => void;
193
203
  }
@@ -51,10 +51,12 @@ export declare const ReasoningSettingsSchema: z.ZodObject<{
51
51
  enabled: z.ZodOptional<z.ZodBoolean>;
52
52
  effort: z.ZodOptional<z.ZodEnum<{
53
53
  none: "none";
54
+ minimal: "minimal";
54
55
  low: "low";
55
56
  medium: "medium";
56
57
  high: "high";
57
58
  xhigh: "xhigh";
59
+ max: "max";
58
60
  }>>;
59
61
  budgetTokens: z.ZodOptional<z.ZodNumber>;
60
62
  }, z.core.$strip>;
@@ -165,10 +167,12 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
165
167
  enabled: z.ZodOptional<z.ZodBoolean>;
166
168
  effort: z.ZodOptional<z.ZodEnum<{
167
169
  none: "none";
170
+ minimal: "minimal";
168
171
  low: "low";
169
172
  medium: "medium";
170
173
  high: "high";
171
174
  xhigh: "xhigh";
175
+ max: "max";
172
176
  }>>;
173
177
  budgetTokens: z.ZodOptional<z.ZodNumber>;
174
178
  }, z.core.$strip>>;
@@ -34,7 +34,6 @@ export declare const StoredModelEntrySchema: z.ZodObject<{
34
34
  "openai-responses": "openai-responses";
35
35
  r1: "r1";
36
36
  }>>;
37
- isR1FormatRequired: z.ZodOptional<z.ZodBoolean>;
38
37
  }, z.core.$loose>;
39
38
  export type StoredModelEntry = z.infer<typeof StoredModelEntrySchema>;
40
39
  export declare const StoredProviderMetadataSchema: z.ZodObject<{
@@ -152,7 +151,6 @@ export declare const StoredProviderEntrySchema: z.ZodObject<{
152
151
  "openai-responses": "openai-responses";
153
152
  r1: "r1";
154
153
  }>>;
155
- isR1FormatRequired: z.ZodOptional<z.ZodBoolean>;
156
154
  }, z.core.$loose>>>;
157
155
  }, z.core.$loose>;
158
156
  export type StoredProviderEntry = z.infer<typeof StoredProviderEntrySchema>;
@@ -232,7 +230,6 @@ export declare const StoredModelsFileSchema: z.ZodObject<{
232
230
  "openai-responses": "openai-responses";
233
231
  r1: "r1";
234
232
  }>>;
235
- isR1FormatRequired: z.ZodOptional<z.ZodBoolean>;
236
233
  }, z.core.$loose>>>;
237
234
  }, z.core.$loose>>;
238
235
  }, z.core.$strip>;
@@ -4,6 +4,11 @@ export interface TelemetryServiceOptions {
4
4
  adapters?: ITelemetryAdapter[];
5
5
  metadata?: Partial<TelemetryMetadata>;
6
6
  distinctId?: string;
7
+ /**
8
+ * Deterministic per-device identifier attached to every event as
9
+ * `device_id`. Defaults to {@link resolveCoreDeviceId}
10
+ */
11
+ deviceId?: string;
7
12
  commonProperties?: TelemetryProperties;
8
13
  logger?: BasicLogger;
9
14
  }
@@ -11,6 +16,7 @@ export declare class TelemetryService implements ITelemetryService {
11
16
  private adapters;
12
17
  private metadata;
13
18
  private distinctId?;
19
+ private readonly deviceId;
14
20
  private commonProperties;
15
21
  constructor(options?: TelemetryServiceOptions);
16
22
  addAdapter(adapter: ITelemetryAdapter): void;
@@ -1 +1,2 @@
1
+ export declare function resolveCoreDeviceId(): string;
1
2
  export declare function resolveCoreDistinctId(explicitDistinctId?: string): string;
@@ -1,4 +1,4 @@
1
- export { resolveCoreDistinctId } from "./distinct-id";
1
+ export { resolveCoreDeviceId, resolveCoreDistinctId } from "./distinct-id";
2
2
  export type { ITelemetryAdapter, TelemetryArray, TelemetryMetadata, TelemetryObject, TelemetryPrimitive, TelemetryProperties, TelemetryValue, } from "./ITelemetryAdapter";
3
3
  export { OpenTelemetryAdapter, type OpenTelemetryAdapterOptions, } from "./OpenTelemetryAdapter";
4
4
  export { type ConfiguredTelemetryHandle, type CreateOpenTelemetryTelemetryServiceOptions, createConfiguredTelemetryHandle, createConfiguredTelemetryService, createOpenTelemetryTelemetryService, OpenTelemetryProvider, type OpenTelemetryProviderOptions, } from "./OpenTelemetryProvider";
@@ -1 +1 @@
1
- import{existsSync as U,mkdirSync as r,readFileSync as k,writeFileSync as w}from"node:fs";import{resolve as C}from"node:path";import{resolveSessionDataDir as E}from"@cline/shared/storage";import{nanoid as q}from"nanoid";import*as b from"node-machine-id";var N="machine-id";function H(f){let P=f?.trim();if(P)return P;let T=z();if(T)return T;return D()}function c(){let f=b;return f.machineIdSync??f.default?.machineIdSync}function z(){try{let f=c();if(!f)return;return f().trim()||void 0}catch{return}}function D(){let f=E(),P=C(f,N);try{if(U(P)){let h=k(P,"utf8").trim();if(h.length>0)return h}}catch{}let T=`cl-${q()}`;try{r(f,{recursive:!0}),w(P,T,"utf8")}catch{}return T}class L{name;metadata;meter;logger;enabled;distinctId;commonProperties;counters=new Map;histograms=new Map;gauges=new Map;gaugeValues=new Map;meterProvider;loggerProvider;constructor(f){this.name=f.name??"OpenTelemetryAdapter",this.metadata={...f.metadata},this.meterProvider=f.meterProvider,this.loggerProvider=f.loggerProvider,this.meter=f.meterProvider?.getMeter("cline")??null,this.logger=f.loggerProvider?.getLogger("cline")??null,this.enabled=f.enabled??!0,this.distinctId=f.distinctId,this.commonProperties=f.commonProperties?{...f.commonProperties}:{}}emit(f,P){if(!this.isEnabled())return;this.emitLog(f,P,!1)}emitRequired(f,P){this.emitLog(f,P,!0)}recordCounter(f,P,T,h,m=!1){if(!this.meter||!m&&!this.isEnabled())return;let A=this.counters.get(f);if(!A)A=this.meter.createCounter(f,h?{description:h}:void 0),this.counters.set(f,A);A.add(P,this.flattenProperties(this.buildAttributes(T)))}recordHistogram(f,P,T,h,m=!1){if(!this.meter||!m&&!this.isEnabled())return;let A=this.histograms.get(f);if(!A)A=this.meter.createHistogram(f,h?{description:h}:void 0),this.histograms.set(f,A);A.record(P,this.flattenProperties(this.buildAttributes(T)))}recordGauge(f,P,T,h,m=!1){if(!this.meter||!m&&!this.isEnabled())return;let A=this.buildAttributes(T),u=JSON.stringify(A),g=this.gaugeValues.get(f);if(P===null){if(g){if(g.delete(u),g.size===0)this.gaugeValues.delete(f),this.gauges.delete(f)}return}let O=g;if(!O)O=new Map,this.gaugeValues.set(f,O);if(!this.gauges.has(f)){let M=this.meter.createObservableGauge(f,h?{description:h}:void 0);M.addCallback((J)=>{for(let I of this.snapshotGaugeSeries(f))J.observe(I.value,this.flattenProperties(I.attributes))}),this.gauges.set(f,M)}O.set(u,{value:P,attributes:A})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}setDistinctId(f){this.distinctId=f}setCommonProperties(f){this.commonProperties={...f}}updateCommonProperties(f){this.commonProperties={...this.commonProperties,...f}}async flush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.()])}emitLog(f,P,T){if(!this.logger)return;let h=this.flattenProperties(this.buildAttributes(P,T));this.logger.emit({severityText:"INFO",body:f,attributes:h})}buildAttributes(f,P=!1){return{...this.commonProperties,...this.metadata,...f,...this.distinctId?{distinct_id:this.distinctId}:{},...P?{_required:!0}:{}}}snapshotGaugeSeries(f){let P=this.gaugeValues.get(f);if(!P)return[];return Array.from(P.values(),(T)=>({value:T.value,attributes:T.attributes?{...T.attributes}:void 0}))}flattenProperties(f,P="",T=new WeakSet,h=0){if(!f)return{};let m={},A=100,u=10;for(let[g,O]of Object.entries(f)){if(g==="__proto__"||g==="constructor"||g==="prototype")continue;let M=P?`${P}.${g}`:g;if(O===null||O===void 0){m[M]=String(O);continue}if(Array.isArray(O)){let J=O.length>A?O.slice(0,A):O;try{m[M]=JSON.stringify(J)}catch{m[M]="[UnserializableArray]"}if(O.length>A)m[`${M}_truncated`]=!0,m[`${M}_original_length`]=O.length;continue}if(typeof O==="object"){if(O instanceof Date){m[M]=O.toISOString();continue}if(O instanceof Error){m[M]=O.message;continue}if(T.has(O)){m[M]="[Circular]";continue}if(h>=u){m[M]="[MaxDepthExceeded]";continue}T.add(O),Object.assign(m,this.flattenProperties(O,M,T,h+1));continue}if(G(O)){m[M]=O;continue}try{m[M]=JSON.stringify(O)}catch{m[M]=String(O)}}return m}}function G(f){return typeof f==="string"||typeof f==="number"||typeof f==="boolean"}import{metrics as p,trace as s}from"@opentelemetry/api";import{logs as o}from"@opentelemetry/api-logs";import{OTLPLogExporter as ff}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as Pf}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as Tf}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as hf}from"@opentelemetry/resources";import{BatchLogRecordProcessor as mf,ConsoleLogRecordExporter as Af,LoggerProvider as Of}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as uf,MeterProvider as Mf,PeriodicExportingMetricReader as Z}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as gf,ConsoleSpanExporter as yf,SimpleSpanProcessor as Hf}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as Lf}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as jf,ATTR_SERVICE_VERSION as $f}from"@opentelemetry/semantic-conventions";import{mkdirSync as cf,readFileSync as x,statSync as d,writeFileSync as zf}from"node:fs";import{resolveGlobalSettingsPath as S}from"@cline/shared/storage";import{z as y}from"zod";import{AGENT_UNEXPECTED_REASONING_TOKENS_EVENT as vf,captureAgentUnexpectedReasoningTokens as Ff,captureTaskLifecycleEvent as Qf,SDK_ERROR_TELEMETRY_EVENT as Uf,TASK_CANCELLED_EVENT as rf,TASK_FIRST_CHUNK_RECEIVED_EVENT as kf,TASK_PROVIDER_REQUEST_STARTED_EVENT as wf,TASK_PROVIDER_STREAM_FAILED_EVENT as Cf,TASK_PROVIDER_STREAM_STARTED_EVENT as Ef}from"@cline/shared";var V=y.preprocess((f)=>Array.isArray(f)?f.filter((P)=>typeof P==="string").map((P)=>P.trim()).filter(Boolean):void 0,y.array(y.string()).optional()).transform((f)=>{if(!f)return;let P=[...new Set(f)].sort((T,h)=>T.localeCompare(h));return P.length>0?P:void 0}),a=y.enum(["basic","agentic"]).catch("agentic"),i=y.enum(["plan","act"]),X=y.object({telemetryOptOut:y.boolean().default(!1).catch(!1),autoUpdateEnabled:y.boolean().default(!0).catch(!0),compactionStrategy:a.optional(),compactionEnabled:y.boolean().optional().catch(void 0),planActMode:i.optional().catch(void 0),toolAutoApprove:y.boolean().optional().catch(void 0),disabledTools:V.optional(),disabledPlugins:V.optional()}).strip().transform((f)=>{let P={autoUpdateEnabled:f.autoUpdateEnabled,telemetryOptOut:f.telemetryOptOut};if(f.compactionStrategy)P.compactionStrategy=f.compactionStrategy;if(f.compactionEnabled!==void 0)P.compactionEnabled=f.compactionEnabled;if(f.planActMode)P.planActMode=f.planActMode;if(f.toolAutoApprove!==void 0)P.toolAutoApprove=f.toolAutoApprove;if(f.disabledTools?.length)P.disabledTools=f.disabledTools;if(f.disabledPlugins?.length)P.disabledPlugins=f.disabledPlugins;return P});function j(){return X.parse({})}var R;function l(f){if(f.disabledTools)Object.freeze(f.disabledTools);if(f.disabledPlugins)Object.freeze(f.disabledPlugins);return Object.freeze(f)}function n(f){let P;try{P=x(f,"utf8")}catch{return j()}try{let T=X.safeParse(JSON.parse(P));return T.success?T.data:j()}catch{return j()}}function t(){let f=S(),P=d(f,{throwIfNoEntry:!1}),T=P?.mtimeMs??0,h=P?.size??0,m=R;if(m&&m.path===f&&m.mtimeMs===T&&m.size===h)return m;let A=l(P?n(f):j());return R={path:f,mtimeMs:T,size:h,value:A},R}function e(){return t().value}function Y(){return e().telemetryOptOut}class W{name;logger;enabled;constructor(f={}){this.name=f.name??"TelemetryLoggerSink",this.logger=f.logger,this.enabled=f.enabled??!0}emit(f,P){if(!this.isEnabled())return;this.logger?.log("telemetry.event",{telemetrySink:this.name,event:f,properties:P})}emitRequired(f,P){this.logger?.log("telemetry.required_event",{telemetrySink:this.name,severity:"warn",event:f,properties:P})}recordCounter(f,P,T,h,m){if(!m&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:f,value:P,attributes:T,description:h,required:m===!0})}recordHistogram(f,P,T,h,m){if(!m&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:f,value:P,attributes:T,description:h,required:m===!0})}recordGauge(f,P,T,h,m){if(!m&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:f,value:P,attributes:T,description:h,required:m===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class ${adapters;metadata;distinctId;commonProperties;constructor(f={}){if(this.adapters=[...f.adapters??[]],f.logger)this.adapters.push(new W({logger:f.logger}));this.metadata={...f.metadata??{}},this.distinctId=f.distinctId,this.commonProperties={...f.commonProperties??{}}}addAdapter(f){this.adapters.push(f)}setDistinctId(f){this.distinctId=f}setMetadata(f){this.metadata={...f}}updateMetadata(f){this.metadata={...this.metadata,...f}}setCommonProperties(f){this.commonProperties={...f}}updateCommonProperties(f){this.commonProperties={...this.commonProperties,...f}}isEnabled(){return this.adapters.some((f)=>f.isEnabled())}capture(f){let P=this.buildAttributes(f.properties);for(let T of this.adapters)T.emit(f.event,P)}captureRequired(f,P){let T=this.buildAttributes(P);for(let h of this.adapters)h.emitRequired(f,T)}recordCounter(f,P,T,h,m=!1){let A=this.buildAttributes(T);for(let u of this.adapters)u.recordCounter(f,P,A,h,m)}recordHistogram(f,P,T,h,m=!1){let A=this.buildAttributes(T);for(let u of this.adapters)u.recordHistogram(f,P,A,h,m)}recordGauge(f,P,T,h,m=!1){let A=this.buildAttributes(T);for(let u of this.adapters)u.recordGauge(f,P,A,h,m)}async flush(){await Promise.all(this.adapters.map((f)=>f.flush()))}async dispose(){await Promise.all(this.adapters.map((f)=>f.dispose()))}buildAttributes(f){return{...this.commonProperties,...f,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class v{distinctId;metadata;commonProperties;constructor(f={}){this.distinctId=f.distinctId,this.metadata={...f.metadata??{}},this.commonProperties={...f.commonProperties??{}}}setDistinctId(f){this.distinctId=f}setMetadata(f){this.metadata={...f}}updateMetadata(f){this.metadata={...this.metadata,...f}}setCommonProperties(f){this.commonProperties={...f}}updateCommonProperties(f){this.commonProperties={...this.commonProperties,...f}}isEnabled(){return!1}capture(f){this.resolveProperties(f.properties)}captureRequired(f,P){this.resolveProperties(P)}recordCounter(){}recordHistogram(){}recordGauge(){}async flush(){}async dispose(){}resolveProperties(f){return{...this.commonProperties,...f,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class B{meterProvider;loggerProvider;tracerProvider;options;constructor(f={}){this.options=f;let P=hf({[jf]:f.serviceName??"cline",...f.serviceVersion?{[$f]:f.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(P),this.loggerProvider=this.createLoggerProvider(P),this.tracerProvider=this.createTracerProvider(P),this.meterProvider)p.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)o.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(f="cline",P){return s.getTracer(f,P??this.options.serviceVersion)}createAdapter(f){return new L({...f,meterProvider:this.meterProvider,loggerProvider:this.loggerProvider})}createTelemetryService(f){let P=this.createAdapter({name:f.name,enabled:this.options.enabled,metadata:f.metadata});return new $({...f,adapters:[P],distinctId:H(f.distinctId)})}async forceFlush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.(),this.tracerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.(),this.tracerProvider?.shutdown?.()])}createMeterProvider(f){let P=_(this.options.metricsExporter);if(P.length===0)return null;let T=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),h=Math.min(30000,Math.floor(T*0.8)),m=P.map((A)=>_f(A,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:T,timeout:h})).filter((A)=>A!==null);if(m.length===0)return null;return new Mf({resource:f,readers:m})}createTracerProvider(f){let P=_(this.options.tracesExporter);if(P.length===0)return null;let T=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,h=this.options.otlpTracesHeaders??this.options.otlpHeaders,m=[];for(let A of P){let u=Wf(A,{endpoint:T,headers:h,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(u)m.push(u)}if(m.length===0)return null;return new Lf({resource:f,spanProcessors:m})}createLoggerProvider(f){let P=_(this.options.logsExporter);if(P.length===0)return null;let T=P.map((h)=>{let m=Rf(h,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!m)return null;return new mf(m,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((h)=>h!==null);if(T.length===0)return null;return new Of({resource:f,processors:T})}}function F(f){let P=new B(f),T=P.createTelemetryService(f),h=()=>{T.captureRequired("telemetry.provider_created",{provider:"opentelemetry",enabled:f.enabled??!0,logsExporter:Array.isArray(f.logsExporter)?f.logsExporter.join(","):f.logsExporter,metricsExporter:Array.isArray(f.metricsExporter)?f.metricsExporter.join(","):f.metricsExporter,tracesExporter:Array.isArray(f.tracesExporter)?f.tracesExporter.join(","):f.tracesExporter,otlpProtocol:f.otlpProtocol,hasOtlpEndpoint:Boolean(f.otlpEndpoint),serviceName:f.serviceName,serviceVersion:f.serviceVersion})};if(!f.deferProviderCreatedEvent)h();return{provider:P,telemetry:T,emitProviderCreated:h}}function Q(f){if(Y())return{telemetry:new v(f)};if(f.enabled!==!0)return{telemetry:new $({...f,distinctId:H(f.distinctId)})};return F(f)}function Jf(f){let{telemetry:P,provider:T,emitProviderCreated:h}=Q(f);return{telemetry:P,provider:T,flush:async()=>{let u=T;if(u&&typeof u.forceFlush==="function")try{await u.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([P.dispose(),T?.dispose()])},...f.deferProviderCreatedEvent&&h?{emitProviderCreated:h}:{}}}function _(f){if(!f)return[];return(Array.isArray(f)?f:f.split(",")).map((T)=>T.trim()).filter((T)=>T==="console"||T==="otlp")}function Rf(f,P){if(f==="console")return new Af;if(!P.endpoint)return null;let T=K(P.endpoint,"/v1/logs");return new ff({url:T,headers:P.headers})}function Wf(f,P){if(f==="console")return new Hf(new yf);if(!P.endpoint)return null;let T=K(P.endpoint,"/v1/traces");return new gf(new Tf({url:T,headers:P.headers}))}function _f(f,P){if(f==="console")return new Z({exporter:new uf,exportIntervalMillis:P.interval,exportTimeoutMillis:P.timeout});if(!P.endpoint)return null;let T=K(P.endpoint,"/v1/metrics");return new Z({exporter:new Pf({url:T,headers:P.headers}),exportIntervalMillis:P.interval,exportTimeoutMillis:P.timeout})}function K(f,P){let T=new URL(f),h=T.pathname.endsWith("/")?T.pathname.slice(0,-1):T.pathname;return T.pathname=h.endsWith(P)?h:`${h}${P}`,T.toString()}export{H as resolveCoreDistinctId,F as createOpenTelemetryTelemetryService,Q as createConfiguredTelemetryService,Jf as createConfiguredTelemetryHandle,B as OpenTelemetryProvider,L as OpenTelemetryAdapter};
1
+ import{existsSync as D,mkdirSync as G,readFileSync as v,writeFileSync as u}from"node:fs";import{resolve as x}from"node:path";import{resolveSessionDataDir as b}from"@cline/shared/storage";import{nanoid as S}from"nanoid";import*as m from"node-machine-id";var c="machine-id",h,w=!1;function Y(){if(!w)h=E(),w=!0;return h??k()}function L(f){let O=f?.trim();if(O)return O;let P=E();if(P)return P;return k()}function d(){let f=m;return f.machineIdSync??f.default?.machineIdSync}function E(){try{let f=d();if(!f)return;return f().trim()||void 0}catch{return}}function k(){let f=b(),O=x(f,c);try{if(D(O)){let T=v(O,"utf8").trim();if(T.length>0)return T}}catch{}let P=`cl-${S()}`;try{G(f,{recursive:!0}),u(O,P,"utf8")}catch{}return P}class M{name;metadata;meter;logger;enabled;distinctId;commonProperties;counters=new Map;histograms=new Map;gauges=new Map;gaugeValues=new Map;meterProvider;loggerProvider;constructor(f){this.name=f.name??"OpenTelemetryAdapter",this.metadata={...f.metadata},this.meterProvider=f.meterProvider,this.loggerProvider=f.loggerProvider,this.meter=f.meterProvider?.getMeter("cline")??null,this.logger=f.loggerProvider?.getLogger("cline")??null,this.enabled=f.enabled??!0,this.distinctId=f.distinctId,this.commonProperties=f.commonProperties?{...f.commonProperties}:{}}emit(f,O){if(!this.isEnabled())return;this.emitLog(f,O,!1)}emitRequired(f,O){this.emitLog(f,O,!0)}recordCounter(f,O,P,T,A=!1){if(!this.meter||!A&&!this.isEnabled())return;let j=this.counters.get(f);if(!j)j=this.meter.createCounter(f,T?{description:T}:void 0),this.counters.set(f,j);j.add(O,this.flattenProperties(this.buildAttributes(P)))}recordHistogram(f,O,P,T,A=!1){if(!this.meter||!A&&!this.isEnabled())return;let j=this.histograms.get(f);if(!j)j=this.meter.createHistogram(f,T?{description:T}:void 0),this.histograms.set(f,j);j.record(O,this.flattenProperties(this.buildAttributes(P)))}recordGauge(f,O,P,T,A=!1){if(!this.meter||!A&&!this.isEnabled())return;let j=this.buildAttributes(P),$=JSON.stringify(j),W=this.gaugeValues.get(f);if(O===null){if(W){if(W.delete($),W.size===0)this.gaugeValues.delete(f),this.gauges.delete(f)}return}let H=W;if(!H)H=new Map,this.gaugeValues.set(f,H);if(!this.gauges.has(f)){let J=this.meter.createObservableGauge(f,T?{description:T}:void 0);J.addCallback((X)=>{for(let U of this.snapshotGaugeSeries(f))X.observe(U.value,this.flattenProperties(U.attributes))}),this.gauges.set(f,J)}H.set($,{value:O,attributes:j})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}setDistinctId(f){this.distinctId=f}setCommonProperties(f){this.commonProperties={...f}}updateCommonProperties(f){this.commonProperties={...this.commonProperties,...f}}async flush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.()])}emitLog(f,O,P){if(!this.logger)return;let T=this.flattenProperties(this.buildAttributes(O,P));this.logger.emit({severityText:"INFO",body:f,attributes:T})}buildAttributes(f,O=!1){return{...this.commonProperties,...this.metadata,...f,...this.distinctId?{distinct_id:this.distinctId}:{},...O?{_required:!0}:{}}}snapshotGaugeSeries(f){let O=this.gaugeValues.get(f);if(!O)return[];return Array.from(O.values(),(P)=>({value:P.value,attributes:P.attributes?{...P.attributes}:void 0}))}flattenProperties(f,O="",P=new WeakSet,T=0){if(!f)return{};let A={},j=100,$=10;for(let[W,H]of Object.entries(f)){if(W==="__proto__"||W==="constructor"||W==="prototype")continue;let J=O?`${O}.${W}`:W;if(H===null||H===void 0){A[J]=String(H);continue}if(Array.isArray(H)){let X=H.length>j?H.slice(0,j):H;try{A[J]=JSON.stringify(X)}catch{A[J]="[UnserializableArray]"}if(H.length>j)A[`${J}_truncated`]=!0,A[`${J}_original_length`]=H.length;continue}if(typeof H==="object"){if(H instanceof Date){A[J]=H.toISOString();continue}if(H instanceof Error){A[J]=H.message;continue}if(P.has(H)){A[J]="[Circular]";continue}if(T>=$){A[J]="[MaxDepthExceeded]";continue}P.add(H),Object.assign(A,this.flattenProperties(H,J,P,T+1));continue}if(l(H)){A[J]=H;continue}try{A[J]=JSON.stringify(H)}catch{A[J]=String(H)}}return A}}function l(f){return typeof f==="string"||typeof f==="number"||typeof f==="boolean"}import{metrics as ff,trace as Of}from"@opentelemetry/api";import{logs as Pf}from"@opentelemetry/api-logs";import{OTLPLogExporter as Tf}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as Af}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as jf}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as Hf}from"@opentelemetry/resources";import{BatchLogRecordProcessor as $f,ConsoleLogRecordExporter as Jf,LoggerProvider as Wf}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as Kf,MeterProvider as Lf,PeriodicExportingMetricReader as N}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as Mf,ConsoleSpanExporter as Rf,SimpleSpanProcessor as Vf}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as Xf}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as Yf,ATTR_SERVICE_VERSION as Zf}from"@opentelemetry/semantic-conventions";import{mkdirSync as mf,readFileSync as r,statSync as a,writeFileSync as cf}from"node:fs";import{resolveGlobalSettingsPath as n}from"@cline/shared/storage";import{z as K}from"zod";import{AGENT_UNEXPECTED_REASONING_TOKENS_EVENT as If,captureAgentUnexpectedReasoningTokens as Nf,captureTaskLifecycleEvent as yf,SDK_ERROR_TELEMETRY_EVENT as zf,TASK_CANCELLED_EVENT as gf,TASK_FIRST_CHUNK_RECEIVED_EVENT as Df,TASK_PROVIDER_REQUEST_STARTED_EVENT as Gf,TASK_PROVIDER_STREAM_FAILED_EVENT as vf,TASK_PROVIDER_STREAM_STARTED_EVENT as uf}from"@cline/shared";var C=K.preprocess((f)=>Array.isArray(f)?f.filter((O)=>typeof O==="string").map((O)=>O.trim()).filter(Boolean):void 0,K.array(K.string()).optional()).transform((f)=>{if(!f)return;let O=[...new Set(f)].sort((P,T)=>P.localeCompare(T));return O.length>0?O:void 0}),p=K.enum(["basic","agentic"]).catch("agentic"),i=K.enum(["plan","act"]),q=K.object({telemetryOptOut:K.boolean().default(!1).catch(!1),autoUpdateEnabled:K.boolean().default(!0).catch(!0),compactionStrategy:p.optional(),compactionEnabled:K.boolean().optional().catch(void 0),planActMode:i.optional().catch(void 0),toolAutoApprove:K.boolean().optional().catch(void 0),disabledTools:C.optional(),disabledPlugins:C.optional()}).strip().transform((f)=>{let O={autoUpdateEnabled:f.autoUpdateEnabled,telemetryOptOut:f.telemetryOptOut};if(f.compactionStrategy)O.compactionStrategy=f.compactionStrategy;if(f.compactionEnabled!==void 0)O.compactionEnabled=f.compactionEnabled;if(f.planActMode)O.planActMode=f.planActMode;if(f.toolAutoApprove!==void 0)O.toolAutoApprove=f.toolAutoApprove;if(f.disabledTools?.length)O.disabledTools=f.disabledTools;if(f.disabledPlugins?.length)O.disabledPlugins=f.disabledPlugins;return O});function R(){return q.parse({})}var Z;function s(f){if(f.disabledTools)Object.freeze(f.disabledTools);if(f.disabledPlugins)Object.freeze(f.disabledPlugins);return Object.freeze(f)}function o(f){let O;try{O=r(f,"utf8")}catch{return R()}try{let P=q.safeParse(JSON.parse(O));return P.success?P.data:R()}catch{return R()}}function t(){let f=n(),O=a(f,{throwIfNoEntry:!1}),P=O?.mtimeMs??0,T=O?.size??0,A=Z;if(A&&A.path===f&&A.mtimeMs===P&&A.size===T)return A;let j=s(O?o(f):R());return Z={path:f,mtimeMs:P,size:T,value:j},Z}function e(){return t().value}function I(){return e().telemetryOptOut}class _{name;logger;enabled;constructor(f={}){this.name=f.name??"TelemetryLoggerSink",this.logger=f.logger,this.enabled=f.enabled??!0}emit(f,O){if(!this.isEnabled())return;this.logger?.log("telemetry.event",{telemetrySink:this.name,event:f,properties:O})}emitRequired(f,O){this.logger?.log("telemetry.required_event",{telemetrySink:this.name,severity:"warn",event:f,properties:O})}recordCounter(f,O,P,T,A){if(!A&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:f,value:O,attributes:P,description:T,required:A===!0})}recordHistogram(f,O,P,T,A){if(!A&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:f,value:O,attributes:P,description:T,required:A===!0})}recordGauge(f,O,P,T,A){if(!A&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:f,value:O,attributes:P,description:T,required:A===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class V{adapters;metadata;distinctId;deviceId;commonProperties;constructor(f={}){if(this.adapters=[...f.adapters??[]],f.logger)this.adapters.push(new _({logger:f.logger}));this.metadata={...f.metadata??{}},this.distinctId=f.distinctId,this.deviceId=f.deviceId??Y(),this.commonProperties={...f.commonProperties??{}}}addAdapter(f){this.adapters.push(f)}setDistinctId(f){this.distinctId=f}setMetadata(f){this.metadata={...f}}updateMetadata(f){this.metadata={...this.metadata,...f}}setCommonProperties(f){this.commonProperties={...f}}updateCommonProperties(f){this.commonProperties={...this.commonProperties,...f}}isEnabled(){return this.adapters.some((f)=>f.isEnabled())}capture(f){let O=this.buildAttributes(f.properties);for(let P of this.adapters)P.emit(f.event,O)}captureRequired(f,O){let P=this.buildAttributes(O);for(let T of this.adapters)T.emitRequired(f,P)}recordCounter(f,O,P,T,A=!1){let j=this.buildAttributes(P);for(let $ of this.adapters)$.recordCounter(f,O,j,T,A)}recordHistogram(f,O,P,T,A=!1){let j=this.buildAttributes(P);for(let $ of this.adapters)$.recordHistogram(f,O,j,T,A)}recordGauge(f,O,P,T,A=!1){let j=this.buildAttributes(P);for(let $ of this.adapters)$.recordGauge(f,O,j,T,A)}async flush(){await Promise.all(this.adapters.map((f)=>f.flush()))}async dispose(){await Promise.all(this.adapters.map((f)=>f.dispose()))}buildAttributes(f){return{...this.commonProperties,...f,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{},device_id:this.deviceId}}}class y{distinctId;metadata;commonProperties;constructor(f={}){this.distinctId=f.distinctId,this.metadata={...f.metadata??{}},this.commonProperties={...f.commonProperties??{}}}setDistinctId(f){this.distinctId=f}setMetadata(f){this.metadata={...f}}updateMetadata(f){this.metadata={...this.metadata,...f}}setCommonProperties(f){this.commonProperties={...f}}updateCommonProperties(f){this.commonProperties={...this.commonProperties,...f}}isEnabled(){return!1}capture(f){this.resolveProperties(f.properties)}captureRequired(f,O){this.resolveProperties(O)}recordCounter(){}recordHistogram(){}recordGauge(){}async flush(){}async dispose(){}resolveProperties(f){return{...this.commonProperties,...f,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class Q{meterProvider;loggerProvider;tracerProvider;options;constructor(f={}){this.options=f;let O=Hf({[Yf]:f.serviceName??"cline",...f.serviceVersion?{[Zf]:f.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(O),this.loggerProvider=this.createLoggerProvider(O),this.tracerProvider=this.createTracerProvider(O),this.meterProvider)ff.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)Pf.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(f="cline",O){return Of.getTracer(f,O??this.options.serviceVersion)}createAdapter(f){return new M({...f,meterProvider:this.meterProvider,loggerProvider:this.loggerProvider})}createTelemetryService(f){let O=this.createAdapter({name:f.name,enabled:this.options.enabled,metadata:f.metadata});return new V({...f,adapters:[O],distinctId:L(f.distinctId)})}async forceFlush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.(),this.tracerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.(),this.tracerProvider?.shutdown?.()])}createMeterProvider(f){let O=B(this.options.metricsExporter);if(O.length===0)return null;let P=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),T=Math.min(30000,Math.floor(P*0.8)),A=O.map((j)=>Ff(j,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:P,timeout:T})).filter((j)=>j!==null);if(A.length===0)return null;return new Lf({resource:f,readers:A})}createTracerProvider(f){let O=B(this.options.tracesExporter);if(O.length===0)return null;let P=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,T=this.options.otlpTracesHeaders??this.options.otlpHeaders,A=[];for(let j of O){let $=Qf(j,{endpoint:P,headers:T,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if($)A.push($)}if(A.length===0)return null;return new Xf({resource:f,spanProcessors:A})}createLoggerProvider(f){let O=B(this.options.logsExporter);if(O.length===0)return null;let P=O.map((T)=>{let A=Bf(T,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!A)return null;return new $f(A,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((T)=>T!==null);if(P.length===0)return null;return new Wf({resource:f,processors:P})}}function z(f){let O=new Q(f),P=O.createTelemetryService(f),T=()=>{P.captureRequired("telemetry.provider_created",{provider:"opentelemetry",enabled:f.enabled??!0,logsExporter:Array.isArray(f.logsExporter)?f.logsExporter.join(","):f.logsExporter,metricsExporter:Array.isArray(f.metricsExporter)?f.metricsExporter.join(","):f.metricsExporter,tracesExporter:Array.isArray(f.tracesExporter)?f.tracesExporter.join(","):f.tracesExporter,otlpProtocol:f.otlpProtocol,hasOtlpEndpoint:Boolean(f.otlpEndpoint),serviceName:f.serviceName,serviceVersion:f.serviceVersion})};if(!f.deferProviderCreatedEvent)T();return{provider:O,telemetry:P,emitProviderCreated:T}}function g(f){if(I())return{telemetry:new y(f)};if(f.enabled!==!0)return{telemetry:new V({...f,distinctId:L(f.distinctId)})};return z(f)}function _f(f){let{telemetry:O,provider:P,emitProviderCreated:T}=g(f);return{telemetry:O,provider:P,flush:async()=>{let $=P;if($&&typeof $.forceFlush==="function")try{await $.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([O.dispose(),P?.dispose()])},...f.deferProviderCreatedEvent&&T?{emitProviderCreated:T}:{}}}function B(f){if(!f)return[];return(Array.isArray(f)?f:f.split(",")).map((P)=>P.trim()).filter((P)=>P==="console"||P==="otlp")}function Bf(f,O){if(f==="console")return new Jf;if(!O.endpoint)return null;let P=F(O.endpoint,"/v1/logs");return new Tf({url:P,headers:O.headers})}function Qf(f,O){if(f==="console")return new Vf(new Rf);if(!O.endpoint)return null;let P=F(O.endpoint,"/v1/traces");return new Mf(new jf({url:P,headers:O.headers}))}function Ff(f,O){if(f==="console")return new N({exporter:new Kf,exportIntervalMillis:O.interval,exportTimeoutMillis:O.timeout});if(!O.endpoint)return null;let P=F(O.endpoint,"/v1/metrics");return new N({exporter:new Af({url:P,headers:O.headers}),exportIntervalMillis:O.interval,exportTimeoutMillis:O.timeout})}function F(f,O){let P=new URL(f),T=P.pathname.endsWith("/")?P.pathname.slice(0,-1):P.pathname;return P.pathname=T.endsWith(O)?T:`${T}${O}`,P.toString()}export{L as resolveCoreDistinctId,Y as resolveCoreDeviceId,z as createOpenTelemetryTelemetryService,g as createConfiguredTelemetryService,_f as createConfiguredTelemetryHandle,Q as OpenTelemetryProvider,M as OpenTelemetryAdapter};
@@ -6,11 +6,24 @@ export interface CheckpointRestorePlan {
6
6
  messages?: LlmsProviders.Message[];
7
7
  cwd: string;
8
8
  }
9
+ export interface WorktreeRestoreTransaction {
10
+ commit(): Promise<void>;
11
+ rollback(): Promise<void>;
12
+ }
13
+ /**
14
+ * Captures the current worktree before a destructive checkpoint restore.
15
+ *
16
+ * `git stash create` omits untracked files, but checkpoint restoration runs
17
+ * `git clean -fd`. Use a short-lived `stash push --include-untracked`, move
18
+ * its object behind a private ref, and immediately remove it from the user's
19
+ * visible stash list. The private ref remains only until commit or rollback.
20
+ */
21
+ export declare function beginWorktreeRestoreTransaction(cwd: string): Promise<WorktreeRestoreTransaction>;
9
22
  export declare function readSessionCheckpointHistory(session: Pick<SessionRecord, "metadata"> | undefined): CheckpointEntry[];
10
23
  export declare function createRestoredCheckpointMetadata(session: Pick<SessionRecord, "metadata"> | undefined, runCount: number): CheckpointMetadata | undefined;
11
24
  export declare function findCheckpointForRun(history: readonly CheckpointEntry[], runCount: number): CheckpointEntry | undefined;
12
25
  export declare function trimMessagesToCheckpoint(messages: LlmsProviders.Message[], runCount: number): LlmsProviders.Message[];
13
- export declare function trimMessagesBeforeCheckpoint(messages: LlmsProviders.Message[], runCount: number): LlmsProviders.Message[];
26
+ export declare function trimMessagesBeforeUserRun(messages: LlmsProviders.Message[], runCount: number): LlmsProviders.Message[];
14
27
  export declare function createCheckpointRestorePlan(input: {
15
28
  session: SessionRecord;
16
29
  messages?: LlmsProviders.Message[];
@@ -2,7 +2,7 @@ import type * as LlmsProviders from "@cline/llms";
2
2
  import type { CheckpointEntry, CheckpointMetadata } from "../hooks/checkpoint-hooks";
3
3
  import type { RestoreSessionInput } from "../runtime/host/runtime-host";
4
4
  import type { SessionRecord } from "../types/sessions";
5
- import { type CheckpointRestorePlan } from "./checkpoint-restore";
5
+ import { type CheckpointRestorePlan, type WorktreeRestoreTransaction } from "./checkpoint-restore";
6
6
  import { type CoreSessionSnapshot } from "./session-snapshot";
7
7
  export type SessionVersioningErrorCode = "invalid_restore" | "session_not_found" | "session_messages_not_found";
8
8
  export declare class SessionVersioningError extends Error {
@@ -39,8 +39,10 @@ export interface SessionCheckpointRestoreInput<TRestoreStartInput, TStartInput,
39
39
  buildStartInput?: (context: SessionCheckpointRestoreContext, start: TRestoreStartInput) => TStartInput | Promise<TStartInput>;
40
40
  startSession?: (input: TStartInput) => Promise<TStartResult>;
41
41
  getStartedSessionId?: (result: TStartResult) => string | undefined;
42
+ cleanupStartedSession?: (result: Awaited<TStartResult>) => Promise<void>;
42
43
  readRestoredSession?: (sessionId: string) => Promise<SessionRecord | undefined>;
43
44
  applyWorkspaceCheckpoint?: (cwd: string, checkpoint: CheckpointEntry) => Promise<void>;
45
+ beginWorkspaceRestoreTransaction?: (cwd: string) => Promise<WorktreeRestoreTransaction>;
44
46
  retainCheckpointRefs?: (cwd: string, sessionId: string, history: CheckpointEntry[]) => Promise<void>;
45
47
  }
46
48
  export declare class SessionVersioningService {
@@ -0,0 +1,20 @@
1
+ export type MessageDisplayRole = "user" | "assistant" | "tool" | "system" | "status" | "error";
2
+ type MessageLike = {
3
+ role?: unknown;
4
+ content?: unknown;
5
+ metadata?: unknown;
6
+ };
7
+ /** Resolves the role a persisted message should use when presented to a user. */
8
+ export declare function resolveMessageDisplayRole(message: MessageLike): MessageDisplayRole;
9
+ /**
10
+ * Returns how many absolute root runs a persisted message represents.
11
+ *
12
+ * Compaction can fold several earlier user turns into one synthetic message.
13
+ * Its persisted span keeps later visible prompts aligned with checkpoint
14
+ * history. Tool results and system-injected user-role messages contribute no
15
+ * runs.
16
+ */
17
+ export declare function getUserRunSpan(message: MessageLike): number;
18
+ export declare function isUserRunMessage(message: MessageLike): boolean;
19
+ export declare function countUserRunMessages(messages: readonly MessageLike[] | undefined): number;
20
+ export {};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cline/core",
3
3
  "description": "Cline Core SDK for Node Runtime",
4
- "version": "0.0.66",
4
+ "version": "0.0.67",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/cline/cline",
@@ -49,9 +49,9 @@
49
49
  "test:watch": "vitest --config vitest.config.ts"
50
50
  },
51
51
  "dependencies": {
52
- "@cline/agents": "0.0.66",
53
- "@cline/shared": "0.0.66",
54
- "@cline/llms": "0.0.66",
52
+ "@cline/agents": "0.0.67",
53
+ "@cline/shared": "0.0.67",
54
+ "@cline/llms": "0.0.67",
55
55
  "@modelcontextprotocol/sdk": "^1.29.0",
56
56
  "@opentelemetry/api": "^1.9.0",
57
57
  "@opentelemetry/api-logs": "^0.214.0",
@@ -1,3 +0,0 @@
1
- import type { ITelemetryService } from "@cline/shared";
2
- export declare const CLINE_INTERNAL_TELEMETRY_METADATA_KEY = "__clineInternalTelemetry";
3
- export declare function getToolContextTelemetry(metadata: Record<string, unknown> | undefined): ITelemetryService | undefined;