@cline/core 0.0.74 → 0.0.75

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 (35) hide show
  1. package/dist/ClineCore.d.ts +13 -3
  2. package/dist/cline-core/types.d.ts +2 -2
  3. package/dist/extensions/plugin/plugin-sandbox.d.ts +8 -0
  4. package/dist/extensions/plugin-sandbox-bootstrap.js +1 -1
  5. package/dist/extensions/tools/runtime.d.ts +1 -0
  6. package/dist/hub/client/index.d.ts +15 -0
  7. package/dist/hub/client/managed-hub-build-watcher.d.ts +10 -3
  8. package/dist/hub/client/session-client.d.ts +2 -2
  9. package/dist/hub/daemon/entry.js +189 -189
  10. package/dist/hub/daemon/index.d.ts +19 -0
  11. package/dist/hub/discovery/index.d.ts +42 -13
  12. package/dist/hub/discovery/workspace.d.ts +9 -0
  13. package/dist/hub/index.js +176 -176
  14. package/dist/hub/runtime-host/hub-runtime-host.d.ts +1 -1
  15. package/dist/index.d.ts +2 -1
  16. package/dist/index.js +177 -177
  17. package/dist/runtime/host/local-runtime-host.d.ts +2 -2
  18. package/dist/runtime/host/runtime-host-support.d.ts +1 -1
  19. package/dist/runtime/host/runtime-host.d.ts +4 -4
  20. package/dist/runtime/orchestration/runtime-event-adapter.d.ts +1 -1
  21. package/dist/runtime/orchestration/session-runtime.d.ts +2 -1
  22. package/dist/runtime/tools/subprocess-sandbox-lifecycle.d.ts +9 -0
  23. package/dist/runtime/tools/subprocess-sandbox.d.ts +19 -0
  24. package/dist/services/global-settings.d.ts +13 -1
  25. package/dist/services/telemetry/index.js +1 -1
  26. package/dist/session/checkpoint-restore.d.ts +4 -4
  27. package/dist/session/display-messages.d.ts +28 -0
  28. package/dist/session/persisted-tool-result-content.d.ts +8 -0
  29. package/dist/session/services/persistence-service.d.ts +2 -2
  30. package/dist/session/session-snapshot.d.ts +2 -2
  31. package/dist/session/session-versioning-service.d.ts +4 -4
  32. package/dist/session/stores/session-manifest-store.d.ts +1 -1
  33. package/dist/session/team/team-child-session-manager.d.ts +2 -2
  34. package/dist/types.d.ts +2 -3
  35. package/package.json +4 -4
@@ -81,8 +81,8 @@ 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[]>;
85
- readSessionMessages(sessionId: string): Promise<LlmsProviders.Message[]>;
84
+ readLiveSessionMessages(sessionId: string): Promise<LlmsProviders.MessageWithMetadata[]>;
85
+ readSessionMessages(sessionId: string): Promise<LlmsProviders.MessageWithMetadata[]>;
86
86
  dispatchHookEvent(payload: HookEventPayload): Promise<void>;
87
87
  subscribe(listener: (event: CoreSessionEvent) => void, options?: RuntimeHostSubscribeOptions): () => void;
88
88
  updateSessionModel(sessionId: string, modelId: string): Promise<void>;
@@ -8,7 +8,7 @@ export declare class RuntimeHostEventBus {
8
8
  emit(event: CoreSessionEvent): void;
9
9
  get size(): number;
10
10
  }
11
- export declare function readPersistedMessagesFile(messagesPath?: string | null): Promise<LlmsProviders.Message[]>;
11
+ export declare function readPersistedMessagesFile(messagesPath?: string | null): Promise<LlmsProviders.MessageWithMetadata[]>;
12
12
  export declare function cloneAccumulatedUsage(usage: SessionAccumulatedUsage | undefined): SessionAccumulatedUsage | undefined;
13
13
  type HookAuditBackend = {
14
14
  queueSpawnRequest(payload: HookEventPayload): Promise<void>;
@@ -70,7 +70,7 @@ export interface StartSessionInput {
70
70
  prompt?: string;
71
71
  interactive?: boolean;
72
72
  sessionMetadata?: Record<string, unknown>;
73
- initialMessages?: LlmsProviders.Message[];
73
+ initialMessages?: LlmsProviders.MessageWithMetadata[];
74
74
  initialCompactionState?: SessionCompactionState;
75
75
  userImages?: string[];
76
76
  userFiles?: string[];
@@ -174,7 +174,7 @@ export interface RestoreSessionInput {
174
174
  export interface RestoreSessionResult {
175
175
  sessionId?: string;
176
176
  startResult?: StartSessionResult;
177
- messages?: LlmsProviders.Message[];
177
+ messages?: LlmsProviders.MessageWithMetadata[];
178
178
  checkpoint: CheckpointEntry;
179
179
  }
180
180
  /**
@@ -204,7 +204,7 @@ export interface RuntimeHost {
204
204
  updated: boolean;
205
205
  }>;
206
206
  readSessionCompactionState(sessionId: string): Promise<SessionCompactionState | undefined>;
207
- readSessionMessages(sessionId: string): Promise<LlmsProviders.Message[]>;
207
+ readSessionMessages(sessionId: string): Promise<LlmsProviders.MessageWithMetadata[]>;
208
208
  /**
209
209
  * Like {@link readSessionMessages}, but prefers the resident session's
210
210
  * in-memory conversation over the persisted transcript. Disk persistence
@@ -214,7 +214,7 @@ export interface RuntimeHost {
214
214
  * session for a mode switch. Optional: hosts without live-session access
215
215
  * (e.g. hub clients) fall back to the persisted transcript.
216
216
  */
217
- readLiveSessionMessages?(sessionId: string): Promise<LlmsProviders.Message[]>;
217
+ readLiveSessionMessages?(sessionId: string): Promise<LlmsProviders.MessageWithMetadata[]>;
218
218
  dispatchHookEvent(payload: HookEventPayload): Promise<void>;
219
219
  subscribe(listener: (event: CoreSessionEvent) => void, options?: RuntimeHostSubscribeOptions): () => void;
220
220
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Adapter from the new `AgentRuntimeEvent` union (13 variants, defined
2
+ * Adapter from the new `AgentRuntimeEvent` union (defined
3
3
  * in `@cline/shared/src/agent.ts`) to the legacy `AgentEvent` union
4
4
  * (9 top-level types, defined in
5
5
  * `@cline/shared/src/agents/types.ts`) consumed by today's
@@ -1,4 +1,4 @@
1
- import type { AgentConfig, AgentEvent, AgentHooks, AgentResult, AgentTool, BasicLogger, ITelemetryService, RuntimeConfigExtensionKind, ToolApprovalRequest, ToolApprovalResult } from "@cline/shared";
1
+ import type { AgentConfig, AgentEvent, AgentHooks, AgentResult, AgentTool, BasicLogger, ITelemetryService, ModelTool, RuntimeConfigExtensionKind, ToolApprovalRequest, ToolApprovalResult } from "@cline/shared";
2
2
  import type { UserInstructionConfigService } from "../../extensions/config";
3
3
  import type { ToolExecutors } from "../../extensions/tools";
4
4
  import type { AgentTeamsRuntime, DelegatedAgentConfigProvider, SubAgentEndContext, SubAgentStartContext, TeamEvent } from "../../extensions/tools/team";
@@ -18,6 +18,7 @@ type LeadAgentHandle = {
18
18
  };
19
19
  export interface BuiltRuntime {
20
20
  tools: AgentTool[];
21
+ modelTools?: ModelTool[];
21
22
  hooks?: AgentHooks;
22
23
  logger?: BasicLogger;
23
24
  telemetry?: ITelemetryService;
@@ -0,0 +1,9 @@
1
+ export declare const MAX_NODE_TIMER_DELAY_MS = 2147483647;
2
+ type ParentProcess = {
3
+ once(event: "disconnect", listener: () => void): unknown;
4
+ exit(code: number): unknown;
5
+ };
6
+ export declare function normalizeIdleTimeoutMs(timeoutMs: number | undefined): number | undefined;
7
+ /** Ensure an IPC child cannot survive the process that owns it. */
8
+ export declare function installParentDisconnectGuard(target?: ParentProcess): void;
9
+ export {};
@@ -5,6 +5,11 @@ export interface SubprocessSandboxOptions {
5
5
  bootstrapFile?: string;
6
6
  /** Runtime executable for internal JavaScript helpers. Defaults to node/bun instead of packaged CLI binaries. */
7
7
  runtimeExecutable?: string;
8
+ /**
9
+ * Shut down the child after this many milliseconds with no calls in flight.
10
+ * The next call starts a fresh child transparently. Disabled when omitted.
11
+ */
12
+ idleTimeoutMs?: number;
8
13
  name?: string;
9
14
  onEvent?: (event: {
10
15
  name: string;
@@ -29,15 +34,29 @@ export declare function buildSubprocessSandboxCommand(args: string[], options?:
29
34
  }): string[];
30
35
  export declare class SubprocessSandbox {
31
36
  private readonly options;
37
+ private readonly idleTimeoutMs;
32
38
  private process;
33
39
  private requestCounter;
34
40
  private readonly pending;
41
+ private idleTimer;
42
+ private readonly shutdowns;
35
43
  constructor(options: SubprocessSandboxOptions);
36
44
  private get processLabel();
37
45
  private clearPendingRequest;
46
+ private clearIdleTimer;
47
+ private hasPendingRequests;
48
+ /**
49
+ * The parent is the sole idle-lifecycle authority. A matching child-side
50
+ * deadline can fire just before this timer and drop a newly dispatched RPC.
51
+ * Children should independently handle only parent IPC disconnection.
52
+ */
53
+ private armIdleTimer;
38
54
  start(): void;
39
55
  call<TResult = unknown>(method: string, args: unknown, options?: SandboxCallOptions): Promise<TResult>;
40
56
  shutdown(): Promise<void>;
57
+ private shutdownProcess;
58
+ private terminateProcess;
41
59
  private onMessage;
60
+ private failPendingForProcess;
42
61
  private failPending;
43
62
  }
@@ -1,4 +1,4 @@
1
- import type { AgentConfig, AgentTool, ITelemetryService } from "@cline/shared";
1
+ import { type AgentConfig, type AgentTool, type ITelemetryService, type ModelToolName, type ModelToolSettings } from "@cline/shared";
2
2
  import { z } from "zod";
3
3
  declare const GlobalCompactionStrategySchema: z.ZodCatch<z.ZodEnum<{
4
4
  basic: "basic";
@@ -27,6 +27,11 @@ export declare const GlobalSettingsSchema: z.ZodPipe<z.ZodObject<{
27
27
  toolAutoApprove: z.ZodCatch<z.ZodOptional<z.ZodBoolean>>;
28
28
  tuiTheme: z.ZodCatch<z.ZodOptional<z.ZodString>>;
29
29
  disabledTools: z.ZodOptional<z.ZodPipe<z.ZodPreprocess<z.ZodOptional<z.ZodArray<z.ZodString>>>, z.ZodTransform<string[] | undefined, string[] | undefined>>>;
30
+ tools: z.ZodOptional<z.ZodRecord<z.ZodEnum<{
31
+ web_search: "web_search";
32
+ }> & z.core.$partial, z.ZodObject<{
33
+ enabled: z.ZodBoolean;
34
+ }, z.core.$strip>>>;
30
35
  disabledPlugins: z.ZodOptional<z.ZodPipe<z.ZodPreprocess<z.ZodOptional<z.ZodArray<z.ZodString>>>, z.ZodTransform<string[] | undefined, string[] | undefined>>>;
31
36
  }, z.core.$strip>, z.ZodTransform<{
32
37
  telemetryOptOut: boolean;
@@ -37,6 +42,7 @@ export declare const GlobalSettingsSchema: z.ZodPipe<z.ZodObject<{
37
42
  toolAutoApprove?: boolean;
38
43
  tuiTheme?: string;
39
44
  disabledTools?: string[];
45
+ tools?: ModelToolSettings;
40
46
  disabledPlugins?: string[];
41
47
  }, {
42
48
  telemetryOptOut: boolean;
@@ -47,6 +53,9 @@ export declare const GlobalSettingsSchema: z.ZodPipe<z.ZodObject<{
47
53
  toolAutoApprove?: boolean | undefined;
48
54
  tuiTheme?: string | undefined;
49
55
  disabledTools?: string[] | undefined;
56
+ tools?: Partial<Record<"web_search", {
57
+ enabled: boolean;
58
+ }>> | undefined;
50
59
  disabledPlugins?: string[] | undefined;
51
60
  }>>;
52
61
  export type GlobalSettings = z.infer<typeof GlobalSettingsSchema>;
@@ -84,6 +93,9 @@ export declare function setToolAutoApproveGlobally(toolAutoApprove: boolean): vo
84
93
  export declare function resolveDisabledToolNames(disabledToolNames?: ReadonlyArray<string>): Set<string>;
85
94
  export declare function resolveDisabledPluginPaths(disabledPluginPaths?: ReadonlyArray<string>): Set<string>;
86
95
  export declare function isToolDisabledGlobally(toolName: string): boolean;
96
+ export declare function resolveModelToolSettings(): ModelToolSettings;
97
+ export declare function isModelToolEnabledGlobally(name: ModelToolName): boolean;
98
+ export declare function setModelToolEnabledGlobally(name: ModelToolName, enabled: boolean): void;
87
99
  export declare function toggleDisabledTool(toolName: string): boolean;
88
100
  export declare function setDisabledTools(toolNames: ReadonlyArray<string>, disabledValue: boolean): void;
89
101
  export declare function setToolDisabledGlobally(toolName: string, disabled: boolean): boolean;
@@ -1 +1 @@
1
- import{existsSync as g,mkdirSync as v,readFileSync as x,writeFileSync as G}from"node:fs";import{resolve as u}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",k,E=!1;function Z(){if(!E)k=h(),E=!0;return k??C()}function L(f){let P=f?.trim();if(P)return P;let O=h();if(O)return O;return C()}function d(){let f=m;return f.machineIdSync??f.default?.machineIdSync}function h(){try{let f=d();if(!f)return;return f().trim()||void 0}catch{return}}function C(){let f=b(),P=u(f,c);try{if(g(P)){let A=x(P,"utf8").trim();if(A.length>0)return A}}catch{}let O=`cl-${S()}`;try{v(f,{recursive:!0}),G(P,O,"utf8")}catch{}return O}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,P){if(!this.isEnabled())return;this.emitLog(f,P,!1)}emitRequired(f,P){this.emitLog(f,P,!0)}recordCounter(f,P,O,A,T=!1){if(!this.meter||!T&&!this.isEnabled())return;let j=this.counters.get(f);if(!j)j=this.meter.createCounter(f,A?{description:A}:void 0),this.counters.set(f,j);j.add(P,this.flattenProperties(this.buildAttributes(O)))}recordHistogram(f,P,O,A,T=!1){if(!this.meter||!T&&!this.isEnabled())return;let j=this.histograms.get(f);if(!j)j=this.meter.createHistogram(f,A?{description:A}:void 0),this.histograms.set(f,j);j.record(P,this.flattenProperties(this.buildAttributes(O)))}recordGauge(f,P,O,A,T=!1){if(!this.meter||!T&&!this.isEnabled())return;let j=this.buildAttributes(O),$=JSON.stringify(j),K=this.gaugeValues.get(f);if(P===null){if(K){if(K.delete($),K.size===0)this.gaugeValues.delete(f),this.gauges.delete(f)}return}let H=K;if(!H)H=new Map,this.gaugeValues.set(f,H);if(!this.gauges.has(f)){let J=this.meter.createObservableGauge(f,A?{description:A}:void 0);J.addCallback((Y)=>{for(let U of this.snapshotGaugeSeries(f))Y.observe(U.value,this.flattenProperties(U.attributes))}),this.gauges.set(f,J)}H.set($,{value:P,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,P,O){if(!this.logger)return;let A=this.flattenProperties(this.buildAttributes(P,O));this.logger.emit({severityText:"INFO",body:f,attributes:A})}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(),(O)=>({value:O.value,attributes:O.attributes?{...O.attributes}:void 0}))}flattenProperties(f,P="",O=new WeakSet,A=0){if(!f)return{};let T={},j=100,$=10;for(let[K,H]of Object.entries(f)){if(K==="__proto__"||K==="constructor"||K==="prototype")continue;let J=P?`${P}.${K}`:K;if(H===null||H===void 0){T[J]=String(H);continue}if(Array.isArray(H)){let Y=H.length>j?H.slice(0,j):H;try{T[J]=JSON.stringify(Y)}catch{T[J]="[UnserializableArray]"}if(H.length>j)T[`${J}_truncated`]=!0,T[`${J}_original_length`]=H.length;continue}if(typeof H==="object"){if(H instanceof Date){T[J]=H.toISOString();continue}if(H instanceof Error){T[J]=H.message;continue}if(O.has(H)){T[J]="[Circular]";continue}if(A>=$){T[J]="[MaxDepthExceeded]";continue}O.add(H),Object.assign(T,this.flattenProperties(H,J,O,A+1));continue}if(l(H)){T[J]=H;continue}try{T[J]=JSON.stringify(H)}catch{T[J]=String(H)}}return T}}function l(f){return typeof f==="string"||typeof f==="number"||typeof f==="boolean"}import{metrics as ff,trace as Pf}from"@opentelemetry/api";import{logs as Of}from"@opentelemetry/api-logs";import{OTLPLogExporter as Af}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as Tf}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 I}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as Mf,ConsoleSpanExporter as Vf,SimpleSpanProcessor as Xf}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as Yf}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as Zf,ATTR_SERVICE_VERSION as _f}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 W}from"zod";import{AGENT_UNEXPECTED_REASONING_TOKENS_EVENT as Nf,captureAgentUnexpectedReasoningTokens as If,captureTaskLifecycleEvent as zf,SDK_ERROR_TELEMETRY_EVENT as yf,TASK_CANCELLED_EVENT as Df,TASK_FIRST_CHUNK_RECEIVED_EVENT as gf,TASK_PROVIDER_REQUEST_STARTED_EVENT as vf,TASK_PROVIDER_STREAM_FAILED_EVENT as xf,TASK_PROVIDER_STREAM_STARTED_EVENT as Gf}from"@cline/shared";var w=W.preprocess((f)=>Array.isArray(f)?f.filter((P)=>typeof P==="string").map((P)=>P.trim()).filter(Boolean):void 0,W.array(W.string()).optional()).transform((f)=>{if(!f)return;let P=[...new Set(f)].sort((O,A)=>O.localeCompare(A));return P.length>0?P:void 0}),p=W.enum(["basic","agentic"]).catch("agentic"),i=W.enum(["plan","act"]),q=W.object({telemetryOptOut:W.boolean().default(!1).catch(!1),autoUpdateEnabled:W.boolean().default(!0).catch(!0),compactionStrategy:p.optional(),compactionEnabled:W.boolean().optional().catch(void 0),planActMode:i.optional().catch(void 0),toolAutoApprove:W.boolean().optional().catch(void 0),tuiTheme:W.string().optional().catch(void 0),disabledTools:w.optional(),disabledPlugins:w.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.tuiTheme?.trim())P.tuiTheme=f.tuiTheme.trim();if(f.disabledTools?.length)P.disabledTools=f.disabledTools;if(f.disabledPlugins?.length)P.disabledPlugins=f.disabledPlugins;return P});function V(){return q.parse({})}var _;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 P;try{P=r(f,"utf8")}catch{return V()}try{let O=q.safeParse(JSON.parse(P));return O.success?O.data:V()}catch{return V()}}function t(){let f=n(),P=a(f,{throwIfNoEntry:!1}),O=P?.mtimeMs??0,A=P?.size??0,T=_;if(T&&T.path===f&&T.mtimeMs===O&&T.size===A)return T;let j=s(P?o(f):V());return _={path:f,mtimeMs:O,size:A,value:j},_}function e(){return t().value}function N(){return e().telemetryOptOut}class B{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,O,A,T){if(!T&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:f,value:P,attributes:O,description:A,required:T===!0})}recordHistogram(f,P,O,A,T){if(!T&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:f,value:P,attributes:O,description:A,required:T===!0})}recordGauge(f,P,O,A,T){if(!T&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:f,value:P,attributes:O,description:A,required:T===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class X{adapters;metadata;distinctId;deviceId;commonProperties;constructor(f={}){if(this.adapters=[...f.adapters??[]],f.logger)this.adapters.push(new B({logger:f.logger}));this.metadata={...f.metadata??{}},this.distinctId=f.distinctId,this.deviceId=f.deviceId??Z(),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 O of this.adapters)O.emit(f.event,P)}captureRequired(f,P){let O=this.buildAttributes(P);for(let A of this.adapters)A.emitRequired(f,O)}recordCounter(f,P,O,A,T=!1){let j=this.buildAttributes(O);for(let $ of this.adapters)$.recordCounter(f,P,j,A,T)}recordHistogram(f,P,O,A,T=!1){let j=this.buildAttributes(O);for(let $ of this.adapters)$.recordHistogram(f,P,j,A,T)}recordGauge(f,P,O,A,T=!1){let j=this.buildAttributes(O);for(let $ of this.adapters)$.recordGauge(f,P,j,A,T)}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 z{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 R{meterProvider;loggerProvider;tracerProvider;options;constructor(f={}){this.options=f;let P=Hf({[Zf]: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)ff.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)Of.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(f="cline",P){return Pf.getTracer(f,P??this.options.serviceVersion)}createAdapter(f){return new M({...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 X({...f,adapters:[P],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 P=Q(this.options.metricsExporter);if(P.length===0)return null;let O=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),A=Math.min(30000,Math.floor(O*0.8)),T=P.map((j)=>Ff(j,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:O,timeout:A})).filter((j)=>j!==null);if(T.length===0)return null;return new Lf({resource:f,readers:T})}createTracerProvider(f){let P=Q(this.options.tracesExporter);if(P.length===0)return null;let O=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,A=this.options.otlpTracesHeaders??this.options.otlpHeaders,T=[];for(let j of P){let $=Rf(j,{endpoint:O,headers:A,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if($)T.push($)}if(T.length===0)return null;return new Yf({resource:f,spanProcessors:T})}createLoggerProvider(f){let P=Q(this.options.logsExporter);if(P.length===0)return null;let O=P.map((A)=>{let T=Qf(A,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!T)return null;return new $f(T,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((A)=>A!==null);if(O.length===0)return null;return new Wf({resource:f,processors:O})}}function y(f){let P=new R(f),O=P.createTelemetryService(f),A=()=>{O.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)A();return{provider:P,telemetry:O,emitProviderCreated:A}}function D(f){if(N())return{telemetry:new z(f)};if(f.enabled!==!0)return{telemetry:new X({...f,distinctId:L(f.distinctId)})};return y(f)}function Bf(f){let{telemetry:P,provider:O,emitProviderCreated:A}=D(f);return{telemetry:P,provider:O,flush:async()=>{let $=O;if($&&typeof $.forceFlush==="function")try{await $.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([P.dispose(),O?.dispose()])},...f.deferProviderCreatedEvent&&A?{emitProviderCreated:A}:{}}}function Q(f){if(!f)return[];return(Array.isArray(f)?f:f.split(",")).map((O)=>O.trim()).filter((O)=>O==="console"||O==="otlp")}function Qf(f,P){if(f==="console")return new Jf;if(!P.endpoint)return null;let O=F(P.endpoint,"/v1/logs");return new Af({url:O,headers:P.headers})}function Rf(f,P){if(f==="console")return new Xf(new Vf);if(!P.endpoint)return null;let O=F(P.endpoint,"/v1/traces");return new Mf(new jf({url:O,headers:P.headers}))}function Ff(f,P){if(f==="console")return new I({exporter:new Kf,exportIntervalMillis:P.interval,exportTimeoutMillis:P.timeout});if(!P.endpoint)return null;let O=F(P.endpoint,"/v1/metrics");return new I({exporter:new Tf({url:O,headers:P.headers}),exportIntervalMillis:P.interval,exportTimeoutMillis:P.timeout})}function F(f,P){let O=new URL(f),A=O.pathname.endsWith("/")?O.pathname.slice(0,-1):O.pathname;return O.pathname=A.endsWith(P)?A:`${A}${P}`,O.toString()}export{L as resolveCoreDistinctId,Z as resolveCoreDeviceId,y as createOpenTelemetryTelemetryService,D as createConfiguredTelemetryService,Bf as createConfiguredTelemetryHandle,R as OpenTelemetryProvider,M as OpenTelemetryAdapter};
1
+ import{existsSync as x,mkdirSync as G,readFileSync as v,writeFileSync as g}from"node:fs";import{resolve as u}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",M,C=!1;function R(){if(!C)M=h(),C=!0;return M??w()}function X(f){let P=f?.trim();if(P)return P;let A=h();if(A)return A;return w()}function d(){let f=m;return f.machineIdSync??f.default?.machineIdSync}function h(){try{let f=d();if(!f)return;return f().trim()||void 0}catch{return}}function w(){let f=b(),P=u(f,c);try{if(x(P)){let O=v(P,"utf8").trim();if(O.length>0)return O}}catch{}let A=`cl-${S()}`;try{G(f,{recursive:!0}),g(P,A,"utf8")}catch{}return A}class Y{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,A,O,j=!1){if(!this.meter||!j&&!this.isEnabled())return;let H=this.counters.get(f);if(!H)H=this.meter.createCounter(f,O?{description:O}:void 0),this.counters.set(f,H);H.add(P,this.flattenProperties(this.buildAttributes(A)))}recordHistogram(f,P,A,O,j=!1){if(!this.meter||!j&&!this.isEnabled())return;let H=this.histograms.get(f);if(!H)H=this.meter.createHistogram(f,O?{description:O}:void 0),this.histograms.set(f,H);H.record(P,this.flattenProperties(this.buildAttributes(A)))}recordGauge(f,P,A,O,j=!1){if(!this.meter||!j&&!this.isEnabled())return;let H=this.buildAttributes(A),$=JSON.stringify(H),K=this.gaugeValues.get(f);if(P===null){if(K){if(K.delete($),K.size===0)this.gaugeValues.delete(f),this.gauges.delete(f)}return}let T=K;if(!T)T=new Map,this.gaugeValues.set(f,T);if(!this.gauges.has(f)){let J=this.meter.createObservableGauge(f,O?{description:O}:void 0);J.addCallback((Q)=>{for(let k of this.snapshotGaugeSeries(f))Q.observe(k.value,this.flattenProperties(k.attributes))}),this.gauges.set(f,J)}T.set($,{value:P,attributes:H})}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,A){if(!this.logger)return;let O=this.flattenProperties(this.buildAttributes(P,A));this.logger.emit({severityText:"INFO",body:f,attributes:O})}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(),(A)=>({value:A.value,attributes:A.attributes?{...A.attributes}:void 0}))}flattenProperties(f,P="",A=new WeakSet,O=0){if(!f)return{};let j={},H=100,$=10;for(let[K,T]of Object.entries(f)){if(K==="__proto__"||K==="constructor"||K==="prototype")continue;let J=P?`${P}.${K}`:K;if(T===null||T===void 0){j[J]=String(T);continue}if(Array.isArray(T)){let Q=T.length>H?T.slice(0,H):T;try{j[J]=JSON.stringify(Q)}catch{j[J]="[UnserializableArray]"}if(T.length>H)j[`${J}_truncated`]=!0,j[`${J}_original_length`]=T.length;continue}if(typeof T==="object"){if(T instanceof Date){j[J]=T.toISOString();continue}if(T instanceof Error){j[J]=T.message;continue}if(A.has(T)){j[J]="[Circular]";continue}if(O>=$){j[J]="[MaxDepthExceeded]";continue}A.add(T),Object.assign(j,this.flattenProperties(T,J,A,O+1));continue}if(r(T)){j[J]=T;continue}try{j[J]=JSON.stringify(T)}catch{j[J]=String(T)}}return j}}function r(f){return typeof f==="string"||typeof f==="number"||typeof f==="boolean"}import{metrics as Af,trace as Of}from"@opentelemetry/api";import{logs as jf}from"@opentelemetry/api-logs";import{OTLPLogExporter as Hf}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as Tf}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as $f}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as Jf}from"@opentelemetry/resources";import{BatchLogRecordProcessor as Wf,ConsoleLogRecordExporter as Kf,LoggerProvider as Xf}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as Yf,MeterProvider as Zf,PeriodicExportingMetricReader as y}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as Bf,ConsoleSpanExporter as Qf,SimpleSpanProcessor as Rf}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as Ff}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as Vf,ATTR_SERVICE_VERSION as Uf}from"@opentelemetry/semantic-conventions";import{mkdirSync as df,readFileSync as l,statSync as n,writeFileSync as rf}from"node:fs";import{MODEL_TOOL_NAMES as a}from"@cline/shared";import{resolveGlobalSettingsPath as p}from"@cline/shared/storage";import{z as W}from"zod";import{AGENT_UNEXPECTED_REASONING_TOKENS_EVENT as zf,captureAgentUnexpectedReasoningTokens as Df,captureTaskLifecycleEvent as Nf,SDK_ERROR_TELEMETRY_EVENT as xf,TASK_CANCELLED_EVENT as Gf,TASK_FIRST_CHUNK_RECEIVED_EVENT as vf,TASK_PROVIDER_REQUEST_STARTED_EVENT as gf,TASK_PROVIDER_STREAM_FAILED_EVENT as uf,TASK_PROVIDER_STREAM_STARTED_EVENT as bf}from"@cline/shared";var q=W.preprocess((f)=>Array.isArray(f)?f.filter((P)=>typeof P==="string").map((P)=>P.trim()).filter(Boolean):void 0,W.array(W.string()).optional()).transform((f)=>{if(!f)return;let P=[...new Set(f)].sort((A,O)=>A.localeCompare(O));return P.length>0?P:void 0}),i=W.enum(["basic","agentic"]).catch("agentic"),s=W.partialRecord(W.enum(a),W.object({enabled:W.boolean()}).strip()).optional(),o=W.enum(["plan","act"]),E=W.object({telemetryOptOut:W.boolean().default(!1).catch(!1),autoUpdateEnabled:W.boolean().default(!0).catch(!0),compactionStrategy:i.optional(),compactionEnabled:W.boolean().optional().catch(void 0),planActMode:o.optional().catch(void 0),toolAutoApprove:W.boolean().optional().catch(void 0),tuiTheme:W.string().optional().catch(void 0),disabledTools:q.optional(),tools:s,disabledPlugins:q.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.tuiTheme?.trim())P.tuiTheme=f.tuiTheme.trim();if(f.disabledTools?.length)P.disabledTools=f.disabledTools;if(f.tools&&Object.keys(f.tools).length>0)P.tools=f.tools;if(f.disabledPlugins?.length)P.disabledPlugins=f.disabledPlugins;return P});function Z(){return E.parse({})}var F;function t(f){if(f.disabledTools)Object.freeze(f.disabledTools);if(f.tools){for(let P of Object.values(f.tools))Object.freeze(P);Object.freeze(f.tools)}if(f.disabledPlugins)Object.freeze(f.disabledPlugins);return Object.freeze(f)}function e(f){let P;try{P=l(f,"utf8")}catch{return Z()}try{let A=E.safeParse(JSON.parse(P));return A.success?A.data:Z()}catch{return Z()}}function ff(){let f=p(),P=n(f,{throwIfNoEntry:!1}),A=P?.mtimeMs??0,O=P?.size??0,j=F;if(j&&j.path===f&&j.mtimeMs===A&&j.size===O)return j;let H=t(P?e(f):Z());return F={path:f,mtimeMs:A,size:O,value:H},F}function Pf(){return ff().value}function I(){return Pf().telemetryOptOut}class V{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,A,O,j){if(!j&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:f,value:P,attributes:A,description:O,required:j===!0})}recordHistogram(f,P,A,O,j){if(!j&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:f,value:P,attributes:A,description:O,required:j===!0})}recordGauge(f,P,A,O,j){if(!j&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:f,value:P,attributes:A,description:O,required:j===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class B{adapters;metadata;distinctId;deviceId;commonProperties;constructor(f={}){if(this.adapters=[...f.adapters??[]],f.logger)this.adapters.push(new V({logger:f.logger}));this.metadata={...f.metadata??{}},this.distinctId=f.distinctId,this.deviceId=f.deviceId??R(),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 A of this.adapters)A.emit(f.event,P)}captureRequired(f,P){let A=this.buildAttributes(P);for(let O of this.adapters)O.emitRequired(f,A)}recordCounter(f,P,A,O,j=!1){let H=this.buildAttributes(A);for(let $ of this.adapters)$.recordCounter(f,P,H,O,j)}recordHistogram(f,P,A,O,j=!1){let H=this.buildAttributes(A);for(let $ of this.adapters)$.recordHistogram(f,P,H,O,j)}recordGauge(f,P,A,O,j=!1){let H=this.buildAttributes(A);for(let $ of this.adapters)$.recordGauge(f,P,H,O,j)}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 z{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 L{meterProvider;loggerProvider;tracerProvider;options;constructor(f={}){this.options=f;let P=Jf({[Vf]:f.serviceName??"cline",...f.serviceVersion?{[Uf]:f.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(P),this.loggerProvider=this.createLoggerProvider(P),this.tracerProvider=this.createTracerProvider(P),this.meterProvider)Af.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)jf.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(f="cline",P){return Of.getTracer(f,P??this.options.serviceVersion)}createAdapter(f){return new Y({...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 B({...f,adapters:[P],distinctId:X(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=U(this.options.metricsExporter);if(P.length===0)return null;let A=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),O=Math.min(30000,Math.floor(A*0.8)),j=P.map((H)=>Mf(H,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:A,timeout:O})).filter((H)=>H!==null);if(j.length===0)return null;return new Zf({resource:f,readers:j})}createTracerProvider(f){let P=U(this.options.tracesExporter);if(P.length===0)return null;let A=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,O=this.options.otlpTracesHeaders??this.options.otlpHeaders,j=[];for(let H of P){let $=kf(H,{endpoint:A,headers:O,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if($)j.push($)}if(j.length===0)return null;return new Ff({resource:f,spanProcessors:j})}createLoggerProvider(f){let P=U(this.options.logsExporter);if(P.length===0)return null;let A=P.map((O)=>{let j=_f(O,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!j)return null;return new Wf(j,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((O)=>O!==null);if(A.length===0)return null;return new Xf({resource:f,processors:A})}}function D(f){let P=new L(f),A=P.createTelemetryService(f),O=()=>{A.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)O();return{provider:P,telemetry:A,emitProviderCreated:O}}function N(f){if(I())return{telemetry:new z(f)};if(f.enabled!==!0)return{telemetry:new B({...f,distinctId:X(f.distinctId)})};return D(f)}function Lf(f){let{telemetry:P,provider:A,emitProviderCreated:O}=N(f);return{telemetry:P,provider:A,flush:async()=>{let $=A;if($&&typeof $.forceFlush==="function")try{await $.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([P.dispose(),A?.dispose()])},...f.deferProviderCreatedEvent&&O?{emitProviderCreated:O}:{}}}function U(f){if(!f)return[];return(Array.isArray(f)?f:f.split(",")).map((A)=>A.trim()).filter((A)=>A==="console"||A==="otlp")}function _f(f,P){if(f==="console")return new Kf;if(!P.endpoint)return null;let A=_(P.endpoint,"/v1/logs");return new Hf({url:A,headers:P.headers})}function kf(f,P){if(f==="console")return new Rf(new Qf);if(!P.endpoint)return null;let A=_(P.endpoint,"/v1/traces");return new Bf(new $f({url:A,headers:P.headers}))}function Mf(f,P){if(f==="console")return new y({exporter:new Yf,exportIntervalMillis:P.interval,exportTimeoutMillis:P.timeout});if(!P.endpoint)return null;let A=_(P.endpoint,"/v1/metrics");return new y({exporter:new Tf({url:A,headers:P.headers}),exportIntervalMillis:P.interval,exportTimeoutMillis:P.timeout})}function _(f,P){let A=new URL(f),O=A.pathname.endsWith("/")?A.pathname.slice(0,-1):A.pathname;return A.pathname=O.endsWith(P)?O:`${O}${P}`,A.toString()}export{X as resolveCoreDistinctId,R as resolveCoreDeviceId,D as createOpenTelemetryTelemetryService,N as createConfiguredTelemetryService,Lf as createConfiguredTelemetryHandle,L as OpenTelemetryProvider,Y as OpenTelemetryAdapter};
@@ -3,7 +3,7 @@ import type { CheckpointEntry, CheckpointMetadata } from "../hooks/checkpoint-ho
3
3
  import type { SessionRecord } from "../types/sessions";
4
4
  export interface CheckpointRestorePlan {
5
5
  checkpoint: CheckpointEntry;
6
- messages?: LlmsProviders.Message[];
6
+ messages?: LlmsProviders.MessageWithMetadata[];
7
7
  cwd: string;
8
8
  }
9
9
  export interface WorktreeRestoreTransaction {
@@ -22,11 +22,11 @@ export declare function beginWorktreeRestoreTransaction(cwd: string): Promise<Wo
22
22
  export declare function readSessionCheckpointHistory(session: Pick<SessionRecord, "metadata"> | undefined): CheckpointEntry[];
23
23
  export declare function createRestoredCheckpointMetadata(session: Pick<SessionRecord, "metadata"> | undefined, runCount: number): CheckpointMetadata | undefined;
24
24
  export declare function findCheckpointForRun(history: readonly CheckpointEntry[], runCount: number): CheckpointEntry | undefined;
25
- export declare function trimMessagesToCheckpoint(messages: LlmsProviders.Message[], runCount: number): LlmsProviders.Message[];
26
- export declare function trimMessagesBeforeUserRun(messages: LlmsProviders.Message[], runCount: number): LlmsProviders.Message[];
25
+ export declare function trimMessagesToCheckpoint(messages: LlmsProviders.MessageWithMetadata[], runCount: number): LlmsProviders.MessageWithMetadata[];
26
+ export declare function trimMessagesBeforeUserRun(messages: LlmsProviders.MessageWithMetadata[], runCount: number): LlmsProviders.MessageWithMetadata[];
27
27
  export declare function createCheckpointRestorePlan(input: {
28
28
  session: SessionRecord;
29
- messages?: LlmsProviders.Message[];
29
+ messages?: LlmsProviders.MessageWithMetadata[];
30
30
  checkpointRunCount: number;
31
31
  cwd?: string;
32
32
  restoreMessages?: boolean;
@@ -0,0 +1,28 @@
1
+ import type { MessageWithMetadata, ModelToolExecution } from "@cline/shared";
2
+ /**
3
+ * A message prepared exclusively for transcript presentation.
4
+ *
5
+ * The wrapper is intentionally not structurally assignable to `Message`, so a
6
+ * display projection cannot accidentally be passed to `initialMessages` or a
7
+ * provider request. Consumers render `message`; runtime/replay code continues
8
+ * to consume the canonical history directly.
9
+ */
10
+ export interface SessionDisplayMessage {
11
+ kind: "session_display_message";
12
+ origin: "history" | "model_tool_activity";
13
+ execution?: ModelToolExecution;
14
+ message: MessageWithMetadata;
15
+ /** Index of the canonical message that produced this display entry. */
16
+ sourceIndex: number;
17
+ }
18
+ /**
19
+ * Project observational model-tool activity into the same persisted
20
+ * `tool_use` / `tool_result` shapes used by ordinary runtime tools.
21
+ *
22
+ * The source history is never mutated. The non-`Message` wrapper keeps this
23
+ * display representation out of resume, fork, compaction, and model replay by
24
+ * construction. Since the sidecar metadata does not retain text-relative
25
+ * positions, projected activities are placed in their recorded order
26
+ * immediately before the assistant message that owns them.
27
+ */
28
+ export declare function projectSessionMessagesForDisplay(messages: readonly MessageWithMetadata[]): SessionDisplayMessage[];
@@ -0,0 +1,8 @@
1
+ import type { ToolResultContent } from "@cline/shared";
2
+ /**
3
+ * Preserve the runtime tool-output serialization used by canonical session
4
+ * persistence. This intentionally remains internal to Core because the
5
+ * historical codec accepts a wider runtime value set than the public
6
+ * `ToolResultContent` type describes.
7
+ */
8
+ export declare function toPersistedToolResultContent(output: unknown): ToolResultContent["content"];
@@ -39,7 +39,7 @@ export declare class UnifiedSessionPersistenceService {
39
39
  upsertSubagentSession(input: import("../models/session-row").UpsertSubagentInput): Promise<string | undefined>;
40
40
  upsertSubagentSessionFromHook(event: HookEventPayload): Promise<string | undefined>;
41
41
  appendSubagentHookAudit(_subSessionId: string, event: HookEventPayload): Promise<void>;
42
- persistSessionMessages(sessionId: string, messages: LlmsProviders.Message[], systemPrompt?: string): Promise<void>;
42
+ persistSessionMessages(sessionId: string, messages: LlmsProviders.MessageWithMetadata[], systemPrompt?: string): Promise<void>;
43
43
  readSessionCompactionState(sessionId: string): Promise<SessionCompactionState | undefined>;
44
44
  persistSessionCompactionState(sessionId: string, state: SessionCompactionState): Promise<void>;
45
45
  deleteSessionCompactionState(sessionId: string): Promise<void>;
@@ -47,7 +47,7 @@ export declare class UnifiedSessionPersistenceService {
47
47
  applySubagentStatusBySessionId(subSessionId: string, status: SessionStatus): Promise<void>;
48
48
  applyStatusToRunningChildSessions(parentSessionId: string, status: TerminalSessionStatus): Promise<void>;
49
49
  onTeamTaskStart(rootSessionId: string, agentId: string, message: string): Promise<void>;
50
- onTeamTaskEnd(rootSessionId: string, agentId: string, status: SessionStatus, summary?: string, result?: AgentResult, messages?: LlmsProviders.Message[]): Promise<void>;
50
+ onTeamTaskEnd(rootSessionId: string, agentId: string, status: SessionStatus, summary?: string, result?: AgentResult, messages?: LlmsProviders.MessageWithMetadata[]): Promise<void>;
51
51
  onTeamTaskProgress(rootSessionId: string, agentId: string, progress: string, options?: {
52
52
  kind?: "heartbeat" | "progress" | "text";
53
53
  }): Promise<void>;
@@ -45,14 +45,14 @@ export interface CoreSessionSnapshot {
45
45
  artifacts?: {
46
46
  messagesPath?: string;
47
47
  };
48
- messages?: LlmsProviders.Message[];
48
+ messages?: LlmsProviders.MessageWithMetadata[];
49
49
  usage?: SessionAccumulatedUsage;
50
50
  aggregateUsage?: SessionAccumulatedUsage;
51
51
  checkpoint?: CoreSessionCheckpointSnapshot;
52
52
  }
53
53
  export declare function createCoreSessionSnapshot(input: {
54
54
  session: SessionRecord;
55
- messages?: LlmsProviders.Message[];
55
+ messages?: LlmsProviders.MessageWithMetadata[];
56
56
  usage?: SessionAccumulatedUsage;
57
57
  aggregateUsage?: SessionAccumulatedUsage;
58
58
  }): CoreSessionSnapshot;
@@ -11,11 +11,11 @@ export declare class SessionVersioningError extends Error {
11
11
  }
12
12
  export interface SessionCheckpointRestoreContext {
13
13
  sourceSession: SessionRecord;
14
- sourceMessages?: LlmsProviders.Message[];
14
+ sourceMessages?: LlmsProviders.MessageWithMetadata[];
15
15
  sourceSnapshot: CoreSessionSnapshot;
16
16
  plan: CheckpointRestorePlan;
17
17
  restoredCheckpointMetadata?: CheckpointMetadata;
18
- initialMessages: LlmsProviders.Message[];
18
+ initialMessages: LlmsProviders.MessageWithMetadata[];
19
19
  restoreMessages: boolean;
20
20
  restoreWorkspace: boolean;
21
21
  checkpointRunCount: number;
@@ -23,7 +23,7 @@ export interface SessionCheckpointRestoreContext {
23
23
  export interface SessionCheckpointRestoreResult<TStartResult = unknown> {
24
24
  sessionId?: string;
25
25
  startResult?: TStartResult;
26
- messages?: LlmsProviders.Message[];
26
+ messages?: LlmsProviders.MessageWithMetadata[];
27
27
  checkpoint: CheckpointEntry;
28
28
  sourceSnapshot: CoreSessionSnapshot;
29
29
  restoredSnapshot?: CoreSessionSnapshot;
@@ -35,7 +35,7 @@ export interface SessionCheckpointRestoreInput<TRestoreStartInput, TStartInput,
35
35
  restore?: RestoreSessionInput["restore"];
36
36
  start?: TRestoreStartInput;
37
37
  getSession(sessionId: string): Promise<SessionRecord | undefined>;
38
- readMessages(sessionId: string): Promise<LlmsProviders.Message[]>;
38
+ readMessages(sessionId: string): Promise<LlmsProviders.MessageWithMetadata[]>;
39
39
  buildStartInput?: (context: SessionCheckpointRestoreContext, start: TRestoreStartInput) => TStartInput | Promise<TStartInput>;
40
40
  startSession?: (input: TStartInput) => Promise<TStartResult>;
41
41
  getStartedSessionId?: (result: TStartResult) => string | undefined;
@@ -39,7 +39,7 @@ export declare class SessionManifestStore {
39
39
  * orphaned session files.
40
40
  */
41
41
  private resolveSessionRow;
42
- persistSessionMessages(sessionId: string, messages: LlmsProviders.Message[], systemPrompt?: string): Promise<void>;
42
+ persistSessionMessages(sessionId: string, messages: LlmsProviders.MessageWithMetadata[], systemPrompt?: string): Promise<void>;
43
43
  private resolveCompactionPath;
44
44
  private updateCompactionPath;
45
45
  readSessionCompactionState(sessionId: string): Promise<SessionCompactionState | undefined>;
@@ -14,7 +14,7 @@ export declare class TeamChildSessionManager {
14
14
  private readonly teamTaskSessionsByAgent;
15
15
  private readonly teamTaskLastHeartbeatBySession;
16
16
  private readonly teamTaskLastProgressLineBySession;
17
- constructor(adapter: SessionPersistenceAdapter, manifestStore: SessionManifestStore, toPersistedMessages: (messages: LlmsProviders.Message[] | undefined, result?: AgentResult, previousMessages?: LlmsProviders.Message[]) => StoredMessageWithMetadata[] | undefined, heartbeatLogIntervalMs: number);
17
+ constructor(adapter: SessionPersistenceAdapter, manifestStore: SessionManifestStore, toPersistedMessages: (messages: LlmsProviders.MessageWithMetadata[] | undefined, result?: AgentResult, previousMessages?: LlmsProviders.MessageWithMetadata[]) => StoredMessageWithMetadata[] | undefined, heartbeatLogIntervalMs: number);
18
18
  private teamTaskQueueKey;
19
19
  private activeTeamTaskSessionId;
20
20
  private buildSubsessionRow;
@@ -25,7 +25,7 @@ export declare class TeamChildSessionManager {
25
25
  applySubagentStatusBySessionId(subSessionId: string, status: SessionStatus): Promise<void>;
26
26
  applyStatusToRunningChildSessions(parentSessionId: string, status: TerminalSessionStatus): Promise<void>;
27
27
  onTeamTaskStart(rootSessionId: string, agentId: string, message: string): Promise<void>;
28
- onTeamTaskEnd(rootSessionId: string, agentId: string, status: SessionStatus, _summary?: string, result?: AgentResult, messages?: LlmsProviders.Message[]): Promise<void>;
28
+ onTeamTaskEnd(rootSessionId: string, agentId: string, status: SessionStatus, _summary?: string, result?: AgentResult, messages?: LlmsProviders.MessageWithMetadata[]): Promise<void>;
29
29
  onTeamTaskProgress(rootSessionId: string, agentId: string, progress: string, options?: {
30
30
  kind?: "heartbeat" | "progress" | "text";
31
31
  }): Promise<void>;
package/dist/types.d.ts CHANGED
@@ -15,9 +15,8 @@ export type { BuiltRuntime as RuntimeEnvironment, RuntimeBuilder, RuntimeBuilder
15
15
  export type { SandboxCallOptions, SubprocessSandboxOptions, } from "./runtime/tools/subprocess-sandbox";
16
16
  export { SubprocessSandbox } from "./runtime/tools/subprocess-sandbox";
17
17
  export { FeatureFlagsService, type FeatureFlagsServiceOptions, NoOpFeatureFlagsProvider, } from "./services/feature-flags";
18
- export type { GlobalSettings } from "./services/global-settings";
19
- export { filterDisabledPluginPaths, filterDisabledTools, filterExtensionToolRegistrations, GlobalSettingsSchema, isAutoUpdateEnabledGlobally, isPluginDisabledGlobally, isTelemetryOptedOutGlobally, isToolDisabledGlobally, readCompactionModeGlobally, readCompactionStrategyGlobally, readGlobalSettings, readPlanActModeGlobally, readToolAutoApproveGlobally, resolveDisabledPluginPaths, resolveDisabledToolNames, setAutoUpdateEnabledGlobally, setCompactionModeGlobally, setCompactionStrategyGlobally, setDisabledPlugin, setDisabledTools, setPlanActModeGlobally, setTelemetryOptOutGlobally, setToolAutoApproveGlobally, toggleDisabledTool, writeGlobalSettings, } from "./services/global-settings";
20
- export type { GlobalCompactionMode, GlobalCompactionStrategy, GlobalPlanActMode, } from "./services/global-settings";
18
+ export type { GlobalCompactionMode, GlobalCompactionStrategy, GlobalPlanActMode, GlobalSettings, } from "./services/global-settings";
19
+ export { filterDisabledPluginPaths, filterDisabledTools, filterExtensionToolRegistrations, GlobalSettingsSchema, isAutoUpdateEnabledGlobally, isModelToolEnabledGlobally, isPluginDisabledGlobally, isTelemetryOptedOutGlobally, isToolDisabledGlobally, readCompactionModeGlobally, readCompactionStrategyGlobally, readGlobalSettings, readPlanActModeGlobally, readToolAutoApproveGlobally, resolveDisabledPluginPaths, resolveDisabledToolNames, resolveModelToolSettings, setAutoUpdateEnabledGlobally, setCompactionModeGlobally, setCompactionStrategyGlobally, setDisabledPlugin, setDisabledTools, setModelToolEnabledGlobally, setPlanActModeGlobally, setTelemetryOptOutGlobally, setToolAutoApproveGlobally, toggleDisabledTool, writeGlobalSettings, } from "./services/global-settings";
21
20
  export type { ListPluginToolsResult, PluginToolSummary, } from "./services/plugin-tools";
22
21
  export { listPluginTools, listPluginToolsWithDiagnostics, } from "./services/plugin-tools";
23
22
  export type { WorkspaceManager, WorkspaceManagerEvent, } from "./services/workspace/workspace-manager";
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.74",
4
+ "version": "0.0.75",
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.74",
53
- "@cline/shared": "0.0.74",
54
- "@cline/llms": "0.0.74",
52
+ "@cline/agents": "0.0.75",
53
+ "@cline/shared": "0.0.75",
54
+ "@cline/llms": "0.0.75",
55
55
  "@modelcontextprotocol/sdk": "^1.29.0",
56
56
  "@opentelemetry/api": "^1.9.0",
57
57
  "@opentelemetry/api-logs": "^0.214.0",