@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
@@ -1,8 +1,8 @@
1
1
  import { existsSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
2
2
  import { tmpdir } from "node:os";
3
3
  import { join } from "node:path";
4
- import { afterEach, describe, expect, it } from "vitest";
5
- import { SqliteSessionStore } from "../storage/sqlite-session-store";
4
+ import { afterEach, describe, expect, it, vi } from "vitest";
5
+ import { SqliteSessionStore } from "../services/storage/sqlite-session-store";
6
6
  import { SessionSource } from "../types/common";
7
7
  import { CoreSessionService } from "./session-service";
8
8
 
@@ -20,12 +20,17 @@ describe("UnifiedSessionPersistenceService", () => {
20
20
  });
21
21
 
22
22
  it("reconciles dead running sessions into failed manifests with terminal markers", async () => {
23
- const sessionsDir = mkdtempSync(join(tmpdir(), "stale-session-reconcile-"));
24
- tempDirs.push(sessionsDir);
23
+ const dbDir = mkdtempSync(join(tmpdir(), "stale-session-reconcile-db-"));
24
+ const sessionsDir = mkdtempSync(
25
+ join(tmpdir(), "stale-session-reconcile-sessions-"),
26
+ );
27
+ tempDirs.push(dbDir, sessionsDir);
25
28
 
26
- const store = new SqliteSessionStore({ sessionsDir });
29
+ const store = new SqliteSessionStore({ sessionsDir: dbDir });
27
30
  stores.push(store);
28
- const service = new CoreSessionService(store);
31
+ const service = new CoreSessionService(store, {
32
+ sessionArtifactsDir: sessionsDir,
33
+ });
29
34
  const sessionId = "stale-root-session";
30
35
  const artifacts = await service.createRootSessionWithArtifacts({
31
36
  sessionId,
@@ -70,26 +75,24 @@ describe("UnifiedSessionPersistenceService", () => {
70
75
  (manifest.metadata as Record<string, unknown>).terminal_marker_at,
71
76
  ).toBeTruthy();
72
77
 
73
- expect(existsSync(artifacts.hookPath)).toBe(true);
74
- expect(existsSync(artifacts.transcriptPath)).toBe(true);
75
- expect(readFileSync(artifacts.hookPath, "utf8")).toContain(
76
- '"hookName":"session_shutdown"',
77
- );
78
- expect(readFileSync(artifacts.hookPath, "utf8")).toContain(
79
- '"reason":"failed_external_process_exit"',
80
- );
81
- expect(readFileSync(artifacts.transcriptPath, "utf8")).toContain(
82
- "[shutdown] failed_external_process_exit",
83
- );
78
+ const globalHookLog = process.env.CLINE_HOOKS_LOG_PATH ?? "";
79
+ if (globalHookLog && existsSync(globalHookLog)) {
80
+ const hookContent = readFileSync(globalHookLog, "utf8");
81
+ expect(hookContent).toContain('"hookName":"session_shutdown"');
82
+ expect(hookContent).toContain('"reason":"failed_external_process_exit"');
83
+ }
84
84
  }, 15_000);
85
85
 
86
86
  it("persists teammate task metadata in the file envelope and usage on messages", async () => {
87
+ const dbDir = mkdtempSync(join(tmpdir(), "team-task-messages-db-"));
87
88
  const sessionsDir = mkdtempSync(join(tmpdir(), "team-task-messages-"));
88
- tempDirs.push(sessionsDir);
89
+ tempDirs.push(dbDir, sessionsDir);
89
90
 
90
- const store = new SqliteSessionStore({ sessionsDir });
91
+ const store = new SqliteSessionStore({ sessionsDir: dbDir });
91
92
  stores.push(store);
92
- const service = new CoreSessionService(store);
93
+ const service = new CoreSessionService(store, {
94
+ sessionArtifactsDir: sessionsDir,
95
+ });
93
96
  const rootSessionId = "root-session";
94
97
  await service.createRootSessionWithArtifacts({
95
98
  sessionId: rootSessionId,
@@ -194,20 +197,76 @@ describe("UnifiedSessionPersistenceService", () => {
194
197
  cost: 0.123,
195
198
  });
196
199
  expect(row?.messagesPath).toBe(path);
197
- expect(row?.transcriptPath).toBeTruthy();
198
- expect(row?.transcriptPath).toContain(
199
- join(sessionsDir, rootSessionId, "java-haiku-agent__"),
200
+ });
201
+
202
+ it("uploads messages after persisting them when a messages uploader is configured", async () => {
203
+ const dbDir = mkdtempSync(join(tmpdir(), "messages-upload-db-"));
204
+ const sessionsDir = mkdtempSync(join(tmpdir(), "messages-upload-"));
205
+ tempDirs.push(dbDir, sessionsDir);
206
+
207
+ const store = new SqliteSessionStore({ sessionsDir: dbDir });
208
+ stores.push(store);
209
+ const uploadMessagesFile = vi.fn(async () => {});
210
+ const service = new CoreSessionService(store, {
211
+ sessionArtifactsDir: sessionsDir,
212
+ messagesArtifactUploader: {
213
+ uploadMessagesFile,
214
+ },
215
+ });
216
+ const sessionId = "root-upload-session";
217
+ await service.createRootSessionWithArtifacts({
218
+ sessionId,
219
+ source: SessionSource.CLI,
220
+ pid: process.pid,
221
+ interactive: false,
222
+ provider: "anthropic",
223
+ model: "claude-sonnet-4-6",
224
+ cwd: "/tmp/project",
225
+ workspaceRoot: "/tmp/project",
226
+ enableTools: true,
227
+ enableSpawn: false,
228
+ enableTeams: false,
229
+ prompt: "hello",
230
+ metadata: {
231
+ blobUpload: true,
232
+ },
233
+ startedAt: "2026-04-10T19:00:00.000Z",
234
+ });
235
+
236
+ await service.persistSessionMessages(sessionId, [
237
+ {
238
+ role: "user",
239
+ content: "hello",
240
+ },
241
+ ]);
242
+
243
+ expect(uploadMessagesFile).toHaveBeenCalledTimes(1);
244
+ expect(uploadMessagesFile).toHaveBeenCalledWith(
245
+ expect.objectContaining({
246
+ sessionId,
247
+ path: expect.stringContaining(`${sessionId}.messages.json`),
248
+ contents: expect.stringContaining('"role": "user"'),
249
+ row: expect.objectContaining({
250
+ sessionId,
251
+ metadata: {
252
+ blobUpload: true,
253
+ title: "hello",
254
+ },
255
+ }),
256
+ }),
200
257
  );
201
- expect(row?.transcriptPath).toMatch(/\.log$/);
202
258
  });
203
259
 
204
260
  it("deletes the full root session directory even when artifact paths are stale", async () => {
261
+ const dbDir = mkdtempSync(join(tmpdir(), "delete-root-session-dir-db-"));
205
262
  const sessionsDir = mkdtempSync(join(tmpdir(), "delete-root-session-dir-"));
206
- tempDirs.push(sessionsDir);
263
+ tempDirs.push(dbDir, sessionsDir);
207
264
 
208
- const store = new SqliteSessionStore({ sessionsDir });
265
+ const store = new SqliteSessionStore({ sessionsDir: dbDir });
209
266
  stores.push(store);
210
- const service = new CoreSessionService(store);
267
+ const service = new CoreSessionService(store, {
268
+ sessionArtifactsDir: sessionsDir,
269
+ });
211
270
  const sessionId = "root-session-delete";
212
271
  const artifacts = await service.createRootSessionWithArtifacts({
213
272
  sessionId,
@@ -1,34 +1,28 @@
1
1
  import {
2
2
  appendFileSync,
3
3
  existsSync,
4
+ mkdirSync,
4
5
  readFileSync,
5
6
  writeFileSync,
6
7
  } from "node:fs";
7
- import { dirname } from "node:path";
8
+ import { dirname, join } from "node:path";
8
9
  import type * as LlmsProviders from "@clinebot/llms";
9
10
  import type { AgentResult } from "@clinebot/shared";
10
11
  import { resolveRootSessionId } from "@clinebot/shared";
12
+ import { ensureHookLogDir } from "@clinebot/shared/storage";
11
13
  import { nanoid } from "nanoid";
12
14
  import { z } from "zod";
15
+ import type {
16
+ SubAgentEndContext,
17
+ SubAgentStartContext,
18
+ } from "../extensions/tools/team";
13
19
  import type { HookEventPayload } from "../hooks";
14
- import type { SubAgentEndContext, SubAgentStartContext } from "../team";
15
- import { SessionSource, type SessionStatus } from "../types/common";
16
- import { nowIso, SessionArtifacts, unlinkIfExists } from "./session-artifacts";
20
+ import { deleteCheckpointRefs } from "../hooks/checkpoint-hooks";
17
21
  import {
18
- deriveSubsessionStatus,
19
- makeSubSessionId,
20
- makeTeamTaskSubSessionId,
21
- } from "./session-graph";
22
- import {
23
- type SessionManifest,
24
- SessionManifestSchema,
25
- } from "./session-manifest";
26
- import type {
27
- CreateRootSessionWithArtifactsInput,
28
- RootSessionArtifacts,
29
- SessionRow,
30
- UpsertSubagentInput,
31
- } from "./session-service";
22
+ nowIso,
23
+ SessionArtifacts,
24
+ unlinkIfExists,
25
+ } from "../services/session-artifacts";
32
26
  import {
33
27
  buildManifestFromRow,
34
28
  buildMessagesFilePayload,
@@ -41,12 +35,29 @@ import {
41
35
  withLatestAssistantTurnMetadata,
42
36
  withOccRetry,
43
37
  writeEmptyMessagesFile,
44
- } from "./utils/helpers";
38
+ } from "../services/session-data";
39
+ import { SessionSource, type SessionStatus } from "../types/common";
45
40
  import type {
46
41
  PersistedSessionUpdateInput,
42
+ SessionMessagesArtifactUploader,
47
43
  SessionPersistenceAdapter,
48
44
  StoredMessageWithMetadata,
49
- } from "./utils/types";
45
+ } from "../types/session";
46
+ import {
47
+ deriveSubsessionStatus,
48
+ makeSubSessionId,
49
+ makeTeamTaskSubSessionId,
50
+ } from "./session-graph";
51
+ import {
52
+ type SessionManifest,
53
+ SessionManifestSchema,
54
+ } from "./session-manifest";
55
+ import type {
56
+ CreateRootSessionWithArtifactsInput,
57
+ RootSessionArtifacts,
58
+ SessionRow,
59
+ UpsertSubagentInput,
60
+ } from "./session-service";
50
61
 
51
62
  export type { PersistedSessionUpdateInput, SessionPersistenceAdapter };
52
63
 
@@ -68,12 +79,19 @@ export class UnifiedSessionPersistenceService {
68
79
  string
69
80
  >();
70
81
  protected readonly artifacts: SessionArtifacts;
82
+ private readonly messagesArtifactUploader?: SessionMessagesArtifactUploader;
71
83
  private static readonly STALE_REASON = "failed_external_process_exit";
72
84
  private static readonly STALE_SOURCE = "stale_session_reconciler";
73
85
  private static readonly TEAM_HEARTBEAT_LOG_INTERVAL_MS = 30_000;
74
86
 
75
- constructor(private readonly adapter: SessionPersistenceAdapter) {
87
+ constructor(
88
+ private readonly adapter: SessionPersistenceAdapter,
89
+ options: {
90
+ messagesArtifactUploader?: SessionMessagesArtifactUploader;
91
+ } = {},
92
+ ) {
76
93
  this.artifacts = new SessionArtifacts(() => this.ensureSessionsDir());
94
+ this.messagesArtifactUploader = options.messagesArtifactUploader;
77
95
  }
78
96
 
79
97
  ensureSessionsDir(): string {
@@ -115,6 +133,7 @@ export class UnifiedSessionPersistenceService {
115
133
  manifestPath: string,
116
134
  manifest: SessionManifest,
117
135
  ): void {
136
+ mkdirSync(dirname(manifestPath), { recursive: true });
118
137
  writeFileSync(
119
138
  manifestPath,
120
139
  `${JSON.stringify(SessionManifestSchema.parse(manifest), null, 2)}\n`,
@@ -152,7 +171,7 @@ export class UnifiedSessionPersistenceService {
152
171
 
153
172
  private async resolveArtifactPath(
154
173
  sessionId: string,
155
- kind: "transcriptPath" | "hookPath" | "messagesPath",
174
+ kind: "messagesPath",
156
175
  fallback: (id: string) => string,
157
176
  ): Promise<string> {
158
177
  const row = await this.adapter.getSession(sessionId);
@@ -187,8 +206,6 @@ export class UnifiedSessionPersistenceService {
187
206
  const providedId = input.sessionId.trim();
188
207
  const sessionId =
189
208
  providedId.length > 0 ? providedId : `${Date.now()}_${nanoid(5)}`;
190
- const transcriptPath = this.artifacts.sessionTranscriptPath(sessionId);
191
- const hookPath = this.artifacts.sessionHookPath(sessionId);
192
209
  const messagesPath = this.artifacts.sessionMessagesPath(sessionId);
193
210
  const manifestPath = this.artifacts.sessionManifestPath(sessionId);
194
211
 
@@ -242,15 +259,14 @@ export class UnifiedSessionPersistenceService {
242
259
  isSubagent: false,
243
260
  prompt: manifest.prompt ?? null,
244
261
  metadata: sanitizeMetadata(manifest.metadata),
245
- transcriptPath,
246
- hookPath,
262
+ hookPath: "",
247
263
  messagesPath,
248
264
  updatedAt: nowIso(),
249
265
  });
250
266
 
251
267
  this.initializeMessagesFile(sessionId, messagesPath, startedAt);
252
268
  this.writeManifestFile(manifestPath, manifest);
253
- return { manifestPath, transcriptPath, hookPath, messagesPath, manifest };
269
+ return { manifestPath, messagesPath, manifest };
254
270
  }
255
271
 
256
272
  // ── Session status updates ────────────────────────────────────────
@@ -263,14 +279,14 @@ export class UnifiedSessionPersistenceService {
263
279
  let endedAt: string | undefined;
264
280
  const result = await withOccRetry(
265
281
  () => this.adapter.getSession(sessionId),
266
- async (statusLock) => {
282
+ async (row) => {
267
283
  endedAt = nowIso();
268
284
  return this.adapter.updateSession({
269
285
  sessionId,
270
286
  status,
271
287
  endedAt,
272
288
  exitCode: typeof exitCode === "number" ? exitCode : null,
273
- expectedStatusLock: statusLock,
289
+ expectedStatusLock: row.statusLock,
274
290
  });
275
291
  },
276
292
  OCC_MAX_RETRIES,
@@ -388,8 +404,6 @@ export class UnifiedSessionPersistenceService {
388
404
  conversationId?: string | null;
389
405
  prompt: string;
390
406
  startedAt: string;
391
- transcriptPath: string;
392
- hookPath: string;
393
407
  messagesPath: string;
394
408
  },
395
409
  ): SessionRow {
@@ -418,8 +432,7 @@ export class UnifiedSessionPersistenceService {
418
432
  isSubagent: true,
419
433
  prompt: opts.prompt,
420
434
  metadata: resolveMetadataWithTitle({ prompt: opts.prompt }),
421
- transcriptPath: opts.transcriptPath,
422
- hookPath: opts.hookPath,
435
+ hookPath: "",
423
436
  messagesPath: opts.messagesPath,
424
437
  updatedAt: opts.startedAt,
425
438
  };
@@ -517,31 +530,16 @@ export class UnifiedSessionPersistenceService {
517
530
  subSessionId: string,
518
531
  event: HookEventPayload,
519
532
  ): Promise<void> {
520
- const path = await this.resolveArtifactPath(
521
- subSessionId,
522
- "hookPath",
523
- (id) => this.artifacts.sessionHookPath(id),
524
- );
533
+ void subSessionId;
534
+ const envPath = process.env.CLINE_HOOKS_LOG_PATH?.trim() || undefined;
535
+ const logPath = envPath ?? join(ensureHookLogDir(), "hooks.jsonl");
525
536
  appendFileSync(
526
- path,
537
+ logPath,
527
538
  `${JSON.stringify({ ts: nowIso(), ...event })}\n`,
528
539
  "utf8",
529
540
  );
530
541
  }
531
542
 
532
- async appendSubagentTranscriptLine(
533
- subSessionId: string,
534
- line: string,
535
- ): Promise<void> {
536
- if (!line.trim()) return;
537
- const path = await this.resolveArtifactPath(
538
- subSessionId,
539
- "transcriptPath",
540
- (id) => this.artifacts.sessionTranscriptPath(id),
541
- );
542
- appendFileSync(path, `${line}\n`, "utf8");
543
- }
544
-
545
543
  async persistSessionMessages(
546
544
  sessionId: string,
547
545
  messages: LlmsProviders.Message[],
@@ -561,7 +559,26 @@ export class UnifiedSessionPersistenceService {
561
559
  messages: normalizedMessages,
562
560
  systemPrompt,
563
561
  });
564
- writeFileSync(path, `${JSON.stringify(payload, null, 2)}\n`, "utf8");
562
+ const contents = `${JSON.stringify(payload, null, 2)}\n`;
563
+ mkdirSync(dirname(path), { recursive: true });
564
+ writeFileSync(path, contents, "utf8");
565
+ if (!this.messagesArtifactUploader) {
566
+ return;
567
+ }
568
+ try {
569
+ const row = await this.adapter.getSession(sessionId);
570
+ await this.messagesArtifactUploader.uploadMessagesFile({
571
+ sessionId,
572
+ path,
573
+ contents,
574
+ row,
575
+ });
576
+ } catch (error) {
577
+ console.warn(
578
+ `Failed to upload persisted session messages for ${sessionId}`,
579
+ error,
580
+ );
581
+ }
565
582
  }
566
583
 
567
584
  // ── Subagent status ───────────────────────────────────────────────
@@ -621,8 +638,10 @@ export class UnifiedSessionPersistenceService {
621
638
 
622
639
  const sessionId = makeTeamTaskSubSessionId(rootSessionId, agentId);
623
640
  const startedAt = nowIso();
624
- const { transcriptPath, hookPath, messagesPath } =
625
- this.artifacts.subagentArtifactPaths(sessionId, agentId);
641
+ const { messagesPath } = this.artifacts.subagentArtifactPaths(
642
+ sessionId,
643
+ agentId,
644
+ );
626
645
 
627
646
  await this.adapter.upsertSession(
628
647
  this.buildSubsessionRow(root, {
@@ -632,13 +651,10 @@ export class UnifiedSessionPersistenceService {
632
651
  agentId,
633
652
  prompt: message || `Team task for ${agentId}`,
634
653
  startedAt,
635
- transcriptPath,
636
- hookPath,
637
654
  messagesPath,
638
655
  }),
639
656
  );
640
657
  this.initializeMessagesFile(sessionId, messagesPath, startedAt);
641
- await this.appendSubagentTranscriptLine(sessionId, `[start] ${message}`);
642
658
 
643
659
  const key = this.teamTaskQueueKey(rootSessionId, agentId);
644
660
  const queue = this.teamTaskSessionsByAgent.get(key) ?? [];
@@ -650,7 +666,7 @@ export class UnifiedSessionPersistenceService {
650
666
  rootSessionId: string,
651
667
  agentId: string,
652
668
  status: SessionStatus,
653
- summary?: string,
669
+ _summary?: string,
654
670
  result?: AgentResult,
655
671
  messages?: LlmsProviders.Message[],
656
672
  ): Promise<void> {
@@ -671,10 +687,6 @@ export class UnifiedSessionPersistenceService {
671
687
  if (persistedMessages) {
672
688
  await this.persistSessionMessages(sessionId, persistedMessages);
673
689
  }
674
- await this.appendSubagentTranscriptLine(
675
- sessionId,
676
- summary ?? `[done] ${status}`,
677
- );
678
690
  await this.applySubagentStatusBySessionId(sessionId, status);
679
691
  this.teamTaskLastHeartbeatBySession.delete(sessionId);
680
692
  this.teamTaskLastProgressLineBySession.delete(sessionId);
@@ -714,7 +726,6 @@ export class UnifiedSessionPersistenceService {
714
726
  : `[progress] ${trimmed}`;
715
727
  if (this.teamTaskLastProgressLineBySession.get(sessionId) === line) return;
716
728
  this.teamTaskLastProgressLineBySession.set(sessionId, line);
717
- await this.appendSubagentTranscriptLine(sessionId, line);
718
729
  }
719
730
 
720
731
  // ── SubAgent lifecycle ────────────────────────────────────────────
@@ -731,10 +742,6 @@ export class UnifiedSessionPersistenceService {
731
742
  rootSessionId,
732
743
  });
733
744
  if (!subSessionId) return;
734
- await this.appendSubagentTranscriptLine(
735
- subSessionId,
736
- `[start] ${context.input.task}`,
737
- );
738
745
  await this.applySubagentStatusBySessionId(subSessionId, "running");
739
746
  }
740
747
 
@@ -752,15 +759,10 @@ export class UnifiedSessionPersistenceService {
752
759
  if (!subSessionId) return;
753
760
 
754
761
  if (context.error) {
755
- await this.appendSubagentTranscriptLine(
756
- subSessionId,
757
- `[error] ${context.error.message}`,
758
- );
759
762
  await this.applySubagentStatusBySessionId(subSessionId, "failed");
760
763
  return;
761
764
  }
762
765
  const reason = context.result?.finishReason ?? "completed";
763
- await this.appendSubagentTranscriptLine(subSessionId, `[done] ${reason}`);
764
766
  await this.applySubagentStatusBySessionId(
765
767
  subSessionId,
766
768
  reason === "aborted" ? "cancelled" : "completed",
@@ -826,24 +828,22 @@ export class UnifiedSessionPersistenceService {
826
828
  const { path: manifestPath } = this.readManifestFile(latest.sessionId);
827
829
  this.writeManifestFile(manifestPath, manifest);
828
830
 
829
- appendFileSync(
830
- latest.hookPath,
831
- `${JSON.stringify({
832
- ts: detectedAt,
833
- hookName: "session_shutdown",
834
- reason,
835
- sessionId: latest.sessionId,
836
- pid: latest.pid,
837
- source: UnifiedSessionPersistenceService.STALE_SOURCE,
838
- })}\n`,
839
- "utf8",
840
- );
841
- appendFileSync(
842
- latest.transcriptPath,
843
- `[shutdown] ${reason} (pid=${latest.pid})\n`,
844
- "utf8",
845
- );
846
-
831
+ {
832
+ const envPath = process.env.CLINE_HOOKS_LOG_PATH?.trim() || undefined;
833
+ const logPath = envPath ?? join(ensureHookLogDir(), "hooks.jsonl");
834
+ appendFileSync(
835
+ logPath,
836
+ `${JSON.stringify({
837
+ ts: detectedAt,
838
+ hookName: "session_shutdown",
839
+ reason,
840
+ sessionId: latest.sessionId,
841
+ pid: latest.pid,
842
+ source: UnifiedSessionPersistenceService.STALE_SOURCE,
843
+ })}\n`,
844
+ "utf8",
845
+ );
846
+ }
847
847
  return {
848
848
  ...latest,
849
849
  status: "failed",
@@ -908,19 +908,20 @@ export class UnifiedSessionPersistenceService {
908
908
  parentSessionId: id,
909
909
  });
910
910
  await this.adapter.deleteSession(id, true);
911
- for (const child of children) {
912
- unlinkIfExists(child.transcriptPath);
913
- unlinkIfExists(child.hookPath);
914
- unlinkIfExists(child.messagesPath);
915
- unlinkIfExists(
916
- this.artifacts.sessionManifestPath(child.sessionId, false),
917
- );
918
- this.artifacts.removeSessionDirIfEmpty(child.sessionId);
919
- }
911
+ await Promise.allSettled(
912
+ children.map(async (child) => {
913
+ await deleteCheckpointRefs(child.cwd, child.sessionId);
914
+ unlinkIfExists(child.messagesPath);
915
+ unlinkIfExists(
916
+ this.artifacts.sessionManifestPath(child.sessionId, false),
917
+ );
918
+ this.artifacts.removeSessionDirIfEmpty(child.sessionId);
919
+ }),
920
+ );
920
921
  }
921
922
 
922
- unlinkIfExists(row.transcriptPath);
923
- unlinkIfExists(row.hookPath);
923
+ await deleteCheckpointRefs(row.cwd, id);
924
+
924
925
  unlinkIfExists(row.messagesPath);
925
926
  unlinkIfExists(this.artifacts.sessionManifestPath(id, false));
926
927
  if (row.isSubagent) {
@@ -929,7 +930,7 @@ export class UnifiedSessionPersistenceService {
929
930
  const candidateDirs = new Set<string>([
930
931
  this.artifacts.sessionArtifactsDir(id),
931
932
  ]);
932
- for (const path of [row.transcriptPath, row.hookPath, row.messagesPath]) {
933
+ for (const path of [row.messagesPath]) {
933
934
  if (typeof path === "string" && path.trim().length > 0) {
934
935
  candidateDirs.add(dirname(path));
935
936
  }
@@ -1,5 +1,6 @@
1
1
  import { existsSync, mkdirSync } from "node:fs";
2
2
  import { RpcSessionClient, type RpcSessionRow } from "@clinebot/rpc";
3
+ import type { SessionMessagesArtifactUploader } from "../types/session";
3
4
  import type {
4
5
  PersistedSessionUpdateInput,
5
6
  SessionPersistenceAdapter,
@@ -79,19 +80,25 @@ class RpcSessionPersistenceAdapter implements SessionPersistenceAdapter {
79
80
  export interface RpcCoreSessionServiceOptions {
80
81
  address?: string;
81
82
  sessionsDir: string;
83
+ messagesArtifactUploader?: SessionMessagesArtifactUploader;
82
84
  }
83
85
 
84
86
  export class RpcCoreSessionService extends UnifiedSessionPersistenceService {
85
87
  private readonly sessionsDirPath: string;
86
88
  private readonly client: RpcSessionClient;
89
+ public readonly address: string;
87
90
 
88
91
  constructor(options: RpcCoreSessionServiceOptions) {
92
+ const address = options.address?.trim() || "127.0.0.1:4317";
89
93
  const client = new RpcSessionClient({
90
- address: options.address?.trim() || "127.0.0.1:4317",
94
+ address,
95
+ });
96
+ super(new RpcSessionPersistenceAdapter(client), {
97
+ messagesArtifactUploader: options.messagesArtifactUploader,
91
98
  });
92
- super(new RpcSessionPersistenceAdapter(client));
93
99
  this.sessionsDirPath = options.sessionsDir;
94
100
  this.client = client;
101
+ this.address = address;
95
102
  }
96
103
 
97
104
  override ensureSessionsDir(): string {
@@ -2,7 +2,7 @@ import { existsSync, mkdtempSync } from "node:fs";
2
2
  import { tmpdir } from "node:os";
3
3
  import { join } from "node:path";
4
4
  import { describe, expect, it } from "vitest";
5
- import { AgentTeamsRuntime } from "../team";
5
+ import { AgentTeamsRuntime } from "../extensions/tools/team";
6
6
  import { FileTeamPersistenceStore } from "./session-service";
7
7
 
8
8
  describe("FileTeamPersistenceStore", () => {