@cline/core 0.0.59 → 0.0.60-nightly.1784085310
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/cline.d.ts +8 -0
- package/dist/auth/codex.d.ts +1 -1
- package/dist/auth/oca.d.ts +1 -1
- package/dist/auth/utils.d.ts +0 -1
- 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/extensions/context/compaction-shared.d.ts +12 -5
- package/dist/extensions/context/compaction.d.ts +2 -3
- package/dist/extensions/tools/executors/apply-patch.d.ts +17 -0
- package/dist/extensions/tools/executors/index.d.ts +3 -2
- package/dist/extensions/tools/index.d.ts +1 -1
- package/dist/extensions/tools/schemas.d.ts +155 -11
- 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 +21 -19
- package/dist/services/telemetry/core-events.d.ts +36 -2
- 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 +43 -8
- 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>;
|
|
@@ -41,16 +41,17 @@ export declare const AuthSettingsSchema: z.ZodObject<{
|
|
|
41
41
|
refreshToken: z.ZodOptional<z.ZodString>;
|
|
42
42
|
expiresAt: z.ZodOptional<z.ZodNumber>;
|
|
43
43
|
accountId: z.ZodOptional<z.ZodString>;
|
|
44
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
44
45
|
}, z.core.$strip>;
|
|
45
46
|
export type AuthSettings = z.infer<typeof AuthSettingsSchema>;
|
|
46
47
|
export declare const ReasoningSettingsSchema: z.ZodObject<{
|
|
47
48
|
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
48
49
|
effort: z.ZodOptional<z.ZodEnum<{
|
|
50
|
+
none: "none";
|
|
49
51
|
low: "low";
|
|
50
|
-
high: "high";
|
|
51
52
|
medium: "medium";
|
|
53
|
+
high: "high";
|
|
52
54
|
xhigh: "xhigh";
|
|
53
|
-
none: "none";
|
|
54
55
|
}>>;
|
|
55
56
|
budgetTokens: z.ZodOptional<z.ZodNumber>;
|
|
56
57
|
}, z.core.$strip>;
|
|
@@ -62,9 +63,9 @@ export declare const AwsSettingsSchema: z.ZodObject<{
|
|
|
62
63
|
region: z.ZodOptional<z.ZodString>;
|
|
63
64
|
profile: z.ZodOptional<z.ZodString>;
|
|
64
65
|
authentication: z.ZodOptional<z.ZodEnum<{
|
|
65
|
-
"api-key": "api-key";
|
|
66
66
|
profile: "profile";
|
|
67
67
|
iam: "iam";
|
|
68
|
+
"api-key": "api-key";
|
|
68
69
|
apikey: "apikey";
|
|
69
70
|
}>>;
|
|
70
71
|
usePromptCache: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -124,28 +125,29 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
|
|
|
124
125
|
refreshToken: z.ZodOptional<z.ZodString>;
|
|
125
126
|
expiresAt: z.ZodOptional<z.ZodNumber>;
|
|
126
127
|
accountId: z.ZodOptional<z.ZodString>;
|
|
128
|
+
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
127
129
|
}, z.core.$strip>>;
|
|
128
130
|
model: z.ZodOptional<z.ZodString>;
|
|
129
131
|
protocol: z.ZodOptional<z.ZodEnum<{
|
|
130
|
-
"openai-responses": "openai-responses";
|
|
131
132
|
anthropic: "anthropic";
|
|
132
133
|
gemini: "gemini";
|
|
134
|
+
"openai-chat": "openai-chat";
|
|
135
|
+
"openai-responses": "openai-responses";
|
|
133
136
|
"openai-r1": "openai-r1";
|
|
134
137
|
"ai-sdk": "ai-sdk";
|
|
135
|
-
"openai-chat": "openai-chat";
|
|
136
138
|
}>>;
|
|
137
139
|
client: z.ZodOptional<z.ZodEnum<{
|
|
138
140
|
custom: "custom";
|
|
139
141
|
anthropic: "anthropic";
|
|
140
|
-
bedrock: "bedrock";
|
|
141
142
|
gemini: "gemini";
|
|
142
|
-
vertex: "vertex";
|
|
143
|
-
openai: "openai";
|
|
144
143
|
"openai-r1": "openai-r1";
|
|
145
144
|
"ai-sdk": "ai-sdk";
|
|
146
145
|
"ai-sdk-community": "ai-sdk-community";
|
|
146
|
+
openai: "openai";
|
|
147
147
|
"openai-compatible": "openai-compatible";
|
|
148
|
+
bedrock: "bedrock";
|
|
148
149
|
fetch: "fetch";
|
|
150
|
+
vertex: "vertex";
|
|
149
151
|
}>>;
|
|
150
152
|
routingProviderId: z.ZodOptional<z.ZodString>;
|
|
151
153
|
maxTokens: z.ZodOptional<z.ZodNumber>;
|
|
@@ -156,11 +158,11 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
|
|
|
156
158
|
reasoning: z.ZodOptional<z.ZodObject<{
|
|
157
159
|
enabled: z.ZodOptional<z.ZodBoolean>;
|
|
158
160
|
effort: z.ZodOptional<z.ZodEnum<{
|
|
161
|
+
none: "none";
|
|
159
162
|
low: "low";
|
|
160
|
-
high: "high";
|
|
161
163
|
medium: "medium";
|
|
164
|
+
high: "high";
|
|
162
165
|
xhigh: "xhigh";
|
|
163
|
-
none: "none";
|
|
164
166
|
}>>;
|
|
165
167
|
budgetTokens: z.ZodOptional<z.ZodNumber>;
|
|
166
168
|
}, z.core.$strip>>;
|
|
@@ -171,9 +173,9 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
|
|
|
171
173
|
region: z.ZodOptional<z.ZodString>;
|
|
172
174
|
profile: z.ZodOptional<z.ZodString>;
|
|
173
175
|
authentication: z.ZodOptional<z.ZodEnum<{
|
|
174
|
-
"api-key": "api-key";
|
|
175
176
|
profile: "profile";
|
|
176
177
|
iam: "iam";
|
|
178
|
+
"api-key": "api-key";
|
|
177
179
|
apikey: "apikey";
|
|
178
180
|
}>>;
|
|
179
181
|
usePromptCache: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -217,12 +219,12 @@ export declare const ProviderSettingsSchema: z.ZodObject<{
|
|
|
217
219
|
}>>;
|
|
218
220
|
capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
219
221
|
tools: "tools";
|
|
220
|
-
streaming: "streaming";
|
|
221
|
-
"prompt-cache": "prompt-cache";
|
|
222
222
|
reasoning: "reasoning";
|
|
223
|
+
"prompt-cache": "prompt-cache";
|
|
224
|
+
streaming: "streaming";
|
|
225
|
+
vision: "vision";
|
|
223
226
|
"computer-use": "computer-use";
|
|
224
227
|
oauth: "oauth";
|
|
225
|
-
vision: "vision";
|
|
226
228
|
popular: "popular";
|
|
227
229
|
}>>>;
|
|
228
230
|
modelCatalog: z.ZodOptional<z.ZodObject<{
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type CaptureAgentUnexpectedReasoningTokensInput, captureAgentUnexpectedReasoningTokens, type ITelemetryService, type TelemetryProperties } from "@cline/shared";
|
|
2
|
+
import type { CoreCompactionBudgetPolicyIntent, CoreCompactionLiveTailHandling } from "../../types/config";
|
|
2
3
|
export type TelemetryAgentKind = "root" | "subagent" | "team_lead" | "team_teammate";
|
|
3
4
|
export interface TelemetryAgentIdentityProperties {
|
|
4
5
|
agentId: string;
|
|
@@ -28,6 +29,7 @@ export declare const CORE_TELEMETRY_EVENTS: {
|
|
|
28
29
|
readonly AUTH_SUCCEEDED: "user.auth_succeeded";
|
|
29
30
|
readonly AUTH_FAILED: "user.auth_failed";
|
|
30
31
|
readonly AUTH_LOGGED_OUT: "user.auth_logged_out";
|
|
32
|
+
readonly AUTH_REFRESH_SOFT_FAILURE: "user.auth_refresh_soft_failure";
|
|
31
33
|
readonly PROVIDER_CONFIGURED: "user.provider_configured";
|
|
32
34
|
readonly TELEMETRY_OPT_OUT: "user.opt_out";
|
|
33
35
|
};
|
|
@@ -51,6 +53,7 @@ export declare const CORE_TELEMETRY_EVENTS: {
|
|
|
51
53
|
readonly SUBAGENT_COMPLETED: "task.subagent_completed";
|
|
52
54
|
readonly COMPACTION_EXECUTED: "task.compaction_executed";
|
|
53
55
|
readonly COMPACTION_SKIPPED: "task.compaction_skipped";
|
|
56
|
+
readonly COMPACTION_BUDGET_EMERGENCY: "task.compaction_budget_emergency";
|
|
54
57
|
};
|
|
55
58
|
readonly HOOKS: {
|
|
56
59
|
readonly DISCOVERY_COMPLETED: "hooks.discovery_completed";
|
|
@@ -112,7 +115,24 @@ export declare function captureWorkspacePathResolved(telemetry: ITelemetryServic
|
|
|
112
115
|
export declare function captureAuthStarted(telemetry: ITelemetryService | undefined, provider?: string): void;
|
|
113
116
|
export declare function captureAuthSucceeded(telemetry: ITelemetryService | undefined, provider?: string): void;
|
|
114
117
|
export declare function captureAuthFailed(telemetry: ITelemetryService | undefined, provider?: string, errorMessage?: string): void;
|
|
115
|
-
export declare function captureAuthLoggedOut(telemetry: ITelemetryService | undefined, provider?: string, reason?: string
|
|
118
|
+
export declare function captureAuthLoggedOut(telemetry: ITelemetryService | undefined, provider?: string, reason?: string, details?: {
|
|
119
|
+
status?: number;
|
|
120
|
+
errorCode?: string;
|
|
121
|
+
}): void;
|
|
122
|
+
/**
|
|
123
|
+
* Fires when a token refresh fails for a reason that does NOT invalidate the
|
|
124
|
+
* session (network error, timeout, 5xx) and stored credentials were kept.
|
|
125
|
+
* Before the transient-vs-invalid_grant fix, `tokenExpired: true` instances
|
|
126
|
+
* were misclassified as invalid grants and wiped stored credentials — this
|
|
127
|
+
* event is the "prevented logout" counter for tracking that fix in
|
|
128
|
+
* production.
|
|
129
|
+
*/
|
|
130
|
+
export declare function captureAuthRefreshSoftFailure(telemetry: ITelemetryService | undefined, provider?: string, details?: {
|
|
131
|
+
status?: number;
|
|
132
|
+
errorCode?: string;
|
|
133
|
+
errorName?: string;
|
|
134
|
+
tokenExpired?: boolean;
|
|
135
|
+
}): void;
|
|
116
136
|
/**
|
|
117
137
|
* Fires when the user finishes configuring a "bring your own provider"
|
|
118
138
|
* (API-key based) provider during onboarding or via settings.
|
|
@@ -254,7 +274,7 @@ export type TelemetryCompactionStrategy = "basic" | "agentic" | "custom";
|
|
|
254
274
|
* Trigger mode for a compaction attempt.
|
|
255
275
|
*
|
|
256
276
|
* - `auto` — fired automatically by `createContextCompactionPrepareTurn`
|
|
257
|
-
* when input tokens
|
|
277
|
+
* when input tokens reach the fixed compaction threshold.
|
|
258
278
|
* - `manual` — user-initiated (e.g. CLI `/compact`).
|
|
259
279
|
*/
|
|
260
280
|
export type TelemetryCompactionMode = "auto" | "manual";
|
|
@@ -265,6 +285,7 @@ export interface CaptureCompactionExecutedProperties {
|
|
|
265
285
|
messagesBefore: number;
|
|
266
286
|
messagesAfter: number;
|
|
267
287
|
messagesRemoved: number;
|
|
288
|
+
/** Full-request token estimates, in the same units as the trigger and limit. */
|
|
268
289
|
tokensBefore: number;
|
|
269
290
|
tokensAfter: number;
|
|
270
291
|
tokensSaved: number;
|
|
@@ -290,6 +311,7 @@ export interface CaptureCompactionSkippedProperties {
|
|
|
290
311
|
* be introduced without changing the schema.
|
|
291
312
|
*/
|
|
292
313
|
reason: string;
|
|
314
|
+
/** Full-request token estimate, in the same units as the trigger and limit. */
|
|
293
315
|
tokensBefore: number;
|
|
294
316
|
triggerTokens: number;
|
|
295
317
|
maxInputTokens: number;
|
|
@@ -299,3 +321,15 @@ export interface CaptureCompactionSkippedProperties {
|
|
|
299
321
|
modelId?: string;
|
|
300
322
|
}
|
|
301
323
|
export declare function captureCompactionSkipped(telemetry: ITelemetryService | undefined, properties: CaptureCompactionSkippedProperties & Partial<TelemetryAgentIdentityProperties>): void;
|
|
324
|
+
export interface CaptureCompactionBudgetEmergencyProperties {
|
|
325
|
+
ulid: string;
|
|
326
|
+
strategy: TelemetryCompactionStrategy;
|
|
327
|
+
mode: TelemetryCompactionMode;
|
|
328
|
+
policyIntent: CoreCompactionBudgetPolicyIntent;
|
|
329
|
+
actionCount: number;
|
|
330
|
+
warningCount: number;
|
|
331
|
+
liveTailHandling: CoreCompactionLiveTailHandling;
|
|
332
|
+
provider?: string;
|
|
333
|
+
modelId?: string;
|
|
334
|
+
}
|
|
335
|
+
export declare function captureCompactionBudgetEmergency(telemetry: ITelemetryService | undefined, properties: CaptureCompactionBudgetEmergencyProperties & Partial<TelemetryAgentIdentityProperties>): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as j,mkdirSync as L,readFileSync as R,writeFileSync as U}from"node:fs";import{resolve as W}from"node:path";import{resolveSessionDataDir as F}from"@cline/shared/storage";import{nanoid as H}from"nanoid";import*as J from"node-machine-id";var V="machine-id";function u(e){let t=e?.trim();if(t)return t;let a=x();if(a)return a;return I()}function $(){let e=J;return e.machineIdSync??e.default?.machineIdSync}function x(){try{let e=$();if(!e)return;return e().trim()||void 0}catch{return}}function I(){let e=F(),t=W(e,V);try{if(j(t)){let i=R(t,"utf8").trim();if(i.length>0)return i}}catch{}let a=`cl-${H()}`;try{L(e,{recursive:!0}),U(t,a,"utf8")}catch{}return a}class b{name;metadata;meter;logger;enabled;distinctId;commonProperties;counters=new Map;histograms=new Map;gauges=new Map;gaugeValues=new Map;meterProvider;loggerProvider;constructor(e){this.name=e.name??"OpenTelemetryAdapter",this.metadata={...e.metadata},this.meterProvider=e.meterProvider,this.loggerProvider=e.loggerProvider,this.meter=e.meterProvider?.getMeter("cline")??null,this.logger=e.loggerProvider?.getLogger("cline")??null,this.enabled=e.enabled??!0,this.distinctId=e.distinctId,this.commonProperties=e.commonProperties?{...e.commonProperties}:{}}emit(e,t){if(!this.isEnabled())return;this.emitLog(e,t,!1)}emitRequired(e,t){this.emitLog(e,t,!0)}recordCounter(e,t,a,i,l=!1){if(!this.meter||!l&&!this.isEnabled())return;let r=this.counters.get(e);if(!r)r=this.meter.createCounter(e,i?{description:i}:void 0),this.counters.set(e,r);r.add(t,this.flattenProperties(this.buildAttributes(a)))}recordHistogram(e,t,a,i,l=!1){if(!this.meter||!l&&!this.isEnabled())return;let r=this.histograms.get(e);if(!r)r=this.meter.createHistogram(e,i?{description:i}:void 0),this.histograms.set(e,r);r.record(t,this.flattenProperties(this.buildAttributes(a)))}recordGauge(e,t,a,i,l=!1){if(!this.meter||!l&&!this.isEnabled())return;let r=this.buildAttributes(a),d=JSON.stringify(r),g=this.gaugeValues.get(e);if(t===null){if(g){if(g.delete(d),g.size===0)this.gaugeValues.delete(e),this.gauges.delete(e)}return}let n=g;if(!n)n=new Map,this.gaugeValues.set(e,n);if(!this.gauges.has(e)){let s=this.meter.createObservableGauge(e,i?{description:i}:void 0);s.addCallback((c)=>{for(let A of this.snapshotGaugeSeries(e))c.observe(A.value,this.flattenProperties(A.attributes))}),this.gauges.set(e,s)}n.set(d,{value:t,attributes:r})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}setDistinctId(e){this.distinctId=e}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}async flush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.()])}emitLog(e,t,a){if(!this.logger)return;let i=this.flattenProperties(this.buildAttributes(t,a));this.logger.emit({severityText:"INFO",body:e,attributes:i})}buildAttributes(e,t=!1){return{...this.commonProperties,...this.metadata,...e,...this.distinctId?{distinct_id:this.distinctId}:{},...t?{_required:!0}:{}}}snapshotGaugeSeries(e){let t=this.gaugeValues.get(e);if(!t)return[];return Array.from(t.values(),(a)=>({value:a.value,attributes:a.attributes?{...a.attributes}:void 0}))}flattenProperties(e,t="",a=new WeakSet,i=0){if(!e)return{};let l={},r=100,d=10;for(let[g,n]of Object.entries(e)){if(g==="__proto__"||g==="constructor"||g==="prototype")continue;let s=t?`${t}.${g}`:g;if(n===null||n===void 0){l[s]=String(n);continue}if(Array.isArray(n)){let c=n.length>r?n.slice(0,r):n;try{l[s]=JSON.stringify(c)}catch{l[s]="[UnserializableArray]"}if(n.length>r)l[`${s}_truncated`]=!0,l[`${s}_original_length`]=n.length;continue}if(typeof n==="object"){if(n instanceof Date){l[s]=n.toISOString();continue}if(n instanceof Error){l[s]=n.message;continue}if(a.has(n)){l[s]="[Circular]";continue}if(i>=d){l[s]="[MaxDepthExceeded]";continue}a.add(n),Object.assign(l,this.flattenProperties(n,s,a,i+1));continue}if(B(n)){l[s]=n;continue}try{l[s]=JSON.stringify(n)}catch{l[s]=String(n)}}return l}}function B(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}import{metrics as Y,trace as D}from"@opentelemetry/api";import{logs as q}from"@opentelemetry/api-logs";import{OTLPLogExporter as p}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as ee}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as te}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as ae}from"@opentelemetry/resources";import{BatchLogRecordProcessor as le,ConsoleLogRecordExporter as ie,LoggerProvider as re}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as ne,MeterProvider as se,PeriodicExportingMetricReader as C}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as de,ConsoleSpanExporter as ge,SimpleSpanProcessor as fe}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as ue}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as be,ATTR_SERVICE_VERSION as me}from"@opentelemetry/semantic-conventions";import{mkdirSync as Re,readFileSync as N,statSync as K,writeFileSync as Ue}from"node:fs";import{resolveGlobalSettingsPath as Q}from"@cline/shared/storage";import{z as f}from"zod";import{AGENT_UNEXPECTED_REASONING_TOKENS_EVENT as Ce,captureAgentUnexpectedReasoningTokens as we,SDK_ERROR_TELEMETRY_EVENT as ze}from"@cline/shared";var O=f.preprocess((e)=>Array.isArray(e)?e.filter((t)=>typeof t==="string").map((t)=>t.trim()).filter(Boolean):void 0,f.array(f.string()).optional()).transform((e)=>{if(!e)return;let t=[...new Set(e)].sort((a,i)=>a.localeCompare(i));return t.length>0?t:void 0}),Z=f.enum(["basic","agentic"]).catch("basic"),v=f.object({telemetryOptOut:f.boolean().default(!1).catch(!1),autoUpdateEnabled:f.boolean().default(!0).catch(!0),compactionStrategy:Z.optional(),disabledTools:O.optional(),disabledPlugins:O.optional()}).strip().transform((e)=>{let t={autoUpdateEnabled:e.autoUpdateEnabled,telemetryOptOut:e.telemetryOptOut};if(e.compactionStrategy)t.compactionStrategy=e.compactionStrategy;if(e.disabledTools?.length)t.disabledTools=e.disabledTools;if(e.disabledPlugins?.length)t.disabledPlugins=e.disabledPlugins;return t});function m(){return v.parse({})}var h;function _(e){if(e.disabledTools)Object.freeze(e.disabledTools);if(e.disabledPlugins)Object.freeze(e.disabledPlugins);return Object.freeze(e)}function k(e){let t;try{t=N(e,"utf8")}catch{return m()}try{let a=v.safeParse(JSON.parse(t));return a.success?a.data:m()}catch{return m()}}function E(){let e=Q(),t=K(e,{throwIfNoEntry:!1}),a=t?.mtimeMs??0,i=t?.size??0,l=h;if(l&&l.path===e&&l.mtimeMs===a&&l.size===i)return l;let r=_(t?k(e):m());return h={path:e,mtimeMs:a,size:i,value:r},h}function X(){return E().value}function G(){return X().telemetryOptOut}class P{name;logger;enabled;constructor(e={}){this.name=e.name??"TelemetryLoggerSink",this.logger=e.logger,this.enabled=e.enabled??!0}emit(e,t){if(!this.isEnabled())return;this.logger?.log("telemetry.event",{telemetrySink:this.name,event:e,properties:t})}emitRequired(e,t){this.logger?.log("telemetry.required_event",{telemetrySink:this.name,severity:"warn",event:e,properties:t})}recordCounter(e,t,a,i,l){if(!l&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:e,value:t,attributes:a,description:i,required:l===!0})}recordHistogram(e,t,a,i,l){if(!l&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:e,value:t,attributes:a,description:i,required:l===!0})}recordGauge(e,t,a,i,l){if(!l&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:e,value:t,attributes:a,description:i,required:l===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class o{adapters;metadata;distinctId;commonProperties;constructor(e={}){if(this.adapters=[...e.adapters??[]],e.logger)this.adapters.push(new P({logger:e.logger}));this.metadata={...e.metadata??{}},this.distinctId=e.distinctId,this.commonProperties={...e.commonProperties??{}}}addAdapter(e){this.adapters.push(e)}setDistinctId(e){this.distinctId=e}setMetadata(e){this.metadata={...e}}updateMetadata(e){this.metadata={...this.metadata,...e}}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}isEnabled(){return this.adapters.some((e)=>e.isEnabled())}capture(e){let t=this.buildAttributes(e.properties);for(let a of this.adapters)a.emit(e.event,t)}captureRequired(e,t){let a=this.buildAttributes(t);for(let i of this.adapters)i.emitRequired(e,a)}recordCounter(e,t,a,i,l=!1){let r=this.buildAttributes(a);for(let d of this.adapters)d.recordCounter(e,t,r,i,l)}recordHistogram(e,t,a,i,l=!1){let r=this.buildAttributes(a);for(let d of this.adapters)d.recordHistogram(e,t,r,i,l)}recordGauge(e,t,a,i,l=!1){let r=this.buildAttributes(a);for(let d of this.adapters)d.recordGauge(e,t,r,i,l)}async flush(){await Promise.all(this.adapters.map((e)=>e.flush()))}async dispose(){await Promise.all(this.adapters.map((e)=>e.dispose()))}buildAttributes(e){return{...this.commonProperties,...e,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class w{distinctId;metadata;commonProperties;constructor(e={}){this.distinctId=e.distinctId,this.metadata={...e.metadata??{}},this.commonProperties={...e.commonProperties??{}}}setDistinctId(e){this.distinctId=e}setMetadata(e){this.metadata={...e}}updateMetadata(e){this.metadata={...this.metadata,...e}}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}isEnabled(){return!1}capture(e){this.resolveProperties(e.properties)}captureRequired(e,t){this.resolveProperties(t)}recordCounter(){}recordHistogram(){}recordGauge(){}async flush(){}async dispose(){}resolveProperties(e){return{...this.commonProperties,...e,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class T{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=ae({[be]:e.serviceName??"cline",...e.serviceVersion?{[me]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)Y.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)q.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return D.getTracer(e,t??this.options.serviceVersion)}createAdapter(e){return new b({...e,meterProvider:this.meterProvider,loggerProvider:this.loggerProvider})}createTelemetryService(e){let t=this.createAdapter({name:e.name,enabled:this.options.enabled,metadata:e.metadata});return new o({...e,adapters:[t],distinctId:u(e.distinctId)})}async forceFlush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.(),this.tracerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.(),this.tracerProvider?.shutdown?.()])}createMeterProvider(e){let t=y(this.options.metricsExporter);if(t.length===0)return null;let a=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),i=Math.min(30000,Math.floor(a*0.8)),l=t.map((r)=>Pe(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:a,timeout:i})).filter((r)=>r!==null);if(l.length===0)return null;return new se({resource:e,readers:l})}createTracerProvider(e){let t=y(this.options.tracesExporter);if(t.length===0)return null;let a=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,i=this.options.otlpTracesHeaders??this.options.otlpHeaders,l=[];for(let r of t){let d=he(r,{endpoint:a,headers:i,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(d)l.push(d)}if(l.length===0)return null;return new ue({resource:e,spanProcessors:l})}createLoggerProvider(e){let t=y(this.options.logsExporter);if(t.length===0)return null;let a=t.map((i)=>{let l=ce(i,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!l)return null;return new le(l,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((i)=>i!==null);if(a.length===0)return null;return new re({resource:e,processors:a})}}function z(e){let t=new T(e),a=t.createTelemetryService(e);return a.captureRequired("telemetry.provider_created",{provider:"opentelemetry",enabled:e.enabled??!0,logsExporter:Array.isArray(e.logsExporter)?e.logsExporter.join(","):e.logsExporter,metricsExporter:Array.isArray(e.metricsExporter)?e.metricsExporter.join(","):e.metricsExporter,tracesExporter:Array.isArray(e.tracesExporter)?e.tracesExporter.join(","):e.tracesExporter,otlpProtocol:e.otlpProtocol,hasOtlpEndpoint:Boolean(e.otlpEndpoint),serviceName:e.serviceName,serviceVersion:e.serviceVersion}),{provider:t,telemetry:a}}function M(e){if(G())return{telemetry:new w(e)};if(e.enabled!==!0)return{telemetry:new o({...e,distinctId:u(e.distinctId)})};return z(e)}function oe(e){let{telemetry:t,provider:a}=M(e);return{telemetry:t,provider:a,flush:async()=>{let r=a;if(r&&typeof r.forceFlush==="function")try{await r.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([t.dispose(),a?.dispose()])}}}function y(e){if(!e)return[];return(Array.isArray(e)?e:e.split(",")).map((a)=>a.trim()).filter((a)=>a==="console"||a==="otlp")}function ce(e,t){if(e==="console")return new ie;if(!t.endpoint)return null;let a=S(t.endpoint,"/v1/logs");return new p({url:a,headers:t.headers})}function he(e,t){if(e==="console")return new fe(new ge);if(!t.endpoint)return null;let a=S(t.endpoint,"/v1/traces");return new de(new te({url:a,headers:t.headers}))}function Pe(e,t){if(e==="console")return new C({exporter:new ne,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let a=S(t.endpoint,"/v1/metrics");return new C({exporter:new ee({url:a,headers:t.headers}),exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout})}function S(e,t){let a=new URL(e),i=a.pathname.endsWith("/")?a.pathname.slice(0,-1):a.pathname;return a.pathname=i.endsWith(t)?i:`${i}${t}`,a.toString()}export{u as resolveCoreDistinctId,z as createOpenTelemetryTelemetryService,M as createConfiguredTelemetryService,oe as createConfiguredTelemetryHandle,T as OpenTelemetryProvider,b as OpenTelemetryAdapter};
|
|
1
|
+
import{existsSync as j,mkdirSync as L,readFileSync as R,writeFileSync as U}from"node:fs";import{resolve as W}from"node:path";import{resolveSessionDataDir as F}from"@cline/shared/storage";import{nanoid as H}from"nanoid";import*as J from"node-machine-id";var V="machine-id";function u(e){let t=e?.trim();if(t)return t;let a=x();if(a)return a;return I()}function $(){let e=J;return e.machineIdSync??e.default?.machineIdSync}function x(){try{let e=$();if(!e)return;return e().trim()||void 0}catch{return}}function I(){let e=F(),t=W(e,V);try{if(j(t)){let r=R(t,"utf8").trim();if(r.length>0)return r}}catch{}let a=`cl-${H()}`;try{L(e,{recursive:!0}),U(t,a,"utf8")}catch{}return a}class b{name;metadata;meter;logger;enabled;distinctId;commonProperties;counters=new Map;histograms=new Map;gauges=new Map;gaugeValues=new Map;meterProvider;loggerProvider;constructor(e){this.name=e.name??"OpenTelemetryAdapter",this.metadata={...e.metadata},this.meterProvider=e.meterProvider,this.loggerProvider=e.loggerProvider,this.meter=e.meterProvider?.getMeter("cline")??null,this.logger=e.loggerProvider?.getLogger("cline")??null,this.enabled=e.enabled??!0,this.distinctId=e.distinctId,this.commonProperties=e.commonProperties?{...e.commonProperties}:{}}emit(e,t){if(!this.isEnabled())return;this.emitLog(e,t,!1)}emitRequired(e,t){this.emitLog(e,t,!0)}recordCounter(e,t,a,r,l=!1){if(!this.meter||!l&&!this.isEnabled())return;let i=this.counters.get(e);if(!i)i=this.meter.createCounter(e,r?{description:r}:void 0),this.counters.set(e,i);i.add(t,this.flattenProperties(this.buildAttributes(a)))}recordHistogram(e,t,a,r,l=!1){if(!this.meter||!l&&!this.isEnabled())return;let i=this.histograms.get(e);if(!i)i=this.meter.createHistogram(e,r?{description:r}:void 0),this.histograms.set(e,i);i.record(t,this.flattenProperties(this.buildAttributes(a)))}recordGauge(e,t,a,r,l=!1){if(!this.meter||!l&&!this.isEnabled())return;let i=this.buildAttributes(a),d=JSON.stringify(i),g=this.gaugeValues.get(e);if(t===null){if(g){if(g.delete(d),g.size===0)this.gaugeValues.delete(e),this.gauges.delete(e)}return}let n=g;if(!n)n=new Map,this.gaugeValues.set(e,n);if(!this.gauges.has(e)){let s=this.meter.createObservableGauge(e,r?{description:r}:void 0);s.addCallback((c)=>{for(let A of this.snapshotGaugeSeries(e))c.observe(A.value,this.flattenProperties(A.attributes))}),this.gauges.set(e,s)}n.set(d,{value:t,attributes:i})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}setDistinctId(e){this.distinctId=e}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}async flush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.()])}emitLog(e,t,a){if(!this.logger)return;let r=this.flattenProperties(this.buildAttributes(t,a));this.logger.emit({severityText:"INFO",body:e,attributes:r})}buildAttributes(e,t=!1){return{...this.commonProperties,...this.metadata,...e,...this.distinctId?{distinct_id:this.distinctId}:{},...t?{_required:!0}:{}}}snapshotGaugeSeries(e){let t=this.gaugeValues.get(e);if(!t)return[];return Array.from(t.values(),(a)=>({value:a.value,attributes:a.attributes?{...a.attributes}:void 0}))}flattenProperties(e,t="",a=new WeakSet,r=0){if(!e)return{};let l={},i=100,d=10;for(let[g,n]of Object.entries(e)){if(g==="__proto__"||g==="constructor"||g==="prototype")continue;let s=t?`${t}.${g}`:g;if(n===null||n===void 0){l[s]=String(n);continue}if(Array.isArray(n)){let c=n.length>i?n.slice(0,i):n;try{l[s]=JSON.stringify(c)}catch{l[s]="[UnserializableArray]"}if(n.length>i)l[`${s}_truncated`]=!0,l[`${s}_original_length`]=n.length;continue}if(typeof n==="object"){if(n instanceof Date){l[s]=n.toISOString();continue}if(n instanceof Error){l[s]=n.message;continue}if(a.has(n)){l[s]="[Circular]";continue}if(r>=d){l[s]="[MaxDepthExceeded]";continue}a.add(n),Object.assign(l,this.flattenProperties(n,s,a,r+1));continue}if(B(n)){l[s]=n;continue}try{l[s]=JSON.stringify(n)}catch{l[s]=String(n)}}return l}}function B(e){return typeof e==="string"||typeof e==="number"||typeof e==="boolean"}import{metrics as Y,trace as D}from"@opentelemetry/api";import{logs as q}from"@opentelemetry/api-logs";import{OTLPLogExporter as p}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as ee}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as te}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as ae}from"@opentelemetry/resources";import{BatchLogRecordProcessor as le,ConsoleLogRecordExporter as re,LoggerProvider as ie}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as ne,MeterProvider as se,PeriodicExportingMetricReader as C}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as de,ConsoleSpanExporter as ge,SimpleSpanProcessor as fe}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as ue}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as be,ATTR_SERVICE_VERSION as oe}from"@opentelemetry/semantic-conventions";import{mkdirSync as Re,readFileSync as N,statSync as K,writeFileSync as Ue}from"node:fs";import{resolveGlobalSettingsPath as Q}from"@cline/shared/storage";import{z as f}from"zod";import{AGENT_UNEXPECTED_REASONING_TOKENS_EVENT as Ce,captureAgentUnexpectedReasoningTokens as we,SDK_ERROR_TELEMETRY_EVENT as ze}from"@cline/shared";var O=f.preprocess((e)=>Array.isArray(e)?e.filter((t)=>typeof t==="string").map((t)=>t.trim()).filter(Boolean):void 0,f.array(f.string()).optional()).transform((e)=>{if(!e)return;let t=[...new Set(e)].sort((a,r)=>a.localeCompare(r));return t.length>0?t:void 0}),Z=f.enum(["basic","agentic"]).catch("basic"),v=f.object({telemetryOptOut:f.boolean().default(!1).catch(!1),autoUpdateEnabled:f.boolean().default(!0).catch(!0),compactionStrategy:Z.optional(),disabledTools:O.optional(),disabledPlugins:O.optional()}).strip().transform((e)=>{let t={autoUpdateEnabled:e.autoUpdateEnabled,telemetryOptOut:e.telemetryOptOut};if(e.compactionStrategy)t.compactionStrategy=e.compactionStrategy;if(e.disabledTools?.length)t.disabledTools=e.disabledTools;if(e.disabledPlugins?.length)t.disabledPlugins=e.disabledPlugins;return t});function o(){return v.parse({})}var h;function _(e){if(e.disabledTools)Object.freeze(e.disabledTools);if(e.disabledPlugins)Object.freeze(e.disabledPlugins);return Object.freeze(e)}function k(e){let t;try{t=N(e,"utf8")}catch{return o()}try{let a=v.safeParse(JSON.parse(t));return a.success?a.data:o()}catch{return o()}}function E(){let e=Q(),t=K(e,{throwIfNoEntry:!1}),a=t?.mtimeMs??0,r=t?.size??0,l=h;if(l&&l.path===e&&l.mtimeMs===a&&l.size===r)return l;let i=_(t?k(e):o());return h={path:e,mtimeMs:a,size:r,value:i},h}function X(){return E().value}function G(){return X().telemetryOptOut}class P{name;logger;enabled;constructor(e={}){this.name=e.name??"TelemetryLoggerSink",this.logger=e.logger,this.enabled=e.enabled??!0}emit(e,t){if(!this.isEnabled())return;this.logger?.log("telemetry.event",{telemetrySink:this.name,event:e,properties:t})}emitRequired(e,t){this.logger?.log("telemetry.required_event",{telemetrySink:this.name,severity:"warn",event:e,properties:t})}recordCounter(e,t,a,r,l){if(!l&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:e,value:t,attributes:a,description:r,required:l===!0})}recordHistogram(e,t,a,r,l){if(!l&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:e,value:t,attributes:a,description:r,required:l===!0})}recordGauge(e,t,a,r,l){if(!l&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:e,value:t,attributes:a,description:r,required:l===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class m{adapters;metadata;distinctId;commonProperties;constructor(e={}){if(this.adapters=[...e.adapters??[]],e.logger)this.adapters.push(new P({logger:e.logger}));this.metadata={...e.metadata??{}},this.distinctId=e.distinctId,this.commonProperties={...e.commonProperties??{}}}addAdapter(e){this.adapters.push(e)}setDistinctId(e){this.distinctId=e}setMetadata(e){this.metadata={...e}}updateMetadata(e){this.metadata={...this.metadata,...e}}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}isEnabled(){return this.adapters.some((e)=>e.isEnabled())}capture(e){let t=this.buildAttributes(e.properties);for(let a of this.adapters)a.emit(e.event,t)}captureRequired(e,t){let a=this.buildAttributes(t);for(let r of this.adapters)r.emitRequired(e,a)}recordCounter(e,t,a,r,l=!1){let i=this.buildAttributes(a);for(let d of this.adapters)d.recordCounter(e,t,i,r,l)}recordHistogram(e,t,a,r,l=!1){let i=this.buildAttributes(a);for(let d of this.adapters)d.recordHistogram(e,t,i,r,l)}recordGauge(e,t,a,r,l=!1){let i=this.buildAttributes(a);for(let d of this.adapters)d.recordGauge(e,t,i,r,l)}async flush(){await Promise.all(this.adapters.map((e)=>e.flush()))}async dispose(){await Promise.all(this.adapters.map((e)=>e.dispose()))}buildAttributes(e){return{...this.commonProperties,...e,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class w{distinctId;metadata;commonProperties;constructor(e={}){this.distinctId=e.distinctId,this.metadata={...e.metadata??{}},this.commonProperties={...e.commonProperties??{}}}setDistinctId(e){this.distinctId=e}setMetadata(e){this.metadata={...e}}updateMetadata(e){this.metadata={...this.metadata,...e}}setCommonProperties(e){this.commonProperties={...e}}updateCommonProperties(e){this.commonProperties={...this.commonProperties,...e}}isEnabled(){return!1}capture(e){this.resolveProperties(e.properties)}captureRequired(e,t){this.resolveProperties(t)}recordCounter(){}recordHistogram(){}recordGauge(){}async flush(){}async dispose(){}resolveProperties(e){return{...this.commonProperties,...e,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class T{meterProvider;loggerProvider;tracerProvider;options;constructor(e={}){this.options=e;let t=ae({[be]:e.serviceName??"cline",...e.serviceVersion?{[oe]:e.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(t),this.loggerProvider=this.createLoggerProvider(t),this.tracerProvider=this.createTracerProvider(t),this.meterProvider)Y.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)q.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(e="cline",t){return D.getTracer(e,t??this.options.serviceVersion)}createAdapter(e){return new b({...e,meterProvider:this.meterProvider,loggerProvider:this.loggerProvider})}createTelemetryService(e){let t=this.createAdapter({name:e.name,enabled:this.options.enabled,metadata:e.metadata});return new m({...e,adapters:[t],distinctId:u(e.distinctId)})}async forceFlush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.(),this.tracerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.(),this.tracerProvider?.shutdown?.()])}createMeterProvider(e){let t=y(this.options.metricsExporter);if(t.length===0)return null;let a=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),r=Math.min(30000,Math.floor(a*0.8)),l=t.map((i)=>Pe(i,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:a,timeout:r})).filter((i)=>i!==null);if(l.length===0)return null;return new se({resource:e,readers:l})}createTracerProvider(e){let t=y(this.options.tracesExporter);if(t.length===0)return null;let a=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,r=this.options.otlpTracesHeaders??this.options.otlpHeaders,l=[];for(let i of t){let d=he(i,{endpoint:a,headers:r,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(d)l.push(d)}if(l.length===0)return null;return new ue({resource:e,spanProcessors:l})}createLoggerProvider(e){let t=y(this.options.logsExporter);if(t.length===0)return null;let a=t.map((r)=>{let l=ce(r,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!l)return null;return new le(l,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((r)=>r!==null);if(a.length===0)return null;return new ie({resource:e,processors:a})}}function z(e){let t=new T(e),a=t.createTelemetryService(e);return a.captureRequired("telemetry.provider_created",{provider:"opentelemetry",enabled:e.enabled??!0,logsExporter:Array.isArray(e.logsExporter)?e.logsExporter.join(","):e.logsExporter,metricsExporter:Array.isArray(e.metricsExporter)?e.metricsExporter.join(","):e.metricsExporter,tracesExporter:Array.isArray(e.tracesExporter)?e.tracesExporter.join(","):e.tracesExporter,otlpProtocol:e.otlpProtocol,hasOtlpEndpoint:Boolean(e.otlpEndpoint),serviceName:e.serviceName,serviceVersion:e.serviceVersion}),{provider:t,telemetry:a}}function M(e){if(G())return{telemetry:new w(e)};if(e.enabled!==!0)return{telemetry:new m({...e,distinctId:u(e.distinctId)})};return z(e)}function me(e){let{telemetry:t,provider:a}=M(e);return{telemetry:t,provider:a,flush:async()=>{let i=a;if(i&&typeof i.forceFlush==="function")try{await i.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([t.dispose(),a?.dispose()])}}}function y(e){if(!e)return[];return(Array.isArray(e)?e:e.split(",")).map((a)=>a.trim()).filter((a)=>a==="console"||a==="otlp")}function ce(e,t){if(e==="console")return new re;if(!t.endpoint)return null;let a=S(t.endpoint,"/v1/logs");return new p({url:a,headers:t.headers})}function he(e,t){if(e==="console")return new fe(new ge);if(!t.endpoint)return null;let a=S(t.endpoint,"/v1/traces");return new de(new te({url:a,headers:t.headers}))}function Pe(e,t){if(e==="console")return new C({exporter:new ne,exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout});if(!t.endpoint)return null;let a=S(t.endpoint,"/v1/metrics");return new C({exporter:new ee({url:a,headers:t.headers}),exportIntervalMillis:t.interval,exportTimeoutMillis:t.timeout})}function S(e,t){let a=new URL(e),r=a.pathname.endsWith("/")?a.pathname.slice(0,-1):a.pathname;return a.pathname=r.endsWith(t)?r:`${r}${t}`,a.toString()}export{u as resolveCoreDistinctId,z as createOpenTelemetryTelemetryService,M as createConfiguredTelemetryService,me as createConfiguredTelemetryHandle,T as OpenTelemetryProvider,b as OpenTelemetryAdapter};
|
|
@@ -9,11 +9,11 @@ export declare const SessionManifestSchema: z.ZodObject<{
|
|
|
9
9
|
exit_code: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
10
10
|
status: z.ZodEnum<{
|
|
11
11
|
failed: "failed";
|
|
12
|
-
running: "running";
|
|
13
|
-
cancelled: "cancelled";
|
|
14
|
-
pending: "pending";
|
|
15
12
|
completed: "completed";
|
|
16
13
|
idle: "idle";
|
|
14
|
+
running: "running";
|
|
15
|
+
pending: "pending";
|
|
16
|
+
cancelled: "cancelled";
|
|
17
17
|
}>;
|
|
18
18
|
interactive: z.ZodBoolean;
|
|
19
19
|
provider: z.ZodString;
|
|
@@ -22,11 +22,11 @@ export declare const ChatSessionConfigSchema: z.ZodObject<{
|
|
|
22
22
|
export declare const ChatSessionStatusSchema: z.ZodEnum<{
|
|
23
23
|
error: "error";
|
|
24
24
|
failed: "failed";
|
|
25
|
-
running: "running";
|
|
26
|
-
cancelled: "cancelled";
|
|
27
|
-
pending: "pending";
|
|
28
25
|
completed: "completed";
|
|
29
26
|
idle: "idle";
|
|
27
|
+
running: "running";
|
|
28
|
+
pending: "pending";
|
|
29
|
+
cancelled: "cancelled";
|
|
30
30
|
starting: "starting";
|
|
31
31
|
stopping: "stopping";
|
|
32
32
|
}>;
|
|
@@ -68,8 +68,8 @@ export declare const ChatMessageSchema: z.ZodObject<{
|
|
|
68
68
|
createdAt: z.ZodNumber;
|
|
69
69
|
runCount: z.ZodNumber;
|
|
70
70
|
kind: z.ZodOptional<z.ZodEnum<{
|
|
71
|
-
commit: "commit";
|
|
72
71
|
stash: "stash";
|
|
72
|
+
commit: "commit";
|
|
73
73
|
}>>;
|
|
74
74
|
}, z.core.$strip>>;
|
|
75
75
|
}, z.core.$strip>>;
|
|
@@ -84,11 +84,11 @@ export declare const ChatViewStateSchema: z.ZodObject<{
|
|
|
84
84
|
status: z.ZodEnum<{
|
|
85
85
|
error: "error";
|
|
86
86
|
failed: "failed";
|
|
87
|
-
running: "running";
|
|
88
|
-
cancelled: "cancelled";
|
|
89
|
-
pending: "pending";
|
|
90
87
|
completed: "completed";
|
|
91
88
|
idle: "idle";
|
|
89
|
+
running: "running";
|
|
90
|
+
pending: "pending";
|
|
91
|
+
cancelled: "cancelled";
|
|
92
92
|
starting: "starting";
|
|
93
93
|
stopping: "stopping";
|
|
94
94
|
}>;
|
|
@@ -142,8 +142,8 @@ export declare const ChatViewStateSchema: z.ZodObject<{
|
|
|
142
142
|
createdAt: z.ZodNumber;
|
|
143
143
|
runCount: z.ZodNumber;
|
|
144
144
|
kind: z.ZodOptional<z.ZodEnum<{
|
|
145
|
-
commit: "commit";
|
|
146
145
|
stash: "stash";
|
|
146
|
+
commit: "commit";
|
|
147
147
|
}>>;
|
|
148
148
|
}, z.core.$strip>>;
|
|
149
149
|
}, z.core.$strip>>;
|
package/dist/types/config.d.ts
CHANGED
|
@@ -36,6 +36,31 @@ export interface CoreRuntimeFeatures {
|
|
|
36
36
|
disableMcpSettingsTools?: boolean;
|
|
37
37
|
yolo?: boolean;
|
|
38
38
|
}
|
|
39
|
+
export type CoreCompactionMode = "auto" | "manual";
|
|
40
|
+
export interface CoreCompactionBudget {
|
|
41
|
+
request: {
|
|
42
|
+
/** Estimated tokens for the full provider request. */
|
|
43
|
+
inputTokens: number;
|
|
44
|
+
/** Effective provider input limit. */
|
|
45
|
+
maxInputTokens: number;
|
|
46
|
+
/** Full-request token count that triggers automatic compaction. */
|
|
47
|
+
triggerTokens: number;
|
|
48
|
+
/** Full-request token count the strategy output should fit within. */
|
|
49
|
+
targetTokens: number;
|
|
50
|
+
/** Fixed system-prompt, tool-definition, and request framing cost. */
|
|
51
|
+
overheadTokens: number;
|
|
52
|
+
thresholdRatio: number;
|
|
53
|
+
utilizationRatio: number;
|
|
54
|
+
};
|
|
55
|
+
messages: {
|
|
56
|
+
/** Estimated tokens in the compactable message transcript. */
|
|
57
|
+
inputTokens: number;
|
|
58
|
+
/** Message budget corresponding to the full-request trigger. */
|
|
59
|
+
triggerTokens: number;
|
|
60
|
+
/** Message budget the strategy should compact toward. */
|
|
61
|
+
targetTokens: number;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
39
64
|
export interface CoreCompactionContext {
|
|
40
65
|
agentId: string;
|
|
41
66
|
conversationId: string;
|
|
@@ -47,14 +72,20 @@ export interface CoreCompactionContext {
|
|
|
47
72
|
provider: string;
|
|
48
73
|
info?: ModelInfo;
|
|
49
74
|
};
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
75
|
+
mode: CoreCompactionMode;
|
|
76
|
+
budget: CoreCompactionBudget;
|
|
77
|
+
}
|
|
78
|
+
export type CoreCompactionBudgetPolicyIntent = "agentic_summary" | "basic_compaction_projection" | "normal_provider_request";
|
|
79
|
+
export type CoreCompactionLiveTailHandling = "included_verbatim" | "included_degraded" | "summarized_as_context" | "omitted_with_warning" | "preserved_out_of_band";
|
|
80
|
+
export interface CoreCompactionBudgetMetadata {
|
|
81
|
+
policyIntent: CoreCompactionBudgetPolicyIntent;
|
|
82
|
+
actionCount: number;
|
|
83
|
+
warningCount: number;
|
|
84
|
+
liveTailHandling: CoreCompactionLiveTailHandling;
|
|
55
85
|
}
|
|
56
86
|
export interface CoreCompactionResult {
|
|
57
87
|
messages: MessageWithMetadata[];
|
|
88
|
+
budget?: CoreCompactionBudgetMetadata;
|
|
58
89
|
}
|
|
59
90
|
export interface CoreCompactionSummarizerConfig {
|
|
60
91
|
providerId: string;
|
|
@@ -62,6 +93,13 @@ export interface CoreCompactionSummarizerConfig {
|
|
|
62
93
|
apiKey?: string;
|
|
63
94
|
baseUrl?: string;
|
|
64
95
|
headers?: Record<string, string>;
|
|
96
|
+
/**
|
|
97
|
+
* Optional pre-resolved model metadata for the summarizer. Supplying either
|
|
98
|
+
* this or `knownModels` lets agentic compaction budget summary input against
|
|
99
|
+
* the summarizer model's actual context window instead of falling back to the
|
|
100
|
+
* active model's window.
|
|
101
|
+
*/
|
|
102
|
+
modelInfo?: ModelInfo;
|
|
65
103
|
knownModels?: Record<string, ModelInfo>;
|
|
66
104
|
providerConfig?: ProviderConfig;
|
|
67
105
|
maxOutputTokens?: number;
|
|
@@ -70,10 +108,7 @@ export type CoreCompactionStrategy = "basic" | "agentic";
|
|
|
70
108
|
export interface CoreCompactionConfig {
|
|
71
109
|
enabled?: boolean;
|
|
72
110
|
strategy?: CoreCompactionStrategy;
|
|
73
|
-
thresholdRatio?: number;
|
|
74
|
-
reserveTokens?: number;
|
|
75
111
|
preserveRecentTokens?: number;
|
|
76
|
-
maxInputTokens?: number;
|
|
77
112
|
summarizer?: CoreCompactionSummarizerConfig;
|
|
78
113
|
compact?: (context: CoreCompactionContext) => Promise<CoreCompactionResult | undefined> | CoreCompactionResult | undefined;
|
|
79
114
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cline/core",
|
|
3
3
|
"description": "Cline Core SDK for Node Runtime",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.60-nightly.1784085310",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/cline/cline",
|
|
@@ -48,9 +48,9 @@
|
|
|
48
48
|
"test:watch": "vitest --config vitest.config.ts"
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@cline/agents": "0.0.
|
|
52
|
-
"@cline/shared": "0.0.
|
|
53
|
-
"@cline/llms": "0.0.
|
|
51
|
+
"@cline/agents": "0.0.60-nightly.1784085310",
|
|
52
|
+
"@cline/shared": "0.0.60-nightly.1784085310",
|
|
53
|
+
"@cline/llms": "0.0.60-nightly.1784085310",
|
|
54
54
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
55
55
|
"@opentelemetry/api": "^1.9.0",
|
|
56
56
|
"@opentelemetry/api-logs": "^0.214.0",
|