@clinebot/core 0.0.33 → 0.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/README.md +12 -8
  2. package/dist/ClineCore.d.ts +48 -29
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/auth/client.d.ts +19 -0
  5. package/dist/auth/client.d.ts.map +1 -1
  6. package/dist/auth/cline.d.ts.map +1 -1
  7. package/dist/auth/oca.d.ts.map +1 -1
  8. package/dist/auth/server.d.ts +32 -0
  9. package/dist/auth/server.d.ts.map +1 -1
  10. package/dist/auth/types.d.ts +29 -0
  11. package/dist/auth/types.d.ts.map +1 -1
  12. package/dist/extensions/config/agent-config-loader.d.ts +2 -2
  13. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  14. package/dist/extensions/config/agent-config-parser.d.ts +1 -1
  15. package/dist/extensions/config/agent-config-parser.d.ts.map +1 -1
  16. package/dist/extensions/config/hooks-config-loader.d.ts +2 -2
  17. package/dist/extensions/config/hooks-config-loader.d.ts.map +1 -1
  18. package/dist/extensions/config/index.d.ts +3 -3
  19. package/dist/extensions/config/index.d.ts.map +1 -1
  20. package/dist/extensions/config/user-instruction-config-loader.d.ts +2 -2
  21. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  22. package/dist/extensions/index.d.ts +2 -1
  23. package/dist/extensions/index.d.ts.map +1 -1
  24. package/dist/extensions/plugin/plugin-config-loader.d.ts +2 -1
  25. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  26. package/dist/extensions/plugin/plugin-load-report.d.ts +19 -0
  27. package/dist/extensions/plugin/plugin-load-report.d.ts.map +1 -0
  28. package/dist/extensions/plugin/plugin-loader.d.ts +6 -0
  29. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  30. package/dist/extensions/plugin/plugin-sandbox.d.ts +2 -1
  31. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  32. package/dist/extensions/plugin-sandbox-bootstrap.js +242 -242
  33. package/dist/extensions/tools/constants.d.ts.map +1 -0
  34. package/dist/extensions/tools/definitions.d.ts.map +1 -0
  35. package/dist/extensions/tools/executors/apply-patch-parser.d.ts.map +1 -0
  36. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -0
  37. package/dist/extensions/tools/executors/bash.d.ts.map +1 -0
  38. package/dist/extensions/tools/executors/editor.d.ts.map +1 -0
  39. package/dist/extensions/tools/executors/file-read.d.ts.map +1 -0
  40. package/dist/extensions/tools/executors/index.d.ts.map +1 -0
  41. package/dist/extensions/tools/executors/search.d.ts.map +1 -0
  42. package/dist/extensions/tools/executors/web-fetch.d.ts.map +1 -0
  43. package/dist/extensions/tools/helpers.d.ts.map +1 -0
  44. package/dist/extensions/tools/index.d.ts.map +1 -0
  45. package/dist/{tools → extensions/tools}/model-tool-routing.d.ts +1 -1
  46. package/dist/extensions/tools/model-tool-routing.d.ts.map +1 -0
  47. package/dist/{tools → extensions/tools}/presets.d.ts +1 -2
  48. package/dist/extensions/tools/presets.d.ts.map +1 -0
  49. package/dist/extensions/tools/schemas.d.ts.map +1 -0
  50. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -0
  51. package/dist/extensions/tools/team/index.d.ts.map +1 -0
  52. package/dist/{team → extensions/tools/team}/multi-agent.d.ts +1 -3
  53. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -0
  54. package/dist/extensions/tools/team/projections.d.ts.map +1 -0
  55. package/dist/extensions/tools/team/runtime.d.ts.map +1 -0
  56. package/dist/{team → extensions/tools/team}/spawn-agent-tool.d.ts +0 -1
  57. package/dist/extensions/tools/team/spawn-agent-tool.d.ts.map +1 -0
  58. package/dist/extensions/tools/team/subagent-prompts.d.ts.map +1 -0
  59. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -0
  60. package/dist/{tools → extensions/tools}/types.d.ts +4 -3
  61. package/dist/extensions/tools/types.d.ts.map +1 -0
  62. package/dist/{runtime → hooks}/checkpoint-hooks.d.ts +7 -0
  63. package/dist/hooks/checkpoint-hooks.d.ts.map +1 -0
  64. package/dist/{runtime → hooks}/hook-file-hooks.d.ts +0 -2
  65. package/dist/hooks/hook-file-hooks.d.ts.map +1 -0
  66. package/dist/hooks/subprocess.d.ts +3 -130
  67. package/dist/hooks/subprocess.d.ts.map +1 -1
  68. package/dist/index.d.ts +38 -35
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +386 -384
  71. package/dist/runtime/history.d.ts +4 -0
  72. package/dist/runtime/history.d.ts.map +1 -0
  73. package/dist/runtime/host.d.ts +9 -0
  74. package/dist/runtime/host.d.ts.map +1 -0
  75. package/dist/{session → runtime}/rpc-runtime-ensure.d.ts +13 -1
  76. package/dist/{session → runtime}/rpc-runtime-ensure.d.ts.map +1 -1
  77. package/dist/{session → runtime}/rpc-spawn-lease.d.ts.map +1 -1
  78. package/dist/runtime/runtime-builder.d.ts +1 -1
  79. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  80. package/dist/{session/session-manager.d.ts → runtime/runtime-host.d.ts} +55 -12
  81. package/dist/runtime/runtime-host.d.ts.map +1 -0
  82. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts +1 -1
  83. package/dist/{session → runtime}/runtime-oauth-token-manager.d.ts.map +1 -1
  84. package/dist/runtime/session-runtime.d.ts +2 -2
  85. package/dist/runtime/session-runtime.d.ts.map +1 -1
  86. package/dist/runtime/subprocess-sandbox.d.ts +2 -0
  87. package/dist/runtime/subprocess-sandbox.d.ts.map +1 -1
  88. package/dist/runtime/tool-approval.d.ts.map +1 -1
  89. package/dist/{session/session-agent-events.d.ts → services/agent-events.d.ts} +4 -4
  90. package/dist/services/agent-events.d.ts.map +1 -0
  91. package/dist/services/config.d.ts +3 -0
  92. package/dist/services/config.d.ts.map +1 -0
  93. package/dist/services/local-runtime-bootstrap.d.ts +41 -0
  94. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -0
  95. package/dist/services/providers/local-provider-registry.d.ts.map +1 -0
  96. package/dist/services/providers/local-provider-service.d.ts.map +1 -0
  97. package/dist/{session → services}/session-artifacts.d.ts +2 -4
  98. package/dist/services/session-artifacts.d.ts.map +1 -0
  99. package/dist/{session/utils/helpers.d.ts → services/session-data.d.ts} +19 -27
  100. package/dist/services/session-data.d.ts.map +1 -0
  101. package/dist/{session → services}/session-telemetry.d.ts +2 -2
  102. package/dist/services/session-telemetry.d.ts.map +1 -0
  103. package/dist/{storage → services/storage}/file-team-store.d.ts +2 -2
  104. package/dist/services/storage/file-team-store.d.ts.map +1 -0
  105. package/dist/{storage → services/storage}/provider-settings-legacy-migration.d.ts +1 -1
  106. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -0
  107. package/dist/{storage → services/storage}/provider-settings-manager.d.ts +1 -1
  108. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -0
  109. package/dist/{storage → services/storage}/sqlite-session-store.d.ts +3 -3
  110. package/dist/services/storage/sqlite-session-store.d.ts.map +1 -0
  111. package/dist/{storage → services/storage}/sqlite-team-store.d.ts +2 -2
  112. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -0
  113. package/dist/{storage → services/storage}/team-store.d.ts +1 -1
  114. package/dist/services/storage/team-store.d.ts.map +1 -0
  115. package/dist/services/telemetry/ITelemetryAdapter.d.ts.map +1 -0
  116. package/dist/services/telemetry/OpenTelemetryAdapter.d.ts.map +1 -0
  117. package/dist/services/telemetry/OpenTelemetryProvider.d.ts.map +1 -0
  118. package/dist/services/telemetry/TelemetryLoggerSink.d.ts.map +1 -0
  119. package/dist/services/telemetry/TelemetryService.d.ts.map +1 -0
  120. package/dist/services/telemetry/core-events.d.ts.map +1 -0
  121. package/dist/services/telemetry/distinct-id.d.ts.map +1 -0
  122. package/dist/services/telemetry/index.d.ts.map +1 -0
  123. package/dist/{telemetry → services/telemetry}/index.js +6 -6
  124. package/dist/{session/utils → services}/usage.d.ts +1 -1
  125. package/dist/services/usage.d.ts.map +1 -0
  126. package/dist/services/workspace/file-indexer.d.ts.map +1 -0
  127. package/dist/services/workspace/index.d.ts.map +1 -0
  128. package/dist/services/workspace/mention-enricher.d.ts.map +1 -0
  129. package/dist/services/workspace-manifest.d.ts.map +1 -0
  130. package/dist/session/file-session-service.d.ts +4 -1
  131. package/dist/session/file-session-service.d.ts.map +1 -1
  132. package/dist/session/persistence-service.d.ts +8 -6
  133. package/dist/session/persistence-service.d.ts.map +1 -1
  134. package/dist/session/rpc-session-service.d.ts +3 -0
  135. package/dist/session/rpc-session-service.d.ts.map +1 -1
  136. package/dist/session/session-service.d.ts +8 -9
  137. package/dist/session/session-service.d.ts.map +1 -1
  138. package/dist/session/session-team-coordination.d.ts +4 -4
  139. package/dist/session/session-team-coordination.d.ts.map +1 -1
  140. package/dist/session/sqlite-rpc-session-backend.d.ts.map +1 -1
  141. package/dist/{session/default-session-manager.d.ts → transports/local.d.ts} +24 -14
  142. package/dist/transports/local.d.ts.map +1 -0
  143. package/dist/transports/rpc.d.ts +51 -0
  144. package/dist/transports/rpc.d.ts.map +1 -0
  145. package/dist/transports/runtime-host-support.d.ts +21 -0
  146. package/dist/transports/runtime-host-support.d.ts.map +1 -0
  147. package/dist/types/chat-schema.d.ts.map +1 -0
  148. package/dist/types/config.d.ts +3 -2
  149. package/dist/types/config.d.ts.map +1 -1
  150. package/dist/{session/utils/types.d.ts → types/session.d.ts} +15 -6
  151. package/dist/types/session.d.ts.map +1 -0
  152. package/dist/types/sessions.d.ts +19 -0
  153. package/dist/types/sessions.d.ts.map +1 -1
  154. package/dist/types/storage.d.ts +1 -3
  155. package/dist/types/storage.d.ts.map +1 -1
  156. package/dist/types.d.ts +7 -6
  157. package/dist/types.d.ts.map +1 -1
  158. package/package.json +7 -12
  159. package/src/ClineCore.test.ts +95 -19
  160. package/src/ClineCore.ts +120 -50
  161. package/src/auth/client.test.ts +29 -0
  162. package/src/auth/client.ts +21 -0
  163. package/src/auth/cline.ts +3 -1
  164. package/src/auth/codex.ts +1 -1
  165. package/src/auth/oca.ts +3 -1
  166. package/src/auth/server.test.ts +287 -0
  167. package/src/auth/server.ts +50 -1
  168. package/src/auth/types.ts +29 -0
  169. package/src/extensions/config/agent-config-loader.test.ts +3 -3
  170. package/src/extensions/config/agent-config-loader.ts +1 -5
  171. package/src/extensions/config/agent-config-parser.ts +1 -1
  172. package/src/extensions/config/hooks-config-loader.ts +1 -2
  173. package/src/extensions/config/index.ts +0 -4
  174. package/src/extensions/config/user-instruction-config-loader.ts +0 -4
  175. package/src/extensions/index.ts +6 -0
  176. package/src/extensions/plugin/plugin-config-loader.test.ts +39 -0
  177. package/src/extensions/plugin/plugin-config-loader.ts +18 -10
  178. package/src/extensions/plugin/plugin-load-report.ts +20 -0
  179. package/src/extensions/plugin/plugin-loader.test.ts +45 -0
  180. package/src/extensions/plugin/plugin-loader.ts +57 -3
  181. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +158 -86
  182. package/src/extensions/plugin/plugin-sandbox.test.ts +70 -0
  183. package/src/extensions/plugin/plugin-sandbox.ts +17 -6
  184. package/src/{tools → extensions/tools}/definitions.ts +1 -1
  185. package/src/extensions/tools/executors/file-read.test.ts +125 -0
  186. package/src/{tools → extensions/tools}/executors/file-read.ts +29 -4
  187. package/src/{tools → extensions/tools}/executors/search.ts +1 -1
  188. package/src/{tools → extensions/tools}/model-tool-routing.ts +1 -1
  189. package/src/{tools → extensions/tools}/presets.ts +2 -3
  190. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +455 -0
  191. package/src/{team → extensions/tools/team}/multi-agent.ts +80 -17
  192. package/src/{team → extensions/tools/team}/spawn-agent-tool.test.ts +0 -6
  193. package/src/{team → extensions/tools/team}/spawn-agent-tool.ts +1 -7
  194. package/src/{team → extensions/tools/team}/subagent-prompts.ts +2 -2
  195. package/src/{team → extensions/tools/team}/team-tools.test.ts +146 -30
  196. package/src/{team → extensions/tools/team}/team-tools.ts +98 -69
  197. package/src/{tools → extensions/tools}/types.ts +5 -3
  198. package/src/{runtime → hooks}/checkpoint-hooks.ts +27 -0
  199. package/src/{runtime → hooks}/hook-file-hooks.test.ts +42 -7
  200. package/src/{runtime → hooks}/hook-file-hooks.ts +6 -11
  201. package/src/hooks/subprocess.ts +48 -257
  202. package/src/index.ts +178 -158
  203. package/src/runtime/history.test.ts +114 -0
  204. package/src/runtime/history.ts +237 -0
  205. package/src/runtime/host.test.ts +230 -0
  206. package/src/runtime/host.ts +362 -0
  207. package/src/runtime/rpc-runtime-ensure.test.ts +123 -0
  208. package/src/{session → runtime}/rpc-runtime-ensure.ts +165 -27
  209. package/src/{session → runtime}/rpc-spawn-lease.test.ts +33 -1
  210. package/src/{session → runtime}/rpc-spawn-lease.ts +54 -20
  211. package/src/runtime/runtime-builder.team-persistence.test.ts +6 -3
  212. package/src/runtime/runtime-builder.test.ts +101 -4
  213. package/src/runtime/runtime-builder.ts +125 -86
  214. package/src/runtime/runtime-host.ts +178 -0
  215. package/src/{session → runtime}/runtime-oauth-token-manager.ts +1 -1
  216. package/src/runtime/runtime-parity.test.ts +1 -1
  217. package/src/runtime/session-runtime.ts +2 -2
  218. package/src/runtime/subprocess-sandbox.ts +26 -23
  219. package/src/runtime/tool-approval.ts +13 -15
  220. package/src/{session/session-agent-events.ts → services/agent-events.ts} +7 -7
  221. package/src/services/config.ts +5 -0
  222. package/src/services/local-runtime-bootstrap.ts +280 -0
  223. package/src/{providers → services/providers}/local-provider-service.ts +4 -4
  224. package/src/{session → services}/session-artifacts.ts +23 -19
  225. package/src/{session/utils/helpers.test.ts → services/session-data.test.ts} +1 -1
  226. package/src/{session/utils/helpers.ts → services/session-data.ts} +76 -72
  227. package/src/{session → services}/session-telemetry.ts +7 -9
  228. package/src/services/storage/artifact-store.ts +1 -0
  229. package/src/{storage → services/storage}/file-team-store.ts +2 -2
  230. package/src/{storage → services/storage}/provider-settings-legacy-migration.test.ts +1 -1
  231. package/src/{storage → services/storage}/provider-settings-legacy-migration.ts +2 -2
  232. package/src/{storage → services/storage}/provider-settings-manager.ts +2 -2
  233. package/src/services/storage/session-store.ts +1 -0
  234. package/src/{storage → services/storage}/sqlite-session-store.ts +7 -12
  235. package/src/{storage → services/storage}/sqlite-team-store.ts +4 -4
  236. package/src/{storage → services/storage}/team-store.ts +1 -1
  237. package/src/{session/utils → services}/usage.ts +1 -1
  238. package/src/{input → services/workspace}/file-indexer.test.ts +30 -1
  239. package/src/{input → services/workspace}/file-indexer.ts +26 -2
  240. package/src/{input → services/workspace}/mention-enricher.test.ts +21 -0
  241. package/src/{input → services/workspace}/mention-enricher.ts +1 -1
  242. package/src/session/file-session-service.ts +9 -7
  243. package/src/session/index.ts +25 -17
  244. package/src/session/persistence-service.test.ts +121 -24
  245. package/src/session/persistence-service.ts +118 -102
  246. package/src/session/rpc-session-service.ts +9 -2
  247. package/src/session/session-service.team-persistence.test.ts +1 -1
  248. package/src/session/session-service.ts +32 -19
  249. package/src/session/session-team-coordination.ts +13 -6
  250. package/src/session/sqlite-rpc-session-backend.ts +4 -6
  251. package/src/session/workspace-manager.ts +1 -1
  252. package/src/{session/default-session-manager.e2e.test.ts → transports/local.e2e.test.ts} +13 -17
  253. package/src/{session/default-session-manager.test.ts → transports/local.test.ts} +316 -230
  254. package/src/{session/default-session-manager.ts → transports/local.ts} +138 -172
  255. package/src/transports/rpc.test.ts +82 -0
  256. package/src/transports/rpc.ts +665 -0
  257. package/src/transports/runtime-host-support.ts +86 -0
  258. package/src/types/config.ts +3 -2
  259. package/src/{session/utils/types.ts → types/session.ts} +18 -5
  260. package/src/types/sessions.ts +21 -0
  261. package/src/types/storage.ts +1 -6
  262. package/src/types.ts +25 -18
  263. package/dist/chat/chat-schema.d.ts.map +0 -1
  264. package/dist/input/file-indexer.d.ts.map +0 -1
  265. package/dist/input/index.d.ts.map +0 -1
  266. package/dist/input/mention-enricher.d.ts.map +0 -1
  267. package/dist/prompt/default-system.d.ts +0 -2
  268. package/dist/prompt/default-system.d.ts.map +0 -1
  269. package/dist/providers/local-provider-registry.d.ts.map +0 -1
  270. package/dist/providers/local-provider-service.d.ts.map +0 -1
  271. package/dist/runtime/checkpoint-hooks.d.ts.map +0 -1
  272. package/dist/runtime/hook-file-hooks.d.ts.map +0 -1
  273. package/dist/runtime/team-runtime-registry.d.ts +0 -13
  274. package/dist/runtime/team-runtime-registry.d.ts.map +0 -1
  275. package/dist/session/default-session-manager.d.ts.map +0 -1
  276. package/dist/session/session-agent-events.d.ts.map +0 -1
  277. package/dist/session/session-artifacts.d.ts.map +0 -1
  278. package/dist/session/session-config-builder.d.ts +0 -16
  279. package/dist/session/session-config-builder.d.ts.map +0 -1
  280. package/dist/session/session-host.d.ts +0 -15
  281. package/dist/session/session-host.d.ts.map +0 -1
  282. package/dist/session/session-manager.d.ts.map +0 -1
  283. package/dist/session/session-telemetry.d.ts.map +0 -1
  284. package/dist/session/utils/helpers.d.ts.map +0 -1
  285. package/dist/session/utils/types.d.ts.map +0 -1
  286. package/dist/session/utils/usage.d.ts.map +0 -1
  287. package/dist/session/workspace-manifest.d.ts.map +0 -1
  288. package/dist/storage/file-team-store.d.ts.map +0 -1
  289. package/dist/storage/provider-settings-legacy-migration.d.ts.map +0 -1
  290. package/dist/storage/provider-settings-manager.d.ts.map +0 -1
  291. package/dist/storage/sqlite-session-store.d.ts.map +0 -1
  292. package/dist/storage/sqlite-team-store.d.ts.map +0 -1
  293. package/dist/storage/team-store.d.ts.map +0 -1
  294. package/dist/team/delegated-agent.d.ts.map +0 -1
  295. package/dist/team/index.d.ts.map +0 -1
  296. package/dist/team/multi-agent.d.ts.map +0 -1
  297. package/dist/team/projections.d.ts.map +0 -1
  298. package/dist/team/runtime.d.ts.map +0 -1
  299. package/dist/team/spawn-agent-tool.d.ts.map +0 -1
  300. package/dist/team/subagent-prompts.d.ts.map +0 -1
  301. package/dist/team/team-tools.d.ts.map +0 -1
  302. package/dist/telemetry/ITelemetryAdapter.d.ts.map +0 -1
  303. package/dist/telemetry/OpenTelemetryAdapter.d.ts.map +0 -1
  304. package/dist/telemetry/OpenTelemetryProvider.d.ts.map +0 -1
  305. package/dist/telemetry/TelemetryLoggerSink.d.ts.map +0 -1
  306. package/dist/telemetry/TelemetryService.d.ts.map +0 -1
  307. package/dist/telemetry/core-events.d.ts.map +0 -1
  308. package/dist/telemetry/distinct-id.d.ts.map +0 -1
  309. package/dist/telemetry/index.d.ts.map +0 -1
  310. package/dist/tools/constants.d.ts.map +0 -1
  311. package/dist/tools/definitions.d.ts.map +0 -1
  312. package/dist/tools/executors/apply-patch-parser.d.ts.map +0 -1
  313. package/dist/tools/executors/apply-patch.d.ts.map +0 -1
  314. package/dist/tools/executors/bash.d.ts.map +0 -1
  315. package/dist/tools/executors/editor.d.ts.map +0 -1
  316. package/dist/tools/executors/file-read.d.ts.map +0 -1
  317. package/dist/tools/executors/index.d.ts.map +0 -1
  318. package/dist/tools/executors/search.d.ts.map +0 -1
  319. package/dist/tools/executors/web-fetch.d.ts.map +0 -1
  320. package/dist/tools/helpers.d.ts.map +0 -1
  321. package/dist/tools/index.d.ts.map +0 -1
  322. package/dist/tools/model-tool-routing.d.ts.map +0 -1
  323. package/dist/tools/presets.d.ts.map +0 -1
  324. package/dist/tools/schemas.d.ts.map +0 -1
  325. package/dist/tools/types.d.ts.map +0 -1
  326. package/src/prompt/default-system.ts +0 -21
  327. package/src/runtime/team-runtime-registry.ts +0 -43
  328. package/src/session/session-config-builder.ts +0 -126
  329. package/src/session/session-host.test.ts +0 -89
  330. package/src/session/session-host.ts +0 -213
  331. package/src/session/session-manager.ts +0 -74
  332. package/src/storage/artifact-store.ts +0 -1
  333. package/src/storage/session-store.ts +0 -1
  334. package/src/team/multi-agent.lifecycle.test.ts +0 -201
  335. package/src/tools/executors/file-read.test.ts +0 -49
  336. /package/dist/{tools → extensions/tools}/constants.d.ts +0 -0
  337. /package/dist/{tools → extensions/tools}/definitions.d.ts +0 -0
  338. /package/dist/{tools → extensions/tools}/executors/apply-patch-parser.d.ts +0 -0
  339. /package/dist/{tools → extensions/tools}/executors/apply-patch.d.ts +0 -0
  340. /package/dist/{tools → extensions/tools}/executors/bash.d.ts +0 -0
  341. /package/dist/{tools → extensions/tools}/executors/editor.d.ts +0 -0
  342. /package/dist/{tools → extensions/tools}/executors/file-read.d.ts +0 -0
  343. /package/dist/{tools → extensions/tools}/executors/index.d.ts +0 -0
  344. /package/dist/{tools → extensions/tools}/executors/search.d.ts +0 -0
  345. /package/dist/{tools → extensions/tools}/executors/web-fetch.d.ts +0 -0
  346. /package/dist/{tools → extensions/tools}/helpers.d.ts +0 -0
  347. /package/dist/{tools → extensions/tools}/index.d.ts +0 -0
  348. /package/dist/{tools → extensions/tools}/schemas.d.ts +0 -0
  349. /package/dist/{team → extensions/tools/team}/delegated-agent.d.ts +0 -0
  350. /package/dist/{team → extensions/tools/team}/index.d.ts +0 -0
  351. /package/dist/{team → extensions/tools/team}/projections.d.ts +0 -0
  352. /package/dist/{team → extensions/tools/team}/runtime.d.ts +0 -0
  353. /package/dist/{team → extensions/tools/team}/subagent-prompts.d.ts +0 -0
  354. /package/dist/{team → extensions/tools/team}/team-tools.d.ts +0 -0
  355. /package/dist/{session → runtime}/rpc-spawn-lease.d.ts +0 -0
  356. /package/dist/{providers → services/providers}/local-provider-registry.d.ts +0 -0
  357. /package/dist/{providers → services/providers}/local-provider-service.d.ts +0 -0
  358. /package/dist/{telemetry → services/telemetry}/ITelemetryAdapter.d.ts +0 -0
  359. /package/dist/{telemetry → services/telemetry}/OpenTelemetryAdapter.d.ts +0 -0
  360. /package/dist/{telemetry → services/telemetry}/OpenTelemetryProvider.d.ts +0 -0
  361. /package/dist/{telemetry → services/telemetry}/TelemetryLoggerSink.d.ts +0 -0
  362. /package/dist/{telemetry → services/telemetry}/TelemetryService.d.ts +0 -0
  363. /package/dist/{telemetry → services/telemetry}/core-events.d.ts +0 -0
  364. /package/dist/{telemetry → services/telemetry}/distinct-id.d.ts +0 -0
  365. /package/dist/{telemetry → services/telemetry}/index.d.ts +0 -0
  366. /package/dist/{input → services/workspace}/file-indexer.d.ts +0 -0
  367. /package/dist/{input → services/workspace}/index.d.ts +0 -0
  368. /package/dist/{input → services/workspace}/mention-enricher.d.ts +0 -0
  369. /package/dist/{session → services}/workspace-manifest.d.ts +0 -0
  370. /package/dist/{chat → types}/chat-schema.d.ts +0 -0
  371. /package/src/{tools → extensions/tools}/constants.ts +0 -0
  372. /package/src/{tools → extensions/tools}/definitions.test.ts +0 -0
  373. /package/src/{tools → extensions/tools}/executors/apply-patch-parser.ts +0 -0
  374. /package/src/{tools → extensions/tools}/executors/apply-patch.ts +0 -0
  375. /package/src/{tools → extensions/tools}/executors/bash.test.ts +0 -0
  376. /package/src/{tools → extensions/tools}/executors/bash.ts +0 -0
  377. /package/src/{tools → extensions/tools}/executors/editor.test.ts +0 -0
  378. /package/src/{tools → extensions/tools}/executors/editor.ts +0 -0
  379. /package/src/{tools → extensions/tools}/executors/index.ts +0 -0
  380. /package/src/{tools → extensions/tools}/executors/web-fetch.ts +0 -0
  381. /package/src/{tools → extensions/tools}/helpers.ts +0 -0
  382. /package/src/{tools → extensions/tools}/index.ts +0 -0
  383. /package/src/{tools → extensions/tools}/model-tool-routing.test.ts +0 -0
  384. /package/src/{tools → extensions/tools}/presets.test.ts +0 -0
  385. /package/src/{tools → extensions/tools}/schemas.ts +0 -0
  386. /package/src/{team → extensions/tools/team}/delegated-agent.ts +0 -0
  387. /package/src/{team → extensions/tools/team}/index.ts +0 -0
  388. /package/src/{team → extensions/tools/team}/projections.ts +0 -0
  389. /package/src/{team → extensions/tools/team}/runtime.ts +0 -0
  390. /package/src/{runtime → hooks}/checkpoint-hooks.test.ts +0 -0
  391. /package/src/{session → runtime}/runtime-oauth-token-manager.test.ts +0 -0
  392. /package/src/{providers → services/providers}/local-provider-registry.ts +0 -0
  393. /package/src/{providers → services/providers}/local-provider-service.test.ts +0 -0
  394. /package/src/{storage → services/storage}/index.ts +0 -0
  395. /package/src/{storage → services/storage}/provider-settings-manager.test.ts +0 -0
  396. /package/src/{telemetry → services/telemetry}/ITelemetryAdapter.ts +0 -0
  397. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.test.ts +0 -0
  398. /package/src/{telemetry → services/telemetry}/OpenTelemetryAdapter.ts +0 -0
  399. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.test.ts +0 -0
  400. /package/src/{telemetry → services/telemetry}/OpenTelemetryProvider.ts +0 -0
  401. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.test.ts +0 -0
  402. /package/src/{telemetry → services/telemetry}/TelemetryLoggerSink.ts +0 -0
  403. /package/src/{telemetry → services/telemetry}/TelemetryService.test.ts +0 -0
  404. /package/src/{telemetry → services/telemetry}/TelemetryService.ts +0 -0
  405. /package/src/{telemetry → services/telemetry}/core-events.ts +0 -0
  406. /package/src/{telemetry → services/telemetry}/distinct-id.test.ts +0 -0
  407. /package/src/{telemetry → services/telemetry}/distinct-id.ts +0 -0
  408. /package/src/{telemetry → services/telemetry}/index.ts +0 -0
  409. /package/src/{input → services/workspace}/file-indexer.d.ts +0 -0
  410. /package/src/{input → services/workspace}/index.ts +0 -0
  411. /package/src/{session → services}/workspace-manifest.ts +0 -0
  412. /package/src/{chat → types}/chat-schema.ts +0 -0
@@ -1,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,10 +197,104 @@ 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$/);
258
+ });
259
+
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-"));
262
+ const sessionsDir = mkdtempSync(join(tmpdir(), "delete-root-session-dir-"));
263
+ tempDirs.push(dbDir, sessionsDir);
264
+
265
+ const store = new SqliteSessionStore({ sessionsDir: dbDir });
266
+ stores.push(store);
267
+ const service = new CoreSessionService(store, {
268
+ sessionArtifactsDir: sessionsDir,
269
+ });
270
+ const sessionId = "root-session-delete";
271
+ const artifacts = await service.createRootSessionWithArtifacts({
272
+ sessionId,
273
+ source: SessionSource.CLI,
274
+ pid: process.pid,
275
+ interactive: false,
276
+ provider: "anthropic",
277
+ model: "claude-sonnet-4-6",
278
+ cwd: "/tmp/project",
279
+ workspaceRoot: "/tmp/project",
280
+ enableTools: true,
281
+ enableSpawn: false,
282
+ enableTeams: false,
283
+ prompt: "delete me",
284
+ startedAt: "2026-04-10T19:00:00.000Z",
285
+ });
286
+
287
+ store.run(`UPDATE sessions SET messages_path = NULL WHERE session_id = ?`, [
288
+ sessionId,
289
+ ]);
290
+
291
+ expect(existsSync(artifacts.messagesPath)).toBe(true);
292
+ expect(existsSync(join(sessionsDir, sessionId))).toBe(true);
293
+
294
+ const result = await service.deleteSession(sessionId);
295
+
296
+ expect(result).toEqual({ deleted: true });
297
+ expect(existsSync(artifacts.messagesPath)).toBe(false);
298
+ expect(existsSync(join(sessionsDir, sessionId))).toBe(false);
202
299
  });
203
300
  });
@@ -1,33 +1,28 @@
1
1
  import {
2
2
  appendFileSync,
3
3
  existsSync,
4
+ mkdirSync,
4
5
  readFileSync,
5
6
  writeFileSync,
6
7
  } from "node:fs";
8
+ import { dirname, join } from "node:path";
7
9
  import type * as LlmsProviders from "@clinebot/llms";
8
10
  import type { AgentResult } from "@clinebot/shared";
9
11
  import { resolveRootSessionId } from "@clinebot/shared";
12
+ import { ensureHookLogDir } from "@clinebot/shared/storage";
10
13
  import { nanoid } from "nanoid";
11
14
  import { z } from "zod";
15
+ import type {
16
+ SubAgentEndContext,
17
+ SubAgentStartContext,
18
+ } from "../extensions/tools/team";
12
19
  import type { HookEventPayload } from "../hooks";
13
- import type { SubAgentEndContext, SubAgentStartContext } from "../team";
14
- import { SessionSource, type SessionStatus } from "../types/common";
15
- import { nowIso, SessionArtifacts, unlinkIfExists } from "./session-artifacts";
20
+ import { deleteCheckpointRefs } from "../hooks/checkpoint-hooks";
16
21
  import {
17
- deriveSubsessionStatus,
18
- makeSubSessionId,
19
- makeTeamTaskSubSessionId,
20
- } from "./session-graph";
21
- import {
22
- type SessionManifest,
23
- SessionManifestSchema,
24
- } from "./session-manifest";
25
- import type {
26
- CreateRootSessionWithArtifactsInput,
27
- RootSessionArtifacts,
28
- SessionRow,
29
- UpsertSubagentInput,
30
- } from "./session-service";
22
+ nowIso,
23
+ SessionArtifacts,
24
+ unlinkIfExists,
25
+ } from "../services/session-artifacts";
31
26
  import {
32
27
  buildManifestFromRow,
33
28
  buildMessagesFilePayload,
@@ -40,12 +35,29 @@ import {
40
35
  withLatestAssistantTurnMetadata,
41
36
  withOccRetry,
42
37
  writeEmptyMessagesFile,
43
- } from "./utils/helpers";
38
+ } from "../services/session-data";
39
+ import { SessionSource, type SessionStatus } from "../types/common";
44
40
  import type {
45
41
  PersistedSessionUpdateInput,
42
+ SessionMessagesArtifactUploader,
46
43
  SessionPersistenceAdapter,
47
44
  StoredMessageWithMetadata,
48
- } 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";
49
61
 
50
62
  export type { PersistedSessionUpdateInput, SessionPersistenceAdapter };
51
63
 
@@ -67,12 +79,19 @@ export class UnifiedSessionPersistenceService {
67
79
  string
68
80
  >();
69
81
  protected readonly artifacts: SessionArtifacts;
82
+ private readonly messagesArtifactUploader?: SessionMessagesArtifactUploader;
70
83
  private static readonly STALE_REASON = "failed_external_process_exit";
71
84
  private static readonly STALE_SOURCE = "stale_session_reconciler";
72
85
  private static readonly TEAM_HEARTBEAT_LOG_INTERVAL_MS = 30_000;
73
86
 
74
- constructor(private readonly adapter: SessionPersistenceAdapter) {
87
+ constructor(
88
+ private readonly adapter: SessionPersistenceAdapter,
89
+ options: {
90
+ messagesArtifactUploader?: SessionMessagesArtifactUploader;
91
+ } = {},
92
+ ) {
75
93
  this.artifacts = new SessionArtifacts(() => this.ensureSessionsDir());
94
+ this.messagesArtifactUploader = options.messagesArtifactUploader;
76
95
  }
77
96
 
78
97
  ensureSessionsDir(): string {
@@ -114,6 +133,7 @@ export class UnifiedSessionPersistenceService {
114
133
  manifestPath: string,
115
134
  manifest: SessionManifest,
116
135
  ): void {
136
+ mkdirSync(dirname(manifestPath), { recursive: true });
117
137
  writeFileSync(
118
138
  manifestPath,
119
139
  `${JSON.stringify(SessionManifestSchema.parse(manifest), null, 2)}\n`,
@@ -151,7 +171,7 @@ export class UnifiedSessionPersistenceService {
151
171
 
152
172
  private async resolveArtifactPath(
153
173
  sessionId: string,
154
- kind: "transcriptPath" | "hookPath" | "messagesPath",
174
+ kind: "messagesPath",
155
175
  fallback: (id: string) => string,
156
176
  ): Promise<string> {
157
177
  const row = await this.adapter.getSession(sessionId);
@@ -186,8 +206,6 @@ export class UnifiedSessionPersistenceService {
186
206
  const providedId = input.sessionId.trim();
187
207
  const sessionId =
188
208
  providedId.length > 0 ? providedId : `${Date.now()}_${nanoid(5)}`;
189
- const transcriptPath = this.artifacts.sessionTranscriptPath(sessionId);
190
- const hookPath = this.artifacts.sessionHookPath(sessionId);
191
209
  const messagesPath = this.artifacts.sessionMessagesPath(sessionId);
192
210
  const manifestPath = this.artifacts.sessionManifestPath(sessionId);
193
211
 
@@ -241,15 +259,14 @@ export class UnifiedSessionPersistenceService {
241
259
  isSubagent: false,
242
260
  prompt: manifest.prompt ?? null,
243
261
  metadata: sanitizeMetadata(manifest.metadata),
244
- transcriptPath,
245
- hookPath,
262
+ hookPath: "",
246
263
  messagesPath,
247
264
  updatedAt: nowIso(),
248
265
  });
249
266
 
250
267
  this.initializeMessagesFile(sessionId, messagesPath, startedAt);
251
268
  this.writeManifestFile(manifestPath, manifest);
252
- return { manifestPath, transcriptPath, hookPath, messagesPath, manifest };
269
+ return { manifestPath, messagesPath, manifest };
253
270
  }
254
271
 
255
272
  // ── Session status updates ────────────────────────────────────────
@@ -262,14 +279,14 @@ export class UnifiedSessionPersistenceService {
262
279
  let endedAt: string | undefined;
263
280
  const result = await withOccRetry(
264
281
  () => this.adapter.getSession(sessionId),
265
- async (statusLock) => {
282
+ async (row) => {
266
283
  endedAt = nowIso();
267
284
  return this.adapter.updateSession({
268
285
  sessionId,
269
286
  status,
270
287
  endedAt,
271
288
  exitCode: typeof exitCode === "number" ? exitCode : null,
272
- expectedStatusLock: statusLock,
289
+ expectedStatusLock: row.statusLock,
273
290
  });
274
291
  },
275
292
  OCC_MAX_RETRIES,
@@ -387,8 +404,6 @@ export class UnifiedSessionPersistenceService {
387
404
  conversationId?: string | null;
388
405
  prompt: string;
389
406
  startedAt: string;
390
- transcriptPath: string;
391
- hookPath: string;
392
407
  messagesPath: string;
393
408
  },
394
409
  ): SessionRow {
@@ -417,8 +432,7 @@ export class UnifiedSessionPersistenceService {
417
432
  isSubagent: true,
418
433
  prompt: opts.prompt,
419
434
  metadata: resolveMetadataWithTitle({ prompt: opts.prompt }),
420
- transcriptPath: opts.transcriptPath,
421
- hookPath: opts.hookPath,
435
+ hookPath: "",
422
436
  messagesPath: opts.messagesPath,
423
437
  updatedAt: opts.startedAt,
424
438
  };
@@ -516,31 +530,16 @@ export class UnifiedSessionPersistenceService {
516
530
  subSessionId: string,
517
531
  event: HookEventPayload,
518
532
  ): Promise<void> {
519
- const path = await this.resolveArtifactPath(
520
- subSessionId,
521
- "hookPath",
522
- (id) => this.artifacts.sessionHookPath(id),
523
- );
533
+ void subSessionId;
534
+ const envPath = process.env.CLINE_HOOKS_LOG_PATH?.trim() || undefined;
535
+ const logPath = envPath ?? join(ensureHookLogDir(), "hooks.jsonl");
524
536
  appendFileSync(
525
- path,
537
+ logPath,
526
538
  `${JSON.stringify({ ts: nowIso(), ...event })}\n`,
527
539
  "utf8",
528
540
  );
529
541
  }
530
542
 
531
- async appendSubagentTranscriptLine(
532
- subSessionId: string,
533
- line: string,
534
- ): Promise<void> {
535
- if (!line.trim()) return;
536
- const path = await this.resolveArtifactPath(
537
- subSessionId,
538
- "transcriptPath",
539
- (id) => this.artifacts.sessionTranscriptPath(id),
540
- );
541
- appendFileSync(path, `${line}\n`, "utf8");
542
- }
543
-
544
543
  async persistSessionMessages(
545
544
  sessionId: string,
546
545
  messages: LlmsProviders.Message[],
@@ -560,7 +559,26 @@ export class UnifiedSessionPersistenceService {
560
559
  messages: normalizedMessages,
561
560
  systemPrompt,
562
561
  });
563
- 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
+ }
564
582
  }
565
583
 
566
584
  // ── Subagent status ───────────────────────────────────────────────
@@ -620,8 +638,10 @@ export class UnifiedSessionPersistenceService {
620
638
 
621
639
  const sessionId = makeTeamTaskSubSessionId(rootSessionId, agentId);
622
640
  const startedAt = nowIso();
623
- const { transcriptPath, hookPath, messagesPath } =
624
- this.artifacts.subagentArtifactPaths(sessionId, agentId);
641
+ const { messagesPath } = this.artifacts.subagentArtifactPaths(
642
+ sessionId,
643
+ agentId,
644
+ );
625
645
 
626
646
  await this.adapter.upsertSession(
627
647
  this.buildSubsessionRow(root, {
@@ -631,13 +651,10 @@ export class UnifiedSessionPersistenceService {
631
651
  agentId,
632
652
  prompt: message || `Team task for ${agentId}`,
633
653
  startedAt,
634
- transcriptPath,
635
- hookPath,
636
654
  messagesPath,
637
655
  }),
638
656
  );
639
657
  this.initializeMessagesFile(sessionId, messagesPath, startedAt);
640
- await this.appendSubagentTranscriptLine(sessionId, `[start] ${message}`);
641
658
 
642
659
  const key = this.teamTaskQueueKey(rootSessionId, agentId);
643
660
  const queue = this.teamTaskSessionsByAgent.get(key) ?? [];
@@ -649,7 +666,7 @@ export class UnifiedSessionPersistenceService {
649
666
  rootSessionId: string,
650
667
  agentId: string,
651
668
  status: SessionStatus,
652
- summary?: string,
669
+ _summary?: string,
653
670
  result?: AgentResult,
654
671
  messages?: LlmsProviders.Message[],
655
672
  ): Promise<void> {
@@ -670,10 +687,6 @@ export class UnifiedSessionPersistenceService {
670
687
  if (persistedMessages) {
671
688
  await this.persistSessionMessages(sessionId, persistedMessages);
672
689
  }
673
- await this.appendSubagentTranscriptLine(
674
- sessionId,
675
- summary ?? `[done] ${status}`,
676
- );
677
690
  await this.applySubagentStatusBySessionId(sessionId, status);
678
691
  this.teamTaskLastHeartbeatBySession.delete(sessionId);
679
692
  this.teamTaskLastProgressLineBySession.delete(sessionId);
@@ -713,7 +726,6 @@ export class UnifiedSessionPersistenceService {
713
726
  : `[progress] ${trimmed}`;
714
727
  if (this.teamTaskLastProgressLineBySession.get(sessionId) === line) return;
715
728
  this.teamTaskLastProgressLineBySession.set(sessionId, line);
716
- await this.appendSubagentTranscriptLine(sessionId, line);
717
729
  }
718
730
 
719
731
  // ── SubAgent lifecycle ────────────────────────────────────────────
@@ -730,10 +742,6 @@ export class UnifiedSessionPersistenceService {
730
742
  rootSessionId,
731
743
  });
732
744
  if (!subSessionId) return;
733
- await this.appendSubagentTranscriptLine(
734
- subSessionId,
735
- `[start] ${context.input.task}`,
736
- );
737
745
  await this.applySubagentStatusBySessionId(subSessionId, "running");
738
746
  }
739
747
 
@@ -751,15 +759,10 @@ export class UnifiedSessionPersistenceService {
751
759
  if (!subSessionId) return;
752
760
 
753
761
  if (context.error) {
754
- await this.appendSubagentTranscriptLine(
755
- subSessionId,
756
- `[error] ${context.error.message}`,
757
- );
758
762
  await this.applySubagentStatusBySessionId(subSessionId, "failed");
759
763
  return;
760
764
  }
761
765
  const reason = context.result?.finishReason ?? "completed";
762
- await this.appendSubagentTranscriptLine(subSessionId, `[done] ${reason}`);
763
766
  await this.applySubagentStatusBySessionId(
764
767
  subSessionId,
765
768
  reason === "aborted" ? "cancelled" : "completed",
@@ -825,24 +828,22 @@ export class UnifiedSessionPersistenceService {
825
828
  const { path: manifestPath } = this.readManifestFile(latest.sessionId);
826
829
  this.writeManifestFile(manifestPath, manifest);
827
830
 
828
- appendFileSync(
829
- latest.hookPath,
830
- `${JSON.stringify({
831
- ts: detectedAt,
832
- hookName: "session_shutdown",
833
- reason,
834
- sessionId: latest.sessionId,
835
- pid: latest.pid,
836
- source: UnifiedSessionPersistenceService.STALE_SOURCE,
837
- })}\n`,
838
- "utf8",
839
- );
840
- appendFileSync(
841
- latest.transcriptPath,
842
- `[shutdown] ${reason} (pid=${latest.pid})\n`,
843
- "utf8",
844
- );
845
-
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
+ }
846
847
  return {
847
848
  ...latest,
848
849
  status: "failed",
@@ -907,22 +908,37 @@ export class UnifiedSessionPersistenceService {
907
908
  parentSessionId: id,
908
909
  });
909
910
  await this.adapter.deleteSession(id, true);
910
- for (const child of children) {
911
- unlinkIfExists(child.transcriptPath);
912
- unlinkIfExists(child.hookPath);
913
- unlinkIfExists(child.messagesPath);
914
- unlinkIfExists(
915
- this.artifacts.sessionManifestPath(child.sessionId, false),
916
- );
917
- this.artifacts.removeSessionDirIfEmpty(child.sessionId);
918
- }
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
+ );
919
921
  }
920
922
 
921
- unlinkIfExists(row.transcriptPath);
922
- unlinkIfExists(row.hookPath);
923
+ await deleteCheckpointRefs(row.cwd, id);
924
+
923
925
  unlinkIfExists(row.messagesPath);
924
926
  unlinkIfExists(this.artifacts.sessionManifestPath(id, false));
925
- this.artifacts.removeSessionDirIfEmpty(id);
927
+ if (row.isSubagent) {
928
+ this.artifacts.removeSessionDirIfEmpty(id);
929
+ } else {
930
+ const candidateDirs = new Set<string>([
931
+ this.artifacts.sessionArtifactsDir(id),
932
+ ]);
933
+ for (const path of [row.messagesPath]) {
934
+ if (typeof path === "string" && path.trim().length > 0) {
935
+ candidateDirs.add(dirname(path));
936
+ }
937
+ }
938
+ for (const dir of candidateDirs) {
939
+ this.artifacts.removeDir(dir);
940
+ }
941
+ }
926
942
  return { deleted: true };
927
943
  }
928
944
  }
@@ -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", () => {