@clinebot/core 0.0.34 → 0.0.36

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 (546) hide show
  1. package/README.md +13 -10
  2. package/dist/ClineCore.d.ts +96 -63
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/account/index.d.ts +1 -1
  5. package/dist/account/index.d.ts.map +1 -1
  6. package/dist/account/rpc.d.ts +6 -6
  7. package/dist/account/rpc.d.ts.map +1 -1
  8. package/dist/cron/index.d.ts +6 -0
  9. package/dist/cron/index.d.ts.map +1 -0
  10. package/dist/cron/resource-limiter.d.ts +9 -0
  11. package/dist/cron/resource-limiter.d.ts.map +1 -0
  12. package/dist/cron/schedule-command-service.d.ts +10 -0
  13. package/dist/cron/schedule-command-service.d.ts.map +1 -0
  14. package/dist/cron/schedule-service.d.ts +100 -0
  15. package/dist/cron/schedule-service.d.ts.map +1 -0
  16. package/dist/cron/scheduler.d.ts +66 -0
  17. package/dist/cron/scheduler.d.ts.map +1 -0
  18. package/dist/cron/sqlite-schedule-store.d.ts +52 -0
  19. package/dist/cron/sqlite-schedule-store.d.ts.map +1 -0
  20. package/dist/extensions/config/agent-config-loader.d.ts +6 -5
  21. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  22. package/dist/extensions/config/agent-config-parser.d.ts +1 -1
  23. package/dist/extensions/config/agent-config-parser.d.ts.map +1 -1
  24. package/dist/extensions/config/hooks-config-loader.d.ts +2 -2
  25. package/dist/extensions/config/hooks-config-loader.d.ts.map +1 -1
  26. package/dist/extensions/config/index.d.ts +3 -3
  27. package/dist/extensions/config/index.d.ts.map +1 -1
  28. package/dist/extensions/config/runtime-commands.d.ts +1 -0
  29. package/dist/extensions/config/runtime-commands.d.ts.map +1 -1
  30. package/dist/extensions/config/user-instruction-config-loader.d.ts +3 -2
  31. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  32. package/dist/extensions/context/agentic-compaction.d.ts +2 -2
  33. package/dist/extensions/context/agentic-compaction.d.ts.map +1 -1
  34. package/dist/extensions/context/compaction-shared.d.ts +5 -4
  35. package/dist/extensions/context/compaction-shared.d.ts.map +1 -1
  36. package/dist/extensions/context/compaction.d.ts.map +1 -1
  37. package/dist/extensions/plugin/plugin-config-loader.d.ts +9 -2
  38. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  39. package/dist/extensions/plugin/plugin-loader.d.ts +5 -3
  40. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  41. package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -1
  42. package/dist/extensions/plugin/plugin-sandbox.d.ts +15 -2
  43. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  44. package/dist/extensions/plugin/plugin-targeting.d.ts +7 -0
  45. package/dist/extensions/plugin/plugin-targeting.d.ts.map +1 -0
  46. package/dist/extensions/plugin-sandbox-bootstrap.js +253 -253
  47. package/dist/extensions/tools/constants.d.ts.map +1 -0
  48. package/dist/{tools → extensions/tools}/definitions.d.ts +1 -1
  49. package/dist/extensions/tools/definitions.d.ts.map +1 -0
  50. package/dist/extensions/tools/executors/apply-patch-parser.d.ts.map +1 -0
  51. package/dist/{tools → extensions/tools}/executors/apply-patch.d.ts +3 -1
  52. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -0
  53. package/dist/extensions/tools/executors/bash.d.ts.map +1 -0
  54. package/dist/extensions/tools/executors/editor.d.ts.map +1 -0
  55. package/dist/extensions/tools/executors/file-read.d.ts.map +1 -0
  56. package/dist/extensions/tools/executors/index.d.ts.map +1 -0
  57. package/dist/{tools → extensions/tools}/executors/search.d.ts +1 -1
  58. package/dist/extensions/tools/executors/search.d.ts.map +1 -0
  59. package/dist/extensions/tools/executors/web-fetch.d.ts.map +1 -0
  60. package/dist/extensions/tools/helpers.d.ts.map +1 -0
  61. package/dist/{tools → extensions/tools}/index.d.ts +2 -0
  62. package/dist/extensions/tools/index.d.ts.map +1 -0
  63. package/dist/{tools → extensions/tools}/model-tool-routing.d.ts +1 -1
  64. package/dist/extensions/tools/model-tool-routing.d.ts.map +1 -0
  65. package/dist/{tools → extensions/tools}/presets.d.ts +26 -44
  66. package/dist/extensions/tools/presets.d.ts.map +1 -0
  67. package/dist/extensions/tools/runtime.d.ts +25 -0
  68. package/dist/extensions/tools/runtime.d.ts.map +1 -0
  69. package/dist/extensions/tools/schemas.d.ts.map +1 -0
  70. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -0
  71. package/dist/extensions/tools/team/index.d.ts.map +1 -0
  72. package/dist/{team → extensions/tools/team}/multi-agent.d.ts +1 -3
  73. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -0
  74. package/dist/extensions/tools/team/projections.d.ts.map +1 -0
  75. package/dist/extensions/tools/team/runtime.d.ts.map +1 -0
  76. package/dist/{team → extensions/tools/team}/spawn-agent-tool.d.ts +0 -1
  77. package/dist/extensions/tools/team/spawn-agent-tool.d.ts.map +1 -0
  78. package/dist/extensions/tools/team/subagent-prompts.d.ts.map +1 -0
  79. package/dist/{team → extensions/tools/team}/team-tools.d.ts +1 -0
  80. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -0
  81. package/dist/{tools → extensions/tools}/types.d.ts +4 -3
  82. package/dist/extensions/tools/types.d.ts.map +1 -0
  83. package/dist/{runtime → hooks}/checkpoint-hooks.d.ts +7 -0
  84. package/dist/hooks/checkpoint-hooks.d.ts.map +1 -0
  85. package/dist/{runtime → hooks}/hook-file-hooks.d.ts +4 -3
  86. package/dist/hooks/hook-file-hooks.d.ts.map +1 -0
  87. package/dist/hooks/index.d.ts +0 -1
  88. package/dist/hooks/index.d.ts.map +1 -1
  89. package/dist/hooks/subprocess.d.ts +10 -130
  90. package/dist/hooks/subprocess.d.ts.map +1 -1
  91. package/dist/hub/browser-websocket.d.ts +18 -0
  92. package/dist/hub/browser-websocket.d.ts.map +1 -0
  93. package/dist/hub/client.d.ts +45 -0
  94. package/dist/hub/client.d.ts.map +1 -0
  95. package/dist/hub/connect.d.ts +15 -0
  96. package/dist/hub/connect.d.ts.map +1 -0
  97. package/dist/hub/daemon-entry.d.ts +2 -0
  98. package/dist/hub/daemon-entry.d.ts.map +1 -0
  99. package/dist/hub/daemon-entry.js +1045 -0
  100. package/dist/hub/daemon.d.ts +5 -0
  101. package/dist/hub/daemon.d.ts.map +1 -0
  102. package/dist/hub/defaults.d.ts +13 -0
  103. package/dist/hub/defaults.d.ts.map +1 -0
  104. package/dist/hub/discovery.d.ts +29 -0
  105. package/dist/hub/discovery.d.ts.map +1 -0
  106. package/dist/hub/index.d.ts +15 -0
  107. package/dist/hub/index.d.ts.map +1 -0
  108. package/dist/hub/index.js +1044 -0
  109. package/dist/hub/native-transport.d.ts +17 -0
  110. package/dist/hub/native-transport.d.ts.map +1 -0
  111. package/dist/hub/runtime-handlers.d.ts +11 -0
  112. package/dist/hub/runtime-handlers.d.ts.map +1 -0
  113. package/dist/hub/server.d.ts +86 -0
  114. package/dist/hub/server.d.ts.map +1 -0
  115. package/dist/hub/session-client.d.ts +87 -0
  116. package/dist/hub/session-client.d.ts.map +1 -0
  117. package/dist/hub/start-shared-server.d.ts +19 -0
  118. package/dist/hub/start-shared-server.d.ts.map +1 -0
  119. package/dist/hub/transport.d.ts +8 -0
  120. package/dist/hub/transport.d.ts.map +1 -0
  121. package/dist/hub/ui-client.d.ts +44 -0
  122. package/dist/hub/ui-client.d.ts.map +1 -0
  123. package/dist/hub/workspace.d.ts +4 -0
  124. package/dist/hub/workspace.d.ts.map +1 -0
  125. package/dist/index.d.ts +52 -39
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +557 -533
  128. package/dist/llms/configured-provider-registry.d.ts +28 -0
  129. package/dist/llms/configured-provider-registry.d.ts.map +1 -0
  130. package/dist/llms/provider-defaults.d.ts +27 -0
  131. package/dist/llms/provider-defaults.d.ts.map +1 -0
  132. package/dist/llms/provider-settings.d.ts +202 -0
  133. package/dist/llms/provider-settings.d.ts.map +1 -0
  134. package/dist/llms/runtime-config.d.ts +4 -0
  135. package/dist/llms/runtime-config.d.ts.map +1 -0
  136. package/dist/llms/runtime-registry.d.ts +20 -0
  137. package/dist/llms/runtime-registry.d.ts.map +1 -0
  138. package/dist/llms/runtime-types.d.ts +85 -0
  139. package/dist/llms/runtime-types.d.ts.map +1 -0
  140. package/dist/runtime/history.d.ts +4 -0
  141. package/dist/runtime/history.d.ts.map +1 -0
  142. package/dist/runtime/host.d.ts +8 -0
  143. package/dist/runtime/host.d.ts.map +1 -0
  144. package/dist/runtime/rules.d.ts +1 -0
  145. package/dist/runtime/rules.d.ts.map +1 -1
  146. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  147. package/dist/runtime/runtime-host.d.ts +103 -0
  148. package/dist/runtime/runtime-host.d.ts.map +1 -0
  149. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts +1 -1
  150. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts.map +1 -1
  151. package/dist/runtime/session-runtime.d.ts +3 -21
  152. package/dist/runtime/session-runtime.d.ts.map +1 -1
  153. package/dist/{session/session-agent-events.d.ts → services/agent-events.d.ts} +4 -4
  154. package/dist/services/agent-events.d.ts.map +1 -0
  155. package/dist/services/config.d.ts +3 -0
  156. package/dist/services/config.d.ts.map +1 -0
  157. package/dist/services/global-settings.d.ts +12 -0
  158. package/dist/services/global-settings.d.ts.map +1 -0
  159. package/dist/services/local-runtime-bootstrap.d.ts +47 -0
  160. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -0
  161. package/dist/services/plugin-tools.d.ts +16 -0
  162. package/dist/services/plugin-tools.d.ts.map +1 -0
  163. package/dist/{providers → services/providers}/local-provider-registry.d.ts +4 -4
  164. package/dist/services/providers/local-provider-registry.d.ts.map +1 -0
  165. package/dist/{providers → services/providers}/local-provider-service.d.ts +13 -13
  166. package/dist/services/providers/local-provider-service.d.ts.map +1 -0
  167. package/dist/{session → services}/session-artifacts.d.ts +0 -4
  168. package/dist/services/session-artifacts.d.ts.map +1 -0
  169. package/dist/{session/utils/helpers.d.ts → services/session-data.d.ts} +19 -27
  170. package/dist/services/session-data.d.ts.map +1 -0
  171. package/dist/{session → services}/session-telemetry.d.ts +2 -2
  172. package/dist/services/session-telemetry.d.ts.map +1 -0
  173. package/dist/{storage → services/storage}/file-team-store.d.ts +2 -2
  174. package/dist/services/storage/file-team-store.d.ts.map +1 -0
  175. package/dist/{storage → services/storage}/provider-settings-legacy-migration.d.ts +1 -1
  176. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -0
  177. package/dist/{storage → services/storage}/provider-settings-manager.d.ts +1 -1
  178. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -0
  179. package/dist/{storage → services/storage}/sqlite-session-store.d.ts +3 -3
  180. package/dist/services/storage/sqlite-session-store.d.ts.map +1 -0
  181. package/dist/{storage → services/storage}/sqlite-team-store.d.ts +2 -2
  182. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -0
  183. package/dist/{storage → services/storage}/team-store.d.ts +1 -1
  184. package/dist/services/storage/team-store.d.ts.map +1 -0
  185. package/dist/services/telemetry/ITelemetryAdapter.d.ts.map +1 -0
  186. package/dist/services/telemetry/OpenTelemetryAdapter.d.ts.map +1 -0
  187. package/dist/services/telemetry/OpenTelemetryProvider.d.ts.map +1 -0
  188. package/dist/services/telemetry/TelemetryLoggerSink.d.ts.map +1 -0
  189. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -0
  190. package/dist/services/telemetry/core-events.d.ts.map +1 -0
  191. package/dist/services/telemetry/distinct-id.d.ts.map +1 -0
  192. package/dist/services/telemetry/index.d.ts.map +1 -0
  193. package/dist/services/telemetry/index.js +28 -0
  194. package/dist/{session/utils → services}/usage.d.ts +1 -1
  195. package/dist/services/usage.d.ts.map +1 -0
  196. package/dist/services/workspace/file-indexer.d.ts.map +1 -0
  197. package/dist/services/workspace/index.d.ts.map +1 -0
  198. package/dist/services/workspace/mention-enricher.d.ts.map +1 -0
  199. package/dist/services/workspace-manifest.d.ts +16 -0
  200. package/dist/services/workspace-manifest.d.ts.map +1 -0
  201. package/dist/session/file-session-service.d.ts +4 -1
  202. package/dist/session/file-session-service.d.ts.map +1 -1
  203. package/dist/session/persistence-service.d.ts +15 -25
  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-row.d.ts +93 -0
  208. package/dist/session/session-row.d.ts.map +1 -0
  209. package/dist/session/session-service.d.ts +8 -109
  210. package/dist/session/session-service.d.ts.map +1 -1
  211. package/dist/session/session-team-coordination.d.ts +4 -4
  212. package/dist/session/session-team-coordination.d.ts.map +1 -1
  213. package/dist/session/subagent-session-manager.d.ts +36 -0
  214. package/dist/session/subagent-session-manager.d.ts.map +1 -0
  215. package/dist/session/team-persistence-store.d.ts +24 -0
  216. package/dist/session/team-persistence-store.d.ts.map +1 -0
  217. package/dist/transports/hub.d.ts +47 -0
  218. package/dist/transports/hub.d.ts.map +1 -0
  219. package/dist/{session/default-session-manager.d.ts → transports/local.d.ts} +30 -16
  220. package/dist/transports/local.d.ts.map +1 -0
  221. package/dist/transports/remote.d.ts +10 -0
  222. package/dist/transports/remote.d.ts.map +1 -0
  223. package/dist/transports/runtime-host-support.d.ts +22 -0
  224. package/dist/transports/runtime-host-support.d.ts.map +1 -0
  225. package/dist/{chat → types}/chat-schema.d.ts +10 -12
  226. package/dist/types/chat-schema.d.ts.map +1 -0
  227. package/dist/types/config.d.ts +10 -9
  228. package/dist/types/config.d.ts.map +1 -1
  229. package/dist/types/provider-settings.d.ts +4 -5
  230. package/dist/types/provider-settings.d.ts.map +1 -1
  231. package/dist/{session/utils/types.d.ts → types/session.d.ts} +16 -6
  232. package/dist/types/session.d.ts.map +1 -0
  233. package/dist/types/sessions.d.ts +19 -0
  234. package/dist/types/sessions.d.ts.map +1 -1
  235. package/dist/types/storage.d.ts +1 -3
  236. package/dist/types/storage.d.ts.map +1 -1
  237. package/dist/types.d.ts +14 -6
  238. package/dist/types.d.ts.map +1 -1
  239. package/package.json +22 -13
  240. package/src/ClineCore.ts +183 -85
  241. package/src/account/index.ts +3 -3
  242. package/src/account/rpc.ts +12 -12
  243. package/src/auth/cline.ts +1 -1
  244. package/src/auth/codex.ts +1 -1
  245. package/src/auth/oca.ts +1 -1
  246. package/src/cron/index.ts +5 -0
  247. package/src/cron/resource-limiter.ts +46 -0
  248. package/src/cron/schedule-command-service.ts +193 -0
  249. package/src/cron/schedule-service.ts +703 -0
  250. package/src/cron/scheduler.ts +637 -0
  251. package/src/cron/sqlite-schedule-store.ts +708 -0
  252. package/src/extensions/config/agent-config-loader.ts +18 -12
  253. package/src/extensions/config/agent-config-parser.ts +1 -1
  254. package/src/extensions/config/hooks-config-loader.ts +1 -2
  255. package/src/extensions/config/index.ts +0 -4
  256. package/src/extensions/config/runtime-commands.ts +6 -0
  257. package/src/extensions/config/user-instruction-config-loader.ts +1 -4
  258. package/src/extensions/context/agentic-compaction.ts +3 -3
  259. package/src/extensions/context/basic-compaction.ts +2 -2
  260. package/src/extensions/context/compaction-shared.ts +5 -4
  261. package/src/extensions/context/compaction.ts +3 -3
  262. package/src/extensions/plugin/plugin-config-loader.ts +17 -2
  263. package/src/extensions/plugin/plugin-loader.ts +48 -4
  264. package/src/extensions/plugin/plugin-module-import.ts +0 -2
  265. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +93 -39
  266. package/src/extensions/plugin/plugin-sandbox.ts +47 -27
  267. package/src/extensions/plugin/plugin-targeting.ts +32 -0
  268. package/src/{tools → extensions/tools}/definitions.ts +31 -50
  269. package/src/{tools → extensions/tools}/executors/apply-patch.ts +69 -80
  270. package/src/{tools → extensions/tools}/executors/file-read.ts +29 -4
  271. package/src/{tools → extensions/tools}/executors/search.ts +196 -4
  272. package/src/{tools → extensions/tools}/index.ts +10 -0
  273. package/src/{tools → extensions/tools}/model-tool-routing.ts +1 -1
  274. package/src/{tools → extensions/tools}/presets.ts +31 -47
  275. package/src/extensions/tools/runtime.ts +261 -0
  276. package/src/{tools → extensions/tools}/schemas.ts +4 -2
  277. package/src/{team → extensions/tools/team}/multi-agent.ts +80 -17
  278. package/src/{team → extensions/tools/team}/spawn-agent-tool.ts +1 -7
  279. package/src/{team → extensions/tools/team}/subagent-prompts.ts +2 -2
  280. package/src/{team → extensions/tools/team}/team-tools.ts +84 -53
  281. package/src/{tools → extensions/tools}/types.ts +5 -3
  282. package/src/{runtime → hooks}/checkpoint-hooks.ts +27 -0
  283. package/src/{runtime → hooks}/hook-file-hooks.ts +14 -13
  284. package/src/hooks/index.ts +0 -7
  285. package/src/hooks/subprocess-runner.ts +1 -1
  286. package/src/hooks/subprocess.ts +57 -257
  287. package/src/hub/browser-websocket.ts +137 -0
  288. package/src/hub/client.ts +574 -0
  289. package/src/hub/connect.ts +156 -0
  290. package/src/hub/daemon-entry.ts +87 -0
  291. package/src/hub/daemon.ts +181 -0
  292. package/src/hub/defaults.ts +43 -0
  293. package/src/hub/discovery.ts +247 -0
  294. package/src/hub/index.ts +14 -0
  295. package/src/hub/native-transport.ts +31 -0
  296. package/src/hub/runtime-handlers.ts +140 -0
  297. package/src/hub/server.ts +1888 -0
  298. package/src/hub/session-client.ts +460 -0
  299. package/src/hub/start-shared-server.ts +58 -0
  300. package/src/hub/transport.ts +14 -0
  301. package/src/hub/ui-client.ts +122 -0
  302. package/src/hub/workspace.ts +19 -0
  303. package/src/index.ts +264 -199
  304. package/src/llms/configured-provider-registry.ts +193 -0
  305. package/src/llms/provider-defaults.ts +637 -0
  306. package/src/llms/provider-settings.ts +263 -0
  307. package/src/llms/runtime-config.ts +43 -0
  308. package/src/llms/runtime-registry.ts +171 -0
  309. package/src/llms/runtime-types.ts +121 -0
  310. package/src/runtime/history.ts +237 -0
  311. package/src/runtime/host.ts +200 -0
  312. package/src/runtime/index.ts +1 -0
  313. package/src/runtime/rules.ts +12 -0
  314. package/src/runtime/runtime-builder.ts +37 -29
  315. package/src/runtime/runtime-host.ts +206 -0
  316. package/src/{session → runtime}/runtime-oauth-token-manager.ts +12 -16
  317. package/src/runtime/session-runtime.ts +2 -26
  318. package/src/{session/session-agent-events.ts → services/agent-events.ts} +7 -7
  319. package/src/services/config.ts +5 -0
  320. package/src/services/global-settings.ts +122 -0
  321. package/src/services/local-runtime-bootstrap.ts +318 -0
  322. package/src/services/plugin-tools.ts +85 -0
  323. package/src/{providers → services/providers}/local-provider-registry.ts +6 -6
  324. package/src/{providers → services/providers}/local-provider-service.ts +46 -41
  325. package/src/{session → services}/session-artifacts.ts +7 -19
  326. package/src/{session/utils/helpers.ts → services/session-data.ts} +90 -80
  327. package/src/{session → services}/session-telemetry.ts +7 -9
  328. package/src/services/storage/artifact-store.ts +1 -0
  329. package/src/{storage → services/storage}/file-team-store.ts +2 -2
  330. package/src/{storage → services/storage}/provider-settings-legacy-migration.ts +6 -4
  331. package/src/{storage → services/storage}/provider-settings-manager.ts +3 -3
  332. package/src/services/storage/session-store.ts +1 -0
  333. package/src/{storage → services/storage}/sqlite-session-store.ts +7 -12
  334. package/src/{storage → services/storage}/sqlite-team-store.ts +4 -4
  335. package/src/{storage → services/storage}/team-store.ts +1 -1
  336. package/src/{session/utils → services}/usage.ts +1 -1
  337. package/src/{input → services/workspace}/file-indexer.ts +26 -2
  338. package/src/{input → services/workspace}/mention-enricher.ts +1 -1
  339. package/src/{session → services}/workspace-manifest.ts +18 -0
  340. package/src/session/file-session-service.ts +10 -8
  341. package/src/session/index.ts +10 -23
  342. package/src/session/persistence-service.ts +144 -528
  343. package/src/session/session-manifest-store.ts +158 -0
  344. package/src/session/session-row.ts +199 -0
  345. package/src/session/session-service.ts +43 -389
  346. package/src/session/session-team-coordination.ts +14 -7
  347. package/src/session/subagent-session-manager.ts +397 -0
  348. package/src/session/team-persistence-store.ts +176 -0
  349. package/src/session/workspace-manager.ts +1 -1
  350. package/src/transports/hub.ts +656 -0
  351. package/src/{session/default-session-manager.ts → transports/local.ts} +263 -200
  352. package/src/transports/remote.ts +26 -0
  353. package/src/transports/runtime-host-support.ts +140 -0
  354. package/src/{chat → types}/chat-schema.ts +4 -5
  355. package/src/types/config.ts +10 -9
  356. package/src/types/provider-settings.ts +11 -7
  357. package/src/{session/utils/types.ts → types/session.ts} +16 -5
  358. package/src/types/sessions.ts +21 -0
  359. package/src/types/storage.ts +1 -6
  360. package/src/types.ts +52 -19
  361. package/dist/chat/chat-schema.d.ts.map +0 -1
  362. package/dist/hooks/persistent.d.ts +0 -64
  363. package/dist/hooks/persistent.d.ts.map +0 -1
  364. package/dist/input/file-indexer.d.ts.map +0 -1
  365. package/dist/input/index.d.ts.map +0 -1
  366. package/dist/input/mention-enricher.d.ts.map +0 -1
  367. package/dist/prompt/default-system.d.ts +0 -2
  368. package/dist/prompt/default-system.d.ts.map +0 -1
  369. package/dist/providers/local-provider-registry.d.ts.map +0 -1
  370. package/dist/providers/local-provider-service.d.ts.map +0 -1
  371. package/dist/runtime/checkpoint-hooks.d.ts.map +0 -1
  372. package/dist/runtime/hook-file-hooks.d.ts.map +0 -1
  373. package/dist/session/default-session-manager.d.ts.map +0 -1
  374. package/dist/session/rpc-runtime-ensure.d.ts +0 -53
  375. package/dist/session/rpc-runtime-ensure.d.ts.map +0 -1
  376. package/dist/session/rpc-session-service.d.ts +0 -13
  377. package/dist/session/rpc-session-service.d.ts.map +0 -1
  378. package/dist/session/rpc-spawn-lease.d.ts +0 -8
  379. package/dist/session/rpc-spawn-lease.d.ts.map +0 -1
  380. package/dist/session/session-agent-events.d.ts.map +0 -1
  381. package/dist/session/session-artifacts.d.ts.map +0 -1
  382. package/dist/session/session-config-builder.d.ts +0 -16
  383. package/dist/session/session-config-builder.d.ts.map +0 -1
  384. package/dist/session/session-host.d.ts +0 -15
  385. package/dist/session/session-host.d.ts.map +0 -1
  386. package/dist/session/session-manager.d.ts +0 -62
  387. package/dist/session/session-manager.d.ts.map +0 -1
  388. package/dist/session/session-telemetry.d.ts.map +0 -1
  389. package/dist/session/sqlite-rpc-session-backend.d.ts +0 -31
  390. package/dist/session/sqlite-rpc-session-backend.d.ts.map +0 -1
  391. package/dist/session/utils/helpers.d.ts.map +0 -1
  392. package/dist/session/utils/types.d.ts.map +0 -1
  393. package/dist/session/utils/usage.d.ts.map +0 -1
  394. package/dist/session/workspace-manifest.d.ts +0 -5
  395. package/dist/session/workspace-manifest.d.ts.map +0 -1
  396. package/dist/storage/file-team-store.d.ts.map +0 -1
  397. package/dist/storage/provider-settings-legacy-migration.d.ts.map +0 -1
  398. package/dist/storage/provider-settings-manager.d.ts.map +0 -1
  399. package/dist/storage/sqlite-session-store.d.ts.map +0 -1
  400. package/dist/storage/sqlite-team-store.d.ts.map +0 -1
  401. package/dist/storage/team-store.d.ts.map +0 -1
  402. package/dist/team/delegated-agent.d.ts.map +0 -1
  403. package/dist/team/index.d.ts.map +0 -1
  404. package/dist/team/multi-agent.d.ts.map +0 -1
  405. package/dist/team/projections.d.ts.map +0 -1
  406. package/dist/team/runtime.d.ts.map +0 -1
  407. package/dist/team/spawn-agent-tool.d.ts.map +0 -1
  408. package/dist/team/subagent-prompts.d.ts.map +0 -1
  409. package/dist/team/team-tools.d.ts.map +0 -1
  410. package/dist/telemetry/ITelemetryAdapter.d.ts.map +0 -1
  411. package/dist/telemetry/OpenTelemetryAdapter.d.ts.map +0 -1
  412. package/dist/telemetry/OpenTelemetryProvider.d.ts.map +0 -1
  413. package/dist/telemetry/TelemetryLoggerSink.d.ts.map +0 -1
  414. package/dist/telemetry/TelemetryService.d.ts.map +0 -1
  415. package/dist/telemetry/core-events.d.ts.map +0 -1
  416. package/dist/telemetry/distinct-id.d.ts.map +0 -1
  417. package/dist/telemetry/index.d.ts.map +0 -1
  418. package/dist/telemetry/index.js +0 -15
  419. package/dist/tools/constants.d.ts.map +0 -1
  420. package/dist/tools/definitions.d.ts.map +0 -1
  421. package/dist/tools/executors/apply-patch-parser.d.ts.map +0 -1
  422. package/dist/tools/executors/apply-patch.d.ts.map +0 -1
  423. package/dist/tools/executors/bash.d.ts.map +0 -1
  424. package/dist/tools/executors/editor.d.ts.map +0 -1
  425. package/dist/tools/executors/file-read.d.ts.map +0 -1
  426. package/dist/tools/executors/index.d.ts.map +0 -1
  427. package/dist/tools/executors/search.d.ts.map +0 -1
  428. package/dist/tools/executors/web-fetch.d.ts.map +0 -1
  429. package/dist/tools/helpers.d.ts.map +0 -1
  430. package/dist/tools/index.d.ts.map +0 -1
  431. package/dist/tools/model-tool-routing.d.ts.map +0 -1
  432. package/dist/tools/presets.d.ts.map +0 -1
  433. package/dist/tools/schemas.d.ts.map +0 -1
  434. package/dist/tools/types.d.ts.map +0 -1
  435. package/src/ClineCore.test.ts +0 -150
  436. package/src/account/cline-account-service.test.ts +0 -185
  437. package/src/account/featurebase-token.test.ts +0 -175
  438. package/src/account/rpc.test.ts +0 -63
  439. package/src/auth/bounded-ttl-cache.test.ts +0 -38
  440. package/src/auth/client.test.ts +0 -69
  441. package/src/auth/cline.test.ts +0 -267
  442. package/src/auth/codex.test.ts +0 -170
  443. package/src/auth/oca.test.ts +0 -340
  444. package/src/auth/server.test.ts +0 -287
  445. package/src/auth/utils.test.ts +0 -128
  446. package/src/extensions/config/agent-config-loader.test.ts +0 -236
  447. package/src/extensions/config/hooks-config-loader.test.ts +0 -20
  448. package/src/extensions/config/runtime-commands.test.ts +0 -115
  449. package/src/extensions/config/unified-config-file-watcher.test.ts +0 -196
  450. package/src/extensions/config/user-instruction-config-loader.test.ts +0 -246
  451. package/src/extensions/context/compaction.test.ts +0 -483
  452. package/src/extensions/mcp/config-loader.test.ts +0 -238
  453. package/src/extensions/mcp/manager.test.ts +0 -105
  454. package/src/extensions/plugin/plugin-config-loader.test.ts +0 -182
  455. package/src/extensions/plugin/plugin-loader.test.ts +0 -292
  456. package/src/extensions/plugin/plugin-sandbox.test.ts +0 -423
  457. package/src/hooks/persistent.ts +0 -661
  458. package/src/input/file-indexer.d.ts +0 -11
  459. package/src/input/file-indexer.test.ts +0 -127
  460. package/src/input/mention-enricher.test.ts +0 -85
  461. package/src/prompt/default-system.ts +0 -21
  462. package/src/providers/local-provider-service.test.ts +0 -1062
  463. package/src/runtime/checkpoint-hooks.test.ts +0 -168
  464. package/src/runtime/hook-file-hooks.test.ts +0 -311
  465. package/src/runtime/runtime-builder.team-persistence.test.ts +0 -242
  466. package/src/runtime/runtime-builder.test.ts +0 -616
  467. package/src/runtime/runtime-parity.test.ts +0 -143
  468. package/src/session/default-session-manager.e2e.test.ts +0 -384
  469. package/src/session/default-session-manager.test.ts +0 -2473
  470. package/src/session/persistence-service.test.ts +0 -241
  471. package/src/session/rpc-runtime-ensure.ts +0 -521
  472. package/src/session/rpc-session-service.ts +0 -107
  473. package/src/session/rpc-spawn-lease.test.ts +0 -49
  474. package/src/session/rpc-spawn-lease.ts +0 -122
  475. package/src/session/runtime-oauth-token-manager.test.ts +0 -137
  476. package/src/session/session-config-builder.ts +0 -172
  477. package/src/session/session-host.test.ts +0 -89
  478. package/src/session/session-host.ts +0 -213
  479. package/src/session/session-manager.ts +0 -74
  480. package/src/session/session-service.team-persistence.test.ts +0 -48
  481. package/src/session/sqlite-rpc-session-backend.ts +0 -303
  482. package/src/session/utils/helpers.test.ts +0 -160
  483. package/src/storage/artifact-store.ts +0 -1
  484. package/src/storage/provider-settings-legacy-migration.test.ts +0 -424
  485. package/src/storage/provider-settings-manager.test.ts +0 -191
  486. package/src/storage/session-store.ts +0 -1
  487. package/src/team/multi-agent.lifecycle.test.ts +0 -201
  488. package/src/team/spawn-agent-tool.test.ts +0 -387
  489. package/src/team/team-tools.test.ts +0 -906
  490. package/src/telemetry/OpenTelemetryAdapter.test.ts +0 -157
  491. package/src/telemetry/OpenTelemetryProvider.test.ts +0 -326
  492. package/src/telemetry/TelemetryLoggerSink.test.ts +0 -42
  493. package/src/telemetry/TelemetryService.test.ts +0 -134
  494. package/src/telemetry/distinct-id.test.ts +0 -57
  495. package/src/tools/definitions.test.ts +0 -780
  496. package/src/tools/executors/bash.test.ts +0 -87
  497. package/src/tools/executors/editor.test.ts +0 -35
  498. package/src/tools/executors/file-read.test.ts +0 -49
  499. package/src/tools/model-tool-routing.test.ts +0 -86
  500. package/src/tools/presets.test.ts +0 -70
  501. /package/dist/{tools → extensions/tools}/constants.d.ts +0 -0
  502. /package/dist/{tools → extensions/tools}/executors/apply-patch-parser.d.ts +0 -0
  503. /package/dist/{tools → extensions/tools}/executors/bash.d.ts +0 -0
  504. /package/dist/{tools → extensions/tools}/executors/editor.d.ts +0 -0
  505. /package/dist/{tools → extensions/tools}/executors/file-read.d.ts +0 -0
  506. /package/dist/{tools → extensions/tools}/executors/index.d.ts +0 -0
  507. /package/dist/{tools → extensions/tools}/executors/web-fetch.d.ts +0 -0
  508. /package/dist/{tools → extensions/tools}/helpers.d.ts +0 -0
  509. /package/dist/{tools → extensions/tools}/schemas.d.ts +0 -0
  510. /package/dist/{team → extensions/tools/team}/delegated-agent.d.ts +0 -0
  511. /package/dist/{team → extensions/tools/team}/index.d.ts +0 -0
  512. /package/dist/{team → extensions/tools/team}/projections.d.ts +0 -0
  513. /package/dist/{team → extensions/tools/team}/runtime.d.ts +0 -0
  514. /package/dist/{team → extensions/tools/team}/subagent-prompts.d.ts +0 -0
  515. /package/dist/{telemetry → services/telemetry}/ITelemetryAdapter.d.ts +0 -0
  516. /package/dist/{telemetry → services/telemetry}/OpenTelemetryAdapter.d.ts +0 -0
  517. /package/dist/{telemetry → services/telemetry}/OpenTelemetryProvider.d.ts +0 -0
  518. /package/dist/{telemetry → services/telemetry}/TelemetryLoggerSink.d.ts +0 -0
  519. /package/dist/{telemetry → services/telemetry}/TelemetryService.d.ts +0 -0
  520. /package/dist/{telemetry → services/telemetry}/core-events.d.ts +0 -0
  521. /package/dist/{telemetry → services/telemetry}/distinct-id.d.ts +0 -0
  522. /package/dist/{telemetry → services/telemetry}/index.d.ts +0 -0
  523. /package/dist/{input → services/workspace}/file-indexer.d.ts +0 -0
  524. /package/dist/{input → services/workspace}/index.d.ts +0 -0
  525. /package/dist/{input → services/workspace}/mention-enricher.d.ts +0 -0
  526. /package/src/{tools → extensions/tools}/constants.ts +0 -0
  527. /package/src/{tools → extensions/tools}/executors/apply-patch-parser.ts +0 -0
  528. /package/src/{tools → extensions/tools}/executors/bash.ts +0 -0
  529. /package/src/{tools → extensions/tools}/executors/editor.ts +0 -0
  530. /package/src/{tools → extensions/tools}/executors/index.ts +0 -0
  531. /package/src/{tools → extensions/tools}/executors/web-fetch.ts +0 -0
  532. /package/src/{tools → extensions/tools}/helpers.ts +0 -0
  533. /package/src/{team → extensions/tools/team}/delegated-agent.ts +0 -0
  534. /package/src/{team → extensions/tools/team}/index.ts +0 -0
  535. /package/src/{team → extensions/tools/team}/projections.ts +0 -0
  536. /package/src/{team → extensions/tools/team}/runtime.ts +0 -0
  537. /package/src/{storage → services/storage}/index.ts +0 -0
  538. /package/src/{telemetry → services/telemetry}/ITelemetryAdapter.ts +0 -0
  539. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.ts +0 -0
  540. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.ts +0 -0
  541. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.ts +0 -0
  542. /package/src/{telemetry → services/telemetry}/TelemetryService.ts +0 -0
  543. /package/src/{telemetry → services/telemetry}/core-events.ts +0 -0
  544. /package/src/{telemetry → services/telemetry}/distinct-id.ts +0 -0
  545. /package/src/{telemetry → services/telemetry}/index.ts +0 -0
  546. /package/src/{input → services/workspace}/index.ts +0 -0
@@ -0,0 +1,87 @@
1
+ import { resolveHubEndpointOptions } from "./defaults";
2
+ import { createLocalHubScheduleRuntimeHandlers } from "./runtime-handlers";
3
+ import { startHubWebSocketServer } from "./server";
4
+ import { resolveSharedHubOwnerContext } from "./workspace";
5
+
6
+ function parseArgs(argv: string[]): {
7
+ cwd: string;
8
+ host?: string;
9
+ port?: number;
10
+ pathname?: string;
11
+ } {
12
+ let cwd = process.cwd();
13
+ let host: string | undefined;
14
+ let port: number | undefined;
15
+ let pathname: string | undefined;
16
+
17
+ for (let index = 0; index < argv.length; index += 1) {
18
+ const arg = argv[index];
19
+ const value = argv[index + 1];
20
+ if (arg === "--cwd" && value) {
21
+ cwd = value;
22
+ index += 1;
23
+ continue;
24
+ }
25
+ if (arg === "--host" && value) {
26
+ host = value;
27
+ index += 1;
28
+ continue;
29
+ }
30
+ if (arg === "--port" && value) {
31
+ const parsed = Number(value);
32
+ if (Number.isFinite(parsed)) {
33
+ port = parsed;
34
+ }
35
+ index += 1;
36
+ continue;
37
+ }
38
+ if (arg === "--pathname" && value) {
39
+ pathname = value;
40
+ index += 1;
41
+ }
42
+ }
43
+
44
+ return { cwd, host, port, pathname };
45
+ }
46
+
47
+ async function main(): Promise<void> {
48
+ const options = parseArgs(process.argv.slice(2));
49
+ process.chdir(options.cwd);
50
+
51
+ const endpoint = resolveHubEndpointOptions({
52
+ host: options.host,
53
+ port: options.port,
54
+ pathname: options.pathname,
55
+ });
56
+
57
+ const server = await startHubWebSocketServer({
58
+ host: endpoint.host,
59
+ port: endpoint.port,
60
+ pathname: endpoint.pathname,
61
+ owner: resolveSharedHubOwnerContext(),
62
+ runtimeHandlers: createLocalHubScheduleRuntimeHandlers(),
63
+ });
64
+
65
+ const shutdown = async (): Promise<void> => {
66
+ await server.close();
67
+ process.exit(0);
68
+ };
69
+
70
+ process.on("SIGINT", () => {
71
+ void shutdown();
72
+ });
73
+ process.on("SIGTERM", () => {
74
+ void shutdown();
75
+ });
76
+
77
+ await new Promise<void>(() => {
78
+ // keep daemon process alive
79
+ });
80
+ }
81
+
82
+ void main().catch((error) => {
83
+ const message =
84
+ error instanceof Error ? error.stack || error.message : String(error);
85
+ process.stderr.write(`[hub-daemon] fatal: ${message}\n`);
86
+ process.exit(1);
87
+ });
@@ -0,0 +1,181 @@
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 { withResolvedClineBuildEnv } from "@clinebot/shared";
6
+ import { verifyHubConnection } from "./client";
7
+ import {
8
+ type HubEndpointOverrides,
9
+ resolveHubEndpointOptions,
10
+ } from "./defaults";
11
+ import {
12
+ createHubServerUrl,
13
+ probeHubServer,
14
+ readHubDiscovery,
15
+ resolveClineDataDir,
16
+ writeHubDiscovery,
17
+ } from "./discovery";
18
+ import { resolveSharedHubOwnerContext } from "./workspace";
19
+
20
+ const HUB_STARTUP_TIMEOUT_MS = 8_000;
21
+ const HUB_STARTUP_POLL_MS = 200;
22
+
23
+ function endpointArgs(endpoint: HubEndpointOverrides): string[] {
24
+ return [
25
+ ...(endpoint.host ? ["--host", endpoint.host] : []),
26
+ ...(typeof endpoint.port === "number"
27
+ ? ["--port", String(endpoint.port)]
28
+ : []),
29
+ ...(endpoint.pathname ? ["--pathname", endpoint.pathname] : []),
30
+ ];
31
+ }
32
+
33
+ function openDetachedHubLogFile(): { fd: number; logPath: string } | undefined {
34
+ try {
35
+ const logPath = join(resolveClineDataDir(), "logs", "hub-daemon.log");
36
+ mkdirSync(dirname(logPath), { recursive: true });
37
+ return { fd: openSync(logPath, "a"), logPath };
38
+ } catch {
39
+ return undefined;
40
+ }
41
+ }
42
+
43
+ function resolveDaemonEntryPath(): string {
44
+ const extension = import.meta.url.endsWith(".ts") ? "ts" : "js";
45
+ return fileURLToPath(new URL(`./daemon-entry.${extension}`, import.meta.url));
46
+ }
47
+
48
+ function resolveLaunchCommand(
49
+ workspaceRoot: string,
50
+ endpoint: HubEndpointOverrides,
51
+ ): {
52
+ launcher: string;
53
+ args: string[];
54
+ cwd: string;
55
+ env: NodeJS.ProcessEnv;
56
+ } {
57
+ const daemonEntryPath = resolveDaemonEntryPath();
58
+ const execPath = process.execPath?.trim();
59
+ if (!execPath) {
60
+ throw new Error("unable to resolve runtime executable for hub daemon");
61
+ }
62
+ const isBunRuntime = basename(execPath).toLowerCase().includes("bun");
63
+ const useDevelopmentConditions =
64
+ isBunRuntime && daemonEntryPath.toLowerCase().endsWith(".ts");
65
+ return {
66
+ launcher: execPath,
67
+ args: [
68
+ ...(useDevelopmentConditions ? ["--conditions=development"] : []),
69
+ daemonEntryPath,
70
+ "--cwd",
71
+ workspaceRoot,
72
+ ...endpointArgs(endpoint),
73
+ ],
74
+ cwd: workspaceRoot,
75
+ env: {
76
+ ...withResolvedClineBuildEnv(process.env),
77
+ CLINE_NO_INTERACTIVE: "1",
78
+ },
79
+ };
80
+ }
81
+
82
+ export function spawnDetachedHubServer(
83
+ workspaceRoot: string,
84
+ endpoint: HubEndpointOverrides = {},
85
+ ): void {
86
+ const command = resolveLaunchCommand(workspaceRoot, endpoint);
87
+ const logFile = openDetachedHubLogFile();
88
+ try {
89
+ const child = spawn(command.launcher, command.args, {
90
+ detached: true,
91
+ stdio: logFile ? ["ignore", logFile.fd, logFile.fd] : "ignore",
92
+ env: command.env,
93
+ cwd: command.cwd,
94
+ });
95
+ child.unref();
96
+ } finally {
97
+ if (logFile) {
98
+ closeSync(logFile.fd);
99
+ }
100
+ }
101
+ }
102
+
103
+ export function prewarmDetachedHubServer(
104
+ workspaceRoot: string,
105
+ endpoint: HubEndpointOverrides = {},
106
+ ): void {
107
+ const owner = resolveSharedHubOwnerContext();
108
+ const resolvedEndpoint = resolveHubEndpointOptions(endpoint);
109
+ const expectedUrl = createHubServerUrl(
110
+ resolvedEndpoint.host,
111
+ resolvedEndpoint.port,
112
+ resolvedEndpoint.pathname,
113
+ );
114
+ void readHubDiscovery(owner.discoveryPath)
115
+ .then(async (discovered) => {
116
+ if (discovered?.url) {
117
+ const healthy = await probeHubServer(discovered.url);
118
+ if (healthy?.url && (await verifyHubConnection(healthy.url))) {
119
+ return;
120
+ }
121
+ }
122
+ const expected = await probeHubServer(expectedUrl);
123
+ if (expected?.url && (await verifyHubConnection(expected.url))) {
124
+ await writeHubDiscovery(owner.discoveryPath, expected);
125
+ return;
126
+ }
127
+ const spawnEndpoint =
128
+ expected?.url && resolvedEndpoint.port !== 0
129
+ ? { ...resolvedEndpoint, port: 0 }
130
+ : resolvedEndpoint;
131
+ spawnDetachedHubServer(workspaceRoot, spawnEndpoint);
132
+ })
133
+ .catch(() => {
134
+ // best-effort prewarm only
135
+ });
136
+ }
137
+
138
+ export async function ensureDetachedHubServer(
139
+ workspaceRoot: string,
140
+ endpointOverrides: HubEndpointOverrides = {},
141
+ ): Promise<string> {
142
+ const owner = resolveSharedHubOwnerContext();
143
+ const endpoint = resolveHubEndpointOptions(endpointOverrides);
144
+ const expectedUrl = createHubServerUrl(
145
+ endpoint.host,
146
+ endpoint.port,
147
+ endpoint.pathname,
148
+ );
149
+ const discovered = await readHubDiscovery(owner.discoveryPath);
150
+ if (discovered?.url) {
151
+ const healthy = await probeHubServer(discovered.url);
152
+ if (healthy?.url && (await verifyHubConnection(healthy.url))) {
153
+ return healthy.url;
154
+ }
155
+ }
156
+ const expected = await probeHubServer(expectedUrl);
157
+ if (expected?.url && (await verifyHubConnection(expected.url))) {
158
+ await writeHubDiscovery(owner.discoveryPath, expected);
159
+ return expected.url;
160
+ }
161
+ const spawnEndpoint =
162
+ expected?.url && endpoint.port !== 0 ? { ...endpoint, port: 0 } : endpoint;
163
+ spawnDetachedHubServer(workspaceRoot, spawnEndpoint);
164
+ const deadline = Date.now() + HUB_STARTUP_TIMEOUT_MS;
165
+ while (Date.now() < deadline) {
166
+ const nextDiscovery = await readHubDiscovery(owner.discoveryPath);
167
+ if (nextDiscovery?.url) {
168
+ const healthy = await probeHubServer(nextDiscovery.url);
169
+ if (healthy?.url && (await verifyHubConnection(healthy.url))) {
170
+ return healthy.url;
171
+ }
172
+ }
173
+ const nextExpected = await probeHubServer(expectedUrl);
174
+ if (nextExpected?.url && (await verifyHubConnection(nextExpected.url))) {
175
+ await writeHubDiscovery(owner.discoveryPath, nextExpected);
176
+ return nextExpected.url;
177
+ }
178
+ await new Promise((resolve) => setTimeout(resolve, HUB_STARTUP_POLL_MS));
179
+ }
180
+ throw new Error("Timed out waiting for detached hub startup.");
181
+ }
@@ -0,0 +1,43 @@
1
+ const HUB_HOST_ENV = "CLINE_HUB_HOST";
2
+ const HUB_PORT_ENV = "CLINE_HUB_PORT";
3
+ const HUB_PATHNAME_ENV = "CLINE_HUB_PATHNAME";
4
+
5
+ export const DEFAULT_HUB_HOST = "127.0.0.1";
6
+ export const DEFAULT_HUB_PORT = 25463;
7
+ export const DEFAULT_HUB_PATHNAME = "/hub";
8
+
9
+ export interface HubEndpointOverrides {
10
+ host?: string;
11
+ port?: number;
12
+ pathname?: string;
13
+ }
14
+
15
+ export function resolveDefaultHubHost(): string {
16
+ return process.env[HUB_HOST_ENV]?.trim() || DEFAULT_HUB_HOST;
17
+ }
18
+
19
+ export function resolveDefaultHubPort(): number {
20
+ const raw = process.env[HUB_PORT_ENV]?.trim();
21
+ if (!raw) {
22
+ return DEFAULT_HUB_PORT;
23
+ }
24
+ const port = Number.parseInt(raw, 10);
25
+ if (!Number.isInteger(port) || port < 1 || port > 65_535) {
26
+ return DEFAULT_HUB_PORT;
27
+ }
28
+ return port;
29
+ }
30
+
31
+ export function resolveDefaultHubPathname(): string {
32
+ return process.env[HUB_PATHNAME_ENV]?.trim() || DEFAULT_HUB_PATHNAME;
33
+ }
34
+
35
+ export function resolveHubEndpointOptions(
36
+ overrides: HubEndpointOverrides = {},
37
+ ): Required<HubEndpointOverrides> {
38
+ return {
39
+ host: overrides.host ?? resolveDefaultHubHost(),
40
+ port: overrides.port ?? resolveDefaultHubPort(),
41
+ pathname: overrides.pathname ?? resolveDefaultHubPathname(),
42
+ };
43
+ }
@@ -0,0 +1,247 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
4
+ import { dirname, join } from "node:path";
5
+ import { resolveClineDataDir, resolveClineDir } from "@clinebot/shared/storage";
6
+ import corePackage from "../../package.json";
7
+
8
+ const HUB_DISCOVERY_ENV = "CLINE_HUB_DISCOVERY_PATH";
9
+ const HUB_BUILD_ID_ENV = "CLINE_HUB_BUILD_ID";
10
+ const HUB_STARTUP_LOCK_MAX_AGE_MS = 30_000;
11
+ const HUB_STARTUP_LOCK_WAIT_MS = 15_000;
12
+ const HUB_STARTUP_LOCK_POLL_MS = 100;
13
+
14
+ export interface HubServerDiscoveryRecord {
15
+ hubId: string;
16
+ protocolVersion: string;
17
+ buildId?: string;
18
+ host: string;
19
+ port: number;
20
+ url: string;
21
+ pid?: number;
22
+ startedAt: string;
23
+ updatedAt: string;
24
+ }
25
+
26
+ export interface HubOwnerContext {
27
+ ownerId: string;
28
+ discoveryPath: string;
29
+ }
30
+
31
+ function sanitizeKey(value: string): string {
32
+ return value.replace(/[^a-zA-Z0-9_.-]+/g, "_");
33
+ }
34
+
35
+ function hashValue(value: string): string {
36
+ return createHash("sha256").update(value).digest("hex").slice(0, 12);
37
+ }
38
+
39
+ function isPidAlive(pid: number | undefined): boolean {
40
+ if (!Number.isInteger(pid) || !pid || pid <= 0) {
41
+ return false;
42
+ }
43
+ try {
44
+ process.kill(pid, 0);
45
+ return true;
46
+ } catch (error) {
47
+ return error instanceof Error && "code" in error
48
+ ? String((error as NodeJS.ErrnoException).code) === "EPERM"
49
+ : false;
50
+ }
51
+ }
52
+
53
+ function sleep(ms: number): Promise<void> {
54
+ return new Promise((resolve) => setTimeout(resolve, ms));
55
+ }
56
+
57
+ function getStartupLockDir(discoveryPath: string): string {
58
+ return `${discoveryPath}.lock`;
59
+ }
60
+
61
+ async function readStartupLockRecord(
62
+ lockDir: string,
63
+ ): Promise<{ pid: number; acquiredAt: string } | undefined> {
64
+ try {
65
+ const parsed = JSON.parse(
66
+ await readFile(join(lockDir, "owner.json"), "utf8"),
67
+ ) as Partial<{ pid: number; acquiredAt: string }>;
68
+ if (
69
+ typeof parsed.pid !== "number" ||
70
+ typeof parsed.acquiredAt !== "string"
71
+ ) {
72
+ return undefined;
73
+ }
74
+ return { pid: parsed.pid, acquiredAt: parsed.acquiredAt };
75
+ } catch {
76
+ return undefined;
77
+ }
78
+ }
79
+
80
+ async function removeStartupLock(lockDir: string): Promise<void> {
81
+ await rm(lockDir, { recursive: true, force: true }).catch(() => undefined);
82
+ }
83
+
84
+ export function resolveHubBuildId(): string {
85
+ return process.env[HUB_BUILD_ID_ENV]?.trim() || String(corePackage.version);
86
+ }
87
+
88
+ export function resolveHubOwnerContext(
89
+ ownerBasis: string = process.argv[1]?.trim() || process.cwd(),
90
+ ): HubOwnerContext {
91
+ const ownerId = `hub-${hashValue(ownerBasis)}`;
92
+ const discoveryPath =
93
+ process.env[HUB_DISCOVERY_ENV]?.trim() ||
94
+ join(
95
+ resolveClineDataDir(),
96
+ "locks",
97
+ "hub",
98
+ "owners",
99
+ `${sanitizeKey(ownerId)}.json`,
100
+ );
101
+ return { ownerId, discoveryPath };
102
+ }
103
+
104
+ export function createInMemoryHubOwnerContext(
105
+ label = `hub-${Date.now().toString(36)}`,
106
+ ): HubOwnerContext {
107
+ return resolveHubOwnerContext(label);
108
+ }
109
+
110
+ export async function readHubDiscovery(
111
+ discoveryPath: string,
112
+ ): Promise<HubServerDiscoveryRecord | undefined> {
113
+ try {
114
+ const parsed = JSON.parse(
115
+ await readFile(discoveryPath, "utf8"),
116
+ ) as Partial<HubServerDiscoveryRecord>;
117
+ if (
118
+ typeof parsed.hubId !== "string" ||
119
+ typeof parsed.protocolVersion !== "string" ||
120
+ typeof parsed.host !== "string" ||
121
+ typeof parsed.port !== "number" ||
122
+ typeof parsed.url !== "string" ||
123
+ typeof parsed.startedAt !== "string" ||
124
+ typeof parsed.updatedAt !== "string"
125
+ ) {
126
+ return undefined;
127
+ }
128
+ return {
129
+ hubId: parsed.hubId,
130
+ protocolVersion: parsed.protocolVersion,
131
+ buildId: typeof parsed.buildId === "string" ? parsed.buildId : undefined,
132
+ host: parsed.host,
133
+ port: parsed.port,
134
+ url: parsed.url,
135
+ pid: typeof parsed.pid === "number" ? parsed.pid : undefined,
136
+ startedAt: parsed.startedAt,
137
+ updatedAt: parsed.updatedAt,
138
+ };
139
+ } catch {
140
+ return undefined;
141
+ }
142
+ }
143
+
144
+ export async function writeHubDiscovery(
145
+ discoveryPath: string,
146
+ record: HubServerDiscoveryRecord,
147
+ ): Promise<void> {
148
+ await mkdir(dirname(discoveryPath), { recursive: true });
149
+ await writeFile(
150
+ discoveryPath,
151
+ `${JSON.stringify(record, null, 2)}\n`,
152
+ "utf8",
153
+ );
154
+ }
155
+
156
+ export async function clearHubDiscovery(discoveryPath: string): Promise<void> {
157
+ await rm(discoveryPath, { force: true }).catch(() => undefined);
158
+ }
159
+
160
+ export async function withHubStartupLock<T>(
161
+ discoveryPath: string,
162
+ callback: () => Promise<T>,
163
+ ): Promise<T> {
164
+ const lockDir = getStartupLockDir(discoveryPath);
165
+ await mkdir(dirname(lockDir), { recursive: true });
166
+ const deadline = Date.now() + HUB_STARTUP_LOCK_WAIT_MS;
167
+
168
+ while (true) {
169
+ try {
170
+ await mkdir(lockDir, { recursive: false });
171
+ await writeFile(
172
+ join(lockDir, "owner.json"),
173
+ `${JSON.stringify(
174
+ { pid: process.pid, acquiredAt: new Date().toISOString() },
175
+ null,
176
+ 2,
177
+ )}\n`,
178
+ "utf8",
179
+ );
180
+ try {
181
+ return await callback();
182
+ } finally {
183
+ await removeStartupLock(lockDir);
184
+ }
185
+ } catch (error) {
186
+ const code =
187
+ error instanceof Error && "code" in error
188
+ ? String((error as NodeJS.ErrnoException).code)
189
+ : "";
190
+ if (code !== "EEXIST") {
191
+ throw error;
192
+ }
193
+ const record = await readStartupLockRecord(lockDir);
194
+ const lockAge = record
195
+ ? Date.now() - Date.parse(record.acquiredAt)
196
+ : HUB_STARTUP_LOCK_MAX_AGE_MS + 1;
197
+ if (
198
+ !record ||
199
+ !isPidAlive(record.pid) ||
200
+ lockAge > HUB_STARTUP_LOCK_MAX_AGE_MS
201
+ ) {
202
+ await removeStartupLock(lockDir);
203
+ continue;
204
+ }
205
+ if (Date.now() >= deadline) {
206
+ throw new Error(`Timed out waiting for hub startup lock ${lockDir}`);
207
+ }
208
+ await sleep(HUB_STARTUP_LOCK_POLL_MS);
209
+ }
210
+ }
211
+ }
212
+
213
+ export async function probeHubServer(
214
+ url: string,
215
+ ): Promise<HubServerDiscoveryRecord | undefined> {
216
+ try {
217
+ const response = await fetch(toHubHealthUrl(url));
218
+ if (!response.ok) {
219
+ return undefined;
220
+ }
221
+ return (await response.json()) as HubServerDiscoveryRecord;
222
+ } catch {
223
+ return undefined;
224
+ }
225
+ }
226
+
227
+ export function createHubServerUrl(
228
+ host: string,
229
+ port: number,
230
+ pathname = "/hub",
231
+ ): string {
232
+ return new URL(`ws://${host}:${port}${pathname}`).toString();
233
+ }
234
+
235
+ export function toHubHealthUrl(wsUrl: string): string {
236
+ const parsed = new URL(wsUrl);
237
+ parsed.protocol = parsed.protocol === "wss:" ? "https:" : "http:";
238
+ parsed.pathname = "/health";
239
+ parsed.search = "";
240
+ return parsed.toString();
241
+ }
242
+
243
+ export function isDiscoveryFilePresent(pathname: string): boolean {
244
+ return existsSync(pathname);
245
+ }
246
+
247
+ export { resolveClineDataDir, resolveClineDir };
@@ -0,0 +1,14 @@
1
+ export * from "./browser-websocket";
2
+ export * from "./client";
3
+ export * from "./connect";
4
+ export * from "./daemon";
5
+ export * from "./defaults";
6
+ export * from "./discovery";
7
+ export * from "./native-transport";
8
+ export * from "./runtime-handlers";
9
+ export * from "./server";
10
+ export * from "./session-client";
11
+ export * from "./start-shared-server";
12
+ export * from "./transport";
13
+ export * from "./ui-client";
14
+ export * from "./workspace";
@@ -0,0 +1,31 @@
1
+ import type {
2
+ HubCommandEnvelope,
3
+ HubEventEnvelope,
4
+ HubReplyEnvelope,
5
+ } from "@clinebot/shared";
6
+ import type { HubCommandTransport } from "./transport";
7
+
8
+ export interface NativeHubTransport {
9
+ handleCommand(envelope: HubCommandEnvelope): Promise<HubReplyEnvelope>;
10
+ subscribe(
11
+ clientId: string,
12
+ listener: (event: HubEventEnvelope) => void,
13
+ options?: { sessionId?: string },
14
+ ): () => void;
15
+ }
16
+
17
+ export class NativeHubTransportAdapter implements HubCommandTransport {
18
+ constructor(private readonly transport: NativeHubTransport) {}
19
+
20
+ command(envelope: HubCommandEnvelope): Promise<HubReplyEnvelope> {
21
+ return this.transport.handleCommand(envelope);
22
+ }
23
+
24
+ subscribe(
25
+ clientId: string,
26
+ listener: (event: HubEventEnvelope) => void,
27
+ options?: { sessionId?: string },
28
+ ): () => void {
29
+ return this.transport.subscribe(clientId, listener, options);
30
+ }
31
+ }