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