@cline/core 0.0.41 → 0.0.42

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.
@@ -77,6 +77,8 @@ export declare class LocalRuntimeHost implements RuntimeHost {
77
77
  }, fallbackAutomation?: NonNullable<CoreSessionConfig["extensionContext"]>["automation"]): Promise<void>;
78
78
  private executeTurn;
79
79
  private completeInteractiveTurn;
80
+ private resolveInteractiveStopStatus;
81
+ private resolveInteractiveStopExitCode;
80
82
  private completeAbortedInteractiveTurn;
81
83
  private executeAgentTurn;
82
84
  /**
@@ -97,6 +99,8 @@ export declare class LocalRuntimeHost implements RuntimeHost {
97
99
  private prepareTurnInput;
98
100
  private ensureSessionPersisted;
99
101
  private markTurnRunning;
102
+ private markTurnPending;
103
+ private markTurnIdle;
100
104
  private persistSessionMetadata;
101
105
  private finalizeSingleRun;
102
106
  private failSession;
@@ -13,7 +13,7 @@ export interface BuiltInProviderManifest {
13
13
  protocol?: Llms.ProviderProtocol;
14
14
  }
15
15
  export interface ProviderDefaults {
16
- baseUrl: string;
16
+ baseUrl?: string;
17
17
  modelId: string;
18
18
  knownModels?: Record<string, ModelInfo>;
19
19
  capabilities?: ProviderCapability[];
@@ -65,6 +65,7 @@ export declare const AwsSettingsSchema: z.ZodObject<{
65
65
  "api-key": "api-key";
66
66
  profile: "profile";
67
67
  iam: "iam";
68
+ apikey: "apikey";
68
69
  }>>;
69
70
  usePromptCache: z.ZodOptional<z.ZodBoolean>;
70
71
  useCrossRegionInference: z.ZodOptional<z.ZodBoolean>;
@@ -173,6 +174,7 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
173
174
  "api-key": "api-key";
174
175
  profile: "profile";
175
176
  iam: "iam";
177
+ apikey: "apikey";
176
178
  }>>;
177
179
  usePromptCache: z.ZodOptional<z.ZodBoolean>;
178
180
  useCrossRegionInference: z.ZodOptional<z.ZodBoolean>;
@@ -1,3 +1,4 @@
1
+ import type { PluginInitializationFailure, PluginInitializationWarning } from "../extensions/plugin/plugin-load-report";
1
2
  export interface PluginToolSummary {
2
3
  name: string;
3
4
  pluginName: string;
@@ -6,6 +7,18 @@ export interface PluginToolSummary {
6
7
  enabled: boolean;
7
8
  description?: string;
8
9
  }
10
+ export interface ListPluginToolsResult {
11
+ tools: PluginToolSummary[];
12
+ failures: PluginInitializationFailure[];
13
+ warnings: PluginInitializationWarning[];
14
+ }
15
+ export declare function listPluginToolsWithDiagnostics(input: {
16
+ workspacePath: string;
17
+ cwd?: string;
18
+ disabledToolNames?: ReadonlyArray<string>;
19
+ providerId?: string;
20
+ modelId?: string;
21
+ }): Promise<ListPluginToolsResult>;
9
22
  export declare function listPluginTools(input: {
10
23
  workspacePath: string;
11
24
  cwd?: string;
@@ -5,6 +5,9 @@ import type { ProviderSettingsManager } from "../storage/provider-settings-manag
5
5
  export declare const StoredModelEntrySchema: z.ZodObject<{
6
6
  id: z.ZodOptional<z.ZodString>;
7
7
  name: z.ZodOptional<z.ZodString>;
8
+ maxTokens: z.ZodOptional<z.ZodNumber>;
9
+ contextWindow: z.ZodOptional<z.ZodNumber>;
10
+ maxInputTokens: z.ZodOptional<z.ZodNumber>;
8
11
  capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<{
9
12
  images: "images";
10
13
  tools: "tools";
@@ -109,6 +112,9 @@ export declare const StoredProviderEntrySchema: z.ZodObject<{
109
112
  models: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
110
113
  id: z.ZodOptional<z.ZodString>;
111
114
  name: z.ZodOptional<z.ZodString>;
115
+ maxTokens: z.ZodOptional<z.ZodNumber>;
116
+ contextWindow: z.ZodOptional<z.ZodNumber>;
117
+ maxInputTokens: z.ZodOptional<z.ZodNumber>;
112
118
  capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<{
113
119
  images: "images";
114
120
  tools: "tools";
@@ -175,6 +181,9 @@ export declare const StoredModelsFileSchema: z.ZodObject<{
175
181
  models: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
176
182
  id: z.ZodOptional<z.ZodString>;
177
183
  name: z.ZodOptional<z.ZodString>;
184
+ maxTokens: z.ZodOptional<z.ZodNumber>;
185
+ contextWindow: z.ZodOptional<z.ZodNumber>;
186
+ maxInputTokens: z.ZodOptional<z.ZodNumber>;
178
187
  capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<{
179
188
  images: "images";
180
189
  tools: "tools";
@@ -1,4 +1,4 @@
1
- import { type AddProviderActionRequest, type OAuthProviderId, type ProviderCapability, type ProviderListItem, type ProviderModel, type SaveProviderSettingsActionRequest } from "@cline/shared";
1
+ import { type AddProviderActionRequest, type ITelemetryService, type OAuthProviderId, type ProviderCapability, type ProviderListItem, type ProviderModel, type SaveProviderSettingsActionRequest } from "@cline/shared";
2
2
  import type { ProviderClient, ProviderConfig, ProviderProtocol, ProviderSettings } from "../../services/llms/provider-settings";
3
3
  import type { ProviderSettingsManager } from "../storage/provider-settings-manager";
4
4
  export { ensureCustomProvidersLoaded } from "./local-provider-registry";
@@ -55,7 +55,7 @@ export declare function refreshProviderModelsFromSource(manager: ProviderSetting
55
55
  modelsCount?: number;
56
56
  }>;
57
57
  export declare function normalizeOAuthProvider(provider: string): OAuthProviderId;
58
- export declare function loginLocalProvider(providerId: OAuthProviderId, existing: ProviderSettings | undefined, openUrl: (url: string) => void): Promise<{
58
+ export declare function loginLocalProvider(providerId: OAuthProviderId, existing: ProviderSettings | undefined, openUrl: (url: string) => void, telemetry?: ITelemetryService): Promise<{
59
59
  access: string;
60
60
  refresh: string;
61
61
  expires: number;
@@ -68,34 +68,3 @@ export declare function saveLocalProviderOAuthCredentials(manager: ProviderSetti
68
68
  accountId?: string;
69
69
  }): ProviderSettings;
70
70
  export declare function resolveLocalClineAuthToken(settings: ProviderSettings | undefined): string | undefined;
71
- export type ProviderConfigFieldKey = "apiKey" | "baseUrl";
72
- export interface ProviderConfigFieldRequirement {
73
- defaultValue?: string;
74
- }
75
- export interface ProviderConfigFields {
76
- providerId: string;
77
- authMethod: "api-key" | "oauth" | "local";
78
- fields: Partial<Record<ProviderConfigFieldKey, ProviderConfigFieldRequirement>>;
79
- }
80
- /**
81
- * Project a provider into the inputs a configure-dialog should render.
82
- *
83
- * No fields are marked "required". `llms` no longer pre-flights credentials,
84
- * so a missing API key surfaces as the provider's own auth error rather than
85
- * a synthetic SDK failure. UIs may still require fields client-side if they
86
- * want, but the runtime does not.
87
- *
88
- * - OAuth providers (`cline`, `oca`, `openai-codex`) return `authMethod:
89
- * "oauth"` with no fields; the configure UI should route to the OAuth
90
- * login flow instead.
91
- * - Local auth providers return `authMethod: "local"` with no fields. The
92
- * configure UI should show provider-specific local readiness instead.
93
- * - All other providers return `apiKey`. Built-in local/proxy-style providers
94
- * with user-supplied endpoints, plus user-added providers with saved
95
- * endpoints, also return a pre-filled `baseUrl` field.
96
- *
97
- * Returns the same fallback shape for unknown providers (single `apiKey`
98
- * input, no default base URL) so callers can render a reasonable configure
99
- * dialog without per-id branches.
100
- */
101
- export declare function getProviderConfigFields(providerId: string): ProviderConfigFields;
@@ -0,0 +1,37 @@
1
+ export type ProviderConfigFieldKey = "apiKey" | "baseUrl" | "awsRegion" | "awsProfile";
2
+ export interface ProviderConfigFieldRequirement {
3
+ defaultValue?: string;
4
+ label?: string;
5
+ note?: string;
6
+ placeholder?: string;
7
+ optional?: boolean;
8
+ }
9
+ export interface ProviderConfigFields {
10
+ providerId: string;
11
+ authMethod: "api-key" | "oauth" | "local";
12
+ fields: Partial<Record<ProviderConfigFieldKey, ProviderConfigFieldRequirement>>;
13
+ /** Optional description shown above the fields (e.g. AWS region auto-fill hint). */
14
+ description?: string;
15
+ }
16
+ /**
17
+ * Project a provider into the inputs a configure-dialog should render.
18
+ *
19
+ * No fields are marked "required". `llms` no longer pre-flights credentials,
20
+ * so a missing API key surfaces as the provider's own auth error rather than
21
+ * a synthetic SDK failure. UIs may still require fields client-side if they
22
+ * want, but the runtime does not.
23
+ *
24
+ * - OAuth providers (`cline`, `oca`, `openai-codex`) return `authMethod:
25
+ * "oauth"` with no fields; the configure UI should route to the OAuth
26
+ * login flow instead.
27
+ * - Local auth providers return `authMethod: "local"` with no fields. The
28
+ * configure UI should show provider-specific local readiness instead.
29
+ * - All other providers return `apiKey`. Built-in local/proxy-style providers
30
+ * with user-supplied endpoints, plus user-added providers with saved
31
+ * endpoints, also return a pre-filled `baseUrl` field.
32
+ *
33
+ * Returns the same fallback shape for unknown providers (single `apiKey`
34
+ * input, no default base URL) so callers can render a reasonable configure
35
+ * dialog without per-id branches.
36
+ */
37
+ export declare function getProviderConfigFields(providerId: string): ProviderConfigFields;
@@ -1,5 +1,5 @@
1
1
  import { type SqliteDb } from "@cline/shared/db";
2
- import type { SessionStatus } from "../../types/common";
2
+ import { type SessionStatus } from "../../types/common";
3
3
  import type { SessionRecord } from "../../types/sessions";
4
4
  import type { SessionStore } from "../../types/storage";
5
5
  export interface SqliteSessionStoreOptions {
@@ -25,6 +25,7 @@ export declare const CORE_TELEMETRY_EVENTS: {
25
25
  readonly AUTH_SUCCEEDED: "user.auth_succeeded";
26
26
  readonly AUTH_FAILED: "user.auth_failed";
27
27
  readonly AUTH_LOGGED_OUT: "user.auth_logged_out";
28
+ readonly PROVIDER_CONFIGURED: "user.provider_configured";
28
29
  readonly TELEMETRY_OPT_OUT: "user.opt_out";
29
30
  };
30
31
  readonly TASK: {
@@ -45,6 +46,8 @@ export declare const CORE_TELEMETRY_EVENTS: {
45
46
  readonly AGENT_TEAM_CREATED: "task.agent_team_created";
46
47
  readonly SUBAGENT_STARTED: "task.subagent_started";
47
48
  readonly SUBAGENT_COMPLETED: "task.subagent_completed";
49
+ readonly COMPACTION_EXECUTED: "task.compaction_executed";
50
+ readonly COMPACTION_SKIPPED: "task.compaction_skipped";
48
51
  };
49
52
  readonly HOOKS: {
50
53
  readonly DISCOVERY_COMPLETED: "hooks.discovery_completed";
@@ -86,6 +89,17 @@ export declare function captureAuthStarted(telemetry: ITelemetryService | undefi
86
89
  export declare function captureAuthSucceeded(telemetry: ITelemetryService | undefined, provider?: string): void;
87
90
  export declare function captureAuthFailed(telemetry: ITelemetryService | undefined, provider?: string, errorMessage?: string): void;
88
91
  export declare function captureAuthLoggedOut(telemetry: ITelemetryService | undefined, provider?: string, reason?: string): void;
92
+ /**
93
+ * Fires when the user finishes configuring a "bring your own provider"
94
+ * (API-key based) provider during onboarding or via settings.
95
+ *
96
+ * Unlike the OAuth/device-code `captureAuth*` events, the configure step is a
97
+ * synchronous local credential save with no network roundtrip, so there is no
98
+ * start/fail counterpart — the credential is validated lazily on the first
99
+ * subsequent API call. Mirrors the `{ provider }` payload shape of
100
+ * {@link captureAuthSucceeded} for funnel consistency.
101
+ */
102
+ export declare function captureProviderConfigured(telemetry: ITelemetryService | undefined, provider?: string): void;
89
103
  export declare function captureTelemetryOptOut(telemetry: ITelemetryService | undefined, properties?: TelemetryProperties): void;
90
104
  export declare function identifyAccount(telemetry: ITelemetryService | undefined, account: {
91
105
  id?: string;
@@ -199,3 +213,64 @@ export declare function captureSubagentExecution(telemetry: ITelemetryService |
199
213
  type?: "agent" | "team";
200
214
  } & Partial<TelemetryAgentIdentityProperties>): void;
201
215
  export declare function captureHookDiscovery(telemetry: ITelemetryService | undefined, hookName: string, globalCount: number, workspaceCount: number): void;
216
+ /**
217
+ * Identifies which compaction implementation produced a
218
+ * `task.compaction_executed` / `task.compaction_skipped` event.
219
+ *
220
+ * - `basic` — built-in token-budget truncation
221
+ * (see `extensions/context/basic-compaction.ts`).
222
+ * - `agentic` — built-in LLM-powered summarization
223
+ * (see `extensions/context/agentic-compaction.ts`).
224
+ * - `custom` — user-supplied `compaction.compact()` callback on
225
+ * `CoreSessionConfig`.
226
+ */
227
+ export type TelemetryCompactionStrategy = "basic" | "agentic" | "custom";
228
+ /**
229
+ * Trigger mode for a compaction attempt.
230
+ *
231
+ * - `auto` — fired automatically by `createContextCompactionPrepareTurn`
232
+ * when input tokens exceed the configured threshold.
233
+ * - `manual` — user-initiated (e.g. CLI `/compact`).
234
+ */
235
+ export type TelemetryCompactionMode = "auto" | "manual";
236
+ export interface CaptureCompactionExecutedProperties {
237
+ ulid: string;
238
+ strategy: TelemetryCompactionStrategy;
239
+ mode: TelemetryCompactionMode;
240
+ messagesBefore: number;
241
+ messagesAfter: number;
242
+ messagesRemoved: number;
243
+ tokensBefore: number;
244
+ tokensAfter: number;
245
+ tokensSaved: number;
246
+ triggerTokens: number;
247
+ maxInputTokens: number;
248
+ thresholdRatio: number;
249
+ durationMs: number;
250
+ provider?: string;
251
+ modelId?: string;
252
+ }
253
+ export declare function captureCompactionExecuted(telemetry: ITelemetryService | undefined, properties: CaptureCompactionExecutedProperties & Partial<TelemetryAgentIdentityProperties>): void;
254
+ export interface CaptureCompactionSkippedProperties {
255
+ ulid: string;
256
+ strategy: TelemetryCompactionStrategy;
257
+ mode: TelemetryCompactionMode;
258
+ /**
259
+ * Why the strategy decided not to compact. Currently only one value is
260
+ * emitted by the wrapper:
261
+ * - `no_result` — strategy returned `undefined` (e.g. there was nothing
262
+ * safe to remove). Strategy *exceptions* propagate up instead of
263
+ * firing telemetry, so no `strategy_error` value is emitted today.
264
+ * The field is kept loosely typed (`string`) so additional reasons can
265
+ * be introduced without changing the schema.
266
+ */
267
+ reason: string;
268
+ tokensBefore: number;
269
+ triggerTokens: number;
270
+ maxInputTokens: number;
271
+ thresholdRatio: number;
272
+ durationMs: number;
273
+ provider?: string;
274
+ modelId?: string;
275
+ }
276
+ export declare function captureCompactionSkipped(telemetry: ITelemetryService | undefined, properties: CaptureCompactionSkippedProperties & Partial<TelemetryAgentIdentityProperties>): void;
@@ -1 +1 @@
1
- class u{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,r,l,a=!1){if(!this.meter||!a&&!this.isEnabled())return;let i=this.counters.get(e);if(!i)i=this.meter.createCounter(e,l?{description:l}:void 0),this.counters.set(e,i);i.add(t,this.flattenProperties(this.buildAttributes(r)))}recordHistogram(e,t,r,l,a=!1){if(!this.meter||!a&&!this.isEnabled())return;let i=this.histograms.get(e);if(!i)i=this.meter.createHistogram(e,l?{description:l}:void 0),this.histograms.set(e,i);i.record(t,this.flattenProperties(this.buildAttributes(r)))}recordGauge(e,t,r,l,a=!1){if(!this.meter||!a&&!this.isEnabled())return;let i=this.buildAttributes(r),s=JSON.stringify(i),g=this.gaugeValues.get(e);if(t===null){if(g){if(g.delete(s),g.size===0)this.gaugeValues.delete(e),this.gauges.delete(e)}return}let d=g;if(!d)d=new Map,this.gaugeValues.set(e,d);if(!this.gauges.has(e)){let n=this.meter.createObservableGauge(e,l?{description:l}:void 0);n.addCallback((m)=>{for(let v of this.snapshotGaugeSeries(e))m.observe(v.value,this.flattenProperties(v.attributes))}),this.gauges.set(e,n)}d.set(s,{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,r){if(!this.logger)return;let l=this.flattenProperties(this.buildAttributes(t,r));this.logger.emit({severityText:"INFO",body:e,attributes:l})}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(),(r)=>({value:r.value,attributes:r.attributes?{...r.attributes}:void 0}))}flattenProperties(e,t="",r=new WeakSet,l=0){if(!e)return{};let a={},i=100,s=10;for(let[g,d]of Object.entries(e)){if(g==="__proto__"||g==="constructor"||g==="prototype")continue;let n=t?`${t}.${g}`:g;if(d===null||d===void 0){a[n]=String(d);continue}if(Array.isArray(d)){let m=d.length>i?d.slice(0,i):d;try{a[n]=JSON.stringify(m)}catch{a[n]="[UnserializableArray]"}if(d.length>i)a[`${n}_truncated`]=!0,a[`${n}_original_length`]=d.length;continue}if(typeof d==="object"){if(d instanceof Date){a[n]=d.toISOString();continue}if(d instanceof Error){a[n]=d.message;continue}if(r.has(d)){a[n]="[Circular]";continue}if(l>=s){a[n]="[MaxDepthExceeded]";continue}r.add(d),Object.assign(a,this.flattenProperties(d,n,r,l+1));continue}if(H(d)){a[n]=d;continue}try{a[n]=JSON.stringify(d)}catch{a[n]=String(d)}}return a}}function H(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}import{metrics as L,trace as M}from"@opentelemetry/api";import{logs as C}from"@opentelemetry/api-logs";import{OTLPLogExporter as V}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as N}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as Y}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as R}from"@opentelemetry/resources";import{BatchLogRecordProcessor as _,ConsoleLogRecordExporter as p,LoggerProvider as E}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as ee,MeterProvider as te,PeriodicExportingMetricReader as w}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as re,ConsoleSpanExporter as ae,SimpleSpanProcessor as le}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as ie}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as de,ATTR_SERVICE_VERSION as ne}from"@opentelemetry/semantic-conventions";import{mkdirSync as Ae,readFileSync as J,writeFileSync as ve}from"node:fs";import{resolveGlobalSettingsPath as W}from"@cline/shared/storage";import{z as f}from"zod";import{SDK_ERROR_TELEMETRY_EVENT as Pe}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((r,l)=>r.localeCompare(l));return t.length>0?t:void 0}),O=f.object({telemetryOptOut:f.boolean().default(!1).catch(!1),disabledTools:o.optional(),disabledPlugins:o.optional()}).strip().transform((e)=>{let t={telemetryOptOut:e.telemetryOptOut};if(e.disabledTools?.length)t.disabledTools=e.disabledTools;if(e.disabledPlugins?.length)t.disabledPlugins=e.disabledPlugins;return t});function G(){return O.parse({})}function $(){let e=W(),t;try{t=JSON.parse(J(e,"utf8"))}catch{return G()}let r=O.safeParse(t);return r.success?r.data:G()}function S(){return $().telemetryOptOut}import{existsSync as F,mkdirSync as B,readFileSync as I,writeFileSync as K}from"node:fs";import{resolve as U}from"node:path";import{resolveSessionDataDir as Q}from"@cline/shared/storage";import{nanoid as Z}from"nanoid";import*as k from"node-machine-id";var X="machine-id";function P(e){let t=e?.trim();if(t)return t;let r=D();if(r)return r;return q()}function x(){let e=k;return e.machineIdSync??e.default?.machineIdSync}function D(){try{let e=x();if(!e)return;return e().trim()||void 0}catch{return}}function q(){let e=Q(),t=U(e,X);try{if(F(t)){let l=I(t,"utf8").trim();if(l.length>0)return l}}catch{}let r=`cl-${Z()}`;try{B(e,{recursive:!0}),K(t,r,"utf8")}catch{}return r}class h{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,r,l,a){if(!a&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:e,value:t,attributes:r,description:l,required:a===!0})}recordHistogram(e,t,r,l,a){if(!a&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:e,value:t,attributes:r,description:l,required:a===!0})}recordGauge(e,t,r,l,a){if(!a&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:e,value:t,attributes:r,description:l,required:a===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class b{adapters;metadata;distinctId;commonProperties;constructor(e={}){if(this.adapters=[...e.adapters??[]],e.logger)this.adapters.push(new h({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 r of this.adapters)r.emit(e.event,t)}captureRequired(e,t){let r=this.buildAttributes(t);for(let l of this.adapters)l.emitRequired(e,r)}recordCounter(e,t,r,l,a=!1){let i=this.buildAttributes(r);for(let s of this.adapters)s.recordCounter(e,t,i,l,a)}recordHistogram(e,t,r,l,a=!1){let i=this.buildAttributes(r);for(let s of this.adapters)s.recordHistogram(e,t,i,l,a)}recordGauge(e,t,r,l,a=!1){let i=this.buildAttributes(r);for(let s of this.adapters)s.recordGauge(e,t,i,l,a)}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 T{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 c{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=R({[de]:e.serviceName??"cline",...e.serviceVersion?{[ne]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)L.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)C.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return M.getTracer(e,t??this.options.serviceVersion)}createAdapter(e){return new u({...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 b({...e,adapters:[t],distinctId:P(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 r=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),l=Math.min(30000,Math.floor(r*0.8)),a=t.map((i)=>ue(i,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:r,timeout:l})).filter((i)=>i!==null);if(a.length===0)return null;return new te({resource:e,readers:a})}createTracerProvider(e){let t=y(this.options.tracesExporter);if(t.length===0)return null;let r=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,l=this.options.otlpTracesHeaders??this.options.otlpHeaders,a=[];for(let i of t){let s=fe(i,{endpoint:r,headers:l,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(s)a.push(s)}if(a.length===0)return null;return new ie({resource:e,spanProcessors:a})}createLoggerProvider(e){let t=y(this.options.logsExporter);if(t.length===0)return null;let r=t.map((l)=>{let a=ge(l,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!a)return null;return new _(a,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((l)=>l!==null);if(r.length===0)return null;return new E({resource:e,processors:r})}}function j(e){let t=new c(e),r=t.createTelemetryService(e);return r.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:r}}function z(e){if(S())return{telemetry:new T(e)};if(e.enabled!==!0)return{telemetry:new b({...e,distinctId:P(e.distinctId)})};return j(e)}function se(e){let{telemetry:t,provider:r}=z(e);return{telemetry:t,provider:r,flush:async()=>{let i=r;if(i&&typeof i.forceFlush==="function")try{await i.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([t.dispose(),r?.dispose()])}}}function y(e){if(!e)return[];return(Array.isArray(e)?e:e.split(",")).map((r)=>r.trim()).filter((r)=>r==="console"||r==="otlp")}function ge(e,t){if(e==="console")return new p;if(!t.endpoint)return null;let r=A(t.endpoint,"/v1/logs");return new V({url:r,headers:t.headers})}function fe(e,t){if(e==="console")return new le(new ae);if(!t.endpoint)return null;let r=A(t.endpoint,"/v1/traces");return new re(new Y({url:r,headers:t.headers}))}function ue(e,t){if(e==="console")return new w({exporter:new ee,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let r=A(t.endpoint,"/v1/metrics");return new w({exporter:new N({url:r,headers:t.headers}),exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout})}function A(e,t){let r=new URL(e),l=r.pathname.endsWith("/")?r.pathname.slice(0,-1):r.pathname;return r.pathname=l.endsWith(t)?l:`${l}${t}`,r.toString()}export{j as createOpenTelemetryTelemetryService,z as createConfiguredTelemetryService,se as createConfiguredTelemetryHandle,c as OpenTelemetryProvider,u as OpenTelemetryAdapter};
1
+ class u{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,l,i=!1){if(!this.meter||!i&&!this.isEnabled())return;let r=this.counters.get(e);if(!r)r=this.meter.createCounter(e,l?{description:l}:void 0),this.counters.set(e,r);r.add(t,this.flattenProperties(this.buildAttributes(a)))}recordHistogram(e,t,a,l,i=!1){if(!this.meter||!i&&!this.isEnabled())return;let r=this.histograms.get(e);if(!r)r=this.meter.createHistogram(e,l?{description:l}:void 0),this.histograms.set(e,r);r.record(t,this.flattenProperties(this.buildAttributes(a)))}recordGauge(e,t,a,l,i=!1){if(!this.meter||!i&&!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,l?{description:l}:void 0);s.addCallback((h)=>{for(let G of this.snapshotGaugeSeries(e))h.observe(G.value,this.flattenProperties(G.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 l=this.flattenProperties(this.buildAttributes(t,a));this.logger.emit({severityText:"INFO",body:e,attributes:l})}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,l=0){if(!e)return{};let i={},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){i[s]=String(n);continue}if(Array.isArray(n)){let h=n.length>r?n.slice(0,r):n;try{i[s]=JSON.stringify(h)}catch{i[s]="[UnserializableArray]"}if(n.length>r)i[`${s}_truncated`]=!0,i[`${s}_original_length`]=n.length;continue}if(typeof n==="object"){if(n instanceof Date){i[s]=n.toISOString();continue}if(n instanceof Error){i[s]=n.message;continue}if(a.has(n)){i[s]="[Circular]";continue}if(l>=d){i[s]="[MaxDepthExceeded]";continue}a.add(n),Object.assign(i,this.flattenProperties(n,s,a,l+1));continue}if(J(n)){i[s]=n;continue}try{i[s]=JSON.stringify(n)}catch{i[s]=String(n)}}return i}}function J(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}import{metrics as Y,trace as R}from"@opentelemetry/api";import{logs as _}from"@opentelemetry/api-logs";import{OTLPLogExporter as p}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as E}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as ee}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as te}from"@opentelemetry/resources";import{BatchLogRecordProcessor as ae,ConsoleLogRecordExporter as ie,LoggerProvider as le}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as re,MeterProvider as ne,PeriodicExportingMetricReader as z}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as se,ConsoleSpanExporter as de,SimpleSpanProcessor as ge}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as fe}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as ue,ATTR_SERVICE_VERSION as be}from"@opentelemetry/semantic-conventions";import{mkdirSync as Se,readFileSync as $,statSync as I,writeFileSync as we}from"node:fs";import{resolveGlobalSettingsPath as W}from"@cline/shared/storage";import{z as f}from"zod";import{SDK_ERROR_TELEMETRY_EVENT as Ae}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,l)=>a.localeCompare(l));return t.length>0?t:void 0}),S=f.object({telemetryOptOut:f.boolean().default(!1).catch(!1),disabledTools:O.optional(),disabledPlugins:O.optional()}).strip().transform((e)=>{let t={telemetryOptOut:e.telemetryOptOut};if(e.disabledTools?.length)t.disabledTools=e.disabledTools;if(e.disabledPlugins?.length)t.disabledPlugins=e.disabledPlugins;return t});function b(){return S.parse({})}var P;function B(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=$(e,"utf8")}catch{return b()}try{let a=S.safeParse(JSON.parse(t));return a.success?a.data:b()}catch{return b()}}function U(){let e=W(),t=I(e,{throwIfNoEntry:!1}),a=t?.mtimeMs??0,l=t?.size??0,i=P;if(i&&i.path===e&&i.mtimeMs===a&&i.size===l)return i;let r=B(t?K(e):b());return P={path:e,mtimeMs:a,size:l,value:r},P}function k(){return U().value}function w(){return k().telemetryOptOut}import{existsSync as Q,mkdirSync as Z,readFileSync as X,writeFileSync as x}from"node:fs";import{resolve as T}from"node:path";import{resolveSessionDataDir as D}from"@cline/shared/storage";import{nanoid as q}from"nanoid";import*as C from"node-machine-id";var M="machine-id";function c(e){let t=e?.trim();if(t)return t;let a=N();if(a)return a;return V()}function L(){let e=C;return e.machineIdSync??e.default?.machineIdSync}function N(){try{let e=L();if(!e)return;return e().trim()||void 0}catch{return}}function V(){let e=D(),t=T(e,M);try{if(Q(t)){let l=X(t,"utf8").trim();if(l.length>0)return l}}catch{}let a=`cl-${q()}`;try{Z(e,{recursive:!0}),x(t,a,"utf8")}catch{}return a}class y{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,l,i){if(!i&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:e,value:t,attributes:a,description:l,required:i===!0})}recordHistogram(e,t,a,l,i){if(!i&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:e,value:t,attributes:a,description:l,required:i===!0})}recordGauge(e,t,a,l,i){if(!i&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:e,value:t,attributes:a,description:l,required:i===!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 y({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 l of this.adapters)l.emitRequired(e,a)}recordCounter(e,t,a,l,i=!1){let r=this.buildAttributes(a);for(let d of this.adapters)d.recordCounter(e,t,r,l,i)}recordHistogram(e,t,a,l,i=!1){let r=this.buildAttributes(a);for(let d of this.adapters)d.recordHistogram(e,t,r,l,i)}recordGauge(e,t,a,l,i=!1){let r=this.buildAttributes(a);for(let d of this.adapters)d.recordGauge(e,t,r,l,i)}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 j{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 A{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=te({[ue]:e.serviceName??"cline",...e.serviceVersion?{[be]: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)_.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return R.getTracer(e,t??this.options.serviceVersion)}createAdapter(e){return new u({...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:c(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=o(this.options.metricsExporter);if(t.length===0)return null;let a=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),l=Math.min(30000,Math.floor(a*0.8)),i=t.map((r)=>ce(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:a,timeout:l})).filter((r)=>r!==null);if(i.length===0)return null;return new ne({resource:e,readers:i})}createTracerProvider(e){let t=o(this.options.tracesExporter);if(t.length===0)return null;let a=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,l=this.options.otlpTracesHeaders??this.options.otlpHeaders,i=[];for(let r of t){let d=Pe(r,{endpoint:a,headers:l,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(d)i.push(d)}if(i.length===0)return null;return new fe({resource:e,spanProcessors:i})}createLoggerProvider(e){let t=o(this.options.logsExporter);if(t.length===0)return null;let a=t.map((l)=>{let i=he(l,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!i)return null;return new ae(i,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((l)=>l!==null);if(a.length===0)return null;return new le({resource:e,processors:a})}}function F(e){let t=new A(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 H(e){if(w())return{telemetry:new j(e)};if(e.enabled!==!0)return{telemetry:new m({...e,distinctId:c(e.distinctId)})};return F(e)}function me(e){let{telemetry:t,provider:a}=H(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 o(e){if(!e)return[];return(Array.isArray(e)?e:e.split(",")).map((a)=>a.trim()).filter((a)=>a==="console"||a==="otlp")}function he(e,t){if(e==="console")return new ie;if(!t.endpoint)return null;let a=v(t.endpoint,"/v1/logs");return new p({url:a,headers:t.headers})}function Pe(e,t){if(e==="console")return new ge(new de);if(!t.endpoint)return null;let a=v(t.endpoint,"/v1/traces");return new se(new ee({url:a,headers:t.headers}))}function ce(e,t){if(e==="console")return new z({exporter:new re,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let a=v(t.endpoint,"/v1/metrics");return new z({exporter:new E({url:a,headers:t.headers}),exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout})}function v(e,t){let a=new URL(e),l=a.pathname.endsWith("/")?a.pathname.slice(0,-1):a.pathname;return a.pathname=l.endsWith(t)?l:`${l}${t}`,a.toString()}export{F as createOpenTelemetryTelemetryService,H as createConfiguredTelemetryService,me as createConfiguredTelemetryHandle,A as OpenTelemetryProvider,u as OpenTelemetryAdapter};
@@ -11,7 +11,9 @@ export declare const SessionManifestSchema: z.ZodObject<{
11
11
  failed: "failed";
12
12
  running: "running";
13
13
  cancelled: "cancelled";
14
+ pending: "pending";
14
15
  completed: "completed";
16
+ idle: "idle";
15
17
  }>;
16
18
  interactive: z.ZodBoolean;
17
19
  provider: z.ZodString;
@@ -2,7 +2,7 @@ import type * as LlmsProviders from "@cline/llms";
2
2
  import type { AgentResult, BasicLogger } from "@cline/shared";
3
3
  import type { SubAgentEndContext, SubAgentStartContext } from "../../extensions/tools/team";
4
4
  import type { HookEventPayload } from "../../hooks";
5
- import type { SessionStatus } from "../../types/common";
5
+ import { type SessionStatus, type TerminalSessionStatus } from "../../types/common";
6
6
  import type { PersistedSessionUpdateInput, SessionMessagesArtifactUploader, SessionPersistenceAdapter } from "../../types/session";
7
7
  import type { SessionRow } from "../models/session-row";
8
8
  export type { PersistedSessionUpdateInput, SessionPersistenceAdapter };
@@ -41,7 +41,7 @@ export declare class UnifiedSessionPersistenceService {
41
41
  persistSessionMessages(sessionId: string, messages: LlmsProviders.Message[], systemPrompt?: string): Promise<void>;
42
42
  applySubagentStatus(subSessionId: string, event: HookEventPayload): Promise<void>;
43
43
  applySubagentStatusBySessionId(subSessionId: string, status: SessionStatus): Promise<void>;
44
- applyStatusToRunningChildSessions(parentSessionId: string, status: Exclude<SessionStatus, "running">): Promise<void>;
44
+ applyStatusToRunningChildSessions(parentSessionId: string, status: TerminalSessionStatus): Promise<void>;
45
45
  onTeamTaskStart(rootSessionId: string, agentId: string, message: string): Promise<void>;
46
46
  onTeamTaskEnd(rootSessionId: string, agentId: string, status: SessionStatus, summary?: string, result?: AgentResult, messages?: LlmsProviders.Message[]): Promise<void>;
47
47
  onTeamTaskProgress(rootSessionId: string, agentId: string, progress: string, options?: {
@@ -2,7 +2,7 @@ import type * as LlmsProviders from "@cline/llms";
2
2
  import type { AgentResult } from "@cline/shared";
3
3
  import type { SubAgentEndContext, SubAgentStartContext } from "../../extensions/tools/team";
4
4
  import type { HookEventPayload } from "../../hooks";
5
- import type { SessionStatus } from "../../types/common";
5
+ import { type SessionStatus, type TerminalSessionStatus } from "../../types/common";
6
6
  import type { SessionPersistenceAdapter, StoredMessageWithMetadata } from "../../types/session";
7
7
  import type { UpsertSubagentInput } from "../models/session-row";
8
8
  import type { SessionManifestStore } from "../stores/session-manifest-store";
@@ -23,7 +23,7 @@ export declare class TeamChildSessionManager {
23
23
  upsertSubagentSessionFromHook(event: HookEventPayload): Promise<string | undefined>;
24
24
  applySubagentStatus(subSessionId: string, event: HookEventPayload): Promise<void>;
25
25
  applySubagentStatusBySessionId(subSessionId: string, status: SessionStatus): Promise<void>;
26
- applyStatusToRunningChildSessions(parentSessionId: string, status: Exclude<SessionStatus, "running">): Promise<void>;
26
+ applyStatusToRunningChildSessions(parentSessionId: string, status: TerminalSessionStatus): Promise<void>;
27
27
  onTeamTaskStart(rootSessionId: string, agentId: string, message: string): Promise<void>;
28
28
  onTeamTaskEnd(rootSessionId: string, agentId: string, status: SessionStatus, _summary?: string, result?: AgentResult, messages?: LlmsProviders.Message[]): Promise<void>;
29
29
  onTeamTaskProgress(rootSessionId: string, agentId: string, progress: string, options?: {
@@ -24,6 +24,7 @@ export declare const ChatSessionStatusSchema: z.ZodEnum<{
24
24
  failed: "failed";
25
25
  running: "running";
26
26
  cancelled: "cancelled";
27
+ pending: "pending";
27
28
  completed: "completed";
28
29
  idle: "idle";
29
30
  starting: "starting";
@@ -85,6 +86,7 @@ export declare const ChatViewStateSchema: z.ZodObject<{
85
86
  failed: "failed";
86
87
  running: "running";
87
88
  cancelled: "cancelled";
89
+ pending: "pending";
88
90
  completed: "completed";
89
91
  idle: "idle";
90
92
  starting: "starting";
@@ -1,5 +1,10 @@
1
- export declare const SESSION_STATUSES: readonly ["running", "completed", "failed", "cancelled"];
1
+ export declare const SESSION_STATUSES: readonly ["idle", "running", "pending", "completed", "failed", "cancelled"];
2
2
  export type SessionStatus = (typeof SESSION_STATUSES)[number];
3
+ export declare const NON_TERMINAL_SESSION_STATUSES: readonly ["idle", "running", "pending"];
4
+ export type NonTerminalSessionStatus = (typeof NON_TERMINAL_SESSION_STATUSES)[number];
5
+ export type TerminalSessionStatus = Exclude<SessionStatus, NonTerminalSessionStatus>;
6
+ export declare function isTerminalSessionStatus(status: SessionStatus): status is TerminalSessionStatus;
7
+ export declare function isNonTerminalSessionStatus(status: SessionStatus): status is NonTerminalSessionStatus;
3
8
  export declare const SessionSource: {
4
9
  readonly CORE: "core";
5
10
  readonly CLI: "cli";
@@ -1,4 +1,5 @@
1
1
  import type * as LlmsProviders from "@cline/llms";
2
+ import type { AgentFinishReason } from "@cline/shared";
2
3
  import type { SessionAccumulatedUsage } from "../runtime/host/runtime-host";
3
4
  import type { BuiltRuntime } from "../runtime/orchestration/session-runtime";
4
5
  import type { SessionRuntime } from "../runtime/orchestration/session-runtime-orchestrator";
@@ -34,6 +35,7 @@ export type ActiveSession = {
34
35
  turnAggregateUsageBaseline?: SessionAccumulatedUsage;
35
36
  turnPrimaryUsage?: SessionAccumulatedUsage;
36
37
  turnUsageByAgent?: Map<string, SessionAccumulatedUsage>;
38
+ lastInteractiveTurnFinishReason?: AgentFinishReason;
37
39
  /**
38
40
  * Set to `true` once the assistant successfully invoked the canonical
39
41
  * completion tool (`submit_and_exit`) for this session. Used to:
package/dist/types.d.ts CHANGED
@@ -15,8 +15,8 @@ export type { SandboxCallOptions, SubprocessSandboxOptions, } from "./runtime/to
15
15
  export { SubprocessSandbox } from "./runtime/tools/subprocess-sandbox";
16
16
  export type { GlobalSettings } from "./services/global-settings";
17
17
  export { filterDisabledPluginPaths, filterDisabledTools, filterExtensionToolRegistrations, GlobalSettingsSchema, isPluginDisabledGlobally, isTelemetryOptedOutGlobally, isToolDisabledGlobally, readGlobalSettings, resolveDisabledPluginPaths, resolveDisabledToolNames, setDisabledPlugin, setDisabledTools, setTelemetryOptOutGlobally, toggleDisabledTool, writeGlobalSettings, } from "./services/global-settings";
18
- export type { PluginToolSummary } from "./services/plugin-tools";
19
- export { listPluginTools } from "./services/plugin-tools";
18
+ export type { ListPluginToolsResult, PluginToolSummary, } from "./services/plugin-tools";
19
+ export { listPluginTools, listPluginToolsWithDiagnostics, } from "./services/plugin-tools";
20
20
  export type { WorkspaceManager, WorkspaceManagerEvent, } from "./services/workspace/workspace-manager";
21
21
  export type { SessionManifest } from "./session/models/session-manifest";
22
22
  export type { SessionRow } from "./session/models/session-row";
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.41",
4
+ "version": "0.0.42",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/cline/cline",
@@ -44,9 +44,9 @@
44
44
  "test:watch": "vitest --config vitest.config.ts"
45
45
  },
46
46
  "dependencies": {
47
- "@cline/agents": "0.0.41",
48
- "@cline/shared": "0.0.41",
49
- "@cline/llms": "0.0.41",
47
+ "@cline/agents": "0.0.42",
48
+ "@cline/shared": "0.0.42",
49
+ "@cline/llms": "0.0.42",
50
50
  "@modelcontextprotocol/sdk": "^1.29.0",
51
51
  "@opentelemetry/api": "^1.9.0",
52
52
  "@opentelemetry/api-logs": "^0.214.0",
@@ -59,10 +59,10 @@
59
59
  "@opentelemetry/sdk-trace-base": "^2.6.1",
60
60
  "@opentelemetry/sdk-trace-node": "^2.6.1",
61
61
  "@opentelemetry/semantic-conventions": "^1.40.0",
62
- "jiti": "^1.21.7",
62
+ "jiti": "^2.7.0",
63
63
  "node-machine-id": "^1.1.12",
64
64
  "nanoid": "^5.1.7",
65
- "simple-git": "^3.32.3",
65
+ "simple-git": "3.36.0",
66
66
  "ws": "^8.20.0",
67
67
  "yaml": "^2.8.2",
68
68
  "zod": "^4.3.6"