@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.
- package/dist/ClineCore.d.ts +12 -0
- package/dist/extensions/context/compaction-shared.d.ts +3 -0
- package/dist/extensions/context/compaction.d.ts +8 -1
- package/dist/extensions/mcp/index.d.ts +3 -2
- package/dist/extensions/mcp/timeout.d.ts +2 -0
- package/dist/extensions/mcp/types.d.ts +9 -0
- package/dist/extensions/plugin/plugin-sandbox.d.ts +7 -0
- package/dist/extensions/plugin-sandbox-bootstrap.js +1 -1
- package/dist/extensions/tools/definitions.d.ts +1 -1
- package/dist/extensions/tools/executors/index.d.ts +1 -1
- package/dist/extensions/tools/index.d.ts +1 -1
- package/dist/extensions/tools/schemas.d.ts +45 -45
- package/dist/extensions/tools/types.d.ts +8 -1
- package/dist/hooks/checkpoint-hooks.d.ts +1 -7
- package/dist/hooks/hook-file-hooks.d.ts +3 -2
- package/dist/hub/daemon/entry.js +184 -184
- package/dist/hub/index.js +181 -181
- package/dist/index.d.ts +5 -4
- package/dist/index.js +180 -180
- package/dist/runtime/host/local/agent-event-bridge.d.ts +10 -1
- package/dist/runtime/host/local-runtime-host.d.ts +1 -0
- package/dist/runtime/host/runtime-host.d.ts +10 -0
- package/dist/services/llms/provider-settings.d.ts +4 -0
- package/dist/services/providers/local-provider-registry.d.ts +0 -3
- package/dist/services/telemetry/TelemetryService.d.ts +6 -0
- package/dist/services/telemetry/distinct-id.d.ts +1 -0
- package/dist/services/telemetry/index.d.ts +1 -1
- package/dist/services/telemetry/index.js +1 -1
- package/dist/session/checkpoint-restore.d.ts +14 -1
- package/dist/session/session-versioning-service.d.ts +3 -1
- package/dist/session/user-run-messages.d.ts +20 -0
- package/package.json +4 -4
- 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,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
|
|
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.
|
|
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.
|
|
53
|
-
"@cline/shared": "0.0.
|
|
54
|
-
"@cline/llms": "0.0.
|
|
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",
|