@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,17 +1,21 @@
1
- import { writeFileSync } from "node:fs";
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
2
3
  import type * as LlmsProviders from "@clinebot/llms";
3
4
  import type { AgentConfig, AgentEvent, AgentResult } from "@clinebot/shared";
4
5
  import { normalizeUserInput } from "@clinebot/shared";
5
6
  import { nanoid } from "nanoid";
6
- import type { SessionSource, SessionStatus } from "../../types/common";
7
- import type { SessionRecord } from "../../types/sessions";
8
- import { parseSubSessionId, parseTeamTaskSubSessionId } from "../session-graph";
7
+ import {
8
+ parseSubSessionId,
9
+ parseTeamTaskSubSessionId,
10
+ } from "../session/session-graph";
9
11
  import {
10
12
  type SessionManifest,
11
13
  SessionManifestSchema,
12
- } from "../session-manifest";
13
- import type { SessionRow } from "../session-service";
14
- import type { StoredMessageWithMetadata } from "./types";
14
+ } from "../session/session-manifest";
15
+ import type { SessionRow } from "../session/session-service";
16
+ import type { SessionSource, SessionStatus } from "../types/common";
17
+ import type { StoredMessageWithMetadata } from "../types/session";
18
+ import type { SessionRecord } from "../types/sessions";
15
19
 
16
20
  export function hasRuntimeHooks(hooks: AgentConfig["hooks"]): boolean {
17
21
  if (!hooks) {
@@ -197,15 +201,11 @@ export function toSessionRecord(row: SessionRow): SessionRecord {
197
201
  isSubagent: row.isSubagent,
198
202
  prompt: row.prompt ?? undefined,
199
203
  metadata: row.metadata ?? undefined,
200
- transcriptPath: row.transcriptPath,
201
- hookPath: row.hookPath,
202
204
  messagesPath: row.messagesPath ?? undefined,
203
205
  updatedAt: row.updatedAt,
204
206
  };
205
207
  }
206
208
 
207
- // ── Metadata helpers ──────────────────────────────────────────────────
208
-
209
209
  const MAX_TITLE_LENGTH = 120;
210
210
 
211
211
  export function normalizeTitle(title?: string | null): string | undefined {
@@ -251,38 +251,59 @@ export function resolveMetadataWithTitle(input: {
251
251
  return Object.keys(base).length > 0 ? base : undefined;
252
252
  }
253
253
 
254
- // ── Messages file helpers ─────────────────────────────────────────────
255
-
256
254
  export type MessagesFileContext = {
257
255
  agent: "lead" | "subagent" | "teammate";
258
256
  sessionId: string;
259
257
  taskType?: string;
260
258
  };
261
259
 
262
- export type MessagesFilePayload = {
263
- version: number;
264
- updated_at: string;
265
- agent: "lead" | "subagent" | "teammate";
266
- sessionId: string;
267
- taskType?: string;
268
- systemPrompt?: string;
269
- messages: LlmsProviders.Message[];
270
- };
260
+ export function resolveMessagesFileContext(
261
+ sessionId: string,
262
+ ): MessagesFileContext {
263
+ const teamTaskMatch = parseTeamTaskSubSessionId(sessionId);
264
+ if (teamTaskMatch) {
265
+ return {
266
+ agent: "teammate",
267
+ sessionId: teamTaskMatch.rootSessionId,
268
+ taskType: "team",
269
+ };
270
+ }
271
+ const subSessionMatch = parseSubSessionId(sessionId);
272
+ if (subSessionMatch) {
273
+ return {
274
+ agent: "subagent",
275
+ sessionId: subSessionMatch.rootSessionId,
276
+ taskType: "subagent_task",
277
+ };
278
+ }
279
+ return {
280
+ agent: "lead",
281
+ sessionId,
282
+ };
283
+ }
271
284
 
272
285
  export function buildMessagesFilePayload(input: {
273
286
  updatedAt: string;
274
287
  context: MessagesFileContext;
275
- messages: LlmsProviders.Message[];
288
+ messages: LlmsProviders.MessageWithMetadata[];
276
289
  systemPrompt?: string;
277
- }): MessagesFilePayload {
290
+ }): {
291
+ version: 1;
292
+ updated_at: string;
293
+ agent: "lead" | "subagent" | "teammate";
294
+ sessionId: string;
295
+ taskType?: string;
296
+ messages: StoredMessageWithMetadata[];
297
+ system_prompt?: string;
298
+ } {
278
299
  return {
279
300
  version: 1,
280
301
  updated_at: input.updatedAt,
281
302
  agent: input.context.agent,
282
303
  sessionId: input.context.sessionId,
283
304
  ...(input.context.taskType ? { taskType: input.context.taskType } : {}),
284
- ...(input.systemPrompt ? { systemPrompt: input.systemPrompt } : {}),
285
- messages: input.messages,
305
+ messages: normalizeStoredMessagesForPersistence(input.messages),
306
+ ...(input.systemPrompt ? { system_prompt: input.systemPrompt } : {}),
286
307
  };
287
308
  }
288
309
 
@@ -291,6 +312,7 @@ export function writeEmptyMessagesFile(
291
312
  startedAt: string,
292
313
  context: MessagesFileContext,
293
314
  ): void {
315
+ mkdirSync(dirname(path), { recursive: true });
294
316
  writeFileSync(
295
317
  path,
296
318
  `${JSON.stringify(
@@ -306,40 +328,12 @@ export function writeEmptyMessagesFile(
306
328
  );
307
329
  }
308
330
 
309
- export function resolveMessagesFileContext(
310
- sessionId: string,
311
- ): MessagesFileContext {
312
- const teamTask = parseTeamTaskSubSessionId(sessionId);
313
- if (teamTask) {
314
- return {
315
- agent: "teammate",
316
- sessionId: teamTask.rootSessionId,
317
- taskType: "team",
318
- };
319
- }
320
-
321
- const subagent = parseSubSessionId(sessionId);
322
- if (subagent) {
323
- return {
324
- agent: "subagent",
325
- sessionId: subagent.rootSessionId,
326
- };
327
- }
328
-
329
- return {
330
- agent: "lead",
331
- sessionId,
332
- };
333
- }
334
-
335
- // ── Manifest helper ───────────────────────────────────────────────────
336
-
337
331
  export function buildManifestFromRow(
338
332
  row: SessionRow,
339
333
  overrides?: {
340
334
  status?: SessionStatus;
341
- endedAt?: string | null;
342
- exitCode?: number | null;
335
+ endedAt?: string;
336
+ exitCode?: number;
343
337
  metadata?: Record<string, unknown>;
344
338
  },
345
339
  ): SessionManifest {
@@ -351,7 +345,7 @@ export function buildManifestFromRow(
351
345
  started_at: row.startedAt,
352
346
  ended_at: overrides?.endedAt ?? row.endedAt ?? undefined,
353
347
  exit_code: overrides?.exitCode ?? row.exitCode ?? undefined,
354
- status: overrides?.status ?? row.status,
348
+ status: (overrides?.status ?? row.status) as SessionStatus,
355
349
  interactive: row.interactive,
356
350
  provider: row.provider,
357
351
  model: row.model,
@@ -367,20 +361,30 @@ export function buildManifestFromRow(
367
361
  });
368
362
  }
369
363
 
370
- // ── OCC retry helper ──────────────────────────────────────────────────
371
-
372
- export const OCC_MAX_RETRIES = 4;
373
-
374
- export async function withOccRetry<T>(
375
- getRow: () => Promise<{ statusLock: number } | undefined>,
376
- action: (statusLock: number) => Promise<{ updated: boolean } & T>,
377
- maxRetries = OCC_MAX_RETRIES,
378
- ): Promise<({ updated: true } & T) | { updated: false }> {
379
- for (let attempt = 0; attempt < maxRetries; attempt++) {
380
- const row = getRow ? await getRow() : undefined;
381
- if (!row) return { updated: false } as { updated: false };
382
- const result = await action(row.statusLock);
383
- if (result.updated) return result as { updated: true } & T;
364
+ export async function withOccRetry<TFetch, TResult>(
365
+ load: () => Promise<TFetch | undefined>,
366
+ update: (loaded: TFetch) => Promise<TResult>,
367
+ maxRetries: number,
368
+ ): Promise<TResult | { updated: false }> {
369
+ let attempt = 0;
370
+ while (true) {
371
+ const loaded = await load();
372
+ if (loaded === undefined) {
373
+ return { updated: false };
374
+ }
375
+ const result = await update(loaded);
376
+ if (
377
+ typeof result === "object" &&
378
+ result !== null &&
379
+ "updated" in result &&
380
+ (result as { updated?: boolean }).updated === false
381
+ ) {
382
+ attempt += 1;
383
+ if (attempt >= maxRetries) {
384
+ return result as TResult;
385
+ }
386
+ continue;
387
+ }
388
+ return result;
384
389
  }
385
- return { updated: false } as { updated: false };
386
390
  }
@@ -1,9 +1,8 @@
1
1
  import type { ITelemetryService } from "@clinebot/shared";
2
- import {
3
- listHookConfigFiles,
4
- resolveDocumentsHooksDirectoryPath,
5
- } from "../extensions/config/hooks-config-loader";
6
- import type { enrichPromptWithMentions } from "../input";
2
+ import { resolveDocumentsExtensionPath } from "@clinebot/shared/storage";
3
+ import { listHookConfigFiles } from "../extensions/config/hooks-config-loader";
4
+ import type { SessionSource } from "../types/common";
5
+ import type { CoreSessionConfig } from "../types/config";
7
6
  import {
8
7
  captureHookDiscovery,
9
8
  captureMentionFailed,
@@ -12,9 +11,8 @@ import {
12
11
  captureTaskCreated,
13
12
  captureTaskRestarted,
14
13
  type TelemetryAgentIdentityProperties,
15
- } from "../telemetry/core-events";
16
- import type { SessionSource } from "../types/common";
17
- import type { CoreSessionConfig } from "../types/config";
14
+ } from "./telemetry/core-events";
15
+ import type { enrichPromptWithMentions } from "./workspace";
18
16
 
19
17
  export function emitSessionCreationTelemetry(
20
18
  config: CoreSessionConfig,
@@ -57,7 +55,7 @@ export function captureHookDiscoveryTelemetry(
57
55
  telemetry: ITelemetryService | undefined,
58
56
  options: { workspacePath: string },
59
57
  ): void {
60
- const globalHooksDir = resolveDocumentsHooksDirectoryPath();
58
+ const globalHooksDir = resolveDocumentsExtensionPath("Hooks");
61
59
  const entries = listHookConfigFiles(options.workspacePath);
62
60
  const counts = new Map<string, { global: number; workspace: number }>();
63
61
  for (const entry of entries) {
@@ -0,0 +1 @@
1
+ export type { ArtifactStore } from "../../types/storage";
@@ -10,8 +10,8 @@ import {
10
10
  import { join } from "node:path";
11
11
  import type { TeamRuntimeState, TeamTeammateSpec } from "@clinebot/shared";
12
12
  import { resolveTeamDataDir } from "@clinebot/shared/storage";
13
- import type { TeamEvent } from "../team";
14
- import type { TeamStore } from "../types/storage";
13
+ import type { TeamEvent } from "../../extensions/tools/team";
14
+ import type { TeamStore } from "../../types/storage";
15
15
 
16
16
  function nowIso(): string {
17
17
  return new Date().toISOString();
@@ -111,7 +111,7 @@ describe("migrateLegacyProviderSettings", () => {
111
111
  );
112
112
  expect(manager.getProviderSettings("anthropic")).toEqual({
113
113
  provider: "anthropic",
114
- model: "claude-sonnet-4-6",
114
+ model: "claude-opus-4-7",
115
115
  apiKey: "legacy-key",
116
116
  });
117
117
  expect(manager.read().providers.openai?.tokenSource).toBe("manual");
@@ -3,8 +3,8 @@ import { dirname, join } from "node:path";
3
3
  import * as LlmsModels from "@clinebot/llms";
4
4
  import * as LlmsProviders from "@clinebot/llms";
5
5
  import { resolveClineDataDir } from "@clinebot/shared/storage";
6
- import type { ProviderSettings } from "../types/provider-settings";
7
- import { emptyStoredProviderSettings } from "../types/provider-settings";
6
+ import type { ProviderSettings } from "../../types/provider-settings";
7
+ import { emptyStoredProviderSettings } from "../../types/provider-settings";
8
8
  import type { ProviderSettingsManager } from "./provider-settings-manager";
9
9
 
10
10
  type LegacyMode = "plan" | "act";
@@ -1,7 +1,6 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { basename, dirname } from "node:path";
3
3
  import { resolveProviderSettingsPath } from "@clinebot/shared/storage";
4
- import { ensureCustomProvidersLoadedSync } from "../providers/local-provider-registry";
5
4
  import {
6
5
  emptyStoredProviderSettings,
7
6
  type ProviderConfig,
@@ -11,7 +10,8 @@ import {
11
10
  type StoredProviderSettings,
12
11
  StoredProviderSettingsSchema,
13
12
  toProviderConfig,
14
- } from "../types/provider-settings";
13
+ } from "../../types/provider-settings";
14
+ import { ensureCustomProvidersLoadedSync } from "../providers/local-provider-registry";
15
15
  import { migrateLegacyProviderSettings } from "./provider-settings-legacy-migration";
16
16
 
17
17
  function nowIso(): string {
@@ -0,0 +1 @@
1
+ export type { SessionStore } from "../../types/storage";
@@ -10,14 +10,10 @@ import {
10
10
  type SqliteDb,
11
11
  toBoolInt,
12
12
  } from "@clinebot/shared/db";
13
- import { resolveSessionDataDir } from "@clinebot/shared/storage";
14
- import type { SessionStatus } from "../types/common";
15
- import type { SessionRecord } from "../types/sessions";
16
- import type { SessionStore } from "../types/storage";
17
-
18
- function defaultSessionsDir(): string {
19
- return resolveSessionDataDir();
20
- }
13
+ import { resolveDbDataDir } from "@clinebot/shared/storage";
14
+ import type { SessionStatus } from "../../types/common";
15
+ import type { SessionRecord } from "../../types/sessions";
16
+ import type { SessionStore } from "../../types/storage";
21
17
 
22
18
  export interface SqliteSessionStoreOptions {
23
19
  sessionsDir?: string;
@@ -28,7 +24,7 @@ export class SqliteSessionStore implements SessionStore {
28
24
  private db: SqliteDb | undefined;
29
25
 
30
26
  constructor(options: SqliteSessionStoreOptions = {}) {
31
- this.sessionsDirPath = options.sessionsDir ?? defaultSessionsDir();
27
+ this.sessionsDirPath = options.sessionsDir ?? resolveDbDataDir();
32
28
  }
33
29
 
34
30
  init(): void {
@@ -115,7 +111,7 @@ export class SqliteSessionStore implements SessionStore {
115
111
  toBoolInt(record.isSubagent),
116
112
  record.prompt ?? null,
117
113
  record.metadata ? JSON.stringify(record.metadata) : null,
118
- record.transcriptPath ?? "",
114
+ "",
119
115
  record.hookPath ?? "",
120
116
  record.messagesPath ?? null,
121
117
  now,
@@ -196,7 +192,7 @@ export class SqliteSessionStore implements SessionStore {
196
192
  provider, model, cwd, workspace_root, team_name,
197
193
  enable_tools, enable_spawn, enable_teams,
198
194
  parent_session_id, parent_agent_id, agent_id, conversation_id, is_subagent,
199
- prompt, metadata_json, transcript_path, hook_path, messages_path, updated_at
195
+ prompt, metadata_json, hook_path, messages_path, updated_at
200
196
  FROM sessions WHERE session_id = ?`,
201
197
  [sessionId],
202
198
  );
@@ -241,7 +237,6 @@ export class SqliteSessionStore implements SessionStore {
241
237
  }
242
238
  return undefined;
243
239
  })(),
244
- transcriptPath: asOptionalString(row.transcript_path),
245
240
  hookPath: asOptionalString(row.hook_path),
246
241
  messagesPath: asOptionalString(row.messages_path),
247
242
  updatedAt: asOptionalString(row.updated_at) ?? nowIso(),
@@ -6,12 +6,12 @@ import {
6
6
  type TeamTeammateSpec,
7
7
  } from "@clinebot/shared";
8
8
  import { loadSqliteDb, nowIso, type SqliteDb } from "@clinebot/shared/db";
9
- import { resolveTeamDataDir } from "@clinebot/shared/storage";
10
- import type { TeamEvent } from "../team";
11
- import type { TeamStore } from "../types/storage";
9
+ import { resolveDbDataDir } from "@clinebot/shared/storage";
10
+ import type { TeamEvent } from "../../extensions/tools/team";
11
+ import type { TeamStore } from "../../types/storage";
12
12
 
13
13
  function defaultTeamDir(): string {
14
- return resolveTeamDataDir();
14
+ return resolveDbDataDir();
15
15
  }
16
16
 
17
17
  function sanitizeTeamName(name: string): string {
@@ -1,4 +1,4 @@
1
- export type { TeamStore } from "../types/storage";
1
+ export type { TeamStore } from "../../types/storage";
2
2
  export {
3
3
  FileTeamStore,
4
4
  type FileTeamStoreOptions,
@@ -1,4 +1,4 @@
1
- import type { SessionAccumulatedUsage } from "../session-manager";
1
+ import type { SessionAccumulatedUsage } from "../runtime/runtime-host";
2
2
 
3
3
  export function createInitialAccumulatedUsage(): SessionAccumulatedUsage {
4
4
  return {
@@ -1,4 +1,4 @@
1
- import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
1
+ import { chmod, mkdir, mkdtemp, rm, writeFile } from "node:fs/promises";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { describe, expect, it, vi } from "vitest";
@@ -85,6 +85,35 @@ describe("file indexer", () => {
85
85
  }
86
86
  });
87
87
 
88
+ it("skips unreadable directories during fallback indexing", async () => {
89
+ const cwd = await createTempWorkspace();
90
+ const unreadableDir = path.join(cwd, "private");
91
+ try {
92
+ await mkdir(unreadableDir, { recursive: true });
93
+ await writeFile(
94
+ path.join(cwd, "visible.ts"),
95
+ "export const ok = 1\n",
96
+ "utf8",
97
+ );
98
+ await writeFile(
99
+ path.join(unreadableDir, "hidden.ts"),
100
+ "export const hidden = 1\n",
101
+ "utf8",
102
+ );
103
+ await chmod(unreadableDir, 0o000);
104
+
105
+ await expect(
106
+ prewarmFileIndex(cwd, { ttlMs: 0 }),
107
+ ).resolves.toBeUndefined();
108
+
109
+ const index = await getFileIndex(cwd, { ttlMs: 0 });
110
+ expect(index.has("visible.ts")).toBe(true);
111
+ } finally {
112
+ await chmod(unreadableDir, 0o755).catch(() => undefined);
113
+ await rm(cwd, { recursive: true, force: true });
114
+ }
115
+ });
116
+
88
117
  it("evicts stale workspace indexes after 10 minutes when multiple workspaces exist", async () => {
89
118
  vi.useFakeTimers();
90
119
  const firstWorkspace = await createTempWorkspace();
@@ -1,4 +1,5 @@
1
1
  import { spawn } from "node:child_process";
2
+ import type { Dirent } from "node:fs";
2
3
  import { readdir } from "node:fs/promises";
3
4
  import path from "node:path";
4
5
  import { isMainThread, parentPort, Worker } from "node:worker_threads";
@@ -19,6 +20,14 @@ const DEFAULT_EXCLUDE_DIRS = new Set([
19
20
  "out",
20
21
  ]);
21
22
 
23
+ function shouldSkipWalkError(error: unknown): boolean {
24
+ const code =
25
+ error && typeof error === "object" && "code" in error
26
+ ? String((error as { code?: unknown }).code ?? "")
27
+ : "";
28
+ return code === "EACCES" || code === "EPERM" || code === "ENOENT";
29
+ }
30
+
22
31
  interface CacheEntry {
23
32
  files: Set<string>;
24
33
  lastBuiltAt: number;
@@ -103,14 +112,29 @@ async function walkDir(
103
112
  dir: string,
104
113
  files: Set<string>,
105
114
  ): Promise<void> {
106
- const entries = await readdir(dir, { withFileTypes: true });
115
+ let entries: Dirent[];
116
+ try {
117
+ entries = await readdir(dir, { withFileTypes: true });
118
+ } catch (error) {
119
+ if (shouldSkipWalkError(error)) {
120
+ return;
121
+ }
122
+ throw error;
123
+ }
107
124
  for (const entry of entries) {
108
125
  const absolutePath = path.join(dir, entry.name);
109
126
  if (entry.isDirectory()) {
110
127
  if (DEFAULT_EXCLUDE_DIRS.has(entry.name)) {
111
128
  continue;
112
129
  }
113
- await walkDir(cwd, absolutePath, files);
130
+ try {
131
+ await walkDir(cwd, absolutePath, files);
132
+ } catch (error) {
133
+ if (shouldSkipWalkError(error)) {
134
+ continue;
135
+ }
136
+ throw error;
137
+ }
114
138
  continue;
115
139
  }
116
140
  if (entry.isFile()) {
@@ -82,4 +82,25 @@ describe("enrichPromptWithMentions", () => {
82
82
  await rm(cwd, { recursive: true, force: true });
83
83
  }
84
84
  });
85
+
86
+ it("does not over-count totalBytes across multiple mentions", async () => {
87
+ const cwd = await createTempWorkspace();
88
+ try {
89
+ await writeFile(path.join(cwd, "a.ts"), "aaa", "utf8");
90
+ await writeFile(path.join(cwd, "b.ts"), "bbb", "utf8");
91
+ await writeFile(path.join(cwd, "c.ts"), "ccc", "utf8");
92
+
93
+ const result = await enrichPromptWithMentions(
94
+ "Use @a.ts @b.ts @c.ts",
95
+ cwd,
96
+ { maxTotalBytes: 15, maxFiles: 5, maxFileBytes: 5 },
97
+ );
98
+
99
+ expect(result.mentions).toEqual(["a.ts", "b.ts", "c.ts"]);
100
+ expect(result.matchedFiles).toEqual(["a.ts", "b.ts", "c.ts"]);
101
+ expect(result.ignoredMentions).toEqual([]);
102
+ } finally {
103
+ await rm(cwd, { recursive: true, force: true });
104
+ }
105
+ });
85
106
  });
@@ -106,7 +106,7 @@ export async function enrichPromptWithMentions(
106
106
  continue;
107
107
  }
108
108
 
109
- totalBytes += nextBytes;
109
+ totalBytes = nextBytes;
110
110
  matched.push(relativePath);
111
111
  } catch {
112
112
  ignored.push(mention);
@@ -7,6 +7,7 @@ import {
7
7
  } from "node:fs";
8
8
  import { join } from "node:path";
9
9
  import { resolveSessionDataDir } from "@clinebot/shared/storage";
10
+ import type { SessionMessagesArtifactUploader } from "../types/session";
10
11
  import type {
11
12
  PersistedSessionUpdateInput,
12
13
  SessionPersistenceAdapter,
@@ -45,13 +46,9 @@ function atomicWriteJson(path: string, value: unknown): void {
45
46
  renameSync(tempPath, path);
46
47
  }
47
48
 
48
- function defaultSessionsDir(): string {
49
- return resolveSessionDataDir();
50
- }
51
-
52
49
  class FileSessionPersistenceAdapter implements SessionPersistenceAdapter {
53
50
  constructor(
54
- private readonly sessionsDirPath: string = defaultSessionsDir(),
51
+ private readonly sessionsDirPath: string = resolveSessionDataDir(),
55
52
  ) {}
56
53
 
57
54
  ensureSessionsDir(): string {
@@ -270,8 +267,13 @@ class FileSessionPersistenceAdapter implements SessionPersistenceAdapter {
270
267
  }
271
268
 
272
269
  export class FileSessionService extends UnifiedSessionPersistenceService {
273
- constructor(sessionsDir?: string) {
274
- super(new FileSessionPersistenceAdapter(sessionsDir));
270
+ constructor(
271
+ sessionsDir?: string,
272
+ options: {
273
+ messagesArtifactUploader?: SessionMessagesArtifactUploader;
274
+ } = {},
275
+ ) {
276
+ super(new FileSessionPersistenceAdapter(sessionsDir), options);
275
277
  }
276
278
 
277
279
  override ensureSessionsDir(): string {
@@ -7,8 +7,32 @@ export {
7
7
  export type {
8
8
  ClineCore,
9
9
  ClineCoreOptions,
10
+ ClineCoreStartInput,
10
11
  } from "../ClineCore";
11
- export { DefaultSessionManager } from "./default-session-manager";
12
+ export type { SessionBackend } from "../runtime/host";
13
+ export {
14
+ createRuntimeHost,
15
+ resolveSessionBackend,
16
+ } from "../runtime/host";
17
+ export type {
18
+ LocalRuntimeConfigOverrides,
19
+ LocalRuntimeStartOptions,
20
+ RuntimeHost,
21
+ RuntimeHost as SessionHost,
22
+ RuntimeHostMode,
23
+ RuntimeSessionConfig,
24
+ SendSessionInput,
25
+ SessionAccumulatedUsage,
26
+ StartSessionInput,
27
+ StartSessionResult,
28
+ } from "../runtime/runtime-host";
29
+ export { splitCoreSessionConfig } from "../runtime/runtime-host";
30
+ export {
31
+ generateWorkspaceInfo,
32
+ normalizeWorkspacePath,
33
+ } from "../services/workspace-manifest";
34
+ export { LocalRuntimeHost } from "../transports/local";
35
+ export { RpcRuntimeHost } from "../transports/rpc";
12
36
  export { RpcCoreSessionService } from "./rpc-session-service";
13
37
  export {
14
38
  deriveSubsessionStatus,
@@ -16,18 +40,6 @@ export {
16
40
  makeTeamTaskSubSessionId,
17
41
  sanitizeSessionToken,
18
42
  } from "./session-graph";
19
- export type {
20
- SessionBackend,
21
- SessionHost,
22
- } from "./session-host";
23
- export { createSessionHost, resolveSessionBackend } from "./session-host";
24
- export type {
25
- SendSessionInput,
26
- SessionAccumulatedUsage,
27
- SessionManager,
28
- StartSessionInput,
29
- StartSessionResult,
30
- } from "./session-manager";
31
43
  export type { SessionManifest } from "./session-manifest";
32
44
  export type {
33
45
  CreateRootSessionWithArtifactsInput,
@@ -39,7 +51,3 @@ export type {
39
51
  WorkspaceManagerEvent,
40
52
  } from "./workspace-manager";
41
53
  export { InMemoryWorkspaceManager } from "./workspace-manager";
42
- export {
43
- generateWorkspaceInfo,
44
- normalizeWorkspacePath,
45
- } from "./workspace-manifest";