@clinebot/core 0.0.34 → 0.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/README.md +12 -8
  2. package/dist/ClineCore.d.ts +48 -29
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/extensions/config/agent-config-loader.d.ts +2 -2
  5. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  6. package/dist/extensions/config/agent-config-parser.d.ts +1 -1
  7. package/dist/extensions/config/agent-config-parser.d.ts.map +1 -1
  8. package/dist/extensions/config/hooks-config-loader.d.ts +2 -2
  9. package/dist/extensions/config/hooks-config-loader.d.ts.map +1 -1
  10. package/dist/extensions/config/index.d.ts +3 -3
  11. package/dist/extensions/config/index.d.ts.map +1 -1
  12. package/dist/extensions/config/user-instruction-config-loader.d.ts +2 -2
  13. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  14. package/dist/extensions/plugin-sandbox-bootstrap.js +248 -248
  15. package/dist/extensions/tools/constants.d.ts.map +1 -0
  16. package/dist/extensions/tools/definitions.d.ts.map +1 -0
  17. package/dist/extensions/tools/executors/apply-patch-parser.d.ts.map +1 -0
  18. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -0
  19. package/dist/extensions/tools/executors/bash.d.ts.map +1 -0
  20. package/dist/extensions/tools/executors/editor.d.ts.map +1 -0
  21. package/dist/extensions/tools/executors/file-read.d.ts.map +1 -0
  22. package/dist/extensions/tools/executors/index.d.ts.map +1 -0
  23. package/dist/extensions/tools/executors/search.d.ts.map +1 -0
  24. package/dist/extensions/tools/executors/web-fetch.d.ts.map +1 -0
  25. package/dist/extensions/tools/helpers.d.ts.map +1 -0
  26. package/dist/extensions/tools/index.d.ts.map +1 -0
  27. package/dist/{tools → extensions/tools}/model-tool-routing.d.ts +1 -1
  28. package/dist/extensions/tools/model-tool-routing.d.ts.map +1 -0
  29. package/dist/{tools → extensions/tools}/presets.d.ts +1 -2
  30. package/dist/extensions/tools/presets.d.ts.map +1 -0
  31. package/dist/extensions/tools/schemas.d.ts.map +1 -0
  32. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -0
  33. package/dist/extensions/tools/team/index.d.ts.map +1 -0
  34. package/dist/{team → extensions/tools/team}/multi-agent.d.ts +1 -3
  35. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -0
  36. package/dist/extensions/tools/team/projections.d.ts.map +1 -0
  37. package/dist/extensions/tools/team/runtime.d.ts.map +1 -0
  38. package/dist/{team → extensions/tools/team}/spawn-agent-tool.d.ts +0 -1
  39. package/dist/extensions/tools/team/spawn-agent-tool.d.ts.map +1 -0
  40. package/dist/extensions/tools/team/subagent-prompts.d.ts.map +1 -0
  41. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -0
  42. package/dist/{tools → extensions/tools}/types.d.ts +4 -3
  43. package/dist/extensions/tools/types.d.ts.map +1 -0
  44. package/dist/{runtime → hooks}/checkpoint-hooks.d.ts +7 -0
  45. package/dist/hooks/checkpoint-hooks.d.ts.map +1 -0
  46. package/dist/{runtime → hooks}/hook-file-hooks.d.ts +0 -2
  47. package/dist/hooks/hook-file-hooks.d.ts.map +1 -0
  48. package/dist/hooks/subprocess.d.ts +3 -130
  49. package/dist/hooks/subprocess.d.ts.map +1 -1
  50. package/dist/index.d.ts +35 -33
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +381 -379
  53. package/dist/runtime/history.d.ts +4 -0
  54. package/dist/runtime/history.d.ts.map +1 -0
  55. package/dist/runtime/host.d.ts +9 -0
  56. package/dist/runtime/host.d.ts.map +1 -0
  57. package/dist/{session → runtime}/rpc-runtime-ensure.d.ts +13 -1
  58. package/dist/{session → runtime}/rpc-runtime-ensure.d.ts.map +1 -1
  59. package/dist/{session → runtime}/rpc-spawn-lease.d.ts.map +1 -1
  60. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  61. package/dist/{session/session-manager.d.ts → runtime/runtime-host.d.ts} +55 -12
  62. package/dist/runtime/runtime-host.d.ts.map +1 -0
  63. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts +1 -1
  64. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts.map +1 -1
  65. package/dist/runtime/session-runtime.d.ts +2 -2
  66. package/dist/runtime/session-runtime.d.ts.map +1 -1
  67. package/dist/{session/session-agent-events.d.ts → services/agent-events.d.ts} +4 -4
  68. package/dist/services/agent-events.d.ts.map +1 -0
  69. package/dist/services/config.d.ts +3 -0
  70. package/dist/services/config.d.ts.map +1 -0
  71. package/dist/services/local-runtime-bootstrap.d.ts +41 -0
  72. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -0
  73. package/dist/services/providers/local-provider-registry.d.ts.map +1 -0
  74. package/dist/services/providers/local-provider-service.d.ts.map +1 -0
  75. package/dist/{session → services}/session-artifacts.d.ts +0 -4
  76. package/dist/services/session-artifacts.d.ts.map +1 -0
  77. package/dist/{session/utils/helpers.d.ts → services/session-data.d.ts} +19 -27
  78. package/dist/services/session-data.d.ts.map +1 -0
  79. package/dist/{session → services}/session-telemetry.d.ts +2 -2
  80. package/dist/services/session-telemetry.d.ts.map +1 -0
  81. package/dist/{storage → services/storage}/file-team-store.d.ts +2 -2
  82. package/dist/services/storage/file-team-store.d.ts.map +1 -0
  83. package/dist/{storage → services/storage}/provider-settings-legacy-migration.d.ts +1 -1
  84. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -0
  85. package/dist/{storage → services/storage}/provider-settings-manager.d.ts +1 -1
  86. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -0
  87. package/dist/{storage → services/storage}/sqlite-session-store.d.ts +3 -3
  88. package/dist/services/storage/sqlite-session-store.d.ts.map +1 -0
  89. package/dist/{storage → services/storage}/sqlite-team-store.d.ts +2 -2
  90. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -0
  91. package/dist/{storage → services/storage}/team-store.d.ts +1 -1
  92. package/dist/services/storage/team-store.d.ts.map +1 -0
  93. package/dist/services/telemetry/ITelemetryAdapter.d.ts.map +1 -0
  94. package/dist/services/telemetry/OpenTelemetryAdapter.d.ts.map +1 -0
  95. package/dist/services/telemetry/OpenTelemetryProvider.d.ts.map +1 -0
  96. package/dist/services/telemetry/TelemetryLoggerSink.d.ts.map +1 -0
  97. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -0
  98. package/dist/services/telemetry/core-events.d.ts.map +1 -0
  99. package/dist/services/telemetry/distinct-id.d.ts.map +1 -0
  100. package/dist/services/telemetry/index.d.ts.map +1 -0
  101. package/dist/{telemetry → services/telemetry}/index.js +6 -6
  102. package/dist/{session/utils → services}/usage.d.ts +1 -1
  103. package/dist/services/usage.d.ts.map +1 -0
  104. package/dist/services/workspace/file-indexer.d.ts.map +1 -0
  105. package/dist/services/workspace/index.d.ts.map +1 -0
  106. package/dist/services/workspace/mention-enricher.d.ts.map +1 -0
  107. package/dist/services/workspace-manifest.d.ts.map +1 -0
  108. package/dist/session/file-session-service.d.ts +4 -1
  109. package/dist/session/file-session-service.d.ts.map +1 -1
  110. package/dist/session/persistence-service.d.ts +8 -6
  111. package/dist/session/persistence-service.d.ts.map +1 -1
  112. package/dist/session/rpc-session-service.d.ts +3 -0
  113. package/dist/session/rpc-session-service.d.ts.map +1 -1
  114. package/dist/session/session-service.d.ts +8 -9
  115. package/dist/session/session-service.d.ts.map +1 -1
  116. package/dist/session/session-team-coordination.d.ts +4 -4
  117. package/dist/session/session-team-coordination.d.ts.map +1 -1
  118. package/dist/session/sqlite-rpc-session-backend.d.ts.map +1 -1
  119. package/dist/{session/default-session-manager.d.ts → transports/local.d.ts} +24 -14
  120. package/dist/transports/local.d.ts.map +1 -0
  121. package/dist/transports/rpc.d.ts +51 -0
  122. package/dist/transports/rpc.d.ts.map +1 -0
  123. package/dist/transports/runtime-host-support.d.ts +21 -0
  124. package/dist/transports/runtime-host-support.d.ts.map +1 -0
  125. package/dist/types/chat-schema.d.ts.map +1 -0
  126. package/dist/types/config.d.ts +2 -2
  127. package/dist/types/config.d.ts.map +1 -1
  128. package/dist/{session/utils/types.d.ts → types/session.d.ts} +15 -6
  129. package/dist/types/session.d.ts.map +1 -0
  130. package/dist/types/sessions.d.ts +19 -0
  131. package/dist/types/sessions.d.ts.map +1 -1
  132. package/dist/types/storage.d.ts +1 -3
  133. package/dist/types/storage.d.ts.map +1 -1
  134. package/dist/types.d.ts +7 -6
  135. package/dist/types.d.ts.map +1 -1
  136. package/package.json +7 -12
  137. package/src/ClineCore.test.ts +95 -19
  138. package/src/ClineCore.ts +120 -50
  139. package/src/auth/cline.ts +1 -1
  140. package/src/auth/codex.ts +1 -1
  141. package/src/auth/oca.ts +1 -1
  142. package/src/extensions/config/agent-config-loader.test.ts +3 -3
  143. package/src/extensions/config/agent-config-loader.ts +1 -5
  144. package/src/extensions/config/agent-config-parser.ts +1 -1
  145. package/src/extensions/config/hooks-config-loader.ts +1 -2
  146. package/src/extensions/config/index.ts +0 -4
  147. package/src/extensions/config/user-instruction-config-loader.ts +0 -4
  148. package/src/extensions/plugin/plugin-config-loader.test.ts +6 -4
  149. package/src/{tools → extensions/tools}/definitions.ts +1 -1
  150. package/src/extensions/tools/executors/file-read.test.ts +125 -0
  151. package/src/{tools → extensions/tools}/executors/file-read.ts +29 -4
  152. package/src/{tools → extensions/tools}/executors/search.ts +1 -1
  153. package/src/{tools → extensions/tools}/model-tool-routing.ts +1 -1
  154. package/src/{tools → extensions/tools}/presets.ts +2 -3
  155. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +455 -0
  156. package/src/{team → extensions/tools/team}/multi-agent.ts +80 -17
  157. package/src/{team → extensions/tools/team}/spawn-agent-tool.test.ts +0 -6
  158. package/src/{team → extensions/tools/team}/spawn-agent-tool.ts +1 -7
  159. package/src/{team → extensions/tools/team}/subagent-prompts.ts +2 -2
  160. package/src/{team → extensions/tools/team}/team-tools.test.ts +43 -31
  161. package/src/{team → extensions/tools/team}/team-tools.ts +63 -53
  162. package/src/{tools → extensions/tools}/types.ts +5 -3
  163. package/src/{runtime → hooks}/checkpoint-hooks.ts +27 -0
  164. package/src/{runtime → hooks}/hook-file-hooks.ts +6 -11
  165. package/src/hooks/subprocess.ts +48 -257
  166. package/src/index.ts +167 -158
  167. package/src/runtime/history.test.ts +114 -0
  168. package/src/runtime/history.ts +237 -0
  169. package/src/runtime/host.test.ts +230 -0
  170. package/src/runtime/host.ts +362 -0
  171. package/src/runtime/rpc-runtime-ensure.test.ts +123 -0
  172. package/src/{session → runtime}/rpc-runtime-ensure.ts +165 -27
  173. package/src/{session → runtime}/rpc-spawn-lease.test.ts +33 -1
  174. package/src/{session → runtime}/rpc-spawn-lease.ts +54 -20
  175. package/src/runtime/runtime-builder.team-persistence.test.ts +6 -3
  176. package/src/runtime/runtime-builder.test.ts +3 -4
  177. package/src/runtime/runtime-builder.ts +13 -21
  178. package/src/runtime/runtime-host.ts +178 -0
  179. package/src/{session → runtime}/runtime-oauth-token-manager.ts +1 -1
  180. package/src/runtime/runtime-parity.test.ts +1 -1
  181. package/src/runtime/session-runtime.ts +2 -2
  182. package/src/{session/session-agent-events.ts → services/agent-events.ts} +7 -7
  183. package/src/services/config.ts +5 -0
  184. package/src/services/local-runtime-bootstrap.ts +280 -0
  185. package/src/{providers → services/providers}/local-provider-service.ts +4 -4
  186. package/src/{session → services}/session-artifacts.ts +7 -19
  187. package/src/{session/utils/helpers.test.ts → services/session-data.test.ts} +1 -1
  188. package/src/{session/utils/helpers.ts → services/session-data.ts} +76 -72
  189. package/src/{session → services}/session-telemetry.ts +7 -9
  190. package/src/services/storage/artifact-store.ts +1 -0
  191. package/src/{storage → services/storage}/file-team-store.ts +2 -2
  192. package/src/{storage → services/storage}/provider-settings-legacy-migration.test.ts +1 -1
  193. package/src/{storage → services/storage}/provider-settings-legacy-migration.ts +2 -2
  194. package/src/{storage → services/storage}/provider-settings-manager.ts +2 -2
  195. package/src/services/storage/session-store.ts +1 -0
  196. package/src/{storage → services/storage}/sqlite-session-store.ts +7 -12
  197. package/src/{storage → services/storage}/sqlite-team-store.ts +4 -4
  198. package/src/{storage → services/storage}/team-store.ts +1 -1
  199. package/src/{session/utils → services}/usage.ts +1 -1
  200. package/src/{input → services/workspace}/file-indexer.test.ts +30 -1
  201. package/src/{input → services/workspace}/file-indexer.ts +26 -2
  202. package/src/{input → services/workspace}/mention-enricher.test.ts +21 -0
  203. package/src/{input → services/workspace}/mention-enricher.ts +1 -1
  204. package/src/session/file-session-service.ts +9 -7
  205. package/src/session/index.ts +25 -17
  206. package/src/session/persistence-service.test.ts +86 -27
  207. package/src/session/persistence-service.ts +104 -103
  208. package/src/session/rpc-session-service.ts +9 -2
  209. package/src/session/session-service.team-persistence.test.ts +1 -1
  210. package/src/session/session-service.ts +32 -19
  211. package/src/session/session-team-coordination.ts +13 -6
  212. package/src/session/sqlite-rpc-session-backend.ts +4 -6
  213. package/src/session/workspace-manager.ts +1 -1
  214. package/src/{session/default-session-manager.e2e.test.ts → transports/local.e2e.test.ts} +13 -17
  215. package/src/{session/default-session-manager.test.ts → transports/local.test.ts} +316 -230
  216. package/src/{session/default-session-manager.ts → transports/local.ts} +137 -169
  217. package/src/transports/rpc.test.ts +82 -0
  218. package/src/transports/rpc.ts +665 -0
  219. package/src/transports/runtime-host-support.ts +86 -0
  220. package/src/types/config.ts +2 -2
  221. package/src/{session/utils/types.ts → types/session.ts} +18 -5
  222. package/src/types/sessions.ts +21 -0
  223. package/src/types/storage.ts +1 -6
  224. package/src/types.ts +25 -18
  225. package/dist/chat/chat-schema.d.ts.map +0 -1
  226. package/dist/input/file-indexer.d.ts.map +0 -1
  227. package/dist/input/index.d.ts.map +0 -1
  228. package/dist/input/mention-enricher.d.ts.map +0 -1
  229. package/dist/prompt/default-system.d.ts +0 -2
  230. package/dist/prompt/default-system.d.ts.map +0 -1
  231. package/dist/providers/local-provider-registry.d.ts.map +0 -1
  232. package/dist/providers/local-provider-service.d.ts.map +0 -1
  233. package/dist/runtime/checkpoint-hooks.d.ts.map +0 -1
  234. package/dist/runtime/hook-file-hooks.d.ts.map +0 -1
  235. package/dist/session/default-session-manager.d.ts.map +0 -1
  236. package/dist/session/session-agent-events.d.ts.map +0 -1
  237. package/dist/session/session-artifacts.d.ts.map +0 -1
  238. package/dist/session/session-config-builder.d.ts +0 -16
  239. package/dist/session/session-config-builder.d.ts.map +0 -1
  240. package/dist/session/session-host.d.ts +0 -15
  241. package/dist/session/session-host.d.ts.map +0 -1
  242. package/dist/session/session-manager.d.ts.map +0 -1
  243. package/dist/session/session-telemetry.d.ts.map +0 -1
  244. package/dist/session/utils/helpers.d.ts.map +0 -1
  245. package/dist/session/utils/types.d.ts.map +0 -1
  246. package/dist/session/utils/usage.d.ts.map +0 -1
  247. package/dist/session/workspace-manifest.d.ts.map +0 -1
  248. package/dist/storage/file-team-store.d.ts.map +0 -1
  249. package/dist/storage/provider-settings-legacy-migration.d.ts.map +0 -1
  250. package/dist/storage/provider-settings-manager.d.ts.map +0 -1
  251. package/dist/storage/sqlite-session-store.d.ts.map +0 -1
  252. package/dist/storage/sqlite-team-store.d.ts.map +0 -1
  253. package/dist/storage/team-store.d.ts.map +0 -1
  254. package/dist/team/delegated-agent.d.ts.map +0 -1
  255. package/dist/team/index.d.ts.map +0 -1
  256. package/dist/team/multi-agent.d.ts.map +0 -1
  257. package/dist/team/projections.d.ts.map +0 -1
  258. package/dist/team/runtime.d.ts.map +0 -1
  259. package/dist/team/spawn-agent-tool.d.ts.map +0 -1
  260. package/dist/team/subagent-prompts.d.ts.map +0 -1
  261. package/dist/team/team-tools.d.ts.map +0 -1
  262. package/dist/telemetry/ITelemetryAdapter.d.ts.map +0 -1
  263. package/dist/telemetry/OpenTelemetryAdapter.d.ts.map +0 -1
  264. package/dist/telemetry/OpenTelemetryProvider.d.ts.map +0 -1
  265. package/dist/telemetry/TelemetryLoggerSink.d.ts.map +0 -1
  266. package/dist/telemetry/TelemetryService.d.ts.map +0 -1
  267. package/dist/telemetry/core-events.d.ts.map +0 -1
  268. package/dist/telemetry/distinct-id.d.ts.map +0 -1
  269. package/dist/telemetry/index.d.ts.map +0 -1
  270. package/dist/tools/constants.d.ts.map +0 -1
  271. package/dist/tools/definitions.d.ts.map +0 -1
  272. package/dist/tools/executors/apply-patch-parser.d.ts.map +0 -1
  273. package/dist/tools/executors/apply-patch.d.ts.map +0 -1
  274. package/dist/tools/executors/bash.d.ts.map +0 -1
  275. package/dist/tools/executors/editor.d.ts.map +0 -1
  276. package/dist/tools/executors/file-read.d.ts.map +0 -1
  277. package/dist/tools/executors/index.d.ts.map +0 -1
  278. package/dist/tools/executors/search.d.ts.map +0 -1
  279. package/dist/tools/executors/web-fetch.d.ts.map +0 -1
  280. package/dist/tools/helpers.d.ts.map +0 -1
  281. package/dist/tools/index.d.ts.map +0 -1
  282. package/dist/tools/model-tool-routing.d.ts.map +0 -1
  283. package/dist/tools/presets.d.ts.map +0 -1
  284. package/dist/tools/schemas.d.ts.map +0 -1
  285. package/dist/tools/types.d.ts.map +0 -1
  286. package/src/prompt/default-system.ts +0 -21
  287. package/src/session/session-config-builder.ts +0 -172
  288. package/src/session/session-host.test.ts +0 -89
  289. package/src/session/session-host.ts +0 -213
  290. package/src/session/session-manager.ts +0 -74
  291. package/src/storage/artifact-store.ts +0 -1
  292. package/src/storage/session-store.ts +0 -1
  293. package/src/team/multi-agent.lifecycle.test.ts +0 -201
  294. package/src/tools/executors/file-read.test.ts +0 -49
  295. /package/dist/{tools → extensions/tools}/constants.d.ts +0 -0
  296. /package/dist/{tools → extensions/tools}/definitions.d.ts +0 -0
  297. /package/dist/{tools → extensions/tools}/executors/apply-patch-parser.d.ts +0 -0
  298. /package/dist/{tools → extensions/tools}/executors/apply-patch.d.ts +0 -0
  299. /package/dist/{tools → extensions/tools}/executors/bash.d.ts +0 -0
  300. /package/dist/{tools → extensions/tools}/executors/editor.d.ts +0 -0
  301. /package/dist/{tools → extensions/tools}/executors/file-read.d.ts +0 -0
  302. /package/dist/{tools → extensions/tools}/executors/index.d.ts +0 -0
  303. /package/dist/{tools → extensions/tools}/executors/search.d.ts +0 -0
  304. /package/dist/{tools → extensions/tools}/executors/web-fetch.d.ts +0 -0
  305. /package/dist/{tools → extensions/tools}/helpers.d.ts +0 -0
  306. /package/dist/{tools → extensions/tools}/index.d.ts +0 -0
  307. /package/dist/{tools → extensions/tools}/schemas.d.ts +0 -0
  308. /package/dist/{team → extensions/tools/team}/delegated-agent.d.ts +0 -0
  309. /package/dist/{team → extensions/tools/team}/index.d.ts +0 -0
  310. /package/dist/{team → extensions/tools/team}/projections.d.ts +0 -0
  311. /package/dist/{team → extensions/tools/team}/runtime.d.ts +0 -0
  312. /package/dist/{team → extensions/tools/team}/subagent-prompts.d.ts +0 -0
  313. /package/dist/{team → extensions/tools/team}/team-tools.d.ts +0 -0
  314. /package/dist/{session → runtime}/rpc-spawn-lease.d.ts +0 -0
  315. /package/dist/{providers → services/providers}/local-provider-registry.d.ts +0 -0
  316. /package/dist/{providers → services/providers}/local-provider-service.d.ts +0 -0
  317. /package/dist/{telemetry → services/telemetry}/ITelemetryAdapter.d.ts +0 -0
  318. /package/dist/{telemetry → services/telemetry}/OpenTelemetryAdapter.d.ts +0 -0
  319. /package/dist/{telemetry → services/telemetry}/OpenTelemetryProvider.d.ts +0 -0
  320. /package/dist/{telemetry → services/telemetry}/TelemetryLoggerSink.d.ts +0 -0
  321. /package/dist/{telemetry → services/telemetry}/TelemetryService.d.ts +0 -0
  322. /package/dist/{telemetry → services/telemetry}/core-events.d.ts +0 -0
  323. /package/dist/{telemetry → services/telemetry}/distinct-id.d.ts +0 -0
  324. /package/dist/{telemetry → services/telemetry}/index.d.ts +0 -0
  325. /package/dist/{input → services/workspace}/file-indexer.d.ts +0 -0
  326. /package/dist/{input → services/workspace}/index.d.ts +0 -0
  327. /package/dist/{input → services/workspace}/mention-enricher.d.ts +0 -0
  328. /package/dist/{session → services}/workspace-manifest.d.ts +0 -0
  329. /package/dist/{chat → types}/chat-schema.d.ts +0 -0
  330. /package/src/{tools → extensions/tools}/constants.ts +0 -0
  331. /package/src/{tools → extensions/tools}/definitions.test.ts +0 -0
  332. /package/src/{tools → extensions/tools}/executors/apply-patch-parser.ts +0 -0
  333. /package/src/{tools → extensions/tools}/executors/apply-patch.ts +0 -0
  334. /package/src/{tools → extensions/tools}/executors/bash.test.ts +0 -0
  335. /package/src/{tools → extensions/tools}/executors/bash.ts +0 -0
  336. /package/src/{tools → extensions/tools}/executors/editor.test.ts +0 -0
  337. /package/src/{tools → extensions/tools}/executors/editor.ts +0 -0
  338. /package/src/{tools → extensions/tools}/executors/index.ts +0 -0
  339. /package/src/{tools → extensions/tools}/executors/web-fetch.ts +0 -0
  340. /package/src/{tools → extensions/tools}/helpers.ts +0 -0
  341. /package/src/{tools → extensions/tools}/index.ts +0 -0
  342. /package/src/{tools → extensions/tools}/model-tool-routing.test.ts +0 -0
  343. /package/src/{tools → extensions/tools}/presets.test.ts +0 -0
  344. /package/src/{tools → extensions/tools}/schemas.ts +0 -0
  345. /package/src/{team → extensions/tools/team}/delegated-agent.ts +0 -0
  346. /package/src/{team → extensions/tools/team}/index.ts +0 -0
  347. /package/src/{team → extensions/tools/team}/projections.ts +0 -0
  348. /package/src/{team → extensions/tools/team}/runtime.ts +0 -0
  349. /package/src/{runtime → hooks}/checkpoint-hooks.test.ts +0 -0
  350. /package/src/{runtime → hooks}/hook-file-hooks.test.ts +0 -0
  351. /package/src/{session → runtime}/runtime-oauth-token-manager.test.ts +0 -0
  352. /package/src/{providers → services/providers}/local-provider-registry.ts +0 -0
  353. /package/src/{providers → services/providers}/local-provider-service.test.ts +0 -0
  354. /package/src/{storage → services/storage}/index.ts +0 -0
  355. /package/src/{storage → services/storage}/provider-settings-manager.test.ts +0 -0
  356. /package/src/{telemetry → services/telemetry}/ITelemetryAdapter.ts +0 -0
  357. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.test.ts +0 -0
  358. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.ts +0 -0
  359. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.test.ts +0 -0
  360. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.ts +0 -0
  361. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.test.ts +0 -0
  362. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.ts +0 -0
  363. /package/src/{telemetry → services/telemetry}/TelemetryService.test.ts +0 -0
  364. /package/src/{telemetry → services/telemetry}/TelemetryService.ts +0 -0
  365. /package/src/{telemetry → services/telemetry}/core-events.ts +0 -0
  366. /package/src/{telemetry → services/telemetry}/distinct-id.test.ts +0 -0
  367. /package/src/{telemetry → services/telemetry}/distinct-id.ts +0 -0
  368. /package/src/{telemetry → services/telemetry}/index.ts +0 -0
  369. /package/src/{input → services/workspace}/file-indexer.d.ts +0 -0
  370. /package/src/{input → services/workspace}/index.ts +0 -0
  371. /package/src/{session → services}/workspace-manifest.ts +0 -0
  372. /package/src/{chat → types}/chat-schema.ts +0 -0
@@ -5,11 +5,15 @@ import { join } from "node:path";
5
5
  import type { AgentResult } from "@clinebot/shared";
6
6
  import { setClineDir, setHomeDir } from "@clinebot/shared/storage";
7
7
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
8
- import { TelemetryService } from "../telemetry/TelemetryService";
8
+ import {
9
+ type StartSessionInput,
10
+ splitCoreSessionConfig,
11
+ } from "../runtime/runtime-host";
12
+ import { TelemetryService } from "../services/telemetry/TelemetryService";
13
+ import type { SessionManifest } from "../session/session-manifest";
9
14
  import { SessionSource } from "../types/common";
10
15
  import type { CoreSessionConfig } from "../types/config";
11
- import { DefaultSessionManager } from "./default-session-manager";
12
- import type { SessionManifest } from "./session-manifest";
16
+ import { LocalRuntimeHost as RuntimeHostUnderTest } from "./local";
13
17
 
14
18
  const distinctId = "test-machine-id";
15
19
 
@@ -68,7 +72,7 @@ type PluginEventTestHarness = {
68
72
  };
69
73
 
70
74
  function createPluginEventHarness(
71
- manager: DefaultSessionManager,
75
+ manager: RuntimeHostUnderTest,
72
76
  ): PluginEventTestHarness {
73
77
  const target = manager as object;
74
78
  return {
@@ -120,6 +124,7 @@ function createConfig(
120
124
  modelId: "mock-model",
121
125
  cwd: "/tmp/project",
122
126
  systemPrompt: "You are a test agent",
127
+ mode: "act",
123
128
  enableTools: true,
124
129
  enableSpawnAgent: true,
125
130
  enableAgentTeams: true,
@@ -127,6 +132,18 @@ function createConfig(
127
132
  };
128
133
  }
129
134
 
135
+ function normalizeStartInput(
136
+ input: Omit<StartSessionInput, "config" | "localRuntime"> & {
137
+ config: CoreSessionConfig;
138
+ },
139
+ ): StartSessionInput {
140
+ const split = splitCoreSessionConfig(input.config);
141
+ return {
142
+ ...input,
143
+ ...split,
144
+ };
145
+ }
146
+
130
147
  function createGitRepo(cwd: string): void {
131
148
  execFileSync("git", ["-C", cwd, "init"], { stdio: "pipe" });
132
149
  execFileSync("git", ["-C", cwd, "config", "user.name", "Codex Test"], {
@@ -146,7 +163,7 @@ function createGitRepo(cwd: string): void {
146
163
  });
147
164
  }
148
165
 
149
- describe("DefaultSessionManager", () => {
166
+ describe("LocalRuntimeHost", () => {
150
167
  const envSnapshot = {
151
168
  HOME: process.env.HOME,
152
169
  CLINE_DIR: process.env.CLINE_DIR,
@@ -191,8 +208,6 @@ describe("DefaultSessionManager", () => {
191
208
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
192
209
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
193
210
  manifestPath: "/tmp/manifest.json",
194
- transcriptPath: "/tmp/transcript.log",
195
- hookPath: "/tmp/hook.log",
196
211
  messagesPath: "/tmp/messages.json",
197
212
  manifest,
198
213
  }),
@@ -225,7 +240,7 @@ describe("DefaultSessionManager", () => {
225
240
  abort: vi.fn(),
226
241
  shutdown: vi.fn().mockResolvedValue(undefined),
227
242
  };
228
- const manager = new DefaultSessionManager({
243
+ const manager = new RuntimeHostUnderTest({
229
244
  distinctId,
230
245
  sessionService: sessionService as never,
231
246
  runtimeBuilder: runtimeBuilder as never,
@@ -233,10 +248,12 @@ describe("DefaultSessionManager", () => {
233
248
  telemetry,
234
249
  });
235
250
 
236
- await manager.start({
237
- config: createConfig({ telemetry, sessionId }),
238
- prompt: "hello",
239
- });
251
+ await manager.start(
252
+ normalizeStartInput({
253
+ config: createConfig({ telemetry, sessionId }),
254
+ prompt: "hello",
255
+ }),
256
+ );
240
257
 
241
258
  expect(adapter.emit).toHaveBeenCalledWith(
242
259
  "session.started",
@@ -281,8 +298,6 @@ describe("DefaultSessionManager", () => {
281
298
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
282
299
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
283
300
  manifestPath: "/tmp/manifest.json",
284
- transcriptPath: "/tmp/transcript.log",
285
- hookPath: "/tmp/hook.log",
286
301
  messagesPath: "/tmp/messages.json",
287
302
  manifest,
288
303
  }),
@@ -312,18 +327,20 @@ describe("DefaultSessionManager", () => {
312
327
  abort: vi.fn(),
313
328
  shutdown: vi.fn().mockResolvedValue(undefined),
314
329
  };
315
- const manager = new DefaultSessionManager({
330
+ const manager = new RuntimeHostUnderTest({
316
331
  distinctId,
317
332
  sessionService: sessionService as never,
318
333
  runtimeBuilder: runtimeBuilder as never,
319
334
  createAgent: () => agent as never,
320
335
  });
321
336
 
322
- const started = await manager.start({
323
- source: "kanban",
324
- config: createConfig({ sessionId }),
325
- prompt: "hello",
326
- });
337
+ const started = await manager.start(
338
+ normalizeStartInput({
339
+ source: "kanban",
340
+ config: createConfig({ sessionId }),
341
+ prompt: "hello",
342
+ }),
343
+ );
327
344
 
328
345
  expect(sessionService.createRootSessionWithArtifacts).toHaveBeenCalledWith(
329
346
  expect.objectContaining({
@@ -341,8 +358,6 @@ describe("DefaultSessionManager", () => {
341
358
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
342
359
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
343
360
  manifestPath: "/tmp/manifest.json",
344
- transcriptPath: "/tmp/transcript.log",
345
- hookPath: "/tmp/hook.log",
346
361
  messagesPath: "/tmp/messages.json",
347
362
  manifest,
348
363
  }),
@@ -378,8 +393,6 @@ describe("DefaultSessionManager", () => {
378
393
  isSubagent: false,
379
394
  prompt: null,
380
395
  metadata: null,
381
- transcriptPath: "/tmp/transcript.log",
382
- hookPath: "/tmp/hook.log",
383
396
  messagesPath: "/tmp/messages.json",
384
397
  updatedAt: "2026-01-01T00:00:00.000Z",
385
398
  },
@@ -406,16 +419,18 @@ describe("DefaultSessionManager", () => {
406
419
  abort: vi.fn(),
407
420
  shutdown: vi.fn().mockResolvedValue(undefined),
408
421
  };
409
- const manager = new DefaultSessionManager({
422
+ const manager = new RuntimeHostUnderTest({
410
423
  distinctId,
411
424
  sessionService: sessionService as never,
412
425
  runtimeBuilder: runtimeBuilder as never,
413
426
  createAgent: () => agent as never,
414
427
  });
415
428
 
416
- await manager.start({
417
- config: createConfig({ sessionId, teamName: undefined }),
418
- });
429
+ await manager.start(
430
+ normalizeStartInput({
431
+ config: createConfig({ sessionId, teamName: undefined }),
432
+ }),
433
+ );
419
434
 
420
435
  expect(runtimeBuilder.build).toHaveBeenCalledWith(
421
436
  expect.objectContaining({
@@ -435,8 +450,6 @@ describe("DefaultSessionManager", () => {
435
450
  const manifest = createManifest(sessionId);
436
451
  const createRootSessionWithArtifacts = vi.fn().mockResolvedValue({
437
452
  manifestPath: "/tmp/manifest.json",
438
- transcriptPath: "/tmp/transcript.log",
439
- hookPath: "/tmp/hook.log",
440
453
  messagesPath: "/tmp/messages.json",
441
454
  manifest,
442
455
  });
@@ -482,18 +495,20 @@ describe("DefaultSessionManager", () => {
482
495
  messages: [],
483
496
  };
484
497
 
485
- const manager = new DefaultSessionManager({
498
+ const manager = new RuntimeHostUnderTest({
486
499
  distinctId,
487
500
  sessionService: sessionService as never,
488
501
  runtimeBuilder,
489
502
  createAgent: () => agent as never,
490
503
  });
491
504
 
492
- const started = await manager.start({
493
- config: createConfig({ sessionId }),
494
- prompt: "hello",
495
- interactive: false,
496
- });
505
+ const started = await manager.start(
506
+ normalizeStartInput({
507
+ config: createConfig({ sessionId }),
508
+ prompt: "hello",
509
+ interactive: false,
510
+ }),
511
+ );
497
512
 
498
513
  expect(started.sessionId).toBe(sessionId);
499
514
  expect(started.result?.finishReason).toBe("completed");
@@ -528,8 +543,6 @@ describe("DefaultSessionManager", () => {
528
543
  };
529
544
  const createRootSessionWithArtifacts = vi.fn().mockResolvedValue({
530
545
  manifestPath: "/tmp/manifest-history-meta.json",
531
- transcriptPath: "/tmp/transcript-history-meta.log",
532
- hookPath: "/tmp/hook-history-meta.log",
533
546
  messagesPath: "/tmp/messages-history-meta.json",
534
547
  manifest: { ...storedManifest },
535
548
  });
@@ -591,18 +604,20 @@ describe("DefaultSessionManager", () => {
591
604
  messages: [],
592
605
  };
593
606
 
594
- const manager = new DefaultSessionManager({
607
+ const manager = new RuntimeHostUnderTest({
595
608
  distinctId,
596
609
  sessionService: sessionService as never,
597
610
  runtimeBuilder,
598
611
  createAgent: () => agent as never,
599
612
  });
600
613
 
601
- await manager.start({
602
- config: createConfig({ sessionId }),
603
- prompt: "hello",
604
- interactive: false,
605
- });
614
+ await manager.start(
615
+ normalizeStartInput({
616
+ config: createConfig({ sessionId }),
617
+ prompt: "hello",
618
+ interactive: false,
619
+ }),
620
+ );
606
621
 
607
622
  expect(updateSession).toHaveBeenCalledWith({
608
623
  sessionId,
@@ -657,8 +672,6 @@ describe("DefaultSessionManager", () => {
657
672
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
658
673
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
659
674
  manifestPath: "/tmp/manifest-checkpoint-default-off.json",
660
- transcriptPath: "/tmp/transcript-checkpoint-default-off.log",
661
- hookPath: "/tmp/hook-checkpoint-default-off.log",
662
675
  messagesPath: "/tmp/messages-checkpoint-default-off.json",
663
676
  manifest,
664
677
  }),
@@ -689,7 +702,7 @@ describe("DefaultSessionManager", () => {
689
702
  };
690
703
  }),
691
704
  };
692
- const manager = new DefaultSessionManager({
705
+ const manager = new RuntimeHostUnderTest({
693
706
  distinctId,
694
707
  sessionService: sessionService as never,
695
708
  runtimeBuilder,
@@ -720,11 +733,13 @@ describe("DefaultSessionManager", () => {
720
733
  }) as never,
721
734
  });
722
735
 
723
- await manager.start({
724
- config: createConfig({ sessionId }),
725
- prompt: "hello",
726
- interactive: false,
727
- });
736
+ await manager.start(
737
+ normalizeStartInput({
738
+ config: createConfig({ sessionId }),
739
+ prompt: "hello",
740
+ interactive: false,
741
+ }),
742
+ );
728
743
  expect(updateSession).toHaveBeenCalledTimes(1);
729
744
  expect(updateSession).toHaveBeenLastCalledWith({
730
745
  sessionId,
@@ -744,8 +759,6 @@ describe("DefaultSessionManager", () => {
744
759
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
745
760
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
746
761
  manifestPath: "/tmp/manifest-checkpoint-env-on.json",
747
- transcriptPath: "/tmp/transcript-checkpoint-env-on.log",
748
- hookPath: "/tmp/hook-checkpoint-env-on.log",
749
762
  messagesPath: "/tmp/messages-checkpoint-env-on.json",
750
763
  manifest,
751
764
  }),
@@ -776,7 +789,7 @@ describe("DefaultSessionManager", () => {
776
789
  };
777
790
  }),
778
791
  };
779
- const manager = new DefaultSessionManager({
792
+ const manager = new RuntimeHostUnderTest({
780
793
  distinctId,
781
794
  sessionService: sessionService as never,
782
795
  runtimeBuilder,
@@ -807,14 +820,16 @@ describe("DefaultSessionManager", () => {
807
820
  }) as never,
808
821
  });
809
822
 
810
- await manager.start({
811
- config: {
812
- ...createConfig({ sessionId, cwd: repoCwd }),
813
- checkpoint: { enabled: true },
814
- },
815
- prompt: "hello",
816
- interactive: false,
817
- });
823
+ await manager.start(
824
+ normalizeStartInput({
825
+ config: {
826
+ ...createConfig({ sessionId, cwd: repoCwd }),
827
+ checkpoint: { enabled: true },
828
+ },
829
+ prompt: "hello",
830
+ interactive: false,
831
+ }),
832
+ );
818
833
  expect(updateSession).toHaveBeenCalledTimes(2);
819
834
  expect(updateSession).toHaveBeenNthCalledWith(1, {
820
835
  sessionId,
@@ -843,8 +858,6 @@ describe("DefaultSessionManager", () => {
843
858
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
844
859
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
845
860
  manifestPath: "/tmp/manifest-meta.json",
846
- transcriptPath: "/tmp/transcript-meta.log",
847
- hookPath: "/tmp/hook-meta.log",
848
861
  messagesPath: "/tmp/messages-meta.json",
849
862
  manifest,
850
863
  }),
@@ -890,7 +903,7 @@ describe("DefaultSessionManager", () => {
890
903
  ],
891
904
  }),
892
905
  );
893
- const manager = new DefaultSessionManager({
906
+ const manager = new RuntimeHostUnderTest({
894
907
  distinctId,
895
908
  sessionService: sessionService as never,
896
909
  runtimeBuilder,
@@ -905,15 +918,17 @@ describe("DefaultSessionManager", () => {
905
918
  }) as never,
906
919
  });
907
920
 
908
- await manager.start({
909
- config: createConfig({
910
- sessionId,
911
- providerId: "anthropic",
912
- modelId: "claude-sonnet-4-6",
921
+ await manager.start(
922
+ normalizeStartInput({
923
+ config: createConfig({
924
+ sessionId,
925
+ providerId: "anthropic",
926
+ modelId: "claude-sonnet-4-6",
927
+ }),
928
+ prompt: "hello",
929
+ interactive: false,
913
930
  }),
914
- prompt: "hello",
915
- interactive: false,
916
- });
931
+ );
917
932
 
918
933
  expect(persistSessionMessages).toHaveBeenCalledTimes(1);
919
934
  const persisted = persistSessionMessages.mock.calls[0]?.[1];
@@ -943,8 +958,6 @@ describe("DefaultSessionManager", () => {
943
958
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
944
959
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
945
960
  manifestPath: "/tmp/manifest.json",
946
- transcriptPath: "/tmp/transcript.log",
947
- hookPath: "/tmp/hook.log",
948
961
  messagesPath: "/tmp/messages.json",
949
962
  manifest,
950
963
  }),
@@ -1001,18 +1014,20 @@ describe("DefaultSessionManager", () => {
1001
1014
  canStartRun: vi.fn().mockReturnValue(true),
1002
1015
  };
1003
1016
 
1004
- const manager = new DefaultSessionManager({
1017
+ const manager = new RuntimeHostUnderTest({
1005
1018
  distinctId,
1006
1019
  sessionService: sessionService as never,
1007
1020
  runtimeBuilder,
1008
1021
  createAgent: () => agent as never,
1009
1022
  });
1010
1023
 
1011
- await manager.start({
1012
- config: createConfig({ sessionId }),
1013
- prompt: "hello",
1014
- interactive: true,
1015
- });
1024
+ await manager.start(
1025
+ normalizeStartInput({
1026
+ config: createConfig({ sessionId }),
1027
+ prompt: "hello",
1028
+ interactive: true,
1029
+ }),
1030
+ );
1016
1031
 
1017
1032
  const harness = createPluginEventHarness(manager);
1018
1033
  await harness.handlePluginEvent(sessionId, {
@@ -1036,8 +1051,6 @@ describe("DefaultSessionManager", () => {
1036
1051
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1037
1052
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1038
1053
  manifestPath: "/tmp/manifest.json",
1039
- transcriptPath: "/tmp/transcript.log",
1040
- hookPath: "/tmp/hook.log",
1041
1054
  messagesPath: "/tmp/messages.json",
1042
1055
  manifest,
1043
1056
  }),
@@ -1071,18 +1084,20 @@ describe("DefaultSessionManager", () => {
1071
1084
  canStartRun: vi.fn().mockReturnValue(false),
1072
1085
  };
1073
1086
 
1074
- const manager = new DefaultSessionManager({
1087
+ const manager = new RuntimeHostUnderTest({
1075
1088
  distinctId,
1076
1089
  sessionService: sessionService as never,
1077
1090
  runtimeBuilder,
1078
1091
  createAgent: () => agent as never,
1079
1092
  });
1080
1093
 
1081
- await manager.start({
1082
- config: createConfig({ sessionId }),
1083
- prompt: "hello",
1084
- interactive: true,
1085
- });
1094
+ await manager.start(
1095
+ normalizeStartInput({
1096
+ config: createConfig({ sessionId }),
1097
+ prompt: "hello",
1098
+ interactive: true,
1099
+ }),
1100
+ );
1086
1101
 
1087
1102
  const harness = createPluginEventHarness(manager);
1088
1103
 
@@ -1105,6 +1120,75 @@ describe("DefaultSessionManager", () => {
1105
1120
  ]);
1106
1121
  });
1107
1122
 
1123
+ it("drops and ignores queued prompts once a session is aborting", async () => {
1124
+ const sessionId = "sess-abort-pending";
1125
+ const manifest = createManifest(sessionId);
1126
+ const sessionService = {
1127
+ ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1128
+ createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1129
+ manifestPath: "/tmp/manifest.json",
1130
+ messagesPath: "/tmp/messages.json",
1131
+ manifest,
1132
+ }),
1133
+ persistSessionMessages: vi.fn(),
1134
+ updateSessionStatus: vi.fn().mockResolvedValue({
1135
+ updated: true,
1136
+ endedAt: "2026-01-01T00:00:05.000Z",
1137
+ }),
1138
+ writeSessionManifest: vi.fn(),
1139
+ listSessions: vi.fn().mockResolvedValue([]),
1140
+ deleteSession: vi.fn().mockResolvedValue({ deleted: true }),
1141
+ };
1142
+ const runtimeBuilder = {
1143
+ build: vi.fn().mockReturnValue({
1144
+ tools: [],
1145
+ shutdown: vi.fn(),
1146
+ }),
1147
+ };
1148
+ const agent = {
1149
+ run: vi.fn().mockResolvedValue(createResult()),
1150
+ continue: vi.fn().mockResolvedValue(createResult()),
1151
+ abort: vi.fn(),
1152
+ shutdown: vi.fn().mockResolvedValue(undefined),
1153
+ getMessages: vi.fn().mockReturnValue([]),
1154
+ canStartRun: vi.fn().mockReturnValue(false),
1155
+ };
1156
+
1157
+ const manager = new RuntimeHostUnderTest({
1158
+ distinctId,
1159
+ sessionService: sessionService as never,
1160
+ runtimeBuilder,
1161
+ createAgent: () => agent as never,
1162
+ });
1163
+
1164
+ await manager.start(
1165
+ normalizeStartInput({
1166
+ config: createConfig({ sessionId }),
1167
+ prompt: "hello",
1168
+ interactive: true,
1169
+ }),
1170
+ );
1171
+
1172
+ const harness = createPluginEventHarness(manager);
1173
+ await harness.handlePluginEvent(sessionId, {
1174
+ name: "queue_message",
1175
+ payload: { prompt: "queued before abort" },
1176
+ });
1177
+ expect(harness.getPendingPrompts(sessionId)).toEqual([
1178
+ { prompt: "queued before abort", delivery: "queue" },
1179
+ ]);
1180
+
1181
+ await manager.abort(sessionId, new Error("test abort"));
1182
+ expect(agent.abort).toHaveBeenCalledTimes(1);
1183
+ expect(harness.getPendingPrompts(sessionId)).toEqual([]);
1184
+
1185
+ await harness.handlePluginEvent(sessionId, {
1186
+ name: "queue_message",
1187
+ payload: { prompt: "queued after abort" },
1188
+ });
1189
+ expect(harness.getPendingPrompts(sessionId)).toEqual([]);
1190
+ });
1191
+
1108
1192
  it("preserves per-turn metadata on prior assistant messages across turns", async () => {
1109
1193
  const sessionId = "sess-meta-multi";
1110
1194
  const manifest = createManifest(sessionId);
@@ -1183,8 +1267,6 @@ describe("DefaultSessionManager", () => {
1183
1267
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1184
1268
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1185
1269
  manifestPath: "/tmp/manifest-meta-multi.json",
1186
- transcriptPath: "/tmp/transcript-meta-multi.log",
1187
- hookPath: "/tmp/hook-meta-multi.log",
1188
1270
  messagesPath: "/tmp/messages-meta-multi.json",
1189
1271
  manifest,
1190
1272
  }),
@@ -1194,21 +1276,23 @@ describe("DefaultSessionManager", () => {
1194
1276
  listSessions: vi.fn().mockResolvedValue([]),
1195
1277
  deleteSession: vi.fn().mockResolvedValue({ deleted: true }),
1196
1278
  };
1197
- const manager = new DefaultSessionManager({
1279
+ const manager = new RuntimeHostUnderTest({
1198
1280
  distinctId,
1199
1281
  sessionService: sessionService as never,
1200
1282
  runtimeBuilder,
1201
1283
  createAgent: () => agent as never,
1202
1284
  });
1203
1285
 
1204
- await manager.start({
1205
- config: createConfig({
1206
- sessionId,
1207
- providerId: "anthropic",
1208
- modelId: "claude-sonnet-4-6",
1286
+ await manager.start(
1287
+ normalizeStartInput({
1288
+ config: createConfig({
1289
+ sessionId,
1290
+ providerId: "anthropic",
1291
+ modelId: "claude-sonnet-4-6",
1292
+ }),
1293
+ interactive: true,
1209
1294
  }),
1210
- interactive: true,
1211
- });
1295
+ );
1212
1296
 
1213
1297
  await manager.send({ sessionId, prompt: "hello" });
1214
1298
  await manager.send({ sessionId, prompt: "again" });
@@ -1244,8 +1328,6 @@ describe("DefaultSessionManager", () => {
1244
1328
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1245
1329
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1246
1330
  manifestPath: "/tmp/manifest-failed-turn.json",
1247
- transcriptPath: "/tmp/transcript-failed-turn.log",
1248
- hookPath: "/tmp/hook-failed-turn.log",
1249
1331
  messagesPath: "/tmp/messages-failed-turn.json",
1250
1332
  manifest,
1251
1333
  }),
@@ -1265,7 +1347,7 @@ describe("DefaultSessionManager", () => {
1265
1347
  { role: "user", content: [{ type: "text", text: "hello" }] },
1266
1348
  { role: "assistant", content: [{ type: "text", text: "partial" }] },
1267
1349
  ];
1268
- const manager = new DefaultSessionManager({
1350
+ const manager = new RuntimeHostUnderTest({
1269
1351
  distinctId,
1270
1352
  sessionService: sessionService as never,
1271
1353
  runtimeBuilder,
@@ -1285,11 +1367,13 @@ describe("DefaultSessionManager", () => {
1285
1367
  });
1286
1368
 
1287
1369
  await expect(
1288
- manager.start({
1289
- config: createConfig({ sessionId }),
1290
- prompt: "hello",
1291
- interactive: false,
1292
- }),
1370
+ manager.start(
1371
+ normalizeStartInput({
1372
+ config: createConfig({ sessionId }),
1373
+ prompt: "hello",
1374
+ interactive: false,
1375
+ }),
1376
+ ),
1293
1377
  ).rejects.toThrow("boom");
1294
1378
 
1295
1379
  expect(persistSessionMessages).toHaveBeenCalledTimes(1);
@@ -1312,8 +1396,6 @@ describe("DefaultSessionManager", () => {
1312
1396
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1313
1397
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1314
1398
  manifestPath: "/tmp/manifest-2.json",
1315
- transcriptPath: "/tmp/transcript-2.log",
1316
- hookPath: "/tmp/hook-2.log",
1317
1399
  messagesPath: "/tmp/messages-2.json",
1318
1400
  manifest,
1319
1401
  }),
@@ -1333,7 +1415,7 @@ describe("DefaultSessionManager", () => {
1333
1415
  const continueFn = vi
1334
1416
  .fn()
1335
1417
  .mockResolvedValue(createResult({ text: "second" }));
1336
- const manager = new DefaultSessionManager({
1418
+ const manager = new RuntimeHostUnderTest({
1337
1419
  distinctId,
1338
1420
  sessionService: sessionService as never,
1339
1421
  runtimeBuilder,
@@ -1348,10 +1430,12 @@ describe("DefaultSessionManager", () => {
1348
1430
  }) as never,
1349
1431
  });
1350
1432
 
1351
- await manager.start({
1352
- config: createConfig({ sessionId }),
1353
- interactive: true,
1354
- });
1433
+ await manager.start(
1434
+ normalizeStartInput({
1435
+ config: createConfig({ sessionId }),
1436
+ interactive: true,
1437
+ }),
1438
+ );
1355
1439
  const first = await manager.send({ sessionId, prompt: "first" });
1356
1440
  const second = await manager.send({ sessionId, prompt: "second" });
1357
1441
 
@@ -1369,8 +1453,6 @@ describe("DefaultSessionManager", () => {
1369
1453
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1370
1454
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1371
1455
  manifestPath: "/tmp/manifest-usage.json",
1372
- transcriptPath: "/tmp/transcript-usage.log",
1373
- hookPath: "/tmp/hook-usage.log",
1374
1456
  messagesPath: "/tmp/messages-usage.json",
1375
1457
  manifest,
1376
1458
  }),
@@ -1410,7 +1492,7 @@ describe("DefaultSessionManager", () => {
1410
1492
  },
1411
1493
  }),
1412
1494
  );
1413
- const manager = new DefaultSessionManager({
1495
+ const manager = new RuntimeHostUnderTest({
1414
1496
  distinctId,
1415
1497
  sessionService: sessionService as never,
1416
1498
  runtimeBuilder,
@@ -1425,10 +1507,12 @@ describe("DefaultSessionManager", () => {
1425
1507
  }) as never,
1426
1508
  });
1427
1509
 
1428
- await manager.start({
1429
- config: createConfig({ sessionId }),
1430
- interactive: true,
1431
- });
1510
+ await manager.start(
1511
+ normalizeStartInput({
1512
+ config: createConfig({ sessionId }),
1513
+ interactive: true,
1514
+ }),
1515
+ );
1432
1516
 
1433
1517
  await manager.send({ sessionId, prompt: "first" });
1434
1518
  expect(await manager.getAccumulatedUsage(sessionId)).toEqual({
@@ -1456,8 +1540,6 @@ describe("DefaultSessionManager", () => {
1456
1540
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1457
1541
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1458
1542
  manifestPath: "/tmp/manifest-queue.json",
1459
- transcriptPath: "/tmp/transcript-queue.log",
1460
- hookPath: "/tmp/hook-queue.log",
1461
1543
  messagesPath: "/tmp/messages-queue.json",
1462
1544
  manifest,
1463
1545
  }),
@@ -1478,7 +1560,7 @@ describe("DefaultSessionManager", () => {
1478
1560
  const continueFn = vi
1479
1561
  .fn()
1480
1562
  .mockResolvedValue(createResult({ text: "next" }));
1481
- const manager = new DefaultSessionManager({
1563
+ const manager = new RuntimeHostUnderTest({
1482
1564
  distinctId,
1483
1565
  sessionService: sessionService as never,
1484
1566
  runtimeBuilder,
@@ -1498,10 +1580,12 @@ describe("DefaultSessionManager", () => {
1498
1580
  events.push(event);
1499
1581
  });
1500
1582
 
1501
- await manager.start({
1502
- config: createConfig({ sessionId }),
1503
- interactive: true,
1504
- });
1583
+ await manager.start(
1584
+ normalizeStartInput({
1585
+ config: createConfig({ sessionId }),
1586
+ interactive: true,
1587
+ }),
1588
+ );
1505
1589
 
1506
1590
  await expect(
1507
1591
  manager.send({ sessionId, prompt: "queued first", delivery: "queue" }),
@@ -1556,7 +1640,7 @@ describe("DefaultSessionManager", () => {
1556
1640
  });
1557
1641
 
1558
1642
  it("returns undefined accumulated usage for unknown sessions", async () => {
1559
- const manager = new DefaultSessionManager({
1643
+ const manager = new RuntimeHostUnderTest({
1560
1644
  distinctId,
1561
1645
  sessionService: {
1562
1646
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
@@ -1592,8 +1676,6 @@ describe("DefaultSessionManager", () => {
1592
1676
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1593
1677
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1594
1678
  manifestPath: "/tmp/manifest-fail.json",
1595
- transcriptPath: "/tmp/transcript-fail.log",
1596
- hookPath: "/tmp/hook-fail.log",
1597
1679
  messagesPath: "/tmp/messages-fail.json",
1598
1680
  manifest,
1599
1681
  }),
@@ -1612,7 +1694,7 @@ describe("DefaultSessionManager", () => {
1612
1694
  };
1613
1695
  const run = vi.fn().mockRejectedValue(new Error("run failed"));
1614
1696
  const agentShutdown = vi.fn().mockResolvedValue(undefined);
1615
- const manager = new DefaultSessionManager({
1697
+ const manager = new RuntimeHostUnderTest({
1616
1698
  distinctId,
1617
1699
  sessionService: sessionService as never,
1618
1700
  runtimeBuilder,
@@ -1628,11 +1710,13 @@ describe("DefaultSessionManager", () => {
1628
1710
  });
1629
1711
 
1630
1712
  await expect(
1631
- manager.start({
1632
- config: createConfig({ sessionId }),
1633
- prompt: "hello",
1634
- interactive: false,
1635
- }),
1713
+ manager.start(
1714
+ normalizeStartInput({
1715
+ config: createConfig({ sessionId }),
1716
+ prompt: "hello",
1717
+ interactive: false,
1718
+ }),
1719
+ ),
1636
1720
  ).rejects.toThrow("run failed");
1637
1721
  expect(sessionService.updateSessionStatus).toHaveBeenCalledWith(
1638
1722
  sessionId,
@@ -1661,7 +1745,7 @@ describe("DefaultSessionManager", () => {
1661
1745
  }),
1662
1746
  };
1663
1747
  const agentShutdown = vi.fn().mockResolvedValue(undefined);
1664
- const manager = new DefaultSessionManager({
1748
+ const manager = new RuntimeHostUnderTest({
1665
1749
  distinctId,
1666
1750
  sessionService: sessionService as never,
1667
1751
  runtimeBuilder,
@@ -1676,10 +1760,12 @@ describe("DefaultSessionManager", () => {
1676
1760
  }) as never,
1677
1761
  });
1678
1762
 
1679
- const started = await manager.start({
1680
- config: createConfig({ sessionId: "sess-no-prompt" }),
1681
- interactive: true,
1682
- });
1763
+ const started = await manager.start(
1764
+ normalizeStartInput({
1765
+ config: createConfig({ sessionId: "sess-no-prompt" }),
1766
+ interactive: true,
1767
+ }),
1768
+ );
1683
1769
  await manager.stop(started.sessionId);
1684
1770
 
1685
1771
  expect(
@@ -1697,8 +1783,6 @@ describe("DefaultSessionManager", () => {
1697
1783
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1698
1784
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1699
1785
  manifestPath: "/tmp/manifest-oauth.json",
1700
- transcriptPath: "/tmp/transcript-oauth.log",
1701
- hookPath: "/tmp/hook-oauth.log",
1702
1786
  messagesPath: "/tmp/messages-oauth.json",
1703
1787
  manifest,
1704
1788
  }),
@@ -1722,7 +1806,7 @@ describe("DefaultSessionManager", () => {
1722
1806
  };
1723
1807
  const run = vi.fn().mockResolvedValue(createResult({ text: "ok" }));
1724
1808
  const updateConnection = vi.fn();
1725
- const manager = new DefaultSessionManager({
1809
+ const manager = new RuntimeHostUnderTest({
1726
1810
  distinctId,
1727
1811
  sessionService: sessionService as never,
1728
1812
  runtimeBuilder,
@@ -1746,14 +1830,16 @@ describe("DefaultSessionManager", () => {
1746
1830
  }) as never,
1747
1831
  });
1748
1832
 
1749
- await manager.start({
1750
- config: createConfig({
1751
- sessionId,
1752
- providerId: "openai-codex",
1753
- apiKey: "oauth-access-old",
1833
+ await manager.start(
1834
+ normalizeStartInput({
1835
+ config: createConfig({
1836
+ sessionId,
1837
+ providerId: "openai-codex",
1838
+ apiKey: "oauth-access-old",
1839
+ }),
1840
+ interactive: true,
1754
1841
  }),
1755
- interactive: true,
1756
- });
1842
+ );
1757
1843
  await manager.send({ sessionId, prompt: "hello" });
1758
1844
 
1759
1845
  expect(updateConnectionDefaults).toHaveBeenCalledWith({
@@ -1772,8 +1858,6 @@ describe("DefaultSessionManager", () => {
1772
1858
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1773
1859
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1774
1860
  manifestPath: "/tmp/manifest-provider-config.json",
1775
- transcriptPath: "/tmp/transcript-provider-config.log",
1776
- hookPath: "/tmp/hook-provider-config.log",
1777
1861
  messagesPath: "/tmp/messages-provider-config.json",
1778
1862
  manifest,
1779
1863
  }),
@@ -1800,7 +1884,7 @@ describe("DefaultSessionManager", () => {
1800
1884
  getMessages: vi.fn().mockReturnValue([]),
1801
1885
  messages: [],
1802
1886
  });
1803
- const manager = new DefaultSessionManager({
1887
+ const manager = new RuntimeHostUnderTest({
1804
1888
  distinctId,
1805
1889
  sessionService: sessionService as never,
1806
1890
  runtimeBuilder: {
@@ -1821,14 +1905,16 @@ describe("DefaultSessionManager", () => {
1821
1905
  } as never,
1822
1906
  });
1823
1907
 
1824
- await manager.start({
1825
- config: createConfig({
1826
- sessionId,
1827
- providerId: "vertex",
1828
- modelId: "claude-sonnet-4@20250514",
1908
+ await manager.start(
1909
+ normalizeStartInput({
1910
+ config: createConfig({
1911
+ sessionId,
1912
+ providerId: "vertex",
1913
+ modelId: "claude-sonnet-4@20250514",
1914
+ }),
1915
+ interactive: true,
1829
1916
  }),
1830
- interactive: true,
1831
- });
1917
+ );
1832
1918
  await manager.send({ sessionId, prompt: "hello" });
1833
1919
 
1834
1920
  expect(createAgent).toHaveBeenCalledWith(
@@ -1854,8 +1940,6 @@ describe("DefaultSessionManager", () => {
1854
1940
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1855
1941
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1856
1942
  manifestPath: "/tmp/manifest-loop.json",
1857
- transcriptPath: "/tmp/transcript-loop.log",
1858
- hookPath: "/tmp/hook-loop.log",
1859
1943
  messagesPath: "/tmp/messages-loop.json",
1860
1944
  manifest,
1861
1945
  }),
@@ -1875,7 +1959,7 @@ describe("DefaultSessionManager", () => {
1875
1959
  getMessages: vi.fn().mockReturnValue([]),
1876
1960
  messages: [],
1877
1961
  });
1878
- const manager = new DefaultSessionManager({
1962
+ const manager = new RuntimeHostUnderTest({
1879
1963
  distinctId,
1880
1964
  sessionService: sessionService as never,
1881
1965
  runtimeBuilder: {
@@ -1887,15 +1971,17 @@ describe("DefaultSessionManager", () => {
1887
1971
  createAgent: createAgent as never,
1888
1972
  });
1889
1973
 
1890
- await manager.start({
1891
- config: createConfig({
1892
- sessionId,
1893
- execution: {
1894
- loopDetection: { softThreshold: 4, hardThreshold: 8 },
1895
- },
1974
+ await manager.start(
1975
+ normalizeStartInput({
1976
+ config: createConfig({
1977
+ sessionId,
1978
+ execution: {
1979
+ loopDetection: { softThreshold: 4, hardThreshold: 8 },
1980
+ },
1981
+ }),
1982
+ interactive: true,
1896
1983
  }),
1897
- interactive: true,
1898
- });
1984
+ );
1899
1985
  await manager.send({ sessionId, prompt: "test" });
1900
1986
 
1901
1987
  expect(createAgent).toHaveBeenCalledWith(
@@ -1914,8 +2000,6 @@ describe("DefaultSessionManager", () => {
1914
2000
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1915
2001
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1916
2002
  manifestPath: "/tmp/manifest-compaction.json",
1917
- transcriptPath: "/tmp/transcript-compaction.log",
1918
- hookPath: "/tmp/hook-compaction.log",
1919
2003
  messagesPath: "/tmp/messages-compaction.json",
1920
2004
  manifest,
1921
2005
  }),
@@ -1936,7 +2020,7 @@ describe("DefaultSessionManager", () => {
1936
2020
  messages: [],
1937
2021
  });
1938
2022
  const compact = vi.fn();
1939
- const manager = new DefaultSessionManager({
2023
+ const manager = new RuntimeHostUnderTest({
1940
2024
  distinctId,
1941
2025
  sessionService: sessionService as never,
1942
2026
  runtimeBuilder: {
@@ -1948,17 +2032,19 @@ describe("DefaultSessionManager", () => {
1948
2032
  createAgent: createAgent as never,
1949
2033
  });
1950
2034
 
1951
- await manager.start({
1952
- config: createConfig({
1953
- sessionId,
1954
- compaction: {
1955
- enabled: true,
1956
- strategy: "basic",
1957
- compact,
1958
- },
2035
+ await manager.start(
2036
+ normalizeStartInput({
2037
+ config: createConfig({
2038
+ sessionId,
2039
+ compaction: {
2040
+ enabled: true,
2041
+ strategy: "basic",
2042
+ compact,
2043
+ },
2044
+ }),
2045
+ interactive: true,
1959
2046
  }),
1960
- interactive: true,
1961
- });
2047
+ );
1962
2048
  await manager.send({ sessionId, prompt: "test" });
1963
2049
 
1964
2050
  expect(createAgent).toHaveBeenCalledWith(
@@ -1986,8 +2072,6 @@ describe("DefaultSessionManager", () => {
1986
2072
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
1987
2073
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
1988
2074
  manifestPath: "/tmp/manifest-format.json",
1989
- transcriptPath: "/tmp/transcript-format.log",
1990
- hookPath: "/tmp/hook-format.log",
1991
2075
  messagesPath: "/tmp/messages-format.json",
1992
2076
  manifest,
1993
2077
  }),
@@ -1998,7 +2082,7 @@ describe("DefaultSessionManager", () => {
1998
2082
  deleteSession: vi.fn().mockResolvedValue({ deleted: true }),
1999
2083
  };
2000
2084
  const run = vi.fn().mockResolvedValue(createResult({ text: "ok" }));
2001
- const manager = new DefaultSessionManager({
2085
+ const manager = new RuntimeHostUnderTest({
2002
2086
  distinctId,
2003
2087
  sessionService: sessionService as never,
2004
2088
  runtimeBuilder: {
@@ -2018,14 +2102,16 @@ describe("DefaultSessionManager", () => {
2018
2102
  }) as never,
2019
2103
  });
2020
2104
 
2021
- await manager.start({
2022
- config: createConfig({
2023
- sessionId,
2024
- cwd: join(tempCwd, "docs"),
2025
- workspaceRoot: tempCwd,
2105
+ await manager.start(
2106
+ normalizeStartInput({
2107
+ config: createConfig({
2108
+ sessionId,
2109
+ cwd: join(tempCwd, "docs"),
2110
+ workspaceRoot: tempCwd,
2111
+ }),
2112
+ interactive: true,
2026
2113
  }),
2027
- interactive: true,
2028
- });
2114
+ );
2029
2115
  await manager.send({
2030
2116
  sessionId,
2031
2117
  prompt: '<user_input mode="act">explain @src/app.ts</user_input>',
@@ -2049,8 +2135,6 @@ describe("DefaultSessionManager", () => {
2049
2135
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
2050
2136
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
2051
2137
  manifestPath: "/tmp/manifest-oauth-retry.json",
2052
- transcriptPath: "/tmp/transcript-oauth-retry.log",
2053
- hookPath: "/tmp/hook-oauth-retry.log",
2054
2138
  messagesPath: "/tmp/messages-oauth-retry.json",
2055
2139
  manifest,
2056
2140
  }),
@@ -2086,7 +2170,7 @@ describe("DefaultSessionManager", () => {
2086
2170
  apiKey: "oauth-access-new",
2087
2171
  refreshed: true,
2088
2172
  });
2089
- const manager = new DefaultSessionManager({
2173
+ const manager = new RuntimeHostUnderTest({
2090
2174
  distinctId,
2091
2175
  sessionService: sessionService as never,
2092
2176
  runtimeBuilder,
@@ -2106,14 +2190,16 @@ describe("DefaultSessionManager", () => {
2106
2190
  }) as never,
2107
2191
  });
2108
2192
 
2109
- await manager.start({
2110
- config: createConfig({
2111
- sessionId,
2112
- providerId: "openai-codex",
2113
- apiKey: "oauth-access-old",
2193
+ await manager.start(
2194
+ normalizeStartInput({
2195
+ config: createConfig({
2196
+ sessionId,
2197
+ providerId: "openai-codex",
2198
+ apiKey: "oauth-access-old",
2199
+ }),
2200
+ interactive: true,
2114
2201
  }),
2115
- interactive: true,
2116
- });
2202
+ );
2117
2203
  const result = await manager.send({ sessionId, prompt: "hello" });
2118
2204
 
2119
2205
  expect(result?.text).toBe("retried");
@@ -2142,8 +2228,6 @@ describe("DefaultSessionManager", () => {
2142
2228
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
2143
2229
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
2144
2230
  manifestPath: "/tmp/manifest-team-auto-continue.json",
2145
- transcriptPath: "/tmp/transcript-team-auto-continue.log",
2146
- hookPath: "/tmp/hook-team-auto-continue.log",
2147
2231
  messagesPath: "/tmp/messages-team-auto-continue.json",
2148
2232
  manifest,
2149
2233
  }),
@@ -2223,7 +2307,7 @@ describe("DefaultSessionManager", () => {
2223
2307
  ],
2224
2308
  }),
2225
2309
  );
2226
- const manager = new DefaultSessionManager({
2310
+ const manager = new RuntimeHostUnderTest({
2227
2311
  distinctId,
2228
2312
  sessionService: sessionService as never,
2229
2313
  runtimeBuilder,
@@ -2238,10 +2322,12 @@ describe("DefaultSessionManager", () => {
2238
2322
  }) as never,
2239
2323
  });
2240
2324
 
2241
- await manager.start({
2242
- config: createConfig({ sessionId }),
2243
- interactive: false,
2244
- });
2325
+ await manager.start(
2326
+ normalizeStartInput({
2327
+ config: createConfig({ sessionId }),
2328
+ interactive: false,
2329
+ }),
2330
+ );
2245
2331
  const result = await manager.send({
2246
2332
  sessionId,
2247
2333
  prompt: "run teammate work",
@@ -2282,8 +2368,6 @@ describe("DefaultSessionManager", () => {
2282
2368
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
2283
2369
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
2284
2370
  manifestPath: "/tmp/manifest-team-task-failure-messages.json",
2285
- transcriptPath: "/tmp/transcript-team-task-failure-messages.log",
2286
- hookPath: "/tmp/hook-team-task-failure-messages.log",
2287
2371
  messagesPath: "/tmp/messages-team-task-failure-messages.json",
2288
2372
  manifest,
2289
2373
  }),
@@ -2315,7 +2399,7 @@ describe("DefaultSessionManager", () => {
2315
2399
  { role: "user", content: [{ type: "text", text: "delegated prompt" }] },
2316
2400
  { role: "assistant", content: [{ type: "text", text: "partial work" }] },
2317
2401
  ];
2318
- const manager = new DefaultSessionManager({
2402
+ const manager = new RuntimeHostUnderTest({
2319
2403
  distinctId,
2320
2404
  sessionService: sessionService as never,
2321
2405
  runtimeBuilder,
@@ -2343,11 +2427,13 @@ describe("DefaultSessionManager", () => {
2343
2427
  }) as never,
2344
2428
  });
2345
2429
 
2346
- await manager.start({
2347
- config: createConfig({ sessionId }),
2348
- prompt: "run teammate work",
2349
- interactive: false,
2350
- });
2430
+ await manager.start(
2431
+ normalizeStartInput({
2432
+ config: createConfig({ sessionId }),
2433
+ prompt: "run teammate work",
2434
+ interactive: false,
2435
+ }),
2436
+ );
2351
2437
 
2352
2438
  expect(sessionService.onTeamTaskStart).toHaveBeenCalledTimes(1);
2353
2439
  expect(sessionService.onTeamTaskEnd).toHaveBeenCalledWith(
@@ -2367,8 +2453,6 @@ describe("DefaultSessionManager", () => {
2367
2453
  ensureSessionsDir: vi.fn().mockReturnValue("/tmp/sessions"),
2368
2454
  createRootSessionWithArtifacts: vi.fn().mockResolvedValue({
2369
2455
  manifestPath: "/tmp/manifest-team-task-progress.json",
2370
- transcriptPath: "/tmp/transcript-team-task-progress.log",
2371
- hookPath: "/tmp/hook-team-task-progress.log",
2372
2456
  messagesPath: "/tmp/messages-team-task-progress.json",
2373
2457
  manifest,
2374
2458
  }),
@@ -2397,7 +2481,7 @@ describe("DefaultSessionManager", () => {
2397
2481
  ),
2398
2482
  };
2399
2483
 
2400
- const manager = new DefaultSessionManager({
2484
+ const manager = new RuntimeHostUnderTest({
2401
2485
  distinctId,
2402
2486
  sessionService: sessionService as never,
2403
2487
  runtimeBuilder,
@@ -2451,11 +2535,13 @@ describe("DefaultSessionManager", () => {
2451
2535
  }) as never,
2452
2536
  });
2453
2537
 
2454
- await manager.start({
2455
- config: createConfig({ sessionId }),
2456
- prompt: "run teammate work",
2457
- interactive: false,
2458
- });
2538
+ await manager.start(
2539
+ normalizeStartInput({
2540
+ config: createConfig({ sessionId }),
2541
+ prompt: "run teammate work",
2542
+ interactive: false,
2543
+ }),
2544
+ );
2459
2545
 
2460
2546
  expect(sessionService.onTeamTaskProgress).toHaveBeenCalledWith(
2461
2547
  sessionId,