@cline/core 0.0.59 → 0.0.60

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.
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Early SDK logger for components that operate before/outside of `ClineCore`
3
+ * sessions, plus a secret-hashing helper for credential diagnostics.
4
+ *
5
+ * `ClineCore.create({ logger })` receives a `BasicLogger` but it is only
6
+ * threaded to session-scoped components. `ProviderSettingsManager`,
7
+ * `RuntimeOAuthTokenManager`, and the Cline auth functions in `cline.ts` are
8
+ * constructed or called before `ClineCore` exists or outside a session.
9
+ * Hosts call `setSdkLogger()` once at startup and every early component picks
10
+ * it up without threading loggers through every constructor.
11
+ *
12
+ * When no logger is registered, every call is a no-op.
13
+ *
14
+ * Secrets are never logged in cleartext; {@link hashSecret} produces an
15
+ * 8-hex-digit fingerprint that is stable for the same value but irreversible.
16
+ */
17
+ import type { BasicLogger } from "@cline/shared";
18
+ /**
19
+ * Register the logger used by {@link sdkDebug}. Pass `undefined` to disable.
20
+ */
21
+ export declare function setSdkLogger(logger: BasicLogger | undefined): void;
22
+ /** @internal Returns the currently registered early logger (for testing). */
23
+ export declare function getSdkLogger(): BasicLogger | undefined;
24
+ /**
25
+ * Short, stable fingerprint of a secret for debug logging (8 hex digits of a
26
+ * SHA-256 digest). The same input always yields the same hash, making it easy
27
+ * to eyeball whether a token changed across log entries without leaking it.
28
+ *
29
+ * Returns `"unset"` for undefined/null/empty so absence is still visible.
30
+ */
31
+ export declare function hashSecret(value: unknown): string;
32
+ /**
33
+ * Emit a debug-level SDK diagnostic message (already a formatted string).
34
+ * Best-effort: swallows errors from the underlying logger so logging never
35
+ * breaks auth/storage flows.
36
+ */
37
+ export declare function sdkDebug(message: string): void;
@@ -10,4 +10,31 @@ export interface ConnectionUpdate {
10
10
  thinking?: CoreSessionConfig["thinking"] | null;
11
11
  thinkingBudgetTokens?: CoreSessionConfig["thinkingBudgetTokens"] | null;
12
12
  }
13
+ export interface ConnectionUpdateInput {
14
+ providerId?: string;
15
+ modelId?: string;
16
+ apiKey?: string;
17
+ baseUrl?: string;
18
+ headers?: Record<string, string>;
19
+ providerConfig?: CoreSessionConfig["providerConfig"];
20
+ thinking?: boolean;
21
+ reasoningEffort?: CoreSessionConfig["reasoningEffort"];
22
+ thinkingBudgetTokens?: number;
23
+ }
24
+ /**
25
+ * Builds a ConnectionUpdate for switching a live session's provider/model
26
+ * connection. Shared by clients (CLI, desktop sidecar, …) so the
27
+ * thinking/reasoning transition rules stay consistent:
28
+ * - `thinking: false` disables reasoning and clears effort/budget.
29
+ * - `thinking: true` (or a provided effort/budget) enables reasoning; an
30
+ * explicit `thinking: true` resets the reasoning state, so a stale effort or
31
+ * token budget from the previous connection is cleared unless a replacement
32
+ * accompanies it. A bare effort/budget without a `thinking` flag updates
33
+ * only the provided field.
34
+ * - `thinking: undefined` leaves the session's reasoning state untouched.
35
+ * Connection fields are included only when defined; an empty string is passed
36
+ * through (it means "clear"), so callers that want to skip blanks must drop
37
+ * them before calling.
38
+ */
39
+ export declare function buildConnectionUpdate(input: ConnectionUpdateInput): ConnectionUpdate;
13
40
  export declare function normalizeConnectionUpdate(updates: ConnectionUpdate): ConnectionUpdate;
@@ -44,6 +44,7 @@ export declare class LocalRuntimeHost implements RuntimeHost {
44
44
  private readonly defaultFetch?;
45
45
  private readonly events;
46
46
  private readonly sessions;
47
+ private readonly manifestMutationQueues;
47
48
  private readonly usageBySession;
48
49
  private readonly aggregateUsageBySession;
49
50
  private readonly subAgentStarts;
@@ -82,6 +83,15 @@ export declare class LocalRuntimeHost implements RuntimeHost {
82
83
  subscribe(listener: (event: CoreSessionEvent) => void, options?: RuntimeHostSubscribeOptions): () => void;
83
84
  updateSessionModel(sessionId: string, modelId: string): Promise<void>;
84
85
  updateSessionConnection(sessionId: string, rawUpdates: SessionConnectionUpdate): Promise<void>;
86
+ /**
87
+ * Serialized read-modify-write for a live session's manifest. Every
88
+ * manifest write for an active session MUST go through this helper: it
89
+ * re-reads the disk manifest first so disk-only writers (compaction-path
90
+ * updates, title/metadata renames) are never reverted by a stale in-memory
91
+ * copy, applies the field-level mutation, syncs the in-memory copy, and
92
+ * persists — one mutation at a time per session.
93
+ */
94
+ private mutateSessionManifest;
85
95
  handlePluginEvent(rootSessionId: string, event: {
86
96
  name: string;
87
97
  payload?: unknown;
@@ -15,25 +15,25 @@ export declare const normalizeProviderId: typeof Llms.normalizeProviderId;
15
15
  export type ProviderDefaultsConfig = ProviderDefaults;
16
16
  export declare const ProviderIdSchema: z.ZodString;
17
17
  export declare const ProviderProtocolSchema: z.ZodEnum<{
18
- "openai-responses": "openai-responses";
19
18
  anthropic: "anthropic";
20
19
  gemini: "gemini";
20
+ "openai-chat": "openai-chat";
21
+ "openai-responses": "openai-responses";
21
22
  "openai-r1": "openai-r1";
22
23
  "ai-sdk": "ai-sdk";
23
- "openai-chat": "openai-chat";
24
24
  }>;
25
25
  export declare const ProviderClientSchema: z.ZodEnum<{
26
26
  custom: "custom";
27
27
  anthropic: "anthropic";
28
- bedrock: "bedrock";
29
28
  gemini: "gemini";
30
- vertex: "vertex";
31
- openai: "openai";
32
29
  "openai-r1": "openai-r1";
33
30
  "ai-sdk": "ai-sdk";
34
31
  "ai-sdk-community": "ai-sdk-community";
32
+ openai: "openai";
35
33
  "openai-compatible": "openai-compatible";
34
+ bedrock: "bedrock";
36
35
  fetch: "fetch";
36
+ vertex: "vertex";
37
37
  }>;
38
38
  export declare const AuthSettingsSchema: z.ZodObject<{
39
39
  apiKey: z.ZodOptional<z.ZodString>;
@@ -46,11 +46,11 @@ export type AuthSettings = z.infer<typeof AuthSettingsSchema>;
46
46
  export declare const ReasoningSettingsSchema: z.ZodObject<{
47
47
  enabled: z.ZodOptional<z.ZodBoolean>;
48
48
  effort: z.ZodOptional<z.ZodEnum<{
49
+ none: "none";
49
50
  low: "low";
50
- high: "high";
51
51
  medium: "medium";
52
+ high: "high";
52
53
  xhigh: "xhigh";
53
- none: "none";
54
54
  }>>;
55
55
  budgetTokens: z.ZodOptional<z.ZodNumber>;
56
56
  }, z.core.$strip>;
@@ -62,9 +62,9 @@ export declare const AwsSettingsSchema: z.ZodObject<{
62
62
  region: z.ZodOptional<z.ZodString>;
63
63
  profile: z.ZodOptional<z.ZodString>;
64
64
  authentication: z.ZodOptional<z.ZodEnum<{
65
- "api-key": "api-key";
66
65
  profile: "profile";
67
66
  iam: "iam";
67
+ "api-key": "api-key";
68
68
  apikey: "apikey";
69
69
  }>>;
70
70
  usePromptCache: z.ZodOptional<z.ZodBoolean>;
@@ -127,25 +127,25 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
127
127
  }, z.core.$strip>>;
128
128
  model: z.ZodOptional<z.ZodString>;
129
129
  protocol: z.ZodOptional<z.ZodEnum<{
130
- "openai-responses": "openai-responses";
131
130
  anthropic: "anthropic";
132
131
  gemini: "gemini";
132
+ "openai-chat": "openai-chat";
133
+ "openai-responses": "openai-responses";
133
134
  "openai-r1": "openai-r1";
134
135
  "ai-sdk": "ai-sdk";
135
- "openai-chat": "openai-chat";
136
136
  }>>;
137
137
  client: z.ZodOptional<z.ZodEnum<{
138
138
  custom: "custom";
139
139
  anthropic: "anthropic";
140
- bedrock: "bedrock";
141
140
  gemini: "gemini";
142
- vertex: "vertex";
143
- openai: "openai";
144
141
  "openai-r1": "openai-r1";
145
142
  "ai-sdk": "ai-sdk";
146
143
  "ai-sdk-community": "ai-sdk-community";
144
+ openai: "openai";
147
145
  "openai-compatible": "openai-compatible";
146
+ bedrock: "bedrock";
148
147
  fetch: "fetch";
148
+ vertex: "vertex";
149
149
  }>>;
150
150
  routingProviderId: z.ZodOptional<z.ZodString>;
151
151
  maxTokens: z.ZodOptional<z.ZodNumber>;
@@ -156,11 +156,11 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
156
156
  reasoning: z.ZodOptional<z.ZodObject<{
157
157
  enabled: z.ZodOptional<z.ZodBoolean>;
158
158
  effort: z.ZodOptional<z.ZodEnum<{
159
+ none: "none";
159
160
  low: "low";
160
- high: "high";
161
161
  medium: "medium";
162
+ high: "high";
162
163
  xhigh: "xhigh";
163
- none: "none";
164
164
  }>>;
165
165
  budgetTokens: z.ZodOptional<z.ZodNumber>;
166
166
  }, z.core.$strip>>;
@@ -171,9 +171,9 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
171
171
  region: z.ZodOptional<z.ZodString>;
172
172
  profile: z.ZodOptional<z.ZodString>;
173
173
  authentication: z.ZodOptional<z.ZodEnum<{
174
- "api-key": "api-key";
175
174
  profile: "profile";
176
175
  iam: "iam";
176
+ "api-key": "api-key";
177
177
  apikey: "apikey";
178
178
  }>>;
179
179
  usePromptCache: z.ZodOptional<z.ZodBoolean>;
@@ -217,12 +217,12 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
217
217
  }>>;
218
218
  capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<{
219
219
  tools: "tools";
220
- streaming: "streaming";
221
- "prompt-cache": "prompt-cache";
222
220
  reasoning: "reasoning";
221
+ "prompt-cache": "prompt-cache";
222
+ streaming: "streaming";
223
+ vision: "vision";
223
224
  "computer-use": "computer-use";
224
225
  oauth: "oauth";
225
- vision: "vision";
226
226
  popular: "popular";
227
227
  }>>>;
228
228
  modelCatalog: z.ZodOptional<z.ZodObject<{
@@ -1,4 +1,5 @@
1
1
  import { type CaptureAgentUnexpectedReasoningTokensInput, captureAgentUnexpectedReasoningTokens, type ITelemetryService, type TelemetryProperties } from "@cline/shared";
2
+ import type { CoreCompactionBudgetPolicyIntent, CoreCompactionLiveTailHandling } from "../../types/config";
2
3
  export type TelemetryAgentKind = "root" | "subagent" | "team_lead" | "team_teammate";
3
4
  export interface TelemetryAgentIdentityProperties {
4
5
  agentId: string;
@@ -28,6 +29,7 @@ export declare const CORE_TELEMETRY_EVENTS: {
28
29
  readonly AUTH_SUCCEEDED: "user.auth_succeeded";
29
30
  readonly AUTH_FAILED: "user.auth_failed";
30
31
  readonly AUTH_LOGGED_OUT: "user.auth_logged_out";
32
+ readonly AUTH_REFRESH_SOFT_FAILURE: "user.auth_refresh_soft_failure";
31
33
  readonly PROVIDER_CONFIGURED: "user.provider_configured";
32
34
  readonly TELEMETRY_OPT_OUT: "user.opt_out";
33
35
  };
@@ -51,6 +53,7 @@ export declare const CORE_TELEMETRY_EVENTS: {
51
53
  readonly SUBAGENT_COMPLETED: "task.subagent_completed";
52
54
  readonly COMPACTION_EXECUTED: "task.compaction_executed";
53
55
  readonly COMPACTION_SKIPPED: "task.compaction_skipped";
56
+ readonly COMPACTION_BUDGET_EMERGENCY: "task.compaction_budget_emergency";
54
57
  };
55
58
  readonly HOOKS: {
56
59
  readonly DISCOVERY_COMPLETED: "hooks.discovery_completed";
@@ -112,7 +115,24 @@ export declare function captureWorkspacePathResolved(telemetry: ITelemetryServic
112
115
  export declare function captureAuthStarted(telemetry: ITelemetryService | undefined, provider?: string): void;
113
116
  export declare function captureAuthSucceeded(telemetry: ITelemetryService | undefined, provider?: string): void;
114
117
  export declare function captureAuthFailed(telemetry: ITelemetryService | undefined, provider?: string, errorMessage?: string): void;
115
- export declare function captureAuthLoggedOut(telemetry: ITelemetryService | undefined, provider?: string, reason?: string): void;
118
+ export declare function captureAuthLoggedOut(telemetry: ITelemetryService | undefined, provider?: string, reason?: string, details?: {
119
+ status?: number;
120
+ errorCode?: string;
121
+ }): void;
122
+ /**
123
+ * Fires when a token refresh fails for a reason that does NOT invalidate the
124
+ * session (network error, timeout, 5xx) and stored credentials were kept.
125
+ * Before the transient-vs-invalid_grant fix, `tokenExpired: true` instances
126
+ * were misclassified as invalid grants and wiped stored credentials — this
127
+ * event is the "prevented logout" counter for tracking that fix in
128
+ * production.
129
+ */
130
+ export declare function captureAuthRefreshSoftFailure(telemetry: ITelemetryService | undefined, provider?: string, details?: {
131
+ status?: number;
132
+ errorCode?: string;
133
+ errorName?: string;
134
+ tokenExpired?: boolean;
135
+ }): void;
116
136
  /**
117
137
  * Fires when the user finishes configuring a "bring your own provider"
118
138
  * (API-key based) provider during onboarding or via settings.
@@ -299,3 +319,15 @@ export interface CaptureCompactionSkippedProperties {
299
319
  modelId?: string;
300
320
  }
301
321
  export declare function captureCompactionSkipped(telemetry: ITelemetryService | undefined, properties: CaptureCompactionSkippedProperties & Partial<TelemetryAgentIdentityProperties>): void;
322
+ export interface CaptureCompactionBudgetEmergencyProperties {
323
+ ulid: string;
324
+ strategy: TelemetryCompactionStrategy;
325
+ mode: TelemetryCompactionMode;
326
+ policyIntent: CoreCompactionBudgetPolicyIntent;
327
+ actionCount: number;
328
+ warningCount: number;
329
+ liveTailHandling: CoreCompactionLiveTailHandling;
330
+ provider?: string;
331
+ modelId?: string;
332
+ }
333
+ export declare function captureCompactionBudgetEmergency(telemetry: ITelemetryService | undefined, properties: CaptureCompactionBudgetEmergencyProperties & Partial<TelemetryAgentIdentityProperties>): void;
@@ -1 +1 @@
1
- import{existsSync as j,mkdirSync as L,readFileSync as R,writeFileSync as U}from"node:fs";import{resolve as W}from"node:path";import{resolveSessionDataDir as F}from"@cline/shared/storage";import{nanoid as H}from"nanoid";import*as J from"node-machine-id";var V="machine-id";function u(e){let t=e?.trim();if(t)return t;let a=x();if(a)return a;return I()}function $(){let e=J;return e.machineIdSync??e.default?.machineIdSync}function x(){try{let e=$();if(!e)return;return e().trim()||void 0}catch{return}}function I(){let e=F(),t=W(e,V);try{if(j(t)){let i=R(t,"utf8").trim();if(i.length>0)return i}}catch{}let a=`cl-${H()}`;try{L(e,{recursive:!0}),U(t,a,"utf8")}catch{}return a}class b{name;metadata;meter;logger;enabled;distinctId;commonProperties;counters=new Map;histograms=new Map;gauges=new Map;gaugeValues=new Map;meterProvider;loggerProvider;constructor(e){this.name=e.name??"OpenTelemetryAdapter",this.metadata={...e.metadata},this.meterProvider=e.meterProvider,this.loggerProvider=e.loggerProvider,this.meter=e.meterProvider?.getMeter("cline")??null,this.logger=e.loggerProvider?.getLogger("cline")??null,this.enabled=e.enabled??!0,this.distinctId=e.distinctId,this.commonProperties=e.commonProperties?{...e.commonProperties}:{}}emit(e,t){if(!this.isEnabled())return;this.emitLog(e,t,!1)}emitRequired(e,t){this.emitLog(e,t,!0)}recordCounter(e,t,a,i,l=!1){if(!this.meter||!l&&!this.isEnabled())return;let r=this.counters.get(e);if(!r)r=this.meter.createCounter(e,i?{description:i}:void 0),this.counters.set(e,r);r.add(t,this.flattenProperties(this.buildAttributes(a)))}recordHistogram(e,t,a,i,l=!1){if(!this.meter||!l&&!this.isEnabled())return;let r=this.histograms.get(e);if(!r)r=this.meter.createHistogram(e,i?{description:i}:void 0),this.histograms.set(e,r);r.record(t,this.flattenProperties(this.buildAttributes(a)))}recordGauge(e,t,a,i,l=!1){if(!this.meter||!l&&!this.isEnabled())return;let r=this.buildAttributes(a),d=JSON.stringify(r),g=this.gaugeValues.get(e);if(t===null){if(g){if(g.delete(d),g.size===0)this.gaugeValues.delete(e),this.gauges.delete(e)}return}let n=g;if(!n)n=new Map,this.gaugeValues.set(e,n);if(!this.gauges.has(e)){let s=this.meter.createObservableGauge(e,i?{description:i}:void 0);s.addCallback((c)=>{for(let A of this.snapshotGaugeSeries(e))c.observe(A.value,this.flattenProperties(A.attributes))}),this.gauges.set(e,s)}n.set(d,{value:t,attributes:r})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}setDistinctId(e){this.distinctId=e}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}async flush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.()])}emitLog(e,t,a){if(!this.logger)return;let i=this.flattenProperties(this.buildAttributes(t,a));this.logger.emit({severityText:"INFO",body:e,attributes:i})}buildAttributes(e,t=!1){return{...this.commonProperties,...this.metadata,...e,...this.distinctId?{distinct_id:this.distinctId}:{},...t?{_required:!0}:{}}}snapshotGaugeSeries(e){let t=this.gaugeValues.get(e);if(!t)return[];return Array.from(t.values(),(a)=>({value:a.value,attributes:a.attributes?{...a.attributes}:void 0}))}flattenProperties(e,t="",a=new WeakSet,i=0){if(!e)return{};let l={},r=100,d=10;for(let[g,n]of Object.entries(e)){if(g==="__proto__"||g==="constructor"||g==="prototype")continue;let s=t?`${t}.${g}`:g;if(n===null||n===void 0){l[s]=String(n);continue}if(Array.isArray(n)){let c=n.length>r?n.slice(0,r):n;try{l[s]=JSON.stringify(c)}catch{l[s]="[UnserializableArray]"}if(n.length>r)l[`${s}_truncated`]=!0,l[`${s}_original_length`]=n.length;continue}if(typeof n==="object"){if(n instanceof Date){l[s]=n.toISOString();continue}if(n instanceof Error){l[s]=n.message;continue}if(a.has(n)){l[s]="[Circular]";continue}if(i>=d){l[s]="[MaxDepthExceeded]";continue}a.add(n),Object.assign(l,this.flattenProperties(n,s,a,i+1));continue}if(B(n)){l[s]=n;continue}try{l[s]=JSON.stringify(n)}catch{l[s]=String(n)}}return l}}function B(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}import{metrics as Y,trace as D}from"@opentelemetry/api";import{logs as q}from"@opentelemetry/api-logs";import{OTLPLogExporter as p}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as ee}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as te}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as ae}from"@opentelemetry/resources";import{BatchLogRecordProcessor as le,ConsoleLogRecordExporter as ie,LoggerProvider as re}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as ne,MeterProvider as se,PeriodicExportingMetricReader as C}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as de,ConsoleSpanExporter as ge,SimpleSpanProcessor as fe}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as ue}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as be,ATTR_SERVICE_VERSION as me}from"@opentelemetry/semantic-conventions";import{mkdirSync as Re,readFileSync as N,statSync as K,writeFileSync as Ue}from"node:fs";import{resolveGlobalSettingsPath as Q}from"@cline/shared/storage";import{z as f}from"zod";import{AGENT_UNEXPECTED_REASONING_TOKENS_EVENT as Ce,captureAgentUnexpectedReasoningTokens as we,SDK_ERROR_TELEMETRY_EVENT as ze}from"@cline/shared";var O=f.preprocess((e)=>Array.isArray(e)?e.filter((t)=>typeof t==="string").map((t)=>t.trim()).filter(Boolean):void 0,f.array(f.string()).optional()).transform((e)=>{if(!e)return;let t=[...new Set(e)].sort((a,i)=>a.localeCompare(i));return t.length>0?t:void 0}),Z=f.enum(["basic","agentic"]).catch("basic"),v=f.object({telemetryOptOut:f.boolean().default(!1).catch(!1),autoUpdateEnabled:f.boolean().default(!0).catch(!0),compactionStrategy:Z.optional(),disabledTools:O.optional(),disabledPlugins:O.optional()}).strip().transform((e)=>{let t={autoUpdateEnabled:e.autoUpdateEnabled,telemetryOptOut:e.telemetryOptOut};if(e.compactionStrategy)t.compactionStrategy=e.compactionStrategy;if(e.disabledTools?.length)t.disabledTools=e.disabledTools;if(e.disabledPlugins?.length)t.disabledPlugins=e.disabledPlugins;return t});function m(){return v.parse({})}var h;function _(e){if(e.disabledTools)Object.freeze(e.disabledTools);if(e.disabledPlugins)Object.freeze(e.disabledPlugins);return Object.freeze(e)}function k(e){let t;try{t=N(e,"utf8")}catch{return m()}try{let a=v.safeParse(JSON.parse(t));return a.success?a.data:m()}catch{return m()}}function E(){let e=Q(),t=K(e,{throwIfNoEntry:!1}),a=t?.mtimeMs??0,i=t?.size??0,l=h;if(l&&l.path===e&&l.mtimeMs===a&&l.size===i)return l;let r=_(t?k(e):m());return h={path:e,mtimeMs:a,size:i,value:r},h}function X(){return E().value}function G(){return X().telemetryOptOut}class P{name;logger;enabled;constructor(e={}){this.name=e.name??"TelemetryLoggerSink",this.logger=e.logger,this.enabled=e.enabled??!0}emit(e,t){if(!this.isEnabled())return;this.logger?.log("telemetry.event",{telemetrySink:this.name,event:e,properties:t})}emitRequired(e,t){this.logger?.log("telemetry.required_event",{telemetrySink:this.name,severity:"warn",event:e,properties:t})}recordCounter(e,t,a,i,l){if(!l&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:e,value:t,attributes:a,description:i,required:l===!0})}recordHistogram(e,t,a,i,l){if(!l&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:e,value:t,attributes:a,description:i,required:l===!0})}recordGauge(e,t,a,i,l){if(!l&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:e,value:t,attributes:a,description:i,required:l===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class o{adapters;metadata;distinctId;commonProperties;constructor(e={}){if(this.adapters=[...e.adapters??[]],e.logger)this.adapters.push(new P({logger:e.logger}));this.metadata={...e.metadata??{}},this.distinctId=e.distinctId,this.commonProperties={...e.commonProperties??{}}}addAdapter(e){this.adapters.push(e)}setDistinctId(e){this.distinctId=e}setMetadata(e){this.metadata={...e}}updateMetadata(e){this.metadata={...this.metadata,...e}}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}isEnabled(){return this.adapters.some((e)=>e.isEnabled())}capture(e){let t=this.buildAttributes(e.properties);for(let a of this.adapters)a.emit(e.event,t)}captureRequired(e,t){let a=this.buildAttributes(t);for(let i of this.adapters)i.emitRequired(e,a)}recordCounter(e,t,a,i,l=!1){let r=this.buildAttributes(a);for(let d of this.adapters)d.recordCounter(e,t,r,i,l)}recordHistogram(e,t,a,i,l=!1){let r=this.buildAttributes(a);for(let d of this.adapters)d.recordHistogram(e,t,r,i,l)}recordGauge(e,t,a,i,l=!1){let r=this.buildAttributes(a);for(let d of this.adapters)d.recordGauge(e,t,r,i,l)}async flush(){await Promise.all(this.adapters.map((e)=>e.flush()))}async dispose(){await Promise.all(this.adapters.map((e)=>e.dispose()))}buildAttributes(e){return{...this.commonProperties,...e,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class w{distinctId;metadata;commonProperties;constructor(e={}){this.distinctId=e.distinctId,this.metadata={...e.metadata??{}},this.commonProperties={...e.commonProperties??{}}}setDistinctId(e){this.distinctId=e}setMetadata(e){this.metadata={...e}}updateMetadata(e){this.metadata={...this.metadata,...e}}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}isEnabled(){return!1}capture(e){this.resolveProperties(e.properties)}captureRequired(e,t){this.resolveProperties(t)}recordCounter(){}recordHistogram(){}recordGauge(){}async flush(){}async dispose(){}resolveProperties(e){return{...this.commonProperties,...e,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class T{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=ae({[be]:e.serviceName??"cline",...e.serviceVersion?{[me]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)Y.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)q.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return D.getTracer(e,t??this.options.serviceVersion)}createAdapter(e){return new b({...e,meterProvider:this.meterProvider,loggerProvider:this.loggerProvider})}createTelemetryService(e){let t=this.createAdapter({name:e.name,enabled:this.options.enabled,metadata:e.metadata});return new o({...e,adapters:[t],distinctId:u(e.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(e){let t=y(this.options.metricsExporter);if(t.length===0)return null;let a=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),i=Math.min(30000,Math.floor(a*0.8)),l=t.map((r)=>Pe(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:a,timeout:i})).filter((r)=>r!==null);if(l.length===0)return null;return new se({resource:e,readers:l})}createTracerProvider(e){let t=y(this.options.tracesExporter);if(t.length===0)return null;let a=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,i=this.options.otlpTracesHeaders??this.options.otlpHeaders,l=[];for(let r of t){let d=he(r,{endpoint:a,headers:i,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(d)l.push(d)}if(l.length===0)return null;return new ue({resource:e,spanProcessors:l})}createLoggerProvider(e){let t=y(this.options.logsExporter);if(t.length===0)return null;let a=t.map((i)=>{let l=ce(i,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!l)return null;return new le(l,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((i)=>i!==null);if(a.length===0)return null;return new re({resource:e,processors:a})}}function z(e){let t=new T(e),a=t.createTelemetryService(e);return a.captureRequired("telemetry.provider_created",{provider:"opentelemetry",enabled:e.enabled??!0,logsExporter:Array.isArray(e.logsExporter)?e.logsExporter.join(","):e.logsExporter,metricsExporter:Array.isArray(e.metricsExporter)?e.metricsExporter.join(","):e.metricsExporter,tracesExporter:Array.isArray(e.tracesExporter)?e.tracesExporter.join(","):e.tracesExporter,otlpProtocol:e.otlpProtocol,hasOtlpEndpoint:Boolean(e.otlpEndpoint),serviceName:e.serviceName,serviceVersion:e.serviceVersion}),{provider:t,telemetry:a}}function M(e){if(G())return{telemetry:new w(e)};if(e.enabled!==!0)return{telemetry:new o({...e,distinctId:u(e.distinctId)})};return z(e)}function oe(e){let{telemetry:t,provider:a}=M(e);return{telemetry:t,provider:a,flush:async()=>{let r=a;if(r&&typeof r.forceFlush==="function")try{await r.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([t.dispose(),a?.dispose()])}}}function y(e){if(!e)return[];return(Array.isArray(e)?e:e.split(",")).map((a)=>a.trim()).filter((a)=>a==="console"||a==="otlp")}function ce(e,t){if(e==="console")return new ie;if(!t.endpoint)return null;let a=S(t.endpoint,"/v1/logs");return new p({url:a,headers:t.headers})}function he(e,t){if(e==="console")return new fe(new ge);if(!t.endpoint)return null;let a=S(t.endpoint,"/v1/traces");return new de(new te({url:a,headers:t.headers}))}function Pe(e,t){if(e==="console")return new C({exporter:new ne,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let a=S(t.endpoint,"/v1/metrics");return new C({exporter:new ee({url:a,headers:t.headers}),exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout})}function S(e,t){let a=new URL(e),i=a.pathname.endsWith("/")?a.pathname.slice(0,-1):a.pathname;return a.pathname=i.endsWith(t)?i:`${i}${t}`,a.toString()}export{u as resolveCoreDistinctId,z as createOpenTelemetryTelemetryService,M as createConfiguredTelemetryService,oe as createConfiguredTelemetryHandle,T as OpenTelemetryProvider,b as OpenTelemetryAdapter};
1
+ import{existsSync as j,mkdirSync as L,readFileSync as R,writeFileSync as U}from"node:fs";import{resolve as W}from"node:path";import{resolveSessionDataDir as F}from"@cline/shared/storage";import{nanoid as H}from"nanoid";import*as J from"node-machine-id";var V="machine-id";function u(e){let t=e?.trim();if(t)return t;let a=x();if(a)return a;return I()}function $(){let e=J;return e.machineIdSync??e.default?.machineIdSync}function x(){try{let e=$();if(!e)return;return e().trim()||void 0}catch{return}}function I(){let e=F(),t=W(e,V);try{if(j(t)){let r=R(t,"utf8").trim();if(r.length>0)return r}}catch{}let a=`cl-${H()}`;try{L(e,{recursive:!0}),U(t,a,"utf8")}catch{}return a}class b{name;metadata;meter;logger;enabled;distinctId;commonProperties;counters=new Map;histograms=new Map;gauges=new Map;gaugeValues=new Map;meterProvider;loggerProvider;constructor(e){this.name=e.name??"OpenTelemetryAdapter",this.metadata={...e.metadata},this.meterProvider=e.meterProvider,this.loggerProvider=e.loggerProvider,this.meter=e.meterProvider?.getMeter("cline")??null,this.logger=e.loggerProvider?.getLogger("cline")??null,this.enabled=e.enabled??!0,this.distinctId=e.distinctId,this.commonProperties=e.commonProperties?{...e.commonProperties}:{}}emit(e,t){if(!this.isEnabled())return;this.emitLog(e,t,!1)}emitRequired(e,t){this.emitLog(e,t,!0)}recordCounter(e,t,a,r,l=!1){if(!this.meter||!l&&!this.isEnabled())return;let i=this.counters.get(e);if(!i)i=this.meter.createCounter(e,r?{description:r}:void 0),this.counters.set(e,i);i.add(t,this.flattenProperties(this.buildAttributes(a)))}recordHistogram(e,t,a,r,l=!1){if(!this.meter||!l&&!this.isEnabled())return;let i=this.histograms.get(e);if(!i)i=this.meter.createHistogram(e,r?{description:r}:void 0),this.histograms.set(e,i);i.record(t,this.flattenProperties(this.buildAttributes(a)))}recordGauge(e,t,a,r,l=!1){if(!this.meter||!l&&!this.isEnabled())return;let i=this.buildAttributes(a),d=JSON.stringify(i),g=this.gaugeValues.get(e);if(t===null){if(g){if(g.delete(d),g.size===0)this.gaugeValues.delete(e),this.gauges.delete(e)}return}let n=g;if(!n)n=new Map,this.gaugeValues.set(e,n);if(!this.gauges.has(e)){let s=this.meter.createObservableGauge(e,r?{description:r}:void 0);s.addCallback((c)=>{for(let A of this.snapshotGaugeSeries(e))c.observe(A.value,this.flattenProperties(A.attributes))}),this.gauges.set(e,s)}n.set(d,{value:t,attributes:i})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}setDistinctId(e){this.distinctId=e}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}async flush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.()])}emitLog(e,t,a){if(!this.logger)return;let r=this.flattenProperties(this.buildAttributes(t,a));this.logger.emit({severityText:"INFO",body:e,attributes:r})}buildAttributes(e,t=!1){return{...this.commonProperties,...this.metadata,...e,...this.distinctId?{distinct_id:this.distinctId}:{},...t?{_required:!0}:{}}}snapshotGaugeSeries(e){let t=this.gaugeValues.get(e);if(!t)return[];return Array.from(t.values(),(a)=>({value:a.value,attributes:a.attributes?{...a.attributes}:void 0}))}flattenProperties(e,t="",a=new WeakSet,r=0){if(!e)return{};let l={},i=100,d=10;for(let[g,n]of Object.entries(e)){if(g==="__proto__"||g==="constructor"||g==="prototype")continue;let s=t?`${t}.${g}`:g;if(n===null||n===void 0){l[s]=String(n);continue}if(Array.isArray(n)){let c=n.length>i?n.slice(0,i):n;try{l[s]=JSON.stringify(c)}catch{l[s]="[UnserializableArray]"}if(n.length>i)l[`${s}_truncated`]=!0,l[`${s}_original_length`]=n.length;continue}if(typeof n==="object"){if(n instanceof Date){l[s]=n.toISOString();continue}if(n instanceof Error){l[s]=n.message;continue}if(a.has(n)){l[s]="[Circular]";continue}if(r>=d){l[s]="[MaxDepthExceeded]";continue}a.add(n),Object.assign(l,this.flattenProperties(n,s,a,r+1));continue}if(B(n)){l[s]=n;continue}try{l[s]=JSON.stringify(n)}catch{l[s]=String(n)}}return l}}function B(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}import{metrics as Y,trace as D}from"@opentelemetry/api";import{logs as q}from"@opentelemetry/api-logs";import{OTLPLogExporter as p}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as ee}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as te}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as ae}from"@opentelemetry/resources";import{BatchLogRecordProcessor as le,ConsoleLogRecordExporter as re,LoggerProvider as ie}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as ne,MeterProvider as se,PeriodicExportingMetricReader as C}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as de,ConsoleSpanExporter as ge,SimpleSpanProcessor as fe}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as ue}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as be,ATTR_SERVICE_VERSION as oe}from"@opentelemetry/semantic-conventions";import{mkdirSync as Re,readFileSync as N,statSync as K,writeFileSync as Ue}from"node:fs";import{resolveGlobalSettingsPath as Q}from"@cline/shared/storage";import{z as f}from"zod";import{AGENT_UNEXPECTED_REASONING_TOKENS_EVENT as Ce,captureAgentUnexpectedReasoningTokens as we,SDK_ERROR_TELEMETRY_EVENT as ze}from"@cline/shared";var O=f.preprocess((e)=>Array.isArray(e)?e.filter((t)=>typeof t==="string").map((t)=>t.trim()).filter(Boolean):void 0,f.array(f.string()).optional()).transform((e)=>{if(!e)return;let t=[...new Set(e)].sort((a,r)=>a.localeCompare(r));return t.length>0?t:void 0}),Z=f.enum(["basic","agentic"]).catch("basic"),v=f.object({telemetryOptOut:f.boolean().default(!1).catch(!1),autoUpdateEnabled:f.boolean().default(!0).catch(!0),compactionStrategy:Z.optional(),disabledTools:O.optional(),disabledPlugins:O.optional()}).strip().transform((e)=>{let t={autoUpdateEnabled:e.autoUpdateEnabled,telemetryOptOut:e.telemetryOptOut};if(e.compactionStrategy)t.compactionStrategy=e.compactionStrategy;if(e.disabledTools?.length)t.disabledTools=e.disabledTools;if(e.disabledPlugins?.length)t.disabledPlugins=e.disabledPlugins;return t});function o(){return v.parse({})}var h;function _(e){if(e.disabledTools)Object.freeze(e.disabledTools);if(e.disabledPlugins)Object.freeze(e.disabledPlugins);return Object.freeze(e)}function k(e){let t;try{t=N(e,"utf8")}catch{return o()}try{let a=v.safeParse(JSON.parse(t));return a.success?a.data:o()}catch{return o()}}function E(){let e=Q(),t=K(e,{throwIfNoEntry:!1}),a=t?.mtimeMs??0,r=t?.size??0,l=h;if(l&&l.path===e&&l.mtimeMs===a&&l.size===r)return l;let i=_(t?k(e):o());return h={path:e,mtimeMs:a,size:r,value:i},h}function X(){return E().value}function G(){return X().telemetryOptOut}class P{name;logger;enabled;constructor(e={}){this.name=e.name??"TelemetryLoggerSink",this.logger=e.logger,this.enabled=e.enabled??!0}emit(e,t){if(!this.isEnabled())return;this.logger?.log("telemetry.event",{telemetrySink:this.name,event:e,properties:t})}emitRequired(e,t){this.logger?.log("telemetry.required_event",{telemetrySink:this.name,severity:"warn",event:e,properties:t})}recordCounter(e,t,a,r,l){if(!l&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:e,value:t,attributes:a,description:r,required:l===!0})}recordHistogram(e,t,a,r,l){if(!l&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:e,value:t,attributes:a,description:r,required:l===!0})}recordGauge(e,t,a,r,l){if(!l&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:e,value:t,attributes:a,description:r,required:l===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class m{adapters;metadata;distinctId;commonProperties;constructor(e={}){if(this.adapters=[...e.adapters??[]],e.logger)this.adapters.push(new P({logger:e.logger}));this.metadata={...e.metadata??{}},this.distinctId=e.distinctId,this.commonProperties={...e.commonProperties??{}}}addAdapter(e){this.adapters.push(e)}setDistinctId(e){this.distinctId=e}setMetadata(e){this.metadata={...e}}updateMetadata(e){this.metadata={...this.metadata,...e}}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}isEnabled(){return this.adapters.some((e)=>e.isEnabled())}capture(e){let t=this.buildAttributes(e.properties);for(let a of this.adapters)a.emit(e.event,t)}captureRequired(e,t){let a=this.buildAttributes(t);for(let r of this.adapters)r.emitRequired(e,a)}recordCounter(e,t,a,r,l=!1){let i=this.buildAttributes(a);for(let d of this.adapters)d.recordCounter(e,t,i,r,l)}recordHistogram(e,t,a,r,l=!1){let i=this.buildAttributes(a);for(let d of this.adapters)d.recordHistogram(e,t,i,r,l)}recordGauge(e,t,a,r,l=!1){let i=this.buildAttributes(a);for(let d of this.adapters)d.recordGauge(e,t,i,r,l)}async flush(){await Promise.all(this.adapters.map((e)=>e.flush()))}async dispose(){await Promise.all(this.adapters.map((e)=>e.dispose()))}buildAttributes(e){return{...this.commonProperties,...e,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class w{distinctId;metadata;commonProperties;constructor(e={}){this.distinctId=e.distinctId,this.metadata={...e.metadata??{}},this.commonProperties={...e.commonProperties??{}}}setDistinctId(e){this.distinctId=e}setMetadata(e){this.metadata={...e}}updateMetadata(e){this.metadata={...this.metadata,...e}}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}isEnabled(){return!1}capture(e){this.resolveProperties(e.properties)}captureRequired(e,t){this.resolveProperties(t)}recordCounter(){}recordHistogram(){}recordGauge(){}async flush(){}async dispose(){}resolveProperties(e){return{...this.commonProperties,...e,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class T{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=ae({[be]:e.serviceName??"cline",...e.serviceVersion?{[oe]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)Y.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)q.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return D.getTracer(e,t??this.options.serviceVersion)}createAdapter(e){return new b({...e,meterProvider:this.meterProvider,loggerProvider:this.loggerProvider})}createTelemetryService(e){let t=this.createAdapter({name:e.name,enabled:this.options.enabled,metadata:e.metadata});return new m({...e,adapters:[t],distinctId:u(e.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(e){let t=y(this.options.metricsExporter);if(t.length===0)return null;let a=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),r=Math.min(30000,Math.floor(a*0.8)),l=t.map((i)=>Pe(i,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:a,timeout:r})).filter((i)=>i!==null);if(l.length===0)return null;return new se({resource:e,readers:l})}createTracerProvider(e){let t=y(this.options.tracesExporter);if(t.length===0)return null;let a=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,r=this.options.otlpTracesHeaders??this.options.otlpHeaders,l=[];for(let i of t){let d=he(i,{endpoint:a,headers:r,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(d)l.push(d)}if(l.length===0)return null;return new ue({resource:e,spanProcessors:l})}createLoggerProvider(e){let t=y(this.options.logsExporter);if(t.length===0)return null;let a=t.map((r)=>{let l=ce(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!l)return null;return new le(l,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((r)=>r!==null);if(a.length===0)return null;return new ie({resource:e,processors:a})}}function z(e){let t=new T(e),a=t.createTelemetryService(e);return a.captureRequired("telemetry.provider_created",{provider:"opentelemetry",enabled:e.enabled??!0,logsExporter:Array.isArray(e.logsExporter)?e.logsExporter.join(","):e.logsExporter,metricsExporter:Array.isArray(e.metricsExporter)?e.metricsExporter.join(","):e.metricsExporter,tracesExporter:Array.isArray(e.tracesExporter)?e.tracesExporter.join(","):e.tracesExporter,otlpProtocol:e.otlpProtocol,hasOtlpEndpoint:Boolean(e.otlpEndpoint),serviceName:e.serviceName,serviceVersion:e.serviceVersion}),{provider:t,telemetry:a}}function M(e){if(G())return{telemetry:new w(e)};if(e.enabled!==!0)return{telemetry:new m({...e,distinctId:u(e.distinctId)})};return z(e)}function me(e){let{telemetry:t,provider:a}=M(e);return{telemetry:t,provider:a,flush:async()=>{let i=a;if(i&&typeof i.forceFlush==="function")try{await i.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([t.dispose(),a?.dispose()])}}}function y(e){if(!e)return[];return(Array.isArray(e)?e:e.split(",")).map((a)=>a.trim()).filter((a)=>a==="console"||a==="otlp")}function ce(e,t){if(e==="console")return new re;if(!t.endpoint)return null;let a=S(t.endpoint,"/v1/logs");return new p({url:a,headers:t.headers})}function he(e,t){if(e==="console")return new fe(new ge);if(!t.endpoint)return null;let a=S(t.endpoint,"/v1/traces");return new de(new te({url:a,headers:t.headers}))}function Pe(e,t){if(e==="console")return new C({exporter:new ne,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let a=S(t.endpoint,"/v1/metrics");return new C({exporter:new ee({url:a,headers:t.headers}),exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout})}function S(e,t){let a=new URL(e),r=a.pathname.endsWith("/")?a.pathname.slice(0,-1):a.pathname;return a.pathname=r.endsWith(t)?r:`${r}${t}`,a.toString()}export{u as resolveCoreDistinctId,z as createOpenTelemetryTelemetryService,M as createConfiguredTelemetryService,me as createConfiguredTelemetryHandle,T as OpenTelemetryProvider,b as OpenTelemetryAdapter};
@@ -9,11 +9,11 @@ export declare const SessionManifestSchema: z.ZodObject<{
9
9
  exit_code: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
10
10
  status: z.ZodEnum<{
11
11
  failed: "failed";
12
- running: "running";
13
- cancelled: "cancelled";
14
- pending: "pending";
15
12
  completed: "completed";
16
13
  idle: "idle";
14
+ running: "running";
15
+ pending: "pending";
16
+ cancelled: "cancelled";
17
17
  }>;
18
18
  interactive: z.ZodBoolean;
19
19
  provider: z.ZodString;
@@ -22,11 +22,11 @@ export declare const ChatSessionConfigSchema: z.ZodObject<{
22
22
  export declare const ChatSessionStatusSchema: z.ZodEnum<{
23
23
  error: "error";
24
24
  failed: "failed";
25
- running: "running";
26
- cancelled: "cancelled";
27
- pending: "pending";
28
25
  completed: "completed";
29
26
  idle: "idle";
27
+ running: "running";
28
+ pending: "pending";
29
+ cancelled: "cancelled";
30
30
  starting: "starting";
31
31
  stopping: "stopping";
32
32
  }>;
@@ -68,8 +68,8 @@ export declare const ChatMessageSchema: z.ZodObject<{
68
68
  createdAt: z.ZodNumber;
69
69
  runCount: z.ZodNumber;
70
70
  kind: z.ZodOptional<z.ZodEnum<{
71
- commit: "commit";
72
71
  stash: "stash";
72
+ commit: "commit";
73
73
  }>>;
74
74
  }, z.core.$strip>>;
75
75
  }, z.core.$strip>>;
@@ -84,11 +84,11 @@ export declare const ChatViewStateSchema: z.ZodObject<{
84
84
  status: z.ZodEnum<{
85
85
  error: "error";
86
86
  failed: "failed";
87
- running: "running";
88
- cancelled: "cancelled";
89
- pending: "pending";
90
87
  completed: "completed";
91
88
  idle: "idle";
89
+ running: "running";
90
+ pending: "pending";
91
+ cancelled: "cancelled";
92
92
  starting: "starting";
93
93
  stopping: "stopping";
94
94
  }>;
@@ -142,8 +142,8 @@ export declare const ChatViewStateSchema: z.ZodObject<{
142
142
  createdAt: z.ZodNumber;
143
143
  runCount: z.ZodNumber;
144
144
  kind: z.ZodOptional<z.ZodEnum<{
145
- commit: "commit";
146
145
  stash: "stash";
146
+ commit: "commit";
147
147
  }>>;
148
148
  }, z.core.$strip>>;
149
149
  }, z.core.$strip>>;
@@ -53,8 +53,17 @@ export interface CoreCompactionContext {
53
53
  thresholdRatio: number;
54
54
  utilizationRatio: number;
55
55
  }
56
+ export type CoreCompactionBudgetPolicyIntent = "agentic_summary" | "basic_compaction_projection" | "normal_provider_request";
57
+ export type CoreCompactionLiveTailHandling = "included_verbatim" | "included_degraded" | "summarized_as_context" | "omitted_with_warning" | "preserved_out_of_band";
58
+ export interface CoreCompactionBudgetMetadata {
59
+ policyIntent: CoreCompactionBudgetPolicyIntent;
60
+ actionCount: number;
61
+ warningCount: number;
62
+ liveTailHandling: CoreCompactionLiveTailHandling;
63
+ }
56
64
  export interface CoreCompactionResult {
57
65
  messages: MessageWithMetadata[];
66
+ budget?: CoreCompactionBudgetMetadata;
58
67
  }
59
68
  export interface CoreCompactionSummarizerConfig {
60
69
  providerId: string;
@@ -62,6 +71,13 @@ export interface CoreCompactionSummarizerConfig {
62
71
  apiKey?: string;
63
72
  baseUrl?: string;
64
73
  headers?: Record<string, string>;
74
+ /**
75
+ * Optional pre-resolved model metadata for the summarizer. Supplying either
76
+ * this or `knownModels` lets agentic compaction budget summary input against
77
+ * the summarizer model's actual context window instead of falling back to the
78
+ * active model's window.
79
+ */
80
+ modelInfo?: ModelInfo;
65
81
  knownModels?: Record<string, ModelInfo>;
66
82
  providerConfig?: ProviderConfig;
67
83
  maxOutputTokens?: number;
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.59",
4
+ "version": "0.0.60",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/cline/cline",
@@ -48,9 +48,9 @@
48
48
  "test:watch": "vitest --config vitest.config.ts"
49
49
  },
50
50
  "dependencies": {
51
- "@cline/agents": "0.0.59",
52
- "@cline/shared": "0.0.59",
53
- "@cline/llms": "0.0.59",
51
+ "@cline/agents": "0.0.60",
52
+ "@cline/shared": "0.0.60",
53
+ "@cline/llms": "0.0.60",
54
54
  "@modelcontextprotocol/sdk": "^1.29.0",
55
55
  "@opentelemetry/api": "^1.9.0",
56
56
  "@opentelemetry/api-logs": "^0.214.0",