@cline/core 0.0.65 → 0.0.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/README.md +12 -0
  2. package/dist/cline-core/types.d.ts +5 -3
  3. package/dist/cron/service/schedule-service.d.ts +2 -1
  4. package/dist/cron/store/sqlite-cron-store.d.ts +5 -2
  5. package/dist/extensions/context/basic-compaction.d.ts +10 -1
  6. package/dist/extensions/context/compaction-shared.d.ts +20 -0
  7. package/dist/hub/client/index.d.ts +2 -0
  8. package/dist/hub/daemon/entry.d.ts +5 -1
  9. package/dist/hub/daemon/entry.js +261 -216
  10. package/dist/hub/index.js +255 -212
  11. package/dist/hub/server/handlers/connector-handlers.d.ts +0 -2
  12. package/dist/hub/server/hub-server-options.d.ts +6 -1
  13. package/dist/index.d.ts +10 -7
  14. package/dist/index.js +256 -213
  15. package/dist/runtime/host/local-runtime-host.d.ts +4 -1
  16. package/dist/runtime/host/runtime-host.d.ts +11 -3
  17. package/dist/services/connectors/active-connectors.d.ts +2 -0
  18. package/dist/services/connectors/connector-autostart.d.ts +33 -0
  19. package/dist/services/connectors/daemon-connector-reconnect.d.ts +30 -0
  20. package/dist/services/global-settings.d.ts +33 -0
  21. package/dist/services/llms/provider-settings.d.ts +1 -1
  22. package/dist/services/llms/runtime-registry.d.ts +1 -1
  23. package/dist/services/local-runtime-bootstrap.d.ts +5 -4
  24. package/dist/services/storage/sqlite-session-store.d.ts +5 -0
  25. package/dist/services/telemetry/OpenTelemetryProvider.d.ts +16 -0
  26. package/dist/services/telemetry/core-events.d.ts +20 -4
  27. package/dist/services/telemetry/index.js +1 -1
  28. package/dist/services/workspace/chat-workspace.d.ts +9 -0
  29. package/dist/types/chat-schema.d.ts +31 -0
  30. package/dist/types/config.d.ts +8 -0
  31. package/dist/types.d.ts +2 -2
  32. package/package.json +5 -4
@@ -1,5 +1,5 @@
1
1
  import type * as LlmsProviders from "@cline/llms";
2
- import { type AgentConfig, type AgentResult, type ITelemetryService } from "@cline/shared";
2
+ import { type AgentConfig, type AgentResult, type BasicLogger, type ITelemetryService } from "@cline/shared";
3
3
  import type { HookEventPayload } from "../../hooks";
4
4
  import { ProviderSettingsManager } from "../../services/storage/provider-settings-manager";
5
5
  import { type SessionCompactionState } from "../../session/models/session-compaction";
@@ -22,6 +22,7 @@ export interface LocalRuntimeHostOptions {
22
22
  providerSettingsManager?: ProviderSettingsManager;
23
23
  oauthTokenManager?: RuntimeOAuthTokenManager;
24
24
  telemetry?: ITelemetryService;
25
+ logger?: BasicLogger;
25
26
  /**
26
27
  * Default custom `fetch` implementation threaded into every
27
28
  * `ProviderConfig.fetch` built during local session bootstrap. Used by
@@ -41,6 +42,7 @@ export declare class LocalRuntimeHost implements RuntimeHost {
41
42
  private readonly providerSettingsManager;
42
43
  private readonly oauthTokenManager;
43
44
  private readonly defaultTelemetry?;
45
+ private readonly defaultLogger?;
44
46
  private readonly defaultFetch?;
45
47
  private readonly events;
46
48
  private readonly sessions;
@@ -54,6 +56,7 @@ export declare class LocalRuntimeHost implements RuntimeHost {
54
56
  constructor(options: LocalRuntimeHostOptions);
55
57
  private applyInitialOAuthCredentials;
56
58
  startSession(input: StartSessionInput): Promise<StartSessionResult>;
59
+ private startResolvedSession;
57
60
  restoreSession(input: RestoreSessionInput): Promise<RestoreSessionResult>;
58
61
  runTurn(input: SendSessionInput): Promise<AgentResult | undefined>;
59
62
  getAccumulatedUsage(sessionId: string): Promise<SessionUsageSummary | undefined>;
@@ -6,7 +6,7 @@ import type { ProviderSettings } from "../../services/llms/provider-settings";
6
6
  import type { SessionCompactionState } from "../../session/models/session-compaction";
7
7
  import type { SessionManifest } from "../../session/models/session-manifest";
8
8
  import type { SessionSource } from "../../types/common";
9
- import type { CoreSessionConfig } from "../../types/config";
9
+ import type { ClineCoreStartConfig, CoreSessionConfig } from "../../types/config";
10
10
  import type { CoreSessionEvent, SessionPendingPrompt } from "../../types/events";
11
11
  import type { SessionRecord } from "../../types/sessions";
12
12
  import type { RuntimeCapabilities } from "../capabilities";
@@ -23,6 +23,10 @@ export type RuntimeSessionConfig = Omit<CoreSessionConfig, LocalOnlyCoreSessionC
23
23
  checkpoint?: Omit<NonNullable<CoreSessionConfig["checkpoint"]>, "createCheckpoint">;
24
24
  compaction?: Omit<NonNullable<CoreSessionConfig["compaction"]>, "compact">;
25
25
  };
26
+ /** Workspace paths may be omitted only at the session-start boundary. */
27
+ export type StartSessionConfig = Omit<RuntimeSessionConfig, "cwd"> & {
28
+ cwd?: string;
29
+ };
26
30
  export type LocalRuntimeBootstrapConfig = Pick<CoreSessionConfig, LocalOnlyCoreSessionConfigKeys> & {
27
31
  checkpoint?: Pick<NonNullable<CoreSessionConfig["checkpoint"]>, "createCheckpoint"> & Partial<NonNullable<CoreSessionConfig["checkpoint"]>>;
28
32
  compaction?: Pick<NonNullable<CoreSessionConfig["compaction"]>, "compact"> & Partial<NonNullable<CoreSessionConfig["compaction"]>>;
@@ -44,7 +48,7 @@ export interface LocalRuntimeStartOptions {
44
48
  onTeamRestored?: () => void;
45
49
  }
46
50
  export interface StartSessionInput {
47
- config: RuntimeSessionConfig;
51
+ config: StartSessionConfig;
48
52
  source?: SessionSource;
49
53
  prompt?: string;
50
54
  interactive?: boolean;
@@ -62,8 +66,12 @@ export interface StartSessionInput {
62
66
  capabilities?: RuntimeCapabilities;
63
67
  toolPolicies?: import("@cline/shared").AgentConfig["toolPolicies"];
64
68
  }
65
- export declare function splitCoreSessionConfig(config: CoreSessionConfig): {
69
+ /** Session input after the execution host has resolved a concrete workspace. */
70
+ export interface ResolvedStartSessionInput extends Omit<StartSessionInput, "config"> {
66
71
  config: RuntimeSessionConfig;
72
+ }
73
+ export declare function splitCoreSessionConfig(config: ClineCoreStartConfig): {
74
+ config: StartSessionConfig;
67
75
  localRuntime?: LocalRuntimeStartOptions;
68
76
  };
69
77
  export interface StartSessionResult {
@@ -0,0 +1,2 @@
1
+ import type { ActiveConnectorRecord } from "@cline/shared";
2
+ export declare function listActiveConnectors(): ActiveConnectorRecord[];
@@ -0,0 +1,33 @@
1
+ import { type ConnectorConnectionRecord } from "@cline/shared/db";
2
+ /**
3
+ * Record a successful connector start so the connector can be reconnected
4
+ * automatically after a hub or host restart.
5
+ */
6
+ export declare function persistConnectorConnection(channel: string, instanceId: string, rawArgs: string[], cwd?: string): void;
7
+ /** Stop auto-reconnecting one instance, one channel, or every connector. */
8
+ export declare function disableConnectorAutostart(channel?: string, instanceId?: string): void;
9
+ export declare function getPersistedConnectorConnection(channel: string, instanceId: string): ConnectorConnectionRecord | undefined;
10
+ export declare function removePersistedConnectorConnection(channel: string, instanceId: string): void;
11
+ export interface ReconnectTarget {
12
+ channel: string;
13
+ instanceId: string;
14
+ args: string[];
15
+ }
16
+ export interface ReconnectAttempt {
17
+ channel: string;
18
+ instanceId: string;
19
+ ok: boolean;
20
+ error?: string;
21
+ }
22
+ export interface ReconnectPersistedConnectorsOptions {
23
+ /** Starts one connector instance with its stored, non-interactive arguments. */
24
+ start: (target: ReconnectTarget) => Promise<boolean>;
25
+ /** Reports whether this exact connector instance is healthy in the host. */
26
+ isHealthy?: (target: ReconnectTarget) => boolean;
27
+ log?: (message: string) => void;
28
+ }
29
+ /**
30
+ * Reconnect every connector that has stored connection arguments, is enabled,
31
+ * and is not already active in the calling host.
32
+ */
33
+ export declare function reconnectPersistedConnectors(options: ReconnectPersistedConnectorsOptions): Promise<ReconnectAttempt[]>;
@@ -0,0 +1,30 @@
1
+ import { type ConnectorCliLaunchSpec } from "@cline/shared";
2
+ import { type ReconnectAttempt } from "./connector-autostart";
3
+ type ConnectorCliChild = {
4
+ stderr?: {
5
+ setEncoding: (encoding: string) => void;
6
+ on: (event: "data", listener: (chunk: unknown) => void) => void;
7
+ };
8
+ once: (event: "error" | "close", listener: (value: unknown) => void) => void;
9
+ };
10
+ type SpawnConnectorCli = (launcher: string, args: string[], options: {
11
+ cwd: string;
12
+ env: NodeJS.ProcessEnv;
13
+ stdio: ["ignore", "ignore", "pipe"];
14
+ windowsHide: boolean;
15
+ }) => ConnectorCliChild;
16
+ declare function runConnectorCli(spec: ConnectorCliLaunchSpec, channel: string, args: string[], options: {
17
+ restartInstanceId?: string;
18
+ log: (message: string) => void;
19
+ spawnProcess?: SpawnConnectorCli;
20
+ }): Promise<boolean>;
21
+ /**
22
+ * Restore connectors from the daemon entrypoint through a host-provided CLI
23
+ * launch specification. This keeps connector implementations in the CLI app
24
+ * while allowing the package-owned daemon entrypoint to supervise recovery.
25
+ */
26
+ export declare function reconnectDaemonConnectors(log?: (message: string) => void): Promise<ReconnectAttempt[]>;
27
+ export declare const __test__: {
28
+ runConnectorCli: typeof runConnectorCli;
29
+ };
30
+ export {};
@@ -5,6 +5,13 @@ declare const GlobalCompactionStrategySchema: z.ZodCatch<z.ZodEnum<{
5
5
  agentic: "agentic";
6
6
  }>>;
7
7
  export type GlobalCompactionStrategy = z.infer<typeof GlobalCompactionStrategySchema>;
8
+ /** Compaction strategy plus the "off" state surfaced by the CLI settings UI. */
9
+ export type GlobalCompactionMode = GlobalCompactionStrategy | "off";
10
+ declare const GlobalPlanActModeSchema: z.ZodEnum<{
11
+ plan: "plan";
12
+ act: "act";
13
+ }>;
14
+ export type GlobalPlanActMode = z.infer<typeof GlobalPlanActModeSchema>;
8
15
  export declare const GlobalSettingsSchema: z.ZodPipe<z.ZodObject<{
9
16
  telemetryOptOut: z.ZodCatch<z.ZodDefault<z.ZodBoolean>>;
10
17
  autoUpdateEnabled: z.ZodCatch<z.ZodDefault<z.ZodBoolean>>;
@@ -12,18 +19,30 @@ export declare const GlobalSettingsSchema: z.ZodPipe<z.ZodObject<{
12
19
  basic: "basic";
13
20
  agentic: "agentic";
14
21
  }>>>;
22
+ compactionEnabled: z.ZodCatch<z.ZodOptional<z.ZodBoolean>>;
23
+ planActMode: z.ZodCatch<z.ZodOptional<z.ZodEnum<{
24
+ plan: "plan";
25
+ act: "act";
26
+ }>>>;
27
+ toolAutoApprove: z.ZodCatch<z.ZodOptional<z.ZodBoolean>>;
15
28
  disabledTools: z.ZodOptional<z.ZodPipe<z.ZodPreprocess<z.ZodOptional<z.ZodArray<z.ZodString>>>, z.ZodTransform<string[] | undefined, string[] | undefined>>>;
16
29
  disabledPlugins: z.ZodOptional<z.ZodPipe<z.ZodPreprocess<z.ZodOptional<z.ZodArray<z.ZodString>>>, z.ZodTransform<string[] | undefined, string[] | undefined>>>;
17
30
  }, z.core.$strip>, z.ZodTransform<{
18
31
  telemetryOptOut: boolean;
19
32
  autoUpdateEnabled: boolean;
20
33
  compactionStrategy?: GlobalCompactionStrategy;
34
+ compactionEnabled?: boolean;
35
+ planActMode?: GlobalPlanActMode;
36
+ toolAutoApprove?: boolean;
21
37
  disabledTools?: string[];
22
38
  disabledPlugins?: string[];
23
39
  }, {
24
40
  telemetryOptOut: boolean;
25
41
  autoUpdateEnabled: boolean;
26
42
  compactionStrategy?: "basic" | "agentic" | undefined;
43
+ compactionEnabled?: boolean | undefined;
44
+ planActMode?: "plan" | "act" | undefined;
45
+ toolAutoApprove?: boolean | undefined;
27
46
  disabledTools?: string[] | undefined;
28
47
  disabledPlugins?: string[] | undefined;
29
48
  }>>;
@@ -39,6 +58,20 @@ export declare function isAutoUpdateEnabledGlobally(): boolean;
39
58
  export declare function setAutoUpdateEnabledGlobally(autoUpdateEnabled: boolean, options?: WriteGlobalSettingsOptions): void;
40
59
  export declare function readCompactionStrategyGlobally(): GlobalCompactionStrategy;
41
60
  export declare function setCompactionStrategyGlobally(compactionStrategy: GlobalCompactionStrategy): void;
61
+ /**
62
+ * Returns the persisted compaction mode including the disabled state, or
63
+ * undefined when the user never chose one (callers apply their own default).
64
+ */
65
+ export declare function readCompactionModeGlobally(): GlobalCompactionMode | undefined;
66
+ /**
67
+ * Persists the full compaction mode. Selecting "off" keeps the previously
68
+ * chosen strategy so re-enabling compaction restores it.
69
+ */
70
+ export declare function setCompactionModeGlobally(mode: GlobalCompactionMode): void;
71
+ export declare function readPlanActModeGlobally(): GlobalPlanActMode | undefined;
72
+ export declare function setPlanActModeGlobally(planActMode: GlobalPlanActMode): void;
73
+ export declare function readToolAutoApproveGlobally(): boolean | undefined;
74
+ export declare function setToolAutoApproveGlobally(toolAutoApprove: boolean): void;
42
75
  export declare function resolveDisabledToolNames(disabledToolNames?: ReadonlyArray<string>): Set<string>;
43
76
  export declare function resolveDisabledPluginPaths(disabledPluginPaths?: ReadonlyArray<string>): Set<string>;
44
77
  export declare function isToolDisabledGlobally(toolName: string): boolean;
@@ -9,7 +9,7 @@ export type ProviderCapability = Llms.ProviderCapability;
9
9
  export type ProviderConfig = Llms.ProviderConfig;
10
10
  export type BuiltInProviderId = Llms.BuiltInProviderId;
11
11
  export declare const BUILT_IN_PROVIDER: typeof Llms.BUILT_IN_PROVIDER;
12
- export declare const BUILT_IN_PROVIDER_IDS: [Llms.BUILT_IN_PROVIDER, ...Llms.BUILT_IN_PROVIDER[]];
12
+ export declare const BUILT_IN_PROVIDER_IDS: readonly Llms.BuiltInProviderId[];
13
13
  export declare const isBuiltInProviderId: typeof Llms.isBuiltInProviderId;
14
14
  export declare const normalizeProviderId: typeof Llms.normalizeProviderId;
15
15
  export type ProviderDefaultsConfig = ProviderDefaults;
@@ -9,7 +9,7 @@ export declare class DefaultLlmsSdk implements LlmsSdk {
9
9
  registerBuiltinProvider(input: RegisterBuiltinProviderInput): void;
10
10
  registerModel(input: RegisterModelInput): void;
11
11
  getProviders(): RegisteredProviderSummary[];
12
- getBuiltInProviderIds(): import("@cline/llms").BUILT_IN_PROVIDER[];
12
+ getBuiltInProviderIds(): import("@cline/llms").BuiltInProviderId[];
13
13
  getBuiltInProviders(): Promise<BuiltInProviderSummary[]>;
14
14
  getModels(providerId: string): string[];
15
15
  isProviderConfigured(providerId: string): boolean;
@@ -1,18 +1,19 @@
1
- import type { AgentConfig, AgentEvent, AgentHooks, AgentTool, ITelemetryService, ToolApprovalRequest, ToolApprovalResult, WorkspaceInfo } from "@cline/shared";
1
+ import type { AgentConfig, AgentEvent, AgentHooks, AgentTool, BasicLogger, ITelemetryService, ToolApprovalRequest, ToolApprovalResult, WorkspaceInfo } from "@cline/shared";
2
2
  import type { SubAgentEndContext, SubAgentStartContext, TeamEvent } from "../extensions/tools/team";
3
3
  import type { RuntimeCapabilities } from "../runtime/capabilities";
4
- import type { LocalRuntimeStartOptions, StartSessionInput } from "../runtime/host/runtime-host";
4
+ import type { LocalRuntimeStartOptions, ResolvedStartSessionInput } from "../runtime/host/runtime-host";
5
5
  import type { RuntimeBuilderInput } from "../runtime/orchestration/session-runtime";
6
6
  import type { CoreSessionConfig } from "../types/config";
7
7
  import { type ProviderConfig } from "../types/provider-settings";
8
8
  import type { ProviderSettingsManager } from "./storage/provider-settings-manager";
9
9
  import type { GitWorkspaceState } from "./workspace/workspace-manifest";
10
10
  export interface PrepareLocalRuntimeBootstrapOptions {
11
- input: StartSessionInput;
11
+ input: ResolvedStartSessionInput;
12
12
  localRuntime?: LocalRuntimeStartOptions;
13
13
  sessionId: string;
14
14
  providerSettingsManager: ProviderSettingsManager;
15
15
  defaultTelemetry?: ITelemetryService;
16
+ defaultLogger?: BasicLogger;
16
17
  defaultCapabilities?: RuntimeCapabilities;
17
18
  defaultToolPolicies?: AgentConfig["toolPolicies"];
18
19
  /**
@@ -35,7 +36,7 @@ export interface PrepareLocalRuntimeBootstrapOptions {
35
36
  writeSessionMetadata: (metadata: Record<string, unknown>) => Promise<void> | void;
36
37
  }
37
38
  export interface LocalRuntimeBootstrap {
38
- effectiveInput: StartSessionInput;
39
+ effectiveInput: ResolvedStartSessionInput;
39
40
  config: CoreSessionConfig;
40
41
  providerConfig: ProviderConfig;
41
42
  workspaceMetadata: string;
@@ -26,5 +26,10 @@ export declare class SqliteSessionStore implements SessionStore {
26
26
  updateStatus(sessionId: string, status: SessionStatus, exitCode?: number | null): void;
27
27
  get(sessionId: string): SessionRecord | undefined;
28
28
  list(limit?: number): SessionRecord[];
29
+ /**
30
+ * Child sessions — subagent runs and team-task runs — recorded under a
31
+ * parent, oldest first so a caller can present them in spawn order.
32
+ */
33
+ listChildren(parentSessionId: string, limit?: number): SessionRecord[];
29
34
  delete(sessionId: string, cascade?: boolean): boolean;
30
35
  }
@@ -20,6 +20,14 @@ export interface OpenTelemetryProviderOptions extends Omit<OpenTelemetryClientCo
20
20
  export interface CreateOpenTelemetryTelemetryServiceOptions extends OpenTelemetryProviderOptions, Pick<OpenTelemetryAdapterOptions, "name" | "distinctId" | "commonProperties"> {
21
21
  metadata: TelemetryMetadata;
22
22
  logger?: BasicLogger;
23
+ /**
24
+ * Skip the automatic `telemetry.provider_created` event during construction
25
+ * and expose it as {@link ConfiguredTelemetryHandle.emitProviderCreated}
26
+ * instead. Metadata is stamped onto events at capture time, so hosts that
27
+ * resolve identity metadata asynchronously (e.g. over the host bridge) defer
28
+ * the event until that metadata is applied.
29
+ */
30
+ deferProviderCreatedEvent?: boolean;
23
31
  }
24
32
  export declare class OpenTelemetryProvider {
25
33
  readonly meterProvider: MeterProvider | null;
@@ -43,10 +51,12 @@ export declare class OpenTelemetryProvider {
43
51
  export declare function createOpenTelemetryTelemetryService(options: CreateOpenTelemetryTelemetryServiceOptions): {
44
52
  provider: OpenTelemetryProvider;
45
53
  telemetry: ITelemetryService;
54
+ emitProviderCreated: () => void;
46
55
  };
47
56
  export declare function createConfiguredTelemetryService(options: CreateOpenTelemetryTelemetryServiceOptions): {
48
57
  provider?: OpenTelemetryProvider;
49
58
  telemetry: ITelemetryService;
59
+ emitProviderCreated?: () => void;
50
60
  };
51
61
  /**
52
62
  * Telemetry service plus the lifecycle closures (`flush`, `dispose`) every
@@ -72,6 +82,12 @@ export interface ConfiguredTelemetryHandle {
72
82
  flush: () => Promise<void>;
73
83
  /** Disposes the telemetry service and its provider concurrently. */
74
84
  dispose: () => Promise<void>;
85
+ /**
86
+ * Emits the `telemetry.provider_created` event. Only present when the
87
+ * handle was created with `deferProviderCreatedEvent: true` and telemetry
88
+ * is enabled; the host must call it once its identity metadata is applied.
89
+ */
90
+ emitProviderCreated?: () => void;
75
91
  }
76
92
  /**
77
93
  * Builds a {@link ConfiguredTelemetryHandle} so hosts (CLI, VS Code, hub
@@ -1,4 +1,4 @@
1
- import { type CaptureAgentUnexpectedReasoningTokensInput, captureAgentUnexpectedReasoningTokens, type ITelemetryService, type TelemetryProperties } from "@cline/shared";
1
+ import { type CaptureAgentUnexpectedReasoningTokensInput, type CaptureTaskLifecycleEventInput, captureAgentUnexpectedReasoningTokens, captureTaskLifecycleEvent, type ITelemetryService, type TelemetryProperties } from "@cline/shared";
2
2
  import type { CoreCompactionBudgetPolicyIntent, CoreCompactionLiveTailHandling } from "../../types/config";
3
3
  export type TelemetryAgentKind = "root" | "subagent" | "team_lead" | "team_teammate";
4
4
  export interface TelemetryAgentIdentityProperties {
@@ -46,6 +46,11 @@ export declare const CORE_TELEMETRY_EVENTS: {
46
46
  readonly DIFF_EDIT_FAILED: "task.diff_edit_failed";
47
47
  readonly PROVIDER_API_ERROR: "task.provider_api_error";
48
48
  readonly MISTAKE_LIMIT_REACHED: "task.mistake_limit_reached";
49
+ readonly PROVIDER_REQUEST_STARTED: "task.provider_request_started";
50
+ readonly PROVIDER_STREAM_STARTED: "task.provider_stream_started";
51
+ readonly FIRST_CHUNK_RECEIVED: "task.first_chunk_received";
52
+ readonly PROVIDER_STREAM_FAILED: "task.provider_stream_failed";
53
+ readonly CANCELLED: "task.cancelled";
49
54
  readonly MENTION_USED: "task.mention_used";
50
55
  readonly MENTION_FAILED: "task.mention_failed";
51
56
  readonly MENTION_SEARCH_RESULTS: "task.mention_search_results";
@@ -89,7 +94,7 @@ export interface RunCommandsTimeoutTelemetryProperties {
89
94
  iteration?: number;
90
95
  tool_call_id?: string;
91
96
  }
92
- export { captureAgentUnexpectedReasoningTokens, type CaptureAgentUnexpectedReasoningTokensInput, };
97
+ export { captureAgentUnexpectedReasoningTokens, captureTaskLifecycleEvent, type CaptureAgentUnexpectedReasoningTokensInput, type CaptureTaskLifecycleEventInput, };
93
98
  export interface WorkspaceInitializedProperties {
94
99
  root_count: number;
95
100
  vcs_types: ReadonlyArray<string>;
@@ -115,11 +120,19 @@ export declare function captureWorkspaceInitialized(telemetry: ITelemetryService
115
120
  export declare function captureWorkspaceInitError(telemetry: ITelemetryService | undefined, error: Error | string, properties: WorkspaceInitErrorProperties): void;
116
121
  export declare function captureWorkspacePathResolved(telemetry: ITelemetryService | undefined, properties: WorkspacePathResolvedProperties): void;
117
122
  export declare function captureAuthStarted(telemetry: ITelemetryService | undefined, provider?: string): void;
118
- export declare function captureAuthSucceeded(telemetry: ITelemetryService | undefined, provider?: string): void;
119
- export declare function captureAuthFailed(telemetry: ITelemetryService | undefined, provider?: string, errorMessage?: string): void;
123
+ export declare function captureAuthSucceeded(telemetry: ITelemetryService | undefined, provider?: string, details?: {
124
+ sessionId?: string;
125
+ sessionDurationMs?: number;
126
+ }): void;
127
+ export declare function captureAuthFailed(telemetry: ITelemetryService | undefined, provider?: string, errorMessage?: string, details?: {
128
+ requestId?: string;
129
+ }): void;
120
130
  export declare function captureAuthLoggedOut(telemetry: ITelemetryService | undefined, provider?: string, reason?: string, details?: {
121
131
  status?: number;
122
132
  errorCode?: string;
133
+ sessionId?: string;
134
+ sessionDurationMs?: number;
135
+ request_id?: string;
123
136
  }): void;
124
137
  /**
125
138
  * Fires when a token refresh fails for a reason that does NOT invalidate the
@@ -132,8 +145,11 @@ export declare function captureAuthLoggedOut(telemetry: ITelemetryService | unde
132
145
  export declare function captureAuthRefreshSoftFailure(telemetry: ITelemetryService | undefined, provider?: string, details?: {
133
146
  status?: number;
134
147
  errorCode?: string;
148
+ request_id?: string;
135
149
  errorName?: string;
136
150
  tokenExpired?: boolean;
151
+ sessionId?: string;
152
+ sessionDurationMs?: number;
137
153
  }): void;
138
154
  /**
139
155
  * Fires when a run failed with an auth-like error, credentials were
@@ -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 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,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 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,i=t?.size??0,l=h;if(l&&l.path===e&&l.mtimeMs===a&&l.size===i)return l;let r=_(t?k(e):o());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 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 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?{[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),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 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 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,me as createConfiguredTelemetryHandle,T as OpenTelemetryProvider,b as OpenTelemetryAdapter};
1
+ import{existsSync as U,mkdirSync as r,readFileSync as k,writeFileSync as w}from"node:fs";import{resolve as C}from"node:path";import{resolveSessionDataDir as E}from"@cline/shared/storage";import{nanoid as q}from"nanoid";import*as b from"node-machine-id";var N="machine-id";function H(f){let P=f?.trim();if(P)return P;let T=z();if(T)return T;return D()}function c(){let f=b;return f.machineIdSync??f.default?.machineIdSync}function z(){try{let f=c();if(!f)return;return f().trim()||void 0}catch{return}}function D(){let f=E(),P=C(f,N);try{if(U(P)){let h=k(P,"utf8").trim();if(h.length>0)return h}}catch{}let T=`cl-${q()}`;try{r(f,{recursive:!0}),w(P,T,"utf8")}catch{}return T}class L{name;metadata;meter;logger;enabled;distinctId;commonProperties;counters=new Map;histograms=new Map;gauges=new Map;gaugeValues=new Map;meterProvider;loggerProvider;constructor(f){this.name=f.name??"OpenTelemetryAdapter",this.metadata={...f.metadata},this.meterProvider=f.meterProvider,this.loggerProvider=f.loggerProvider,this.meter=f.meterProvider?.getMeter("cline")??null,this.logger=f.loggerProvider?.getLogger("cline")??null,this.enabled=f.enabled??!0,this.distinctId=f.distinctId,this.commonProperties=f.commonProperties?{...f.commonProperties}:{}}emit(f,P){if(!this.isEnabled())return;this.emitLog(f,P,!1)}emitRequired(f,P){this.emitLog(f,P,!0)}recordCounter(f,P,T,h,m=!1){if(!this.meter||!m&&!this.isEnabled())return;let A=this.counters.get(f);if(!A)A=this.meter.createCounter(f,h?{description:h}:void 0),this.counters.set(f,A);A.add(P,this.flattenProperties(this.buildAttributes(T)))}recordHistogram(f,P,T,h,m=!1){if(!this.meter||!m&&!this.isEnabled())return;let A=this.histograms.get(f);if(!A)A=this.meter.createHistogram(f,h?{description:h}:void 0),this.histograms.set(f,A);A.record(P,this.flattenProperties(this.buildAttributes(T)))}recordGauge(f,P,T,h,m=!1){if(!this.meter||!m&&!this.isEnabled())return;let A=this.buildAttributes(T),u=JSON.stringify(A),g=this.gaugeValues.get(f);if(P===null){if(g){if(g.delete(u),g.size===0)this.gaugeValues.delete(f),this.gauges.delete(f)}return}let O=g;if(!O)O=new Map,this.gaugeValues.set(f,O);if(!this.gauges.has(f)){let M=this.meter.createObservableGauge(f,h?{description:h}:void 0);M.addCallback((J)=>{for(let I of this.snapshotGaugeSeries(f))J.observe(I.value,this.flattenProperties(I.attributes))}),this.gauges.set(f,M)}O.set(u,{value:P,attributes:A})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}setDistinctId(f){this.distinctId=f}setCommonProperties(f){this.commonProperties={...f}}updateCommonProperties(f){this.commonProperties={...this.commonProperties,...f}}async flush(){await Promise.all([this.meterProvider?.forceFlush?.(),this.loggerProvider?.forceFlush?.()])}async dispose(){await Promise.all([this.meterProvider?.shutdown?.(),this.loggerProvider?.shutdown?.()])}emitLog(f,P,T){if(!this.logger)return;let h=this.flattenProperties(this.buildAttributes(P,T));this.logger.emit({severityText:"INFO",body:f,attributes:h})}buildAttributes(f,P=!1){return{...this.commonProperties,...this.metadata,...f,...this.distinctId?{distinct_id:this.distinctId}:{},...P?{_required:!0}:{}}}snapshotGaugeSeries(f){let P=this.gaugeValues.get(f);if(!P)return[];return Array.from(P.values(),(T)=>({value:T.value,attributes:T.attributes?{...T.attributes}:void 0}))}flattenProperties(f,P="",T=new WeakSet,h=0){if(!f)return{};let m={},A=100,u=10;for(let[g,O]of Object.entries(f)){if(g==="__proto__"||g==="constructor"||g==="prototype")continue;let M=P?`${P}.${g}`:g;if(O===null||O===void 0){m[M]=String(O);continue}if(Array.isArray(O)){let J=O.length>A?O.slice(0,A):O;try{m[M]=JSON.stringify(J)}catch{m[M]="[UnserializableArray]"}if(O.length>A)m[`${M}_truncated`]=!0,m[`${M}_original_length`]=O.length;continue}if(typeof O==="object"){if(O instanceof Date){m[M]=O.toISOString();continue}if(O instanceof Error){m[M]=O.message;continue}if(T.has(O)){m[M]="[Circular]";continue}if(h>=u){m[M]="[MaxDepthExceeded]";continue}T.add(O),Object.assign(m,this.flattenProperties(O,M,T,h+1));continue}if(G(O)){m[M]=O;continue}try{m[M]=JSON.stringify(O)}catch{m[M]=String(O)}}return m}}function G(f){return typeof f==="string"||typeof f==="number"||typeof f==="boolean"}import{metrics as p,trace as s}from"@opentelemetry/api";import{logs as o}from"@opentelemetry/api-logs";import{OTLPLogExporter as ff}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as Pf}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as Tf}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as hf}from"@opentelemetry/resources";import{BatchLogRecordProcessor as mf,ConsoleLogRecordExporter as Af,LoggerProvider as Of}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as uf,MeterProvider as Mf,PeriodicExportingMetricReader as Z}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as gf,ConsoleSpanExporter as yf,SimpleSpanProcessor as Hf}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as Lf}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as jf,ATTR_SERVICE_VERSION as $f}from"@opentelemetry/semantic-conventions";import{mkdirSync as cf,readFileSync as x,statSync as d,writeFileSync as zf}from"node:fs";import{resolveGlobalSettingsPath as S}from"@cline/shared/storage";import{z as y}from"zod";import{AGENT_UNEXPECTED_REASONING_TOKENS_EVENT as vf,captureAgentUnexpectedReasoningTokens as Ff,captureTaskLifecycleEvent as Qf,SDK_ERROR_TELEMETRY_EVENT as Uf,TASK_CANCELLED_EVENT as rf,TASK_FIRST_CHUNK_RECEIVED_EVENT as kf,TASK_PROVIDER_REQUEST_STARTED_EVENT as wf,TASK_PROVIDER_STREAM_FAILED_EVENT as Cf,TASK_PROVIDER_STREAM_STARTED_EVENT as Ef}from"@cline/shared";var V=y.preprocess((f)=>Array.isArray(f)?f.filter((P)=>typeof P==="string").map((P)=>P.trim()).filter(Boolean):void 0,y.array(y.string()).optional()).transform((f)=>{if(!f)return;let P=[...new Set(f)].sort((T,h)=>T.localeCompare(h));return P.length>0?P:void 0}),a=y.enum(["basic","agentic"]).catch("agentic"),i=y.enum(["plan","act"]),X=y.object({telemetryOptOut:y.boolean().default(!1).catch(!1),autoUpdateEnabled:y.boolean().default(!0).catch(!0),compactionStrategy:a.optional(),compactionEnabled:y.boolean().optional().catch(void 0),planActMode:i.optional().catch(void 0),toolAutoApprove:y.boolean().optional().catch(void 0),disabledTools:V.optional(),disabledPlugins:V.optional()}).strip().transform((f)=>{let P={autoUpdateEnabled:f.autoUpdateEnabled,telemetryOptOut:f.telemetryOptOut};if(f.compactionStrategy)P.compactionStrategy=f.compactionStrategy;if(f.compactionEnabled!==void 0)P.compactionEnabled=f.compactionEnabled;if(f.planActMode)P.planActMode=f.planActMode;if(f.toolAutoApprove!==void 0)P.toolAutoApprove=f.toolAutoApprove;if(f.disabledTools?.length)P.disabledTools=f.disabledTools;if(f.disabledPlugins?.length)P.disabledPlugins=f.disabledPlugins;return P});function j(){return X.parse({})}var R;function l(f){if(f.disabledTools)Object.freeze(f.disabledTools);if(f.disabledPlugins)Object.freeze(f.disabledPlugins);return Object.freeze(f)}function n(f){let P;try{P=x(f,"utf8")}catch{return j()}try{let T=X.safeParse(JSON.parse(P));return T.success?T.data:j()}catch{return j()}}function t(){let f=S(),P=d(f,{throwIfNoEntry:!1}),T=P?.mtimeMs??0,h=P?.size??0,m=R;if(m&&m.path===f&&m.mtimeMs===T&&m.size===h)return m;let A=l(P?n(f):j());return R={path:f,mtimeMs:T,size:h,value:A},R}function e(){return t().value}function Y(){return e().telemetryOptOut}class W{name;logger;enabled;constructor(f={}){this.name=f.name??"TelemetryLoggerSink",this.logger=f.logger,this.enabled=f.enabled??!0}emit(f,P){if(!this.isEnabled())return;this.logger?.log("telemetry.event",{telemetrySink:this.name,event:f,properties:P})}emitRequired(f,P){this.logger?.log("telemetry.required_event",{telemetrySink:this.name,severity:"warn",event:f,properties:P})}recordCounter(f,P,T,h,m){if(!m&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:f,value:P,attributes:T,description:h,required:m===!0})}recordHistogram(f,P,T,h,m){if(!m&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:f,value:P,attributes:T,description:h,required:m===!0})}recordGauge(f,P,T,h,m){if(!m&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:f,value:P,attributes:T,description:h,required:m===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class ${adapters;metadata;distinctId;commonProperties;constructor(f={}){if(this.adapters=[...f.adapters??[]],f.logger)this.adapters.push(new W({logger:f.logger}));this.metadata={...f.metadata??{}},this.distinctId=f.distinctId,this.commonProperties={...f.commonProperties??{}}}addAdapter(f){this.adapters.push(f)}setDistinctId(f){this.distinctId=f}setMetadata(f){this.metadata={...f}}updateMetadata(f){this.metadata={...this.metadata,...f}}setCommonProperties(f){this.commonProperties={...f}}updateCommonProperties(f){this.commonProperties={...this.commonProperties,...f}}isEnabled(){return this.adapters.some((f)=>f.isEnabled())}capture(f){let P=this.buildAttributes(f.properties);for(let T of this.adapters)T.emit(f.event,P)}captureRequired(f,P){let T=this.buildAttributes(P);for(let h of this.adapters)h.emitRequired(f,T)}recordCounter(f,P,T,h,m=!1){let A=this.buildAttributes(T);for(let u of this.adapters)u.recordCounter(f,P,A,h,m)}recordHistogram(f,P,T,h,m=!1){let A=this.buildAttributes(T);for(let u of this.adapters)u.recordHistogram(f,P,A,h,m)}recordGauge(f,P,T,h,m=!1){let A=this.buildAttributes(T);for(let u of this.adapters)u.recordGauge(f,P,A,h,m)}async flush(){await Promise.all(this.adapters.map((f)=>f.flush()))}async dispose(){await Promise.all(this.adapters.map((f)=>f.dispose()))}buildAttributes(f){return{...this.commonProperties,...f,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class v{distinctId;metadata;commonProperties;constructor(f={}){this.distinctId=f.distinctId,this.metadata={...f.metadata??{}},this.commonProperties={...f.commonProperties??{}}}setDistinctId(f){this.distinctId=f}setMetadata(f){this.metadata={...f}}updateMetadata(f){this.metadata={...this.metadata,...f}}setCommonProperties(f){this.commonProperties={...f}}updateCommonProperties(f){this.commonProperties={...this.commonProperties,...f}}isEnabled(){return!1}capture(f){this.resolveProperties(f.properties)}captureRequired(f,P){this.resolveProperties(P)}recordCounter(){}recordHistogram(){}recordGauge(){}async flush(){}async dispose(){}resolveProperties(f){return{...this.commonProperties,...f,...this.metadata,...this.distinctId?{distinct_id:this.distinctId}:{}}}}class B{meterProvider;loggerProvider;tracerProvider;options;constructor(f={}){this.options=f;let P=hf({[jf]:f.serviceName??"cline",...f.serviceVersion?{[$f]:f.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(P),this.loggerProvider=this.createLoggerProvider(P),this.tracerProvider=this.createTracerProvider(P),this.meterProvider)p.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)o.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(f="cline",P){return s.getTracer(f,P??this.options.serviceVersion)}createAdapter(f){return new L({...f,meterProvider:this.meterProvider,loggerProvider:this.loggerProvider})}createTelemetryService(f){let P=this.createAdapter({name:f.name,enabled:this.options.enabled,metadata:f.metadata});return new $({...f,adapters:[P],distinctId:H(f.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(f){let P=_(this.options.metricsExporter);if(P.length===0)return null;let T=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),h=Math.min(30000,Math.floor(T*0.8)),m=P.map((A)=>_f(A,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:T,timeout:h})).filter((A)=>A!==null);if(m.length===0)return null;return new Mf({resource:f,readers:m})}createTracerProvider(f){let P=_(this.options.tracesExporter);if(P.length===0)return null;let T=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,h=this.options.otlpTracesHeaders??this.options.otlpHeaders,m=[];for(let A of P){let u=Wf(A,{endpoint:T,headers:h,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(u)m.push(u)}if(m.length===0)return null;return new Lf({resource:f,spanProcessors:m})}createLoggerProvider(f){let P=_(this.options.logsExporter);if(P.length===0)return null;let T=P.map((h)=>{let m=Rf(h,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!m)return null;return new mf(m,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((h)=>h!==null);if(T.length===0)return null;return new Of({resource:f,processors:T})}}function F(f){let P=new B(f),T=P.createTelemetryService(f),h=()=>{T.captureRequired("telemetry.provider_created",{provider:"opentelemetry",enabled:f.enabled??!0,logsExporter:Array.isArray(f.logsExporter)?f.logsExporter.join(","):f.logsExporter,metricsExporter:Array.isArray(f.metricsExporter)?f.metricsExporter.join(","):f.metricsExporter,tracesExporter:Array.isArray(f.tracesExporter)?f.tracesExporter.join(","):f.tracesExporter,otlpProtocol:f.otlpProtocol,hasOtlpEndpoint:Boolean(f.otlpEndpoint),serviceName:f.serviceName,serviceVersion:f.serviceVersion})};if(!f.deferProviderCreatedEvent)h();return{provider:P,telemetry:T,emitProviderCreated:h}}function Q(f){if(Y())return{telemetry:new v(f)};if(f.enabled!==!0)return{telemetry:new $({...f,distinctId:H(f.distinctId)})};return F(f)}function Jf(f){let{telemetry:P,provider:T,emitProviderCreated:h}=Q(f);return{telemetry:P,provider:T,flush:async()=>{let u=T;if(u&&typeof u.forceFlush==="function")try{await u.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([P.dispose(),T?.dispose()])},...f.deferProviderCreatedEvent&&h?{emitProviderCreated:h}:{}}}function _(f){if(!f)return[];return(Array.isArray(f)?f:f.split(",")).map((T)=>T.trim()).filter((T)=>T==="console"||T==="otlp")}function Rf(f,P){if(f==="console")return new Af;if(!P.endpoint)return null;let T=K(P.endpoint,"/v1/logs");return new ff({url:T,headers:P.headers})}function Wf(f,P){if(f==="console")return new Hf(new yf);if(!P.endpoint)return null;let T=K(P.endpoint,"/v1/traces");return new gf(new Tf({url:T,headers:P.headers}))}function _f(f,P){if(f==="console")return new Z({exporter:new uf,exportIntervalMillis:P.interval,exportTimeoutMillis:P.timeout});if(!P.endpoint)return null;let T=K(P.endpoint,"/v1/metrics");return new Z({exporter:new Pf({url:T,headers:P.headers}),exportIntervalMillis:P.interval,exportTimeoutMillis:P.timeout})}function K(f,P){let T=new URL(f),h=T.pathname.endsWith("/")?T.pathname.slice(0,-1):T.pathname;return T.pathname=h.endsWith(P)?h:`${h}${P}`,T.toString()}export{H as resolveCoreDistinctId,F as createOpenTelemetryTelemetryService,Q as createConfiguredTelemetryService,Jf as createConfiguredTelemetryHandle,B as OpenTelemetryProvider,L as OpenTelemetryAdapter};
@@ -0,0 +1,9 @@
1
+ import type { RuntimeSessionConfig, StartSessionConfig } from "../../runtime/host/runtime-host";
2
+ /**
3
+ * Ensure the shared chat workspace exists and is seeded with the rules file
4
+ * that tells the agent how to behave in a project-less session. The rules
5
+ * file is only written when missing so users can edit it.
6
+ */
7
+ export declare function ensureChatWorkspace(): Promise<string>;
8
+ /** Resolve the optional workspace fields at the execution-host boundary. */
9
+ export declare function resolveStartSessionWorkspace(config: StartSessionConfig): Promise<RuntimeSessionConfig>;
@@ -38,6 +38,16 @@ export declare const ChatMessageRoleSchema: z.ZodEnum<{
38
38
  status: "status";
39
39
  system: "system";
40
40
  }>;
41
+ export declare const ChatMessageImageSchema: z.ZodObject<{
42
+ id: z.ZodString;
43
+ mediaType: z.ZodEnum<{
44
+ "image/gif": "image/gif";
45
+ "image/jpeg": "image/jpeg";
46
+ "image/png": "image/png";
47
+ "image/webp": "image/webp";
48
+ }>;
49
+ data: z.ZodString;
50
+ }, z.core.$strip>;
41
51
  export declare const ChatMessageSchema: z.ZodObject<{
42
52
  id: z.ZodString;
43
53
  sessionId: z.ZodNullable<z.ZodString>;
@@ -50,6 +60,16 @@ export declare const ChatMessageSchema: z.ZodObject<{
50
60
  system: "system";
51
61
  }>;
52
62
  content: z.ZodString;
63
+ images: z.ZodOptional<z.ZodArray<z.ZodObject<{
64
+ id: z.ZodString;
65
+ mediaType: z.ZodEnum<{
66
+ "image/gif": "image/gif";
67
+ "image/jpeg": "image/jpeg";
68
+ "image/png": "image/png";
69
+ "image/webp": "image/webp";
70
+ }>;
71
+ data: z.ZodString;
72
+ }, z.core.$strip>>>;
53
73
  createdAt: z.ZodNumber;
54
74
  meta: z.ZodOptional<z.ZodObject<{
55
75
  stream: z.ZodOptional<z.ZodEnum<{
@@ -124,6 +144,16 @@ export declare const ChatViewStateSchema: z.ZodObject<{
124
144
  system: "system";
125
145
  }>;
126
146
  content: z.ZodString;
147
+ images: z.ZodOptional<z.ZodArray<z.ZodObject<{
148
+ id: z.ZodString;
149
+ mediaType: z.ZodEnum<{
150
+ "image/gif": "image/gif";
151
+ "image/jpeg": "image/jpeg";
152
+ "image/png": "image/png";
153
+ "image/webp": "image/webp";
154
+ }>;
155
+ data: z.ZodString;
156
+ }, z.core.$strip>>>;
127
157
  createdAt: z.ZodNumber;
128
158
  meta: z.ZodOptional<z.ZodObject<{
129
159
  stream: z.ZodOptional<z.ZodEnum<{
@@ -158,6 +188,7 @@ export declare const ChatViewStateSchema: z.ZodObject<{
158
188
  }, z.core.$strip>;
159
189
  export type ChatSessionConfig = z.infer<typeof ChatSessionConfigSchema>;
160
190
  export type ChatSessionStatus = z.infer<typeof ChatSessionStatusSchema>;
191
+ export type ChatMessageImage = z.infer<typeof ChatMessageImageSchema>;
161
192
  export type ChatMessage = z.infer<typeof ChatMessageSchema>;
162
193
  export type ChatSummary = z.infer<typeof ChatSummarySchema>;
163
194
  export type ChatViewState = z.infer<typeof ChatViewStateSchema>;
@@ -213,3 +213,11 @@ export interface CoreSessionConfig extends CoreModelConfig, CoreRuntimeFeatures,
213
213
  skills?: string[];
214
214
  workspaceMetadata?: string;
215
215
  }
216
+ /**
217
+ * Public ClineCore start configuration. The execution host resolves `cwd`
218
+ * before constructing a runtime, assigning the shared chat workspace when both
219
+ * workspace paths are omitted.
220
+ */
221
+ export type ClineCoreStartConfig = Omit<CoreSessionConfig, "cwd"> & {
222
+ cwd?: string;
223
+ };
package/dist/types.d.ts CHANGED
@@ -16,8 +16,8 @@ export type { SandboxCallOptions, SubprocessSandboxOptions, } from "./runtime/to
16
16
  export { SubprocessSandbox } from "./runtime/tools/subprocess-sandbox";
17
17
  export { FeatureFlagsService, type FeatureFlagsServiceOptions, NoOpFeatureFlagsProvider, } from "./services/feature-flags";
18
18
  export type { GlobalSettings } from "./services/global-settings";
19
- export { filterDisabledPluginPaths, filterDisabledTools, filterExtensionToolRegistrations, GlobalSettingsSchema, isAutoUpdateEnabledGlobally, isPluginDisabledGlobally, isTelemetryOptedOutGlobally, isToolDisabledGlobally, readCompactionStrategyGlobally, readGlobalSettings, resolveDisabledPluginPaths, resolveDisabledToolNames, setAutoUpdateEnabledGlobally, setCompactionStrategyGlobally, setDisabledPlugin, setDisabledTools, setTelemetryOptOutGlobally, toggleDisabledTool, writeGlobalSettings, } from "./services/global-settings";
20
- export type { GlobalCompactionStrategy } from "./services/global-settings";
19
+ export { filterDisabledPluginPaths, filterDisabledTools, filterExtensionToolRegistrations, GlobalSettingsSchema, isAutoUpdateEnabledGlobally, isPluginDisabledGlobally, isTelemetryOptedOutGlobally, isToolDisabledGlobally, readCompactionModeGlobally, readCompactionStrategyGlobally, readGlobalSettings, readPlanActModeGlobally, readToolAutoApproveGlobally, resolveDisabledPluginPaths, resolveDisabledToolNames, setAutoUpdateEnabledGlobally, setCompactionModeGlobally, setCompactionStrategyGlobally, setDisabledPlugin, setDisabledTools, setPlanActModeGlobally, setTelemetryOptOutGlobally, setToolAutoApproveGlobally, toggleDisabledTool, writeGlobalSettings, } from "./services/global-settings";
20
+ export type { GlobalCompactionMode, GlobalCompactionStrategy, GlobalPlanActMode, } from "./services/global-settings";
21
21
  export type { ListPluginToolsResult, PluginToolSummary, } from "./services/plugin-tools";
22
22
  export { listPluginTools, listPluginToolsWithDiagnostics, } from "./services/plugin-tools";
23
23
  export type { WorkspaceManager, WorkspaceManagerEvent, } from "./services/workspace/workspace-manager";
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.65",
4
+ "version": "0.0.66",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/cline/cline",
@@ -42,15 +42,16 @@
42
42
  "typecheck:smoke": "bun tsc -p tsconfig.smoke.json --noEmit",
43
43
  "test": "bun run test:unit && bun run test:e2e",
44
44
  "test:live": "vitest run --config vitest.config.ts src/extensions/context/compaction.live.test.ts",
45
+ "test:compaction": "bun --conditions=development run scripts/compact-session.ts",
45
46
  "test:unit": "vitest run --config vitest.config.ts",
46
47
  "test:e2e": "vitest run --config vitest.e2e.config.ts",
47
48
  "verify:routines": "zsh -lc 'bunx vitest run src/cron/schedule-service.test.ts --config vitest.config.ts'",
48
49
  "test:watch": "vitest --config vitest.config.ts"
49
50
  },
50
51
  "dependencies": {
51
- "@cline/agents": "0.0.65",
52
- "@cline/shared": "0.0.65",
53
- "@cline/llms": "0.0.65",
52
+ "@cline/agents": "0.0.66",
53
+ "@cline/shared": "0.0.66",
54
+ "@cline/llms": "0.0.66",
54
55
  "@modelcontextprotocol/sdk": "^1.29.0",
55
56
  "@opentelemetry/api": "^1.9.0",
56
57
  "@opentelemetry/api-logs": "^0.214.0",