@clinebot/core 0.0.35 → 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 (441) hide show
  1. package/README.md +1 -2
  2. package/dist/ClineCore.d.ts +362 -39
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/account/cline-account-service.d.ts.map +1 -1
  5. package/dist/account/index.d.ts +1 -1
  6. package/dist/account/index.d.ts.map +1 -1
  7. package/dist/account/rpc.d.ts +6 -6
  8. package/dist/account/rpc.d.ts.map +1 -1
  9. package/dist/cron/cron-event-ingress.d.ts +38 -0
  10. package/dist/cron/cron-event-ingress.d.ts.map +1 -0
  11. package/dist/cron/cron-materializer.d.ts +36 -0
  12. package/dist/cron/cron-materializer.d.ts.map +1 -0
  13. package/dist/cron/cron-reconciler.d.ts +62 -0
  14. package/dist/cron/cron-reconciler.d.ts.map +1 -0
  15. package/dist/cron/cron-report-writer.d.ts +41 -0
  16. package/dist/cron/cron-report-writer.d.ts.map +1 -0
  17. package/dist/cron/cron-runner.d.ts +43 -0
  18. package/dist/cron/cron-runner.d.ts.map +1 -0
  19. package/dist/cron/cron-schema.d.ts +3 -0
  20. package/dist/cron/cron-schema.d.ts.map +1 -0
  21. package/dist/cron/cron-service.d.ts +57 -0
  22. package/dist/cron/cron-service.d.ts.map +1 -0
  23. package/dist/cron/cron-spec-parser.d.ts +27 -0
  24. package/dist/cron/cron-spec-parser.d.ts.map +1 -0
  25. package/dist/cron/cron-watcher.d.ts +23 -0
  26. package/dist/cron/cron-watcher.d.ts.map +1 -0
  27. package/dist/cron/resource-limiter.d.ts +9 -0
  28. package/dist/cron/resource-limiter.d.ts.map +1 -0
  29. package/dist/cron/schedule-command-service.d.ts +10 -0
  30. package/dist/cron/schedule-command-service.d.ts.map +1 -0
  31. package/dist/cron/schedule-service.d.ts +100 -0
  32. package/dist/cron/schedule-service.d.ts.map +1 -0
  33. package/dist/cron/scheduler.d.ts +68 -0
  34. package/dist/cron/scheduler.d.ts.map +1 -0
  35. package/dist/cron/sqlite-cron-store.d.ts +230 -0
  36. package/dist/cron/sqlite-cron-store.d.ts.map +1 -0
  37. package/dist/cron/sqlite-schedule-store.d.ts +52 -0
  38. package/dist/cron/sqlite-schedule-store.d.ts.map +1 -0
  39. package/dist/extensions/config/agent-config-loader.d.ts +4 -3
  40. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  41. package/dist/extensions/config/runtime-commands.d.ts +1 -0
  42. package/dist/extensions/config/runtime-commands.d.ts.map +1 -1
  43. package/dist/extensions/config/user-instruction-config-loader.d.ts +1 -0
  44. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  45. package/dist/extensions/context/agentic-compaction.d.ts +2 -2
  46. package/dist/extensions/context/agentic-compaction.d.ts.map +1 -1
  47. package/dist/extensions/context/compaction-shared.d.ts +5 -4
  48. package/dist/extensions/context/compaction-shared.d.ts.map +1 -1
  49. package/dist/extensions/context/compaction.d.ts.map +1 -1
  50. package/dist/extensions/plugin/plugin-config-loader.d.ts +15 -2
  51. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  52. package/dist/extensions/plugin/plugin-loader.d.ts +13 -7
  53. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  54. package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -1
  55. package/dist/extensions/plugin/plugin-sandbox.d.ts +21 -2
  56. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  57. package/dist/extensions/plugin/plugin-targeting.d.ts +7 -0
  58. package/dist/extensions/plugin/plugin-targeting.d.ts.map +1 -0
  59. package/dist/extensions/plugin-sandbox-bootstrap.js +237 -276
  60. package/dist/extensions/tools/constants.d.ts +1 -0
  61. package/dist/extensions/tools/constants.d.ts.map +1 -1
  62. package/dist/extensions/tools/definitions.d.ts +3 -4
  63. package/dist/extensions/tools/definitions.d.ts.map +1 -1
  64. package/dist/extensions/tools/executors/apply-patch.d.ts +3 -1
  65. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -1
  66. package/dist/extensions/tools/executors/editor.d.ts.map +1 -1
  67. package/dist/extensions/tools/executors/search.d.ts +1 -1
  68. package/dist/extensions/tools/executors/search.d.ts.map +1 -1
  69. package/dist/extensions/tools/helpers.d.ts +1 -0
  70. package/dist/extensions/tools/helpers.d.ts.map +1 -1
  71. package/dist/extensions/tools/index.d.ts +3 -2
  72. package/dist/extensions/tools/index.d.ts.map +1 -1
  73. package/dist/extensions/tools/presets.d.ts +27 -44
  74. package/dist/extensions/tools/presets.d.ts.map +1 -1
  75. package/dist/extensions/tools/runtime.d.ts +25 -0
  76. package/dist/extensions/tools/runtime.d.ts.map +1 -0
  77. package/dist/extensions/tools/schemas.d.ts +25 -3
  78. package/dist/extensions/tools/schemas.d.ts.map +1 -1
  79. package/dist/extensions/tools/team/delegated-agent.d.ts +2 -2
  80. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -1
  81. package/dist/extensions/tools/team/multi-agent.d.ts +7 -3
  82. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -1
  83. package/dist/extensions/tools/team/team-tools.d.ts +1 -0
  84. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -1
  85. package/dist/extensions/tools/types.d.ts +0 -5
  86. package/dist/extensions/tools/types.d.ts.map +1 -1
  87. package/dist/hooks/hook-bridge.d.ts +118 -0
  88. package/dist/hooks/hook-bridge.d.ts.map +1 -0
  89. package/dist/hooks/hook-file-hooks.d.ts +6 -2
  90. package/dist/hooks/hook-file-hooks.d.ts.map +1 -1
  91. package/dist/hooks/hook-registry.d.ts +16 -0
  92. package/dist/hooks/hook-registry.d.ts.map +1 -0
  93. package/dist/hooks/index.d.ts +0 -1
  94. package/dist/hooks/index.d.ts.map +1 -1
  95. package/dist/hooks/subprocess.d.ts +8 -1
  96. package/dist/hooks/subprocess.d.ts.map +1 -1
  97. package/dist/hub/browser-websocket.d.ts +18 -0
  98. package/dist/hub/browser-websocket.d.ts.map +1 -0
  99. package/dist/hub/client.d.ts +51 -0
  100. package/dist/hub/client.d.ts.map +1 -0
  101. package/dist/hub/connect.d.ts +15 -0
  102. package/dist/hub/connect.d.ts.map +1 -0
  103. package/dist/hub/daemon-entry.d.ts +2 -0
  104. package/dist/hub/daemon-entry.d.ts.map +1 -0
  105. package/dist/hub/daemon-entry.js +1305 -0
  106. package/dist/hub/daemon.d.ts +5 -0
  107. package/dist/hub/daemon.d.ts.map +1 -0
  108. package/dist/hub/defaults.d.ts +17 -0
  109. package/dist/hub/defaults.d.ts.map +1 -0
  110. package/dist/hub/discovery.d.ts +29 -0
  111. package/dist/hub/discovery.d.ts.map +1 -0
  112. package/dist/hub/index.d.ts +15 -0
  113. package/dist/hub/index.d.ts.map +1 -0
  114. package/dist/hub/index.js +1294 -0
  115. package/dist/hub/native-transport.d.ts +17 -0
  116. package/dist/hub/native-transport.d.ts.map +1 -0
  117. package/dist/hub/runtime-handlers.d.ts +11 -0
  118. package/dist/hub/runtime-handlers.d.ts.map +1 -0
  119. package/dist/hub/server.d.ts +104 -0
  120. package/dist/hub/server.d.ts.map +1 -0
  121. package/dist/hub/session-client.d.ts +90 -0
  122. package/dist/hub/session-client.d.ts.map +1 -0
  123. package/dist/hub/start-shared-server.d.ts +19 -0
  124. package/dist/hub/start-shared-server.d.ts.map +1 -0
  125. package/dist/hub/transport.d.ts +8 -0
  126. package/dist/hub/transport.d.ts.map +1 -0
  127. package/dist/hub/ui-client.d.ts +45 -0
  128. package/dist/hub/ui-client.d.ts.map +1 -0
  129. package/dist/hub/workspace.d.ts +4 -0
  130. package/dist/hub/workspace.d.ts.map +1 -0
  131. package/dist/index.d.ts +29 -16
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +782 -471
  134. package/dist/llms/cline-recommended-models.d.ts +20 -0
  135. package/dist/llms/cline-recommended-models.d.ts.map +1 -0
  136. package/dist/llms/configured-provider-registry.d.ts +28 -0
  137. package/dist/llms/configured-provider-registry.d.ts.map +1 -0
  138. package/dist/llms/handler-factory.d.ts +16 -0
  139. package/dist/llms/handler-factory.d.ts.map +1 -0
  140. package/dist/llms/provider-defaults.d.ts +27 -0
  141. package/dist/llms/provider-defaults.d.ts.map +1 -0
  142. package/dist/llms/provider-settings.d.ts +245 -0
  143. package/dist/llms/provider-settings.d.ts.map +1 -0
  144. package/dist/llms/runtime-config.d.ts +4 -0
  145. package/dist/llms/runtime-config.d.ts.map +1 -0
  146. package/dist/llms/runtime-registry.d.ts +20 -0
  147. package/dist/llms/runtime-registry.d.ts.map +1 -0
  148. package/dist/llms/runtime-types.d.ts +85 -0
  149. package/dist/llms/runtime-types.d.ts.map +1 -0
  150. package/dist/runtime/agent-config-adapter.d.ts +148 -0
  151. package/dist/runtime/agent-config-adapter.d.ts.map +1 -0
  152. package/dist/runtime/agent-runtime-config-builder.d.ts +96 -0
  153. package/dist/runtime/agent-runtime-config-builder.d.ts.map +1 -0
  154. package/dist/runtime/history.d.ts +6 -0
  155. package/dist/runtime/history.d.ts.map +1 -1
  156. package/dist/runtime/host.d.ts +1 -2
  157. package/dist/runtime/host.d.ts.map +1 -1
  158. package/dist/runtime/loop-detection.d.ts +59 -0
  159. package/dist/runtime/loop-detection.d.ts.map +1 -0
  160. package/dist/runtime/mistake-tracker.d.ts +69 -0
  161. package/dist/runtime/mistake-tracker.d.ts.map +1 -0
  162. package/dist/runtime/rules.d.ts +1 -0
  163. package/dist/runtime/rules.d.ts.map +1 -1
  164. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  165. package/dist/runtime/runtime-event-adapter.d.ts +102 -0
  166. package/dist/runtime/runtime-event-adapter.d.ts.map +1 -0
  167. package/dist/runtime/runtime-host.d.ts +49 -26
  168. package/dist/runtime/runtime-host.d.ts.map +1 -1
  169. package/dist/runtime/runtime-oauth-token-manager.d.ts.map +1 -1
  170. package/dist/runtime/session-runtime-orchestrator.d.ts +261 -0
  171. package/dist/runtime/session-runtime-orchestrator.d.ts.map +1 -0
  172. package/dist/runtime/session-runtime.d.ts +16 -21
  173. package/dist/runtime/session-runtime.d.ts.map +1 -1
  174. package/dist/runtime/user-input-builder.d.ts +24 -0
  175. package/dist/runtime/user-input-builder.d.ts.map +1 -0
  176. package/dist/services/global-settings.d.ts +12 -0
  177. package/dist/services/global-settings.d.ts.map +1 -0
  178. package/dist/services/index.js +28 -0
  179. package/dist/services/local-runtime-bootstrap.d.ts +9 -3
  180. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -1
  181. package/dist/services/plugin-tools.d.ts +16 -0
  182. package/dist/services/plugin-tools.d.ts.map +1 -0
  183. package/dist/services/providers/local-provider-registry.d.ts +199 -23
  184. package/dist/services/providers/local-provider-registry.d.ts.map +1 -1
  185. package/dist/services/providers/local-provider-service.d.ts +15 -13
  186. package/dist/services/providers/local-provider-service.d.ts.map +1 -1
  187. package/dist/services/session-data.d.ts +1 -1
  188. package/dist/services/session-data.d.ts.map +1 -1
  189. package/dist/services/session-telemetry.d.ts +7 -2
  190. package/dist/services/session-telemetry.d.ts.map +1 -1
  191. package/dist/services/storage/file-team-store.d.ts.map +1 -1
  192. package/dist/services/storage/provider-settings-legacy-migration.d.ts +1 -1
  193. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -1
  194. package/dist/services/storage/provider-settings-manager.d.ts +1 -0
  195. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -1
  196. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -1
  197. package/dist/services/workspace-manifest.d.ts +11 -0
  198. package/dist/services/workspace-manifest.d.ts.map +1 -1
  199. package/dist/session/conversation-store.d.ts +30 -0
  200. package/dist/session/conversation-store.d.ts.map +1 -0
  201. package/dist/session/message-builder.d.ts +65 -0
  202. package/dist/session/message-builder.d.ts.map +1 -0
  203. package/dist/session/persistence-service.d.ts +11 -23
  204. package/dist/session/persistence-service.d.ts.map +1 -1
  205. package/dist/session/session-manifest-store.d.ts +22 -0
  206. package/dist/session/session-manifest-store.d.ts.map +1 -0
  207. package/dist/session/session-manifest.d.ts +1 -1
  208. package/dist/session/session-row.d.ts +93 -0
  209. package/dist/session/session-row.d.ts.map +1 -0
  210. package/dist/session/session-service.d.ts +2 -102
  211. package/dist/session/session-service.d.ts.map +1 -1
  212. package/dist/session/subagent-session-manager.d.ts +36 -0
  213. package/dist/session/subagent-session-manager.d.ts.map +1 -0
  214. package/dist/session/team-persistence-store.d.ts +24 -0
  215. package/dist/session/team-persistence-store.d.ts.map +1 -0
  216. package/dist/transports/hub.d.ts +58 -0
  217. package/dist/transports/hub.d.ts.map +1 -0
  218. package/dist/transports/local.d.ts +23 -9
  219. package/dist/transports/local.d.ts.map +1 -1
  220. package/dist/transports/remote.d.ts +10 -0
  221. package/dist/transports/remote.d.ts.map +1 -0
  222. package/dist/transports/runtime-host-support.d.ts +3 -2
  223. package/dist/transports/runtime-host-support.d.ts.map +1 -1
  224. package/dist/types/chat-schema.d.ts +15 -17
  225. package/dist/types/chat-schema.d.ts.map +1 -1
  226. package/dist/types/config.d.ts +17 -7
  227. package/dist/types/config.d.ts.map +1 -1
  228. package/dist/types/events.d.ts +7 -6
  229. package/dist/types/events.d.ts.map +1 -1
  230. package/dist/types/provider-settings.d.ts +4 -5
  231. package/dist/types/provider-settings.d.ts.map +1 -1
  232. package/dist/types/session.d.ts +7 -3
  233. package/dist/types/session.d.ts.map +1 -1
  234. package/dist/types.d.ts +11 -4
  235. package/dist/types.d.ts.map +1 -1
  236. package/package.json +20 -6
  237. package/src/ClineCore.ts +757 -44
  238. package/src/account/cline-account-service.ts +44 -6
  239. package/src/account/index.ts +3 -3
  240. package/src/account/rpc.ts +12 -12
  241. package/src/cron/cron-event-ingress.ts +357 -0
  242. package/src/cron/cron-materializer.ts +97 -0
  243. package/src/cron/cron-reconciler.ts +241 -0
  244. package/src/cron/cron-report-writer.ts +153 -0
  245. package/src/cron/cron-runner.ts +495 -0
  246. package/src/cron/cron-schema.ts +127 -0
  247. package/src/cron/cron-service.ts +163 -0
  248. package/src/cron/cron-spec-parser.ts +489 -0
  249. package/src/cron/cron-watcher.ts +102 -0
  250. package/src/cron/index.ts +15 -0
  251. package/src/cron/resource-limiter.ts +46 -0
  252. package/src/cron/schedule-command-service.ts +193 -0
  253. package/src/cron/schedule-service.ts +703 -0
  254. package/src/cron/scheduler.ts +772 -0
  255. package/src/cron/sqlite-cron-store.ts +1286 -0
  256. package/src/cron/sqlite-schedule-store.ts +708 -0
  257. package/src/extensions/config/agent-config-loader.ts +17 -7
  258. package/src/extensions/config/runtime-commands.ts +6 -0
  259. package/src/extensions/config/user-instruction-config-loader.ts +1 -0
  260. package/src/extensions/context/agentic-compaction.ts +3 -3
  261. package/src/extensions/context/basic-compaction.ts +2 -2
  262. package/src/extensions/context/compaction-shared.ts +5 -4
  263. package/src/extensions/context/compaction.ts +3 -3
  264. package/src/extensions/plugin/plugin-config-loader.ts +37 -2
  265. package/src/extensions/plugin/plugin-loader.ts +69 -9
  266. package/src/extensions/plugin/plugin-module-import.ts +0 -2
  267. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +243 -39
  268. package/src/extensions/plugin/plugin-sandbox.ts +173 -29
  269. package/src/extensions/plugin/plugin-targeting.ts +32 -0
  270. package/src/extensions/tools/constants.ts +2 -0
  271. package/src/extensions/tools/definitions.ts +61 -71
  272. package/src/extensions/tools/executors/apply-patch.ts +69 -80
  273. package/src/extensions/tools/executors/editor.ts +4 -3
  274. package/src/extensions/tools/executors/search.ts +195 -3
  275. package/src/extensions/tools/helpers.ts +24 -0
  276. package/src/extensions/tools/index.ts +11 -2
  277. package/src/extensions/tools/presets.ts +32 -47
  278. package/src/extensions/tools/runtime.ts +261 -0
  279. package/src/extensions/tools/schemas.ts +17 -20
  280. package/src/extensions/tools/team/delegated-agent.ts +8 -3
  281. package/src/extensions/tools/team/multi-agent.ts +135 -19
  282. package/src/extensions/tools/team/team-tools.ts +172 -91
  283. package/src/extensions/tools/types.ts +0 -6
  284. package/src/hooks/hook-bridge.ts +489 -0
  285. package/src/hooks/hook-file-hooks.ts +66 -5
  286. package/src/hooks/hook-registry.ts +257 -0
  287. package/src/hooks/index.ts +0 -7
  288. package/src/hooks/subprocess-runner.ts +1 -1
  289. package/src/hooks/subprocess.ts +9 -0
  290. package/src/hub/browser-websocket.ts +159 -0
  291. package/src/hub/client.ts +633 -0
  292. package/src/hub/connect.ts +156 -0
  293. package/src/hub/daemon-entry.ts +122 -0
  294. package/src/hub/daemon.ts +284 -0
  295. package/src/hub/defaults.ts +70 -0
  296. package/src/hub/discovery.ts +247 -0
  297. package/src/hub/index.ts +14 -0
  298. package/src/hub/native-transport.ts +31 -0
  299. package/src/hub/runtime-handlers.ts +141 -0
  300. package/src/hub/server.ts +2317 -0
  301. package/src/hub/session-client.ts +502 -0
  302. package/src/hub/start-shared-server.ts +61 -0
  303. package/src/hub/transport.ts +14 -0
  304. package/src/hub/ui-client.ts +126 -0
  305. package/src/hub/workspace.ts +19 -0
  306. package/src/index.ts +169 -68
  307. package/src/llms/cline-recommended-models.ts +167 -0
  308. package/src/llms/configured-provider-registry.ts +193 -0
  309. package/src/llms/handler-factory.ts +56 -0
  310. package/src/llms/provider-defaults.ts +653 -0
  311. package/src/llms/provider-settings.ts +310 -0
  312. package/src/llms/runtime-config.ts +43 -0
  313. package/src/llms/runtime-registry.ts +172 -0
  314. package/src/llms/runtime-types.ts +121 -0
  315. package/src/runtime/agent-config-adapter.ts +636 -0
  316. package/src/runtime/agent-runtime-config-builder.ts +205 -0
  317. package/src/runtime/error-feedback.ts +142 -0
  318. package/src/runtime/history.ts +137 -0
  319. package/src/runtime/host.ts +127 -267
  320. package/src/runtime/index.ts +1 -0
  321. package/src/runtime/loop-detection.ts +162 -0
  322. package/src/runtime/mistake-tracker.ts +221 -0
  323. package/src/runtime/rules.ts +12 -0
  324. package/src/runtime/runtime-builder.ts +85 -13
  325. package/src/runtime/runtime-event-adapter.ts +412 -0
  326. package/src/runtime/runtime-host.ts +134 -62
  327. package/src/runtime/runtime-oauth-token-manager.ts +11 -15
  328. package/src/runtime/session-runtime-orchestrator.ts +1253 -0
  329. package/src/runtime/session-runtime.ts +16 -26
  330. package/src/runtime/user-input-builder.ts +167 -0
  331. package/src/services/global-settings.ts +122 -0
  332. package/src/services/local-runtime-bootstrap.ts +175 -31
  333. package/src/services/plugin-tools.ts +86 -0
  334. package/src/services/providers/local-provider-registry.ts +277 -61
  335. package/src/services/providers/local-provider-service.ts +109 -44
  336. package/src/services/session-data.ts +18 -10
  337. package/src/services/session-telemetry.ts +6 -15
  338. package/src/services/storage/file-team-store.ts +1 -5
  339. package/src/services/storage/provider-settings-legacy-migration.ts +14 -51
  340. package/src/services/storage/provider-settings-manager.ts +17 -2
  341. package/src/services/storage/sqlite-team-store.ts +1 -5
  342. package/src/services/workspace-manifest.ts +18 -0
  343. package/src/session/conversation-store.ts +77 -0
  344. package/src/session/file-session-service.ts +1 -1
  345. package/src/session/index.ts +6 -27
  346. package/src/session/message-builder.ts +941 -0
  347. package/src/session/persistence-service.ts +119 -504
  348. package/src/session/session-manifest-store.ts +158 -0
  349. package/src/session/session-row.ts +199 -0
  350. package/src/session/session-service.ts +17 -376
  351. package/src/session/session-team-coordination.ts +1 -1
  352. package/src/session/subagent-session-manager.ts +397 -0
  353. package/src/session/team-persistence-store.ts +176 -0
  354. package/src/transports/hub.ts +1081 -0
  355. package/src/transports/local.ts +419 -93
  356. package/src/transports/remote.ts +27 -0
  357. package/src/transports/runtime-host-support.ts +63 -9
  358. package/src/types/chat-schema.ts +4 -5
  359. package/src/types/config.ts +17 -7
  360. package/src/types/events.ts +8 -6
  361. package/src/types/index.ts +3 -0
  362. package/src/types/provider-settings.ts +18 -7
  363. package/src/types/session.ts +7 -6
  364. package/src/types.ts +42 -2
  365. package/dist/hooks/persistent.d.ts +0 -64
  366. package/dist/hooks/persistent.d.ts.map +0 -1
  367. package/dist/runtime/rpc-runtime-ensure.d.ts +0 -65
  368. package/dist/runtime/rpc-runtime-ensure.d.ts.map +0 -1
  369. package/dist/runtime/rpc-spawn-lease.d.ts +0 -8
  370. package/dist/runtime/rpc-spawn-lease.d.ts.map +0 -1
  371. package/dist/services/telemetry/index.js +0 -15
  372. package/dist/session/rpc-session-service.d.ts +0 -16
  373. package/dist/session/rpc-session-service.d.ts.map +0 -1
  374. package/dist/session/sqlite-rpc-session-backend.d.ts +0 -31
  375. package/dist/session/sqlite-rpc-session-backend.d.ts.map +0 -1
  376. package/dist/transports/rpc.d.ts +0 -51
  377. package/dist/transports/rpc.d.ts.map +0 -1
  378. package/src/ClineCore.test.ts +0 -226
  379. package/src/account/cline-account-service.test.ts +0 -185
  380. package/src/account/featurebase-token.test.ts +0 -175
  381. package/src/account/rpc.test.ts +0 -63
  382. package/src/auth/bounded-ttl-cache.test.ts +0 -38
  383. package/src/auth/client.test.ts +0 -69
  384. package/src/auth/cline.test.ts +0 -267
  385. package/src/auth/codex.test.ts +0 -170
  386. package/src/auth/oca.test.ts +0 -340
  387. package/src/auth/server.test.ts +0 -287
  388. package/src/auth/utils.test.ts +0 -128
  389. package/src/extensions/config/agent-config-loader.test.ts +0 -236
  390. package/src/extensions/config/hooks-config-loader.test.ts +0 -20
  391. package/src/extensions/config/runtime-commands.test.ts +0 -115
  392. package/src/extensions/config/unified-config-file-watcher.test.ts +0 -196
  393. package/src/extensions/config/user-instruction-config-loader.test.ts +0 -246
  394. package/src/extensions/context/compaction.test.ts +0 -483
  395. package/src/extensions/mcp/config-loader.test.ts +0 -238
  396. package/src/extensions/mcp/manager.test.ts +0 -105
  397. package/src/extensions/plugin/plugin-config-loader.test.ts +0 -184
  398. package/src/extensions/plugin/plugin-loader.test.ts +0 -292
  399. package/src/extensions/plugin/plugin-sandbox.test.ts +0 -423
  400. package/src/extensions/tools/definitions.test.ts +0 -780
  401. package/src/extensions/tools/executors/bash.test.ts +0 -87
  402. package/src/extensions/tools/executors/editor.test.ts +0 -35
  403. package/src/extensions/tools/executors/file-read.test.ts +0 -125
  404. package/src/extensions/tools/model-tool-routing.test.ts +0 -86
  405. package/src/extensions/tools/presets.test.ts +0 -70
  406. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +0 -455
  407. package/src/extensions/tools/team/spawn-agent-tool.test.ts +0 -381
  408. package/src/extensions/tools/team/team-tools.test.ts +0 -918
  409. package/src/hooks/checkpoint-hooks.test.ts +0 -168
  410. package/src/hooks/hook-file-hooks.test.ts +0 -311
  411. package/src/hooks/persistent.ts +0 -661
  412. package/src/runtime/history.test.ts +0 -114
  413. package/src/runtime/host.test.ts +0 -230
  414. package/src/runtime/rpc-runtime-ensure.test.ts +0 -123
  415. package/src/runtime/rpc-runtime-ensure.ts +0 -659
  416. package/src/runtime/rpc-spawn-lease.test.ts +0 -81
  417. package/src/runtime/rpc-spawn-lease.ts +0 -156
  418. package/src/runtime/runtime-builder.team-persistence.test.ts +0 -245
  419. package/src/runtime/runtime-builder.test.ts +0 -615
  420. package/src/runtime/runtime-oauth-token-manager.test.ts +0 -137
  421. package/src/runtime/runtime-parity.test.ts +0 -143
  422. package/src/services/providers/local-provider-service.test.ts +0 -1062
  423. package/src/services/session-data.test.ts +0 -160
  424. package/src/services/storage/provider-settings-legacy-migration.test.ts +0 -424
  425. package/src/services/storage/provider-settings-manager.test.ts +0 -191
  426. package/src/services/telemetry/OpenTelemetryAdapter.test.ts +0 -157
  427. package/src/services/telemetry/OpenTelemetryProvider.test.ts +0 -326
  428. package/src/services/telemetry/TelemetryLoggerSink.test.ts +0 -42
  429. package/src/services/telemetry/TelemetryService.test.ts +0 -134
  430. package/src/services/telemetry/distinct-id.test.ts +0 -57
  431. package/src/services/workspace/file-indexer.d.ts +0 -11
  432. package/src/services/workspace/file-indexer.test.ts +0 -156
  433. package/src/services/workspace/mention-enricher.test.ts +0 -106
  434. package/src/session/persistence-service.test.ts +0 -300
  435. package/src/session/rpc-session-service.ts +0 -114
  436. package/src/session/session-service.team-persistence.test.ts +0 -48
  437. package/src/session/sqlite-rpc-session-backend.ts +0 -301
  438. package/src/transports/local.e2e.test.ts +0 -380
  439. package/src/transports/local.test.ts +0 -2559
  440. package/src/transports/rpc.test.ts +0 -82
  441. package/src/transports/rpc.ts +0 -665
@@ -0,0 +1,156 @@
1
+ import type {
2
+ HubCommandEnvelope,
3
+ HubReplyEnvelope,
4
+ HubTransportFrame,
5
+ } from "@clinebot/shared";
6
+ import {
7
+ type HubEndpointOverrides,
8
+ resolveHubEndpointOptions,
9
+ } from "./defaults";
10
+ import {
11
+ createHubServerUrl,
12
+ readHubDiscovery,
13
+ resolveHubOwnerContext,
14
+ } from "./discovery";
15
+
16
+ export interface HubConnection {
17
+ send(envelope: HubCommandEnvelope): Promise<HubReplyEnvelope>;
18
+ close(): void;
19
+ }
20
+
21
+ export interface HubCommandRequest
22
+ extends Omit<HubCommandEnvelope, "version" | "clientId"> {
23
+ version?: HubCommandEnvelope["version"];
24
+ clientId?: string;
25
+ }
26
+
27
+ function normalizeHubConnectionError(error: unknown, url: string): Error {
28
+ if (error instanceof Error) {
29
+ return error;
30
+ }
31
+ if (
32
+ error &&
33
+ typeof error === "object" &&
34
+ "message" in error &&
35
+ typeof (error as { message?: unknown }).message === "string" &&
36
+ (error as { message: string }).message.trim()
37
+ ) {
38
+ return new Error((error as { message: string }).message.trim());
39
+ }
40
+ const eventType =
41
+ error &&
42
+ typeof error === "object" &&
43
+ "type" in error &&
44
+ typeof (error as { type?: unknown }).type === "string"
45
+ ? (error as { type: string }).type.trim()
46
+ : "";
47
+ return new Error(
48
+ eventType
49
+ ? `Failed to connect to hub at ${url} (${eventType} event before socket open).`
50
+ : `Failed to connect to hub at ${url}.`,
51
+ );
52
+ }
53
+
54
+ function hasExplicitEndpoint(overrides: HubEndpointOverrides): boolean {
55
+ return (
56
+ overrides.host !== undefined ||
57
+ overrides.port !== undefined ||
58
+ overrides.pathname !== undefined
59
+ );
60
+ }
61
+
62
+ export async function resolveHubUrl(
63
+ overrides: HubEndpointOverrides = {},
64
+ ): Promise<string> {
65
+ const endpoint = resolveHubEndpointOptions(overrides);
66
+ if (!hasExplicitEndpoint(overrides)) {
67
+ const owner = resolveHubOwnerContext();
68
+ const discovery = await readHubDiscovery(owner.discoveryPath);
69
+ if (discovery?.url) {
70
+ return discovery.url;
71
+ }
72
+ }
73
+ return createHubServerUrl(endpoint.host, endpoint.port, endpoint.pathname);
74
+ }
75
+
76
+ export async function connectToHub(url: string): Promise<HubConnection> {
77
+ return await new Promise((resolve, reject) => {
78
+ const ws = new WebSocket(url);
79
+ const pending = new Map<
80
+ string,
81
+ {
82
+ resolve: (reply: HubReplyEnvelope) => void;
83
+ reject: (error: unknown) => void;
84
+ }
85
+ >();
86
+ let counter = 0;
87
+
88
+ ws.addEventListener("open", () => {
89
+ resolve({
90
+ send(envelope) {
91
+ const requestId = envelope.requestId ?? `hub-client-${++counter}`;
92
+ return new Promise<HubReplyEnvelope>((res, rej) => {
93
+ pending.set(requestId, { resolve: res, reject: rej });
94
+ const frame: HubTransportFrame = {
95
+ kind: "command",
96
+ envelope: { ...envelope, requestId },
97
+ };
98
+ ws.send(JSON.stringify(frame));
99
+ });
100
+ },
101
+ close() {
102
+ ws.close();
103
+ },
104
+ });
105
+ });
106
+
107
+ ws.addEventListener("message", (event) => {
108
+ const frame = JSON.parse(String(event.data)) as HubTransportFrame;
109
+ if (frame.kind === "reply" && frame.envelope.requestId) {
110
+ const entry = pending.get(frame.envelope.requestId);
111
+ if (entry) {
112
+ pending.delete(frame.envelope.requestId);
113
+ entry.resolve(frame.envelope);
114
+ }
115
+ }
116
+ });
117
+
118
+ ws.addEventListener("close", () => {
119
+ for (const entry of pending.values()) {
120
+ entry.reject(new Error("Hub connection closed"));
121
+ }
122
+ pending.clear();
123
+ });
124
+
125
+ ws.addEventListener("error", (error) => {
126
+ reject(normalizeHubConnectionError(error, url));
127
+ });
128
+ });
129
+ }
130
+
131
+ export async function probeHubConnection(url: string): Promise<boolean> {
132
+ try {
133
+ const connection = await connectToHub(url);
134
+ connection.close();
135
+ return true;
136
+ } catch {
137
+ return false;
138
+ }
139
+ }
140
+
141
+ export async function sendHubCommand(
142
+ overrides: HubEndpointOverrides,
143
+ envelope: HubCommandRequest,
144
+ ): Promise<HubReplyEnvelope> {
145
+ const url = await resolveHubUrl(overrides);
146
+ const connection = await connectToHub(url);
147
+ try {
148
+ return await connection.send({
149
+ version: envelope.version ?? "v1",
150
+ clientId: envelope.clientId ?? "hub-client",
151
+ ...envelope,
152
+ });
153
+ } finally {
154
+ connection.close();
155
+ }
156
+ }
@@ -0,0 +1,122 @@
1
+ import { initVcr } from "@clinebot/shared";
2
+ import { resolveHubEndpointOptions } from "./defaults";
3
+ import { createLocalHubScheduleRuntimeHandlers } from "./runtime-handlers";
4
+ import { startHubWebSocketServer } from "./server";
5
+ import { resolveSharedHubOwnerContext } from "./workspace";
6
+
7
+ initVcr(process.env.CLINE_VCR);
8
+
9
+ function parseArgs(argv: string[]): {
10
+ cwd: string;
11
+ host?: string;
12
+ port?: number;
13
+ pathname?: string;
14
+ } {
15
+ let cwd = process.cwd();
16
+ let host: string | undefined;
17
+ let port: number | undefined;
18
+ let pathname: string | undefined;
19
+
20
+ for (let index = 0; index < argv.length; index += 1) {
21
+ const arg = argv[index];
22
+ const value = argv[index + 1];
23
+ if (arg === "--cwd" && value) {
24
+ cwd = value;
25
+ index += 1;
26
+ continue;
27
+ }
28
+ if (arg === "--host" && value) {
29
+ host = value;
30
+ index += 1;
31
+ continue;
32
+ }
33
+ if (arg === "--port" && value) {
34
+ const parsed = Number(value);
35
+ if (Number.isFinite(parsed)) {
36
+ port = parsed;
37
+ }
38
+ index += 1;
39
+ continue;
40
+ }
41
+ if (arg === "--pathname" && value) {
42
+ pathname = value;
43
+ index += 1;
44
+ }
45
+ }
46
+
47
+ return { cwd, host, port, pathname };
48
+ }
49
+
50
+ async function main(): Promise<void> {
51
+ const options = parseArgs(process.argv.slice(2));
52
+ process.chdir(options.cwd);
53
+
54
+ const endpoint = resolveHubEndpointOptions({
55
+ host: options.host,
56
+ port: options.port,
57
+ pathname: options.pathname,
58
+ });
59
+
60
+ const server = await startHubWebSocketServer({
61
+ host: endpoint.host,
62
+ port: endpoint.port,
63
+ pathname: endpoint.pathname,
64
+ owner: resolveSharedHubOwnerContext(),
65
+ runtimeHandlers: createLocalHubScheduleRuntimeHandlers(),
66
+ cronOptions: { workspaceRoot: options.cwd },
67
+ });
68
+
69
+ const shutdown = async (): Promise<void> => {
70
+ await server.close();
71
+ process.exit(0);
72
+ };
73
+
74
+ let fatalShutdownStarted = false;
75
+ const shutdownFatal = (label: string, error: unknown): void => {
76
+ if (fatalShutdownStarted) {
77
+ return;
78
+ }
79
+ fatalShutdownStarted = true;
80
+ const message =
81
+ error instanceof Error ? error.stack || error.message : String(error);
82
+ process.stderr.write(`[hub-daemon] ${label}: ${message}\n`);
83
+ void server
84
+ .close()
85
+ .catch((closeError) => {
86
+ const closeMessage =
87
+ closeError instanceof Error
88
+ ? closeError.stack || closeError.message
89
+ : String(closeError);
90
+ process.stderr.write(
91
+ `[hub-daemon] shutdown after ${label} failed: ${closeMessage}\n`,
92
+ );
93
+ })
94
+ .finally(() => {
95
+ process.exit(1);
96
+ });
97
+ };
98
+
99
+ process.on("SIGINT", () => {
100
+ void shutdown();
101
+ });
102
+ process.on("SIGTERM", () => {
103
+ void shutdown();
104
+ });
105
+ process.on("uncaughtException", (error) => {
106
+ shutdownFatal("uncaughtException", error);
107
+ });
108
+ process.on("unhandledRejection", (reason) => {
109
+ shutdownFatal("unhandledRejection", reason);
110
+ });
111
+
112
+ await new Promise<void>(() => {
113
+ // keep daemon process alive
114
+ });
115
+ }
116
+
117
+ void main().catch((error) => {
118
+ const message =
119
+ error instanceof Error ? error.stack || error.message : String(error);
120
+ process.stderr.write(`[hub-daemon] fatal: ${message}\n`);
121
+ process.exit(1);
122
+ });
@@ -0,0 +1,284 @@
1
+ import { spawn } from "node:child_process";
2
+ import { closeSync, mkdirSync, openSync } from "node:fs";
3
+ import { basename, dirname, join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import {
6
+ CLINE_RUN_AS_HUB_DAEMON_ENV,
7
+ isHubDaemonProcess,
8
+ withResolvedClineBuildEnv,
9
+ } from "@clinebot/shared";
10
+ import { requestHubShutdown, verifyHubConnection } from "./client";
11
+ import {
12
+ type HubEndpointOverrides,
13
+ resolveHubEndpointOptions,
14
+ } from "./defaults";
15
+ import {
16
+ clearHubDiscovery,
17
+ createHubServerUrl,
18
+ type HubServerDiscoveryRecord,
19
+ probeHubServer,
20
+ readHubDiscovery,
21
+ resolveClineDataDir,
22
+ resolveHubBuildId,
23
+ writeHubDiscovery,
24
+ } from "./discovery";
25
+ import { resolveSharedHubOwnerContext } from "./workspace";
26
+
27
+ const HUB_STARTUP_TIMEOUT_MS = 8_000;
28
+ const HUB_STARTUP_POLL_MS = 200;
29
+ const HUB_RETIRE_TIMEOUT_MS = 3_000;
30
+ const HUB_RETIRE_POLL_MS = 100;
31
+
32
+ function endpointArgs(endpoint: HubEndpointOverrides): string[] {
33
+ return [
34
+ ...(endpoint.host ? ["--host", endpoint.host] : []),
35
+ ...(typeof endpoint.port === "number"
36
+ ? ["--port", String(endpoint.port)]
37
+ : []),
38
+ ...(endpoint.pathname ? ["--pathname", endpoint.pathname] : []),
39
+ ];
40
+ }
41
+
42
+ function openDetachedHubLogFile(): { fd: number; logPath: string } | undefined {
43
+ try {
44
+ const logPath = join(resolveClineDataDir(), "logs", "hub-daemon.log");
45
+ mkdirSync(dirname(logPath), { recursive: true });
46
+ return { fd: openSync(logPath, "a"), logPath };
47
+ } catch {
48
+ return undefined;
49
+ }
50
+ }
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
+
91
+ function resolveDaemonEntryPath(): string {
92
+ const extension = import.meta.url.endsWith(".ts") ? "ts" : "js";
93
+ return fileURLToPath(new URL(`./daemon-entry.${extension}`, import.meta.url));
94
+ }
95
+
96
+ function resolveLaunchCommand(
97
+ workspaceRoot: string,
98
+ endpoint: HubEndpointOverrides,
99
+ ): {
100
+ launcher: string;
101
+ args: string[];
102
+ cwd: string;
103
+ env: NodeJS.ProcessEnv;
104
+ } {
105
+ const daemonEntryPath = resolveDaemonEntryPath();
106
+ const execPath = process.execPath?.trim();
107
+ if (!execPath) {
108
+ throw new Error("unable to resolve runtime executable for hub daemon");
109
+ }
110
+ const isBunRuntime = basename(execPath).toLowerCase().includes("bun");
111
+ const useDevelopmentConditions =
112
+ isBunRuntime && daemonEntryPath.toLowerCase().endsWith(".ts");
113
+ return {
114
+ launcher: execPath,
115
+ args: [
116
+ ...(useDevelopmentConditions ? ["--conditions=development"] : []),
117
+ daemonEntryPath,
118
+ "--cwd",
119
+ workspaceRoot,
120
+ ...endpointArgs(endpoint),
121
+ ],
122
+ cwd: workspaceRoot,
123
+ env: {
124
+ ...withResolvedClineBuildEnv(process.env),
125
+ CLINE_NO_INTERACTIVE: "1",
126
+ [CLINE_RUN_AS_HUB_DAEMON_ENV]: "1",
127
+ },
128
+ };
129
+ }
130
+
131
+ export function spawnDetachedHubServer(
132
+ workspaceRoot: string,
133
+ endpoint: HubEndpointOverrides = {},
134
+ ): void {
135
+ if (isHubDaemonProcess()) {
136
+ return;
137
+ }
138
+ const command = resolveLaunchCommand(workspaceRoot, endpoint);
139
+ const logFile = openDetachedHubLogFile();
140
+ try {
141
+ const child = spawn(command.launcher, command.args, {
142
+ detached: true,
143
+ stdio: logFile ? ["ignore", logFile.fd, logFile.fd] : "ignore",
144
+ env: command.env,
145
+ cwd: command.cwd,
146
+ });
147
+ child.unref();
148
+ } finally {
149
+ if (logFile) {
150
+ closeSync(logFile.fd);
151
+ }
152
+ }
153
+ }
154
+
155
+ export function prewarmDetachedHubServer(
156
+ workspaceRoot: string,
157
+ endpoint: HubEndpointOverrides = {},
158
+ ): void {
159
+ if (isHubDaemonProcess()) {
160
+ return;
161
+ }
162
+ const owner = resolveSharedHubOwnerContext();
163
+ const hasExplicitPort =
164
+ endpoint.port !== undefined || !!process.env.CLINE_HUB_PORT?.trim();
165
+ const resolvedEndpoint = resolveHubEndpointOptions(endpoint);
166
+ const expectedUrl = createHubServerUrl(
167
+ resolvedEndpoint.host,
168
+ resolvedEndpoint.port,
169
+ resolvedEndpoint.pathname,
170
+ );
171
+ void readHubDiscovery(owner.discoveryPath)
172
+ .then(async (discovered) => {
173
+ if (discovered?.url) {
174
+ const healthy = await probeHubServer(discovered.url);
175
+ if (
176
+ healthy?.url &&
177
+ isCompatibleHubRecord(healthy) &&
178
+ (await verifyHubConnection(healthy.url))
179
+ ) {
180
+ return;
181
+ }
182
+ if (healthy?.url) {
183
+ await retireIncompatibleHub(healthy, owner.discoveryPath);
184
+ } else {
185
+ await clearHubDiscovery(owner.discoveryPath).catch(() => undefined);
186
+ }
187
+ }
188
+ const expected = await probeHubServer(expectedUrl);
189
+ if (
190
+ expected?.url &&
191
+ isCompatibleHubRecord(expected) &&
192
+ (await verifyHubConnection(expected.url))
193
+ ) {
194
+ await writeHubDiscovery(owner.discoveryPath, expected);
195
+ return;
196
+ }
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;
205
+ spawnDetachedHubServer(workspaceRoot, spawnEndpoint);
206
+ })
207
+ .catch(() => {
208
+ // best-effort prewarm only
209
+ });
210
+ }
211
+
212
+ export async function ensureDetachedHubServer(
213
+ workspaceRoot: string,
214
+ endpointOverrides: HubEndpointOverrides = {},
215
+ ): Promise<string> {
216
+ const owner = resolveSharedHubOwnerContext();
217
+ const hasExplicitPort =
218
+ endpointOverrides.port !== undefined ||
219
+ !!process.env.CLINE_HUB_PORT?.trim();
220
+ const endpoint = resolveHubEndpointOptions(endpointOverrides);
221
+ const expectedUrl = createHubServerUrl(
222
+ endpoint.host,
223
+ endpoint.port,
224
+ endpoint.pathname,
225
+ );
226
+ const discovered = await readHubDiscovery(owner.discoveryPath);
227
+ if (discovered?.url) {
228
+ const healthy = await probeHubServer(discovered.url);
229
+ if (
230
+ healthy?.url &&
231
+ isCompatibleHubRecord(healthy) &&
232
+ (await verifyHubConnection(healthy.url))
233
+ ) {
234
+ return healthy.url;
235
+ }
236
+ if (healthy?.url) {
237
+ await retireIncompatibleHub(healthy, owner.discoveryPath);
238
+ } else {
239
+ await clearHubDiscovery(owner.discoveryPath).catch(() => undefined);
240
+ }
241
+ }
242
+ const expected = await probeHubServer(expectedUrl);
243
+ if (
244
+ expected?.url &&
245
+ isCompatibleHubRecord(expected) &&
246
+ (await verifyHubConnection(expected.url))
247
+ ) {
248
+ await writeHubDiscovery(owner.discoveryPath, expected);
249
+ return expected.url;
250
+ }
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;
258
+ spawnDetachedHubServer(workspaceRoot, spawnEndpoint);
259
+ const deadline = Date.now() + HUB_STARTUP_TIMEOUT_MS;
260
+ while (Date.now() < deadline) {
261
+ const nextDiscovery = await readHubDiscovery(owner.discoveryPath);
262
+ if (nextDiscovery?.url) {
263
+ const healthy = await probeHubServer(nextDiscovery.url);
264
+ if (
265
+ healthy?.url &&
266
+ isCompatibleHubRecord(healthy) &&
267
+ (await verifyHubConnection(healthy.url))
268
+ ) {
269
+ return healthy.url;
270
+ }
271
+ }
272
+ const nextExpected = await probeHubServer(expectedUrl);
273
+ if (
274
+ nextExpected?.url &&
275
+ isCompatibleHubRecord(nextExpected) &&
276
+ (await verifyHubConnection(nextExpected.url))
277
+ ) {
278
+ await writeHubDiscovery(owner.discoveryPath, nextExpected);
279
+ return nextExpected.url;
280
+ }
281
+ await new Promise((resolve) => setTimeout(resolve, HUB_STARTUP_POLL_MS));
282
+ }
283
+ throw new Error("Timed out waiting for detached hub startup.");
284
+ }
@@ -0,0 +1,70 @@
1
+ import {
2
+ CLINE_HUB_DEV_PORT,
3
+ CLINE_HUB_PORT,
4
+ resolveClineBuildEnv,
5
+ } from "@clinebot/shared";
6
+
7
+ const HUB_HOST_ENV = "CLINE_HUB_HOST";
8
+ const HUB_PORT_ENV = "CLINE_HUB_PORT";
9
+ const HUB_PATHNAME_ENV = "CLINE_HUB_PATHNAME";
10
+
11
+ export const DEFAULT_HUB_HOST = "127.0.0.1";
12
+ export const DEFAULT_HUB_PORT = CLINE_HUB_PORT;
13
+ export const DEFAULT_HUB_PATHNAME = "/hub";
14
+
15
+ export interface HubEndpointOverrides {
16
+ host?: string;
17
+ port?: number;
18
+ pathname?: string;
19
+ }
20
+
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;
37
+ }
38
+
39
+ export function resolveDefaultHubPort(
40
+ options: ResolveHubDefaultsOptions = {},
41
+ ): number {
42
+ const env = options.env ?? process.env;
43
+ const raw = env[HUB_PORT_ENV]?.trim();
44
+ if (!raw) {
45
+ return fallbackHubPort(options);
46
+ }
47
+ const port = Number.parseInt(raw, 10);
48
+ if (!Number.isInteger(port) || port < 1 || port > 65_535) {
49
+ return fallbackHubPort(options);
50
+ }
51
+ return port;
52
+ }
53
+
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;
59
+ }
60
+
61
+ export function resolveHubEndpointOptions(
62
+ overrides: HubEndpointOverrides = {},
63
+ options: ResolveHubDefaultsOptions = {},
64
+ ): Required<HubEndpointOverrides> {
65
+ return {
66
+ host: overrides.host ?? resolveDefaultHubHost(options),
67
+ port: overrides.port ?? resolveDefaultHubPort(options),
68
+ pathname: overrides.pathname ?? resolveDefaultHubPathname(options),
69
+ };
70
+ }