@clinebot/core 0.0.34 → 0.0.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (546) hide show
  1. package/README.md +13 -10
  2. package/dist/ClineCore.d.ts +96 -63
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/account/index.d.ts +1 -1
  5. package/dist/account/index.d.ts.map +1 -1
  6. package/dist/account/rpc.d.ts +6 -6
  7. package/dist/account/rpc.d.ts.map +1 -1
  8. package/dist/cron/index.d.ts +6 -0
  9. package/dist/cron/index.d.ts.map +1 -0
  10. package/dist/cron/resource-limiter.d.ts +9 -0
  11. package/dist/cron/resource-limiter.d.ts.map +1 -0
  12. package/dist/cron/schedule-command-service.d.ts +10 -0
  13. package/dist/cron/schedule-command-service.d.ts.map +1 -0
  14. package/dist/cron/schedule-service.d.ts +100 -0
  15. package/dist/cron/schedule-service.d.ts.map +1 -0
  16. package/dist/cron/scheduler.d.ts +66 -0
  17. package/dist/cron/scheduler.d.ts.map +1 -0
  18. package/dist/cron/sqlite-schedule-store.d.ts +52 -0
  19. package/dist/cron/sqlite-schedule-store.d.ts.map +1 -0
  20. package/dist/extensions/config/agent-config-loader.d.ts +6 -5
  21. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  22. package/dist/extensions/config/agent-config-parser.d.ts +1 -1
  23. package/dist/extensions/config/agent-config-parser.d.ts.map +1 -1
  24. package/dist/extensions/config/hooks-config-loader.d.ts +2 -2
  25. package/dist/extensions/config/hooks-config-loader.d.ts.map +1 -1
  26. package/dist/extensions/config/index.d.ts +3 -3
  27. package/dist/extensions/config/index.d.ts.map +1 -1
  28. package/dist/extensions/config/runtime-commands.d.ts +1 -0
  29. package/dist/extensions/config/runtime-commands.d.ts.map +1 -1
  30. package/dist/extensions/config/user-instruction-config-loader.d.ts +3 -2
  31. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  32. package/dist/extensions/context/agentic-compaction.d.ts +2 -2
  33. package/dist/extensions/context/agentic-compaction.d.ts.map +1 -1
  34. package/dist/extensions/context/compaction-shared.d.ts +5 -4
  35. package/dist/extensions/context/compaction-shared.d.ts.map +1 -1
  36. package/dist/extensions/context/compaction.d.ts.map +1 -1
  37. package/dist/extensions/plugin/plugin-config-loader.d.ts +9 -2
  38. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  39. package/dist/extensions/plugin/plugin-loader.d.ts +5 -3
  40. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  41. package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -1
  42. package/dist/extensions/plugin/plugin-sandbox.d.ts +15 -2
  43. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  44. package/dist/extensions/plugin/plugin-targeting.d.ts +7 -0
  45. package/dist/extensions/plugin/plugin-targeting.d.ts.map +1 -0
  46. package/dist/extensions/plugin-sandbox-bootstrap.js +253 -253
  47. package/dist/extensions/tools/constants.d.ts.map +1 -0
  48. package/dist/{tools → extensions/tools}/definitions.d.ts +1 -1
  49. package/dist/extensions/tools/definitions.d.ts.map +1 -0
  50. package/dist/extensions/tools/executors/apply-patch-parser.d.ts.map +1 -0
  51. package/dist/{tools → extensions/tools}/executors/apply-patch.d.ts +3 -1
  52. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -0
  53. package/dist/extensions/tools/executors/bash.d.ts.map +1 -0
  54. package/dist/extensions/tools/executors/editor.d.ts.map +1 -0
  55. package/dist/extensions/tools/executors/file-read.d.ts.map +1 -0
  56. package/dist/extensions/tools/executors/index.d.ts.map +1 -0
  57. package/dist/{tools → extensions/tools}/executors/search.d.ts +1 -1
  58. package/dist/extensions/tools/executors/search.d.ts.map +1 -0
  59. package/dist/extensions/tools/executors/web-fetch.d.ts.map +1 -0
  60. package/dist/extensions/tools/helpers.d.ts.map +1 -0
  61. package/dist/{tools → extensions/tools}/index.d.ts +2 -0
  62. package/dist/extensions/tools/index.d.ts.map +1 -0
  63. package/dist/{tools → extensions/tools}/model-tool-routing.d.ts +1 -1
  64. package/dist/extensions/tools/model-tool-routing.d.ts.map +1 -0
  65. package/dist/{tools → extensions/tools}/presets.d.ts +26 -44
  66. package/dist/extensions/tools/presets.d.ts.map +1 -0
  67. package/dist/extensions/tools/runtime.d.ts +25 -0
  68. package/dist/extensions/tools/runtime.d.ts.map +1 -0
  69. package/dist/extensions/tools/schemas.d.ts.map +1 -0
  70. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -0
  71. package/dist/extensions/tools/team/index.d.ts.map +1 -0
  72. package/dist/{team → extensions/tools/team}/multi-agent.d.ts +1 -3
  73. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -0
  74. package/dist/extensions/tools/team/projections.d.ts.map +1 -0
  75. package/dist/extensions/tools/team/runtime.d.ts.map +1 -0
  76. package/dist/{team → extensions/tools/team}/spawn-agent-tool.d.ts +0 -1
  77. package/dist/extensions/tools/team/spawn-agent-tool.d.ts.map +1 -0
  78. package/dist/extensions/tools/team/subagent-prompts.d.ts.map +1 -0
  79. package/dist/{team → extensions/tools/team}/team-tools.d.ts +1 -0
  80. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -0
  81. package/dist/{tools → extensions/tools}/types.d.ts +4 -3
  82. package/dist/extensions/tools/types.d.ts.map +1 -0
  83. package/dist/{runtime → hooks}/checkpoint-hooks.d.ts +7 -0
  84. package/dist/hooks/checkpoint-hooks.d.ts.map +1 -0
  85. package/dist/{runtime → hooks}/hook-file-hooks.d.ts +4 -3
  86. package/dist/hooks/hook-file-hooks.d.ts.map +1 -0
  87. package/dist/hooks/index.d.ts +0 -1
  88. package/dist/hooks/index.d.ts.map +1 -1
  89. package/dist/hooks/subprocess.d.ts +10 -130
  90. package/dist/hooks/subprocess.d.ts.map +1 -1
  91. package/dist/hub/browser-websocket.d.ts +18 -0
  92. package/dist/hub/browser-websocket.d.ts.map +1 -0
  93. package/dist/hub/client.d.ts +45 -0
  94. package/dist/hub/client.d.ts.map +1 -0
  95. package/dist/hub/connect.d.ts +15 -0
  96. package/dist/hub/connect.d.ts.map +1 -0
  97. package/dist/hub/daemon-entry.d.ts +2 -0
  98. package/dist/hub/daemon-entry.d.ts.map +1 -0
  99. package/dist/hub/daemon-entry.js +1045 -0
  100. package/dist/hub/daemon.d.ts +5 -0
  101. package/dist/hub/daemon.d.ts.map +1 -0
  102. package/dist/hub/defaults.d.ts +13 -0
  103. package/dist/hub/defaults.d.ts.map +1 -0
  104. package/dist/hub/discovery.d.ts +29 -0
  105. package/dist/hub/discovery.d.ts.map +1 -0
  106. package/dist/hub/index.d.ts +15 -0
  107. package/dist/hub/index.d.ts.map +1 -0
  108. package/dist/hub/index.js +1044 -0
  109. package/dist/hub/native-transport.d.ts +17 -0
  110. package/dist/hub/native-transport.d.ts.map +1 -0
  111. package/dist/hub/runtime-handlers.d.ts +11 -0
  112. package/dist/hub/runtime-handlers.d.ts.map +1 -0
  113. package/dist/hub/server.d.ts +86 -0
  114. package/dist/hub/server.d.ts.map +1 -0
  115. package/dist/hub/session-client.d.ts +87 -0
  116. package/dist/hub/session-client.d.ts.map +1 -0
  117. package/dist/hub/start-shared-server.d.ts +19 -0
  118. package/dist/hub/start-shared-server.d.ts.map +1 -0
  119. package/dist/hub/transport.d.ts +8 -0
  120. package/dist/hub/transport.d.ts.map +1 -0
  121. package/dist/hub/ui-client.d.ts +44 -0
  122. package/dist/hub/ui-client.d.ts.map +1 -0
  123. package/dist/hub/workspace.d.ts +4 -0
  124. package/dist/hub/workspace.d.ts.map +1 -0
  125. package/dist/index.d.ts +52 -39
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +557 -533
  128. package/dist/llms/configured-provider-registry.d.ts +28 -0
  129. package/dist/llms/configured-provider-registry.d.ts.map +1 -0
  130. package/dist/llms/provider-defaults.d.ts +27 -0
  131. package/dist/llms/provider-defaults.d.ts.map +1 -0
  132. package/dist/llms/provider-settings.d.ts +202 -0
  133. package/dist/llms/provider-settings.d.ts.map +1 -0
  134. package/dist/llms/runtime-config.d.ts +4 -0
  135. package/dist/llms/runtime-config.d.ts.map +1 -0
  136. package/dist/llms/runtime-registry.d.ts +20 -0
  137. package/dist/llms/runtime-registry.d.ts.map +1 -0
  138. package/dist/llms/runtime-types.d.ts +85 -0
  139. package/dist/llms/runtime-types.d.ts.map +1 -0
  140. package/dist/runtime/history.d.ts +4 -0
  141. package/dist/runtime/history.d.ts.map +1 -0
  142. package/dist/runtime/host.d.ts +8 -0
  143. package/dist/runtime/host.d.ts.map +1 -0
  144. package/dist/runtime/rules.d.ts +1 -0
  145. package/dist/runtime/rules.d.ts.map +1 -1
  146. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  147. package/dist/runtime/runtime-host.d.ts +103 -0
  148. package/dist/runtime/runtime-host.d.ts.map +1 -0
  149. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts +1 -1
  150. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts.map +1 -1
  151. package/dist/runtime/session-runtime.d.ts +3 -21
  152. package/dist/runtime/session-runtime.d.ts.map +1 -1
  153. package/dist/{session/session-agent-events.d.ts → services/agent-events.d.ts} +4 -4
  154. package/dist/services/agent-events.d.ts.map +1 -0
  155. package/dist/services/config.d.ts +3 -0
  156. package/dist/services/config.d.ts.map +1 -0
  157. package/dist/services/global-settings.d.ts +12 -0
  158. package/dist/services/global-settings.d.ts.map +1 -0
  159. package/dist/services/local-runtime-bootstrap.d.ts +47 -0
  160. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -0
  161. package/dist/services/plugin-tools.d.ts +16 -0
  162. package/dist/services/plugin-tools.d.ts.map +1 -0
  163. package/dist/{providers → services/providers}/local-provider-registry.d.ts +4 -4
  164. package/dist/services/providers/local-provider-registry.d.ts.map +1 -0
  165. package/dist/{providers → services/providers}/local-provider-service.d.ts +13 -13
  166. package/dist/services/providers/local-provider-service.d.ts.map +1 -0
  167. package/dist/{session → services}/session-artifacts.d.ts +0 -4
  168. package/dist/services/session-artifacts.d.ts.map +1 -0
  169. package/dist/{session/utils/helpers.d.ts → services/session-data.d.ts} +19 -27
  170. package/dist/services/session-data.d.ts.map +1 -0
  171. package/dist/{session → services}/session-telemetry.d.ts +2 -2
  172. package/dist/services/session-telemetry.d.ts.map +1 -0
  173. package/dist/{storage → services/storage}/file-team-store.d.ts +2 -2
  174. package/dist/services/storage/file-team-store.d.ts.map +1 -0
  175. package/dist/{storage → services/storage}/provider-settings-legacy-migration.d.ts +1 -1
  176. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -0
  177. package/dist/{storage → services/storage}/provider-settings-manager.d.ts +1 -1
  178. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -0
  179. package/dist/{storage → services/storage}/sqlite-session-store.d.ts +3 -3
  180. package/dist/services/storage/sqlite-session-store.d.ts.map +1 -0
  181. package/dist/{storage → services/storage}/sqlite-team-store.d.ts +2 -2
  182. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -0
  183. package/dist/{storage → services/storage}/team-store.d.ts +1 -1
  184. package/dist/services/storage/team-store.d.ts.map +1 -0
  185. package/dist/services/telemetry/ITelemetryAdapter.d.ts.map +1 -0
  186. package/dist/services/telemetry/OpenTelemetryAdapter.d.ts.map +1 -0
  187. package/dist/services/telemetry/OpenTelemetryProvider.d.ts.map +1 -0
  188. package/dist/services/telemetry/TelemetryLoggerSink.d.ts.map +1 -0
  189. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -0
  190. package/dist/services/telemetry/core-events.d.ts.map +1 -0
  191. package/dist/services/telemetry/distinct-id.d.ts.map +1 -0
  192. package/dist/services/telemetry/index.d.ts.map +1 -0
  193. package/dist/services/telemetry/index.js +28 -0
  194. package/dist/{session/utils → services}/usage.d.ts +1 -1
  195. package/dist/services/usage.d.ts.map +1 -0
  196. package/dist/services/workspace/file-indexer.d.ts.map +1 -0
  197. package/dist/services/workspace/index.d.ts.map +1 -0
  198. package/dist/services/workspace/mention-enricher.d.ts.map +1 -0
  199. package/dist/services/workspace-manifest.d.ts +16 -0
  200. package/dist/services/workspace-manifest.d.ts.map +1 -0
  201. package/dist/session/file-session-service.d.ts +4 -1
  202. package/dist/session/file-session-service.d.ts.map +1 -1
  203. package/dist/session/persistence-service.d.ts +15 -25
  204. package/dist/session/persistence-service.d.ts.map +1 -1
  205. package/dist/session/session-manifest-store.d.ts +22 -0
  206. package/dist/session/session-manifest-store.d.ts.map +1 -0
  207. package/dist/session/session-row.d.ts +93 -0
  208. package/dist/session/session-row.d.ts.map +1 -0
  209. package/dist/session/session-service.d.ts +8 -109
  210. package/dist/session/session-service.d.ts.map +1 -1
  211. package/dist/session/session-team-coordination.d.ts +4 -4
  212. package/dist/session/session-team-coordination.d.ts.map +1 -1
  213. package/dist/session/subagent-session-manager.d.ts +36 -0
  214. package/dist/session/subagent-session-manager.d.ts.map +1 -0
  215. package/dist/session/team-persistence-store.d.ts +24 -0
  216. package/dist/session/team-persistence-store.d.ts.map +1 -0
  217. package/dist/transports/hub.d.ts +47 -0
  218. package/dist/transports/hub.d.ts.map +1 -0
  219. package/dist/{session/default-session-manager.d.ts → transports/local.d.ts} +30 -16
  220. package/dist/transports/local.d.ts.map +1 -0
  221. package/dist/transports/remote.d.ts +10 -0
  222. package/dist/transports/remote.d.ts.map +1 -0
  223. package/dist/transports/runtime-host-support.d.ts +22 -0
  224. package/dist/transports/runtime-host-support.d.ts.map +1 -0
  225. package/dist/{chat → types}/chat-schema.d.ts +10 -12
  226. package/dist/types/chat-schema.d.ts.map +1 -0
  227. package/dist/types/config.d.ts +10 -9
  228. package/dist/types/config.d.ts.map +1 -1
  229. package/dist/types/provider-settings.d.ts +4 -5
  230. package/dist/types/provider-settings.d.ts.map +1 -1
  231. package/dist/{session/utils/types.d.ts → types/session.d.ts} +16 -6
  232. package/dist/types/session.d.ts.map +1 -0
  233. package/dist/types/sessions.d.ts +19 -0
  234. package/dist/types/sessions.d.ts.map +1 -1
  235. package/dist/types/storage.d.ts +1 -3
  236. package/dist/types/storage.d.ts.map +1 -1
  237. package/dist/types.d.ts +14 -6
  238. package/dist/types.d.ts.map +1 -1
  239. package/package.json +22 -13
  240. package/src/ClineCore.ts +183 -85
  241. package/src/account/index.ts +3 -3
  242. package/src/account/rpc.ts +12 -12
  243. package/src/auth/cline.ts +1 -1
  244. package/src/auth/codex.ts +1 -1
  245. package/src/auth/oca.ts +1 -1
  246. package/src/cron/index.ts +5 -0
  247. package/src/cron/resource-limiter.ts +46 -0
  248. package/src/cron/schedule-command-service.ts +193 -0
  249. package/src/cron/schedule-service.ts +703 -0
  250. package/src/cron/scheduler.ts +637 -0
  251. package/src/cron/sqlite-schedule-store.ts +708 -0
  252. package/src/extensions/config/agent-config-loader.ts +18 -12
  253. package/src/extensions/config/agent-config-parser.ts +1 -1
  254. package/src/extensions/config/hooks-config-loader.ts +1 -2
  255. package/src/extensions/config/index.ts +0 -4
  256. package/src/extensions/config/runtime-commands.ts +6 -0
  257. package/src/extensions/config/user-instruction-config-loader.ts +1 -4
  258. package/src/extensions/context/agentic-compaction.ts +3 -3
  259. package/src/extensions/context/basic-compaction.ts +2 -2
  260. package/src/extensions/context/compaction-shared.ts +5 -4
  261. package/src/extensions/context/compaction.ts +3 -3
  262. package/src/extensions/plugin/plugin-config-loader.ts +17 -2
  263. package/src/extensions/plugin/plugin-loader.ts +48 -4
  264. package/src/extensions/plugin/plugin-module-import.ts +0 -2
  265. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +93 -39
  266. package/src/extensions/plugin/plugin-sandbox.ts +47 -27
  267. package/src/extensions/plugin/plugin-targeting.ts +32 -0
  268. package/src/{tools → extensions/tools}/definitions.ts +31 -50
  269. package/src/{tools → extensions/tools}/executors/apply-patch.ts +69 -80
  270. package/src/{tools → extensions/tools}/executors/file-read.ts +29 -4
  271. package/src/{tools → extensions/tools}/executors/search.ts +196 -4
  272. package/src/{tools → extensions/tools}/index.ts +10 -0
  273. package/src/{tools → extensions/tools}/model-tool-routing.ts +1 -1
  274. package/src/{tools → extensions/tools}/presets.ts +31 -47
  275. package/src/extensions/tools/runtime.ts +261 -0
  276. package/src/{tools → extensions/tools}/schemas.ts +4 -2
  277. package/src/{team → extensions/tools/team}/multi-agent.ts +80 -17
  278. package/src/{team → extensions/tools/team}/spawn-agent-tool.ts +1 -7
  279. package/src/{team → extensions/tools/team}/subagent-prompts.ts +2 -2
  280. package/src/{team → extensions/tools/team}/team-tools.ts +84 -53
  281. package/src/{tools → extensions/tools}/types.ts +5 -3
  282. package/src/{runtime → hooks}/checkpoint-hooks.ts +27 -0
  283. package/src/{runtime → hooks}/hook-file-hooks.ts +14 -13
  284. package/src/hooks/index.ts +0 -7
  285. package/src/hooks/subprocess-runner.ts +1 -1
  286. package/src/hooks/subprocess.ts +57 -257
  287. package/src/hub/browser-websocket.ts +137 -0
  288. package/src/hub/client.ts +574 -0
  289. package/src/hub/connect.ts +156 -0
  290. package/src/hub/daemon-entry.ts +87 -0
  291. package/src/hub/daemon.ts +181 -0
  292. package/src/hub/defaults.ts +43 -0
  293. package/src/hub/discovery.ts +247 -0
  294. package/src/hub/index.ts +14 -0
  295. package/src/hub/native-transport.ts +31 -0
  296. package/src/hub/runtime-handlers.ts +140 -0
  297. package/src/hub/server.ts +1888 -0
  298. package/src/hub/session-client.ts +460 -0
  299. package/src/hub/start-shared-server.ts +58 -0
  300. package/src/hub/transport.ts +14 -0
  301. package/src/hub/ui-client.ts +122 -0
  302. package/src/hub/workspace.ts +19 -0
  303. package/src/index.ts +264 -199
  304. package/src/llms/configured-provider-registry.ts +193 -0
  305. package/src/llms/provider-defaults.ts +637 -0
  306. package/src/llms/provider-settings.ts +263 -0
  307. package/src/llms/runtime-config.ts +43 -0
  308. package/src/llms/runtime-registry.ts +171 -0
  309. package/src/llms/runtime-types.ts +121 -0
  310. package/src/runtime/history.ts +237 -0
  311. package/src/runtime/host.ts +200 -0
  312. package/src/runtime/index.ts +1 -0
  313. package/src/runtime/rules.ts +12 -0
  314. package/src/runtime/runtime-builder.ts +37 -29
  315. package/src/runtime/runtime-host.ts +206 -0
  316. package/src/{session → runtime}/runtime-oauth-token-manager.ts +12 -16
  317. package/src/runtime/session-runtime.ts +2 -26
  318. package/src/{session/session-agent-events.ts → services/agent-events.ts} +7 -7
  319. package/src/services/config.ts +5 -0
  320. package/src/services/global-settings.ts +122 -0
  321. package/src/services/local-runtime-bootstrap.ts +318 -0
  322. package/src/services/plugin-tools.ts +85 -0
  323. package/src/{providers → services/providers}/local-provider-registry.ts +6 -6
  324. package/src/{providers → services/providers}/local-provider-service.ts +46 -41
  325. package/src/{session → services}/session-artifacts.ts +7 -19
  326. package/src/{session/utils/helpers.ts → services/session-data.ts} +90 -80
  327. package/src/{session → services}/session-telemetry.ts +7 -9
  328. package/src/services/storage/artifact-store.ts +1 -0
  329. package/src/{storage → services/storage}/file-team-store.ts +2 -2
  330. package/src/{storage → services/storage}/provider-settings-legacy-migration.ts +6 -4
  331. package/src/{storage → services/storage}/provider-settings-manager.ts +3 -3
  332. package/src/services/storage/session-store.ts +1 -0
  333. package/src/{storage → services/storage}/sqlite-session-store.ts +7 -12
  334. package/src/{storage → services/storage}/sqlite-team-store.ts +4 -4
  335. package/src/{storage → services/storage}/team-store.ts +1 -1
  336. package/src/{session/utils → services}/usage.ts +1 -1
  337. package/src/{input → services/workspace}/file-indexer.ts +26 -2
  338. package/src/{input → services/workspace}/mention-enricher.ts +1 -1
  339. package/src/{session → services}/workspace-manifest.ts +18 -0
  340. package/src/session/file-session-service.ts +10 -8
  341. package/src/session/index.ts +10 -23
  342. package/src/session/persistence-service.ts +144 -528
  343. package/src/session/session-manifest-store.ts +158 -0
  344. package/src/session/session-row.ts +199 -0
  345. package/src/session/session-service.ts +43 -389
  346. package/src/session/session-team-coordination.ts +14 -7
  347. package/src/session/subagent-session-manager.ts +397 -0
  348. package/src/session/team-persistence-store.ts +176 -0
  349. package/src/session/workspace-manager.ts +1 -1
  350. package/src/transports/hub.ts +656 -0
  351. package/src/{session/default-session-manager.ts → transports/local.ts} +263 -200
  352. package/src/transports/remote.ts +26 -0
  353. package/src/transports/runtime-host-support.ts +140 -0
  354. package/src/{chat → types}/chat-schema.ts +4 -5
  355. package/src/types/config.ts +10 -9
  356. package/src/types/provider-settings.ts +11 -7
  357. package/src/{session/utils/types.ts → types/session.ts} +16 -5
  358. package/src/types/sessions.ts +21 -0
  359. package/src/types/storage.ts +1 -6
  360. package/src/types.ts +52 -19
  361. package/dist/chat/chat-schema.d.ts.map +0 -1
  362. package/dist/hooks/persistent.d.ts +0 -64
  363. package/dist/hooks/persistent.d.ts.map +0 -1
  364. package/dist/input/file-indexer.d.ts.map +0 -1
  365. package/dist/input/index.d.ts.map +0 -1
  366. package/dist/input/mention-enricher.d.ts.map +0 -1
  367. package/dist/prompt/default-system.d.ts +0 -2
  368. package/dist/prompt/default-system.d.ts.map +0 -1
  369. package/dist/providers/local-provider-registry.d.ts.map +0 -1
  370. package/dist/providers/local-provider-service.d.ts.map +0 -1
  371. package/dist/runtime/checkpoint-hooks.d.ts.map +0 -1
  372. package/dist/runtime/hook-file-hooks.d.ts.map +0 -1
  373. package/dist/session/default-session-manager.d.ts.map +0 -1
  374. package/dist/session/rpc-runtime-ensure.d.ts +0 -53
  375. package/dist/session/rpc-runtime-ensure.d.ts.map +0 -1
  376. package/dist/session/rpc-session-service.d.ts +0 -13
  377. package/dist/session/rpc-session-service.d.ts.map +0 -1
  378. package/dist/session/rpc-spawn-lease.d.ts +0 -8
  379. package/dist/session/rpc-spawn-lease.d.ts.map +0 -1
  380. package/dist/session/session-agent-events.d.ts.map +0 -1
  381. package/dist/session/session-artifacts.d.ts.map +0 -1
  382. package/dist/session/session-config-builder.d.ts +0 -16
  383. package/dist/session/session-config-builder.d.ts.map +0 -1
  384. package/dist/session/session-host.d.ts +0 -15
  385. package/dist/session/session-host.d.ts.map +0 -1
  386. package/dist/session/session-manager.d.ts +0 -62
  387. package/dist/session/session-manager.d.ts.map +0 -1
  388. package/dist/session/session-telemetry.d.ts.map +0 -1
  389. package/dist/session/sqlite-rpc-session-backend.d.ts +0 -31
  390. package/dist/session/sqlite-rpc-session-backend.d.ts.map +0 -1
  391. package/dist/session/utils/helpers.d.ts.map +0 -1
  392. package/dist/session/utils/types.d.ts.map +0 -1
  393. package/dist/session/utils/usage.d.ts.map +0 -1
  394. package/dist/session/workspace-manifest.d.ts +0 -5
  395. package/dist/session/workspace-manifest.d.ts.map +0 -1
  396. package/dist/storage/file-team-store.d.ts.map +0 -1
  397. package/dist/storage/provider-settings-legacy-migration.d.ts.map +0 -1
  398. package/dist/storage/provider-settings-manager.d.ts.map +0 -1
  399. package/dist/storage/sqlite-session-store.d.ts.map +0 -1
  400. package/dist/storage/sqlite-team-store.d.ts.map +0 -1
  401. package/dist/storage/team-store.d.ts.map +0 -1
  402. package/dist/team/delegated-agent.d.ts.map +0 -1
  403. package/dist/team/index.d.ts.map +0 -1
  404. package/dist/team/multi-agent.d.ts.map +0 -1
  405. package/dist/team/projections.d.ts.map +0 -1
  406. package/dist/team/runtime.d.ts.map +0 -1
  407. package/dist/team/spawn-agent-tool.d.ts.map +0 -1
  408. package/dist/team/subagent-prompts.d.ts.map +0 -1
  409. package/dist/team/team-tools.d.ts.map +0 -1
  410. package/dist/telemetry/ITelemetryAdapter.d.ts.map +0 -1
  411. package/dist/telemetry/OpenTelemetryAdapter.d.ts.map +0 -1
  412. package/dist/telemetry/OpenTelemetryProvider.d.ts.map +0 -1
  413. package/dist/telemetry/TelemetryLoggerSink.d.ts.map +0 -1
  414. package/dist/telemetry/TelemetryService.d.ts.map +0 -1
  415. package/dist/telemetry/core-events.d.ts.map +0 -1
  416. package/dist/telemetry/distinct-id.d.ts.map +0 -1
  417. package/dist/telemetry/index.d.ts.map +0 -1
  418. package/dist/telemetry/index.js +0 -15
  419. package/dist/tools/constants.d.ts.map +0 -1
  420. package/dist/tools/definitions.d.ts.map +0 -1
  421. package/dist/tools/executors/apply-patch-parser.d.ts.map +0 -1
  422. package/dist/tools/executors/apply-patch.d.ts.map +0 -1
  423. package/dist/tools/executors/bash.d.ts.map +0 -1
  424. package/dist/tools/executors/editor.d.ts.map +0 -1
  425. package/dist/tools/executors/file-read.d.ts.map +0 -1
  426. package/dist/tools/executors/index.d.ts.map +0 -1
  427. package/dist/tools/executors/search.d.ts.map +0 -1
  428. package/dist/tools/executors/web-fetch.d.ts.map +0 -1
  429. package/dist/tools/helpers.d.ts.map +0 -1
  430. package/dist/tools/index.d.ts.map +0 -1
  431. package/dist/tools/model-tool-routing.d.ts.map +0 -1
  432. package/dist/tools/presets.d.ts.map +0 -1
  433. package/dist/tools/schemas.d.ts.map +0 -1
  434. package/dist/tools/types.d.ts.map +0 -1
  435. package/src/ClineCore.test.ts +0 -150
  436. package/src/account/cline-account-service.test.ts +0 -185
  437. package/src/account/featurebase-token.test.ts +0 -175
  438. package/src/account/rpc.test.ts +0 -63
  439. package/src/auth/bounded-ttl-cache.test.ts +0 -38
  440. package/src/auth/client.test.ts +0 -69
  441. package/src/auth/cline.test.ts +0 -267
  442. package/src/auth/codex.test.ts +0 -170
  443. package/src/auth/oca.test.ts +0 -340
  444. package/src/auth/server.test.ts +0 -287
  445. package/src/auth/utils.test.ts +0 -128
  446. package/src/extensions/config/agent-config-loader.test.ts +0 -236
  447. package/src/extensions/config/hooks-config-loader.test.ts +0 -20
  448. package/src/extensions/config/runtime-commands.test.ts +0 -115
  449. package/src/extensions/config/unified-config-file-watcher.test.ts +0 -196
  450. package/src/extensions/config/user-instruction-config-loader.test.ts +0 -246
  451. package/src/extensions/context/compaction.test.ts +0 -483
  452. package/src/extensions/mcp/config-loader.test.ts +0 -238
  453. package/src/extensions/mcp/manager.test.ts +0 -105
  454. package/src/extensions/plugin/plugin-config-loader.test.ts +0 -182
  455. package/src/extensions/plugin/plugin-loader.test.ts +0 -292
  456. package/src/extensions/plugin/plugin-sandbox.test.ts +0 -423
  457. package/src/hooks/persistent.ts +0 -661
  458. package/src/input/file-indexer.d.ts +0 -11
  459. package/src/input/file-indexer.test.ts +0 -127
  460. package/src/input/mention-enricher.test.ts +0 -85
  461. package/src/prompt/default-system.ts +0 -21
  462. package/src/providers/local-provider-service.test.ts +0 -1062
  463. package/src/runtime/checkpoint-hooks.test.ts +0 -168
  464. package/src/runtime/hook-file-hooks.test.ts +0 -311
  465. package/src/runtime/runtime-builder.team-persistence.test.ts +0 -242
  466. package/src/runtime/runtime-builder.test.ts +0 -616
  467. package/src/runtime/runtime-parity.test.ts +0 -143
  468. package/src/session/default-session-manager.e2e.test.ts +0 -384
  469. package/src/session/default-session-manager.test.ts +0 -2473
  470. package/src/session/persistence-service.test.ts +0 -241
  471. package/src/session/rpc-runtime-ensure.ts +0 -521
  472. package/src/session/rpc-session-service.ts +0 -107
  473. package/src/session/rpc-spawn-lease.test.ts +0 -49
  474. package/src/session/rpc-spawn-lease.ts +0 -122
  475. package/src/session/runtime-oauth-token-manager.test.ts +0 -137
  476. package/src/session/session-config-builder.ts +0 -172
  477. package/src/session/session-host.test.ts +0 -89
  478. package/src/session/session-host.ts +0 -213
  479. package/src/session/session-manager.ts +0 -74
  480. package/src/session/session-service.team-persistence.test.ts +0 -48
  481. package/src/session/sqlite-rpc-session-backend.ts +0 -303
  482. package/src/session/utils/helpers.test.ts +0 -160
  483. package/src/storage/artifact-store.ts +0 -1
  484. package/src/storage/provider-settings-legacy-migration.test.ts +0 -424
  485. package/src/storage/provider-settings-manager.test.ts +0 -191
  486. package/src/storage/session-store.ts +0 -1
  487. package/src/team/multi-agent.lifecycle.test.ts +0 -201
  488. package/src/team/spawn-agent-tool.test.ts +0 -387
  489. package/src/team/team-tools.test.ts +0 -906
  490. package/src/telemetry/OpenTelemetryAdapter.test.ts +0 -157
  491. package/src/telemetry/OpenTelemetryProvider.test.ts +0 -326
  492. package/src/telemetry/TelemetryLoggerSink.test.ts +0 -42
  493. package/src/telemetry/TelemetryService.test.ts +0 -134
  494. package/src/telemetry/distinct-id.test.ts +0 -57
  495. package/src/tools/definitions.test.ts +0 -780
  496. package/src/tools/executors/bash.test.ts +0 -87
  497. package/src/tools/executors/editor.test.ts +0 -35
  498. package/src/tools/executors/file-read.test.ts +0 -49
  499. package/src/tools/model-tool-routing.test.ts +0 -86
  500. package/src/tools/presets.test.ts +0 -70
  501. /package/dist/{tools → extensions/tools}/constants.d.ts +0 -0
  502. /package/dist/{tools → extensions/tools}/executors/apply-patch-parser.d.ts +0 -0
  503. /package/dist/{tools → extensions/tools}/executors/bash.d.ts +0 -0
  504. /package/dist/{tools → extensions/tools}/executors/editor.d.ts +0 -0
  505. /package/dist/{tools → extensions/tools}/executors/file-read.d.ts +0 -0
  506. /package/dist/{tools → extensions/tools}/executors/index.d.ts +0 -0
  507. /package/dist/{tools → extensions/tools}/executors/web-fetch.d.ts +0 -0
  508. /package/dist/{tools → extensions/tools}/helpers.d.ts +0 -0
  509. /package/dist/{tools → extensions/tools}/schemas.d.ts +0 -0
  510. /package/dist/{team → extensions/tools/team}/delegated-agent.d.ts +0 -0
  511. /package/dist/{team → extensions/tools/team}/index.d.ts +0 -0
  512. /package/dist/{team → extensions/tools/team}/projections.d.ts +0 -0
  513. /package/dist/{team → extensions/tools/team}/runtime.d.ts +0 -0
  514. /package/dist/{team → extensions/tools/team}/subagent-prompts.d.ts +0 -0
  515. /package/dist/{telemetry → services/telemetry}/ITelemetryAdapter.d.ts +0 -0
  516. /package/dist/{telemetry → services/telemetry}/OpenTelemetryAdapter.d.ts +0 -0
  517. /package/dist/{telemetry → services/telemetry}/OpenTelemetryProvider.d.ts +0 -0
  518. /package/dist/{telemetry → services/telemetry}/TelemetryLoggerSink.d.ts +0 -0
  519. /package/dist/{telemetry → services/telemetry}/TelemetryService.d.ts +0 -0
  520. /package/dist/{telemetry → services/telemetry}/core-events.d.ts +0 -0
  521. /package/dist/{telemetry → services/telemetry}/distinct-id.d.ts +0 -0
  522. /package/dist/{telemetry → services/telemetry}/index.d.ts +0 -0
  523. /package/dist/{input → services/workspace}/file-indexer.d.ts +0 -0
  524. /package/dist/{input → services/workspace}/index.d.ts +0 -0
  525. /package/dist/{input → services/workspace}/mention-enricher.d.ts +0 -0
  526. /package/src/{tools → extensions/tools}/constants.ts +0 -0
  527. /package/src/{tools → extensions/tools}/executors/apply-patch-parser.ts +0 -0
  528. /package/src/{tools → extensions/tools}/executors/bash.ts +0 -0
  529. /package/src/{tools → extensions/tools}/executors/editor.ts +0 -0
  530. /package/src/{tools → extensions/tools}/executors/index.ts +0 -0
  531. /package/src/{tools → extensions/tools}/executors/web-fetch.ts +0 -0
  532. /package/src/{tools → extensions/tools}/helpers.ts +0 -0
  533. /package/src/{team → extensions/tools/team}/delegated-agent.ts +0 -0
  534. /package/src/{team → extensions/tools/team}/index.ts +0 -0
  535. /package/src/{team → extensions/tools/team}/projections.ts +0 -0
  536. /package/src/{team → extensions/tools/team}/runtime.ts +0 -0
  537. /package/src/{storage → services/storage}/index.ts +0 -0
  538. /package/src/{telemetry → services/telemetry}/ITelemetryAdapter.ts +0 -0
  539. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.ts +0 -0
  540. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.ts +0 -0
  541. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.ts +0 -0
  542. /package/src/{telemetry → services/telemetry}/TelemetryService.ts +0 -0
  543. /package/src/{telemetry → services/telemetry}/core-events.ts +0 -0
  544. /package/src/{telemetry → services/telemetry}/distinct-id.ts +0 -0
  545. /package/src/{telemetry → services/telemetry}/index.ts +0 -0
  546. /package/src/{input → services/workspace}/index.ts +0 -0
@@ -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,72 @@ 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
+ RuntimeHostSubscribeOptions,
33
+ SendSessionInput,
34
+ SessionAccumulatedUsage,
35
+ StartSessionInput,
36
+ StartSessionResult,
37
+ } from "../runtime/runtime-host";
50
38
  import {
51
39
  OAuthReauthRequiredError,
52
40
  type RuntimeOAuthResolution,
53
41
  RuntimeOAuthTokenManager,
54
- } from "./runtime-oauth-token-manager";
42
+ } from "../runtime/runtime-oauth-token-manager";
43
+ import type { RuntimeBuilder } from "../runtime/session-runtime";
55
44
  import {
56
45
  type AgentEventContext,
57
46
  buildTelemetryAgentIdentity,
58
47
  extractAgentEventMetadata,
59
48
  handleAgentEvent,
60
- } from "./session-agent-events";
61
- import { nowIso } from "./session-artifacts";
49
+ } from "../services/agent-events";
50
+ import { resolveWorkspacePath } from "../services/config";
51
+ import { filterDisabledTools } from "../services/global-settings";
52
+ import { prepareLocalRuntimeBootstrap } from "../services/local-runtime-bootstrap";
53
+ import { nowIso } from "../services/session-artifacts";
62
54
  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";
55
+ toSessionRecord,
56
+ withLatestAssistantTurnMetadata,
57
+ } from "../services/session-data";
58
+ import {
59
+ emitMentionTelemetry,
60
+ emitSessionCreationTelemetry,
61
+ } from "../services/session-telemetry";
62
+ import { ProviderSettingsManager } from "../services/storage/provider-settings-manager";
63
+ import {
64
+ captureAgentCreated,
65
+ captureAgentTeamCreated,
66
+ captureConversationTurnEvent,
67
+ captureModeSwitch,
68
+ captureSubagentExecution,
69
+ captureTaskCompleted,
70
+ } from "../services/telemetry/core-events";
71
+ import { resolveCoreDistinctId } from "../services/telemetry/distinct-id";
72
+ import {
73
+ accumulateUsageTotals,
74
+ createInitialAccumulatedUsage,
75
+ } from "../services/usage";
76
+ import { enrichPromptWithMentions } from "../services/workspace";
77
+ import type { FileSessionService } from "../session/file-session-service";
75
78
  import {
76
79
  type SessionManifest,
77
80
  SessionManifestSchema,
78
- } from "./session-manifest";
81
+ } from "../session/session-manifest";
82
+ import type { SessionRow } from "../session/session-row";
79
83
  import type {
80
84
  CoreSessionService,
81
85
  RootSessionArtifacts,
82
- SessionRow,
83
- } from "./session-service";
86
+ } from "../session/session-service";
84
87
  import {
85
88
  buildTeamRunContinuationPrompt,
86
89
  dispatchTeamEventToBackend,
@@ -91,26 +94,20 @@ import {
91
94
  shouldAutoContinueTeamRuns,
92
95
  trackTeamRunState,
93
96
  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";
97
+ } from "../session/session-team-coordination";
98
+ import { SessionSource, type SessionStatus } from "../types/common";
99
+ import type { CoreSessionConfig } from "../types/config";
100
+ import type { CoreSessionEvent } from "../types/events";
101
+ import type { ActiveSession, PreparedTurnInput } from "../types/session";
102
+ import type { SessionRecord } from "../types/sessions";
104
103
  import {
105
- accumulateUsageTotals,
106
- createInitialAccumulatedUsage,
107
- } from "./utils/usage";
108
- import { buildWorkspaceMetadata } from "./workspace-manifest";
104
+ cloneAccumulatedUsage,
105
+ RuntimeHostEventBus,
106
+ readPersistedMessagesFile,
107
+ replaySubagentHookEvent,
108
+ } from "./runtime-host-support";
109
109
 
110
- type SessionBackend =
111
- | CoreSessionService
112
- | RpcCoreSessionService
113
- | FileSessionService;
110
+ type SessionBackend = CoreSessionService | FileSessionService;
114
111
 
115
112
  const MAX_SCAN_LIMIT = 5000;
116
113
  const MAX_USER_FILE_BYTES = 20 * 1_000 * 1_024;
@@ -130,7 +127,52 @@ async function loadUserFileContent(path: string): Promise<string> {
130
127
  return content;
131
128
  }
132
129
 
133
- export interface DefaultSessionManagerOptions {
130
+ function toActiveSessionRecord(session: ActiveSession): SessionRecord {
131
+ return {
132
+ sessionId: session.sessionId,
133
+ source: session.source,
134
+ pid: process.pid,
135
+ startedAt: session.startedAt,
136
+ endedAt: null,
137
+ exitCode: null,
138
+ status: "running",
139
+ interactive: session.interactive,
140
+ provider: session.config.providerId,
141
+ model: session.config.modelId,
142
+ cwd: session.config.cwd,
143
+ workspaceRoot: resolveWorkspacePath(session.config),
144
+ teamName: session.config.teamName?.trim() || undefined,
145
+ enableTools: session.config.enableTools,
146
+ enableSpawn: session.config.enableSpawnAgent,
147
+ enableTeams: session.config.enableAgentTeams,
148
+ parentSessionId:
149
+ typeof session.sessionMetadata?.parentSessionId === "string"
150
+ ? session.sessionMetadata.parentSessionId
151
+ : undefined,
152
+ parentAgentId:
153
+ typeof session.sessionMetadata?.parentAgentId === "string"
154
+ ? session.sessionMetadata.parentAgentId
155
+ : undefined,
156
+ agentId:
157
+ typeof session.sessionMetadata?.agentId === "string"
158
+ ? session.sessionMetadata.agentId
159
+ : undefined,
160
+ conversationId:
161
+ typeof session.sessionMetadata?.conversationId === "string"
162
+ ? session.sessionMetadata.conversationId
163
+ : undefined,
164
+ isSubagent:
165
+ typeof session.sessionMetadata?.isSubagent === "boolean"
166
+ ? session.sessionMetadata.isSubagent
167
+ : false,
168
+ prompt: session.pendingPrompt,
169
+ metadata: session.sessionMetadata,
170
+ messagesPath: session.artifacts?.messagesPath,
171
+ updatedAt: session.startedAt,
172
+ };
173
+ }
174
+
175
+ export interface LocalRuntimeHostOptions {
134
176
  distinctId?: string;
135
177
  sessionService: SessionBackend;
136
178
  runtimeBuilder?: RuntimeBuilder;
@@ -143,9 +185,16 @@ export interface DefaultSessionManagerOptions {
143
185
  requestToolApproval?: (
144
186
  request: ToolApprovalRequest,
145
187
  ) => Promise<ToolApprovalResult>;
188
+ /**
189
+ * Default custom `fetch` implementation threaded into every
190
+ * `ProviderConfig.fetch` built during local session bootstrap. Used by
191
+ * the AI gateway providers when issuing HTTP requests.
192
+ */
193
+ fetch?: typeof fetch;
146
194
  }
147
195
 
148
- export class DefaultSessionManager implements SessionManager {
196
+ export class LocalRuntimeHost implements RuntimeHost {
197
+ public readonly runtimeAddress = undefined;
149
198
  private readonly sessionService: SessionBackend;
150
199
  private readonly runtimeBuilder: RuntimeBuilder;
151
200
  private readonly createAgentInstance: (config: AgentConfig) => Agent;
@@ -154,10 +203,11 @@ export class DefaultSessionManager implements SessionManager {
154
203
  private readonly providerSettingsManager: ProviderSettingsManager;
155
204
  private readonly oauthTokenManager: RuntimeOAuthTokenManager;
156
205
  private readonly defaultTelemetry?: ITelemetryService;
206
+ private readonly defaultFetch?: typeof fetch;
157
207
  private readonly defaultRequestToolApproval?: (
158
208
  request: ToolApprovalRequest,
159
209
  ) => Promise<ToolApprovalResult>;
160
- private readonly listeners = new Set<(event: CoreSessionEvent) => void>();
210
+ private readonly events = new RuntimeHostEventBus();
161
211
  private readonly sessions = new Map<string, ActiveSession>();
162
212
  private readonly usageBySession = new Map<string, SessionAccumulatedUsage>();
163
213
  private readonly subAgentStarts = new Map<
@@ -165,7 +215,7 @@ export class DefaultSessionManager implements SessionManager {
165
215
  { startedAt: number; rootSessionId: string }
166
216
  >();
167
217
 
168
- constructor(options: DefaultSessionManagerOptions) {
218
+ constructor(options: LocalRuntimeHostOptions) {
169
219
  const homeDir = homedir();
170
220
  if (homeDir) setHomeDirIfUnset(homeDir);
171
221
  const distinctId = resolveCoreDistinctId(options.distinctId);
@@ -185,6 +235,7 @@ export class DefaultSessionManager implements SessionManager {
185
235
  });
186
236
  this.defaultTelemetry = options.telemetry;
187
237
  this.defaultTelemetry?.setDistinctId(distinctId);
238
+ this.defaultFetch = options.fetch;
188
239
  this.defaultRequestToolApproval = options.requestToolApproval;
189
240
  }
190
241
 
@@ -195,21 +246,7 @@ export class DefaultSessionManager implements SessionManager {
195
246
  const startedAt = nowIso();
196
247
  const requestedSessionId = input.config.sessionId?.trim() ?? "";
197
248
  const sessionId = requestedSessionId || createSessionId();
198
- const resumedRow = requestedSessionId
199
- ? await this.getRow(sessionId)
200
- : undefined;
201
- const startInput: StartSessionInput =
202
- resumedRow &&
203
- !input.config.teamName?.trim() &&
204
- resumedRow.teamName?.trim()
205
- ? {
206
- ...input,
207
- config: {
208
- ...input.config,
209
- teamName: resumedRow.teamName,
210
- },
211
- }
212
- : input;
249
+ const startInput: StartSessionInput = input;
213
250
  this.usageBySession.set(sessionId, createInitialAccumulatedUsage());
214
251
 
215
252
  const sessionsDir =
@@ -223,8 +260,6 @@ export class DefaultSessionManager implements SessionManager {
223
260
  }
224
261
 
225
262
  const sessionDir = join(sessionsDir, sessionId);
226
- const transcriptPath = join(sessionDir, `${sessionId}.log`);
227
- const hookPath = join(sessionDir, `${sessionId}.hooks.jsonl`);
228
263
  const messagesPath = join(sessionDir, `${sessionId}.messages.json`);
229
264
  const manifestPath = join(sessionDir, `${sessionId}.json`);
230
265
  const workspacePath = resolveWorkspacePath(input.config);
@@ -249,64 +284,39 @@ export class DefaultSessionManager implements SessionManager {
249
284
  messages_path: messagesPath,
250
285
  });
251
286
 
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,
287
+ const sessionToolExecutors =
288
+ input.localRuntime?.defaultToolExecutors ?? this.defaultToolExecutors;
289
+ let bootstrap!: Awaited<ReturnType<typeof prepareLocalRuntimeBootstrap>>;
290
+ bootstrap = await prepareLocalRuntimeBootstrap({
291
+ input: startInput,
292
+ localRuntime: input.localRuntime,
293
+ sessionId,
294
+ providerSettingsManager: this.providerSettingsManager,
295
+ defaultTelemetry: this.defaultTelemetry,
296
+ defaultToolExecutors: sessionToolExecutors,
297
+ defaultToolPolicies: this.defaultToolPolicies,
298
+ defaultRequestToolApproval: this.defaultRequestToolApproval,
299
+ defaultFetch: this.defaultFetch,
300
+ onPluginEvent: (event) => void this.handlePluginEvent(sessionId, event),
298
301
  onTeamEvent: (event: TeamEvent) => {
299
302
  void this.handleTeamEvent(sessionId, event);
300
- configWithProvider.onTeamEvent?.(event);
303
+ bootstrap.config.onTeamEvent?.(event);
301
304
  },
302
305
  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,
306
+ this.createSpawnTool(bootstrap.config, sessionId, sessionToolExecutors),
307
+ readSessionMetadata: async () =>
308
+ (await this.get(sessionId))?.metadata as
309
+ | Record<string, unknown>
310
+ | undefined,
311
+ writeSessionMetadata: async (metadata) => {
312
+ await this.persistSessionMetadata(sessionId, () => metadata);
313
+ },
309
314
  });
315
+ const runtime = await this.runtimeBuilder.build(
316
+ bootstrap.runtimeBuilderInput,
317
+ );
318
+ const configWithProvider = bootstrap.config;
319
+ const providerConfig = bootstrap.providerConfig;
310
320
  if (runtime.teamRuntime && !configWithProvider.teamName?.trim()) {
311
321
  configWithProvider.teamName = runtime.teamRuntime.getTeamName();
312
322
  }
@@ -329,14 +339,13 @@ export class DefaultSessionManager implements SessionManager {
329
339
  execution: configWithProvider.execution,
330
340
  prepareTurn: createContextCompactionPrepareTurn(configWithProvider),
331
341
  tools,
332
- hooks: configWithProvider.hooks,
333
- extensions: effectiveConfig.extensions,
342
+ hooks: bootstrap.hooks,
343
+ extensions: bootstrap.extensions,
334
344
  hookErrorMode: configWithProvider.hookErrorMode,
335
- initialMessages: input.initialMessages,
345
+ initialMessages: bootstrap.effectiveInput.initialMessages,
336
346
  userFileContentLoader: loadUserFileContent,
337
- toolPolicies: input.toolPolicies ?? this.defaultToolPolicies,
338
- requestToolApproval:
339
- input.requestToolApproval ?? this.defaultRequestToolApproval,
347
+ toolPolicies: bootstrap.toolPolicies,
348
+ requestToolApproval: bootstrap.requestToolApproval,
340
349
  onConsecutiveMistakeLimitReached:
341
350
  configWithProvider.onConsecutiveMistakeLimitReached,
342
351
  completionGuard: runtime.completionGuard,
@@ -384,6 +393,7 @@ export class DefaultSessionManager implements SessionManager {
384
393
  const active: ActiveSession = {
385
394
  sessionId,
386
395
  config: configWithProvider,
396
+ sessionMetadata: startInput.sessionMetadata,
387
397
  source,
388
398
  startedAt,
389
399
  pendingPrompt: manifest.prompt,
@@ -398,7 +408,7 @@ export class DefaultSessionManager implements SessionManager {
398
408
  teamRunWaiters: [],
399
409
  pendingPrompts: [],
400
410
  drainingPendingPrompts: false,
401
- pluginSandboxShutdown,
411
+ pluginSandboxShutdown: bootstrap.pluginSandboxShutdown,
402
412
  };
403
413
  this.sessions.set(sessionId, active);
404
414
  this.emitStatus(sessionId, "running");
@@ -424,8 +434,6 @@ export class DefaultSessionManager implements SessionManager {
424
434
  sessionId,
425
435
  manifest,
426
436
  manifestPath,
427
- transcriptPath,
428
- hookPath,
429
437
  messagesPath,
430
438
  result,
431
439
  };
@@ -433,6 +441,18 @@ export class DefaultSessionManager implements SessionManager {
433
441
 
434
442
  async send(input: SendSessionInput): Promise<AgentResult | undefined> {
435
443
  const session = this.getSessionOrThrow(input.sessionId);
444
+ const canStartRun =
445
+ typeof (session.agent as Agent & { canStartRun?: () => boolean })
446
+ .canStartRun === "function"
447
+ ? (
448
+ session.agent as Agent & {
449
+ canStartRun: () => boolean;
450
+ }
451
+ ).canStartRun()
452
+ : true;
453
+ const delivery =
454
+ input.delivery ??
455
+ (session.interactive && !canStartRun ? ("queue" as const) : undefined);
436
456
  session.config.telemetry?.capture({
437
457
  event: "session.input_sent",
438
458
  properties: {
@@ -440,13 +460,13 @@ export class DefaultSessionManager implements SessionManager {
440
460
  promptLength: input.prompt.length,
441
461
  userImageCount: input.userImages?.length ?? 0,
442
462
  userFileCount: input.userFiles?.length ?? 0,
443
- delivery: input.delivery ?? "immediate",
463
+ delivery: delivery ?? "immediate",
444
464
  },
445
465
  });
446
- if (input.delivery === "queue" || input.delivery === "steer") {
466
+ if (delivery === "queue" || delivery === "steer") {
447
467
  this.enqueuePendingPrompt(input.sessionId, {
448
468
  prompt: input.prompt,
449
- delivery: input.delivery,
469
+ delivery,
450
470
  userImages: input.userImages,
451
471
  userFiles: input.userFiles,
452
472
  });
@@ -474,8 +494,7 @@ export class DefaultSessionManager implements SessionManager {
474
494
  async getAccumulatedUsage(
475
495
  sessionId: string,
476
496
  ): Promise<SessionAccumulatedUsage | undefined> {
477
- const usage = this.usageBySession.get(sessionId);
478
- return usage ? { ...usage } : undefined;
497
+ return cloneAccumulatedUsage(this.usageBySession.get(sessionId));
479
498
  }
480
499
 
481
500
  async abort(sessionId: string, reason?: unknown): Promise<void> {
@@ -486,6 +505,10 @@ export class DefaultSessionManager implements SessionManager {
486
505
  properties: { sessionId },
487
506
  });
488
507
  session.aborting = true;
508
+ if (session.pendingPrompts.length > 0) {
509
+ session.pendingPrompts.length = 0;
510
+ this.emitPendingPrompts(session);
511
+ }
489
512
  (
490
513
  session.agent as Agent & {
491
514
  abort: (abortReason?: unknown) => void;
@@ -532,13 +555,25 @@ export class DefaultSessionManager implements SessionManager {
532
555
  }
533
556
 
534
557
  async get(sessionId: string): Promise<SessionRecord | undefined> {
558
+ const active = this.sessions.get(sessionId);
559
+ if (active) {
560
+ return toActiveSessionRecord(active);
561
+ }
535
562
  const row = await this.getRow(sessionId);
536
563
  return row ? toSessionRecord(row) : undefined;
537
564
  }
538
565
 
539
566
  async list(limit = 200): Promise<SessionRecord[]> {
540
567
  const rows = await this.listRows(limit);
541
- return rows.map(toSessionRecord);
568
+ const persisted = rows.map(toSessionRecord);
569
+ const seen = new Set(persisted.map((row) => row.sessionId));
570
+ for (const active of this.sessions.values()) {
571
+ if (seen.has(active.sessionId)) {
572
+ continue;
573
+ }
574
+ persisted.unshift(toActiveSessionRecord(active));
575
+ }
576
+ return persisted.slice(0, limit);
542
577
  }
543
578
 
544
579
  async delete(sessionId: string): Promise<boolean> {
@@ -555,55 +590,52 @@ export class DefaultSessionManager implements SessionManager {
555
590
  return result.deleted;
556
591
  }
557
592
 
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;
593
+ async update(
594
+ sessionId: string,
595
+ updates: {
596
+ prompt?: string | null;
597
+ metadata?: Record<string, unknown> | null;
598
+ title?: string | null;
599
+ },
600
+ ): Promise<{ updated: boolean }> {
601
+ const result = await this.invokeOptionalValue<{ updated?: boolean }>(
602
+ "updateSession",
603
+ {
604
+ sessionId,
605
+ prompt: updates.prompt,
606
+ metadata: updates.metadata,
607
+ title: updates.title,
608
+ },
609
+ );
610
+ return { updated: result?.updated === true };
566
611
  }
567
612
 
568
613
  async readMessages(sessionId: string): Promise<LlmsProviders.Message[]> {
569
614
  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
- }
615
+ return readPersistedMessagesFile(row?.messagesPath);
585
616
  }
586
617
 
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
- }
618
+ async handleHookEvent(payload: HookEventPayload): Promise<void> {
619
+ await replaySubagentHookEvent(payload, {
620
+ queueSpawnRequest: (event: HookEventPayload) =>
621
+ this.invokeOptional("queueSpawnRequest", event),
622
+ upsertSubagentSessionFromHook: (event: HookEventPayload) =>
623
+ this.invokeOptionalValue<string | undefined>(
624
+ "upsertSubagentSessionFromHook",
625
+ event,
626
+ ),
627
+ appendSubagentHookAudit: (sessionId: string, event: HookEventPayload) =>
628
+ this.invokeOptional("appendSubagentHookAudit", sessionId, event),
629
+ applySubagentStatus: (sessionId: string, event: HookEventPayload) =>
630
+ this.invokeOptional("applySubagentStatus", sessionId, event),
599
631
  });
600
632
  }
601
633
 
602
- subscribe(listener: (event: CoreSessionEvent) => void): () => void {
603
- this.listeners.add(listener);
604
- return () => {
605
- this.listeners.delete(listener);
606
- };
634
+ subscribe(
635
+ listener: (event: CoreSessionEvent) => void,
636
+ options?: RuntimeHostSubscribeOptions,
637
+ ): () => void {
638
+ return this.events.subscribe(listener, options);
607
639
  }
608
640
 
609
641
  async updateSessionModel(sessionId: string, modelId: string): Promise<void> {
@@ -796,6 +828,7 @@ export class DefaultSessionManager implements SessionManager {
796
828
  enableSpawn: session.config.enableSpawnAgent,
797
829
  enableTeams: session.config.enableAgentTeams,
798
830
  prompt: session.pendingPrompt,
831
+ metadata: session.sessionMetadata,
799
832
  startedAt: session.startedAt,
800
833
  })) as RootSessionArtifacts;
801
834
  }
@@ -875,12 +908,39 @@ export class DefaultSessionManager implements SessionManager {
875
908
  }
876
909
  notifyTeamRunWaiters(session);
877
910
 
911
+ const cleanupErrors: unknown[] = [];
912
+ const recordCleanupError = (stage: string, error: unknown) => {
913
+ cleanupErrors.push(error);
914
+ session.config.logger?.log("Session shutdown cleanup failed", {
915
+ sessionId: session.sessionId,
916
+ stage,
917
+ error,
918
+ severity: "warn",
919
+ });
920
+ };
921
+
878
922
  if (session.artifacts) {
879
- await this.updateStatus(session, input.status, input.exitCode);
880
- await session.agent.shutdown(input.shutdownReason);
923
+ try {
924
+ await this.updateStatus(session, input.status, input.exitCode);
925
+ } catch (error) {
926
+ recordCleanupError("update_status", error);
927
+ }
928
+ try {
929
+ await session.agent.shutdown(input.shutdownReason);
930
+ } catch (error) {
931
+ recordCleanupError("agent_shutdown", error);
932
+ }
933
+ }
934
+ try {
935
+ await Promise.resolve(session.runtime.shutdown(input.shutdownReason));
936
+ } catch (error) {
937
+ recordCleanupError("runtime_shutdown", error);
938
+ }
939
+ try {
940
+ await session.pluginSandboxShutdown?.();
941
+ } catch (error) {
942
+ recordCleanupError("plugin_sandbox_shutdown", error);
881
943
  }
882
- await Promise.resolve(session.runtime.shutdown(input.shutdownReason));
883
- await session.pluginSandboxShutdown?.();
884
944
  this.sessions.delete(session.sessionId);
885
945
  this.emit({
886
946
  type: "ended",
@@ -890,6 +950,9 @@ export class DefaultSessionManager implements SessionManager {
890
950
  ts: Date.now(),
891
951
  },
892
952
  });
953
+ if (cleanupErrors.length > 0 && input.status === "failed") {
954
+ throw cleanupErrors[0];
955
+ }
893
956
  }
894
957
 
895
958
  private async updateStatus(
@@ -992,7 +1055,7 @@ export class DefaultSessionManager implements SessionManager {
992
1055
  },
993
1056
  ): void {
994
1057
  const session = this.sessions.get(sessionId);
995
- if (!session) {
1058
+ if (!session || session.aborting) {
996
1059
  return;
997
1060
  }
998
1061
  const { prompt, delivery, userImages, userFiles } = entry;
@@ -1041,7 +1104,7 @@ export class DefaultSessionManager implements SessionManager {
1041
1104
 
1042
1105
  private async drainPendingPrompts(sessionId: string): Promise<void> {
1043
1106
  const session = this.sessions.get(sessionId);
1044
- if (!session || session.drainingPendingPrompts) {
1107
+ if (!session || session.aborting || session.drainingPendingPrompts) {
1045
1108
  return;
1046
1109
  }
1047
1110
  const canStartRun =
@@ -1173,6 +1236,7 @@ export class DefaultSessionManager implements SessionManager {
1173
1236
  private createSpawnTool(
1174
1237
  config: CoreSessionConfig,
1175
1238
  rootSessionId: string,
1239
+ toolExecutors?: Partial<ToolExecutors>,
1176
1240
  ): Tool {
1177
1241
  const createSubAgentTools = () => {
1178
1242
  const tools: Tool[] = config.enableTools
@@ -1181,16 +1245,15 @@ export class DefaultSessionManager implements SessionManager {
1181
1245
  ...ToolPresets[
1182
1246
  resolveToolPresetName({
1183
1247
  mode: config.mode,
1184
- yolo: config.yolo,
1185
1248
  })
1186
1249
  ],
1187
- executors: this.defaultToolExecutors,
1250
+ executors: toolExecutors,
1188
1251
  })
1189
1252
  : [];
1190
1253
  if (config.enableSpawnAgent) {
1191
- tools.push(this.createSpawnTool(config, rootSessionId));
1254
+ tools.push(this.createSpawnTool(config, rootSessionId, toolExecutors));
1192
1255
  }
1193
- return tools;
1256
+ return filterDisabledTools(tools);
1194
1257
  };
1195
1258
 
1196
1259
  return createSpawnAgentTool({
@@ -1464,7 +1527,7 @@ export class DefaultSessionManager implements SessionManager {
1464
1527
  }
1465
1528
 
1466
1529
  private emit(event: CoreSessionEvent): void {
1467
- for (const listener of this.listeners) listener(event);
1530
+ this.events.emit(event);
1468
1531
  }
1469
1532
 
1470
1533
  private async listRows(limit: number): Promise<SessionRow[]> {