@clinebot/core 0.0.33 → 0.0.35

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 (412) hide show
  1. package/README.md +12 -8
  2. package/dist/ClineCore.d.ts +48 -29
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/auth/client.d.ts +19 -0
  5. package/dist/auth/client.d.ts.map +1 -1
  6. package/dist/auth/cline.d.ts.map +1 -1
  7. package/dist/auth/oca.d.ts.map +1 -1
  8. package/dist/auth/server.d.ts +32 -0
  9. package/dist/auth/server.d.ts.map +1 -1
  10. package/dist/auth/types.d.ts +29 -0
  11. package/dist/auth/types.d.ts.map +1 -1
  12. package/dist/extensions/config/agent-config-loader.d.ts +2 -2
  13. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  14. package/dist/extensions/config/agent-config-parser.d.ts +1 -1
  15. package/dist/extensions/config/agent-config-parser.d.ts.map +1 -1
  16. package/dist/extensions/config/hooks-config-loader.d.ts +2 -2
  17. package/dist/extensions/config/hooks-config-loader.d.ts.map +1 -1
  18. package/dist/extensions/config/index.d.ts +3 -3
  19. package/dist/extensions/config/index.d.ts.map +1 -1
  20. package/dist/extensions/config/user-instruction-config-loader.d.ts +2 -2
  21. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  22. package/dist/extensions/index.d.ts +2 -1
  23. package/dist/extensions/index.d.ts.map +1 -1
  24. package/dist/extensions/plugin/plugin-config-loader.d.ts +2 -1
  25. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  26. package/dist/extensions/plugin/plugin-load-report.d.ts +19 -0
  27. package/dist/extensions/plugin/plugin-load-report.d.ts.map +1 -0
  28. package/dist/extensions/plugin/plugin-loader.d.ts +6 -0
  29. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  30. package/dist/extensions/plugin/plugin-sandbox.d.ts +2 -1
  31. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  32. package/dist/extensions/plugin-sandbox-bootstrap.js +242 -242
  33. package/dist/extensions/tools/constants.d.ts.map +1 -0
  34. package/dist/extensions/tools/definitions.d.ts.map +1 -0
  35. package/dist/extensions/tools/executors/apply-patch-parser.d.ts.map +1 -0
  36. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -0
  37. package/dist/extensions/tools/executors/bash.d.ts.map +1 -0
  38. package/dist/extensions/tools/executors/editor.d.ts.map +1 -0
  39. package/dist/extensions/tools/executors/file-read.d.ts.map +1 -0
  40. package/dist/extensions/tools/executors/index.d.ts.map +1 -0
  41. package/dist/extensions/tools/executors/search.d.ts.map +1 -0
  42. package/dist/extensions/tools/executors/web-fetch.d.ts.map +1 -0
  43. package/dist/extensions/tools/helpers.d.ts.map +1 -0
  44. package/dist/extensions/tools/index.d.ts.map +1 -0
  45. package/dist/{tools → extensions/tools}/model-tool-routing.d.ts +1 -1
  46. package/dist/extensions/tools/model-tool-routing.d.ts.map +1 -0
  47. package/dist/{tools → extensions/tools}/presets.d.ts +1 -2
  48. package/dist/extensions/tools/presets.d.ts.map +1 -0
  49. package/dist/extensions/tools/schemas.d.ts.map +1 -0
  50. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -0
  51. package/dist/extensions/tools/team/index.d.ts.map +1 -0
  52. package/dist/{team → extensions/tools/team}/multi-agent.d.ts +1 -3
  53. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -0
  54. package/dist/extensions/tools/team/projections.d.ts.map +1 -0
  55. package/dist/extensions/tools/team/runtime.d.ts.map +1 -0
  56. package/dist/{team → extensions/tools/team}/spawn-agent-tool.d.ts +0 -1
  57. package/dist/extensions/tools/team/spawn-agent-tool.d.ts.map +1 -0
  58. package/dist/extensions/tools/team/subagent-prompts.d.ts.map +1 -0
  59. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -0
  60. package/dist/{tools → extensions/tools}/types.d.ts +4 -3
  61. package/dist/extensions/tools/types.d.ts.map +1 -0
  62. package/dist/{runtime → hooks}/checkpoint-hooks.d.ts +7 -0
  63. package/dist/hooks/checkpoint-hooks.d.ts.map +1 -0
  64. package/dist/{runtime → hooks}/hook-file-hooks.d.ts +0 -2
  65. package/dist/hooks/hook-file-hooks.d.ts.map +1 -0
  66. package/dist/hooks/subprocess.d.ts +3 -130
  67. package/dist/hooks/subprocess.d.ts.map +1 -1
  68. package/dist/index.d.ts +38 -35
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +386 -384
  71. package/dist/runtime/history.d.ts +4 -0
  72. package/dist/runtime/history.d.ts.map +1 -0
  73. package/dist/runtime/host.d.ts +9 -0
  74. package/dist/runtime/host.d.ts.map +1 -0
  75. package/dist/{session → runtime}/rpc-runtime-ensure.d.ts +13 -1
  76. package/dist/{session → runtime}/rpc-runtime-ensure.d.ts.map +1 -1
  77. package/dist/{session → runtime}/rpc-spawn-lease.d.ts.map +1 -1
  78. package/dist/runtime/runtime-builder.d.ts +1 -1
  79. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  80. package/dist/{session/session-manager.d.ts → runtime/runtime-host.d.ts} +55 -12
  81. package/dist/runtime/runtime-host.d.ts.map +1 -0
  82. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts +1 -1
  83. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts.map +1 -1
  84. package/dist/runtime/session-runtime.d.ts +2 -2
  85. package/dist/runtime/session-runtime.d.ts.map +1 -1
  86. package/dist/runtime/subprocess-sandbox.d.ts +2 -0
  87. package/dist/runtime/subprocess-sandbox.d.ts.map +1 -1
  88. package/dist/runtime/tool-approval.d.ts.map +1 -1
  89. package/dist/{session/session-agent-events.d.ts → services/agent-events.d.ts} +4 -4
  90. package/dist/services/agent-events.d.ts.map +1 -0
  91. package/dist/services/config.d.ts +3 -0
  92. package/dist/services/config.d.ts.map +1 -0
  93. package/dist/services/local-runtime-bootstrap.d.ts +41 -0
  94. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -0
  95. package/dist/services/providers/local-provider-registry.d.ts.map +1 -0
  96. package/dist/services/providers/local-provider-service.d.ts.map +1 -0
  97. package/dist/{session → services}/session-artifacts.d.ts +2 -4
  98. package/dist/services/session-artifacts.d.ts.map +1 -0
  99. package/dist/{session/utils/helpers.d.ts → services/session-data.d.ts} +19 -27
  100. package/dist/services/session-data.d.ts.map +1 -0
  101. package/dist/{session → services}/session-telemetry.d.ts +2 -2
  102. package/dist/services/session-telemetry.d.ts.map +1 -0
  103. package/dist/{storage → services/storage}/file-team-store.d.ts +2 -2
  104. package/dist/services/storage/file-team-store.d.ts.map +1 -0
  105. package/dist/{storage → services/storage}/provider-settings-legacy-migration.d.ts +1 -1
  106. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -0
  107. package/dist/{storage → services/storage}/provider-settings-manager.d.ts +1 -1
  108. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -0
  109. package/dist/{storage → services/storage}/sqlite-session-store.d.ts +3 -3
  110. package/dist/services/storage/sqlite-session-store.d.ts.map +1 -0
  111. package/dist/{storage → services/storage}/sqlite-team-store.d.ts +2 -2
  112. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -0
  113. package/dist/{storage → services/storage}/team-store.d.ts +1 -1
  114. package/dist/services/storage/team-store.d.ts.map +1 -0
  115. package/dist/services/telemetry/ITelemetryAdapter.d.ts.map +1 -0
  116. package/dist/services/telemetry/OpenTelemetryAdapter.d.ts.map +1 -0
  117. package/dist/services/telemetry/OpenTelemetryProvider.d.ts.map +1 -0
  118. package/dist/services/telemetry/TelemetryLoggerSink.d.ts.map +1 -0
  119. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -0
  120. package/dist/services/telemetry/core-events.d.ts.map +1 -0
  121. package/dist/services/telemetry/distinct-id.d.ts.map +1 -0
  122. package/dist/services/telemetry/index.d.ts.map +1 -0
  123. package/dist/{telemetry → services/telemetry}/index.js +6 -6
  124. package/dist/{session/utils → services}/usage.d.ts +1 -1
  125. package/dist/services/usage.d.ts.map +1 -0
  126. package/dist/services/workspace/file-indexer.d.ts.map +1 -0
  127. package/dist/services/workspace/index.d.ts.map +1 -0
  128. package/dist/services/workspace/mention-enricher.d.ts.map +1 -0
  129. package/dist/services/workspace-manifest.d.ts.map +1 -0
  130. package/dist/session/file-session-service.d.ts +4 -1
  131. package/dist/session/file-session-service.d.ts.map +1 -1
  132. package/dist/session/persistence-service.d.ts +8 -6
  133. package/dist/session/persistence-service.d.ts.map +1 -1
  134. package/dist/session/rpc-session-service.d.ts +3 -0
  135. package/dist/session/rpc-session-service.d.ts.map +1 -1
  136. package/dist/session/session-service.d.ts +8 -9
  137. package/dist/session/session-service.d.ts.map +1 -1
  138. package/dist/session/session-team-coordination.d.ts +4 -4
  139. package/dist/session/session-team-coordination.d.ts.map +1 -1
  140. package/dist/session/sqlite-rpc-session-backend.d.ts.map +1 -1
  141. package/dist/{session/default-session-manager.d.ts → transports/local.d.ts} +24 -14
  142. package/dist/transports/local.d.ts.map +1 -0
  143. package/dist/transports/rpc.d.ts +51 -0
  144. package/dist/transports/rpc.d.ts.map +1 -0
  145. package/dist/transports/runtime-host-support.d.ts +21 -0
  146. package/dist/transports/runtime-host-support.d.ts.map +1 -0
  147. package/dist/types/chat-schema.d.ts.map +1 -0
  148. package/dist/types/config.d.ts +3 -2
  149. package/dist/types/config.d.ts.map +1 -1
  150. package/dist/{session/utils/types.d.ts → types/session.d.ts} +15 -6
  151. package/dist/types/session.d.ts.map +1 -0
  152. package/dist/types/sessions.d.ts +19 -0
  153. package/dist/types/sessions.d.ts.map +1 -1
  154. package/dist/types/storage.d.ts +1 -3
  155. package/dist/types/storage.d.ts.map +1 -1
  156. package/dist/types.d.ts +7 -6
  157. package/dist/types.d.ts.map +1 -1
  158. package/package.json +7 -12
  159. package/src/ClineCore.test.ts +95 -19
  160. package/src/ClineCore.ts +120 -50
  161. package/src/auth/client.test.ts +29 -0
  162. package/src/auth/client.ts +21 -0
  163. package/src/auth/cline.ts +3 -1
  164. package/src/auth/codex.ts +1 -1
  165. package/src/auth/oca.ts +3 -1
  166. package/src/auth/server.test.ts +287 -0
  167. package/src/auth/server.ts +50 -1
  168. package/src/auth/types.ts +29 -0
  169. package/src/extensions/config/agent-config-loader.test.ts +3 -3
  170. package/src/extensions/config/agent-config-loader.ts +1 -5
  171. package/src/extensions/config/agent-config-parser.ts +1 -1
  172. package/src/extensions/config/hooks-config-loader.ts +1 -2
  173. package/src/extensions/config/index.ts +0 -4
  174. package/src/extensions/config/user-instruction-config-loader.ts +0 -4
  175. package/src/extensions/index.ts +6 -0
  176. package/src/extensions/plugin/plugin-config-loader.test.ts +39 -0
  177. package/src/extensions/plugin/plugin-config-loader.ts +18 -10
  178. package/src/extensions/plugin/plugin-load-report.ts +20 -0
  179. package/src/extensions/plugin/plugin-loader.test.ts +45 -0
  180. package/src/extensions/plugin/plugin-loader.ts +57 -3
  181. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +158 -86
  182. package/src/extensions/plugin/plugin-sandbox.test.ts +70 -0
  183. package/src/extensions/plugin/plugin-sandbox.ts +17 -6
  184. package/src/{tools → extensions/tools}/definitions.ts +1 -1
  185. package/src/extensions/tools/executors/file-read.test.ts +125 -0
  186. package/src/{tools → extensions/tools}/executors/file-read.ts +29 -4
  187. package/src/{tools → extensions/tools}/executors/search.ts +1 -1
  188. package/src/{tools → extensions/tools}/model-tool-routing.ts +1 -1
  189. package/src/{tools → extensions/tools}/presets.ts +2 -3
  190. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +455 -0
  191. package/src/{team → extensions/tools/team}/multi-agent.ts +80 -17
  192. package/src/{team → extensions/tools/team}/spawn-agent-tool.test.ts +0 -6
  193. package/src/{team → extensions/tools/team}/spawn-agent-tool.ts +1 -7
  194. package/src/{team → extensions/tools/team}/subagent-prompts.ts +2 -2
  195. package/src/{team → extensions/tools/team}/team-tools.test.ts +146 -30
  196. package/src/{team → extensions/tools/team}/team-tools.ts +98 -69
  197. package/src/{tools → extensions/tools}/types.ts +5 -3
  198. package/src/{runtime → hooks}/checkpoint-hooks.ts +27 -0
  199. package/src/{runtime → hooks}/hook-file-hooks.test.ts +42 -7
  200. package/src/{runtime → hooks}/hook-file-hooks.ts +6 -11
  201. package/src/hooks/subprocess.ts +48 -257
  202. package/src/index.ts +178 -158
  203. package/src/runtime/history.test.ts +114 -0
  204. package/src/runtime/history.ts +237 -0
  205. package/src/runtime/host.test.ts +230 -0
  206. package/src/runtime/host.ts +362 -0
  207. package/src/runtime/rpc-runtime-ensure.test.ts +123 -0
  208. package/src/{session → runtime}/rpc-runtime-ensure.ts +165 -27
  209. package/src/{session → runtime}/rpc-spawn-lease.test.ts +33 -1
  210. package/src/{session → runtime}/rpc-spawn-lease.ts +54 -20
  211. package/src/runtime/runtime-builder.team-persistence.test.ts +6 -3
  212. package/src/runtime/runtime-builder.test.ts +101 -4
  213. package/src/runtime/runtime-builder.ts +125 -86
  214. package/src/runtime/runtime-host.ts +178 -0
  215. package/src/{session → runtime}/runtime-oauth-token-manager.ts +1 -1
  216. package/src/runtime/runtime-parity.test.ts +1 -1
  217. package/src/runtime/session-runtime.ts +2 -2
  218. package/src/runtime/subprocess-sandbox.ts +26 -23
  219. package/src/runtime/tool-approval.ts +13 -15
  220. package/src/{session/session-agent-events.ts → services/agent-events.ts} +7 -7
  221. package/src/services/config.ts +5 -0
  222. package/src/services/local-runtime-bootstrap.ts +280 -0
  223. package/src/{providers → services/providers}/local-provider-service.ts +4 -4
  224. package/src/{session → services}/session-artifacts.ts +23 -19
  225. package/src/{session/utils/helpers.test.ts → services/session-data.test.ts} +1 -1
  226. package/src/{session/utils/helpers.ts → services/session-data.ts} +76 -72
  227. package/src/{session → services}/session-telemetry.ts +7 -9
  228. package/src/services/storage/artifact-store.ts +1 -0
  229. package/src/{storage → services/storage}/file-team-store.ts +2 -2
  230. package/src/{storage → services/storage}/provider-settings-legacy-migration.test.ts +1 -1
  231. package/src/{storage → services/storage}/provider-settings-legacy-migration.ts +2 -2
  232. package/src/{storage → services/storage}/provider-settings-manager.ts +2 -2
  233. package/src/services/storage/session-store.ts +1 -0
  234. package/src/{storage → services/storage}/sqlite-session-store.ts +7 -12
  235. package/src/{storage → services/storage}/sqlite-team-store.ts +4 -4
  236. package/src/{storage → services/storage}/team-store.ts +1 -1
  237. package/src/{session/utils → services}/usage.ts +1 -1
  238. package/src/{input → services/workspace}/file-indexer.test.ts +30 -1
  239. package/src/{input → services/workspace}/file-indexer.ts +26 -2
  240. package/src/{input → services/workspace}/mention-enricher.test.ts +21 -0
  241. package/src/{input → services/workspace}/mention-enricher.ts +1 -1
  242. package/src/session/file-session-service.ts +9 -7
  243. package/src/session/index.ts +25 -17
  244. package/src/session/persistence-service.test.ts +121 -24
  245. package/src/session/persistence-service.ts +118 -102
  246. package/src/session/rpc-session-service.ts +9 -2
  247. package/src/session/session-service.team-persistence.test.ts +1 -1
  248. package/src/session/session-service.ts +32 -19
  249. package/src/session/session-team-coordination.ts +13 -6
  250. package/src/session/sqlite-rpc-session-backend.ts +4 -6
  251. package/src/session/workspace-manager.ts +1 -1
  252. package/src/{session/default-session-manager.e2e.test.ts → transports/local.e2e.test.ts} +13 -17
  253. package/src/{session/default-session-manager.test.ts → transports/local.test.ts} +316 -230
  254. package/src/{session/default-session-manager.ts → transports/local.ts} +138 -172
  255. package/src/transports/rpc.test.ts +82 -0
  256. package/src/transports/rpc.ts +665 -0
  257. package/src/transports/runtime-host-support.ts +86 -0
  258. package/src/types/config.ts +3 -2
  259. package/src/{session/utils/types.ts → types/session.ts} +18 -5
  260. package/src/types/sessions.ts +21 -0
  261. package/src/types/storage.ts +1 -6
  262. package/src/types.ts +25 -18
  263. package/dist/chat/chat-schema.d.ts.map +0 -1
  264. package/dist/input/file-indexer.d.ts.map +0 -1
  265. package/dist/input/index.d.ts.map +0 -1
  266. package/dist/input/mention-enricher.d.ts.map +0 -1
  267. package/dist/prompt/default-system.d.ts +0 -2
  268. package/dist/prompt/default-system.d.ts.map +0 -1
  269. package/dist/providers/local-provider-registry.d.ts.map +0 -1
  270. package/dist/providers/local-provider-service.d.ts.map +0 -1
  271. package/dist/runtime/checkpoint-hooks.d.ts.map +0 -1
  272. package/dist/runtime/hook-file-hooks.d.ts.map +0 -1
  273. package/dist/runtime/team-runtime-registry.d.ts +0 -13
  274. package/dist/runtime/team-runtime-registry.d.ts.map +0 -1
  275. package/dist/session/default-session-manager.d.ts.map +0 -1
  276. package/dist/session/session-agent-events.d.ts.map +0 -1
  277. package/dist/session/session-artifacts.d.ts.map +0 -1
  278. package/dist/session/session-config-builder.d.ts +0 -16
  279. package/dist/session/session-config-builder.d.ts.map +0 -1
  280. package/dist/session/session-host.d.ts +0 -15
  281. package/dist/session/session-host.d.ts.map +0 -1
  282. package/dist/session/session-manager.d.ts.map +0 -1
  283. package/dist/session/session-telemetry.d.ts.map +0 -1
  284. package/dist/session/utils/helpers.d.ts.map +0 -1
  285. package/dist/session/utils/types.d.ts.map +0 -1
  286. package/dist/session/utils/usage.d.ts.map +0 -1
  287. package/dist/session/workspace-manifest.d.ts.map +0 -1
  288. package/dist/storage/file-team-store.d.ts.map +0 -1
  289. package/dist/storage/provider-settings-legacy-migration.d.ts.map +0 -1
  290. package/dist/storage/provider-settings-manager.d.ts.map +0 -1
  291. package/dist/storage/sqlite-session-store.d.ts.map +0 -1
  292. package/dist/storage/sqlite-team-store.d.ts.map +0 -1
  293. package/dist/storage/team-store.d.ts.map +0 -1
  294. package/dist/team/delegated-agent.d.ts.map +0 -1
  295. package/dist/team/index.d.ts.map +0 -1
  296. package/dist/team/multi-agent.d.ts.map +0 -1
  297. package/dist/team/projections.d.ts.map +0 -1
  298. package/dist/team/runtime.d.ts.map +0 -1
  299. package/dist/team/spawn-agent-tool.d.ts.map +0 -1
  300. package/dist/team/subagent-prompts.d.ts.map +0 -1
  301. package/dist/team/team-tools.d.ts.map +0 -1
  302. package/dist/telemetry/ITelemetryAdapter.d.ts.map +0 -1
  303. package/dist/telemetry/OpenTelemetryAdapter.d.ts.map +0 -1
  304. package/dist/telemetry/OpenTelemetryProvider.d.ts.map +0 -1
  305. package/dist/telemetry/TelemetryLoggerSink.d.ts.map +0 -1
  306. package/dist/telemetry/TelemetryService.d.ts.map +0 -1
  307. package/dist/telemetry/core-events.d.ts.map +0 -1
  308. package/dist/telemetry/distinct-id.d.ts.map +0 -1
  309. package/dist/telemetry/index.d.ts.map +0 -1
  310. package/dist/tools/constants.d.ts.map +0 -1
  311. package/dist/tools/definitions.d.ts.map +0 -1
  312. package/dist/tools/executors/apply-patch-parser.d.ts.map +0 -1
  313. package/dist/tools/executors/apply-patch.d.ts.map +0 -1
  314. package/dist/tools/executors/bash.d.ts.map +0 -1
  315. package/dist/tools/executors/editor.d.ts.map +0 -1
  316. package/dist/tools/executors/file-read.d.ts.map +0 -1
  317. package/dist/tools/executors/index.d.ts.map +0 -1
  318. package/dist/tools/executors/search.d.ts.map +0 -1
  319. package/dist/tools/executors/web-fetch.d.ts.map +0 -1
  320. package/dist/tools/helpers.d.ts.map +0 -1
  321. package/dist/tools/index.d.ts.map +0 -1
  322. package/dist/tools/model-tool-routing.d.ts.map +0 -1
  323. package/dist/tools/presets.d.ts.map +0 -1
  324. package/dist/tools/schemas.d.ts.map +0 -1
  325. package/dist/tools/types.d.ts.map +0 -1
  326. package/src/prompt/default-system.ts +0 -21
  327. package/src/runtime/team-runtime-registry.ts +0 -43
  328. package/src/session/session-config-builder.ts +0 -126
  329. package/src/session/session-host.test.ts +0 -89
  330. package/src/session/session-host.ts +0 -213
  331. package/src/session/session-manager.ts +0 -74
  332. package/src/storage/artifact-store.ts +0 -1
  333. package/src/storage/session-store.ts +0 -1
  334. package/src/team/multi-agent.lifecycle.test.ts +0 -201
  335. package/src/tools/executors/file-read.test.ts +0 -49
  336. /package/dist/{tools → extensions/tools}/constants.d.ts +0 -0
  337. /package/dist/{tools → extensions/tools}/definitions.d.ts +0 -0
  338. /package/dist/{tools → extensions/tools}/executors/apply-patch-parser.d.ts +0 -0
  339. /package/dist/{tools → extensions/tools}/executors/apply-patch.d.ts +0 -0
  340. /package/dist/{tools → extensions/tools}/executors/bash.d.ts +0 -0
  341. /package/dist/{tools → extensions/tools}/executors/editor.d.ts +0 -0
  342. /package/dist/{tools → extensions/tools}/executors/file-read.d.ts +0 -0
  343. /package/dist/{tools → extensions/tools}/executors/index.d.ts +0 -0
  344. /package/dist/{tools → extensions/tools}/executors/search.d.ts +0 -0
  345. /package/dist/{tools → extensions/tools}/executors/web-fetch.d.ts +0 -0
  346. /package/dist/{tools → extensions/tools}/helpers.d.ts +0 -0
  347. /package/dist/{tools → extensions/tools}/index.d.ts +0 -0
  348. /package/dist/{tools → extensions/tools}/schemas.d.ts +0 -0
  349. /package/dist/{team → extensions/tools/team}/delegated-agent.d.ts +0 -0
  350. /package/dist/{team → extensions/tools/team}/index.d.ts +0 -0
  351. /package/dist/{team → extensions/tools/team}/projections.d.ts +0 -0
  352. /package/dist/{team → extensions/tools/team}/runtime.d.ts +0 -0
  353. /package/dist/{team → extensions/tools/team}/subagent-prompts.d.ts +0 -0
  354. /package/dist/{team → extensions/tools/team}/team-tools.d.ts +0 -0
  355. /package/dist/{session → runtime}/rpc-spawn-lease.d.ts +0 -0
  356. /package/dist/{providers → services/providers}/local-provider-registry.d.ts +0 -0
  357. /package/dist/{providers → services/providers}/local-provider-service.d.ts +0 -0
  358. /package/dist/{telemetry → services/telemetry}/ITelemetryAdapter.d.ts +0 -0
  359. /package/dist/{telemetry → services/telemetry}/OpenTelemetryAdapter.d.ts +0 -0
  360. /package/dist/{telemetry → services/telemetry}/OpenTelemetryProvider.d.ts +0 -0
  361. /package/dist/{telemetry → services/telemetry}/TelemetryLoggerSink.d.ts +0 -0
  362. /package/dist/{telemetry → services/telemetry}/TelemetryService.d.ts +0 -0
  363. /package/dist/{telemetry → services/telemetry}/core-events.d.ts +0 -0
  364. /package/dist/{telemetry → services/telemetry}/distinct-id.d.ts +0 -0
  365. /package/dist/{telemetry → services/telemetry}/index.d.ts +0 -0
  366. /package/dist/{input → services/workspace}/file-indexer.d.ts +0 -0
  367. /package/dist/{input → services/workspace}/index.d.ts +0 -0
  368. /package/dist/{input → services/workspace}/mention-enricher.d.ts +0 -0
  369. /package/dist/{session → services}/workspace-manifest.d.ts +0 -0
  370. /package/dist/{chat → types}/chat-schema.d.ts +0 -0
  371. /package/src/{tools → extensions/tools}/constants.ts +0 -0
  372. /package/src/{tools → extensions/tools}/definitions.test.ts +0 -0
  373. /package/src/{tools → extensions/tools}/executors/apply-patch-parser.ts +0 -0
  374. /package/src/{tools → extensions/tools}/executors/apply-patch.ts +0 -0
  375. /package/src/{tools → extensions/tools}/executors/bash.test.ts +0 -0
  376. /package/src/{tools → extensions/tools}/executors/bash.ts +0 -0
  377. /package/src/{tools → extensions/tools}/executors/editor.test.ts +0 -0
  378. /package/src/{tools → extensions/tools}/executors/editor.ts +0 -0
  379. /package/src/{tools → extensions/tools}/executors/index.ts +0 -0
  380. /package/src/{tools → extensions/tools}/executors/web-fetch.ts +0 -0
  381. /package/src/{tools → extensions/tools}/helpers.ts +0 -0
  382. /package/src/{tools → extensions/tools}/index.ts +0 -0
  383. /package/src/{tools → extensions/tools}/model-tool-routing.test.ts +0 -0
  384. /package/src/{tools → extensions/tools}/presets.test.ts +0 -0
  385. /package/src/{tools → extensions/tools}/schemas.ts +0 -0
  386. /package/src/{team → extensions/tools/team}/delegated-agent.ts +0 -0
  387. /package/src/{team → extensions/tools/team}/index.ts +0 -0
  388. /package/src/{team → extensions/tools/team}/projections.ts +0 -0
  389. /package/src/{team → extensions/tools/team}/runtime.ts +0 -0
  390. /package/src/{runtime → hooks}/checkpoint-hooks.test.ts +0 -0
  391. /package/src/{session → runtime}/runtime-oauth-token-manager.test.ts +0 -0
  392. /package/src/{providers → services/providers}/local-provider-registry.ts +0 -0
  393. /package/src/{providers → services/providers}/local-provider-service.test.ts +0 -0
  394. /package/src/{storage → services/storage}/index.ts +0 -0
  395. /package/src/{storage → services/storage}/provider-settings-manager.test.ts +0 -0
  396. /package/src/{telemetry → services/telemetry}/ITelemetryAdapter.ts +0 -0
  397. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.test.ts +0 -0
  398. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.ts +0 -0
  399. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.test.ts +0 -0
  400. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.ts +0 -0
  401. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.test.ts +0 -0
  402. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.ts +0 -0
  403. /package/src/{telemetry → services/telemetry}/TelemetryService.test.ts +0 -0
  404. /package/src/{telemetry → services/telemetry}/TelemetryService.ts +0 -0
  405. /package/src/{telemetry → services/telemetry}/core-events.ts +0 -0
  406. /package/src/{telemetry → services/telemetry}/distinct-id.test.ts +0 -0
  407. /package/src/{telemetry → services/telemetry}/distinct-id.ts +0 -0
  408. /package/src/{telemetry → services/telemetry}/index.ts +0 -0
  409. /package/src/{input → services/workspace}/file-indexer.d.ts +0 -0
  410. /package/src/{input → services/workspace}/index.ts +0 -0
  411. /package/src/{session → services}/workspace-manifest.ts +0 -0
  412. /package/src/{chat → types}/chat-schema.ts +0 -0
@@ -1,4 +1,3 @@
1
- import { existsSync, readFileSync } from "node:fs";
2
1
  import { readFile, stat } from "node:fs/promises";
3
2
  import { homedir } from "node:os";
4
3
  import { isAbsolute, join, resolve } from "node:path";
@@ -19,68 +18,71 @@ import {
19
18
  import { setHomeDirIfUnset } from "@clinebot/shared/storage";
20
19
  import { nanoid } from "nanoid";
21
20
  import { createContextCompactionPrepareTurn } from "../extensions/context/compaction";
22
- import { enrichPromptWithMentions } from "../input";
23
- import { createCheckpointHooks } from "../runtime/checkpoint-hooks";
24
- import { mergeAgentHooks } from "../runtime/hook-file-hooks";
25
- import { DefaultRuntimeBuilder } from "../runtime/runtime-builder";
26
- import type { RuntimeBuilder } from "../runtime/session-runtime";
27
- import { ProviderSettingsManager } from "../storage/provider-settings-manager";
28
- import { createSpawnAgentTool, type TeamEvent } from "../team";
29
- import {
30
- captureAgentCreated,
31
- captureAgentTeamCreated,
32
- captureConversationTurnEvent,
33
- captureModeSwitch,
34
- captureSubagentExecution,
35
- captureTaskCompleted,
36
- } from "../telemetry/core-events";
37
- import { resolveCoreDistinctId } from "../telemetry/distinct-id";
38
21
  import {
39
22
  createBuiltinTools,
40
23
  resolveToolPresetName,
41
24
  type ToolExecutors,
42
25
  ToolPresets,
43
- } from "../tools";
44
- import { SessionSource, type SessionStatus } from "../types/common";
45
- import type { CoreSessionConfig } from "../types/config";
46
- import type { CoreSessionEvent } from "../types/events";
47
- import type { SessionRecord } from "../types/sessions";
48
- import type { FileSessionService } from "./file-session-service";
49
- import type { RpcCoreSessionService } from "./rpc-session-service";
26
+ } from "../extensions/tools";
27
+ import { createSpawnAgentTool, type TeamEvent } from "../extensions/tools/team";
28
+ import type { HookEventPayload } from "../hooks";
29
+ import { DefaultRuntimeBuilder } from "../runtime/runtime-builder";
30
+ import type {
31
+ RuntimeHost,
32
+ SendSessionInput,
33
+ SessionAccumulatedUsage,
34
+ StartSessionInput,
35
+ StartSessionResult,
36
+ } from "../runtime/runtime-host";
50
37
  import {
51
38
  OAuthReauthRequiredError,
52
39
  type RuntimeOAuthResolution,
53
40
  RuntimeOAuthTokenManager,
54
- } from "./runtime-oauth-token-manager";
41
+ } from "../runtime/runtime-oauth-token-manager";
42
+ import type { RuntimeBuilder } from "../runtime/session-runtime";
55
43
  import {
56
44
  type AgentEventContext,
57
45
  buildTelemetryAgentIdentity,
58
46
  extractAgentEventMetadata,
59
47
  handleAgentEvent,
60
- } from "./session-agent-events";
61
- import { nowIso } from "./session-artifacts";
48
+ } from "../services/agent-events";
49
+ import { resolveWorkspacePath } from "../services/config";
50
+ import { prepareLocalRuntimeBootstrap } from "../services/local-runtime-bootstrap";
51
+ import { nowIso } from "../services/session-artifacts";
62
52
  import {
63
- buildEffectiveConfig,
64
- buildResolvedProviderConfig,
65
- resolveReasoningSettings,
66
- resolveWorkspacePath,
67
- } from "./session-config-builder";
68
- import type {
69
- SendSessionInput,
70
- SessionAccumulatedUsage,
71
- SessionManager,
72
- StartSessionInput,
73
- StartSessionResult,
74
- } from "./session-manager";
53
+ toSessionRecord,
54
+ withLatestAssistantTurnMetadata,
55
+ } from "../services/session-data";
56
+ import {
57
+ emitMentionTelemetry,
58
+ emitSessionCreationTelemetry,
59
+ } from "../services/session-telemetry";
60
+ import { ProviderSettingsManager } from "../services/storage/provider-settings-manager";
61
+ import {
62
+ captureAgentCreated,
63
+ captureAgentTeamCreated,
64
+ captureConversationTurnEvent,
65
+ captureModeSwitch,
66
+ captureSubagentExecution,
67
+ captureTaskCompleted,
68
+ } from "../services/telemetry/core-events";
69
+ import { resolveCoreDistinctId } from "../services/telemetry/distinct-id";
70
+ import {
71
+ accumulateUsageTotals,
72
+ createInitialAccumulatedUsage,
73
+ } from "../services/usage";
74
+ import { enrichPromptWithMentions } from "../services/workspace";
75
+ import type { FileSessionService } from "../session/file-session-service";
76
+ import type { RpcCoreSessionService } from "../session/rpc-session-service";
75
77
  import {
76
78
  type SessionManifest,
77
79
  SessionManifestSchema,
78
- } from "./session-manifest";
80
+ } from "../session/session-manifest";
79
81
  import type {
80
82
  CoreSessionService,
81
83
  RootSessionArtifacts,
82
84
  SessionRow,
83
- } from "./session-service";
85
+ } from "../session/session-service";
84
86
  import {
85
87
  buildTeamRunContinuationPrompt,
86
88
  dispatchTeamEventToBackend,
@@ -91,21 +93,18 @@ import {
91
93
  shouldAutoContinueTeamRuns,
92
94
  trackTeamRunState,
93
95
  waitForTeamRunUpdates,
94
- } from "./session-team-coordination";
95
- import {
96
- emitMentionTelemetry,
97
- emitSessionCreationTelemetry,
98
- } from "./session-telemetry";
99
- import {
100
- toSessionRecord,
101
- withLatestAssistantTurnMetadata,
102
- } from "./utils/helpers";
103
- import type { ActiveSession, PreparedTurnInput } from "./utils/types";
96
+ } from "../session/session-team-coordination";
97
+ import { SessionSource, type SessionStatus } from "../types/common";
98
+ import type { CoreSessionConfig } from "../types/config";
99
+ import type { CoreSessionEvent } from "../types/events";
100
+ import type { ActiveSession, PreparedTurnInput } from "../types/session";
101
+ import type { SessionRecord } from "../types/sessions";
104
102
  import {
105
- accumulateUsageTotals,
106
- createInitialAccumulatedUsage,
107
- } from "./utils/usage";
108
- import { buildWorkspaceMetadata } from "./workspace-manifest";
103
+ cloneAccumulatedUsage,
104
+ RuntimeHostEventBus,
105
+ readPersistedMessagesFile,
106
+ replaySubagentHookEvent,
107
+ } from "./runtime-host-support";
109
108
 
110
109
  type SessionBackend =
111
110
  | CoreSessionService
@@ -130,12 +129,13 @@ async function loadUserFileContent(path: string): Promise<string> {
130
129
  return content;
131
130
  }
132
131
 
133
- export interface DefaultSessionManagerOptions {
132
+ export interface LocalRuntimeHostOptions {
134
133
  distinctId?: string;
135
134
  sessionService: SessionBackend;
136
135
  runtimeBuilder?: RuntimeBuilder;
137
136
  createAgent?: (config: AgentConfig) => Agent;
138
137
  defaultToolExecutors?: Partial<ToolExecutors>;
138
+ teamToolsFactory?: import("../runtime/session-runtime").TeamToolsFactory;
139
139
  toolPolicies?: AgentConfig["toolPolicies"];
140
140
  providerSettingsManager?: ProviderSettingsManager;
141
141
  oauthTokenManager?: RuntimeOAuthTokenManager;
@@ -145,11 +145,13 @@ export interface DefaultSessionManagerOptions {
145
145
  ) => Promise<ToolApprovalResult>;
146
146
  }
147
147
 
148
- export class DefaultSessionManager implements SessionManager {
148
+ export class LocalRuntimeHost implements RuntimeHost {
149
+ public readonly runtimeAddress = undefined;
149
150
  private readonly sessionService: SessionBackend;
150
151
  private readonly runtimeBuilder: RuntimeBuilder;
151
152
  private readonly createAgentInstance: (config: AgentConfig) => Agent;
152
153
  private readonly defaultToolExecutors?: Partial<ToolExecutors>;
154
+ private readonly teamToolsFactory?: import("../runtime/session-runtime").TeamToolsFactory;
153
155
  private readonly defaultToolPolicies?: AgentConfig["toolPolicies"];
154
156
  private readonly providerSettingsManager: ProviderSettingsManager;
155
157
  private readonly oauthTokenManager: RuntimeOAuthTokenManager;
@@ -157,7 +159,7 @@ export class DefaultSessionManager implements SessionManager {
157
159
  private readonly defaultRequestToolApproval?: (
158
160
  request: ToolApprovalRequest,
159
161
  ) => Promise<ToolApprovalResult>;
160
- private readonly listeners = new Set<(event: CoreSessionEvent) => void>();
162
+ private readonly events = new RuntimeHostEventBus();
161
163
  private readonly sessions = new Map<string, ActiveSession>();
162
164
  private readonly usageBySession = new Map<string, SessionAccumulatedUsage>();
163
165
  private readonly subAgentStarts = new Map<
@@ -165,7 +167,7 @@ export class DefaultSessionManager implements SessionManager {
165
167
  { startedAt: number; rootSessionId: string }
166
168
  >();
167
169
 
168
- constructor(options: DefaultSessionManagerOptions) {
170
+ constructor(options: LocalRuntimeHostOptions) {
169
171
  const homeDir = homedir();
170
172
  if (homeDir) setHomeDirIfUnset(homeDir);
171
173
  const distinctId = resolveCoreDistinctId(options.distinctId);
@@ -174,6 +176,7 @@ export class DefaultSessionManager implements SessionManager {
174
176
  this.createAgentInstance =
175
177
  options.createAgent ?? ((config) => new Agent(config));
176
178
  this.defaultToolExecutors = options.defaultToolExecutors;
179
+ this.teamToolsFactory = options.teamToolsFactory;
177
180
  this.defaultToolPolicies = options.toolPolicies;
178
181
  this.providerSettingsManager =
179
182
  options.providerSettingsManager ?? new ProviderSettingsManager();
@@ -223,8 +226,6 @@ export class DefaultSessionManager implements SessionManager {
223
226
  }
224
227
 
225
228
  const sessionDir = join(sessionsDir, sessionId);
226
- const transcriptPath = join(sessionDir, `${sessionId}.log`);
227
- const hookPath = join(sessionDir, `${sessionId}.hooks.jsonl`);
228
229
  const messagesPath = join(sessionDir, `${sessionId}.messages.json`);
229
230
  const manifestPath = join(sessionDir, `${sessionId}.json`);
230
231
  const workspacePath = resolveWorkspacePath(input.config);
@@ -249,64 +250,36 @@ export class DefaultSessionManager implements SessionManager {
249
250
  messages_path: messagesPath,
250
251
  });
251
252
 
252
- const { config: effectiveConfig, pluginSandboxShutdown } =
253
- await buildEffectiveConfig(
254
- startInput,
255
- hookPath,
256
- sessionId,
257
- this.defaultTelemetry,
258
- (e) => void this.handlePluginEvent(sessionId, e),
259
- );
260
- const workspaceMetadata = await buildWorkspaceMetadata(
261
- startInput.config.cwd,
262
- );
263
- const providerConfig = buildResolvedProviderConfig(
264
- effectiveConfig,
265
- this.providerSettingsManager,
266
- resolveReasoningSettings,
267
- );
268
- const configWithProvider: CoreSessionConfig = {
269
- ...effectiveConfig,
270
- providerConfig,
271
- workspaceMetadata,
272
- };
273
- configWithProvider.hooks = mergeAgentHooks([
274
- effectiveConfig.hooks,
275
- effectiveConfig.checkpoint?.enabled === true
276
- ? createCheckpointHooks({
277
- cwd: configWithProvider.cwd,
278
- sessionId,
279
- logger: configWithProvider.logger,
280
- createCheckpoint: effectiveConfig.checkpoint?.createCheckpoint,
281
- readSessionMetadata: async () =>
282
- (await this.get(sessionId))?.metadata as
283
- | Record<string, unknown>
284
- | undefined,
285
- writeSessionMetadata: async (metadata) => {
286
- await this.persistSessionMetadata(sessionId, () => metadata);
287
- },
288
- })
289
- : undefined,
290
- ]);
291
-
292
- const runtime = await this.runtimeBuilder.build({
293
- config: configWithProvider,
294
- hooks: configWithProvider.hooks,
295
- extensions: effectiveConfig.extensions,
296
- logger: configWithProvider.logger,
297
- telemetry: configWithProvider.telemetry,
253
+ let bootstrap!: Awaited<ReturnType<typeof prepareLocalRuntimeBootstrap>>;
254
+ bootstrap = await prepareLocalRuntimeBootstrap({
255
+ input: startInput,
256
+ localRuntime: input.localRuntime,
257
+ sessionId,
258
+ providerSettingsManager: this.providerSettingsManager,
259
+ defaultTelemetry: this.defaultTelemetry,
260
+ defaultToolExecutors: this.defaultToolExecutors,
261
+ teamToolsFactory: this.teamToolsFactory,
262
+ defaultToolPolicies: this.defaultToolPolicies,
263
+ defaultRequestToolApproval: this.defaultRequestToolApproval,
264
+ onPluginEvent: (event) => void this.handlePluginEvent(sessionId, event),
298
265
  onTeamEvent: (event: TeamEvent) => {
299
266
  void this.handleTeamEvent(sessionId, event);
300
- configWithProvider.onTeamEvent?.(event);
267
+ bootstrap.config.onTeamEvent?.(event);
268
+ },
269
+ createSpawnTool: () => this.createSpawnTool(bootstrap.config, sessionId),
270
+ readSessionMetadata: async () =>
271
+ (await this.get(sessionId))?.metadata as
272
+ | Record<string, unknown>
273
+ | undefined,
274
+ writeSessionMetadata: async (metadata) => {
275
+ await this.persistSessionMetadata(sessionId, () => metadata);
301
276
  },
302
- createSpawnTool: () =>
303
- this.createSpawnTool(configWithProvider, sessionId),
304
- onTeamRestored: input.onTeamRestored,
305
- userInstructionWatcher: input.userInstructionWatcher,
306
- defaultToolExecutors:
307
- input.defaultToolExecutors ?? this.defaultToolExecutors,
308
- teamToolsFactory: input.teamToolsFactory,
309
277
  });
278
+ const runtime = await this.runtimeBuilder.build(
279
+ bootstrap.runtimeBuilderInput,
280
+ );
281
+ const configWithProvider = bootstrap.config;
282
+ const providerConfig = bootstrap.providerConfig;
310
283
  if (runtime.teamRuntime && !configWithProvider.teamName?.trim()) {
311
284
  configWithProvider.teamName = runtime.teamRuntime.getTeamName();
312
285
  }
@@ -329,14 +302,13 @@ export class DefaultSessionManager implements SessionManager {
329
302
  execution: configWithProvider.execution,
330
303
  prepareTurn: createContextCompactionPrepareTurn(configWithProvider),
331
304
  tools,
332
- hooks: configWithProvider.hooks,
333
- extensions: effectiveConfig.extensions,
305
+ hooks: bootstrap.hooks,
306
+ extensions: bootstrap.extensions,
334
307
  hookErrorMode: configWithProvider.hookErrorMode,
335
- initialMessages: input.initialMessages,
308
+ initialMessages: bootstrap.effectiveInput.initialMessages,
336
309
  userFileContentLoader: loadUserFileContent,
337
- toolPolicies: input.toolPolicies ?? this.defaultToolPolicies,
338
- requestToolApproval:
339
- input.requestToolApproval ?? this.defaultRequestToolApproval,
310
+ toolPolicies: bootstrap.toolPolicies,
311
+ requestToolApproval: bootstrap.requestToolApproval,
340
312
  onConsecutiveMistakeLimitReached:
341
313
  configWithProvider.onConsecutiveMistakeLimitReached,
342
314
  completionGuard: runtime.completionGuard,
@@ -384,6 +356,7 @@ export class DefaultSessionManager implements SessionManager {
384
356
  const active: ActiveSession = {
385
357
  sessionId,
386
358
  config: configWithProvider,
359
+ sessionMetadata: startInput.sessionMetadata,
387
360
  source,
388
361
  startedAt,
389
362
  pendingPrompt: manifest.prompt,
@@ -398,7 +371,7 @@ export class DefaultSessionManager implements SessionManager {
398
371
  teamRunWaiters: [],
399
372
  pendingPrompts: [],
400
373
  drainingPendingPrompts: false,
401
- pluginSandboxShutdown,
374
+ pluginSandboxShutdown: bootstrap.pluginSandboxShutdown,
402
375
  };
403
376
  this.sessions.set(sessionId, active);
404
377
  this.emitStatus(sessionId, "running");
@@ -424,8 +397,6 @@ export class DefaultSessionManager implements SessionManager {
424
397
  sessionId,
425
398
  manifest,
426
399
  manifestPath,
427
- transcriptPath,
428
- hookPath,
429
400
  messagesPath,
430
401
  result,
431
402
  };
@@ -474,8 +445,7 @@ export class DefaultSessionManager implements SessionManager {
474
445
  async getAccumulatedUsage(
475
446
  sessionId: string,
476
447
  ): Promise<SessionAccumulatedUsage | undefined> {
477
- const usage = this.usageBySession.get(sessionId);
478
- return usage ? { ...usage } : undefined;
448
+ return cloneAccumulatedUsage(this.usageBySession.get(sessionId));
479
449
  }
480
450
 
481
451
  async abort(sessionId: string, reason?: unknown): Promise<void> {
@@ -486,6 +456,10 @@ export class DefaultSessionManager implements SessionManager {
486
456
  properties: { sessionId },
487
457
  });
488
458
  session.aborting = true;
459
+ if (session.pendingPrompts.length > 0) {
460
+ session.pendingPrompts.length = 0;
461
+ this.emitPendingPrompts(session);
462
+ }
489
463
  (
490
464
  session.agent as Agent & {
491
465
  abort: (abortReason?: unknown) => void;
@@ -555,55 +529,49 @@ export class DefaultSessionManager implements SessionManager {
555
529
  return result.deleted;
556
530
  }
557
531
 
558
- async readTranscript(sessionId: string, maxChars?: number): Promise<string> {
559
- const row = await this.getRow(sessionId);
560
- if (!row?.transcriptPath || !existsSync(row.transcriptPath)) return "";
561
- const raw = readFileSync(row.transcriptPath, "utf8");
562
- if (typeof maxChars === "number" && Number.isFinite(maxChars)) {
563
- return raw.slice(-Math.max(0, Math.floor(maxChars)));
564
- }
565
- return raw;
532
+ async update(
533
+ sessionId: string,
534
+ updates: {
535
+ prompt?: string | null;
536
+ metadata?: Record<string, unknown> | null;
537
+ title?: string | null;
538
+ },
539
+ ): Promise<{ updated: boolean }> {
540
+ const result = await this.invokeOptionalValue<{ updated?: boolean }>(
541
+ "updateSession",
542
+ {
543
+ sessionId,
544
+ prompt: updates.prompt,
545
+ metadata: updates.metadata,
546
+ title: updates.title,
547
+ },
548
+ );
549
+ return { updated: result?.updated === true };
566
550
  }
567
551
 
568
552
  async readMessages(sessionId: string): Promise<LlmsProviders.Message[]> {
569
553
  const row = await this.getRow(sessionId);
570
- const messagesPath = row?.messagesPath?.trim();
571
- if (!messagesPath || !existsSync(messagesPath)) return [];
572
- try {
573
- const raw = readFileSync(messagesPath, "utf8").trim();
574
- if (!raw) return [];
575
- const parsed = JSON.parse(raw) as unknown;
576
- if (Array.isArray(parsed)) return parsed as LlmsProviders.Message[];
577
- if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
578
- const messages = (parsed as { messages?: unknown }).messages;
579
- if (Array.isArray(messages)) return messages as LlmsProviders.Message[];
580
- }
581
- return [];
582
- } catch {
583
- return [];
584
- }
554
+ return readPersistedMessagesFile(row?.messagesPath);
585
555
  }
586
556
 
587
- async readHooks(sessionId: string, limit = 200): Promise<unknown[]> {
588
- const row = await this.getRow(sessionId);
589
- if (!row?.hookPath || !existsSync(row.hookPath)) return [];
590
- const lines = readFileSync(row.hookPath, "utf8")
591
- .split("\n")
592
- .filter((line) => line.trim().length > 0);
593
- return lines.slice(-Math.max(1, Math.floor(limit))).map((line) => {
594
- try {
595
- return JSON.parse(line) as unknown;
596
- } catch {
597
- return { raw: line };
598
- }
557
+ async handleHookEvent(payload: HookEventPayload): Promise<void> {
558
+ await replaySubagentHookEvent(payload, {
559
+ queueSpawnRequest: (event: HookEventPayload) =>
560
+ this.invokeOptional("queueSpawnRequest", event),
561
+ upsertSubagentSessionFromHook: (event: HookEventPayload) =>
562
+ this.invokeOptionalValue<string | undefined>(
563
+ "upsertSubagentSessionFromHook",
564
+ event,
565
+ ),
566
+ appendSubagentHookAudit: (sessionId: string, event: HookEventPayload) =>
567
+ this.invokeOptional("appendSubagentHookAudit", sessionId, event),
568
+ applySubagentStatus: (sessionId: string, event: HookEventPayload) =>
569
+ this.invokeOptional("applySubagentStatus", sessionId, event),
599
570
  });
600
571
  }
601
572
 
602
573
  subscribe(listener: (event: CoreSessionEvent) => void): () => void {
603
- this.listeners.add(listener);
604
- return () => {
605
- this.listeners.delete(listener);
606
- };
574
+ return this.events.subscribe(listener);
607
575
  }
608
576
 
609
577
  async updateSessionModel(sessionId: string, modelId: string): Promise<void> {
@@ -796,6 +764,7 @@ export class DefaultSessionManager implements SessionManager {
796
764
  enableSpawn: session.config.enableSpawnAgent,
797
765
  enableTeams: session.config.enableAgentTeams,
798
766
  prompt: session.pendingPrompt,
767
+ metadata: session.sessionMetadata,
799
768
  startedAt: session.startedAt,
800
769
  })) as RootSessionArtifacts;
801
770
  }
@@ -992,7 +961,7 @@ export class DefaultSessionManager implements SessionManager {
992
961
  },
993
962
  ): void {
994
963
  const session = this.sessions.get(sessionId);
995
- if (!session) {
964
+ if (!session || session.aborting) {
996
965
  return;
997
966
  }
998
967
  const { prompt, delivery, userImages, userFiles } = entry;
@@ -1041,7 +1010,7 @@ export class DefaultSessionManager implements SessionManager {
1041
1010
 
1042
1011
  private async drainPendingPrompts(sessionId: string): Promise<void> {
1043
1012
  const session = this.sessions.get(sessionId);
1044
- if (!session || session.drainingPendingPrompts) {
1013
+ if (!session || session.aborting || session.drainingPendingPrompts) {
1045
1014
  return;
1046
1015
  }
1047
1016
  const canStartRun =
@@ -1181,7 +1150,6 @@ export class DefaultSessionManager implements SessionManager {
1181
1150
  ...ToolPresets[
1182
1151
  resolveToolPresetName({
1183
1152
  mode: config.mode,
1184
- yolo: config.yolo,
1185
1153
  })
1186
1154
  ],
1187
1155
  executors: this.defaultToolExecutors,
@@ -1391,9 +1359,7 @@ export class DefaultSessionManager implements SessionManager {
1391
1359
  });
1392
1360
  } catch (error) {
1393
1361
  if (error instanceof OAuthReauthRequiredError) {
1394
- throw new Error(
1395
- `OAuth session for "${error.providerId}" requires re-authentication. Run "clite auth ${error.providerId}" and retry.`,
1396
- );
1362
+ throw new Error(`${error.providerId} requires re-authentication.`);
1397
1363
  }
1398
1364
  throw error;
1399
1365
  }
@@ -1466,7 +1432,7 @@ export class DefaultSessionManager implements SessionManager {
1466
1432
  }
1467
1433
 
1468
1434
  private emit(event: CoreSessionEvent): void {
1469
- for (const listener of this.listeners) listener(event);
1435
+ this.events.emit(event);
1470
1436
  }
1471
1437
 
1472
1438
  private async listRows(limit: number): Promise<SessionRow[]> {
@@ -0,0 +1,82 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+
3
+ const clientCloseMock = vi.hoisted(() => vi.fn());
4
+ const streamEventsMock = vi.hoisted(() => vi.fn(() => () => {}));
5
+ const startRuntimeSessionMock = vi.hoisted(() => vi.fn());
6
+ const sendRuntimeSessionMock = vi.hoisted(() => vi.fn());
7
+ const abortRuntimeSessionMock = vi.hoisted(() => vi.fn());
8
+ const stopRuntimeSessionMock = vi.hoisted(() => vi.fn());
9
+ const getSessionMock = vi.hoisted(() => vi.fn());
10
+
11
+ vi.mock("@clinebot/rpc", () => ({
12
+ RpcSessionClient: class {
13
+ close = clientCloseMock;
14
+ streamEvents = streamEventsMock;
15
+ startRuntimeSession = startRuntimeSessionMock;
16
+ sendRuntimeSession = sendRuntimeSessionMock;
17
+ abortRuntimeSession = abortRuntimeSessionMock;
18
+ stopRuntimeSession = stopRuntimeSessionMock;
19
+ getSession = getSessionMock;
20
+ respondToolApproval = vi.fn();
21
+ },
22
+ }));
23
+
24
+ describe("RpcRuntimeHost", () => {
25
+ it("emits running status when a remote session starts", async () => {
26
+ const { RpcRuntimeHost } = await import("./rpc");
27
+ startRuntimeSessionMock.mockResolvedValue({
28
+ sessionId: "session-1",
29
+ startResult: {
30
+ manifestPath: "/tmp/session-1.json",
31
+ messagesPath: "/tmp/session-1.messages.json",
32
+ },
33
+ });
34
+ const backend = {
35
+ address: "127.0.0.1:4317",
36
+ close: vi.fn(),
37
+ readSessionManifest: vi.fn().mockReturnValue({
38
+ session_id: "session-1",
39
+ status: "running",
40
+ }),
41
+ } as unknown as import("../session/rpc-session-service").RpcCoreSessionService;
42
+
43
+ const host = new RpcRuntimeHost(backend, undefined, undefined);
44
+ const listener = vi.fn();
45
+ const unsubscribe = host.subscribe(listener);
46
+
47
+ await host.start({
48
+ config: {
49
+ cwd: "/tmp/project",
50
+ workspaceRoot: "/tmp/project",
51
+ providerId: "mock-provider",
52
+ modelId: "mock-model",
53
+ mode: "act",
54
+ systemPrompt: "system",
55
+ enableTools: true,
56
+ enableSpawnAgent: false,
57
+ enableAgentTeams: false,
58
+ },
59
+ interactive: true,
60
+ });
61
+
62
+ expect(listener).toHaveBeenCalledWith({
63
+ type: "status",
64
+ payload: { sessionId: "session-1", status: "running" },
65
+ });
66
+ unsubscribe();
67
+ });
68
+
69
+ it("does not close the shared backend on dispose", async () => {
70
+ const { RpcRuntimeHost } = await import("./rpc");
71
+ const backend = {
72
+ address: "127.0.0.1:4317",
73
+ close: vi.fn(),
74
+ } as unknown as import("../session/rpc-session-service").RpcCoreSessionService;
75
+
76
+ const host = new RpcRuntimeHost(backend, undefined, undefined);
77
+ await host.dispose();
78
+
79
+ expect(clientCloseMock).toHaveBeenCalledTimes(1);
80
+ expect(backend.close).not.toHaveBeenCalled();
81
+ });
82
+ });