@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,502 @@
1
+ import type * as LlmsProviders from "@clinebot/llms";
2
+ import type {
3
+ ChatRunTurnRequest,
4
+ ChatStartSessionRequest,
5
+ ChatStartSessionResponse,
6
+ ChatTurnResult,
7
+ HubEventEnvelope,
8
+ TeamProgressProjectionEvent,
9
+ } from "@clinebot/shared";
10
+ import { NodeHubClient } from "./client";
11
+
12
+ export interface HubSessionClientOptions {
13
+ address: string;
14
+ clientId?: string;
15
+ clientType?: string;
16
+ displayName?: string;
17
+ workspaceRoot?: string;
18
+ cwd?: string;
19
+ metadata?: Record<string, unknown>;
20
+ }
21
+
22
+ export interface HubSessionRow {
23
+ sessionId: string;
24
+ parentSessionId?: string;
25
+ metadata?: Record<string, unknown>;
26
+ messagesPath?: string;
27
+ }
28
+
29
+ export interface HubStreamEvent {
30
+ sessionId: string;
31
+ eventType: string;
32
+ payload: Record<string, unknown>;
33
+ }
34
+
35
+ export interface HubEventStreamHandlers {
36
+ onEvent?: (event: HubStreamEvent) => void;
37
+ onError?: (error: Error) => void;
38
+ }
39
+
40
+ export interface HubTeamProgressHandlers {
41
+ onProjection?: (event: TeamProgressProjectionEvent) => void;
42
+ onError?: (error: Error) => void;
43
+ }
44
+
45
+ function cloneRecord(
46
+ value: Record<string, unknown> | undefined,
47
+ ): Record<string, unknown> {
48
+ return value ? JSON.parse(JSON.stringify(value)) : {};
49
+ }
50
+
51
+ function extractSessionRow(
52
+ payload: Record<string, unknown> | undefined,
53
+ ): HubSessionRow | undefined {
54
+ const session =
55
+ payload?.session && typeof payload.session === "object"
56
+ ? (payload.session as Record<string, unknown>)
57
+ : undefined;
58
+ if (!session) {
59
+ return undefined;
60
+ }
61
+ const metadata =
62
+ session.metadata && typeof session.metadata === "object"
63
+ ? cloneRecord(session.metadata as Record<string, unknown>)
64
+ : undefined;
65
+ return {
66
+ sessionId: typeof session.sessionId === "string" ? session.sessionId : "",
67
+ parentSessionId:
68
+ typeof metadata?.parentSessionId === "string"
69
+ ? metadata.parentSessionId
70
+ : undefined,
71
+ messagesPath:
72
+ typeof metadata?.messagesPath === "string"
73
+ ? metadata.messagesPath
74
+ : undefined,
75
+ metadata,
76
+ };
77
+ }
78
+
79
+ function hubReplyErrorMessage(
80
+ reply: { error?: { message?: string } },
81
+ command: string,
82
+ ): string {
83
+ return reply.error?.message ?? `hub command failed: ${command}`;
84
+ }
85
+
86
+ function mapHubEvent(event: HubEventEnvelope): HubStreamEvent | undefined {
87
+ const sessionId = event.sessionId?.trim();
88
+ if (!sessionId) {
89
+ return undefined;
90
+ }
91
+ switch (event.event) {
92
+ case "iteration.started":
93
+ return {
94
+ sessionId,
95
+ eventType: "runtime.chat.iteration_start",
96
+ payload: cloneRecord(event.payload),
97
+ };
98
+ case "iteration.finished":
99
+ return {
100
+ sessionId,
101
+ eventType: "runtime.chat.iteration_end",
102
+ payload: cloneRecord(event.payload),
103
+ };
104
+ case "assistant.delta":
105
+ return {
106
+ sessionId,
107
+ eventType: "runtime.chat.text_delta",
108
+ payload: cloneRecord(event.payload),
109
+ };
110
+ case "tool.started":
111
+ return {
112
+ sessionId,
113
+ eventType: "runtime.chat.tool_call_start",
114
+ payload: cloneRecord(event.payload),
115
+ };
116
+ case "tool.finished":
117
+ return {
118
+ sessionId,
119
+ eventType: "runtime.chat.tool_call_end",
120
+ payload: cloneRecord(event.payload),
121
+ };
122
+ case "approval.requested":
123
+ return {
124
+ sessionId,
125
+ eventType: "approval.requested",
126
+ payload: cloneRecord(event.payload),
127
+ };
128
+ case "run.aborted":
129
+ return {
130
+ sessionId,
131
+ eventType: "runtime.chat.aborted",
132
+ payload: cloneRecord(event.payload),
133
+ };
134
+ case "run.completed":
135
+ return {
136
+ sessionId,
137
+ eventType: "runtime.chat.completed",
138
+ payload: cloneRecord(event.payload),
139
+ };
140
+ default:
141
+ return undefined;
142
+ }
143
+ }
144
+
145
+ export class HubSessionClient {
146
+ private readonly client: NodeHubClient;
147
+ private metadataApplied = false;
148
+
149
+ constructor(private readonly options: HubSessionClientOptions) {
150
+ this.client = new NodeHubClient({
151
+ url: options.address,
152
+ clientId: options.clientId,
153
+ clientType: options.clientType ?? "hub-session-client",
154
+ displayName: options.displayName ?? "hub session client",
155
+ workspaceRoot: options.workspaceRoot,
156
+ cwd: options.cwd,
157
+ });
158
+ }
159
+
160
+ private async ensureMetadataApplied(): Promise<void> {
161
+ if (this.metadataApplied || !this.options.metadata) {
162
+ if (!this.options.metadata) {
163
+ await this.client.connect();
164
+ }
165
+ return;
166
+ }
167
+ await this.client.connect();
168
+ await this.client.command("client.update", {
169
+ metadata: this.options.metadata,
170
+ });
171
+ this.metadataApplied = true;
172
+ }
173
+
174
+ async connect(): Promise<void> {
175
+ await this.ensureMetadataApplied();
176
+ }
177
+
178
+ close(): void {
179
+ this.client.close();
180
+ }
181
+
182
+ async dispose(): Promise<void> {
183
+ await this.client.dispose();
184
+ }
185
+
186
+ async startRuntimeSession(
187
+ request: ChatStartSessionRequest,
188
+ ): Promise<ChatStartSessionResponse> {
189
+ await this.ensureMetadataApplied();
190
+ const reply = await this.client.command("session.create", {
191
+ workspaceRoot: request.workspaceRoot,
192
+ cwd: request.cwd,
193
+ sessionConfig: {
194
+ providerId: request.provider,
195
+ modelId: request.model,
196
+ apiKey: request.apiKey,
197
+ cwd: request.cwd ?? request.workspaceRoot,
198
+ workspaceRoot: request.workspaceRoot,
199
+ systemPrompt: request.systemPrompt ?? "",
200
+ mode: request.mode ?? "act",
201
+ rules: request.rules,
202
+ maxIterations: request.maxIterations,
203
+ enableTools: request.enableTools,
204
+ enableSpawnAgent: request.enableSpawn !== false,
205
+ enableAgentTeams: request.enableTeams !== false,
206
+ disableMcpSettingsTools: request.disableMcpSettingsTools,
207
+ missionLogIntervalSteps: request.missionStepInterval,
208
+ missionLogIntervalMs: request.missionTimeIntervalMs,
209
+ },
210
+ metadata: {
211
+ source: request.source ?? "cli",
212
+ provider: request.provider,
213
+ model: request.model,
214
+ enableTools: request.enableTools,
215
+ enableSpawn: request.enableSpawn,
216
+ enableTeams: request.enableTeams,
217
+ prompt: undefined,
218
+ interactive: request.interactive !== false,
219
+ },
220
+ runtimeOptions: {
221
+ mode: request.mode,
222
+ systemPrompt: request.systemPrompt,
223
+ maxIterations: request.maxIterations,
224
+ enableTools: request.enableTools,
225
+ enableSpawn: request.enableSpawn,
226
+ enableTeams: request.enableTeams,
227
+ autoApproveTools: request.autoApproveTools,
228
+ configExtensions: request.configExtensions,
229
+ },
230
+ modelSelection: {
231
+ provider: request.provider,
232
+ model: request.model,
233
+ apiKey: request.apiKey,
234
+ },
235
+ toolPolicies: request.toolPolicies,
236
+ });
237
+ const row = extractSessionRow(reply.payload);
238
+ if (!row?.sessionId) {
239
+ throw new Error("hub session create returned no session id");
240
+ }
241
+ return {
242
+ sessionId: row.sessionId,
243
+ startResult: {
244
+ sessionId: row.sessionId,
245
+ manifestPath: "",
246
+ messagesPath: row.messagesPath ?? "",
247
+ },
248
+ };
249
+ }
250
+
251
+ async sendRuntimeSession(
252
+ sessionId: string,
253
+ request: ChatRunTurnRequest,
254
+ ): Promise<{ result?: ChatTurnResult }> {
255
+ await this.ensureMetadataApplied();
256
+ const reply = await this.client.command(
257
+ "session.send_input",
258
+ {
259
+ prompt: request.prompt,
260
+ attachments: request.attachments,
261
+ delivery: request.delivery,
262
+ },
263
+ sessionId,
264
+ );
265
+ return {
266
+ result: reply.payload?.result as ChatTurnResult | undefined,
267
+ };
268
+ }
269
+
270
+ async stopRuntimeSession(sessionId: string): Promise<{ applied: boolean }> {
271
+ await this.ensureMetadataApplied();
272
+ await this.client.command("session.detach", { sessionId }, sessionId);
273
+ return { applied: true };
274
+ }
275
+
276
+ async abortRuntimeSession(sessionId: string): Promise<{ applied: boolean }> {
277
+ await this.ensureMetadataApplied();
278
+ await this.client.command("run.abort", { sessionId }, sessionId);
279
+ return { applied: true };
280
+ }
281
+
282
+ async updateSession(input: {
283
+ sessionId: string;
284
+ metadata?: Record<string, unknown>;
285
+ }): Promise<{ updated: boolean }> {
286
+ await this.ensureMetadataApplied();
287
+ await this.client.command(
288
+ "session.update",
289
+ {
290
+ sessionId: input.sessionId,
291
+ metadata: input.metadata,
292
+ },
293
+ input.sessionId,
294
+ );
295
+ return { updated: true };
296
+ }
297
+
298
+ async getSession(sessionId: string): Promise<HubSessionRow | undefined> {
299
+ await this.ensureMetadataApplied();
300
+ const reply = await this.client.command(
301
+ "session.get",
302
+ undefined,
303
+ sessionId,
304
+ );
305
+ return extractSessionRow(reply.payload);
306
+ }
307
+
308
+ async readMessages(sessionId: string): Promise<LlmsProviders.Message[]> {
309
+ const target = sessionId.trim();
310
+ if (!target) {
311
+ return [];
312
+ }
313
+ await this.ensureMetadataApplied();
314
+ const reply = await this.client.command(
315
+ "session.messages",
316
+ { sessionId: target },
317
+ target,
318
+ );
319
+ if (!reply.ok) {
320
+ throw new Error(hubReplyErrorMessage(reply, "session.messages"));
321
+ }
322
+ const messages = reply.payload?.messages;
323
+ return Array.isArray(messages) ? (messages as LlmsProviders.Message[]) : [];
324
+ }
325
+
326
+ async listSessions(input?: { limit?: number }): Promise<HubSessionRow[]> {
327
+ await this.ensureMetadataApplied();
328
+ const reply = await this.client.command("session.list", {
329
+ limit: input?.limit ?? 200,
330
+ });
331
+ const sessions = Array.isArray(reply.payload?.sessions)
332
+ ? (reply.payload?.sessions as Record<string, unknown>[])
333
+ : [];
334
+ return sessions
335
+ .map((session) => extractSessionRow({ session }))
336
+ .filter((row): row is HubSessionRow => Boolean(row?.sessionId));
337
+ }
338
+
339
+ async deleteSession(
340
+ sessionId: string,
341
+ deleteCheckpointRefs = true,
342
+ ): Promise<boolean> {
343
+ await this.ensureMetadataApplied();
344
+ const reply = await this.client.command("session.delete", {
345
+ sessionId,
346
+ deleteCheckpointRefs,
347
+ });
348
+ return reply.payload?.deleted === true;
349
+ }
350
+
351
+ async respondToolApproval(input: {
352
+ approvalId: string;
353
+ approved: boolean;
354
+ reason?: string;
355
+ responderClientId?: string;
356
+ }): Promise<void> {
357
+ await this.ensureMetadataApplied();
358
+ await this.client.command("approval.respond", {
359
+ approvalId: input.approvalId,
360
+ approved: input.approved,
361
+ payload: input.reason ? { reason: input.reason } : undefined,
362
+ responderClientId: input.responderClientId,
363
+ });
364
+ }
365
+
366
+ streamEvents(
367
+ input: { clientId?: string; sessionIds?: string[] },
368
+ handlers: HubEventStreamHandlers,
369
+ ): () => void {
370
+ const allowed = new Set(
371
+ (input.sessionIds ?? []).map((id) => id.trim()).filter(Boolean),
372
+ );
373
+ const unsubscribe = this.client.subscribe((event: HubEventEnvelope) => {
374
+ const mapped = mapHubEvent(event);
375
+ if (!mapped) {
376
+ return;
377
+ }
378
+ if (allowed.size > 0 && !allowed.has(mapped.sessionId)) {
379
+ return;
380
+ }
381
+ handlers.onEvent?.(mapped);
382
+ });
383
+ void this.ensureMetadataApplied().catch((error) => {
384
+ handlers.onError?.(
385
+ error instanceof Error ? error : new Error(String(error)),
386
+ );
387
+ });
388
+ return unsubscribe;
389
+ }
390
+
391
+ streamTeamProgress(
392
+ _input: { clientId?: string },
393
+ handlers: HubTeamProgressHandlers,
394
+ ): () => void {
395
+ const unsubscribe = this.client.subscribe((event: HubEventEnvelope) => {
396
+ if (event.event !== "team.progress" || !event.payload) {
397
+ return;
398
+ }
399
+ handlers.onProjection?.(
400
+ event.payload as unknown as TeamProgressProjectionEvent,
401
+ );
402
+ });
403
+ void this.ensureMetadataApplied().catch((error) => {
404
+ handlers.onError?.(
405
+ error instanceof Error ? error : new Error(String(error)),
406
+ );
407
+ });
408
+ return unsubscribe;
409
+ }
410
+
411
+ async createSchedule(input: Record<string, unknown>): Promise<any> {
412
+ await this.ensureMetadataApplied();
413
+ const reply = await this.client.command("schedule.create", input);
414
+ return reply.payload?.schedule;
415
+ }
416
+
417
+ async listSchedules(_input?: { limit?: number }): Promise<any[]> {
418
+ await this.ensureMetadataApplied();
419
+ const reply = await this.client.command("schedule.list");
420
+ return Array.isArray(reply.payload?.schedules)
421
+ ? (reply.payload?.schedules as any[])
422
+ : [];
423
+ }
424
+
425
+ async getSchedule(scheduleId: string): Promise<any | undefined> {
426
+ await this.ensureMetadataApplied();
427
+ const reply = await this.client.command("schedule.get", { scheduleId });
428
+ return reply.payload?.schedule;
429
+ }
430
+
431
+ async updateSchedule(
432
+ scheduleId: string,
433
+ input: Record<string, unknown>,
434
+ ): Promise<any> {
435
+ await this.ensureMetadataApplied();
436
+ const reply = await this.client.command("schedule.update", {
437
+ scheduleId,
438
+ ...input,
439
+ });
440
+ return reply.payload?.schedule;
441
+ }
442
+
443
+ async pauseSchedule(scheduleId: string): Promise<any> {
444
+ await this.ensureMetadataApplied();
445
+ const reply = await this.client.command("schedule.disable", { scheduleId });
446
+ return reply.payload?.schedule;
447
+ }
448
+
449
+ async resumeSchedule(scheduleId: string): Promise<any> {
450
+ await this.ensureMetadataApplied();
451
+ const reply = await this.client.command("schedule.enable", { scheduleId });
452
+ return reply.payload?.schedule;
453
+ }
454
+
455
+ async deleteSchedule(scheduleId: string): Promise<boolean> {
456
+ await this.ensureMetadataApplied();
457
+ const reply = await this.client.command("schedule.delete", { scheduleId });
458
+ return reply.payload?.deleted === true;
459
+ }
460
+
461
+ async triggerScheduleNow(scheduleId: string): Promise<any> {
462
+ await this.ensureMetadataApplied();
463
+ const reply = await this.client.command("schedule.trigger", { scheduleId });
464
+ return reply.payload?.execution;
465
+ }
466
+
467
+ async listScheduleExecutions(
468
+ scheduleId: string,
469
+ limit?: number,
470
+ ): Promise<any[]> {
471
+ await this.ensureMetadataApplied();
472
+ const reply = await this.client.command("schedule.list_executions", {
473
+ scheduleId,
474
+ limit,
475
+ });
476
+ return Array.isArray(reply.payload?.executions)
477
+ ? (reply.payload?.executions as any[])
478
+ : [];
479
+ }
480
+
481
+ async getScheduleStats(): Promise<any> {
482
+ await this.ensureMetadataApplied();
483
+ const reply = await this.client.command("schedule.stats");
484
+ return reply.payload?.stats;
485
+ }
486
+
487
+ async getActiveScheduledExecutions(): Promise<any[]> {
488
+ await this.ensureMetadataApplied();
489
+ const reply = await this.client.command("schedule.active");
490
+ return Array.isArray(reply.payload?.executions)
491
+ ? (reply.payload?.executions as any[])
492
+ : [];
493
+ }
494
+
495
+ async getUpcomingScheduledRuns(limit?: number): Promise<any[]> {
496
+ await this.ensureMetadataApplied();
497
+ const reply = await this.client.command("schedule.upcoming", { limit });
498
+ return Array.isArray(reply.payload?.upcoming)
499
+ ? (reply.payload?.upcoming as any[])
500
+ : [];
501
+ }
502
+ }
@@ -0,0 +1,61 @@
1
+ import { resolveHubEndpointOptions } from "./defaults";
2
+ import {
3
+ type EnsuredHubWebSocketServerResult,
4
+ type EnsureHubWebSocketServerOptions,
5
+ ensureHubWebSocketServer,
6
+ type HubWebSocketServer,
7
+ type HubWebSocketServerOptions,
8
+ startHubWebSocketServer,
9
+ } from "./server";
10
+ import { resolveSharedHubOwnerContext } from "./workspace";
11
+
12
+ export type HubServer = HubWebSocketServer;
13
+ export type EnsureHubServerResult = EnsuredHubWebSocketServerResult;
14
+
15
+ export interface StartHubServerOptions
16
+ extends Omit<HubWebSocketServerOptions, "owner"> {}
17
+
18
+ export interface EnsureHubServerOptions
19
+ extends Omit<EnsureHubWebSocketServerOptions, "owner"> {}
20
+
21
+ /**
22
+ * Start a hub WebSocket server bound to the process-local shared owner
23
+ * context. Callers that need a custom owner should invoke
24
+ * {@link startHubWebSocketServer} directly.
25
+ */
26
+ export async function startHubServer(
27
+ options: StartHubServerOptions,
28
+ ): Promise<HubServer> {
29
+ const endpoint = resolveHubEndpointOptions({
30
+ host: options.host,
31
+ port: options.port,
32
+ pathname: options.pathname,
33
+ });
34
+ return await startHubWebSocketServer({
35
+ ...options,
36
+ ...endpoint,
37
+ owner: resolveSharedHubOwnerContext(),
38
+ });
39
+ }
40
+
41
+ /**
42
+ * Ensure a hub WebSocket server is running in the process-local shared owner
43
+ * context, reusing a compatible in-process instance when available.
44
+ */
45
+ export async function ensureHubServer(
46
+ options: EnsureHubServerOptions,
47
+ ): Promise<EnsureHubServerResult> {
48
+ const hasExplicitPort =
49
+ options.port !== undefined || !!process.env.CLINE_HUB_PORT?.trim();
50
+ const endpoint = resolveHubEndpointOptions({
51
+ host: options.host,
52
+ port: options.port,
53
+ pathname: options.pathname,
54
+ });
55
+ return await ensureHubWebSocketServer({
56
+ ...options,
57
+ ...endpoint,
58
+ allowPortFallback: options.allowPortFallback ?? !hasExplicitPort,
59
+ owner: resolveSharedHubOwnerContext(),
60
+ });
61
+ }
@@ -0,0 +1,14 @@
1
+ import type {
2
+ HubCommandEnvelope,
3
+ HubEventEnvelope,
4
+ HubReplyEnvelope,
5
+ } from "@clinebot/shared";
6
+
7
+ export interface HubCommandTransport {
8
+ command(envelope: HubCommandEnvelope): Promise<HubReplyEnvelope>;
9
+ subscribe(
10
+ clientId: string,
11
+ listener: (event: HubEventEnvelope) => void,
12
+ options?: { sessionId?: string },
13
+ ): Promise<() => void> | (() => void);
14
+ }
@@ -0,0 +1,126 @@
1
+ import type {
2
+ HubClientRecord,
3
+ HubEventEnvelope,
4
+ HubUINotifyPayload,
5
+ HubUIShowWindowPayload,
6
+ SessionRecord,
7
+ } from "@clinebot/shared";
8
+ import { NodeHubClient } from "./client";
9
+
10
+ export interface HubUIClientOptions {
11
+ address: string;
12
+ clientId?: string;
13
+ clientType?: string;
14
+ displayName?: string;
15
+ }
16
+
17
+ /**
18
+ * A lightweight hub client for UI/notification concerns.
19
+ * Used by the menu bar app and other UI clients to send/receive
20
+ * UI events (notifications, show window, client tracking).
21
+ */
22
+ export class HubUIClient {
23
+ private readonly client: NodeHubClient;
24
+
25
+ constructor(options: HubUIClientOptions) {
26
+ this.client = new NodeHubClient({
27
+ url: options.address,
28
+ clientId: options.clientId,
29
+ clientType: options.clientType ?? "hub-ui-client",
30
+ displayName: options.displayName ?? "hub ui client",
31
+ });
32
+ }
33
+
34
+ async connect(): Promise<void> {
35
+ await this.client.connect();
36
+ }
37
+
38
+ close(): void {
39
+ this.client.close();
40
+ }
41
+
42
+ async dispose(): Promise<void> {
43
+ await this.client.dispose();
44
+ }
45
+
46
+ getClientId(): string {
47
+ return this.client.getClientId();
48
+ }
49
+
50
+ /**
51
+ * Send a notification request to the hub.
52
+ * The hub will broadcast a "ui.notify" event to all subscribers (e.g. the menu bar app).
53
+ */
54
+ async sendNotify(payload: HubUINotifyPayload): Promise<void> {
55
+ await this.client.command(
56
+ "ui.notify",
57
+ payload as unknown as Record<string, unknown>,
58
+ );
59
+ }
60
+
61
+ /**
62
+ * Request the hub to broadcast a "ui.show_window" event to all subscribers.
63
+ */
64
+ async sendShowWindow(payload?: HubUIShowWindowPayload): Promise<void> {
65
+ await this.client.command(
66
+ "ui.show_window",
67
+ (payload ?? {}) as Record<string, unknown>,
68
+ );
69
+ }
70
+
71
+ async listClients(): Promise<HubClientRecord[]> {
72
+ const reply = await this.client.command("client.list");
73
+ return Array.isArray(reply.payload?.clients)
74
+ ? (reply.payload.clients as HubClientRecord[])
75
+ : [];
76
+ }
77
+
78
+ async listSessions(limit = 200): Promise<SessionRecord[]> {
79
+ const reply = await this.client.command("session.list", { limit });
80
+ return Array.isArray(reply.payload?.sessions)
81
+ ? (reply.payload.sessions as SessionRecord[])
82
+ : [];
83
+ }
84
+
85
+ /**
86
+ * Subscribe to UI-relevant hub events.
87
+ * Returns an unsubscribe function.
88
+ */
89
+ subscribeUI(handlers: {
90
+ onNotify?: (payload: HubUINotifyPayload) => void;
91
+ onShowWindow?: (payload: HubUIShowWindowPayload) => void;
92
+ onClientRegistered?: (payload: Record<string, unknown>) => void;
93
+ onClientDisconnected?: (payload: Record<string, unknown>) => void;
94
+ onSessionCreated?: (payload: Record<string, unknown>) => void;
95
+ onSessionUpdated?: (payload: Record<string, unknown>) => void;
96
+ onSessionDetached?: (payload: Record<string, unknown>) => void;
97
+ }): () => void {
98
+ return this.client.subscribe((event: HubEventEnvelope) => {
99
+ switch (event.event) {
100
+ case "ui.notify":
101
+ handlers.onNotify?.(event.payload as unknown as HubUINotifyPayload);
102
+ break;
103
+ case "ui.show_window":
104
+ handlers.onShowWindow?.(
105
+ event.payload as unknown as HubUIShowWindowPayload,
106
+ );
107
+ break;
108
+ case "hub.client.registered":
109
+ handlers.onClientRegistered?.(event.payload ?? {});
110
+ break;
111
+ case "hub.client.disconnected":
112
+ handlers.onClientDisconnected?.(event.payload ?? {});
113
+ break;
114
+ case "session.created":
115
+ handlers.onSessionCreated?.(event.payload ?? {});
116
+ break;
117
+ case "session.updated":
118
+ handlers.onSessionUpdated?.(event.payload ?? {});
119
+ break;
120
+ case "session.detached":
121
+ handlers.onSessionDetached?.(event.payload ?? {});
122
+ break;
123
+ }
124
+ });
125
+ }
126
+ }