@clinebot/core 0.0.36 → 0.0.37
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/ClineCore.d.ts +312 -3
- package/dist/ClineCore.d.ts.map +1 -1
- package/dist/account/cline-account-service.d.ts.map +1 -1
- package/dist/cron/cron-event-ingress.d.ts +38 -0
- package/dist/cron/cron-event-ingress.d.ts.map +1 -0
- package/dist/cron/cron-materializer.d.ts +36 -0
- package/dist/cron/cron-materializer.d.ts.map +1 -0
- package/dist/cron/cron-reconciler.d.ts +62 -0
- package/dist/cron/cron-reconciler.d.ts.map +1 -0
- package/dist/cron/cron-report-writer.d.ts +41 -0
- package/dist/cron/cron-report-writer.d.ts.map +1 -0
- package/dist/cron/cron-runner.d.ts +43 -0
- package/dist/cron/cron-runner.d.ts.map +1 -0
- package/dist/cron/cron-schema.d.ts +3 -0
- package/dist/cron/cron-schema.d.ts.map +1 -0
- package/dist/cron/cron-service.d.ts +57 -0
- package/dist/cron/cron-service.d.ts.map +1 -0
- package/dist/cron/cron-spec-parser.d.ts +27 -0
- package/dist/cron/cron-spec-parser.d.ts.map +1 -0
- package/dist/cron/cron-watcher.d.ts +23 -0
- package/dist/cron/cron-watcher.d.ts.map +1 -0
- package/dist/cron/scheduler.d.ts +3 -1
- package/dist/cron/scheduler.d.ts.map +1 -1
- package/dist/cron/sqlite-cron-store.d.ts +230 -0
- package/dist/cron/sqlite-cron-store.d.ts.map +1 -0
- package/dist/extensions/plugin/plugin-config-loader.d.ts +7 -1
- package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
- package/dist/extensions/plugin/plugin-loader.d.ts +10 -6
- package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
- package/dist/extensions/plugin/plugin-sandbox.d.ts +7 -1
- package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
- package/dist/extensions/plugin-sandbox-bootstrap.js +236 -275
- package/dist/extensions/tools/constants.d.ts +1 -0
- package/dist/extensions/tools/constants.d.ts.map +1 -1
- package/dist/extensions/tools/definitions.d.ts +2 -3
- package/dist/extensions/tools/definitions.d.ts.map +1 -1
- package/dist/extensions/tools/executors/editor.d.ts.map +1 -1
- package/dist/extensions/tools/helpers.d.ts +1 -0
- package/dist/extensions/tools/helpers.d.ts.map +1 -1
- package/dist/extensions/tools/index.d.ts +1 -2
- package/dist/extensions/tools/index.d.ts.map +1 -1
- package/dist/extensions/tools/presets.d.ts +1 -1
- package/dist/extensions/tools/schemas.d.ts +25 -3
- package/dist/extensions/tools/schemas.d.ts.map +1 -1
- package/dist/extensions/tools/team/delegated-agent.d.ts +2 -2
- package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -1
- package/dist/extensions/tools/team/multi-agent.d.ts +7 -3
- package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -1
- package/dist/extensions/tools/team/team-tools.d.ts.map +1 -1
- package/dist/extensions/tools/types.d.ts +0 -5
- package/dist/extensions/tools/types.d.ts.map +1 -1
- package/dist/hooks/hook-bridge.d.ts +118 -0
- package/dist/hooks/hook-bridge.d.ts.map +1 -0
- package/dist/hooks/hook-file-hooks.d.ts +2 -1
- package/dist/hooks/hook-file-hooks.d.ts.map +1 -1
- package/dist/hooks/hook-registry.d.ts +16 -0
- package/dist/hooks/hook-registry.d.ts.map +1 -0
- package/dist/hub/browser-websocket.d.ts.map +1 -1
- package/dist/hub/client.d.ts +7 -1
- package/dist/hub/client.d.ts.map +1 -1
- package/dist/hub/daemon-entry.js +721 -461
- package/dist/hub/daemon.d.ts.map +1 -1
- package/dist/hub/defaults.d.ts +8 -4
- package/dist/hub/defaults.d.ts.map +1 -1
- package/dist/hub/index.js +665 -415
- package/dist/hub/runtime-handlers.d.ts.map +1 -1
- package/dist/hub/server.d.ts +18 -0
- package/dist/hub/server.d.ts.map +1 -1
- package/dist/hub/session-client.d.ts +3 -0
- package/dist/hub/session-client.d.ts.map +1 -1
- package/dist/hub/start-shared-server.d.ts.map +1 -1
- package/dist/hub/ui-client.d.ts +1 -0
- package/dist/hub/ui-client.d.ts.map +1 -1
- package/dist/index.d.ts +9 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +756 -467
- package/dist/llms/cline-recommended-models.d.ts +20 -0
- package/dist/llms/cline-recommended-models.d.ts.map +1 -0
- package/dist/llms/handler-factory.d.ts +16 -0
- package/dist/llms/handler-factory.d.ts.map +1 -0
- package/dist/llms/provider-defaults.d.ts.map +1 -1
- package/dist/llms/provider-settings.d.ts +45 -2
- package/dist/llms/provider-settings.d.ts.map +1 -1
- package/dist/llms/runtime-registry.d.ts.map +1 -1
- package/dist/runtime/agent-config-adapter.d.ts +148 -0
- package/dist/runtime/agent-config-adapter.d.ts.map +1 -0
- package/dist/runtime/agent-runtime-config-builder.d.ts +96 -0
- package/dist/runtime/agent-runtime-config-builder.d.ts.map +1 -0
- package/dist/runtime/history.d.ts +6 -0
- package/dist/runtime/history.d.ts.map +1 -1
- package/dist/runtime/host.d.ts.map +1 -1
- package/dist/runtime/loop-detection.d.ts +59 -0
- package/dist/runtime/loop-detection.d.ts.map +1 -0
- package/dist/runtime/mistake-tracker.d.ts +69 -0
- package/dist/runtime/mistake-tracker.d.ts.map +1 -0
- package/dist/runtime/runtime-builder.d.ts.map +1 -1
- package/dist/runtime/runtime-event-adapter.d.ts +102 -0
- package/dist/runtime/runtime-event-adapter.d.ts.map +1 -0
- package/dist/runtime/runtime-host.d.ts +28 -3
- package/dist/runtime/runtime-host.d.ts.map +1 -1
- package/dist/runtime/session-runtime-orchestrator.d.ts +261 -0
- package/dist/runtime/session-runtime-orchestrator.d.ts.map +1 -0
- package/dist/runtime/session-runtime.d.ts +16 -3
- package/dist/runtime/session-runtime.d.ts.map +1 -1
- package/dist/runtime/user-input-builder.d.ts +24 -0
- package/dist/runtime/user-input-builder.d.ts.map +1 -0
- package/dist/services/index.js +28 -0
- package/dist/services/local-runtime-bootstrap.d.ts.map +1 -1
- package/dist/services/plugin-tools.d.ts.map +1 -1
- package/dist/services/providers/local-provider-registry.d.ts +197 -21
- package/dist/services/providers/local-provider-registry.d.ts.map +1 -1
- package/dist/services/providers/local-provider-service.d.ts +3 -1
- package/dist/services/providers/local-provider-service.d.ts.map +1 -1
- package/dist/services/session-data.d.ts.map +1 -1
- package/dist/services/session-telemetry.d.ts +7 -2
- package/dist/services/session-telemetry.d.ts.map +1 -1
- package/dist/services/storage/file-team-store.d.ts.map +1 -1
- package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -1
- package/dist/services/storage/provider-settings-manager.d.ts +1 -0
- package/dist/services/storage/provider-settings-manager.d.ts.map +1 -1
- package/dist/services/storage/sqlite-team-store.d.ts.map +1 -1
- package/dist/session/conversation-store.d.ts +30 -0
- package/dist/session/conversation-store.d.ts.map +1 -0
- package/dist/session/message-builder.d.ts +65 -0
- package/dist/session/message-builder.d.ts.map +1 -0
- package/dist/session/session-manifest.d.ts +1 -1
- package/dist/transports/hub.d.ts +14 -3
- package/dist/transports/hub.d.ts.map +1 -1
- package/dist/transports/local.d.ts +14 -4
- package/dist/transports/local.d.ts.map +1 -1
- package/dist/transports/remote.d.ts.map +1 -1
- package/dist/types/chat-schema.d.ts +5 -5
- package/dist/types/config.d.ts +9 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/events.d.ts +7 -6
- package/dist/types/events.d.ts.map +1 -1
- package/dist/types/provider-settings.d.ts +2 -2
- package/dist/types/provider-settings.d.ts.map +1 -1
- package/dist/types/session.d.ts +5 -2
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types.d.ts +4 -4
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/ClineCore.ts +691 -6
- package/src/account/cline-account-service.ts +44 -6
- package/src/cron/cron-event-ingress.ts +357 -0
- package/src/cron/cron-materializer.ts +97 -0
- package/src/cron/cron-reconciler.ts +241 -0
- package/src/cron/cron-report-writer.ts +153 -0
- package/src/cron/cron-runner.ts +495 -0
- package/src/cron/cron-schema.ts +127 -0
- package/src/cron/cron-service.ts +163 -0
- package/src/cron/cron-spec-parser.ts +489 -0
- package/src/cron/cron-watcher.ts +102 -0
- package/src/cron/index.ts +10 -0
- package/src/cron/scheduler.ts +141 -6
- package/src/cron/sqlite-cron-store.ts +1286 -0
- package/src/extensions/plugin/plugin-config-loader.ts +21 -1
- package/src/extensions/plugin/plugin-loader.ts +25 -9
- package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +151 -1
- package/src/extensions/plugin/plugin-sandbox.ts +131 -7
- package/src/extensions/tools/constants.ts +2 -0
- package/src/extensions/tools/definitions.ts +31 -22
- package/src/extensions/tools/executors/editor.ts +4 -3
- package/src/extensions/tools/helpers.ts +24 -0
- package/src/extensions/tools/index.ts +1 -2
- package/src/extensions/tools/presets.ts +1 -1
- package/src/extensions/tools/schemas.ts +13 -18
- package/src/extensions/tools/team/delegated-agent.ts +8 -3
- package/src/extensions/tools/team/multi-agent.ts +135 -19
- package/src/extensions/tools/team/team-tools.ts +151 -91
- package/src/extensions/tools/types.ts +0 -6
- package/src/hooks/hook-bridge.ts +489 -0
- package/src/hooks/hook-file-hooks.ts +58 -3
- package/src/hooks/hook-registry.ts +257 -0
- package/src/hub/browser-websocket.ts +26 -4
- package/src/hub/client.ts +72 -13
- package/src/hub/daemon-entry.ts +35 -0
- package/src/hub/daemon.ts +117 -14
- package/src/hub/defaults.ts +39 -12
- package/src/hub/runtime-handlers.ts +4 -3
- package/src/hub/server.ts +506 -77
- package/src/hub/session-client.ts +43 -1
- package/src/hub/start-shared-server.ts +3 -0
- package/src/hub/ui-client.ts +4 -0
- package/src/index.ts +46 -1
- package/src/llms/cline-recommended-models.ts +167 -0
- package/src/llms/handler-factory.ts +56 -0
- package/src/llms/provider-defaults.ts +17 -1
- package/src/llms/provider-settings.ts +48 -1
- package/src/llms/runtime-registry.ts +1 -0
- package/src/runtime/agent-config-adapter.ts +636 -0
- package/src/runtime/agent-runtime-config-builder.ts +205 -0
- package/src/runtime/error-feedback.ts +142 -0
- package/src/runtime/history.ts +137 -0
- package/src/runtime/host.ts +22 -0
- package/src/runtime/loop-detection.ts +162 -0
- package/src/runtime/mistake-tracker.ts +221 -0
- package/src/runtime/runtime-builder.ts +61 -5
- package/src/runtime/runtime-event-adapter.ts +412 -0
- package/src/runtime/runtime-host.ts +45 -1
- package/src/runtime/session-runtime-orchestrator.ts +1253 -0
- package/src/runtime/session-runtime.ts +16 -2
- package/src/runtime/user-input-builder.ts +167 -0
- package/src/services/local-runtime-bootstrap.ts +128 -22
- package/src/services/plugin-tools.ts +1 -0
- package/src/services/providers/local-provider-registry.ts +273 -57
- package/src/services/providers/local-provider-service.ts +67 -7
- package/src/services/session-data.ts +16 -14
- package/src/services/session-telemetry.ts +6 -15
- package/src/services/storage/file-team-store.ts +1 -5
- package/src/services/storage/provider-settings-legacy-migration.ts +8 -47
- package/src/services/storage/provider-settings-manager.ts +16 -1
- package/src/services/storage/sqlite-team-store.ts +1 -5
- package/src/session/conversation-store.ts +77 -0
- package/src/session/message-builder.ts +941 -0
- package/src/transports/hub.ts +458 -33
- package/src/transports/local.ts +296 -65
- package/src/transports/remote.ts +1 -0
- package/src/types/config.ts +9 -0
- package/src/types/events.ts +8 -6
- package/src/types/index.ts +3 -0
- package/src/types/provider-settings.ts +8 -1
- package/src/types/session.ts +5 -2
- package/src/types.ts +15 -1
- package/dist/cron/index.d.ts +0 -6
- package/dist/cron/index.d.ts.map +0 -1
- package/dist/services/telemetry/index.js +0 -28
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import type { Agent } from "@clinebot/agents";
|
|
2
1
|
import type {
|
|
3
2
|
AgentConfig,
|
|
4
3
|
AgentHooks,
|
|
5
4
|
AgentResult,
|
|
6
5
|
BasicLogger,
|
|
7
6
|
ITelemetryService,
|
|
7
|
+
RuntimeConfigExtensionKind,
|
|
8
8
|
Tool,
|
|
9
9
|
} from "@clinebot/shared";
|
|
10
10
|
import type { UserInstructionConfigWatcher } from "../extensions/config";
|
|
@@ -16,6 +16,19 @@ import type {
|
|
|
16
16
|
} from "../extensions/tools/team";
|
|
17
17
|
import type { CoreSessionConfig } from "../types/config";
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
* Internal structural alias for the lead-agent handle that
|
|
21
|
+
* {@link BuiltRuntime.registerLeadAgent} hands off to
|
|
22
|
+
* `runtime-builder.ts`. Narrowed to only the `.addTools()` surface the
|
|
23
|
+
* callback exercises; avoids depending on `@clinebot/agents`' `Agent`
|
|
24
|
+
* class during the PLAN.md §3.6 Step 5 type-only migration. When
|
|
25
|
+
* SessionRuntime is rebuilt in Step 6, this field is expected to be
|
|
26
|
+
* dropped entirely per §3.5 row #2.
|
|
27
|
+
*/
|
|
28
|
+
type LeadAgentHandle = {
|
|
29
|
+
addTools(tools: Tool[]): unknown;
|
|
30
|
+
};
|
|
31
|
+
|
|
19
32
|
export interface BuiltRuntime {
|
|
20
33
|
tools: Tool[];
|
|
21
34
|
hooks?: AgentHooks;
|
|
@@ -25,7 +38,7 @@ export interface BuiltRuntime {
|
|
|
25
38
|
teamRestoredFromPersistence?: boolean;
|
|
26
39
|
delegatedAgentConfigProvider?: DelegatedAgentConfigProvider;
|
|
27
40
|
completionGuard?: () => string | undefined;
|
|
28
|
-
registerLeadAgent?: (agent:
|
|
41
|
+
registerLeadAgent?: (agent: LeadAgentHandle) => void;
|
|
29
42
|
shutdown: (reason: string) => Promise<void> | void;
|
|
30
43
|
}
|
|
31
44
|
|
|
@@ -37,6 +50,7 @@ export interface RuntimeBuilderInput {
|
|
|
37
50
|
createSpawnTool?: () => Tool;
|
|
38
51
|
onTeamRestored?: () => void;
|
|
39
52
|
userInstructionWatcher?: UserInstructionConfigWatcher;
|
|
53
|
+
configExtensions?: RuntimeConfigExtensionKind[];
|
|
40
54
|
defaultToolExecutors?: Partial<ToolExecutors>;
|
|
41
55
|
logger?: BasicLogger;
|
|
42
56
|
telemetry?: ITelemetryService;
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User-input / first-turn content assembler.
|
|
3
|
+
*
|
|
4
|
+
* @see PLAN.md §3.1 — moved from `packages/agents/src/utils/agent-input.ts`.
|
|
5
|
+
* @see PLAN.md §3.2.4 — called from the `Agent.run/continue` facade via
|
|
6
|
+
* the `buildInitialUserContent` helper.
|
|
7
|
+
*
|
|
8
|
+
* Pure port. Opens the first user ContentBlock[] for a turn, loading user
|
|
9
|
+
* file contents via the injected `userFileContentLoader` (already
|
|
10
|
+
* core-owned per §3.1 notes on `packages/core/src/transports/local.ts`).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type * as LlmsProviders from "@clinebot/llms";
|
|
14
|
+
|
|
15
|
+
export async function buildInitialUserContent(
|
|
16
|
+
userMessage: string,
|
|
17
|
+
userImages?: string[],
|
|
18
|
+
userFiles?: string[],
|
|
19
|
+
userFileContentLoader?: (path: string) => Promise<string>,
|
|
20
|
+
): Promise<string | LlmsProviders.ContentBlock[]> {
|
|
21
|
+
const imageBlocks = buildImageBlocks(userImages);
|
|
22
|
+
const fileTextBlocks = await buildUserFileContentBlock(
|
|
23
|
+
userFiles,
|
|
24
|
+
userFileContentLoader,
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
if (imageBlocks.length === 0 && !fileTextBlocks) {
|
|
28
|
+
return userMessage;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const content: LlmsProviders.ContentBlock[] = [
|
|
32
|
+
{
|
|
33
|
+
type: "text",
|
|
34
|
+
text: userMessage,
|
|
35
|
+
},
|
|
36
|
+
...imageBlocks,
|
|
37
|
+
];
|
|
38
|
+
if (fileTextBlocks) {
|
|
39
|
+
content.push(...fileTextBlocks);
|
|
40
|
+
}
|
|
41
|
+
return content;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Normalize a user message shape into a plain string when possible.
|
|
46
|
+
*
|
|
47
|
+
* @see PLAN.md §3.1 — exported from the user-input-builder module so
|
|
48
|
+
* SessionRuntime can use it to sanitise ad-hoc input.
|
|
49
|
+
*
|
|
50
|
+
* Accepts either a string or a LlmsProviders.Message; returns the best-effort
|
|
51
|
+
* concatenated plain-text body. Non-text content is ignored.
|
|
52
|
+
*/
|
|
53
|
+
export function normalizeUserMessage(
|
|
54
|
+
input: string | LlmsProviders.Message | undefined,
|
|
55
|
+
): string {
|
|
56
|
+
if (input == null) {
|
|
57
|
+
return "";
|
|
58
|
+
}
|
|
59
|
+
if (typeof input === "string") {
|
|
60
|
+
return input;
|
|
61
|
+
}
|
|
62
|
+
const content = input.content;
|
|
63
|
+
if (typeof content === "string") {
|
|
64
|
+
return content;
|
|
65
|
+
}
|
|
66
|
+
if (!Array.isArray(content)) {
|
|
67
|
+
return "";
|
|
68
|
+
}
|
|
69
|
+
const textParts: string[] = [];
|
|
70
|
+
for (const block of content) {
|
|
71
|
+
if (block && typeof block === "object" && block.type === "text") {
|
|
72
|
+
const text = (block as { text?: unknown }).text;
|
|
73
|
+
if (typeof text === "string") {
|
|
74
|
+
textParts.push(text);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return textParts.join("\n");
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function buildImageBlocks(userImages?: string[]): LlmsProviders.ImageContent[] {
|
|
82
|
+
if (!userImages || userImages.length === 0) {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const blocks: LlmsProviders.ImageContent[] = [];
|
|
87
|
+
for (const image of userImages) {
|
|
88
|
+
const block = parseDataUrlImage(image);
|
|
89
|
+
if (block) {
|
|
90
|
+
blocks.push(block);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return blocks;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function parseDataUrlImage(
|
|
97
|
+
image: string,
|
|
98
|
+
): LlmsProviders.ImageContent | undefined {
|
|
99
|
+
const value = image.trim();
|
|
100
|
+
if (!value) {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const dataUrlMatch = value.match(/^data:([^;,]+);base64,(.+)$/);
|
|
105
|
+
if (dataUrlMatch) {
|
|
106
|
+
const mediaType = dataUrlMatch[1];
|
|
107
|
+
const data = dataUrlMatch[2];
|
|
108
|
+
if (!mediaType || !data) {
|
|
109
|
+
return undefined;
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
type: "image",
|
|
113
|
+
mediaType,
|
|
114
|
+
data,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Fallback: treat as plain base64 payload.
|
|
119
|
+
return {
|
|
120
|
+
type: "image",
|
|
121
|
+
mediaType: "image/png",
|
|
122
|
+
data: value,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async function buildUserFileContentBlock(
|
|
127
|
+
userFiles?: string[],
|
|
128
|
+
userFileContentLoader?: (path: string) => Promise<string>,
|
|
129
|
+
): Promise<LlmsProviders.FileContent[] | undefined> {
|
|
130
|
+
if (!userFiles || userFiles.length === 0) {
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const loader =
|
|
135
|
+
userFileContentLoader ??
|
|
136
|
+
(async () => {
|
|
137
|
+
throw new Error(
|
|
138
|
+
"File loading is not configured in this runtime. Provide userFileContentLoader to enable userFiles support.",
|
|
139
|
+
);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
const contents = await Promise.all(
|
|
143
|
+
userFiles.map(async (filePath) => {
|
|
144
|
+
const normalizedPath = filePath.replace(/\\/g, "/");
|
|
145
|
+
try {
|
|
146
|
+
const content = await loader(filePath);
|
|
147
|
+
return {
|
|
148
|
+
type: "file",
|
|
149
|
+
path: normalizedPath,
|
|
150
|
+
content,
|
|
151
|
+
} satisfies LlmsProviders.FileContent;
|
|
152
|
+
} catch (error) {
|
|
153
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
154
|
+
return {
|
|
155
|
+
type: "file",
|
|
156
|
+
path: normalizedPath,
|
|
157
|
+
content: `Error fetching content: ${message}`,
|
|
158
|
+
} satisfies LlmsProviders.FileContent;
|
|
159
|
+
}
|
|
160
|
+
}),
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
if (contents.length === 0) {
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
return contents;
|
|
167
|
+
}
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import type {
|
|
2
2
|
AgentConfig,
|
|
3
3
|
AgentHooks,
|
|
4
|
+
ExtensionContext,
|
|
4
5
|
ITelemetryService,
|
|
6
|
+
RuntimeConfigExtensionKind,
|
|
5
7
|
Tool,
|
|
6
8
|
ToolApprovalRequest,
|
|
7
9
|
ToolApprovalResult,
|
|
8
10
|
WorkspaceInfo,
|
|
9
11
|
} from "@clinebot/shared";
|
|
12
|
+
import { decodeJwtPayload } from "../auth/utils";
|
|
10
13
|
import { resolveAndLoadAgentPlugins } from "../extensions/plugin/plugin-config-loader";
|
|
11
14
|
import type {
|
|
12
15
|
PluginInitializationFailure,
|
|
@@ -89,8 +92,72 @@ function resolveReasoningSettings(
|
|
|
89
92
|
};
|
|
90
93
|
}
|
|
91
94
|
|
|
95
|
+
const ALL_CONFIG_EXTENSIONS: readonly RuntimeConfigExtensionKind[] = [
|
|
96
|
+
"rules",
|
|
97
|
+
"skills",
|
|
98
|
+
"plugins",
|
|
99
|
+
];
|
|
100
|
+
|
|
101
|
+
function hasConfigExtension(
|
|
102
|
+
extensions: ReadonlyArray<RuntimeConfigExtensionKind> | undefined,
|
|
103
|
+
kind: RuntimeConfigExtensionKind,
|
|
104
|
+
): boolean {
|
|
105
|
+
return new Set(extensions ?? ALL_CONFIG_EXTENSIONS).has(kind);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function buildOpenAICodexHeaders(input: {
|
|
109
|
+
sessionId: string;
|
|
110
|
+
configHeaders: CoreSessionConfig["headers"];
|
|
111
|
+
storedHeaders: ProviderSettings["headers"];
|
|
112
|
+
accountId?: string;
|
|
113
|
+
accessToken?: string;
|
|
114
|
+
}): Record<string, string> | undefined {
|
|
115
|
+
const headers: Record<string, string> = {
|
|
116
|
+
...(input.storedHeaders ?? {}),
|
|
117
|
+
...(input.configHeaders ?? {}),
|
|
118
|
+
};
|
|
119
|
+
const resolvedAccountId =
|
|
120
|
+
input.accountId?.trim() || deriveOpenAICodexAccountId(input.accessToken);
|
|
121
|
+
headers.originator = "cline";
|
|
122
|
+
headers.session_id = input.sessionId;
|
|
123
|
+
headers["User-Agent"] = `Cline/${process.env.npm_package_version || "1.0.0"}`;
|
|
124
|
+
if (resolvedAccountId) {
|
|
125
|
+
headers["ChatGPT-Account-Id"] = resolvedAccountId;
|
|
126
|
+
}
|
|
127
|
+
return headers;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function deriveOpenAICodexAccountId(
|
|
131
|
+
accessToken: string | undefined,
|
|
132
|
+
): string | undefined {
|
|
133
|
+
const trimmed = accessToken?.trim();
|
|
134
|
+
if (!trimmed) {
|
|
135
|
+
return undefined;
|
|
136
|
+
}
|
|
137
|
+
const payload = decodeJwtPayload(trimmed) as {
|
|
138
|
+
"https://api.openai.com/auth"?: { chatgpt_account_id?: string };
|
|
139
|
+
organizations?: Array<{ id?: string }>;
|
|
140
|
+
chatgpt_account_id?: string;
|
|
141
|
+
} | null;
|
|
142
|
+
const authAccountId =
|
|
143
|
+
payload?.["https://api.openai.com/auth"]?.chatgpt_account_id;
|
|
144
|
+
if (typeof authAccountId === "string" && authAccountId.length > 0) {
|
|
145
|
+
return authAccountId;
|
|
146
|
+
}
|
|
147
|
+
const orgAccountId = payload?.organizations?.[0]?.id;
|
|
148
|
+
if (typeof orgAccountId === "string" && orgAccountId.length > 0) {
|
|
149
|
+
return orgAccountId;
|
|
150
|
+
}
|
|
151
|
+
const rootAccountId = payload?.chatgpt_account_id;
|
|
152
|
+
if (typeof rootAccountId === "string" && rootAccountId.length > 0) {
|
|
153
|
+
return rootAccountId;
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
|
|
92
158
|
function buildProviderConfig(
|
|
93
159
|
config: CoreSessionConfig,
|
|
160
|
+
sessionId: string,
|
|
94
161
|
providerSettingsManager: ProviderSettingsManager,
|
|
95
162
|
modelCatalogDefaults?: Partial<ProviderSettings["modelCatalog"]>,
|
|
96
163
|
defaultFetch?: typeof fetch,
|
|
@@ -109,7 +176,17 @@ function buildProviderConfig(
|
|
|
109
176
|
model: config.modelId,
|
|
110
177
|
apiKey: config.apiKey ?? stored?.apiKey,
|
|
111
178
|
baseUrl: config.baseUrl ?? stored?.baseUrl,
|
|
112
|
-
headers:
|
|
179
|
+
headers:
|
|
180
|
+
config.providerId === "openai-codex"
|
|
181
|
+
? buildOpenAICodexHeaders({
|
|
182
|
+
sessionId,
|
|
183
|
+
configHeaders: config.headers,
|
|
184
|
+
storedHeaders: stored?.headers,
|
|
185
|
+
accountId: stored?.auth?.accountId,
|
|
186
|
+
accessToken:
|
|
187
|
+
config.apiKey ?? stored?.auth?.accessToken ?? stored?.apiKey,
|
|
188
|
+
})
|
|
189
|
+
: (config.headers ?? stored?.headers),
|
|
113
190
|
reasoning: resolveReasoningSettings(config, stored?.reasoning),
|
|
114
191
|
modelCatalog,
|
|
115
192
|
};
|
|
@@ -202,6 +279,23 @@ export async function prepareLocalRuntimeBootstrap(
|
|
|
202
279
|
// as workspaceMetadata; the structured object is kept as workspaceInfo.
|
|
203
280
|
const { workspaceInfo, workspaceMetadata } =
|
|
204
281
|
await buildWorkspaceMetadataWithInfo(input.config.cwd);
|
|
282
|
+
const configuredExtensionContext = localConfig?.extensionContext;
|
|
283
|
+
const extensionContext: ExtensionContext = {
|
|
284
|
+
...(configuredExtensionContext ?? {}),
|
|
285
|
+
workspace: {
|
|
286
|
+
...workspaceInfo,
|
|
287
|
+
...(configuredExtensionContext?.workspace ?? {}),
|
|
288
|
+
},
|
|
289
|
+
session: {
|
|
290
|
+
...(configuredExtensionContext?.session ?? {}),
|
|
291
|
+
sessionId,
|
|
292
|
+
},
|
|
293
|
+
logger: configuredExtensionContext?.logger ?? configOverrides?.logger,
|
|
294
|
+
telemetry:
|
|
295
|
+
configuredExtensionContext?.telemetry ??
|
|
296
|
+
configOverrides?.telemetry ??
|
|
297
|
+
defaultTelemetry,
|
|
298
|
+
};
|
|
205
299
|
|
|
206
300
|
const fileHooks = createHookConfigFileHooks({
|
|
207
301
|
cwd: input.config.cwd,
|
|
@@ -226,26 +320,34 @@ export async function prepareLocalRuntimeBootstrap(
|
|
|
226
320
|
let loadedPlugins:
|
|
227
321
|
| Awaited<ReturnType<typeof resolveAndLoadAgentPlugins>>
|
|
228
322
|
| undefined;
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
323
|
+
if (hasConfigExtension(localRuntime?.configExtensions, "plugins")) {
|
|
324
|
+
try {
|
|
325
|
+
loadedPlugins = await resolveAndLoadAgentPlugins({
|
|
326
|
+
pluginPaths: localConfig?.pluginPaths,
|
|
327
|
+
workspacePath,
|
|
328
|
+
cwd: input.config.cwd,
|
|
329
|
+
onEvent: onPluginEvent,
|
|
330
|
+
providerId: input.config.providerId,
|
|
331
|
+
modelId: input.config.modelId,
|
|
332
|
+
workspaceInfo,
|
|
333
|
+
session: extensionContext.session,
|
|
334
|
+
client: extensionContext.client,
|
|
335
|
+
user: extensionContext.user,
|
|
336
|
+
logger: extensionContext.logger,
|
|
337
|
+
telemetry: extensionContext.telemetry,
|
|
338
|
+
automation: extensionContext.automation,
|
|
339
|
+
});
|
|
340
|
+
logPluginDiagnostics(
|
|
341
|
+
loadedPlugins.failures,
|
|
342
|
+
loadedPlugins.warnings,
|
|
343
|
+
configOverrides?.logger,
|
|
344
|
+
);
|
|
345
|
+
} catch (error) {
|
|
346
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
347
|
+
configOverrides?.logger?.log?.(
|
|
348
|
+
`plugin loading failed; continuing without plugins (${message})`,
|
|
349
|
+
);
|
|
350
|
+
}
|
|
249
351
|
}
|
|
250
352
|
|
|
251
353
|
const extensions = mergeAgentExtensions(
|
|
@@ -255,12 +357,15 @@ export async function prepareLocalRuntimeBootstrap(
|
|
|
255
357
|
const baseConfig: CoreSessionConfig = {
|
|
256
358
|
...input.config,
|
|
257
359
|
...(configOverrides ?? {}),
|
|
360
|
+
sessionId,
|
|
258
361
|
hooks: baseHooks,
|
|
259
362
|
extensions,
|
|
260
|
-
|
|
363
|
+
extensionContext,
|
|
364
|
+
telemetry: extensionContext.telemetry,
|
|
261
365
|
};
|
|
262
366
|
const providerConfig = buildProviderConfig(
|
|
263
367
|
baseConfig,
|
|
368
|
+
sessionId,
|
|
264
369
|
providerSettingsManager,
|
|
265
370
|
localRuntime?.modelCatalogDefaults,
|
|
266
371
|
defaultFetch,
|
|
@@ -310,6 +415,7 @@ export async function prepareLocalRuntimeBootstrap(
|
|
|
310
415
|
createSpawnTool,
|
|
311
416
|
onTeamRestored: localRuntime?.onTeamRestored,
|
|
312
417
|
userInstructionWatcher: localRuntime?.userInstructionWatcher,
|
|
418
|
+
configExtensions: localRuntime?.configExtensions,
|
|
313
419
|
defaultToolExecutors: effectiveToolExecutors,
|
|
314
420
|
logger: config.logger,
|
|
315
421
|
telemetry: config.telemetry,
|