@cline/core 0.0.39 → 0.0.40

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +2 -0
  2. package/dist/extensions/context/compaction-shared.d.ts +6 -5
  3. package/dist/extensions/mcp/client.d.ts +8 -1
  4. package/dist/extensions/mcp/config-loader.d.ts +11 -1
  5. package/dist/extensions/mcp/index.d.ts +6 -3
  6. package/dist/extensions/mcp/oauth.d.ts +48 -0
  7. package/dist/extensions/mcp/types.d.ts +17 -0
  8. package/dist/extensions/plugin-sandbox-bootstrap.js +1 -1
  9. package/dist/hub/daemon/entry.js +201 -199
  10. package/dist/hub/index.js +200 -198
  11. package/dist/hub/runtime-host/hub-runtime-host.d.ts +3 -1
  12. package/dist/hub/server/browser-websocket.d.ts +3 -1
  13. package/dist/hub/server/handlers/context.d.ts +2 -1
  14. package/dist/hub/server/hub-server-transport.d.ts +3 -0
  15. package/dist/index.d.ts +3 -3
  16. package/dist/index.js +201 -199
  17. package/dist/runtime/config/agent-runtime-config-builder.d.ts +2 -9
  18. package/dist/runtime/host/history.d.ts +1 -0
  19. package/dist/runtime/host/runtime-host.d.ts +3 -1
  20. package/dist/runtime/turn-queue/pending-prompt-service.d.ts +6 -1
  21. package/dist/services/llms/handler-factory.d.ts +2 -2
  22. package/dist/services/llms/provider-settings.d.ts +1 -0
  23. package/dist/services/providers/local-provider-registry.d.ts +3 -0
  24. package/dist/services/providers/local-provider-service.d.ts +4 -2
  25. package/dist/services/telemetry/core-events.d.ts +4 -1
  26. package/dist/services/telemetry/index.js +1 -1
  27. package/dist/session/services/file-session-service.d.ts +2 -0
  28. package/dist/session/services/persistence-service.d.ts +2 -1
  29. package/dist/session/services/session-service.d.ts +2 -0
  30. package/dist/session/stores/session-manifest-store.d.ts +3 -1
  31. package/dist/settings/types.d.ts +3 -2
  32. package/dist/types/config.d.ts +2 -2
  33. package/dist/types/session.d.ts +2 -1
  34. package/package.json +9 -8
@@ -11,7 +11,7 @@
11
11
  * consumed by `SessionRuntime` / `MistakeTracker` /
12
12
  * `LoopDetectionTracker` — not passed through here.
13
13
  */
14
- import type { AgentConfig, AgentMessage, AgentModel, AgentRuntimeConfig, AgentRuntimeHooks, AgentRuntimePlugin, AgentRuntimePrepareTurnContext, AgentRuntimePrepareTurnResult, AgentTelemetry, AgentTool, BasicLogger } from "@cline/shared";
14
+ import type { AgentConfig, AgentMessage, AgentModel, AgentRuntimeConfig, AgentRuntimeHooks, AgentRuntimePlugin, AgentRuntimePrepareTurnContext, AgentRuntimePrepareTurnResult, AgentTool, BasicLogger, ITelemetryService } from "@cline/shared";
15
15
  /**
16
16
  * Inputs required to assemble an `AgentRuntimeConfig`. Distinct from
17
17
  * `AgentConfig` because some of these (the model adapter, the hook
@@ -37,7 +37,7 @@ export interface CreateAgentRuntimeConfigInput {
37
37
  /** Pre-built model adapter (produced by `apiHandlerToAgentModel`). */
38
38
  readonly model: AgentModel;
39
39
  readonly logger?: BasicLogger;
40
- readonly telemetry?: AgentTelemetry;
40
+ readonly telemetry?: ITelemetryService;
41
41
  /** Pre-built tool array (builtins + plugin-contributed + session extras). */
42
42
  readonly tools?: readonly AgentTool<unknown, unknown>[];
43
43
  readonly toolContextMetadata?: Record<string, unknown>;
@@ -78,10 +78,3 @@ export declare function buildMessageModelInfo(config: AgentConfig): AgentMessage
78
78
  * `1`, `undefined` when the caller did not specify.
79
79
  */
80
80
  export declare function resolveToolExecution(maxParallelToolCalls: number | undefined): "sequential" | "parallel" | undefined;
81
- /**
82
- * Adapt the full `ITelemetryService` to the minimal `AgentTelemetry`
83
- * shape. The runtime only calls `capture(event, properties)`; the
84
- * remaining methods are host concerns and stay on the
85
- * `ITelemetryService` instance owned by `SessionRuntime`.
86
- */
87
- export declare function mapTelemetry(telemetry: AgentConfig["telemetry"]): AgentTelemetry | undefined;
@@ -6,6 +6,7 @@ export interface SessionHistoryListOptions {
6
6
  limit?: number;
7
7
  includeManifestFallback?: boolean;
8
8
  hydrate?: boolean;
9
+ includeSubagents?: boolean;
9
10
  }
10
11
  export declare function manifestToSessionRecord(manifest: SessionManifest): SessionRecord;
11
12
  export declare function hydrateSessionHistory(host: Pick<RuntimeHost, "readSessionMessages">, rows: SessionRecord[]): Promise<SessionHistoryRecord[]>;
@@ -1,5 +1,5 @@
1
1
  import type * as LlmsProviders from "@cline/llms";
2
- import type { AgentResult, RuntimeConfigExtensionKind } from "@cline/shared";
2
+ import type { AgentMode, AgentResult, RuntimeConfigExtensionKind } from "@cline/shared";
3
3
  import type { HookEventPayload } from "../../hooks";
4
4
  import type { CheckpointEntry } from "../../hooks/checkpoint-hooks";
5
5
  import type { ProviderSettings } from "../../services/llms/provider-settings";
@@ -66,6 +66,7 @@ export interface StartSessionResult {
66
66
  export interface SendSessionInput {
67
67
  sessionId: string;
68
68
  prompt: string;
69
+ mode?: AgentMode;
69
70
  userImages?: string[];
70
71
  userFiles?: string[];
71
72
  delivery?: "queue" | "steer";
@@ -96,6 +97,7 @@ export interface PendingPromptsUpdateInput {
96
97
  sessionId: string;
97
98
  promptId: string;
98
99
  prompt?: string;
100
+ mode?: AgentMode;
99
101
  delivery?: "queue" | "steer";
100
102
  }
101
103
  export interface PendingPromptsDeleteInput {
@@ -1,3 +1,4 @@
1
+ import { type AgentMode } from "@cline/shared";
1
2
  import type { CoreSessionEvent, SessionPendingPrompt } from "../../types/events";
2
3
  import type { ActiveSession } from "../../types/session";
3
4
  import type { PendingPromptMutationResult, PendingPromptsDeleteInput, PendingPromptsUpdateInput } from "../host/runtime-host";
@@ -5,6 +6,7 @@ export type PendingPromptDelivery = "queue" | "steer";
5
6
  export interface PendingPromptEntry {
6
7
  id: string;
7
8
  prompt: string;
9
+ mode?: AgentMode;
8
10
  delivery: PendingPromptDelivery;
9
11
  userImages?: string[];
10
12
  userFiles?: string[];
@@ -18,12 +20,14 @@ export interface PendingPromptsControllerDeps {
18
20
  send(input: {
19
21
  sessionId: string;
20
22
  prompt: string;
23
+ mode?: AgentMode;
21
24
  userImages?: string[];
22
25
  userFiles?: string[];
23
26
  }): Promise<unknown>;
24
27
  }
25
28
  export interface PendingPromptEnqueueInput {
26
29
  prompt: string;
30
+ mode?: AgentMode;
27
31
  delivery: PendingPromptDelivery;
28
32
  userImages?: string[];
29
33
  userFiles?: string[];
@@ -51,11 +55,12 @@ export declare class PendingPromptsController {
51
55
  delete(input: PendingPromptsDeleteInput): PendingPromptMutationResult;
52
56
  enqueue(sessionId: string, entry: {
53
57
  prompt: string;
58
+ mode?: AgentMode;
54
59
  delivery: "queue" | "steer";
55
60
  userImages?: string[];
56
61
  userFiles?: string[];
57
62
  }): void;
58
- consumeSteer(sessionId: string): string | undefined;
63
+ consumeSteer(sessionId: string): PendingPromptEntry | undefined;
59
64
  clearAborted(session: ActiveSession): void;
60
65
  emitPrompts(session: ActiveSession): void;
61
66
  scheduleDrain(sessionId: string, session: ActiveSession): void;
@@ -1,3 +1,3 @@
1
- import type { AgentConfig, AgentModel, BasicLogger, ModelInfo } from "@cline/shared";
1
+ import type { AgentConfig, AgentModel, BasicLogger, ITelemetryService, ModelInfo } from "@cline/shared";
2
2
  export declare function resolveKnownModelsFromConfig(config: AgentConfig): Record<string, ModelInfo> | undefined;
3
- export declare function createAgentModelFromConfig(config: AgentConfig, logger: BasicLogger | undefined): AgentModel;
3
+ export declare function createAgentModelFromConfig(config: AgentConfig, logger: BasicLogger | undefined, telemetry?: ITelemetryService): AgentModel;
@@ -221,6 +221,7 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
221
221
  "computer-use": "computer-use";
222
222
  oauth: "oauth";
223
223
  vision: "vision";
224
+ popular: "popular";
224
225
  }>>>;
225
226
  modelCatalog: z.ZodOptional<z.ZodObject<{
226
227
  loadLatestOnInit: z.ZodOptional<z.ZodBoolean>;
@@ -60,6 +60,7 @@ export declare const StoredProviderMetadataSchema: z.ZodObject<{
60
60
  oauth: "oauth";
61
61
  vision: "vision";
62
62
  "local-auth": "local-auth";
63
+ popular: "popular";
63
64
  }>>>;
64
65
  modelsSourceUrl: z.ZodOptional<z.ZodString>;
65
66
  }, z.core.$loose>;
@@ -101,6 +102,7 @@ export declare const StoredProviderEntrySchema: z.ZodObject<{
101
102
  oauth: "oauth";
102
103
  vision: "vision";
103
104
  "local-auth": "local-auth";
105
+ popular: "popular";
104
106
  }>>>;
105
107
  modelsSourceUrl: z.ZodOptional<z.ZodString>;
106
108
  }, z.core.$loose>>;
@@ -166,6 +168,7 @@ export declare const StoredModelsFileSchema: z.ZodObject<{
166
168
  oauth: "oauth";
167
169
  vision: "vision";
168
170
  "local-auth": "local-auth";
171
+ popular: "popular";
169
172
  }>>>;
170
173
  modelsSourceUrl: z.ZodOptional<z.ZodString>;
171
174
  }, z.core.$loose>>;
@@ -74,13 +74,13 @@ export interface ProviderConfigFieldRequirement {
74
74
  }
75
75
  export interface ProviderConfigFields {
76
76
  providerId: string;
77
- authMethod: "api-key" | "oauth";
77
+ authMethod: "api-key" | "oauth" | "local";
78
78
  fields: Partial<Record<ProviderConfigFieldKey, ProviderConfigFieldRequirement>>;
79
79
  }
80
80
  /**
81
81
  * Project a provider into the inputs a configure-dialog should render.
82
82
  *
83
- * No fields are marked "required" `llms` no longer pre-flights credentials,
83
+ * No fields are marked "required". `llms` no longer pre-flights credentials,
84
84
  * so a missing API key surfaces as the provider's own auth error rather than
85
85
  * a synthetic SDK failure. UIs may still require fields client-side if they
86
86
  * want, but the runtime does not.
@@ -88,6 +88,8 @@ export interface ProviderConfigFields {
88
88
  * - OAuth providers (`cline`, `oca`, `openai-codex`) return `authMethod:
89
89
  * "oauth"` with no fields; the configure UI should route to the OAuth
90
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.
91
93
  * - All other providers return `apiKey`. Built-in local/proxy-style providers
92
94
  * with user-supplied endpoints, plus user-added providers with saved
93
95
  * endpoints, also return a pre-filled `baseUrl` field.
@@ -1,4 +1,4 @@
1
- import type { ITelemetryService, TelemetryProperties } from "@cline/shared";
1
+ import { type ITelemetryService, type TelemetryProperties } from "@cline/shared";
2
2
  export type TelemetryAgentKind = "root" | "subagent" | "team_lead" | "team_teammate";
3
3
  export interface TelemetryAgentIdentityProperties {
4
4
  agentId: string;
@@ -54,6 +54,9 @@ export declare const CORE_TELEMETRY_EVENTS: {
54
54
  readonly INIT_ERROR: "workspace.init_error";
55
55
  readonly PATH_RESOLVED: "workspace.path_resolved";
56
56
  };
57
+ readonly SDK: {
58
+ readonly ERROR: "sdk.error";
59
+ };
57
60
  };
58
61
  export interface WorkspaceInitializedProperties {
59
62
  root_count: number;
@@ -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(z(d)){a[n]=d;continue}try{a[n]=JSON.stringify(d)}catch{a[n]=String(d)}}return a}}function z(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}import{metrics as M,trace as L}from"@opentelemetry/api";import{logs as C}from"@opentelemetry/api-logs";import{OTLPLogExporter as N}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as V}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 ye,readFileSync as J,writeFileSync as ce}from"node:fs";import{resolveGlobalSettingsPath as W}from"@cline/shared/storage";import{z as f}from"zod";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 X}from"nanoid";import*as Z from"node-machine-id";var k="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=Z;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,k);try{if(F(t)){let l=I(t,"utf8").trim();if(l.length>0)return l}}catch{}let r=`cl-${X()}`;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)M.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)C.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return L.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 H(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 j(e){if(S())return{telemetry:new T(e)};if(e.enabled!==!0)return{telemetry:new b({...e,distinctId:P(e.distinctId)})};return H(e)}function se(e){let{telemetry:t,provider:r}=j(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 N({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 V({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{H as createOpenTelemetryTelemetryService,j 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,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,8 +1,10 @@
1
+ import type { BasicLogger } from "@cline/shared";
1
2
  import type { SessionMessagesArtifactUploader } from "../../types/session";
2
3
  import { UnifiedSessionPersistenceService } from "./persistence-service";
3
4
  export declare class FileSessionService extends UnifiedSessionPersistenceService {
4
5
  constructor(sessionsDir?: string, options?: {
5
6
  messagesArtifactUploader?: SessionMessagesArtifactUploader;
7
+ logger?: BasicLogger;
6
8
  });
7
9
  ensureSessionsDir(): string;
8
10
  }
@@ -1,5 +1,5 @@
1
1
  import type * as LlmsProviders from "@cline/llms";
2
- import type { AgentResult } from "@cline/shared";
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
5
  import type { SessionStatus } from "../../types/common";
@@ -15,6 +15,7 @@ export declare class UnifiedSessionPersistenceService {
15
15
  private static readonly TEAM_HEARTBEAT_LOG_INTERVAL_MS;
16
16
  constructor(adapter: SessionPersistenceAdapter, options?: {
17
17
  messagesArtifactUploader?: SessionMessagesArtifactUploader;
18
+ logger?: BasicLogger;
18
19
  });
19
20
  private toPersistedMessages;
20
21
  ensureSessionsDir(): string;
@@ -1,3 +1,4 @@
1
+ import type { BasicLogger } from "@cline/shared";
1
2
  import type { SqliteSessionStore } from "../../services/storage/sqlite-session-store";
2
3
  import type { SessionMessagesArtifactUploader } from "../../types/session";
3
4
  import { type CreateRootSessionInput } from "../models/session-row";
@@ -7,6 +8,7 @@ export declare class CoreSessionService extends UnifiedSessionPersistenceService
7
8
  constructor(store: SqliteSessionStore, options?: {
8
9
  sessionArtifactsDir?: string;
9
10
  messagesArtifactUploader?: SessionMessagesArtifactUploader;
11
+ logger?: BasicLogger;
10
12
  });
11
13
  createRootSession(input: CreateRootSessionInput): void;
12
14
  }
@@ -1,12 +1,14 @@
1
1
  import type * as LlmsProviders from "@cline/llms";
2
+ import type { BasicLogger } from "@cline/shared";
2
3
  import { SessionArtifacts } from "../../services/session-artifacts";
3
4
  import type { SessionMessagesArtifactUploader, SessionPersistenceAdapter } from "../../types/session";
4
5
  import { type SessionManifest } from "../models/session-manifest";
5
6
  export declare class SessionManifestStore {
6
7
  private readonly adapter;
7
8
  private readonly messagesArtifactUploader?;
9
+ private readonly logger?;
8
10
  readonly artifacts: SessionArtifacts;
9
- constructor(adapter: SessionPersistenceAdapter, messagesArtifactUploader?: SessionMessagesArtifactUploader | undefined);
11
+ constructor(adapter: SessionPersistenceAdapter, messagesArtifactUploader?: SessionMessagesArtifactUploader | undefined, logger?: BasicLogger | undefined);
10
12
  ensureSessionsDir(): string;
11
13
  initializeMessagesFile(sessionId: string, path: string, startedAt: string): void;
12
14
  writeSessionManifest(manifestPath: string, manifest: SessionManifest): void;
@@ -1,7 +1,7 @@
1
1
  import type { UserInstructionConfigService } from "../extensions/config";
2
2
  import type { BuiltinToolAvailabilityContext } from "../extensions/tools";
3
- export type CoreSettingsType = "skills" | "workflows" | "rules" | "tools";
4
- export type CoreSettingsItemKind = "skill" | "workflow" | "rule" | "tool";
3
+ export type CoreSettingsType = "skills" | "workflows" | "rules" | "tools" | "mcp";
4
+ export type CoreSettingsItemKind = "skill" | "workflow" | "rule" | "tool" | "mcp";
5
5
  export type CoreSettingsItemSource = "global" | "workspace" | "builtin" | "global-plugin" | "workspace-plugin";
6
6
  export interface CoreSettingsItem {
7
7
  id: string;
@@ -18,6 +18,7 @@ export interface CoreSettingsSnapshot {
18
18
  rules: CoreSettingsItem[];
19
19
  skills: CoreSettingsItem[];
20
20
  tools: CoreSettingsItem[];
21
+ mcp: CoreSettingsItem[];
21
22
  }
22
23
  export interface CoreSettingsListInput {
23
24
  cwd?: string;
@@ -39,7 +39,7 @@ export interface CoreCompactionContext {
39
39
  provider: string;
40
40
  info?: ModelInfo;
41
41
  };
42
- contextWindowTokens: number;
42
+ maxInputTokens: number;
43
43
  triggerTokens: number;
44
44
  thresholdRatio: number;
45
45
  utilizationRatio: number;
@@ -64,7 +64,7 @@ export interface CoreCompactionConfig {
64
64
  thresholdRatio?: number;
65
65
  reserveTokens?: number;
66
66
  preserveRecentTokens?: number;
67
- contextWindowTokens?: number;
67
+ maxInputTokens?: number;
68
68
  summarizer?: CoreCompactionSummarizerConfig;
69
69
  compact?: (context: CoreCompactionContext) => Promise<CoreCompactionResult | undefined> | CoreCompactionResult | undefined;
70
70
  }
@@ -5,7 +5,7 @@ import type { SessionRuntime } from "../runtime/orchestration/session-runtime-or
5
5
  import type { SessionRow } from "../session/models/session-row";
6
6
  import type { RootSessionArtifacts } from "../session/services/session-service";
7
7
  import type { SessionSource, SessionStatus } from "./common";
8
- import type { CoreSessionConfig } from "./config";
8
+ import type { CoreAgentMode, CoreSessionConfig } from "./config";
9
9
  export type ActiveSession = {
10
10
  sessionId: string;
11
11
  config: CoreSessionConfig;
@@ -54,6 +54,7 @@ export type ActiveSession = {
54
54
  export type PendingPrompt = {
55
55
  id: string;
56
56
  prompt: string;
57
+ mode?: CoreAgentMode;
57
58
  delivery: "queue" | "steer";
58
59
  userImages?: string[];
59
60
  userFiles?: string[];
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@cline/core",
3
3
  "description": "Cline Core SDK for Node Runtime",
4
- "version": "0.0.39",
4
+ "version": "0.0.40",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "https://github.com/cline/sdk",
8
- "directory": "packages/core"
7
+ "url": "https://github.com/cline/cline",
8
+ "directory": "sdk/packages/core"
9
9
  },
10
10
  "type": "module",
11
11
  "types": "./dist/index.d.ts",
@@ -33,20 +33,21 @@
33
33
  }
34
34
  },
35
35
  "scripts": {
36
- "build": "rm -rf dist && bun run ./bun.mts && bun tsc -p tsconfig.build.json",
37
- "clean": "rm -rf dist node_modules",
36
+ "build": "bun run ./bun.mts && bun tsc -p tsconfig.build.json",
38
37
  "typecheck": "bun tsc -p tsconfig.dev.json --noEmit && bun run typecheck:smoke",
39
38
  "typecheck:smoke": "bun tsc -p tsconfig.smoke.json --noEmit",
40
39
  "test": "bun run test:unit && bun run test:e2e",
40
+ "test:live": "vitest run --config vitest.config.ts src/extensions/context/compaction.live.test.ts",
41
41
  "test:unit": "vitest run --config vitest.config.ts",
42
42
  "test:e2e": "vitest run --config vitest.e2e.config.ts",
43
43
  "verify:routines": "zsh -lc 'bunx vitest run src/cron/schedule-service.test.ts --config vitest.config.ts'",
44
44
  "test:watch": "vitest --config vitest.config.ts"
45
45
  },
46
46
  "dependencies": {
47
- "@cline/agents": "0.0.39",
48
- "@cline/shared": "0.0.39",
49
- "@cline/llms": "0.0.39",
47
+ "@cline/agents": "0.0.40",
48
+ "@cline/shared": "0.0.40",
49
+ "@cline/llms": "0.0.40",
50
+ "@modelcontextprotocol/sdk": "^1.29.0",
50
51
  "@opentelemetry/api": "^1.9.0",
51
52
  "@opentelemetry/api-logs": "^0.214.0",
52
53
  "@opentelemetry/exporter-logs-otlp-http": "^0.214.0",