@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.
Files changed (228) hide show
  1. package/dist/ClineCore.d.ts +312 -3
  2. package/dist/ClineCore.d.ts.map +1 -1
  3. package/dist/account/cline-account-service.d.ts.map +1 -1
  4. package/dist/cron/cron-event-ingress.d.ts +38 -0
  5. package/dist/cron/cron-event-ingress.d.ts.map +1 -0
  6. package/dist/cron/cron-materializer.d.ts +36 -0
  7. package/dist/cron/cron-materializer.d.ts.map +1 -0
  8. package/dist/cron/cron-reconciler.d.ts +62 -0
  9. package/dist/cron/cron-reconciler.d.ts.map +1 -0
  10. package/dist/cron/cron-report-writer.d.ts +41 -0
  11. package/dist/cron/cron-report-writer.d.ts.map +1 -0
  12. package/dist/cron/cron-runner.d.ts +43 -0
  13. package/dist/cron/cron-runner.d.ts.map +1 -0
  14. package/dist/cron/cron-schema.d.ts +3 -0
  15. package/dist/cron/cron-schema.d.ts.map +1 -0
  16. package/dist/cron/cron-service.d.ts +57 -0
  17. package/dist/cron/cron-service.d.ts.map +1 -0
  18. package/dist/cron/cron-spec-parser.d.ts +27 -0
  19. package/dist/cron/cron-spec-parser.d.ts.map +1 -0
  20. package/dist/cron/cron-watcher.d.ts +23 -0
  21. package/dist/cron/cron-watcher.d.ts.map +1 -0
  22. package/dist/cron/scheduler.d.ts +3 -1
  23. package/dist/cron/scheduler.d.ts.map +1 -1
  24. package/dist/cron/sqlite-cron-store.d.ts +230 -0
  25. package/dist/cron/sqlite-cron-store.d.ts.map +1 -0
  26. package/dist/extensions/plugin/plugin-config-loader.d.ts +7 -1
  27. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  28. package/dist/extensions/plugin/plugin-loader.d.ts +10 -6
  29. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  30. package/dist/extensions/plugin/plugin-sandbox.d.ts +7 -1
  31. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  32. package/dist/extensions/plugin-sandbox-bootstrap.js +236 -275
  33. package/dist/extensions/tools/constants.d.ts +1 -0
  34. package/dist/extensions/tools/constants.d.ts.map +1 -1
  35. package/dist/extensions/tools/definitions.d.ts +2 -3
  36. package/dist/extensions/tools/definitions.d.ts.map +1 -1
  37. package/dist/extensions/tools/executors/editor.d.ts.map +1 -1
  38. package/dist/extensions/tools/helpers.d.ts +1 -0
  39. package/dist/extensions/tools/helpers.d.ts.map +1 -1
  40. package/dist/extensions/tools/index.d.ts +1 -2
  41. package/dist/extensions/tools/index.d.ts.map +1 -1
  42. package/dist/extensions/tools/presets.d.ts +1 -1
  43. package/dist/extensions/tools/schemas.d.ts +25 -3
  44. package/dist/extensions/tools/schemas.d.ts.map +1 -1
  45. package/dist/extensions/tools/team/delegated-agent.d.ts +2 -2
  46. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -1
  47. package/dist/extensions/tools/team/multi-agent.d.ts +7 -3
  48. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -1
  49. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -1
  50. package/dist/extensions/tools/types.d.ts +0 -5
  51. package/dist/extensions/tools/types.d.ts.map +1 -1
  52. package/dist/hooks/hook-bridge.d.ts +118 -0
  53. package/dist/hooks/hook-bridge.d.ts.map +1 -0
  54. package/dist/hooks/hook-file-hooks.d.ts +2 -1
  55. package/dist/hooks/hook-file-hooks.d.ts.map +1 -1
  56. package/dist/hooks/hook-registry.d.ts +16 -0
  57. package/dist/hooks/hook-registry.d.ts.map +1 -0
  58. package/dist/hub/browser-websocket.d.ts.map +1 -1
  59. package/dist/hub/client.d.ts +7 -1
  60. package/dist/hub/client.d.ts.map +1 -1
  61. package/dist/hub/daemon-entry.js +721 -461
  62. package/dist/hub/daemon.d.ts.map +1 -1
  63. package/dist/hub/defaults.d.ts +8 -4
  64. package/dist/hub/defaults.d.ts.map +1 -1
  65. package/dist/hub/index.js +665 -415
  66. package/dist/hub/runtime-handlers.d.ts.map +1 -1
  67. package/dist/hub/server.d.ts +18 -0
  68. package/dist/hub/server.d.ts.map +1 -1
  69. package/dist/hub/session-client.d.ts +3 -0
  70. package/dist/hub/session-client.d.ts.map +1 -1
  71. package/dist/hub/start-shared-server.d.ts.map +1 -1
  72. package/dist/hub/ui-client.d.ts +1 -0
  73. package/dist/hub/ui-client.d.ts.map +1 -1
  74. package/dist/index.d.ts +9 -7
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +756 -467
  77. package/dist/llms/cline-recommended-models.d.ts +20 -0
  78. package/dist/llms/cline-recommended-models.d.ts.map +1 -0
  79. package/dist/llms/handler-factory.d.ts +16 -0
  80. package/dist/llms/handler-factory.d.ts.map +1 -0
  81. package/dist/llms/provider-defaults.d.ts.map +1 -1
  82. package/dist/llms/provider-settings.d.ts +45 -2
  83. package/dist/llms/provider-settings.d.ts.map +1 -1
  84. package/dist/llms/runtime-registry.d.ts.map +1 -1
  85. package/dist/runtime/agent-config-adapter.d.ts +148 -0
  86. package/dist/runtime/agent-config-adapter.d.ts.map +1 -0
  87. package/dist/runtime/agent-runtime-config-builder.d.ts +96 -0
  88. package/dist/runtime/agent-runtime-config-builder.d.ts.map +1 -0
  89. package/dist/runtime/history.d.ts +6 -0
  90. package/dist/runtime/history.d.ts.map +1 -1
  91. package/dist/runtime/host.d.ts.map +1 -1
  92. package/dist/runtime/loop-detection.d.ts +59 -0
  93. package/dist/runtime/loop-detection.d.ts.map +1 -0
  94. package/dist/runtime/mistake-tracker.d.ts +69 -0
  95. package/dist/runtime/mistake-tracker.d.ts.map +1 -0
  96. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  97. package/dist/runtime/runtime-event-adapter.d.ts +102 -0
  98. package/dist/runtime/runtime-event-adapter.d.ts.map +1 -0
  99. package/dist/runtime/runtime-host.d.ts +28 -3
  100. package/dist/runtime/runtime-host.d.ts.map +1 -1
  101. package/dist/runtime/session-runtime-orchestrator.d.ts +261 -0
  102. package/dist/runtime/session-runtime-orchestrator.d.ts.map +1 -0
  103. package/dist/runtime/session-runtime.d.ts +16 -3
  104. package/dist/runtime/session-runtime.d.ts.map +1 -1
  105. package/dist/runtime/user-input-builder.d.ts +24 -0
  106. package/dist/runtime/user-input-builder.d.ts.map +1 -0
  107. package/dist/services/index.js +28 -0
  108. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -1
  109. package/dist/services/plugin-tools.d.ts.map +1 -1
  110. package/dist/services/providers/local-provider-registry.d.ts +197 -21
  111. package/dist/services/providers/local-provider-registry.d.ts.map +1 -1
  112. package/dist/services/providers/local-provider-service.d.ts +3 -1
  113. package/dist/services/providers/local-provider-service.d.ts.map +1 -1
  114. package/dist/services/session-data.d.ts.map +1 -1
  115. package/dist/services/session-telemetry.d.ts +7 -2
  116. package/dist/services/session-telemetry.d.ts.map +1 -1
  117. package/dist/services/storage/file-team-store.d.ts.map +1 -1
  118. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -1
  119. package/dist/services/storage/provider-settings-manager.d.ts +1 -0
  120. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -1
  121. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -1
  122. package/dist/session/conversation-store.d.ts +30 -0
  123. package/dist/session/conversation-store.d.ts.map +1 -0
  124. package/dist/session/message-builder.d.ts +65 -0
  125. package/dist/session/message-builder.d.ts.map +1 -0
  126. package/dist/session/session-manifest.d.ts +1 -1
  127. package/dist/transports/hub.d.ts +14 -3
  128. package/dist/transports/hub.d.ts.map +1 -1
  129. package/dist/transports/local.d.ts +14 -4
  130. package/dist/transports/local.d.ts.map +1 -1
  131. package/dist/transports/remote.d.ts.map +1 -1
  132. package/dist/types/chat-schema.d.ts +5 -5
  133. package/dist/types/config.d.ts +9 -0
  134. package/dist/types/config.d.ts.map +1 -1
  135. package/dist/types/events.d.ts +7 -6
  136. package/dist/types/events.d.ts.map +1 -1
  137. package/dist/types/provider-settings.d.ts +2 -2
  138. package/dist/types/provider-settings.d.ts.map +1 -1
  139. package/dist/types/session.d.ts +5 -2
  140. package/dist/types/session.d.ts.map +1 -1
  141. package/dist/types.d.ts +4 -4
  142. package/dist/types.d.ts.map +1 -1
  143. package/package.json +4 -4
  144. package/src/ClineCore.ts +691 -6
  145. package/src/account/cline-account-service.ts +44 -6
  146. package/src/cron/cron-event-ingress.ts +357 -0
  147. package/src/cron/cron-materializer.ts +97 -0
  148. package/src/cron/cron-reconciler.ts +241 -0
  149. package/src/cron/cron-report-writer.ts +153 -0
  150. package/src/cron/cron-runner.ts +495 -0
  151. package/src/cron/cron-schema.ts +127 -0
  152. package/src/cron/cron-service.ts +163 -0
  153. package/src/cron/cron-spec-parser.ts +489 -0
  154. package/src/cron/cron-watcher.ts +102 -0
  155. package/src/cron/index.ts +10 -0
  156. package/src/cron/scheduler.ts +141 -6
  157. package/src/cron/sqlite-cron-store.ts +1286 -0
  158. package/src/extensions/plugin/plugin-config-loader.ts +21 -1
  159. package/src/extensions/plugin/plugin-loader.ts +25 -9
  160. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +151 -1
  161. package/src/extensions/plugin/plugin-sandbox.ts +131 -7
  162. package/src/extensions/tools/constants.ts +2 -0
  163. package/src/extensions/tools/definitions.ts +31 -22
  164. package/src/extensions/tools/executors/editor.ts +4 -3
  165. package/src/extensions/tools/helpers.ts +24 -0
  166. package/src/extensions/tools/index.ts +1 -2
  167. package/src/extensions/tools/presets.ts +1 -1
  168. package/src/extensions/tools/schemas.ts +13 -18
  169. package/src/extensions/tools/team/delegated-agent.ts +8 -3
  170. package/src/extensions/tools/team/multi-agent.ts +135 -19
  171. package/src/extensions/tools/team/team-tools.ts +151 -91
  172. package/src/extensions/tools/types.ts +0 -6
  173. package/src/hooks/hook-bridge.ts +489 -0
  174. package/src/hooks/hook-file-hooks.ts +58 -3
  175. package/src/hooks/hook-registry.ts +257 -0
  176. package/src/hub/browser-websocket.ts +26 -4
  177. package/src/hub/client.ts +72 -13
  178. package/src/hub/daemon-entry.ts +35 -0
  179. package/src/hub/daemon.ts +117 -14
  180. package/src/hub/defaults.ts +39 -12
  181. package/src/hub/runtime-handlers.ts +4 -3
  182. package/src/hub/server.ts +506 -77
  183. package/src/hub/session-client.ts +43 -1
  184. package/src/hub/start-shared-server.ts +3 -0
  185. package/src/hub/ui-client.ts +4 -0
  186. package/src/index.ts +46 -1
  187. package/src/llms/cline-recommended-models.ts +167 -0
  188. package/src/llms/handler-factory.ts +56 -0
  189. package/src/llms/provider-defaults.ts +17 -1
  190. package/src/llms/provider-settings.ts +48 -1
  191. package/src/llms/runtime-registry.ts +1 -0
  192. package/src/runtime/agent-config-adapter.ts +636 -0
  193. package/src/runtime/agent-runtime-config-builder.ts +205 -0
  194. package/src/runtime/error-feedback.ts +142 -0
  195. package/src/runtime/history.ts +137 -0
  196. package/src/runtime/host.ts +22 -0
  197. package/src/runtime/loop-detection.ts +162 -0
  198. package/src/runtime/mistake-tracker.ts +221 -0
  199. package/src/runtime/runtime-builder.ts +61 -5
  200. package/src/runtime/runtime-event-adapter.ts +412 -0
  201. package/src/runtime/runtime-host.ts +45 -1
  202. package/src/runtime/session-runtime-orchestrator.ts +1253 -0
  203. package/src/runtime/session-runtime.ts +16 -2
  204. package/src/runtime/user-input-builder.ts +167 -0
  205. package/src/services/local-runtime-bootstrap.ts +128 -22
  206. package/src/services/plugin-tools.ts +1 -0
  207. package/src/services/providers/local-provider-registry.ts +273 -57
  208. package/src/services/providers/local-provider-service.ts +67 -7
  209. package/src/services/session-data.ts +16 -14
  210. package/src/services/session-telemetry.ts +6 -15
  211. package/src/services/storage/file-team-store.ts +1 -5
  212. package/src/services/storage/provider-settings-legacy-migration.ts +8 -47
  213. package/src/services/storage/provider-settings-manager.ts +16 -1
  214. package/src/services/storage/sqlite-team-store.ts +1 -5
  215. package/src/session/conversation-store.ts +77 -0
  216. package/src/session/message-builder.ts +941 -0
  217. package/src/transports/hub.ts +458 -33
  218. package/src/transports/local.ts +296 -65
  219. package/src/transports/remote.ts +1 -0
  220. package/src/types/config.ts +9 -0
  221. package/src/types/events.ts +8 -6
  222. package/src/types/index.ts +3 -0
  223. package/src/types/provider-settings.ts +8 -1
  224. package/src/types/session.ts +5 -2
  225. package/src/types.ts +15 -1
  226. package/dist/cron/index.d.ts +0 -6
  227. package/dist/cron/index.d.ts.map +0 -1
  228. 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 { withResolvedClineBuildEnv } from "@clinebot/shared";
6
- import { verifyHubConnection } from "./client";
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 (healthy?.url && (await verifyHubConnection(healthy.url))) {
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 (expected?.url && (await verifyHubConnection(expected.url))) {
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
- const spawnEndpoint =
128
- expected?.url && resolvedEndpoint.port !== 0
129
- ? { ...resolvedEndpoint, port: 0 }
130
- : resolvedEndpoint;
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 (healthy?.url && (await verifyHubConnection(healthy.url))) {
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 (expected?.url && (await verifyHubConnection(expected.url))) {
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
- const spawnEndpoint =
162
- expected?.url && endpoint.port !== 0 ? { ...endpoint, port: 0 } : endpoint;
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 (healthy?.url && (await verifyHubConnection(healthy.url))) {
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 (nextExpected?.url && (await verifyHubConnection(nextExpected.url))) {
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
  }
@@ -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 = 25463;
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 function resolveDefaultHubHost(): string {
16
- return process.env[HUB_HOST_ENV]?.trim() || DEFAULT_HUB_HOST;
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(): number {
20
- const raw = process.env[HUB_PORT_ENV]?.trim();
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 DEFAULT_HUB_PORT;
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 DEFAULT_HUB_PORT;
49
+ return fallbackHubPort(options);
27
50
  }
28
51
  return port;
29
52
  }
30
53
 
31
- export function resolveDefaultHubPathname(): string {
32
- return process.env[HUB_PATHNAME_ENV]?.trim() || DEFAULT_HUB_PATHNAME;
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,