@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
package/src/hub/daemon.ts
CHANGED
|
@@ -2,23 +2,32 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import { closeSync, mkdirSync, openSync } from "node:fs";
|
|
3
3
|
import { basename, dirname, join } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
-
import {
|
|
6
|
-
|
|
5
|
+
import {
|
|
6
|
+
CLINE_RUN_AS_HUB_DAEMON_ENV,
|
|
7
|
+
isHubDaemonProcess,
|
|
8
|
+
withResolvedClineBuildEnv,
|
|
9
|
+
} from "@clinebot/shared";
|
|
10
|
+
import { requestHubShutdown, verifyHubConnection } from "./client";
|
|
7
11
|
import {
|
|
8
12
|
type HubEndpointOverrides,
|
|
9
13
|
resolveHubEndpointOptions,
|
|
10
14
|
} from "./defaults";
|
|
11
15
|
import {
|
|
16
|
+
clearHubDiscovery,
|
|
12
17
|
createHubServerUrl,
|
|
18
|
+
type HubServerDiscoveryRecord,
|
|
13
19
|
probeHubServer,
|
|
14
20
|
readHubDiscovery,
|
|
15
21
|
resolveClineDataDir,
|
|
22
|
+
resolveHubBuildId,
|
|
16
23
|
writeHubDiscovery,
|
|
17
24
|
} from "./discovery";
|
|
18
25
|
import { resolveSharedHubOwnerContext } from "./workspace";
|
|
19
26
|
|
|
20
27
|
const HUB_STARTUP_TIMEOUT_MS = 8_000;
|
|
21
28
|
const HUB_STARTUP_POLL_MS = 200;
|
|
29
|
+
const HUB_RETIRE_TIMEOUT_MS = 3_000;
|
|
30
|
+
const HUB_RETIRE_POLL_MS = 100;
|
|
22
31
|
|
|
23
32
|
function endpointArgs(endpoint: HubEndpointOverrides): string[] {
|
|
24
33
|
return [
|
|
@@ -40,6 +49,45 @@ function openDetachedHubLogFile(): { fd: number; logPath: string } | undefined {
|
|
|
40
49
|
}
|
|
41
50
|
}
|
|
42
51
|
|
|
52
|
+
function isCompatibleHubRecord(record: HubServerDiscoveryRecord): boolean {
|
|
53
|
+
const recordBuildId = record.buildId?.trim();
|
|
54
|
+
return !!recordBuildId && recordBuildId === resolveHubBuildId();
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async function waitForHubToRetire(
|
|
58
|
+
url: string,
|
|
59
|
+
timeoutMs: number,
|
|
60
|
+
): Promise<boolean> {
|
|
61
|
+
const deadline = Date.now() + timeoutMs;
|
|
62
|
+
while (Date.now() < deadline) {
|
|
63
|
+
const healthy = await probeHubServer(url).catch(() => undefined);
|
|
64
|
+
if (!healthy?.url) {
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
67
|
+
await new Promise((resolve) => setTimeout(resolve, HUB_RETIRE_POLL_MS));
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async function retireIncompatibleHub(
|
|
73
|
+
record: HubServerDiscoveryRecord,
|
|
74
|
+
discoveryPath: string,
|
|
75
|
+
): Promise<void> {
|
|
76
|
+
if (isCompatibleHubRecord(record)) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
await requestHubShutdown(record.url).catch(() => false);
|
|
80
|
+
if (record.pid) {
|
|
81
|
+
try {
|
|
82
|
+
process.kill(record.pid, "SIGTERM");
|
|
83
|
+
} catch {
|
|
84
|
+
// Best-effort cleanup only. A compatible hub may still start on a fallback port.
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
await waitForHubToRetire(record.url, HUB_RETIRE_TIMEOUT_MS);
|
|
88
|
+
await clearHubDiscovery(discoveryPath).catch(() => undefined);
|
|
89
|
+
}
|
|
90
|
+
|
|
43
91
|
function resolveDaemonEntryPath(): string {
|
|
44
92
|
const extension = import.meta.url.endsWith(".ts") ? "ts" : "js";
|
|
45
93
|
return fileURLToPath(new URL(`./daemon-entry.${extension}`, import.meta.url));
|
|
@@ -75,6 +123,7 @@ function resolveLaunchCommand(
|
|
|
75
123
|
env: {
|
|
76
124
|
...withResolvedClineBuildEnv(process.env),
|
|
77
125
|
CLINE_NO_INTERACTIVE: "1",
|
|
126
|
+
[CLINE_RUN_AS_HUB_DAEMON_ENV]: "1",
|
|
78
127
|
},
|
|
79
128
|
};
|
|
80
129
|
}
|
|
@@ -83,6 +132,9 @@ export function spawnDetachedHubServer(
|
|
|
83
132
|
workspaceRoot: string,
|
|
84
133
|
endpoint: HubEndpointOverrides = {},
|
|
85
134
|
): void {
|
|
135
|
+
if (isHubDaemonProcess()) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
86
138
|
const command = resolveLaunchCommand(workspaceRoot, endpoint);
|
|
87
139
|
const logFile = openDetachedHubLogFile();
|
|
88
140
|
try {
|
|
@@ -104,7 +156,12 @@ export function prewarmDetachedHubServer(
|
|
|
104
156
|
workspaceRoot: string,
|
|
105
157
|
endpoint: HubEndpointOverrides = {},
|
|
106
158
|
): void {
|
|
159
|
+
if (isHubDaemonProcess()) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
107
162
|
const owner = resolveSharedHubOwnerContext();
|
|
163
|
+
const hasExplicitPort =
|
|
164
|
+
endpoint.port !== undefined || !!process.env.CLINE_HUB_PORT?.trim();
|
|
108
165
|
const resolvedEndpoint = resolveHubEndpointOptions(endpoint);
|
|
109
166
|
const expectedUrl = createHubServerUrl(
|
|
110
167
|
resolvedEndpoint.host,
|
|
@@ -115,19 +172,36 @@ export function prewarmDetachedHubServer(
|
|
|
115
172
|
.then(async (discovered) => {
|
|
116
173
|
if (discovered?.url) {
|
|
117
174
|
const healthy = await probeHubServer(discovered.url);
|
|
118
|
-
if (
|
|
175
|
+
if (
|
|
176
|
+
healthy?.url &&
|
|
177
|
+
isCompatibleHubRecord(healthy) &&
|
|
178
|
+
(await verifyHubConnection(healthy.url))
|
|
179
|
+
) {
|
|
119
180
|
return;
|
|
120
181
|
}
|
|
182
|
+
if (healthy?.url) {
|
|
183
|
+
await retireIncompatibleHub(healthy, owner.discoveryPath);
|
|
184
|
+
} else {
|
|
185
|
+
await clearHubDiscovery(owner.discoveryPath).catch(() => undefined);
|
|
186
|
+
}
|
|
121
187
|
}
|
|
122
188
|
const expected = await probeHubServer(expectedUrl);
|
|
123
|
-
if (
|
|
189
|
+
if (
|
|
190
|
+
expected?.url &&
|
|
191
|
+
isCompatibleHubRecord(expected) &&
|
|
192
|
+
(await verifyHubConnection(expected.url))
|
|
193
|
+
) {
|
|
124
194
|
await writeHubDiscovery(owner.discoveryPath, expected);
|
|
125
195
|
return;
|
|
126
196
|
}
|
|
127
|
-
|
|
128
|
-
expected
|
|
129
|
-
|
|
130
|
-
|
|
197
|
+
if (expected?.url) {
|
|
198
|
+
await retireIncompatibleHub(expected, owner.discoveryPath);
|
|
199
|
+
}
|
|
200
|
+
const shouldUseFallbackPort =
|
|
201
|
+
!hasExplicitPort && resolvedEndpoint.port !== 0;
|
|
202
|
+
const spawnEndpoint = shouldUseFallbackPort
|
|
203
|
+
? { ...resolvedEndpoint, port: 0 }
|
|
204
|
+
: resolvedEndpoint;
|
|
131
205
|
spawnDetachedHubServer(workspaceRoot, spawnEndpoint);
|
|
132
206
|
})
|
|
133
207
|
.catch(() => {
|
|
@@ -140,6 +214,9 @@ export async function ensureDetachedHubServer(
|
|
|
140
214
|
endpointOverrides: HubEndpointOverrides = {},
|
|
141
215
|
): Promise<string> {
|
|
142
216
|
const owner = resolveSharedHubOwnerContext();
|
|
217
|
+
const hasExplicitPort =
|
|
218
|
+
endpointOverrides.port !== undefined ||
|
|
219
|
+
!!process.env.CLINE_HUB_PORT?.trim();
|
|
143
220
|
const endpoint = resolveHubEndpointOptions(endpointOverrides);
|
|
144
221
|
const expectedUrl = createHubServerUrl(
|
|
145
222
|
endpoint.host,
|
|
@@ -149,29 +226,55 @@ export async function ensureDetachedHubServer(
|
|
|
149
226
|
const discovered = await readHubDiscovery(owner.discoveryPath);
|
|
150
227
|
if (discovered?.url) {
|
|
151
228
|
const healthy = await probeHubServer(discovered.url);
|
|
152
|
-
if (
|
|
229
|
+
if (
|
|
230
|
+
healthy?.url &&
|
|
231
|
+
isCompatibleHubRecord(healthy) &&
|
|
232
|
+
(await verifyHubConnection(healthy.url))
|
|
233
|
+
) {
|
|
153
234
|
return healthy.url;
|
|
154
235
|
}
|
|
236
|
+
if (healthy?.url) {
|
|
237
|
+
await retireIncompatibleHub(healthy, owner.discoveryPath);
|
|
238
|
+
} else {
|
|
239
|
+
await clearHubDiscovery(owner.discoveryPath).catch(() => undefined);
|
|
240
|
+
}
|
|
155
241
|
}
|
|
156
242
|
const expected = await probeHubServer(expectedUrl);
|
|
157
|
-
if (
|
|
243
|
+
if (
|
|
244
|
+
expected?.url &&
|
|
245
|
+
isCompatibleHubRecord(expected) &&
|
|
246
|
+
(await verifyHubConnection(expected.url))
|
|
247
|
+
) {
|
|
158
248
|
await writeHubDiscovery(owner.discoveryPath, expected);
|
|
159
249
|
return expected.url;
|
|
160
250
|
}
|
|
161
|
-
|
|
162
|
-
expected
|
|
251
|
+
if (expected?.url) {
|
|
252
|
+
await retireIncompatibleHub(expected, owner.discoveryPath);
|
|
253
|
+
}
|
|
254
|
+
const shouldUseFallbackPort = !hasExplicitPort && endpoint.port !== 0;
|
|
255
|
+
const spawnEndpoint = shouldUseFallbackPort
|
|
256
|
+
? { ...endpoint, port: 0 }
|
|
257
|
+
: endpoint;
|
|
163
258
|
spawnDetachedHubServer(workspaceRoot, spawnEndpoint);
|
|
164
259
|
const deadline = Date.now() + HUB_STARTUP_TIMEOUT_MS;
|
|
165
260
|
while (Date.now() < deadline) {
|
|
166
261
|
const nextDiscovery = await readHubDiscovery(owner.discoveryPath);
|
|
167
262
|
if (nextDiscovery?.url) {
|
|
168
263
|
const healthy = await probeHubServer(nextDiscovery.url);
|
|
169
|
-
if (
|
|
264
|
+
if (
|
|
265
|
+
healthy?.url &&
|
|
266
|
+
isCompatibleHubRecord(healthy) &&
|
|
267
|
+
(await verifyHubConnection(healthy.url))
|
|
268
|
+
) {
|
|
170
269
|
return healthy.url;
|
|
171
270
|
}
|
|
172
271
|
}
|
|
173
272
|
const nextExpected = await probeHubServer(expectedUrl);
|
|
174
|
-
if (
|
|
273
|
+
if (
|
|
274
|
+
nextExpected?.url &&
|
|
275
|
+
isCompatibleHubRecord(nextExpected) &&
|
|
276
|
+
(await verifyHubConnection(nextExpected.url))
|
|
277
|
+
) {
|
|
175
278
|
await writeHubDiscovery(owner.discoveryPath, nextExpected);
|
|
176
279
|
return nextExpected.url;
|
|
177
280
|
}
|
package/src/hub/defaults.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CLINE_HUB_DEV_PORT,
|
|
3
|
+
CLINE_HUB_PORT,
|
|
4
|
+
resolveClineBuildEnv,
|
|
5
|
+
} from "@clinebot/shared";
|
|
6
|
+
|
|
1
7
|
const HUB_HOST_ENV = "CLINE_HUB_HOST";
|
|
2
8
|
const HUB_PORT_ENV = "CLINE_HUB_PORT";
|
|
3
9
|
const HUB_PATHNAME_ENV = "CLINE_HUB_PATHNAME";
|
|
4
10
|
|
|
5
11
|
export const DEFAULT_HUB_HOST = "127.0.0.1";
|
|
6
|
-
export const DEFAULT_HUB_PORT =
|
|
12
|
+
export const DEFAULT_HUB_PORT = CLINE_HUB_PORT;
|
|
7
13
|
export const DEFAULT_HUB_PATHNAME = "/hub";
|
|
8
14
|
|
|
9
15
|
export interface HubEndpointOverrides {
|
|
@@ -12,32 +18,53 @@ export interface HubEndpointOverrides {
|
|
|
12
18
|
pathname?: string;
|
|
13
19
|
}
|
|
14
20
|
|
|
15
|
-
export
|
|
16
|
-
|
|
21
|
+
export interface ResolveHubDefaultsOptions {
|
|
22
|
+
env?: NodeJS.ProcessEnv;
|
|
23
|
+
execArgv?: string[];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function fallbackHubPort(options: ResolveHubDefaultsOptions): number {
|
|
27
|
+
return resolveClineBuildEnv(options) === "development"
|
|
28
|
+
? CLINE_HUB_DEV_PORT
|
|
29
|
+
: DEFAULT_HUB_PORT;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function resolveDefaultHubHost(
|
|
33
|
+
options: ResolveHubDefaultsOptions = {},
|
|
34
|
+
): string {
|
|
35
|
+
const env = options.env ?? process.env;
|
|
36
|
+
return env[HUB_HOST_ENV]?.trim() || DEFAULT_HUB_HOST;
|
|
17
37
|
}
|
|
18
38
|
|
|
19
|
-
export function resolveDefaultHubPort(
|
|
20
|
-
|
|
39
|
+
export function resolveDefaultHubPort(
|
|
40
|
+
options: ResolveHubDefaultsOptions = {},
|
|
41
|
+
): number {
|
|
42
|
+
const env = options.env ?? process.env;
|
|
43
|
+
const raw = env[HUB_PORT_ENV]?.trim();
|
|
21
44
|
if (!raw) {
|
|
22
|
-
return
|
|
45
|
+
return fallbackHubPort(options);
|
|
23
46
|
}
|
|
24
47
|
const port = Number.parseInt(raw, 10);
|
|
25
48
|
if (!Number.isInteger(port) || port < 1 || port > 65_535) {
|
|
26
|
-
return
|
|
49
|
+
return fallbackHubPort(options);
|
|
27
50
|
}
|
|
28
51
|
return port;
|
|
29
52
|
}
|
|
30
53
|
|
|
31
|
-
export function resolveDefaultHubPathname(
|
|
32
|
-
|
|
54
|
+
export function resolveDefaultHubPathname(
|
|
55
|
+
options: ResolveHubDefaultsOptions = {},
|
|
56
|
+
): string {
|
|
57
|
+
const env = options.env ?? process.env;
|
|
58
|
+
return env[HUB_PATHNAME_ENV]?.trim() || DEFAULT_HUB_PATHNAME;
|
|
33
59
|
}
|
|
34
60
|
|
|
35
61
|
export function resolveHubEndpointOptions(
|
|
36
62
|
overrides: HubEndpointOverrides = {},
|
|
63
|
+
options: ResolveHubDefaultsOptions = {},
|
|
37
64
|
): Required<HubEndpointOverrides> {
|
|
38
65
|
return {
|
|
39
|
-
host: overrides.host ?? resolveDefaultHubHost(),
|
|
40
|
-
port: overrides.port ?? resolveDefaultHubPort(),
|
|
41
|
-
pathname: overrides.pathname ?? resolveDefaultHubPathname(),
|
|
66
|
+
host: overrides.host ?? resolveDefaultHubHost(options),
|
|
67
|
+
port: overrides.port ?? resolveDefaultHubPort(options),
|
|
68
|
+
pathname: overrides.pathname ?? resolveDefaultHubPathname(options),
|
|
42
69
|
};
|
|
43
70
|
}
|
|
@@ -22,7 +22,6 @@ function toChatTurnResult(result: {
|
|
|
22
22
|
};
|
|
23
23
|
iterations: number;
|
|
24
24
|
finishReason: string;
|
|
25
|
-
messages: unknown[];
|
|
26
25
|
toolCalls: Array<{
|
|
27
26
|
name: string;
|
|
28
27
|
input?: unknown;
|
|
@@ -38,7 +37,6 @@ function toChatTurnResult(result: {
|
|
|
38
37
|
outputTokens: result.usage.outputTokens,
|
|
39
38
|
iterations: result.iterations,
|
|
40
39
|
finishReason: result.finishReason,
|
|
41
|
-
messages: result.messages as never,
|
|
42
40
|
toolCalls: result.toolCalls.map((call) => ({
|
|
43
41
|
name: call.name,
|
|
44
42
|
input: call.input,
|
|
@@ -81,7 +79,7 @@ export function createLocalHubScheduleRuntimeHandlers(
|
|
|
81
79
|
async startSession(request) {
|
|
82
80
|
const cwd = (request.cwd?.trim() || request.workspaceRoot).trim();
|
|
83
81
|
const started = await sessionHost.start({
|
|
84
|
-
source: SessionSource.CLI,
|
|
82
|
+
source: request.source?.trim() || SessionSource.CLI,
|
|
85
83
|
interactive: false,
|
|
86
84
|
config: {
|
|
87
85
|
providerId: normalizeProviderId(request.provider),
|
|
@@ -104,6 +102,9 @@ export function createLocalHubScheduleRuntimeHandlers(
|
|
|
104
102
|
autoApprove: request.autoApproveTools !== false,
|
|
105
103
|
},
|
|
106
104
|
},
|
|
105
|
+
localRuntime: {
|
|
106
|
+
configExtensions: request.configExtensions,
|
|
107
|
+
},
|
|
107
108
|
});
|
|
108
109
|
return {
|
|
109
110
|
sessionId: started.sessionId,
|