@clinebot/core 0.0.35 → 0.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/README.md +1 -2
  2. package/dist/ClineCore.d.ts +362 -39
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/account/cline-account-service.d.ts.map +1 -1
  5. package/dist/account/index.d.ts +1 -1
  6. package/dist/account/index.d.ts.map +1 -1
  7. package/dist/account/rpc.d.ts +6 -6
  8. package/dist/account/rpc.d.ts.map +1 -1
  9. package/dist/cron/cron-event-ingress.d.ts +38 -0
  10. package/dist/cron/cron-event-ingress.d.ts.map +1 -0
  11. package/dist/cron/cron-materializer.d.ts +36 -0
  12. package/dist/cron/cron-materializer.d.ts.map +1 -0
  13. package/dist/cron/cron-reconciler.d.ts +62 -0
  14. package/dist/cron/cron-reconciler.d.ts.map +1 -0
  15. package/dist/cron/cron-report-writer.d.ts +41 -0
  16. package/dist/cron/cron-report-writer.d.ts.map +1 -0
  17. package/dist/cron/cron-runner.d.ts +43 -0
  18. package/dist/cron/cron-runner.d.ts.map +1 -0
  19. package/dist/cron/cron-schema.d.ts +3 -0
  20. package/dist/cron/cron-schema.d.ts.map +1 -0
  21. package/dist/cron/cron-service.d.ts +57 -0
  22. package/dist/cron/cron-service.d.ts.map +1 -0
  23. package/dist/cron/cron-spec-parser.d.ts +27 -0
  24. package/dist/cron/cron-spec-parser.d.ts.map +1 -0
  25. package/dist/cron/cron-watcher.d.ts +23 -0
  26. package/dist/cron/cron-watcher.d.ts.map +1 -0
  27. package/dist/cron/resource-limiter.d.ts +9 -0
  28. package/dist/cron/resource-limiter.d.ts.map +1 -0
  29. package/dist/cron/schedule-command-service.d.ts +10 -0
  30. package/dist/cron/schedule-command-service.d.ts.map +1 -0
  31. package/dist/cron/schedule-service.d.ts +100 -0
  32. package/dist/cron/schedule-service.d.ts.map +1 -0
  33. package/dist/cron/scheduler.d.ts +68 -0
  34. package/dist/cron/scheduler.d.ts.map +1 -0
  35. package/dist/cron/sqlite-cron-store.d.ts +230 -0
  36. package/dist/cron/sqlite-cron-store.d.ts.map +1 -0
  37. package/dist/cron/sqlite-schedule-store.d.ts +52 -0
  38. package/dist/cron/sqlite-schedule-store.d.ts.map +1 -0
  39. package/dist/extensions/config/agent-config-loader.d.ts +4 -3
  40. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  41. package/dist/extensions/config/runtime-commands.d.ts +1 -0
  42. package/dist/extensions/config/runtime-commands.d.ts.map +1 -1
  43. package/dist/extensions/config/user-instruction-config-loader.d.ts +1 -0
  44. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  45. package/dist/extensions/context/agentic-compaction.d.ts +2 -2
  46. package/dist/extensions/context/agentic-compaction.d.ts.map +1 -1
  47. package/dist/extensions/context/compaction-shared.d.ts +5 -4
  48. package/dist/extensions/context/compaction-shared.d.ts.map +1 -1
  49. package/dist/extensions/context/compaction.d.ts.map +1 -1
  50. package/dist/extensions/plugin/plugin-config-loader.d.ts +15 -2
  51. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  52. package/dist/extensions/plugin/plugin-loader.d.ts +13 -7
  53. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  54. package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -1
  55. package/dist/extensions/plugin/plugin-sandbox.d.ts +21 -2
  56. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  57. package/dist/extensions/plugin/plugin-targeting.d.ts +7 -0
  58. package/dist/extensions/plugin/plugin-targeting.d.ts.map +1 -0
  59. package/dist/extensions/plugin-sandbox-bootstrap.js +237 -276
  60. package/dist/extensions/tools/constants.d.ts +1 -0
  61. package/dist/extensions/tools/constants.d.ts.map +1 -1
  62. package/dist/extensions/tools/definitions.d.ts +3 -4
  63. package/dist/extensions/tools/definitions.d.ts.map +1 -1
  64. package/dist/extensions/tools/executors/apply-patch.d.ts +3 -1
  65. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -1
  66. package/dist/extensions/tools/executors/editor.d.ts.map +1 -1
  67. package/dist/extensions/tools/executors/search.d.ts +1 -1
  68. package/dist/extensions/tools/executors/search.d.ts.map +1 -1
  69. package/dist/extensions/tools/helpers.d.ts +1 -0
  70. package/dist/extensions/tools/helpers.d.ts.map +1 -1
  71. package/dist/extensions/tools/index.d.ts +3 -2
  72. package/dist/extensions/tools/index.d.ts.map +1 -1
  73. package/dist/extensions/tools/presets.d.ts +27 -44
  74. package/dist/extensions/tools/presets.d.ts.map +1 -1
  75. package/dist/extensions/tools/runtime.d.ts +25 -0
  76. package/dist/extensions/tools/runtime.d.ts.map +1 -0
  77. package/dist/extensions/tools/schemas.d.ts +25 -3
  78. package/dist/extensions/tools/schemas.d.ts.map +1 -1
  79. package/dist/extensions/tools/team/delegated-agent.d.ts +2 -2
  80. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -1
  81. package/dist/extensions/tools/team/multi-agent.d.ts +7 -3
  82. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -1
  83. package/dist/extensions/tools/team/team-tools.d.ts +1 -0
  84. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -1
  85. package/dist/extensions/tools/types.d.ts +0 -5
  86. package/dist/extensions/tools/types.d.ts.map +1 -1
  87. package/dist/hooks/hook-bridge.d.ts +118 -0
  88. package/dist/hooks/hook-bridge.d.ts.map +1 -0
  89. package/dist/hooks/hook-file-hooks.d.ts +6 -2
  90. package/dist/hooks/hook-file-hooks.d.ts.map +1 -1
  91. package/dist/hooks/hook-registry.d.ts +16 -0
  92. package/dist/hooks/hook-registry.d.ts.map +1 -0
  93. package/dist/hooks/index.d.ts +0 -1
  94. package/dist/hooks/index.d.ts.map +1 -1
  95. package/dist/hooks/subprocess.d.ts +8 -1
  96. package/dist/hooks/subprocess.d.ts.map +1 -1
  97. package/dist/hub/browser-websocket.d.ts +18 -0
  98. package/dist/hub/browser-websocket.d.ts.map +1 -0
  99. package/dist/hub/client.d.ts +51 -0
  100. package/dist/hub/client.d.ts.map +1 -0
  101. package/dist/hub/connect.d.ts +15 -0
  102. package/dist/hub/connect.d.ts.map +1 -0
  103. package/dist/hub/daemon-entry.d.ts +2 -0
  104. package/dist/hub/daemon-entry.d.ts.map +1 -0
  105. package/dist/hub/daemon-entry.js +1305 -0
  106. package/dist/hub/daemon.d.ts +5 -0
  107. package/dist/hub/daemon.d.ts.map +1 -0
  108. package/dist/hub/defaults.d.ts +17 -0
  109. package/dist/hub/defaults.d.ts.map +1 -0
  110. package/dist/hub/discovery.d.ts +29 -0
  111. package/dist/hub/discovery.d.ts.map +1 -0
  112. package/dist/hub/index.d.ts +15 -0
  113. package/dist/hub/index.d.ts.map +1 -0
  114. package/dist/hub/index.js +1294 -0
  115. package/dist/hub/native-transport.d.ts +17 -0
  116. package/dist/hub/native-transport.d.ts.map +1 -0
  117. package/dist/hub/runtime-handlers.d.ts +11 -0
  118. package/dist/hub/runtime-handlers.d.ts.map +1 -0
  119. package/dist/hub/server.d.ts +104 -0
  120. package/dist/hub/server.d.ts.map +1 -0
  121. package/dist/hub/session-client.d.ts +90 -0
  122. package/dist/hub/session-client.d.ts.map +1 -0
  123. package/dist/hub/start-shared-server.d.ts +19 -0
  124. package/dist/hub/start-shared-server.d.ts.map +1 -0
  125. package/dist/hub/transport.d.ts +8 -0
  126. package/dist/hub/transport.d.ts.map +1 -0
  127. package/dist/hub/ui-client.d.ts +45 -0
  128. package/dist/hub/ui-client.d.ts.map +1 -0
  129. package/dist/hub/workspace.d.ts +4 -0
  130. package/dist/hub/workspace.d.ts.map +1 -0
  131. package/dist/index.d.ts +29 -16
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +782 -471
  134. package/dist/llms/cline-recommended-models.d.ts +20 -0
  135. package/dist/llms/cline-recommended-models.d.ts.map +1 -0
  136. package/dist/llms/configured-provider-registry.d.ts +28 -0
  137. package/dist/llms/configured-provider-registry.d.ts.map +1 -0
  138. package/dist/llms/handler-factory.d.ts +16 -0
  139. package/dist/llms/handler-factory.d.ts.map +1 -0
  140. package/dist/llms/provider-defaults.d.ts +27 -0
  141. package/dist/llms/provider-defaults.d.ts.map +1 -0
  142. package/dist/llms/provider-settings.d.ts +245 -0
  143. package/dist/llms/provider-settings.d.ts.map +1 -0
  144. package/dist/llms/runtime-config.d.ts +4 -0
  145. package/dist/llms/runtime-config.d.ts.map +1 -0
  146. package/dist/llms/runtime-registry.d.ts +20 -0
  147. package/dist/llms/runtime-registry.d.ts.map +1 -0
  148. package/dist/llms/runtime-types.d.ts +85 -0
  149. package/dist/llms/runtime-types.d.ts.map +1 -0
  150. package/dist/runtime/agent-config-adapter.d.ts +148 -0
  151. package/dist/runtime/agent-config-adapter.d.ts.map +1 -0
  152. package/dist/runtime/agent-runtime-config-builder.d.ts +96 -0
  153. package/dist/runtime/agent-runtime-config-builder.d.ts.map +1 -0
  154. package/dist/runtime/history.d.ts +6 -0
  155. package/dist/runtime/history.d.ts.map +1 -1
  156. package/dist/runtime/host.d.ts +1 -2
  157. package/dist/runtime/host.d.ts.map +1 -1
  158. package/dist/runtime/loop-detection.d.ts +59 -0
  159. package/dist/runtime/loop-detection.d.ts.map +1 -0
  160. package/dist/runtime/mistake-tracker.d.ts +69 -0
  161. package/dist/runtime/mistake-tracker.d.ts.map +1 -0
  162. package/dist/runtime/rules.d.ts +1 -0
  163. package/dist/runtime/rules.d.ts.map +1 -1
  164. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  165. package/dist/runtime/runtime-event-adapter.d.ts +102 -0
  166. package/dist/runtime/runtime-event-adapter.d.ts.map +1 -0
  167. package/dist/runtime/runtime-host.d.ts +49 -26
  168. package/dist/runtime/runtime-host.d.ts.map +1 -1
  169. package/dist/runtime/runtime-oauth-token-manager.d.ts.map +1 -1
  170. package/dist/runtime/session-runtime-orchestrator.d.ts +261 -0
  171. package/dist/runtime/session-runtime-orchestrator.d.ts.map +1 -0
  172. package/dist/runtime/session-runtime.d.ts +16 -21
  173. package/dist/runtime/session-runtime.d.ts.map +1 -1
  174. package/dist/runtime/user-input-builder.d.ts +24 -0
  175. package/dist/runtime/user-input-builder.d.ts.map +1 -0
  176. package/dist/services/global-settings.d.ts +12 -0
  177. package/dist/services/global-settings.d.ts.map +1 -0
  178. package/dist/services/index.js +28 -0
  179. package/dist/services/local-runtime-bootstrap.d.ts +9 -3
  180. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -1
  181. package/dist/services/plugin-tools.d.ts +16 -0
  182. package/dist/services/plugin-tools.d.ts.map +1 -0
  183. package/dist/services/providers/local-provider-registry.d.ts +199 -23
  184. package/dist/services/providers/local-provider-registry.d.ts.map +1 -1
  185. package/dist/services/providers/local-provider-service.d.ts +15 -13
  186. package/dist/services/providers/local-provider-service.d.ts.map +1 -1
  187. package/dist/services/session-data.d.ts +1 -1
  188. package/dist/services/session-data.d.ts.map +1 -1
  189. package/dist/services/session-telemetry.d.ts +7 -2
  190. package/dist/services/session-telemetry.d.ts.map +1 -1
  191. package/dist/services/storage/file-team-store.d.ts.map +1 -1
  192. package/dist/services/storage/provider-settings-legacy-migration.d.ts +1 -1
  193. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -1
  194. package/dist/services/storage/provider-settings-manager.d.ts +1 -0
  195. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -1
  196. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -1
  197. package/dist/services/workspace-manifest.d.ts +11 -0
  198. package/dist/services/workspace-manifest.d.ts.map +1 -1
  199. package/dist/session/conversation-store.d.ts +30 -0
  200. package/dist/session/conversation-store.d.ts.map +1 -0
  201. package/dist/session/message-builder.d.ts +65 -0
  202. package/dist/session/message-builder.d.ts.map +1 -0
  203. package/dist/session/persistence-service.d.ts +11 -23
  204. package/dist/session/persistence-service.d.ts.map +1 -1
  205. package/dist/session/session-manifest-store.d.ts +22 -0
  206. package/dist/session/session-manifest-store.d.ts.map +1 -0
  207. package/dist/session/session-manifest.d.ts +1 -1
  208. package/dist/session/session-row.d.ts +93 -0
  209. package/dist/session/session-row.d.ts.map +1 -0
  210. package/dist/session/session-service.d.ts +2 -102
  211. package/dist/session/session-service.d.ts.map +1 -1
  212. package/dist/session/subagent-session-manager.d.ts +36 -0
  213. package/dist/session/subagent-session-manager.d.ts.map +1 -0
  214. package/dist/session/team-persistence-store.d.ts +24 -0
  215. package/dist/session/team-persistence-store.d.ts.map +1 -0
  216. package/dist/transports/hub.d.ts +58 -0
  217. package/dist/transports/hub.d.ts.map +1 -0
  218. package/dist/transports/local.d.ts +23 -9
  219. package/dist/transports/local.d.ts.map +1 -1
  220. package/dist/transports/remote.d.ts +10 -0
  221. package/dist/transports/remote.d.ts.map +1 -0
  222. package/dist/transports/runtime-host-support.d.ts +3 -2
  223. package/dist/transports/runtime-host-support.d.ts.map +1 -1
  224. package/dist/types/chat-schema.d.ts +15 -17
  225. package/dist/types/chat-schema.d.ts.map +1 -1
  226. package/dist/types/config.d.ts +17 -7
  227. package/dist/types/config.d.ts.map +1 -1
  228. package/dist/types/events.d.ts +7 -6
  229. package/dist/types/events.d.ts.map +1 -1
  230. package/dist/types/provider-settings.d.ts +4 -5
  231. package/dist/types/provider-settings.d.ts.map +1 -1
  232. package/dist/types/session.d.ts +7 -3
  233. package/dist/types/session.d.ts.map +1 -1
  234. package/dist/types.d.ts +11 -4
  235. package/dist/types.d.ts.map +1 -1
  236. package/package.json +20 -6
  237. package/src/ClineCore.ts +757 -44
  238. package/src/account/cline-account-service.ts +44 -6
  239. package/src/account/index.ts +3 -3
  240. package/src/account/rpc.ts +12 -12
  241. package/src/cron/cron-event-ingress.ts +357 -0
  242. package/src/cron/cron-materializer.ts +97 -0
  243. package/src/cron/cron-reconciler.ts +241 -0
  244. package/src/cron/cron-report-writer.ts +153 -0
  245. package/src/cron/cron-runner.ts +495 -0
  246. package/src/cron/cron-schema.ts +127 -0
  247. package/src/cron/cron-service.ts +163 -0
  248. package/src/cron/cron-spec-parser.ts +489 -0
  249. package/src/cron/cron-watcher.ts +102 -0
  250. package/src/cron/index.ts +15 -0
  251. package/src/cron/resource-limiter.ts +46 -0
  252. package/src/cron/schedule-command-service.ts +193 -0
  253. package/src/cron/schedule-service.ts +703 -0
  254. package/src/cron/scheduler.ts +772 -0
  255. package/src/cron/sqlite-cron-store.ts +1286 -0
  256. package/src/cron/sqlite-schedule-store.ts +708 -0
  257. package/src/extensions/config/agent-config-loader.ts +17 -7
  258. package/src/extensions/config/runtime-commands.ts +6 -0
  259. package/src/extensions/config/user-instruction-config-loader.ts +1 -0
  260. package/src/extensions/context/agentic-compaction.ts +3 -3
  261. package/src/extensions/context/basic-compaction.ts +2 -2
  262. package/src/extensions/context/compaction-shared.ts +5 -4
  263. package/src/extensions/context/compaction.ts +3 -3
  264. package/src/extensions/plugin/plugin-config-loader.ts +37 -2
  265. package/src/extensions/plugin/plugin-loader.ts +69 -9
  266. package/src/extensions/plugin/plugin-module-import.ts +0 -2
  267. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +243 -39
  268. package/src/extensions/plugin/plugin-sandbox.ts +173 -29
  269. package/src/extensions/plugin/plugin-targeting.ts +32 -0
  270. package/src/extensions/tools/constants.ts +2 -0
  271. package/src/extensions/tools/definitions.ts +61 -71
  272. package/src/extensions/tools/executors/apply-patch.ts +69 -80
  273. package/src/extensions/tools/executors/editor.ts +4 -3
  274. package/src/extensions/tools/executors/search.ts +195 -3
  275. package/src/extensions/tools/helpers.ts +24 -0
  276. package/src/extensions/tools/index.ts +11 -2
  277. package/src/extensions/tools/presets.ts +32 -47
  278. package/src/extensions/tools/runtime.ts +261 -0
  279. package/src/extensions/tools/schemas.ts +17 -20
  280. package/src/extensions/tools/team/delegated-agent.ts +8 -3
  281. package/src/extensions/tools/team/multi-agent.ts +135 -19
  282. package/src/extensions/tools/team/team-tools.ts +172 -91
  283. package/src/extensions/tools/types.ts +0 -6
  284. package/src/hooks/hook-bridge.ts +489 -0
  285. package/src/hooks/hook-file-hooks.ts +66 -5
  286. package/src/hooks/hook-registry.ts +257 -0
  287. package/src/hooks/index.ts +0 -7
  288. package/src/hooks/subprocess-runner.ts +1 -1
  289. package/src/hooks/subprocess.ts +9 -0
  290. package/src/hub/browser-websocket.ts +159 -0
  291. package/src/hub/client.ts +633 -0
  292. package/src/hub/connect.ts +156 -0
  293. package/src/hub/daemon-entry.ts +122 -0
  294. package/src/hub/daemon.ts +284 -0
  295. package/src/hub/defaults.ts +70 -0
  296. package/src/hub/discovery.ts +247 -0
  297. package/src/hub/index.ts +14 -0
  298. package/src/hub/native-transport.ts +31 -0
  299. package/src/hub/runtime-handlers.ts +141 -0
  300. package/src/hub/server.ts +2317 -0
  301. package/src/hub/session-client.ts +502 -0
  302. package/src/hub/start-shared-server.ts +61 -0
  303. package/src/hub/transport.ts +14 -0
  304. package/src/hub/ui-client.ts +126 -0
  305. package/src/hub/workspace.ts +19 -0
  306. package/src/index.ts +169 -68
  307. package/src/llms/cline-recommended-models.ts +167 -0
  308. package/src/llms/configured-provider-registry.ts +193 -0
  309. package/src/llms/handler-factory.ts +56 -0
  310. package/src/llms/provider-defaults.ts +653 -0
  311. package/src/llms/provider-settings.ts +310 -0
  312. package/src/llms/runtime-config.ts +43 -0
  313. package/src/llms/runtime-registry.ts +172 -0
  314. package/src/llms/runtime-types.ts +121 -0
  315. package/src/runtime/agent-config-adapter.ts +636 -0
  316. package/src/runtime/agent-runtime-config-builder.ts +205 -0
  317. package/src/runtime/error-feedback.ts +142 -0
  318. package/src/runtime/history.ts +137 -0
  319. package/src/runtime/host.ts +127 -267
  320. package/src/runtime/index.ts +1 -0
  321. package/src/runtime/loop-detection.ts +162 -0
  322. package/src/runtime/mistake-tracker.ts +221 -0
  323. package/src/runtime/rules.ts +12 -0
  324. package/src/runtime/runtime-builder.ts +85 -13
  325. package/src/runtime/runtime-event-adapter.ts +412 -0
  326. package/src/runtime/runtime-host.ts +134 -62
  327. package/src/runtime/runtime-oauth-token-manager.ts +11 -15
  328. package/src/runtime/session-runtime-orchestrator.ts +1253 -0
  329. package/src/runtime/session-runtime.ts +16 -26
  330. package/src/runtime/user-input-builder.ts +167 -0
  331. package/src/services/global-settings.ts +122 -0
  332. package/src/services/local-runtime-bootstrap.ts +175 -31
  333. package/src/services/plugin-tools.ts +86 -0
  334. package/src/services/providers/local-provider-registry.ts +277 -61
  335. package/src/services/providers/local-provider-service.ts +109 -44
  336. package/src/services/session-data.ts +18 -10
  337. package/src/services/session-telemetry.ts +6 -15
  338. package/src/services/storage/file-team-store.ts +1 -5
  339. package/src/services/storage/provider-settings-legacy-migration.ts +14 -51
  340. package/src/services/storage/provider-settings-manager.ts +17 -2
  341. package/src/services/storage/sqlite-team-store.ts +1 -5
  342. package/src/services/workspace-manifest.ts +18 -0
  343. package/src/session/conversation-store.ts +77 -0
  344. package/src/session/file-session-service.ts +1 -1
  345. package/src/session/index.ts +6 -27
  346. package/src/session/message-builder.ts +941 -0
  347. package/src/session/persistence-service.ts +119 -504
  348. package/src/session/session-manifest-store.ts +158 -0
  349. package/src/session/session-row.ts +199 -0
  350. package/src/session/session-service.ts +17 -376
  351. package/src/session/session-team-coordination.ts +1 -1
  352. package/src/session/subagent-session-manager.ts +397 -0
  353. package/src/session/team-persistence-store.ts +176 -0
  354. package/src/transports/hub.ts +1081 -0
  355. package/src/transports/local.ts +419 -93
  356. package/src/transports/remote.ts +27 -0
  357. package/src/transports/runtime-host-support.ts +63 -9
  358. package/src/types/chat-schema.ts +4 -5
  359. package/src/types/config.ts +17 -7
  360. package/src/types/events.ts +8 -6
  361. package/src/types/index.ts +3 -0
  362. package/src/types/provider-settings.ts +18 -7
  363. package/src/types/session.ts +7 -6
  364. package/src/types.ts +42 -2
  365. package/dist/hooks/persistent.d.ts +0 -64
  366. package/dist/hooks/persistent.d.ts.map +0 -1
  367. package/dist/runtime/rpc-runtime-ensure.d.ts +0 -65
  368. package/dist/runtime/rpc-runtime-ensure.d.ts.map +0 -1
  369. package/dist/runtime/rpc-spawn-lease.d.ts +0 -8
  370. package/dist/runtime/rpc-spawn-lease.d.ts.map +0 -1
  371. package/dist/services/telemetry/index.js +0 -15
  372. package/dist/session/rpc-session-service.d.ts +0 -16
  373. package/dist/session/rpc-session-service.d.ts.map +0 -1
  374. package/dist/session/sqlite-rpc-session-backend.d.ts +0 -31
  375. package/dist/session/sqlite-rpc-session-backend.d.ts.map +0 -1
  376. package/dist/transports/rpc.d.ts +0 -51
  377. package/dist/transports/rpc.d.ts.map +0 -1
  378. package/src/ClineCore.test.ts +0 -226
  379. package/src/account/cline-account-service.test.ts +0 -185
  380. package/src/account/featurebase-token.test.ts +0 -175
  381. package/src/account/rpc.test.ts +0 -63
  382. package/src/auth/bounded-ttl-cache.test.ts +0 -38
  383. package/src/auth/client.test.ts +0 -69
  384. package/src/auth/cline.test.ts +0 -267
  385. package/src/auth/codex.test.ts +0 -170
  386. package/src/auth/oca.test.ts +0 -340
  387. package/src/auth/server.test.ts +0 -287
  388. package/src/auth/utils.test.ts +0 -128
  389. package/src/extensions/config/agent-config-loader.test.ts +0 -236
  390. package/src/extensions/config/hooks-config-loader.test.ts +0 -20
  391. package/src/extensions/config/runtime-commands.test.ts +0 -115
  392. package/src/extensions/config/unified-config-file-watcher.test.ts +0 -196
  393. package/src/extensions/config/user-instruction-config-loader.test.ts +0 -246
  394. package/src/extensions/context/compaction.test.ts +0 -483
  395. package/src/extensions/mcp/config-loader.test.ts +0 -238
  396. package/src/extensions/mcp/manager.test.ts +0 -105
  397. package/src/extensions/plugin/plugin-config-loader.test.ts +0 -184
  398. package/src/extensions/plugin/plugin-loader.test.ts +0 -292
  399. package/src/extensions/plugin/plugin-sandbox.test.ts +0 -423
  400. package/src/extensions/tools/definitions.test.ts +0 -780
  401. package/src/extensions/tools/executors/bash.test.ts +0 -87
  402. package/src/extensions/tools/executors/editor.test.ts +0 -35
  403. package/src/extensions/tools/executors/file-read.test.ts +0 -125
  404. package/src/extensions/tools/model-tool-routing.test.ts +0 -86
  405. package/src/extensions/tools/presets.test.ts +0 -70
  406. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +0 -455
  407. package/src/extensions/tools/team/spawn-agent-tool.test.ts +0 -381
  408. package/src/extensions/tools/team/team-tools.test.ts +0 -918
  409. package/src/hooks/checkpoint-hooks.test.ts +0 -168
  410. package/src/hooks/hook-file-hooks.test.ts +0 -311
  411. package/src/hooks/persistent.ts +0 -661
  412. package/src/runtime/history.test.ts +0 -114
  413. package/src/runtime/host.test.ts +0 -230
  414. package/src/runtime/rpc-runtime-ensure.test.ts +0 -123
  415. package/src/runtime/rpc-runtime-ensure.ts +0 -659
  416. package/src/runtime/rpc-spawn-lease.test.ts +0 -81
  417. package/src/runtime/rpc-spawn-lease.ts +0 -156
  418. package/src/runtime/runtime-builder.team-persistence.test.ts +0 -245
  419. package/src/runtime/runtime-builder.test.ts +0 -615
  420. package/src/runtime/runtime-oauth-token-manager.test.ts +0 -137
  421. package/src/runtime/runtime-parity.test.ts +0 -143
  422. package/src/services/providers/local-provider-service.test.ts +0 -1062
  423. package/src/services/session-data.test.ts +0 -160
  424. package/src/services/storage/provider-settings-legacy-migration.test.ts +0 -424
  425. package/src/services/storage/provider-settings-manager.test.ts +0 -191
  426. package/src/services/telemetry/OpenTelemetryAdapter.test.ts +0 -157
  427. package/src/services/telemetry/OpenTelemetryProvider.test.ts +0 -326
  428. package/src/services/telemetry/TelemetryLoggerSink.test.ts +0 -42
  429. package/src/services/telemetry/TelemetryService.test.ts +0 -134
  430. package/src/services/telemetry/distinct-id.test.ts +0 -57
  431. package/src/services/workspace/file-indexer.d.ts +0 -11
  432. package/src/services/workspace/file-indexer.test.ts +0 -156
  433. package/src/services/workspace/mention-enricher.test.ts +0 -106
  434. package/src/session/persistence-service.test.ts +0 -300
  435. package/src/session/rpc-session-service.ts +0 -114
  436. package/src/session/session-service.team-persistence.test.ts +0 -48
  437. package/src/session/sqlite-rpc-session-backend.ts +0 -301
  438. package/src/transports/local.e2e.test.ts +0 -380
  439. package/src/transports/local.test.ts +0 -2559
  440. package/src/transports/rpc.test.ts +0 -82
  441. package/src/transports/rpc.ts +0 -665
@@ -1,12 +1,14 @@
1
1
  import { readFile, stat } from "node:fs/promises";
2
2
  import { homedir } from "node:os";
3
3
  import { isAbsolute, join, resolve } from "node:path";
4
- import { Agent } from "@clinebot/agents";
5
4
  import type * as LlmsProviders from "@clinebot/llms";
6
5
  import {
7
6
  type AgentConfig,
8
7
  type AgentEvent,
9
8
  type AgentResult,
9
+ type AutomationEventEnvelope,
10
+ type BasicLogger,
11
+ type BasicLogMetadata,
10
12
  createSessionId,
11
13
  type ITelemetryService,
12
14
  isLikelyAuthError,
@@ -28,7 +30,13 @@ import { createSpawnAgentTool, type TeamEvent } from "../extensions/tools/team";
28
30
  import type { HookEventPayload } from "../hooks";
29
31
  import { DefaultRuntimeBuilder } from "../runtime/runtime-builder";
30
32
  import type {
33
+ PendingPromptMutationResult,
34
+ PendingPromptsAction,
35
+ PendingPromptsDeleteInput,
36
+ PendingPromptsListInput,
37
+ PendingPromptsUpdateInput,
31
38
  RuntimeHost,
39
+ RuntimeHostSubscribeOptions,
32
40
  SendSessionInput,
33
41
  SessionAccumulatedUsage,
34
42
  StartSessionInput,
@@ -40,6 +48,7 @@ import {
40
48
  RuntimeOAuthTokenManager,
41
49
  } from "../runtime/runtime-oauth-token-manager";
42
50
  import type { RuntimeBuilder } from "../runtime/session-runtime";
51
+ import { SessionRuntime } from "../runtime/session-runtime-orchestrator";
43
52
  import {
44
53
  type AgentEventContext,
45
54
  buildTelemetryAgentIdentity,
@@ -47,6 +56,7 @@ import {
47
56
  handleAgentEvent,
48
57
  } from "../services/agent-events";
49
58
  import { resolveWorkspacePath } from "../services/config";
59
+ import { filterDisabledTools } from "../services/global-settings";
50
60
  import { prepareLocalRuntimeBootstrap } from "../services/local-runtime-bootstrap";
51
61
  import { nowIso } from "../services/session-artifacts";
52
62
  import {
@@ -73,15 +83,14 @@ import {
73
83
  } from "../services/usage";
74
84
  import { enrichPromptWithMentions } from "../services/workspace";
75
85
  import type { FileSessionService } from "../session/file-session-service";
76
- import type { RpcCoreSessionService } from "../session/rpc-session-service";
77
86
  import {
78
87
  type SessionManifest,
79
88
  SessionManifestSchema,
80
89
  } from "../session/session-manifest";
90
+ import type { SessionRow } from "../session/session-row";
81
91
  import type {
82
92
  CoreSessionService,
83
93
  RootSessionArtifacts,
84
- SessionRow,
85
94
  } from "../session/session-service";
86
95
  import {
87
96
  buildTeamRunContinuationPrompt,
@@ -96,8 +105,12 @@ import {
96
105
  } from "../session/session-team-coordination";
97
106
  import { SessionSource, type SessionStatus } from "../types/common";
98
107
  import type { CoreSessionConfig } from "../types/config";
99
- import type { CoreSessionEvent } from "../types/events";
100
- import type { ActiveSession, PreparedTurnInput } from "../types/session";
108
+ import type { CoreSessionEvent, SessionPendingPrompt } from "../types/events";
109
+ import type {
110
+ ActiveSession,
111
+ PendingPrompt,
112
+ PreparedTurnInput,
113
+ } from "../types/session";
101
114
  import type { SessionRecord } from "../types/sessions";
102
115
  import {
103
116
  cloneAccumulatedUsage,
@@ -106,10 +119,7 @@ import {
106
119
  replaySubagentHookEvent,
107
120
  } from "./runtime-host-support";
108
121
 
109
- type SessionBackend =
110
- | CoreSessionService
111
- | RpcCoreSessionService
112
- | FileSessionService;
122
+ type SessionBackend = CoreSessionService | FileSessionService;
113
123
 
114
124
  const MAX_SCAN_LIMIT = 5000;
115
125
  const MAX_USER_FILE_BYTES = 20 * 1_000 * 1_024;
@@ -129,13 +139,57 @@ async function loadUserFileContent(path: string): Promise<string> {
129
139
  return content;
130
140
  }
131
141
 
142
+ function toActiveSessionRecord(session: ActiveSession): SessionRecord {
143
+ return {
144
+ sessionId: session.sessionId,
145
+ source: session.source,
146
+ pid: process.pid,
147
+ startedAt: session.startedAt,
148
+ endedAt: session.endedAt ?? null,
149
+ exitCode: session.exitCode ?? null,
150
+ status: session.status,
151
+ interactive: session.interactive,
152
+ provider: session.config.providerId,
153
+ model: session.config.modelId,
154
+ cwd: session.config.cwd,
155
+ workspaceRoot: resolveWorkspacePath(session.config),
156
+ teamName: session.config.teamName?.trim() || undefined,
157
+ enableTools: session.config.enableTools,
158
+ enableSpawn: session.config.enableSpawnAgent,
159
+ enableTeams: session.config.enableAgentTeams,
160
+ parentSessionId:
161
+ typeof session.sessionMetadata?.parentSessionId === "string"
162
+ ? session.sessionMetadata.parentSessionId
163
+ : undefined,
164
+ parentAgentId:
165
+ typeof session.sessionMetadata?.parentAgentId === "string"
166
+ ? session.sessionMetadata.parentAgentId
167
+ : undefined,
168
+ agentId:
169
+ typeof session.sessionMetadata?.agentId === "string"
170
+ ? session.sessionMetadata.agentId
171
+ : undefined,
172
+ conversationId:
173
+ typeof session.sessionMetadata?.conversationId === "string"
174
+ ? session.sessionMetadata.conversationId
175
+ : undefined,
176
+ isSubagent:
177
+ typeof session.sessionMetadata?.isSubagent === "boolean"
178
+ ? session.sessionMetadata.isSubagent
179
+ : false,
180
+ prompt: session.pendingPrompt,
181
+ metadata: session.sessionMetadata,
182
+ messagesPath: session.artifacts?.messagesPath,
183
+ updatedAt: session.startedAt,
184
+ };
185
+ }
186
+
132
187
  export interface LocalRuntimeHostOptions {
133
188
  distinctId?: string;
134
189
  sessionService: SessionBackend;
135
190
  runtimeBuilder?: RuntimeBuilder;
136
- createAgent?: (config: AgentConfig) => Agent;
191
+ createAgent?: (config: AgentConfig) => SessionRuntime;
137
192
  defaultToolExecutors?: Partial<ToolExecutors>;
138
- teamToolsFactory?: import("../runtime/session-runtime").TeamToolsFactory;
139
193
  toolPolicies?: AgentConfig["toolPolicies"];
140
194
  providerSettingsManager?: ProviderSettingsManager;
141
195
  oauthTokenManager?: RuntimeOAuthTokenManager;
@@ -143,19 +197,25 @@ export interface LocalRuntimeHostOptions {
143
197
  requestToolApproval?: (
144
198
  request: ToolApprovalRequest,
145
199
  ) => Promise<ToolApprovalResult>;
200
+ /**
201
+ * Default custom `fetch` implementation threaded into every
202
+ * `ProviderConfig.fetch` built during local session bootstrap. Used by
203
+ * the AI gateway providers when issuing HTTP requests.
204
+ */
205
+ fetch?: typeof fetch;
146
206
  }
147
207
 
148
208
  export class LocalRuntimeHost implements RuntimeHost {
149
209
  public readonly runtimeAddress = undefined;
150
210
  private readonly sessionService: SessionBackend;
151
211
  private readonly runtimeBuilder: RuntimeBuilder;
152
- private readonly createAgentInstance: (config: AgentConfig) => Agent;
212
+ private readonly createAgentInstance: (config: AgentConfig) => SessionRuntime;
153
213
  private readonly defaultToolExecutors?: Partial<ToolExecutors>;
154
- private readonly teamToolsFactory?: import("../runtime/session-runtime").TeamToolsFactory;
155
214
  private readonly defaultToolPolicies?: AgentConfig["toolPolicies"];
156
215
  private readonly providerSettingsManager: ProviderSettingsManager;
157
216
  private readonly oauthTokenManager: RuntimeOAuthTokenManager;
158
217
  private readonly defaultTelemetry?: ITelemetryService;
218
+ private readonly defaultFetch?: typeof fetch;
159
219
  private readonly defaultRequestToolApproval?: (
160
220
  request: ToolApprovalRequest,
161
221
  ) => Promise<ToolApprovalResult>;
@@ -174,9 +234,8 @@ export class LocalRuntimeHost implements RuntimeHost {
174
234
  this.sessionService = options.sessionService;
175
235
  this.runtimeBuilder = options.runtimeBuilder ?? new DefaultRuntimeBuilder();
176
236
  this.createAgentInstance =
177
- options.createAgent ?? ((config) => new Agent(config));
237
+ options.createAgent ?? ((config) => new SessionRuntime(config));
178
238
  this.defaultToolExecutors = options.defaultToolExecutors;
179
- this.teamToolsFactory = options.teamToolsFactory;
180
239
  this.defaultToolPolicies = options.toolPolicies;
181
240
  this.providerSettingsManager =
182
241
  options.providerSettingsManager ?? new ProviderSettingsManager();
@@ -188,6 +247,7 @@ export class LocalRuntimeHost implements RuntimeHost {
188
247
  });
189
248
  this.defaultTelemetry = options.telemetry;
190
249
  this.defaultTelemetry?.setDistinctId(distinctId);
250
+ this.defaultFetch = options.fetch;
191
251
  this.defaultRequestToolApproval = options.requestToolApproval;
192
252
  }
193
253
 
@@ -198,21 +258,7 @@ export class LocalRuntimeHost implements RuntimeHost {
198
258
  const startedAt = nowIso();
199
259
  const requestedSessionId = input.config.sessionId?.trim() ?? "";
200
260
  const sessionId = requestedSessionId || createSessionId();
201
- const resumedRow = requestedSessionId
202
- ? await this.getRow(sessionId)
203
- : undefined;
204
- const startInput: StartSessionInput =
205
- resumedRow &&
206
- !input.config.teamName?.trim() &&
207
- resumedRow.teamName?.trim()
208
- ? {
209
- ...input,
210
- config: {
211
- ...input.config,
212
- teamName: resumedRow.teamName,
213
- },
214
- }
215
- : input;
261
+ const startInput: StartSessionInput = input;
216
262
  this.usageBySession.set(sessionId, createInitialAccumulatedUsage());
217
263
 
218
264
  const sessionsDir =
@@ -250,6 +296,15 @@ export class LocalRuntimeHost implements RuntimeHost {
250
296
  messages_path: messagesPath,
251
297
  });
252
298
 
299
+ const sessionToolExecutors =
300
+ input.localRuntime?.defaultToolExecutors ?? this.defaultToolExecutors;
301
+ const inputLocalConfig = input.localRuntime?.configOverrides as
302
+ | Partial<CoreSessionConfig>
303
+ | undefined;
304
+ const pluginEventFallbackLogger =
305
+ inputLocalConfig?.extensionContext?.logger ?? inputLocalConfig?.logger;
306
+ const pluginEventFallbackAutomation =
307
+ inputLocalConfig?.extensionContext?.automation;
253
308
  let bootstrap!: Awaited<ReturnType<typeof prepareLocalRuntimeBootstrap>>;
254
309
  bootstrap = await prepareLocalRuntimeBootstrap({
255
310
  input: startInput,
@@ -257,16 +312,31 @@ export class LocalRuntimeHost implements RuntimeHost {
257
312
  sessionId,
258
313
  providerSettingsManager: this.providerSettingsManager,
259
314
  defaultTelemetry: this.defaultTelemetry,
260
- defaultToolExecutors: this.defaultToolExecutors,
261
- teamToolsFactory: this.teamToolsFactory,
315
+ defaultToolExecutors: sessionToolExecutors,
262
316
  defaultToolPolicies: this.defaultToolPolicies,
263
317
  defaultRequestToolApproval: this.defaultRequestToolApproval,
264
- onPluginEvent: (event) => void this.handlePluginEvent(sessionId, event),
318
+ defaultFetch: this.defaultFetch,
319
+ onPluginEvent: (event) => {
320
+ if (event.name === "plugin_log") {
321
+ this.handlePluginLog(
322
+ sessionId,
323
+ event.payload,
324
+ pluginEventFallbackLogger,
325
+ );
326
+ return;
327
+ }
328
+ void this.handlePluginEvent(
329
+ sessionId,
330
+ event,
331
+ pluginEventFallbackAutomation,
332
+ );
333
+ },
265
334
  onTeamEvent: (event: TeamEvent) => {
266
335
  void this.handleTeamEvent(sessionId, event);
267
336
  bootstrap.config.onTeamEvent?.(event);
268
337
  },
269
- createSpawnTool: () => this.createSpawnTool(bootstrap.config, sessionId),
338
+ createSpawnTool: () =>
339
+ this.createSpawnTool(bootstrap.config, sessionId, sessionToolExecutors),
270
340
  readSessionMetadata: async () =>
271
341
  (await this.get(sessionId))?.metadata as
272
342
  | Record<string, unknown>
@@ -287,6 +357,7 @@ export class LocalRuntimeHost implements RuntimeHost {
287
357
  const tools = [...runtime.tools, ...(configWithProvider.extraTools ?? [])];
288
358
 
289
359
  const agentConfig = {
360
+ sessionId,
290
361
  providerId: providerConfig.providerId,
291
362
  modelId: providerConfig.modelId,
292
363
  apiKey: providerConfig.apiKey,
@@ -319,10 +390,13 @@ export class LocalRuntimeHost implements RuntimeHost {
319
390
  this.onAgentEvent(sessionId, configWithProvider, event),
320
391
  } as AgentConfig;
321
392
  const agent = this.createAgentInstance(agentConfig);
393
+ if (agentConfig.onEvent) {
394
+ agent.subscribeEvents(agentConfig.onEvent);
395
+ }
322
396
  runtime.registerLeadAgent?.(agent);
323
397
  const rootAgentIdentity = buildTelemetryAgentIdentity({
324
- agentId: this.readAgentId(agent),
325
- conversationId: this.readAgentConversationId(agent),
398
+ agentId: agent.getAgentId(),
399
+ conversationId: agent.getConversationId(),
326
400
  teamId: runtime.teamRuntime?.getTeamId(),
327
401
  teamName: runtime.teamRuntime?.getTeamName(),
328
402
  teamRole: runtime.teamRuntime ? "lead" : undefined,
@@ -330,7 +404,6 @@ export class LocalRuntimeHost implements RuntimeHost {
330
404
  emitSessionCreationTelemetry(
331
405
  configWithProvider,
332
406
  sessionId,
333
- source,
334
407
  requestedSessionId.length > 0,
335
408
  workspacePath,
336
409
  rootAgentIdentity,
@@ -348,7 +421,7 @@ export class LocalRuntimeHost implements RuntimeHost {
348
421
  ulid: sessionId,
349
422
  teamId: runtime.teamRuntime.getTeamId(),
350
423
  teamName: runtime.teamRuntime.getTeamName(),
351
- leadAgentId: this.readAgentId(agent),
424
+ leadAgentId: agent.getAgentId(),
352
425
  restoredFromPersistence: runtime.teamRestoredFromPersistence === true,
353
426
  });
354
427
  }
@@ -363,6 +436,7 @@ export class LocalRuntimeHost implements RuntimeHost {
363
436
  runtime,
364
437
  agent,
365
438
  started: false,
439
+ status: "running",
366
440
  aborting: false,
367
441
  interactive: input.interactive === true,
368
442
  persistedMessages: startInput.initialMessages,
@@ -375,6 +449,18 @@ export class LocalRuntimeHost implements RuntimeHost {
375
449
  };
376
450
  this.sessions.set(sessionId, active);
377
451
  this.emitStatus(sessionId, "running");
452
+ if ((startInput.initialMessages?.length ?? 0) > 0) {
453
+ await this.ensureSessionPersisted(active);
454
+ await this.invoke<void>(
455
+ "persistSessionMessages",
456
+ active.sessionId,
457
+ startInput.initialMessages,
458
+ active.config.systemPrompt,
459
+ );
460
+ if (!startInput.prompt?.trim()) {
461
+ await this.updateStatus(active, "completed", 0);
462
+ }
463
+ }
378
464
 
379
465
  let result: AgentResult | undefined;
380
466
  try {
@@ -404,6 +490,10 @@ export class LocalRuntimeHost implements RuntimeHost {
404
490
 
405
491
  async send(input: SendSessionInput): Promise<AgentResult | undefined> {
406
492
  const session = this.getSessionOrThrow(input.sessionId);
493
+ const canStartRun = session.agent.canStartRun();
494
+ const delivery =
495
+ input.delivery ??
496
+ (session.interactive && !canStartRun ? ("queue" as const) : undefined);
407
497
  session.config.telemetry?.capture({
408
498
  event: "session.input_sent",
409
499
  properties: {
@@ -411,13 +501,13 @@ export class LocalRuntimeHost implements RuntimeHost {
411
501
  promptLength: input.prompt.length,
412
502
  userImageCount: input.userImages?.length ?? 0,
413
503
  userFileCount: input.userFiles?.length ?? 0,
414
- delivery: input.delivery ?? "immediate",
504
+ delivery: delivery ?? "immediate",
415
505
  },
416
506
  });
417
- if (input.delivery === "queue" || input.delivery === "steer") {
507
+ if (delivery === "queue" || delivery === "steer") {
418
508
  this.enqueuePendingPrompt(input.sessionId, {
419
509
  prompt: input.prompt,
420
- delivery: input.delivery,
510
+ delivery,
421
511
  userImages: input.userImages,
422
512
  userFiles: input.userFiles,
423
513
  });
@@ -442,6 +532,122 @@ export class LocalRuntimeHost implements RuntimeHost {
442
532
  }
443
533
  }
444
534
 
535
+ async pendingPrompts(
536
+ action: "list",
537
+ input: PendingPromptsListInput,
538
+ ): Promise<SessionPendingPrompt[]>;
539
+ async pendingPrompts(
540
+ action: "update",
541
+ input: PendingPromptsUpdateInput,
542
+ ): Promise<PendingPromptMutationResult>;
543
+ async pendingPrompts(
544
+ action: "delete",
545
+ input: PendingPromptsDeleteInput,
546
+ ): Promise<PendingPromptMutationResult>;
547
+ async pendingPrompts(
548
+ action: PendingPromptsAction,
549
+ input:
550
+ | PendingPromptsListInput
551
+ | PendingPromptsUpdateInput
552
+ | PendingPromptsDeleteInput,
553
+ ): Promise<SessionPendingPrompt[] | PendingPromptMutationResult> {
554
+ switch (action) {
555
+ case "list":
556
+ return this.listPendingPromptEntries(input.sessionId);
557
+ case "update":
558
+ return this.editPendingPromptEntry(input as PendingPromptsUpdateInput);
559
+ case "delete":
560
+ return this.deletePendingPromptEntry(
561
+ input as PendingPromptsDeleteInput,
562
+ );
563
+ }
564
+ }
565
+
566
+ private listPendingPromptEntries(sessionId: string): SessionPendingPrompt[] {
567
+ const session = this.sessions.get(sessionId);
568
+ return session ? this.snapshotPendingPrompts(session) : [];
569
+ }
570
+
571
+ private editPendingPromptEntry(
572
+ input: PendingPromptsUpdateInput,
573
+ ): PendingPromptMutationResult {
574
+ const session = this.sessions.get(input.sessionId);
575
+ if (!session || session.aborting) {
576
+ return { sessionId: input.sessionId, prompts: [], updated: false };
577
+ }
578
+ const promptId = input.promptId.trim();
579
+ const index = session.pendingPrompts.findIndex(
580
+ (entry) => entry.id === promptId,
581
+ );
582
+ if (index < 0) {
583
+ return {
584
+ sessionId: input.sessionId,
585
+ prompts: this.snapshotPendingPrompts(session),
586
+ updated: false,
587
+ };
588
+ }
589
+
590
+ const existing = session.pendingPrompts[index]!;
591
+ const prompt =
592
+ input.prompt === undefined
593
+ ? existing.prompt
594
+ : normalizeUserInput(input.prompt).trim();
595
+ if (!prompt) {
596
+ throw new Error("prompt cannot be empty");
597
+ }
598
+ const delivery = input.delivery ?? existing.delivery;
599
+ const next: PendingPrompt = {
600
+ ...existing,
601
+ prompt,
602
+ delivery,
603
+ };
604
+ session.pendingPrompts.splice(index, 1);
605
+ if (delivery === "steer") {
606
+ session.pendingPrompts.unshift(next);
607
+ } else if (existing.delivery === "steer") {
608
+ session.pendingPrompts.push(next);
609
+ } else {
610
+ session.pendingPrompts.splice(index, 0, next);
611
+ }
612
+ this.emitPendingPrompts(session);
613
+ this.schedulePendingPromptDrain(input.sessionId, session);
614
+ return {
615
+ sessionId: input.sessionId,
616
+ prompts: this.snapshotPendingPrompts(session),
617
+ prompt: this.snapshotPendingPrompt(next),
618
+ updated: true,
619
+ };
620
+ }
621
+
622
+ private deletePendingPromptEntry(
623
+ input: PendingPromptsDeleteInput,
624
+ ): PendingPromptMutationResult {
625
+ const session = this.sessions.get(input.sessionId);
626
+ if (!session || session.aborting) {
627
+ return { sessionId: input.sessionId, prompts: [], removed: false };
628
+ }
629
+ const promptId = input.promptId.trim();
630
+ const index = session.pendingPrompts.findIndex(
631
+ (entry) => entry.id === promptId,
632
+ );
633
+ if (index < 0) {
634
+ return {
635
+ sessionId: input.sessionId,
636
+ prompts: this.snapshotPendingPrompts(session),
637
+ removed: false,
638
+ };
639
+ }
640
+ const [removed] = session.pendingPrompts.splice(index, 1);
641
+ this.emitPendingPrompts(session);
642
+ this.schedulePendingPromptDrain(input.sessionId, session);
643
+ return {
644
+ sessionId: input.sessionId,
645
+ prompts: this.snapshotPendingPrompts(session),
646
+ prompt: removed ? this.snapshotPendingPrompt(removed) : undefined,
647
+ removed: true,
648
+ };
649
+ }
650
+
445
651
  async getAccumulatedUsage(
446
652
  sessionId: string,
447
653
  ): Promise<SessionAccumulatedUsage | undefined> {
@@ -460,11 +666,7 @@ export class LocalRuntimeHost implements RuntimeHost {
460
666
  session.pendingPrompts.length = 0;
461
667
  this.emitPendingPrompts(session);
462
668
  }
463
- (
464
- session.agent as Agent & {
465
- abort: (abortReason?: unknown) => void;
466
- }
467
- ).abort(reason);
669
+ session.agent.abort(reason);
468
670
  }
469
671
 
470
672
  async stop(sessionId: string): Promise<void> {
@@ -476,11 +678,7 @@ export class LocalRuntimeHost implements RuntimeHost {
476
678
  });
477
679
  // Abort the agent first if it's running, so shutdown can proceed
478
680
  session.aborting = true;
479
- (
480
- session.agent as Agent & {
481
- abort: (abortReason?: unknown) => void;
482
- }
483
- ).abort(new Error("session_stop"));
681
+ session.agent.abort(new Error("session_stop"));
484
682
  await this.shutdownSession(session, {
485
683
  status: "cancelled",
486
684
  exitCode: 0,
@@ -506,13 +704,25 @@ export class LocalRuntimeHost implements RuntimeHost {
506
704
  }
507
705
 
508
706
  async get(sessionId: string): Promise<SessionRecord | undefined> {
707
+ const active = this.sessions.get(sessionId);
708
+ if (active) {
709
+ return toActiveSessionRecord(active);
710
+ }
509
711
  const row = await this.getRow(sessionId);
510
712
  return row ? toSessionRecord(row) : undefined;
511
713
  }
512
714
 
513
715
  async list(limit = 200): Promise<SessionRecord[]> {
514
716
  const rows = await this.listRows(limit);
515
- return rows.map(toSessionRecord);
717
+ const persisted = rows.map(toSessionRecord);
718
+ const seen = new Set(persisted.map((row) => row.sessionId));
719
+ for (const active of this.sessions.values()) {
720
+ if (seen.has(active.sessionId)) {
721
+ continue;
722
+ }
723
+ persisted.unshift(toActiveSessionRecord(active));
724
+ }
725
+ return persisted.slice(0, limit);
516
726
  }
517
727
 
518
728
  async delete(sessionId: string): Promise<boolean> {
@@ -570,8 +780,11 @@ export class LocalRuntimeHost implements RuntimeHost {
570
780
  });
571
781
  }
572
782
 
573
- subscribe(listener: (event: CoreSessionEvent) => void): () => void {
574
- return this.events.subscribe(listener);
783
+ subscribe(
784
+ listener: (event: CoreSessionEvent) => void,
785
+ options?: RuntimeHostSubscribeOptions,
786
+ ): () => void {
787
+ return this.events.subscribe(listener, options);
575
788
  }
576
789
 
577
790
  async updateSessionModel(sessionId: string, modelId: string): Promise<void> {
@@ -806,10 +1019,11 @@ export class LocalRuntimeHost implements RuntimeHost {
806
1019
  ): Promise<void> {
807
1020
  if (hasPendingTeamRunWork(session)) return;
808
1021
  const isAborted = finishReason === "aborted" || session.aborting;
1022
+ const isError = finishReason === "error";
809
1023
  await this.shutdownSession(session, {
810
- status: isAborted ? "cancelled" : "completed",
811
- exitCode: 0,
812
- shutdownReason: "session_complete",
1024
+ status: isAborted ? "cancelled" : isError ? "failed" : "completed",
1025
+ exitCode: isError ? 1 : 0,
1026
+ shutdownReason: isError ? "session_error" : "session_complete",
813
1027
  endReason: finishReason,
814
1028
  });
815
1029
  }
@@ -844,12 +1058,39 @@ export class LocalRuntimeHost implements RuntimeHost {
844
1058
  }
845
1059
  notifyTeamRunWaiters(session);
846
1060
 
1061
+ const cleanupErrors: unknown[] = [];
1062
+ const recordCleanupError = (stage: string, error: unknown) => {
1063
+ cleanupErrors.push(error);
1064
+ session.config.logger?.log("Session shutdown cleanup failed", {
1065
+ sessionId: session.sessionId,
1066
+ stage,
1067
+ error,
1068
+ severity: "warn",
1069
+ });
1070
+ };
1071
+
847
1072
  if (session.artifacts) {
848
- await this.updateStatus(session, input.status, input.exitCode);
849
- await session.agent.shutdown(input.shutdownReason);
1073
+ try {
1074
+ await this.updateStatus(session, input.status, input.exitCode);
1075
+ } catch (error) {
1076
+ recordCleanupError("update_status", error);
1077
+ }
1078
+ try {
1079
+ await session.agent.shutdown(input.shutdownReason);
1080
+ } catch (error) {
1081
+ recordCleanupError("agent_shutdown", error);
1082
+ }
1083
+ }
1084
+ try {
1085
+ await Promise.resolve(session.runtime.shutdown(input.shutdownReason));
1086
+ } catch (error) {
1087
+ recordCleanupError("runtime_shutdown", error);
1088
+ }
1089
+ try {
1090
+ await session.pluginSandboxShutdown?.();
1091
+ } catch (error) {
1092
+ recordCleanupError("plugin_sandbox_shutdown", error);
850
1093
  }
851
- await Promise.resolve(session.runtime.shutdown(input.shutdownReason));
852
- await session.pluginSandboxShutdown?.();
853
1094
  this.sessions.delete(session.sessionId);
854
1095
  this.emit({
855
1096
  type: "ended",
@@ -859,6 +1100,9 @@ export class LocalRuntimeHost implements RuntimeHost {
859
1100
  ts: Date.now(),
860
1101
  },
861
1102
  });
1103
+ if (cleanupErrors.length > 0 && input.status === "failed") {
1104
+ throw cleanupErrors[0];
1105
+ }
862
1106
  }
863
1107
 
864
1108
  private async updateStatus(
@@ -883,6 +1127,9 @@ export class LocalRuntimeHost implements RuntimeHost {
883
1127
  latestManifest.ended_at = result.endedAt ?? nowIso();
884
1128
  latestManifest.exit_code = typeof exitCode === "number" ? exitCode : null;
885
1129
  session.artifacts.manifest = latestManifest;
1130
+ session.status = status;
1131
+ session.endedAt = latestManifest.ended_at;
1132
+ session.exitCode = latestManifest.exit_code;
886
1133
  await this.invoke<void>(
887
1134
  "writeSessionManifest",
888
1135
  session.artifacts.manifestPath,
@@ -894,7 +1141,31 @@ export class LocalRuntimeHost implements RuntimeHost {
894
1141
  private async handlePluginEvent(
895
1142
  rootSessionId: string,
896
1143
  event: { name: string; payload?: unknown },
1144
+ fallbackAutomation?: NonNullable<
1145
+ CoreSessionConfig["extensionContext"]
1146
+ >["automation"],
897
1147
  ): Promise<void> {
1148
+ if (event.name === "plugin_log") {
1149
+ this.handlePluginLog(rootSessionId, event.payload);
1150
+ return;
1151
+ }
1152
+ if (event.name === "automation_event") {
1153
+ const session = this.sessions.get(rootSessionId);
1154
+ const automation =
1155
+ session?.config.extensionContext?.automation ?? fallbackAutomation;
1156
+ if (!automation) {
1157
+ return;
1158
+ }
1159
+ const payload =
1160
+ event.payload && typeof event.payload === "object"
1161
+ ? (event.payload as AutomationEventEnvelope)
1162
+ : undefined;
1163
+ if (!payload) {
1164
+ return;
1165
+ }
1166
+ await automation.ingestEvent(payload);
1167
+ return;
1168
+ }
898
1169
  if (
899
1170
  event.name !== "steer_message" &&
900
1171
  event.name !== "queue_message" &&
@@ -930,6 +1201,49 @@ export class LocalRuntimeHost implements RuntimeHost {
930
1201
  });
931
1202
  }
932
1203
 
1204
+ private handlePluginLog(
1205
+ rootSessionId: string,
1206
+ payload: unknown,
1207
+ fallbackLogger?: BasicLogger,
1208
+ ): void {
1209
+ const session = this.sessions.get(rootSessionId);
1210
+ const logger =
1211
+ fallbackLogger ??
1212
+ session?.config.extensionContext?.logger ??
1213
+ session?.config.logger;
1214
+ if (!logger || !payload || typeof payload !== "object") {
1215
+ return;
1216
+ }
1217
+ const record = payload as Record<string, unknown>;
1218
+ const message = typeof record.message === "string" ? record.message : "";
1219
+ if (!message) {
1220
+ return;
1221
+ }
1222
+ const metadata =
1223
+ record.metadata && typeof record.metadata === "object"
1224
+ ? ({
1225
+ ...(record.metadata as Record<string, unknown>),
1226
+ } as BasicLogMetadata)
1227
+ : {};
1228
+ metadata.sessionId ??= rootSessionId;
1229
+ if (typeof record.pluginName === "string" && record.pluginName) {
1230
+ metadata.pluginName = record.pluginName;
1231
+ }
1232
+ if (record.level === "debug") {
1233
+ logger.debug(message, metadata);
1234
+ return;
1235
+ }
1236
+ if (record.level === "error") {
1237
+ if (logger.error) {
1238
+ logger.error(message, metadata);
1239
+ } else {
1240
+ logger.log(message, { ...metadata, severity: "error" });
1241
+ }
1242
+ return;
1243
+ }
1244
+ logger.log(message, metadata);
1245
+ }
1246
+
933
1247
  /**
934
1248
  * Consume the first steer-delivery pending prompt for injection into the
935
1249
  * running agent loop. Called synchronously by the agent between iterations.
@@ -1003,6 +1317,21 @@ export class LocalRuntimeHost implements RuntimeHost {
1003
1317
  });
1004
1318
  }
1005
1319
  this.emitPendingPrompts(session);
1320
+ this.schedulePendingPromptDrain(sessionId, session);
1321
+ }
1322
+
1323
+ private schedulePendingPromptDrain(
1324
+ sessionId: string,
1325
+ session: ActiveSession,
1326
+ ): void {
1327
+ if (
1328
+ session.pendingPrompts.length === 0 ||
1329
+ session.aborting ||
1330
+ session.drainingPendingPrompts ||
1331
+ !session.agent.canStartRun()
1332
+ ) {
1333
+ return;
1334
+ }
1006
1335
  queueMicrotask(() => {
1007
1336
  void this.drainPendingPrompts(sessionId);
1008
1337
  });
@@ -1013,15 +1342,7 @@ export class LocalRuntimeHost implements RuntimeHost {
1013
1342
  if (!session || session.aborting || session.drainingPendingPrompts) {
1014
1343
  return;
1015
1344
  }
1016
- const canStartRun =
1017
- typeof (session.agent as Agent & { canStartRun?: () => boolean })
1018
- .canStartRun === "function"
1019
- ? (
1020
- session.agent as Agent & {
1021
- canStartRun: () => boolean;
1022
- }
1023
- ).canStartRun()
1024
- : true;
1345
+ const canStartRun = session.agent.canStartRun();
1025
1346
  if (!canStartRun) {
1026
1347
  return;
1027
1348
  }
@@ -1103,17 +1424,29 @@ export class LocalRuntimeHost implements RuntimeHost {
1103
1424
  type: "pending_prompts",
1104
1425
  payload: {
1105
1426
  sessionId: session.sessionId,
1106
- prompts: session.pendingPrompts.map((entry) => ({
1107
- id: entry.id,
1108
- prompt: entry.prompt,
1109
- delivery: entry.delivery,
1110
- attachmentCount:
1111
- (entry.userImages?.length ?? 0) + (entry.userFiles?.length ?? 0),
1112
- })),
1427
+ prompts: this.snapshotPendingPrompts(session),
1113
1428
  },
1114
1429
  });
1115
1430
  }
1116
1431
 
1432
+ private snapshotPendingPrompt(entry: PendingPrompt): SessionPendingPrompt {
1433
+ return {
1434
+ id: entry.id,
1435
+ prompt: entry.prompt,
1436
+ delivery: entry.delivery,
1437
+ attachmentCount:
1438
+ (entry.userImages?.length ?? 0) + (entry.userFiles?.length ?? 0),
1439
+ };
1440
+ }
1441
+
1442
+ private snapshotPendingPrompts(
1443
+ session: ActiveSession,
1444
+ ): SessionPendingPrompt[] {
1445
+ return session.pendingPrompts.map((entry) =>
1446
+ this.snapshotPendingPrompt(entry),
1447
+ );
1448
+ }
1449
+
1117
1450
  private emitPendingPromptSubmitted(
1118
1451
  session: ActiveSession,
1119
1452
  entry: {
@@ -1142,6 +1475,7 @@ export class LocalRuntimeHost implements RuntimeHost {
1142
1475
  private createSpawnTool(
1143
1476
  config: CoreSessionConfig,
1144
1477
  rootSessionId: string,
1478
+ toolExecutors?: Partial<ToolExecutors>,
1145
1479
  ): Tool {
1146
1480
  const createSubAgentTools = () => {
1147
1481
  const tools: Tool[] = config.enableTools
@@ -1152,13 +1486,13 @@ export class LocalRuntimeHost implements RuntimeHost {
1152
1486
  mode: config.mode,
1153
1487
  })
1154
1488
  ],
1155
- executors: this.defaultToolExecutors,
1489
+ executors: toolExecutors,
1156
1490
  })
1157
1491
  : [];
1158
1492
  if (config.enableSpawnAgent) {
1159
- tools.push(this.createSpawnTool(config, rootSessionId));
1493
+ tools.push(this.createSpawnTool(config, rootSessionId, toolExecutors));
1160
1494
  }
1161
- return tools;
1495
+ return filterDisabledTools(tools);
1162
1496
  };
1163
1497
 
1164
1498
  return createSpawnAgentTool({
@@ -1395,13 +1729,7 @@ export class LocalRuntimeHost implements RuntimeHost {
1395
1729
  session: ActiveSession,
1396
1730
  overrides: { apiKey?: string; modelId?: string },
1397
1731
  ): void {
1398
- const agentWithConnection = session.agent as Agent & {
1399
- updateConnection?: (overrides: {
1400
- apiKey?: string;
1401
- modelId?: string;
1402
- }) => void;
1403
- };
1404
- agentWithConnection.updateConnection?.(overrides);
1732
+ session.agent.updateConnection(overrides);
1405
1733
  }
1406
1734
 
1407
1735
  private getSessionAgentTelemetryIdentity(session: ActiveSession) {
@@ -1414,14 +1742,12 @@ export class LocalRuntimeHost implements RuntimeHost {
1414
1742
  });
1415
1743
  }
1416
1744
 
1417
- private readAgentId(agent: Agent): string | undefined {
1418
- return (agent as Agent & { getAgentId?: () => string }).getAgentId?.();
1745
+ private readAgentId(agent: SessionRuntime): string {
1746
+ return agent.getAgentId();
1419
1747
  }
1420
1748
 
1421
- private readAgentConversationId(agent: Agent): string | undefined {
1422
- return (
1423
- agent as Agent & { getConversationId?: () => string }
1424
- ).getConversationId?.();
1749
+ private readAgentConversationId(agent: SessionRuntime): string {
1750
+ return agent.getConversationId();
1425
1751
  }
1426
1752
 
1427
1753
  private emitStatus(sessionId: string, status: string): void {