@cline/core 0.0.59 → 0.0.60-nightly.1784085310

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>;
@@ -41,16 +41,17 @@ export declare const AuthSettingsSchema: z.ZodObject<{
41
41
  refreshToken: z.ZodOptional<z.ZodString>;
42
42
  expiresAt: z.ZodOptional<z.ZodNumber>;
43
43
  accountId: z.ZodOptional<z.ZodString>;
44
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
44
45
  }, z.core.$strip>;
45
46
  export type AuthSettings = z.infer<typeof AuthSettingsSchema>;
46
47
  export declare const ReasoningSettingsSchema: z.ZodObject<{
47
48
  enabled: z.ZodOptional<z.ZodBoolean>;
48
49
  effort: z.ZodOptional<z.ZodEnum<{
50
+ none: "none";
49
51
  low: "low";
50
- high: "high";
51
52
  medium: "medium";
53
+ high: "high";
52
54
  xhigh: "xhigh";
53
- none: "none";
54
55
  }>>;
55
56
  budgetTokens: z.ZodOptional<z.ZodNumber>;
56
57
  }, z.core.$strip>;
@@ -62,9 +63,9 @@ export declare const AwsSettingsSchema: z.ZodObject<{
62
63
  region: z.ZodOptional<z.ZodString>;
63
64
  profile: z.ZodOptional<z.ZodString>;
64
65
  authentication: z.ZodOptional<z.ZodEnum<{
65
- "api-key": "api-key";
66
66
  profile: "profile";
67
67
  iam: "iam";
68
+ "api-key": "api-key";
68
69
  apikey: "apikey";
69
70
  }>>;
70
71
  usePromptCache: z.ZodOptional<z.ZodBoolean>;
@@ -124,28 +125,29 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
124
125
  refreshToken: z.ZodOptional<z.ZodString>;
125
126
  expiresAt: z.ZodOptional<z.ZodNumber>;
126
127
  accountId: z.ZodOptional<z.ZodString>;
128
+ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
127
129
  }, z.core.$strip>>;
128
130
  model: z.ZodOptional<z.ZodString>;
129
131
  protocol: z.ZodOptional<z.ZodEnum<{
130
- "openai-responses": "openai-responses";
131
132
  anthropic: "anthropic";
132
133
  gemini: "gemini";
134
+ "openai-chat": "openai-chat";
135
+ "openai-responses": "openai-responses";
133
136
  "openai-r1": "openai-r1";
134
137
  "ai-sdk": "ai-sdk";
135
- "openai-chat": "openai-chat";
136
138
  }>>;
137
139
  client: z.ZodOptional<z.ZodEnum<{
138
140
  custom: "custom";
139
141
  anthropic: "anthropic";
140
- bedrock: "bedrock";
141
142
  gemini: "gemini";
142
- vertex: "vertex";
143
- openai: "openai";
144
143
  "openai-r1": "openai-r1";
145
144
  "ai-sdk": "ai-sdk";
146
145
  "ai-sdk-community": "ai-sdk-community";
146
+ openai: "openai";
147
147
  "openai-compatible": "openai-compatible";
148
+ bedrock: "bedrock";
148
149
  fetch: "fetch";
150
+ vertex: "vertex";
149
151
  }>>;
150
152
  routingProviderId: z.ZodOptional<z.ZodString>;
151
153
  maxTokens: z.ZodOptional<z.ZodNumber>;
@@ -156,11 +158,11 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
156
158
  reasoning: z.ZodOptional<z.ZodObject<{
157
159
  enabled: z.ZodOptional<z.ZodBoolean>;
158
160
  effort: z.ZodOptional<z.ZodEnum<{
161
+ none: "none";
159
162
  low: "low";
160
- high: "high";
161
163
  medium: "medium";
164
+ high: "high";
162
165
  xhigh: "xhigh";
163
- none: "none";
164
166
  }>>;
165
167
  budgetTokens: z.ZodOptional<z.ZodNumber>;
166
168
  }, z.core.$strip>>;
@@ -171,9 +173,9 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
171
173
  region: z.ZodOptional<z.ZodString>;
172
174
  profile: z.ZodOptional<z.ZodString>;
173
175
  authentication: z.ZodOptional<z.ZodEnum<{
174
- "api-key": "api-key";
175
176
  profile: "profile";
176
177
  iam: "iam";
178
+ "api-key": "api-key";
177
179
  apikey: "apikey";
178
180
  }>>;
179
181
  usePromptCache: z.ZodOptional<z.ZodBoolean>;
@@ -217,12 +219,12 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
217
219
  }>>;
218
220
  capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<{
219
221
  tools: "tools";
220
- streaming: "streaming";
221
- "prompt-cache": "prompt-cache";
222
222
  reasoning: "reasoning";
223
+ "prompt-cache": "prompt-cache";
224
+ streaming: "streaming";
225
+ vision: "vision";
223
226
  "computer-use": "computer-use";
224
227
  oauth: "oauth";
225
- vision: "vision";
226
228
  popular: "popular";
227
229
  }>>>;
228
230
  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.
@@ -254,7 +274,7 @@ export type TelemetryCompactionStrategy = "basic" | "agentic" | "custom";
254
274
  * Trigger mode for a compaction attempt.
255
275
  *
256
276
  * - `auto` — fired automatically by `createContextCompactionPrepareTurn`
257
- * when input tokens exceed the configured threshold.
277
+ * when input tokens reach the fixed compaction threshold.
258
278
  * - `manual` — user-initiated (e.g. CLI `/compact`).
259
279
  */
260
280
  export type TelemetryCompactionMode = "auto" | "manual";
@@ -265,6 +285,7 @@ export interface CaptureCompactionExecutedProperties {
265
285
  messagesBefore: number;
266
286
  messagesAfter: number;
267
287
  messagesRemoved: number;
288
+ /** Full-request token estimates, in the same units as the trigger and limit. */
268
289
  tokensBefore: number;
269
290
  tokensAfter: number;
270
291
  tokensSaved: number;
@@ -290,6 +311,7 @@ export interface CaptureCompactionSkippedProperties {
290
311
  * be introduced without changing the schema.
291
312
  */
292
313
  reason: string;
314
+ /** Full-request token estimate, in the same units as the trigger and limit. */
293
315
  tokensBefore: number;
294
316
  triggerTokens: number;
295
317
  maxInputTokens: number;
@@ -299,3 +321,15 @@ export interface CaptureCompactionSkippedProperties {
299
321
  modelId?: string;
300
322
  }
301
323
  export declare function captureCompactionSkipped(telemetry: ITelemetryService | undefined, properties: CaptureCompactionSkippedProperties & Partial<TelemetryAgentIdentityProperties>): void;
324
+ export interface CaptureCompactionBudgetEmergencyProperties {
325
+ ulid: string;
326
+ strategy: TelemetryCompactionStrategy;
327
+ mode: TelemetryCompactionMode;
328
+ policyIntent: CoreCompactionBudgetPolicyIntent;
329
+ actionCount: number;
330
+ warningCount: number;
331
+ liveTailHandling: CoreCompactionLiveTailHandling;
332
+ provider?: string;
333
+ modelId?: string;
334
+ }
335
+ 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>>;
@@ -36,6 +36,31 @@ export interface CoreRuntimeFeatures {
36
36
  disableMcpSettingsTools?: boolean;
37
37
  yolo?: boolean;
38
38
  }
39
+ export type CoreCompactionMode = "auto" | "manual";
40
+ export interface CoreCompactionBudget {
41
+ request: {
42
+ /** Estimated tokens for the full provider request. */
43
+ inputTokens: number;
44
+ /** Effective provider input limit. */
45
+ maxInputTokens: number;
46
+ /** Full-request token count that triggers automatic compaction. */
47
+ triggerTokens: number;
48
+ /** Full-request token count the strategy output should fit within. */
49
+ targetTokens: number;
50
+ /** Fixed system-prompt, tool-definition, and request framing cost. */
51
+ overheadTokens: number;
52
+ thresholdRatio: number;
53
+ utilizationRatio: number;
54
+ };
55
+ messages: {
56
+ /** Estimated tokens in the compactable message transcript. */
57
+ inputTokens: number;
58
+ /** Message budget corresponding to the full-request trigger. */
59
+ triggerTokens: number;
60
+ /** Message budget the strategy should compact toward. */
61
+ targetTokens: number;
62
+ };
63
+ }
39
64
  export interface CoreCompactionContext {
40
65
  agentId: string;
41
66
  conversationId: string;
@@ -47,14 +72,20 @@ export interface CoreCompactionContext {
47
72
  provider: string;
48
73
  info?: ModelInfo;
49
74
  };
50
- maxInputTokens: number;
51
- triggerTokens: number;
52
- targetTokens?: number;
53
- thresholdRatio: number;
54
- utilizationRatio: number;
75
+ mode: CoreCompactionMode;
76
+ budget: CoreCompactionBudget;
77
+ }
78
+ export type CoreCompactionBudgetPolicyIntent = "agentic_summary" | "basic_compaction_projection" | "normal_provider_request";
79
+ export type CoreCompactionLiveTailHandling = "included_verbatim" | "included_degraded" | "summarized_as_context" | "omitted_with_warning" | "preserved_out_of_band";
80
+ export interface CoreCompactionBudgetMetadata {
81
+ policyIntent: CoreCompactionBudgetPolicyIntent;
82
+ actionCount: number;
83
+ warningCount: number;
84
+ liveTailHandling: CoreCompactionLiveTailHandling;
55
85
  }
56
86
  export interface CoreCompactionResult {
57
87
  messages: MessageWithMetadata[];
88
+ budget?: CoreCompactionBudgetMetadata;
58
89
  }
59
90
  export interface CoreCompactionSummarizerConfig {
60
91
  providerId: string;
@@ -62,6 +93,13 @@ export interface CoreCompactionSummarizerConfig {
62
93
  apiKey?: string;
63
94
  baseUrl?: string;
64
95
  headers?: Record<string, string>;
96
+ /**
97
+ * Optional pre-resolved model metadata for the summarizer. Supplying either
98
+ * this or `knownModels` lets agentic compaction budget summary input against
99
+ * the summarizer model's actual context window instead of falling back to the
100
+ * active model's window.
101
+ */
102
+ modelInfo?: ModelInfo;
65
103
  knownModels?: Record<string, ModelInfo>;
66
104
  providerConfig?: ProviderConfig;
67
105
  maxOutputTokens?: number;
@@ -70,10 +108,7 @@ export type CoreCompactionStrategy = "basic" | "agentic";
70
108
  export interface CoreCompactionConfig {
71
109
  enabled?: boolean;
72
110
  strategy?: CoreCompactionStrategy;
73
- thresholdRatio?: number;
74
- reserveTokens?: number;
75
111
  preserveRecentTokens?: number;
76
- maxInputTokens?: number;
77
112
  summarizer?: CoreCompactionSummarizerConfig;
78
113
  compact?: (context: CoreCompactionContext) => Promise<CoreCompactionResult | undefined> | CoreCompactionResult | undefined;
79
114
  }
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-nightly.1784085310",
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-nightly.1784085310",
52
+ "@cline/shared": "0.0.60-nightly.1784085310",
53
+ "@cline/llms": "0.0.60-nightly.1784085310",
54
54
  "@modelcontextprotocol/sdk": "^1.29.0",
55
55
  "@opentelemetry/api": "^1.9.0",
56
56
  "@opentelemetry/api-logs": "^0.214.0",