@cline/core 0.0.75 → 0.0.76
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/cron/service/schedule-command-service.d.ts +6 -1
- package/dist/cron/service/schedule-service.d.ts +1 -0
- package/dist/cron/service/schedule-tool.d.ts +81 -0
- package/dist/cron/store/sqlite-cron-store.d.ts +1 -0
- package/dist/extensions/config/index.d.ts +1 -1
- package/dist/extensions/config/runtime-commands.d.ts +12 -1
- package/dist/extensions/config/user-instruction-service.d.ts +2 -2
- package/dist/extensions/tools/executors/bash.d.ts +32 -0
- package/dist/extensions/tools/executors/index.d.ts +1 -0
- package/dist/extensions/tools/executors/run-command-execution-controller.d.ts +16 -0
- package/dist/extensions/tools/index.d.ts +2 -2
- package/dist/extensions/tools/runtime.d.ts +9 -0
- package/dist/hooks/subprocess.d.ts +6 -0
- package/dist/hub/client/index.d.ts +4 -1
- package/dist/hub/client/session-client.d.ts +14 -1
- package/dist/hub/daemon/entry.js +368 -202
- package/dist/hub/index.d.ts +2 -0
- package/dist/hub/index.js +363 -197
- package/dist/hub/runtime-host/hub-runtime-host.d.ts +1 -0
- package/dist/hub/server/browser-websocket.d.ts +5 -2
- package/dist/hub/server/command-transport.d.ts +9 -2
- package/dist/hub/server/handlers/context.d.ts +7 -3
- package/dist/hub/server/handlers/run-handlers.d.ts +1 -0
- package/dist/hub/server/handlers/session-handlers.d.ts +4 -0
- package/dist/hub/server/hub-server-options.d.ts +7 -2
- package/dist/hub/server/hub-server-transport.d.ts +8 -1
- package/dist/hub/server/native-transport.d.ts +3 -3
- package/dist/hub/server/task-command-service.d.ts +11 -0
- package/dist/index.d.ts +10 -8
- package/dist/index.js +361 -195
- package/dist/runtime/config/agent-runtime-config-builder.d.ts +5 -0
- package/dist/runtime/host/local-runtime-host.d.ts +2 -0
- package/dist/runtime/host/runtime-host.d.ts +3 -0
- package/dist/runtime/orchestration/runtime-event-adapter.d.ts +2 -0
- package/dist/runtime/orchestration/session-runtime.d.ts +2 -1
- package/dist/runtime/process-start-token.d.ts +23 -0
- package/dist/services/global-settings.d.ts +3 -3
- package/dist/services/llms/cline-recommended-models.d.ts +33 -0
- package/dist/services/llms/provider-defaults.d.ts +8 -0
- package/dist/services/providers/local-provider-registry.d.ts +85 -4
- package/dist/services/providers/local-provider-service.d.ts +27 -1
- package/dist/services/storage/provider-settings-manager.d.ts +3 -1
- package/dist/services/telemetry/index.js +1 -1
- package/dist/tasks/agenda-task-api.d.ts +20 -0
- package/dist/tasks/agenda-task-manager.d.ts +102 -0
- package/dist/tasks/agenda-task-tool.d.ts +94 -0
- package/dist/tasks/index.d.ts +9 -0
- package/dist/tasks/specs/task-spec-file-store.d.ts +38 -0
- package/dist/tasks/specs/task-spec-parser.d.ts +65 -0
- package/dist/tasks/store/sqlite-task-store.d.ts +73 -0
- package/dist/tasks/store/task-schema.d.ts +2 -0
- package/dist/tasks/task-location.d.ts +14 -0
- package/dist/tasks/task-tool.d.ts +134 -0
- package/dist/types/provider-settings.d.ts +10 -0
- package/package.json +4 -4
|
@@ -49,6 +49,11 @@ export interface CreateAgentRuntimeConfigInput {
|
|
|
49
49
|
readonly prepareTurn?: (context: AgentRuntimePrepareTurnContext) => Promise<AgentRuntimePrepareTurnResult | undefined> | AgentRuntimePrepareTurnResult | undefined;
|
|
50
50
|
/** Seed messages (usually `session.conversation.getMessages()`). */
|
|
51
51
|
readonly initialMessages?: readonly AgentMessage[];
|
|
52
|
+
/**
|
|
53
|
+
* Optional completion-policy override. Pass `null` for model modes that
|
|
54
|
+
* cannot call tools (for example image generation).
|
|
55
|
+
*/
|
|
56
|
+
readonly completionPolicy?: AgentRuntimeConfig["completionPolicy"] | null;
|
|
52
57
|
/**
|
|
53
58
|
* Override for `AgentRuntimeConfig.systemPrompt` — useful when
|
|
54
59
|
* the caller has composed additional guidance (e.g. via
|
|
@@ -53,6 +53,7 @@ export declare class LocalRuntimeHost implements RuntimeHost {
|
|
|
53
53
|
private readonly pendingPromptsController;
|
|
54
54
|
private readonly eventBridge;
|
|
55
55
|
private readonly sessionVersioning;
|
|
56
|
+
private readonly runCommandExecutionController;
|
|
56
57
|
constructor(options: LocalRuntimeHostOptions);
|
|
57
58
|
private applyInitialOAuthCredentials;
|
|
58
59
|
startSession(input: StartSessionInput): Promise<StartSessionResult>;
|
|
@@ -61,6 +62,7 @@ export declare class LocalRuntimeHost implements RuntimeHost {
|
|
|
61
62
|
runTurn(input: SendSessionInput): Promise<AgentResult | undefined>;
|
|
62
63
|
getAccumulatedUsage(sessionId: string): Promise<SessionUsageSummary | undefined>;
|
|
63
64
|
abort(sessionId: string, reason?: unknown): Promise<void>;
|
|
65
|
+
proceedWhileRunning(sessionId: string, toolCallId?: string): Promise<number>;
|
|
64
66
|
stopSession(sessionId: string): Promise<void>;
|
|
65
67
|
dispose(reason?: string): Promise<void>;
|
|
66
68
|
getSession(sessionId: string): Promise<SessionRecord | undefined>;
|
|
@@ -157,6 +157,9 @@ export interface SessionModelRuntimeService {
|
|
|
157
157
|
export interface SessionConnectionRuntimeService {
|
|
158
158
|
updateSessionConnection(sessionId: string, updates: SessionConnectionUpdate): Promise<void>;
|
|
159
159
|
}
|
|
160
|
+
export interface CommandExecutionRuntimeService {
|
|
161
|
+
proceedWhileRunning(sessionId: string, toolCallId?: string): Promise<number>;
|
|
162
|
+
}
|
|
160
163
|
export interface RuntimeHostSubscribeOptions {
|
|
161
164
|
sessionId?: string;
|
|
162
165
|
}
|
|
@@ -28,6 +28,8 @@
|
|
|
28
28
|
* accumulated } (per delta)
|
|
29
29
|
* reasoning deltas → content_start { contentType:"reasoning",
|
|
30
30
|
* reasoning, redacted } (per delta)
|
|
31
|
+
* assistant-media → content_end { contentType:"media", media }
|
|
32
|
+
* at the original stream position
|
|
31
33
|
* assistant-message → one content_end { contentType:"text", text }
|
|
32
34
|
* if any text parts; one
|
|
33
35
|
* content_end { contentType:"reasoning", reasoning }
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { AgentConfig, AgentEvent, AgentHooks, AgentResult, AgentTool, BasicLogger, ITelemetryService, ModelTool, RuntimeConfigExtensionKind, ToolApprovalRequest, ToolApprovalResult } from "@cline/shared";
|
|
2
2
|
import type { UserInstructionConfigService } from "../../extensions/config";
|
|
3
|
-
import type { ToolExecutors } from "../../extensions/tools";
|
|
3
|
+
import type { RunCommandExecutionController, ToolExecutors } from "../../extensions/tools";
|
|
4
4
|
import type { AgentTeamsRuntime, DelegatedAgentConfigProvider, SubAgentEndContext, SubAgentStartContext, TeamEvent } from "../../extensions/tools/team";
|
|
5
5
|
import type { WorkspaceManager } from "../../services/workspace/workspace-manager";
|
|
6
6
|
import type { CoreSessionConfig } from "../../types/config";
|
|
@@ -44,6 +44,7 @@ export interface RuntimeBuilderInput {
|
|
|
44
44
|
pluginSkillDirectories?: ReadonlyArray<string>;
|
|
45
45
|
configExtensions?: RuntimeConfigExtensionKind[];
|
|
46
46
|
toolExecutors?: Partial<ToolExecutors>;
|
|
47
|
+
runCommandExecutionController?: RunCommandExecutionController;
|
|
47
48
|
toolPolicies?: CoreSessionConfig["toolPolicies"];
|
|
48
49
|
workspaceManager?: WorkspaceManager;
|
|
49
50
|
logger?: BasicLogger;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type ProcessStartTokenProbeResult = {
|
|
2
|
+
status: "found";
|
|
3
|
+
token: string;
|
|
4
|
+
} | {
|
|
5
|
+
status: "missing";
|
|
6
|
+
} | {
|
|
7
|
+
status: "unavailable";
|
|
8
|
+
};
|
|
9
|
+
export declare function parseLinuxProcessStartToken(stat: string, bootId: string): string | undefined;
|
|
10
|
+
/** Distinguishes an absent process from an unavailable identity probe. */
|
|
11
|
+
export declare function probeProcessStartToken(pid: number): ProcessStartTokenProbeResult;
|
|
12
|
+
/**
|
|
13
|
+
* Returns a token for one generation of a process ID.
|
|
14
|
+
*
|
|
15
|
+
* A PID alone is not an identity because the operating system can reuse it
|
|
16
|
+
* after a process exits. The token is derived from the kernel-reported process
|
|
17
|
+
* start time so callers can distinguish a live process from a later process
|
|
18
|
+
* that inherited the same PID.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getProcessStartToken(pid: number): string | undefined;
|
|
21
|
+
/** Non-blocking probe for latency-sensitive runtime paths. */
|
|
22
|
+
export declare function probeProcessStartTokenAsync(pid: number): Promise<ProcessStartTokenProbeResult>;
|
|
23
|
+
export declare function getProcessStartTokenAsync(pid: number): Promise<string | undefined>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AgentConfig, type AgentTool, type
|
|
1
|
+
import { type AgentConfig, type AgentTool, type ConfigurableModelToolName, type ITelemetryService, type ModelToolSettings } from "@cline/shared";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
declare const GlobalCompactionStrategySchema: z.ZodCatch<z.ZodEnum<{
|
|
4
4
|
basic: "basic";
|
|
@@ -94,8 +94,8 @@ export declare function resolveDisabledToolNames(disabledToolNames?: ReadonlyArr
|
|
|
94
94
|
export declare function resolveDisabledPluginPaths(disabledPluginPaths?: ReadonlyArray<string>): Set<string>;
|
|
95
95
|
export declare function isToolDisabledGlobally(toolName: string): boolean;
|
|
96
96
|
export declare function resolveModelToolSettings(): ModelToolSettings;
|
|
97
|
-
export declare function isModelToolEnabledGlobally(name:
|
|
98
|
-
export declare function setModelToolEnabledGlobally(name:
|
|
97
|
+
export declare function isModelToolEnabledGlobally(name: ConfigurableModelToolName): boolean;
|
|
98
|
+
export declare function setModelToolEnabledGlobally(name: ConfigurableModelToolName, enabled: boolean): void;
|
|
99
99
|
export declare function toggleDisabledTool(toolName: string): boolean;
|
|
100
100
|
export declare function setDisabledTools(toolNames: ReadonlyArray<string>, disabledValue: boolean): void;
|
|
101
101
|
export declare function setToolDisabledGlobally(toolName: string, disabled: boolean): boolean;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ProviderModel } from "@cline/shared";
|
|
1
2
|
import { ProviderSettingsManager } from "../storage/provider-settings-manager";
|
|
2
3
|
import type { ModelInfo } from "./provider-settings";
|
|
3
4
|
export interface ClineRecommendedModel {
|
|
@@ -26,4 +27,36 @@ export interface FetchClineRecommendedModelsOptions {
|
|
|
26
27
|
}
|
|
27
28
|
export declare const FALLBACK_CLINE_RECOMMENDED_MODELS: ClineRecommendedModelsData;
|
|
28
29
|
export declare function fetchClineRecommendedModels(options?: FetchClineRecommendedModelsOptions): Promise<ClineRecommendedModelsData>;
|
|
30
|
+
/**
|
|
31
|
+
* `fetchClineRecommendedModels` with a shared in-memory cache, for callers on
|
|
32
|
+
* the model-list path (every picker open) where a per-call network round-trip
|
|
33
|
+
* — or its 5s offline timeout — is unacceptable. The bundled offline fallback
|
|
34
|
+
* is cached too: paying the timeout once per TTL beats paying it on every
|
|
35
|
+
* model list while offline, and a recovered network is picked up within the
|
|
36
|
+
* TTL.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getCachedClineRecommendedModels(options?: FetchClineRecommendedModelsOptions): Promise<ClineRecommendedModelsData>;
|
|
39
|
+
/**
|
|
40
|
+
* Synchronous, never-blocking view of the feed: the cached live data when
|
|
41
|
+
* fresh, otherwise the bundled fallback. For callers that build model lists
|
|
42
|
+
* eagerly and must not wait on the network (the provider catalog at startup),
|
|
43
|
+
* so even a cold boot renders tiered sections instead of a flat list. The
|
|
44
|
+
* async `getCachedClineRecommendedModels` path refreshes the cache, after
|
|
45
|
+
* which peeks serve live data for the TTL.
|
|
46
|
+
*/
|
|
47
|
+
export declare function peekClineRecommendedModels(): ClineRecommendedModelsData;
|
|
48
|
+
export declare function resetClineRecommendedModelsCacheForTests(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Stamps recommended-feed tiers onto a provider's model list so clients can
|
|
51
|
+
* render Recommended/Free/Subscribed sections straight off `ProviderModel`
|
|
52
|
+
* instead of fetching and joining the feed themselves. Feed ids are matched
|
|
53
|
+
* through the Vercel/OpenRouter alias rules (the feed can spell a model
|
|
54
|
+
* differently from the catalog), with a fallback on the id's slug after "/"
|
|
55
|
+
* when that slug is unambiguous — the feed and the catalog can carry
|
|
56
|
+
* different vendor prefixes for the same model (`kwaipilot/kat-coder-pro`
|
|
57
|
+
* vs `cline-free/kat-coder-pro`), most visibly when the bundled fallback
|
|
58
|
+
* feed is stamped against a live-fetched catalog. Models the feed does not
|
|
59
|
+
* mention are returned unchanged; unknown providers pass through untouched.
|
|
60
|
+
*/
|
|
61
|
+
export declare function applyClineFeaturedModels(providerId: string, models: ProviderModel[], data: ClineRecommendedModelsData): ProviderModel[];
|
|
29
62
|
export {};
|
|
@@ -19,6 +19,14 @@ export interface ProviderDefaults {
|
|
|
19
19
|
capabilities?: ProviderCapability[];
|
|
20
20
|
}
|
|
21
21
|
export declare const DEFAULT_MODELS_CATALOG_URL = "https://models.dev/api.json";
|
|
22
|
+
/**
|
|
23
|
+
* Whether a provider's model catalog comes from the customer's configured
|
|
24
|
+
* endpoint rather than a shared public catalog.
|
|
25
|
+
*
|
|
26
|
+
* Keep this derived from the fetcher registry so host consumers cannot drift
|
|
27
|
+
* from the providers whose live metadata is endpoint-specific.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isPrivateModelCatalogProvider(providerId: string): boolean;
|
|
22
30
|
export declare function clearPublicModelsCatalogCache(): void;
|
|
23
31
|
export declare function getLiveModelsCatalog(options?: Pick<ModelCatalogConfig, "url" | "cacheTtlMs">): Promise<Record<string, Record<string, ModelInfo>>>;
|
|
24
32
|
export declare function clearLiveModelsCatalogCache(url?: string): void;
|
|
@@ -9,8 +9,8 @@ export declare const StoredModelEntrySchema: z.ZodObject<{
|
|
|
9
9
|
contextWindow: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
10
10
|
maxInputTokens: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
11
11
|
capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
12
|
-
images: "images";
|
|
13
12
|
video: "video";
|
|
13
|
+
images: "images";
|
|
14
14
|
tools: "tools";
|
|
15
15
|
streaming: "streaming";
|
|
16
16
|
"prompt-cache": "prompt-cache";
|
|
@@ -25,6 +25,33 @@ export declare const StoredModelEntrySchema: z.ZodObject<{
|
|
|
25
25
|
supportsVision: z.ZodOptional<z.ZodBoolean>;
|
|
26
26
|
supportsAttachments: z.ZodOptional<z.ZodBoolean>;
|
|
27
27
|
supportsReasoning: z.ZodOptional<z.ZodBoolean>;
|
|
28
|
+
operation: z.ZodOptional<z.ZodEnum<{
|
|
29
|
+
language: "language";
|
|
30
|
+
"image-generation": "image-generation";
|
|
31
|
+
"speech-generation": "speech-generation";
|
|
32
|
+
"video-generation": "video-generation";
|
|
33
|
+
transcription: "transcription";
|
|
34
|
+
}>>;
|
|
35
|
+
operationModes: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
36
|
+
streaming: "streaming";
|
|
37
|
+
batch: "batch";
|
|
38
|
+
}>>>;
|
|
39
|
+
modalities: z.ZodOptional<z.ZodObject<{
|
|
40
|
+
input: z.ZodArray<z.ZodEnum<{
|
|
41
|
+
image: "image";
|
|
42
|
+
audio: "audio";
|
|
43
|
+
video: "video";
|
|
44
|
+
text: "text";
|
|
45
|
+
pdf: "pdf";
|
|
46
|
+
}>>;
|
|
47
|
+
output: z.ZodArray<z.ZodEnum<{
|
|
48
|
+
image: "image";
|
|
49
|
+
audio: "audio";
|
|
50
|
+
video: "video";
|
|
51
|
+
text: "text";
|
|
52
|
+
pdf: "pdf";
|
|
53
|
+
}>>;
|
|
54
|
+
}, z.core.$strip>>;
|
|
28
55
|
inputPrice: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
29
56
|
outputPrice: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
30
57
|
cacheReadsPrice: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
@@ -127,8 +154,8 @@ export declare const StoredProviderEntrySchema: z.ZodObject<{
|
|
|
127
154
|
contextWindow: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
128
155
|
maxInputTokens: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
129
156
|
capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
130
|
-
images: "images";
|
|
131
157
|
video: "video";
|
|
158
|
+
images: "images";
|
|
132
159
|
tools: "tools";
|
|
133
160
|
streaming: "streaming";
|
|
134
161
|
"prompt-cache": "prompt-cache";
|
|
@@ -143,6 +170,33 @@ export declare const StoredProviderEntrySchema: z.ZodObject<{
|
|
|
143
170
|
supportsVision: z.ZodOptional<z.ZodBoolean>;
|
|
144
171
|
supportsAttachments: z.ZodOptional<z.ZodBoolean>;
|
|
145
172
|
supportsReasoning: z.ZodOptional<z.ZodBoolean>;
|
|
173
|
+
operation: z.ZodOptional<z.ZodEnum<{
|
|
174
|
+
language: "language";
|
|
175
|
+
"image-generation": "image-generation";
|
|
176
|
+
"speech-generation": "speech-generation";
|
|
177
|
+
"video-generation": "video-generation";
|
|
178
|
+
transcription: "transcription";
|
|
179
|
+
}>>;
|
|
180
|
+
operationModes: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
181
|
+
streaming: "streaming";
|
|
182
|
+
batch: "batch";
|
|
183
|
+
}>>>;
|
|
184
|
+
modalities: z.ZodOptional<z.ZodObject<{
|
|
185
|
+
input: z.ZodArray<z.ZodEnum<{
|
|
186
|
+
image: "image";
|
|
187
|
+
audio: "audio";
|
|
188
|
+
video: "video";
|
|
189
|
+
text: "text";
|
|
190
|
+
pdf: "pdf";
|
|
191
|
+
}>>;
|
|
192
|
+
output: z.ZodArray<z.ZodEnum<{
|
|
193
|
+
image: "image";
|
|
194
|
+
audio: "audio";
|
|
195
|
+
video: "video";
|
|
196
|
+
text: "text";
|
|
197
|
+
pdf: "pdf";
|
|
198
|
+
}>>;
|
|
199
|
+
}, z.core.$strip>>;
|
|
146
200
|
inputPrice: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
147
201
|
outputPrice: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
148
202
|
cacheReadsPrice: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
@@ -207,8 +261,8 @@ export declare const StoredModelsFileSchema: z.ZodObject<{
|
|
|
207
261
|
contextWindow: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
208
262
|
maxInputTokens: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
209
263
|
capabilities: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
210
|
-
images: "images";
|
|
211
264
|
video: "video";
|
|
265
|
+
images: "images";
|
|
212
266
|
tools: "tools";
|
|
213
267
|
streaming: "streaming";
|
|
214
268
|
"prompt-cache": "prompt-cache";
|
|
@@ -223,6 +277,33 @@ export declare const StoredModelsFileSchema: z.ZodObject<{
|
|
|
223
277
|
supportsVision: z.ZodOptional<z.ZodBoolean>;
|
|
224
278
|
supportsAttachments: z.ZodOptional<z.ZodBoolean>;
|
|
225
279
|
supportsReasoning: z.ZodOptional<z.ZodBoolean>;
|
|
280
|
+
operation: z.ZodOptional<z.ZodEnum<{
|
|
281
|
+
language: "language";
|
|
282
|
+
"image-generation": "image-generation";
|
|
283
|
+
"speech-generation": "speech-generation";
|
|
284
|
+
"video-generation": "video-generation";
|
|
285
|
+
transcription: "transcription";
|
|
286
|
+
}>>;
|
|
287
|
+
operationModes: z.ZodOptional<z.ZodArray<z.ZodEnum<{
|
|
288
|
+
streaming: "streaming";
|
|
289
|
+
batch: "batch";
|
|
290
|
+
}>>>;
|
|
291
|
+
modalities: z.ZodOptional<z.ZodObject<{
|
|
292
|
+
input: z.ZodArray<z.ZodEnum<{
|
|
293
|
+
image: "image";
|
|
294
|
+
audio: "audio";
|
|
295
|
+
video: "video";
|
|
296
|
+
text: "text";
|
|
297
|
+
pdf: "pdf";
|
|
298
|
+
}>>;
|
|
299
|
+
output: z.ZodArray<z.ZodEnum<{
|
|
300
|
+
image: "image";
|
|
301
|
+
audio: "audio";
|
|
302
|
+
video: "video";
|
|
303
|
+
text: "text";
|
|
304
|
+
pdf: "pdf";
|
|
305
|
+
}>>;
|
|
306
|
+
}, z.core.$strip>>;
|
|
226
307
|
inputPrice: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
227
308
|
outputPrice: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
228
309
|
cacheReadsPrice: z.ZodCatch<z.ZodOptional<z.ZodNumber>>;
|
|
@@ -244,7 +325,7 @@ export declare function readModelsFileSync(filePath: string): StoredModelsFile;
|
|
|
244
325
|
export declare function readModelsFile(filePath: string): Promise<StoredModelsFile>;
|
|
245
326
|
export declare function writeModelsFileSync(filePath: string, state: StoredModelsFile): void;
|
|
246
327
|
export declare function writeModelsFile(filePath: string, state: StoredModelsFile): Promise<void>;
|
|
247
|
-
export declare function toProviderModel(modelId: string, info: Pick<ModelInfo, "name" | "contextWindow" | "capabilities" | "thinkingConfig">): ProviderModel;
|
|
328
|
+
export declare function toProviderModel(modelId: string, info: Pick<ModelInfo, "name" | "description" | "contextWindow" | "capabilities" | "thinkingConfig" | "operation" | "operationModes" | "modalities">): ProviderModel;
|
|
248
329
|
export declare function registerProviderSettingsProvider(settings: ProviderSettings): void;
|
|
249
330
|
export declare function registerConfiguredProvidersFromSettings(state: StoredProviderSettings): void;
|
|
250
331
|
/**
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as LlmsModels from "@cline/llms";
|
|
2
|
+
import type { AddProviderActionRequest, ITelemetryService, ProviderCapability, ProviderListItem, ProviderModel, SaveProviderSettingsActionRequest, VoiceInputSelection } from "@cline/shared";
|
|
2
3
|
import { type ProviderOAuthCredentials } from "../../auth/provider-auth-registry";
|
|
3
4
|
import type { ProviderClient, ProviderConfig, ProviderProtocol, ProviderSettings } from "../../services/llms/provider-settings";
|
|
4
5
|
import type { ProviderTokenSource } from "../../types/provider-settings";
|
|
@@ -24,6 +25,23 @@ export interface UpdateLocalProviderRequest {
|
|
|
24
25
|
export interface DeleteLocalProviderRequest {
|
|
25
26
|
providerId: string;
|
|
26
27
|
}
|
|
28
|
+
export interface TranscribeLocalAudioRequest {
|
|
29
|
+
providerId: string;
|
|
30
|
+
modelId: string;
|
|
31
|
+
audio: Uint8Array;
|
|
32
|
+
mediaType?: string;
|
|
33
|
+
abortSignal?: AbortSignal;
|
|
34
|
+
}
|
|
35
|
+
export interface TranscribeConfiguredVoiceInputRequest {
|
|
36
|
+
audio: Uint8Array;
|
|
37
|
+
mediaType?: string;
|
|
38
|
+
abortSignal?: AbortSignal;
|
|
39
|
+
}
|
|
40
|
+
export interface CreateConfiguredStreamingTranscriptionSessionRequest {
|
|
41
|
+
expiresAfterSeconds?: number;
|
|
42
|
+
abortSignal?: AbortSignal;
|
|
43
|
+
}
|
|
44
|
+
export declare function isDedicatedTranscriptionModel(model: Pick<ProviderModel, "operation">): boolean;
|
|
27
45
|
export declare function addLocalProvider(manager: ProviderSettingsManager, request: Omit<AddProviderActionRequest, "action">): Promise<{
|
|
28
46
|
providerId: string;
|
|
29
47
|
settingsPath: string;
|
|
@@ -51,11 +69,19 @@ export declare function markLocalProviderEnabled(manager: ProviderSettingsManage
|
|
|
51
69
|
export declare function listLocalProviders(manager: ProviderSettingsManager, options?: ListLocalProvidersOptions): Promise<{
|
|
52
70
|
providers: ProviderListItem[];
|
|
53
71
|
settingsPath: string;
|
|
72
|
+
voiceInput?: VoiceInputSelection;
|
|
54
73
|
}>;
|
|
55
74
|
export declare function getLocalProviderModels(providerId: string, config?: ProviderConfig): Promise<{
|
|
56
75
|
providerId: string;
|
|
57
76
|
models: ProviderModel[];
|
|
58
77
|
}>;
|
|
78
|
+
export declare function transcribeLocalAudio(manager: ProviderSettingsManager, request: TranscribeLocalAudioRequest): Promise<LlmsModels.AudioTranscriptionResult>;
|
|
79
|
+
export declare function saveVoiceInputSettings(manager: ProviderSettingsManager, selection: VoiceInputSelection | undefined): Promise<{
|
|
80
|
+
settingsPath: string;
|
|
81
|
+
voiceInput?: VoiceInputSelection;
|
|
82
|
+
}>;
|
|
83
|
+
export declare function transcribeConfiguredVoiceInput(manager: ProviderSettingsManager, request: TranscribeConfiguredVoiceInputRequest): Promise<LlmsModels.AudioTranscriptionResult>;
|
|
84
|
+
export declare function createConfiguredStreamingTranscriptionSession(manager: ProviderSettingsManager, request?: CreateConfiguredStreamingTranscriptionSessionRequest): Promise<LlmsModels.StreamingAudioTranscriptionSession>;
|
|
59
85
|
export declare function saveLocalProviderSettings(manager: ProviderSettingsManager, request: Omit<SaveProviderSettingsActionRequest, "action">): {
|
|
60
86
|
providerId: string;
|
|
61
87
|
enabled: boolean;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ProviderConfig, type ProviderSettings, type ProviderTokenSource, type StoredProviderSettings, type ToProviderConfigOptions } from "../../types/provider-settings";
|
|
1
|
+
import { type ProviderConfig, type ProviderSettings, type ProviderTokenSource, type StoredProviderSettings, type ToProviderConfigOptions, type VoiceInputSettings } from "../../types/provider-settings";
|
|
2
2
|
export interface ProviderSettingsManagerOptions {
|
|
3
3
|
filePath?: string;
|
|
4
4
|
dataDir?: string;
|
|
@@ -20,6 +20,8 @@ export declare class ProviderSettingsManager {
|
|
|
20
20
|
saveProviderSettings(settings: unknown, options?: SaveProviderSettingsOptions): StoredProviderSettings;
|
|
21
21
|
private resolveProviderSettings;
|
|
22
22
|
getProviderSettings(providerId: string): ProviderSettings | undefined;
|
|
23
|
+
getVoiceInputSettings(): VoiceInputSettings | undefined;
|
|
24
|
+
setVoiceInputSettings(settings: VoiceInputSettings | undefined): StoredProviderSettings;
|
|
23
25
|
private resolveLastUsedProviderId;
|
|
24
26
|
getLastUsedProviderSettings(options?: ResolveLastUsedProviderSettingsOptions): ProviderSettings | undefined;
|
|
25
27
|
getProviderConfig(providerId: string, options?: ToProviderConfigOptions): ProviderConfig | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as x,mkdirSync as G,readFileSync as v,writeFileSync as g}from"node:fs";import{resolve as u}from"node:path";import{resolveSessionDataDir as b}from"@cline/shared/storage";import{nanoid as S}from"nanoid";import*as m from"node-machine-id";var c="machine-id",M,C=!1;function R(){if(!C)M=h(),C=!0;return M??w()}function X(f){let P=f?.trim();if(P)return P;let A=h();if(A)return A;return w()}function d(){let f=m;return f.machineIdSync??f.default?.machineIdSync}function h(){try{let f=d();if(!f)return;return f().trim()||void 0}catch{return}}function w(){let f=b(),P=u(f,c);try{if(x(P)){let O=v(P,"utf8").trim();if(O.length>0)return O}}catch{}let A=`cl-${S()}`;try{G(f,{recursive:!0}),g(P,A,"utf8")}catch{}return A}class Y{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,A,O,j=!1){if(!this.meter||!j&&!this.isEnabled())return;let H=this.counters.get(f);if(!H)H=this.meter.createCounter(f,O?{description:O}:void 0),this.counters.set(f,H);H.add(P,this.flattenProperties(this.buildAttributes(A)))}recordHistogram(f,P,A,O,j=!1){if(!this.meter||!j&&!this.isEnabled())return;let H=this.histograms.get(f);if(!H)H=this.meter.createHistogram(f,O?{description:O}:void 0),this.histograms.set(f,H);H.record(P,this.flattenProperties(this.buildAttributes(A)))}recordGauge(f,P,A,O,j=!1){if(!this.meter||!j&&!this.isEnabled())return;let H=this.buildAttributes(A),$=JSON.stringify(H),K=this.gaugeValues.get(f);if(P===null){if(K){if(K.delete($),K.size===0)this.gaugeValues.delete(f),this.gauges.delete(f)}return}let T=K;if(!T)T=new Map,this.gaugeValues.set(f,T);if(!this.gauges.has(f)){let J=this.meter.createObservableGauge(f,O?{description:O}:void 0);J.addCallback((Q)=>{for(let k of this.snapshotGaugeSeries(f))Q.observe(k.value,this.flattenProperties(k.attributes))}),this.gauges.set(f,J)}T.set($,{value:P,attributes:H})}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,A){if(!this.logger)return;let O=this.flattenProperties(this.buildAttributes(P,A));this.logger.emit({severityText:"INFO",body:f,attributes:O})}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(),(A)=>({value:A.value,attributes:A.attributes?{...A.attributes}:void 0}))}flattenProperties(f,P="",A=new WeakSet,O=0){if(!f)return{};let j={},H=100,$=10;for(let[K,T]of Object.entries(f)){if(K==="__proto__"||K==="constructor"||K==="prototype")continue;let J=P?`${P}.${K}`:K;if(T===null||T===void 0){j[J]=String(T);continue}if(Array.isArray(T)){let Q=T.length>H?T.slice(0,H):T;try{j[J]=JSON.stringify(Q)}catch{j[J]="[UnserializableArray]"}if(T.length>H)j[`${J}_truncated`]=!0,j[`${J}_original_length`]=T.length;continue}if(typeof T==="object"){if(T instanceof Date){j[J]=T.toISOString();continue}if(T instanceof Error){j[J]=T.message;continue}if(A.has(T)){j[J]="[Circular]";continue}if(O>=$){j[J]="[MaxDepthExceeded]";continue}A.add(T),Object.assign(j,this.flattenProperties(T,J,A,O+1));continue}if(r(T)){j[J]=T;continue}try{j[J]=JSON.stringify(T)}catch{j[J]=String(T)}}return j}}function r(f){return typeof f==="string"||typeof f==="number"||typeof f==="boolean"}import{metrics as Af,trace as Of}from"@opentelemetry/api";import{logs as jf}from"@opentelemetry/api-logs";import{OTLPLogExporter as Hf}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as Tf}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as $f}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as Jf}from"@opentelemetry/resources";import{BatchLogRecordProcessor as Wf,ConsoleLogRecordExporter as Kf,LoggerProvider as Xf}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as Yf,MeterProvider as Zf,PeriodicExportingMetricReader as y}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as Bf,ConsoleSpanExporter as Qf,SimpleSpanProcessor as Rf}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as Ff}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as Vf,ATTR_SERVICE_VERSION as Uf}from"@opentelemetry/semantic-conventions";import{mkdirSync as df,readFileSync as l,statSync as n,writeFileSync as rf}from"node:fs";import{MODEL_TOOL_NAMES as a}from"@cline/shared";import{resolveGlobalSettingsPath as p}from"@cline/shared/storage";import{z as W}from"zod";import{AGENT_UNEXPECTED_REASONING_TOKENS_EVENT as zf,captureAgentUnexpectedReasoningTokens as Df,captureTaskLifecycleEvent as Nf,SDK_ERROR_TELEMETRY_EVENT as xf,TASK_CANCELLED_EVENT as Gf,TASK_FIRST_CHUNK_RECEIVED_EVENT as vf,TASK_PROVIDER_REQUEST_STARTED_EVENT as gf,TASK_PROVIDER_STREAM_FAILED_EVENT as uf,TASK_PROVIDER_STREAM_STARTED_EVENT as bf}from"@cline/shared";var q=W.preprocess((f)=>Array.isArray(f)?f.filter((P)=>typeof P==="string").map((P)=>P.trim()).filter(Boolean):void 0,W.array(W.string()).optional()).transform((f)=>{if(!f)return;let P=[...new Set(f)].sort((A,O)=>A.localeCompare(O));return P.length>0?P:void 0}),i=W.enum(["basic","agentic"]).catch("agentic"),s=W.partialRecord(W.enum(a),W.object({enabled:W.boolean()}).strip()).optional(),o=W.enum(["plan","act"]),E=W.object({telemetryOptOut:W.boolean().default(!1).catch(!1),autoUpdateEnabled:W.boolean().default(!0).catch(!0),compactionStrategy:i.optional(),compactionEnabled:W.boolean().optional().catch(void 0),planActMode:o.optional().catch(void 0),toolAutoApprove:W.boolean().optional().catch(void 0),tuiTheme:W.string().optional().catch(void 0),disabledTools:q.optional(),tools:s,disabledPlugins:q.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.tuiTheme?.trim())P.tuiTheme=f.tuiTheme.trim();if(f.disabledTools?.length)P.disabledTools=f.disabledTools;if(f.tools&&Object.keys(f.tools).length>0)P.tools=f.tools;if(f.disabledPlugins?.length)P.disabledPlugins=f.disabledPlugins;return P});function Z(){return E.parse({})}var F;function t(f){if(f.disabledTools)Object.freeze(f.disabledTools);if(f.tools){for(let P of Object.values(f.tools))Object.freeze(P);Object.freeze(f.tools)}if(f.disabledPlugins)Object.freeze(f.disabledPlugins);return Object.freeze(f)}function e(f){let P;try{P=l(f,"utf8")}catch{return Z()}try{let A=E.safeParse(JSON.parse(P));return A.success?A.data:Z()}catch{return Z()}}function ff(){let f=p(),P=n(f,{throwIfNoEntry:!1}),A=P?.mtimeMs??0,O=P?.size??0,j=F;if(j&&j.path===f&&j.mtimeMs===A&&j.size===O)return j;let H=t(P?e(f):Z());return F={path:f,mtimeMs:A,size:O,value:H},F}function Pf(){return ff().value}function I(){return Pf().telemetryOptOut}class V{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,A,O,j){if(!j&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:f,value:P,attributes:A,description:O,required:j===!0})}recordHistogram(f,P,A,O,j){if(!j&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:f,value:P,attributes:A,description:O,required:j===!0})}recordGauge(f,P,A,O,j){if(!j&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:f,value:P,attributes:A,description:O,required:j===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class B{adapters;metadata;distinctId;deviceId;commonProperties;constructor(f={}){if(this.adapters=[...f.adapters??[]],f.logger)this.adapters.push(new V({logger:f.logger}));this.metadata={...f.metadata??{}},this.distinctId=f.distinctId,this.deviceId=f.deviceId??R(),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 A of this.adapters)A.emit(f.event,P)}captureRequired(f,P){let A=this.buildAttributes(P);for(let O of this.adapters)O.emitRequired(f,A)}recordCounter(f,P,A,O,j=!1){let H=this.buildAttributes(A);for(let $ of this.adapters)$.recordCounter(f,P,H,O,j)}recordHistogram(f,P,A,O,j=!1){let H=this.buildAttributes(A);for(let $ of this.adapters)$.recordHistogram(f,P,H,O,j)}recordGauge(f,P,A,O,j=!1){let H=this.buildAttributes(A);for(let $ of this.adapters)$.recordGauge(f,P,H,O,j)}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}:{},device_id:this.deviceId}}}class z{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 L{meterProvider;loggerProvider;tracerProvider;options;constructor(f={}){this.options=f;let P=Jf({[Vf]:f.serviceName??"cline",...f.serviceVersion?{[Uf]:f.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(P),this.loggerProvider=this.createLoggerProvider(P),this.tracerProvider=this.createTracerProvider(P),this.meterProvider)Af.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)jf.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(f="cline",P){return Of.getTracer(f,P??this.options.serviceVersion)}createAdapter(f){return new Y({...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 B({...f,adapters:[P],distinctId:X(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=U(this.options.metricsExporter);if(P.length===0)return null;let A=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),O=Math.min(30000,Math.floor(A*0.8)),j=P.map((H)=>Mf(H,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:A,timeout:O})).filter((H)=>H!==null);if(j.length===0)return null;return new Zf({resource:f,readers:j})}createTracerProvider(f){let P=U(this.options.tracesExporter);if(P.length===0)return null;let A=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,O=this.options.otlpTracesHeaders??this.options.otlpHeaders,j=[];for(let H of P){let $=kf(H,{endpoint:A,headers:O,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if($)j.push($)}if(j.length===0)return null;return new Ff({resource:f,spanProcessors:j})}createLoggerProvider(f){let P=U(this.options.logsExporter);if(P.length===0)return null;let A=P.map((O)=>{let j=_f(O,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!j)return null;return new Wf(j,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((O)=>O!==null);if(A.length===0)return null;return new Xf({resource:f,processors:A})}}function D(f){let P=new L(f),A=P.createTelemetryService(f),O=()=>{A.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)O();return{provider:P,telemetry:A,emitProviderCreated:O}}function N(f){if(I())return{telemetry:new z(f)};if(f.enabled!==!0)return{telemetry:new B({...f,distinctId:X(f.distinctId)})};return D(f)}function Lf(f){let{telemetry:P,provider:A,emitProviderCreated:O}=N(f);return{telemetry:P,provider:A,flush:async()=>{let $=A;if($&&typeof $.forceFlush==="function")try{await $.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([P.dispose(),A?.dispose()])},...f.deferProviderCreatedEvent&&O?{emitProviderCreated:O}:{}}}function U(f){if(!f)return[];return(Array.isArray(f)?f:f.split(",")).map((A)=>A.trim()).filter((A)=>A==="console"||A==="otlp")}function _f(f,P){if(f==="console")return new Kf;if(!P.endpoint)return null;let A=_(P.endpoint,"/v1/logs");return new Hf({url:A,headers:P.headers})}function kf(f,P){if(f==="console")return new Rf(new Qf);if(!P.endpoint)return null;let A=_(P.endpoint,"/v1/traces");return new Bf(new $f({url:A,headers:P.headers}))}function Mf(f,P){if(f==="console")return new y({exporter:new Yf,exportIntervalMillis:P.interval,exportTimeoutMillis:P.timeout});if(!P.endpoint)return null;let A=_(P.endpoint,"/v1/metrics");return new y({exporter:new Tf({url:A,headers:P.headers}),exportIntervalMillis:P.interval,exportTimeoutMillis:P.timeout})}function _(f,P){let A=new URL(f),O=A.pathname.endsWith("/")?A.pathname.slice(0,-1):A.pathname;return A.pathname=O.endsWith(P)?O:`${O}${P}`,A.toString()}export{X as resolveCoreDistinctId,R as resolveCoreDeviceId,D as createOpenTelemetryTelemetryService,N as createConfiguredTelemetryService,Lf as createConfiguredTelemetryHandle,L as OpenTelemetryProvider,Y as OpenTelemetryAdapter};
|
|
1
|
+
import{existsSync as x,mkdirSync as v,readFileSync as G,writeFileSync as g}from"node:fs";import{resolve as u}from"node:path";import{resolveSessionDataDir as b}from"@cline/shared/storage";import{nanoid as S}from"nanoid";import*as m from"node-machine-id";var c="machine-id",M,h=!1;function B(){if(!h)M=w(),h=!0;return M??C()}function X(f){let P=f?.trim();if(P)return P;let A=w();if(A)return A;return C()}function d(){let f=m;return f.machineIdSync??f.default?.machineIdSync}function w(){try{let f=d();if(!f)return;return f().trim()||void 0}catch{return}}function C(){let f=b(),P=u(f,c);try{if(x(P)){let O=G(P,"utf8").trim();if(O.length>0)return O}}catch{}let A=`cl-${S()}`;try{v(f,{recursive:!0}),g(P,A,"utf8")}catch{}return A}class Y{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,A,O,j=!1){if(!this.meter||!j&&!this.isEnabled())return;let H=this.counters.get(f);if(!H)H=this.meter.createCounter(f,O?{description:O}:void 0),this.counters.set(f,H);H.add(P,this.flattenProperties(this.buildAttributes(A)))}recordHistogram(f,P,A,O,j=!1){if(!this.meter||!j&&!this.isEnabled())return;let H=this.histograms.get(f);if(!H)H=this.meter.createHistogram(f,O?{description:O}:void 0),this.histograms.set(f,H);H.record(P,this.flattenProperties(this.buildAttributes(A)))}recordGauge(f,P,A,O,j=!1){if(!this.meter||!j&&!this.isEnabled())return;let H=this.buildAttributes(A),$=JSON.stringify(H),K=this.gaugeValues.get(f);if(P===null){if(K){if(K.delete($),K.size===0)this.gaugeValues.delete(f),this.gauges.delete(f)}return}let T=K;if(!T)T=new Map,this.gaugeValues.set(f,T);if(!this.gauges.has(f)){let J=this.meter.createObservableGauge(f,O?{description:O}:void 0);J.addCallback((V)=>{for(let k of this.snapshotGaugeSeries(f))V.observe(k.value,this.flattenProperties(k.attributes))}),this.gauges.set(f,J)}T.set($,{value:P,attributes:H})}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,A){if(!this.logger)return;let O=this.flattenProperties(this.buildAttributes(P,A));this.logger.emit({severityText:"INFO",body:f,attributes:O})}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(),(A)=>({value:A.value,attributes:A.attributes?{...A.attributes}:void 0}))}flattenProperties(f,P="",A=new WeakSet,O=0){if(!f)return{};let j={},H=100,$=10;for(let[K,T]of Object.entries(f)){if(K==="__proto__"||K==="constructor"||K==="prototype")continue;let J=P?`${P}.${K}`:K;if(T===null||T===void 0){j[J]=String(T);continue}if(Array.isArray(T)){let V=T.length>H?T.slice(0,H):T;try{j[J]=JSON.stringify(V)}catch{j[J]="[UnserializableArray]"}if(T.length>H)j[`${J}_truncated`]=!0,j[`${J}_original_length`]=T.length;continue}if(typeof T==="object"){if(T instanceof Date){j[J]=T.toISOString();continue}if(T instanceof Error){j[J]=T.message;continue}if(A.has(T)){j[J]="[Circular]";continue}if(O>=$){j[J]="[MaxDepthExceeded]";continue}A.add(T),Object.assign(j,this.flattenProperties(T,J,A,O+1));continue}if(r(T)){j[J]=T;continue}try{j[J]=JSON.stringify(T)}catch{j[J]=String(T)}}return j}}function r(f){return typeof f==="string"||typeof f==="number"||typeof f==="boolean"}import{metrics as Af,trace as Of}from"@opentelemetry/api";import{logs as jf}from"@opentelemetry/api-logs";import{OTLPLogExporter as Hf}from"@opentelemetry/exporter-logs-otlp-http";import{OTLPMetricExporter as Tf}from"@opentelemetry/exporter-metrics-otlp-http";import{OTLPTraceExporter as $f}from"@opentelemetry/exporter-trace-otlp-http";import{resourceFromAttributes as Jf}from"@opentelemetry/resources";import{BatchLogRecordProcessor as Wf,ConsoleLogRecordExporter as Kf,LoggerProvider as Xf}from"@opentelemetry/sdk-logs";import{ConsoleMetricExporter as Yf,MeterProvider as Zf,PeriodicExportingMetricReader as y}from"@opentelemetry/sdk-metrics";import{BatchSpanProcessor as Qf,ConsoleSpanExporter as Vf,SimpleSpanProcessor as Bf}from"@opentelemetry/sdk-trace-base";import{NodeTracerProvider as Rf}from"@opentelemetry/sdk-trace-node";import{ATTR_SERVICE_NAME as Ff,ATTR_SERVICE_VERSION as Uf}from"@opentelemetry/semantic-conventions";import{mkdirSync as df,readFileSync as l,statSync as n,writeFileSync as rf}from"node:fs";import{CONFIGURABLE_MODEL_TOOL_NAMES as a}from"@cline/shared";import{resolveGlobalSettingsPath as p}from"@cline/shared/storage";import{z as W}from"zod";import{AGENT_UNEXPECTED_REASONING_TOKENS_EVENT as zf,captureAgentUnexpectedReasoningTokens as Df,captureTaskLifecycleEvent as Nf,SDK_ERROR_TELEMETRY_EVENT as xf,TASK_CANCELLED_EVENT as vf,TASK_FIRST_CHUNK_RECEIVED_EVENT as Gf,TASK_PROVIDER_REQUEST_STARTED_EVENT as gf,TASK_PROVIDER_STREAM_FAILED_EVENT as uf,TASK_PROVIDER_STREAM_STARTED_EVENT as bf}from"@cline/shared";var q=W.preprocess((f)=>Array.isArray(f)?f.filter((P)=>typeof P==="string").map((P)=>P.trim()).filter(Boolean):void 0,W.array(W.string()).optional()).transform((f)=>{if(!f)return;let P=[...new Set(f)].sort((A,O)=>A.localeCompare(O));return P.length>0?P:void 0}),i=W.enum(["basic","agentic"]).catch("agentic"),s=W.partialRecord(W.enum(a),W.object({enabled:W.boolean()}).strip()).optional(),o=W.enum(["plan","act"]),E=W.object({telemetryOptOut:W.boolean().default(!1).catch(!1),autoUpdateEnabled:W.boolean().default(!0).catch(!0),compactionStrategy:i.optional(),compactionEnabled:W.boolean().optional().catch(void 0),planActMode:o.optional().catch(void 0),toolAutoApprove:W.boolean().optional().catch(void 0),tuiTheme:W.string().optional().catch(void 0),disabledTools:q.optional(),tools:s,disabledPlugins:q.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.tuiTheme?.trim())P.tuiTheme=f.tuiTheme.trim();if(f.disabledTools?.length)P.disabledTools=f.disabledTools;if(f.tools&&Object.keys(f.tools).length>0)P.tools=f.tools;if(f.disabledPlugins?.length)P.disabledPlugins=f.disabledPlugins;return P});function Z(){return E.parse({})}var R;function t(f){if(f.disabledTools)Object.freeze(f.disabledTools);if(f.tools){for(let P of Object.values(f.tools))Object.freeze(P);Object.freeze(f.tools)}if(f.disabledPlugins)Object.freeze(f.disabledPlugins);return Object.freeze(f)}function e(f){let P;try{P=l(f,"utf8")}catch{return Z()}try{let A=E.safeParse(JSON.parse(P));return A.success?A.data:Z()}catch{return Z()}}function ff(){let f=p(),P=n(f,{throwIfNoEntry:!1}),A=P?.mtimeMs??0,O=P?.size??0,j=R;if(j&&j.path===f&&j.mtimeMs===A&&j.size===O)return j;let H=t(P?e(f):Z());return R={path:f,mtimeMs:A,size:O,value:H},R}function Pf(){return ff().value}function I(){return Pf().telemetryOptOut}class F{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,A,O,j){if(!j&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"counter",name:f,value:P,attributes:A,description:O,required:j===!0})}recordHistogram(f,P,A,O,j){if(!j&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"histogram",name:f,value:P,attributes:A,description:O,required:j===!0})}recordGauge(f,P,A,O,j){if(!j&&!this.isEnabled())return;this.logger?.debug("telemetry.metric",{telemetrySink:this.name,instrument:"gauge",name:f,value:P,attributes:A,description:O,required:j===!0})}isEnabled(){return typeof this.enabled==="function"?this.enabled():this.enabled}async flush(){}async dispose(){}}class Q{adapters;metadata;distinctId;deviceId;commonProperties;constructor(f={}){if(this.adapters=[...f.adapters??[]],f.logger)this.adapters.push(new F({logger:f.logger}));this.metadata={...f.metadata??{}},this.distinctId=f.distinctId,this.deviceId=f.deviceId??B(),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 A of this.adapters)A.emit(f.event,P)}captureRequired(f,P){let A=this.buildAttributes(P);for(let O of this.adapters)O.emitRequired(f,A)}recordCounter(f,P,A,O,j=!1){let H=this.buildAttributes(A);for(let $ of this.adapters)$.recordCounter(f,P,H,O,j)}recordHistogram(f,P,A,O,j=!1){let H=this.buildAttributes(A);for(let $ of this.adapters)$.recordHistogram(f,P,H,O,j)}recordGauge(f,P,A,O,j=!1){let H=this.buildAttributes(A);for(let $ of this.adapters)$.recordGauge(f,P,H,O,j)}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}:{},device_id:this.deviceId}}}class z{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 L{meterProvider;loggerProvider;tracerProvider;options;constructor(f={}){this.options=f;let P=Jf({[Ff]:f.serviceName??"cline",...f.serviceVersion?{[Uf]:f.serviceVersion}:{}});if(this.meterProvider=this.createMeterProvider(P),this.loggerProvider=this.createLoggerProvider(P),this.tracerProvider=this.createTracerProvider(P),this.meterProvider)Af.setGlobalMeterProvider(this.meterProvider);if(this.loggerProvider)jf.setGlobalLoggerProvider(this.loggerProvider);if(this.tracerProvider)this.tracerProvider.register()}getTracer(f="cline",P){return Of.getTracer(f,P??this.options.serviceVersion)}createAdapter(f){return new Y({...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 Q({...f,adapters:[P],distinctId:X(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=U(this.options.metricsExporter);if(P.length===0)return null;let A=Math.max(1000,this.options.metricExportIntervalMs??this.options.metricExportInterval??60000),O=Math.min(30000,Math.floor(A*0.8)),j=P.map((H)=>Mf(H,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json",interval:A,timeout:O})).filter((H)=>H!==null);if(j.length===0)return null;return new Zf({resource:f,readers:j})}createTracerProvider(f){let P=U(this.options.tracesExporter);if(P.length===0)return null;let A=this.options.otlpTracesEndpoint??this.options.otlpEndpoint,O=this.options.otlpTracesHeaders??this.options.otlpHeaders,j=[];for(let H of P){let $=kf(H,{endpoint:A,headers:O,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if($)j.push($)}if(j.length===0)return null;return new Rf({resource:f,spanProcessors:j})}createLoggerProvider(f){let P=U(this.options.logsExporter);if(P.length===0)return null;let A=P.map((O)=>{let j=_f(O,{endpoint:this.options.otlpEndpoint,headers:this.options.otlpHeaders,insecure:this.options.otlpInsecure??!1,protocol:"http/json"});if(!j)return null;return new Wf(j,{maxQueueSize:this.options.logMaxQueueSize??2048,maxExportBatchSize:this.options.logBatchSize??512,scheduledDelayMillis:this.options.logBatchTimeoutMs??this.options.logBatchTimeout??5000})}).filter((O)=>O!==null);if(A.length===0)return null;return new Xf({resource:f,processors:A})}}function D(f){let P=new L(f),A=P.createTelemetryService(f),O=()=>{A.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)O();return{provider:P,telemetry:A,emitProviderCreated:O}}function N(f){if(I())return{telemetry:new z(f)};if(f.enabled!==!0)return{telemetry:new Q({...f,distinctId:X(f.distinctId)})};return D(f)}function Lf(f){let{telemetry:P,provider:A,emitProviderCreated:O}=N(f);return{telemetry:P,provider:A,flush:async()=>{let $=A;if($&&typeof $.forceFlush==="function")try{await $.forceFlush()}catch{}},dispose:async()=>{await Promise.allSettled([P.dispose(),A?.dispose()])},...f.deferProviderCreatedEvent&&O?{emitProviderCreated:O}:{}}}function U(f){if(!f)return[];return(Array.isArray(f)?f:f.split(",")).map((A)=>A.trim()).filter((A)=>A==="console"||A==="otlp")}function _f(f,P){if(f==="console")return new Kf;if(!P.endpoint)return null;let A=_(P.endpoint,"/v1/logs");return new Hf({url:A,headers:P.headers})}function kf(f,P){if(f==="console")return new Bf(new Vf);if(!P.endpoint)return null;let A=_(P.endpoint,"/v1/traces");return new Qf(new $f({url:A,headers:P.headers}))}function Mf(f,P){if(f==="console")return new y({exporter:new Yf,exportIntervalMillis:P.interval,exportTimeoutMillis:P.timeout});if(!P.endpoint)return null;let A=_(P.endpoint,"/v1/metrics");return new y({exporter:new Tf({url:A,headers:P.headers}),exportIntervalMillis:P.interval,exportTimeoutMillis:P.timeout})}function _(f,P){let A=new URL(f),O=A.pathname.endsWith("/")?A.pathname.slice(0,-1):A.pathname;return A.pathname=O.endsWith(P)?O:`${O}${P}`,A.toString()}export{X as resolveCoreDistinctId,B as resolveCoreDeviceId,D as createOpenTelemetryTelemetryService,N as createConfiguredTelemetryService,Lf as createConfiguredTelemetryHandle,L as OpenTelemetryProvider,Y as OpenTelemetryAdapter};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { AgendaAutomationPolicy, AgendaTaskActor, AgendaTaskCreateInput, AgendaTaskListInput, AgendaTaskRecord, AgendaTaskRunRecord, AgendaTaskUpdateInput } from "@cline/shared";
|
|
2
|
+
/**
|
|
3
|
+
* The single mutation boundary for agenda tasks. File reconciliation, Hub
|
|
4
|
+
* commands, and agent tools all route through this interface so lifecycle
|
|
5
|
+
* invariants are enforced in one place.
|
|
6
|
+
*/
|
|
7
|
+
export interface AgendaTaskManagerApi {
|
|
8
|
+
createTask(input: AgendaTaskCreateInput): Promise<AgendaTaskRecord>;
|
|
9
|
+
listTasks(input?: AgendaTaskListInput): Promise<AgendaTaskRecord[]>;
|
|
10
|
+
getTask(taskId: string): Promise<AgendaTaskRecord | undefined>;
|
|
11
|
+
updateTask(input: AgendaTaskUpdateInput): Promise<AgendaTaskRecord>;
|
|
12
|
+
approveTask(taskId: string, actor: AgendaTaskActor, expectedRevision: number): Promise<AgendaTaskRecord>;
|
|
13
|
+
cancelTask(taskId: string, actor: AgendaTaskActor, expectedRevision: number, reason?: string): Promise<AgendaTaskRecord>;
|
|
14
|
+
runTask(taskId: string, actor: AgendaTaskActor, expectedRevision: number, requestedByClientId?: string): Promise<{
|
|
15
|
+
task: AgendaTaskRecord;
|
|
16
|
+
run?: AgendaTaskRunRecord;
|
|
17
|
+
}>;
|
|
18
|
+
getAutomationPolicy(scopeKey?: string): Promise<AgendaAutomationPolicy>;
|
|
19
|
+
setAutomationPolicy(policy: Omit<AgendaAutomationPolicy, "updatedAt">, actor: AgendaTaskActor): Promise<AgendaAutomationPolicy>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { AgendaAutomationPolicy, AgendaTaskActor, AgendaTaskCreateInput, AgendaTaskListInput, AgendaTaskRecord, AgendaTaskRunRecord, AgendaTaskUpdateInput, BasicLogger } from "@cline/shared";
|
|
2
|
+
import type { AgendaTaskManagerApi } from "./agenda-task-api";
|
|
3
|
+
import { SqliteAgendaTaskStore } from "./store/sqlite-task-store";
|
|
4
|
+
export type AgendaTaskManagerEventName = "task.created" | "task.updated" | "task.deleted" | "task.run.started" | "task.run.completed" | "task.run.failed" | "task.automation.updated";
|
|
5
|
+
export interface AgendaTaskRuntimeResult {
|
|
6
|
+
status: "completed" | "failed" | "cancelled";
|
|
7
|
+
summary?: string;
|
|
8
|
+
error?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface AgendaTaskRuntime {
|
|
11
|
+
isInteractiveClientAvailable?(): boolean;
|
|
12
|
+
startSession(task: AgendaTaskRecord, run: AgendaTaskRunRecord, requestedByClientId?: string, options?: {
|
|
13
|
+
unattended: boolean;
|
|
14
|
+
}): Promise<{
|
|
15
|
+
sessionId: string;
|
|
16
|
+
}>;
|
|
17
|
+
runSession(sessionId: string, task: AgendaTaskRecord, run: AgendaTaskRunRecord): Promise<AgendaTaskRuntimeResult>;
|
|
18
|
+
abortSession(sessionId: string, reason: string): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export interface AgendaTaskManagerOptions {
|
|
21
|
+
runtime: AgendaTaskRuntime;
|
|
22
|
+
store?: SqliteAgendaTaskStore;
|
|
23
|
+
dbPath?: string;
|
|
24
|
+
globalSpecsDir?: string;
|
|
25
|
+
watcherDebounceMs?: number;
|
|
26
|
+
watchFiles?: boolean;
|
|
27
|
+
logger?: BasicLogger;
|
|
28
|
+
publish?: (event: AgendaTaskManagerEventName, payload: Record<string, unknown>, sessionId?: string) => void;
|
|
29
|
+
}
|
|
30
|
+
/** Hub-owned lifecycle coordinator and the only operational task writer. */
|
|
31
|
+
export declare class AgendaTaskManager implements AgendaTaskManagerApi {
|
|
32
|
+
private readonly runtime;
|
|
33
|
+
private readonly store;
|
|
34
|
+
private readonly ownsStore;
|
|
35
|
+
private readonly globalSpecsDir?;
|
|
36
|
+
private readonly watcherDebounceMs;
|
|
37
|
+
private readonly watchFiles;
|
|
38
|
+
private readonly logger;
|
|
39
|
+
private readonly publishEvent;
|
|
40
|
+
private readonly scopes;
|
|
41
|
+
private readonly activeRuns;
|
|
42
|
+
private readonly backgroundRuns;
|
|
43
|
+
private maintenanceTimer?;
|
|
44
|
+
private readonly queuedAutomationScopes;
|
|
45
|
+
private automationPumping;
|
|
46
|
+
private automationPolicyGeneration;
|
|
47
|
+
private started;
|
|
48
|
+
private disposed;
|
|
49
|
+
constructor(options: AgendaTaskManagerOptions);
|
|
50
|
+
start(): Promise<void>;
|
|
51
|
+
dispose(): Promise<void>;
|
|
52
|
+
createTask(input: AgendaTaskCreateInput): Promise<AgendaTaskRecord>;
|
|
53
|
+
listTasks(input?: AgendaTaskListInput): Promise<AgendaTaskRecord[]>;
|
|
54
|
+
getTask(taskId: string): Promise<AgendaTaskRecord | undefined>;
|
|
55
|
+
updateTask(input: AgendaTaskUpdateInput): Promise<AgendaTaskRecord>;
|
|
56
|
+
approveTask(taskId: string, actor: AgendaTaskActor, expectedRevision: number): Promise<AgendaTaskRecord>;
|
|
57
|
+
cancelTask(taskId: string, actor: AgendaTaskActor, expectedRevision: number, reason?: string): Promise<AgendaTaskRecord>;
|
|
58
|
+
runTask(taskId: string, actor: AgendaTaskActor, expectedRevision: number, requestedByClientId?: string): Promise<{
|
|
59
|
+
task: AgendaTaskRecord;
|
|
60
|
+
run?: AgendaTaskRunRecord;
|
|
61
|
+
}>;
|
|
62
|
+
getAutomationPolicy(scopeKey?: string): Promise<AgendaAutomationPolicy>;
|
|
63
|
+
setAutomationPolicy(policy: Omit<AgendaAutomationPolicy, "updatedAt">, actor: AgendaTaskActor): Promise<AgendaAutomationPolicy>;
|
|
64
|
+
/** Re-evaluate auto-start work after Hub client readiness changes. */
|
|
65
|
+
notifyAutomationReadinessChanged(): void;
|
|
66
|
+
private finishRun;
|
|
67
|
+
private finishRunFailure;
|
|
68
|
+
private ensureScope;
|
|
69
|
+
private reconcileScope;
|
|
70
|
+
private reconcileSourceForProjection;
|
|
71
|
+
private reconcileFileStore;
|
|
72
|
+
private expireTasks;
|
|
73
|
+
private expireTask;
|
|
74
|
+
private isExpired;
|
|
75
|
+
private recoverInterruptedRuns;
|
|
76
|
+
private queueAutomation;
|
|
77
|
+
private pumpAutomation;
|
|
78
|
+
private canAutomaticallyApprove;
|
|
79
|
+
private taskChainDepth;
|
|
80
|
+
private fileStoreForTask;
|
|
81
|
+
/**
|
|
82
|
+
* Approval is bound to the current user-editable Markdown intent, not just
|
|
83
|
+
* the last SQLite projection. Reconcile synchronously to close the watcher
|
|
84
|
+
* debounce window, then fail closed if the source is missing, malformed, or
|
|
85
|
+
* still differs from the projection that will be approved/executed.
|
|
86
|
+
*/
|
|
87
|
+
private refreshAndVerifyTaskIntent;
|
|
88
|
+
private requireTask;
|
|
89
|
+
private assertRevision;
|
|
90
|
+
private publish;
|
|
91
|
+
/**
|
|
92
|
+
* fs.watch must be handed the fully resolved form of a path: on Windows,
|
|
93
|
+
* libuv aborts the entire process (fs-event.c assertion) when the watched
|
|
94
|
+
* path contains 8.3 short components such as C:\Users\RUNNER~1, because
|
|
95
|
+
* event filenames come back in long form and fail its prefix check. When
|
|
96
|
+
* the path cannot be resolved, going without the watcher is safer than
|
|
97
|
+
* handing libuv the unresolved path.
|
|
98
|
+
*/
|
|
99
|
+
private resolveWatchRoot;
|
|
100
|
+
private logError;
|
|
101
|
+
private assertUsable;
|
|
102
|
+
}
|