@clinebot/core 0.0.35 → 0.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/README.md +1 -2
  2. package/dist/ClineCore.d.ts +362 -39
  3. package/dist/ClineCore.d.ts.map +1 -1
  4. package/dist/account/cline-account-service.d.ts.map +1 -1
  5. package/dist/account/index.d.ts +1 -1
  6. package/dist/account/index.d.ts.map +1 -1
  7. package/dist/account/rpc.d.ts +6 -6
  8. package/dist/account/rpc.d.ts.map +1 -1
  9. package/dist/cron/cron-event-ingress.d.ts +38 -0
  10. package/dist/cron/cron-event-ingress.d.ts.map +1 -0
  11. package/dist/cron/cron-materializer.d.ts +36 -0
  12. package/dist/cron/cron-materializer.d.ts.map +1 -0
  13. package/dist/cron/cron-reconciler.d.ts +62 -0
  14. package/dist/cron/cron-reconciler.d.ts.map +1 -0
  15. package/dist/cron/cron-report-writer.d.ts +41 -0
  16. package/dist/cron/cron-report-writer.d.ts.map +1 -0
  17. package/dist/cron/cron-runner.d.ts +43 -0
  18. package/dist/cron/cron-runner.d.ts.map +1 -0
  19. package/dist/cron/cron-schema.d.ts +3 -0
  20. package/dist/cron/cron-schema.d.ts.map +1 -0
  21. package/dist/cron/cron-service.d.ts +57 -0
  22. package/dist/cron/cron-service.d.ts.map +1 -0
  23. package/dist/cron/cron-spec-parser.d.ts +27 -0
  24. package/dist/cron/cron-spec-parser.d.ts.map +1 -0
  25. package/dist/cron/cron-watcher.d.ts +23 -0
  26. package/dist/cron/cron-watcher.d.ts.map +1 -0
  27. package/dist/cron/resource-limiter.d.ts +9 -0
  28. package/dist/cron/resource-limiter.d.ts.map +1 -0
  29. package/dist/cron/schedule-command-service.d.ts +10 -0
  30. package/dist/cron/schedule-command-service.d.ts.map +1 -0
  31. package/dist/cron/schedule-service.d.ts +100 -0
  32. package/dist/cron/schedule-service.d.ts.map +1 -0
  33. package/dist/cron/scheduler.d.ts +68 -0
  34. package/dist/cron/scheduler.d.ts.map +1 -0
  35. package/dist/cron/sqlite-cron-store.d.ts +230 -0
  36. package/dist/cron/sqlite-cron-store.d.ts.map +1 -0
  37. package/dist/cron/sqlite-schedule-store.d.ts +52 -0
  38. package/dist/cron/sqlite-schedule-store.d.ts.map +1 -0
  39. package/dist/extensions/config/agent-config-loader.d.ts +4 -3
  40. package/dist/extensions/config/agent-config-loader.d.ts.map +1 -1
  41. package/dist/extensions/config/runtime-commands.d.ts +1 -0
  42. package/dist/extensions/config/runtime-commands.d.ts.map +1 -1
  43. package/dist/extensions/config/user-instruction-config-loader.d.ts +1 -0
  44. package/dist/extensions/config/user-instruction-config-loader.d.ts.map +1 -1
  45. package/dist/extensions/context/agentic-compaction.d.ts +2 -2
  46. package/dist/extensions/context/agentic-compaction.d.ts.map +1 -1
  47. package/dist/extensions/context/compaction-shared.d.ts +5 -4
  48. package/dist/extensions/context/compaction-shared.d.ts.map +1 -1
  49. package/dist/extensions/context/compaction.d.ts.map +1 -1
  50. package/dist/extensions/plugin/plugin-config-loader.d.ts +15 -2
  51. package/dist/extensions/plugin/plugin-config-loader.d.ts.map +1 -1
  52. package/dist/extensions/plugin/plugin-loader.d.ts +13 -7
  53. package/dist/extensions/plugin/plugin-loader.d.ts.map +1 -1
  54. package/dist/extensions/plugin/plugin-module-import.d.ts.map +1 -1
  55. package/dist/extensions/plugin/plugin-sandbox.d.ts +21 -2
  56. package/dist/extensions/plugin/plugin-sandbox.d.ts.map +1 -1
  57. package/dist/extensions/plugin/plugin-targeting.d.ts +7 -0
  58. package/dist/extensions/plugin/plugin-targeting.d.ts.map +1 -0
  59. package/dist/extensions/plugin-sandbox-bootstrap.js +237 -276
  60. package/dist/extensions/tools/constants.d.ts +1 -0
  61. package/dist/extensions/tools/constants.d.ts.map +1 -1
  62. package/dist/extensions/tools/definitions.d.ts +3 -4
  63. package/dist/extensions/tools/definitions.d.ts.map +1 -1
  64. package/dist/extensions/tools/executors/apply-patch.d.ts +3 -1
  65. package/dist/extensions/tools/executors/apply-patch.d.ts.map +1 -1
  66. package/dist/extensions/tools/executors/editor.d.ts.map +1 -1
  67. package/dist/extensions/tools/executors/search.d.ts +1 -1
  68. package/dist/extensions/tools/executors/search.d.ts.map +1 -1
  69. package/dist/extensions/tools/helpers.d.ts +1 -0
  70. package/dist/extensions/tools/helpers.d.ts.map +1 -1
  71. package/dist/extensions/tools/index.d.ts +3 -2
  72. package/dist/extensions/tools/index.d.ts.map +1 -1
  73. package/dist/extensions/tools/presets.d.ts +27 -44
  74. package/dist/extensions/tools/presets.d.ts.map +1 -1
  75. package/dist/extensions/tools/runtime.d.ts +25 -0
  76. package/dist/extensions/tools/runtime.d.ts.map +1 -0
  77. package/dist/extensions/tools/schemas.d.ts +25 -3
  78. package/dist/extensions/tools/schemas.d.ts.map +1 -1
  79. package/dist/extensions/tools/team/delegated-agent.d.ts +2 -2
  80. package/dist/extensions/tools/team/delegated-agent.d.ts.map +1 -1
  81. package/dist/extensions/tools/team/multi-agent.d.ts +7 -3
  82. package/dist/extensions/tools/team/multi-agent.d.ts.map +1 -1
  83. package/dist/extensions/tools/team/team-tools.d.ts +1 -0
  84. package/dist/extensions/tools/team/team-tools.d.ts.map +1 -1
  85. package/dist/extensions/tools/types.d.ts +0 -5
  86. package/dist/extensions/tools/types.d.ts.map +1 -1
  87. package/dist/hooks/hook-bridge.d.ts +118 -0
  88. package/dist/hooks/hook-bridge.d.ts.map +1 -0
  89. package/dist/hooks/hook-file-hooks.d.ts +6 -2
  90. package/dist/hooks/hook-file-hooks.d.ts.map +1 -1
  91. package/dist/hooks/hook-registry.d.ts +16 -0
  92. package/dist/hooks/hook-registry.d.ts.map +1 -0
  93. package/dist/hooks/index.d.ts +0 -1
  94. package/dist/hooks/index.d.ts.map +1 -1
  95. package/dist/hooks/subprocess.d.ts +8 -1
  96. package/dist/hooks/subprocess.d.ts.map +1 -1
  97. package/dist/hub/browser-websocket.d.ts +18 -0
  98. package/dist/hub/browser-websocket.d.ts.map +1 -0
  99. package/dist/hub/client.d.ts +51 -0
  100. package/dist/hub/client.d.ts.map +1 -0
  101. package/dist/hub/connect.d.ts +15 -0
  102. package/dist/hub/connect.d.ts.map +1 -0
  103. package/dist/hub/daemon-entry.d.ts +2 -0
  104. package/dist/hub/daemon-entry.d.ts.map +1 -0
  105. package/dist/hub/daemon-entry.js +1305 -0
  106. package/dist/hub/daemon.d.ts +5 -0
  107. package/dist/hub/daemon.d.ts.map +1 -0
  108. package/dist/hub/defaults.d.ts +17 -0
  109. package/dist/hub/defaults.d.ts.map +1 -0
  110. package/dist/hub/discovery.d.ts +29 -0
  111. package/dist/hub/discovery.d.ts.map +1 -0
  112. package/dist/hub/index.d.ts +15 -0
  113. package/dist/hub/index.d.ts.map +1 -0
  114. package/dist/hub/index.js +1294 -0
  115. package/dist/hub/native-transport.d.ts +17 -0
  116. package/dist/hub/native-transport.d.ts.map +1 -0
  117. package/dist/hub/runtime-handlers.d.ts +11 -0
  118. package/dist/hub/runtime-handlers.d.ts.map +1 -0
  119. package/dist/hub/server.d.ts +104 -0
  120. package/dist/hub/server.d.ts.map +1 -0
  121. package/dist/hub/session-client.d.ts +90 -0
  122. package/dist/hub/session-client.d.ts.map +1 -0
  123. package/dist/hub/start-shared-server.d.ts +19 -0
  124. package/dist/hub/start-shared-server.d.ts.map +1 -0
  125. package/dist/hub/transport.d.ts +8 -0
  126. package/dist/hub/transport.d.ts.map +1 -0
  127. package/dist/hub/ui-client.d.ts +45 -0
  128. package/dist/hub/ui-client.d.ts.map +1 -0
  129. package/dist/hub/workspace.d.ts +4 -0
  130. package/dist/hub/workspace.d.ts.map +1 -0
  131. package/dist/index.d.ts +29 -16
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +782 -471
  134. package/dist/llms/cline-recommended-models.d.ts +20 -0
  135. package/dist/llms/cline-recommended-models.d.ts.map +1 -0
  136. package/dist/llms/configured-provider-registry.d.ts +28 -0
  137. package/dist/llms/configured-provider-registry.d.ts.map +1 -0
  138. package/dist/llms/handler-factory.d.ts +16 -0
  139. package/dist/llms/handler-factory.d.ts.map +1 -0
  140. package/dist/llms/provider-defaults.d.ts +27 -0
  141. package/dist/llms/provider-defaults.d.ts.map +1 -0
  142. package/dist/llms/provider-settings.d.ts +245 -0
  143. package/dist/llms/provider-settings.d.ts.map +1 -0
  144. package/dist/llms/runtime-config.d.ts +4 -0
  145. package/dist/llms/runtime-config.d.ts.map +1 -0
  146. package/dist/llms/runtime-registry.d.ts +20 -0
  147. package/dist/llms/runtime-registry.d.ts.map +1 -0
  148. package/dist/llms/runtime-types.d.ts +85 -0
  149. package/dist/llms/runtime-types.d.ts.map +1 -0
  150. package/dist/runtime/agent-config-adapter.d.ts +148 -0
  151. package/dist/runtime/agent-config-adapter.d.ts.map +1 -0
  152. package/dist/runtime/agent-runtime-config-builder.d.ts +96 -0
  153. package/dist/runtime/agent-runtime-config-builder.d.ts.map +1 -0
  154. package/dist/runtime/history.d.ts +6 -0
  155. package/dist/runtime/history.d.ts.map +1 -1
  156. package/dist/runtime/host.d.ts +1 -2
  157. package/dist/runtime/host.d.ts.map +1 -1
  158. package/dist/runtime/loop-detection.d.ts +59 -0
  159. package/dist/runtime/loop-detection.d.ts.map +1 -0
  160. package/dist/runtime/mistake-tracker.d.ts +69 -0
  161. package/dist/runtime/mistake-tracker.d.ts.map +1 -0
  162. package/dist/runtime/rules.d.ts +1 -0
  163. package/dist/runtime/rules.d.ts.map +1 -1
  164. package/dist/runtime/runtime-builder.d.ts.map +1 -1
  165. package/dist/runtime/runtime-event-adapter.d.ts +102 -0
  166. package/dist/runtime/runtime-event-adapter.d.ts.map +1 -0
  167. package/dist/runtime/runtime-host.d.ts +49 -26
  168. package/dist/runtime/runtime-host.d.ts.map +1 -1
  169. package/dist/runtime/runtime-oauth-token-manager.d.ts.map +1 -1
  170. package/dist/runtime/session-runtime-orchestrator.d.ts +261 -0
  171. package/dist/runtime/session-runtime-orchestrator.d.ts.map +1 -0
  172. package/dist/runtime/session-runtime.d.ts +16 -21
  173. package/dist/runtime/session-runtime.d.ts.map +1 -1
  174. package/dist/runtime/user-input-builder.d.ts +24 -0
  175. package/dist/runtime/user-input-builder.d.ts.map +1 -0
  176. package/dist/services/global-settings.d.ts +12 -0
  177. package/dist/services/global-settings.d.ts.map +1 -0
  178. package/dist/services/index.js +28 -0
  179. package/dist/services/local-runtime-bootstrap.d.ts +9 -3
  180. package/dist/services/local-runtime-bootstrap.d.ts.map +1 -1
  181. package/dist/services/plugin-tools.d.ts +16 -0
  182. package/dist/services/plugin-tools.d.ts.map +1 -0
  183. package/dist/services/providers/local-provider-registry.d.ts +199 -23
  184. package/dist/services/providers/local-provider-registry.d.ts.map +1 -1
  185. package/dist/services/providers/local-provider-service.d.ts +15 -13
  186. package/dist/services/providers/local-provider-service.d.ts.map +1 -1
  187. package/dist/services/session-data.d.ts +1 -1
  188. package/dist/services/session-data.d.ts.map +1 -1
  189. package/dist/services/session-telemetry.d.ts +7 -2
  190. package/dist/services/session-telemetry.d.ts.map +1 -1
  191. package/dist/services/storage/file-team-store.d.ts.map +1 -1
  192. package/dist/services/storage/provider-settings-legacy-migration.d.ts +1 -1
  193. package/dist/services/storage/provider-settings-legacy-migration.d.ts.map +1 -1
  194. package/dist/services/storage/provider-settings-manager.d.ts +1 -0
  195. package/dist/services/storage/provider-settings-manager.d.ts.map +1 -1
  196. package/dist/services/storage/sqlite-team-store.d.ts.map +1 -1
  197. package/dist/services/workspace-manifest.d.ts +11 -0
  198. package/dist/services/workspace-manifest.d.ts.map +1 -1
  199. package/dist/session/conversation-store.d.ts +30 -0
  200. package/dist/session/conversation-store.d.ts.map +1 -0
  201. package/dist/session/message-builder.d.ts +65 -0
  202. package/dist/session/message-builder.d.ts.map +1 -0
  203. package/dist/session/persistence-service.d.ts +11 -23
  204. package/dist/session/persistence-service.d.ts.map +1 -1
  205. package/dist/session/session-manifest-store.d.ts +22 -0
  206. package/dist/session/session-manifest-store.d.ts.map +1 -0
  207. package/dist/session/session-manifest.d.ts +1 -1
  208. package/dist/session/session-row.d.ts +93 -0
  209. package/dist/session/session-row.d.ts.map +1 -0
  210. package/dist/session/session-service.d.ts +2 -102
  211. package/dist/session/session-service.d.ts.map +1 -1
  212. package/dist/session/subagent-session-manager.d.ts +36 -0
  213. package/dist/session/subagent-session-manager.d.ts.map +1 -0
  214. package/dist/session/team-persistence-store.d.ts +24 -0
  215. package/dist/session/team-persistence-store.d.ts.map +1 -0
  216. package/dist/transports/hub.d.ts +58 -0
  217. package/dist/transports/hub.d.ts.map +1 -0
  218. package/dist/transports/local.d.ts +23 -9
  219. package/dist/transports/local.d.ts.map +1 -1
  220. package/dist/transports/remote.d.ts +10 -0
  221. package/dist/transports/remote.d.ts.map +1 -0
  222. package/dist/transports/runtime-host-support.d.ts +3 -2
  223. package/dist/transports/runtime-host-support.d.ts.map +1 -1
  224. package/dist/types/chat-schema.d.ts +15 -17
  225. package/dist/types/chat-schema.d.ts.map +1 -1
  226. package/dist/types/config.d.ts +17 -7
  227. package/dist/types/config.d.ts.map +1 -1
  228. package/dist/types/events.d.ts +7 -6
  229. package/dist/types/events.d.ts.map +1 -1
  230. package/dist/types/provider-settings.d.ts +4 -5
  231. package/dist/types/provider-settings.d.ts.map +1 -1
  232. package/dist/types/session.d.ts +7 -3
  233. package/dist/types/session.d.ts.map +1 -1
  234. package/dist/types.d.ts +11 -4
  235. package/dist/types.d.ts.map +1 -1
  236. package/package.json +20 -6
  237. package/src/ClineCore.ts +757 -44
  238. package/src/account/cline-account-service.ts +44 -6
  239. package/src/account/index.ts +3 -3
  240. package/src/account/rpc.ts +12 -12
  241. package/src/cron/cron-event-ingress.ts +357 -0
  242. package/src/cron/cron-materializer.ts +97 -0
  243. package/src/cron/cron-reconciler.ts +241 -0
  244. package/src/cron/cron-report-writer.ts +153 -0
  245. package/src/cron/cron-runner.ts +495 -0
  246. package/src/cron/cron-schema.ts +127 -0
  247. package/src/cron/cron-service.ts +163 -0
  248. package/src/cron/cron-spec-parser.ts +489 -0
  249. package/src/cron/cron-watcher.ts +102 -0
  250. package/src/cron/index.ts +15 -0
  251. package/src/cron/resource-limiter.ts +46 -0
  252. package/src/cron/schedule-command-service.ts +193 -0
  253. package/src/cron/schedule-service.ts +703 -0
  254. package/src/cron/scheduler.ts +772 -0
  255. package/src/cron/sqlite-cron-store.ts +1286 -0
  256. package/src/cron/sqlite-schedule-store.ts +708 -0
  257. package/src/extensions/config/agent-config-loader.ts +17 -7
  258. package/src/extensions/config/runtime-commands.ts +6 -0
  259. package/src/extensions/config/user-instruction-config-loader.ts +1 -0
  260. package/src/extensions/context/agentic-compaction.ts +3 -3
  261. package/src/extensions/context/basic-compaction.ts +2 -2
  262. package/src/extensions/context/compaction-shared.ts +5 -4
  263. package/src/extensions/context/compaction.ts +3 -3
  264. package/src/extensions/plugin/plugin-config-loader.ts +37 -2
  265. package/src/extensions/plugin/plugin-loader.ts +69 -9
  266. package/src/extensions/plugin/plugin-module-import.ts +0 -2
  267. package/src/extensions/plugin/plugin-sandbox-bootstrap.ts +243 -39
  268. package/src/extensions/plugin/plugin-sandbox.ts +173 -29
  269. package/src/extensions/plugin/plugin-targeting.ts +32 -0
  270. package/src/extensions/tools/constants.ts +2 -0
  271. package/src/extensions/tools/definitions.ts +61 -71
  272. package/src/extensions/tools/executors/apply-patch.ts +69 -80
  273. package/src/extensions/tools/executors/editor.ts +4 -3
  274. package/src/extensions/tools/executors/search.ts +195 -3
  275. package/src/extensions/tools/helpers.ts +24 -0
  276. package/src/extensions/tools/index.ts +11 -2
  277. package/src/extensions/tools/presets.ts +32 -47
  278. package/src/extensions/tools/runtime.ts +261 -0
  279. package/src/extensions/tools/schemas.ts +17 -20
  280. package/src/extensions/tools/team/delegated-agent.ts +8 -3
  281. package/src/extensions/tools/team/multi-agent.ts +135 -19
  282. package/src/extensions/tools/team/team-tools.ts +172 -91
  283. package/src/extensions/tools/types.ts +0 -6
  284. package/src/hooks/hook-bridge.ts +489 -0
  285. package/src/hooks/hook-file-hooks.ts +66 -5
  286. package/src/hooks/hook-registry.ts +257 -0
  287. package/src/hooks/index.ts +0 -7
  288. package/src/hooks/subprocess-runner.ts +1 -1
  289. package/src/hooks/subprocess.ts +9 -0
  290. package/src/hub/browser-websocket.ts +159 -0
  291. package/src/hub/client.ts +633 -0
  292. package/src/hub/connect.ts +156 -0
  293. package/src/hub/daemon-entry.ts +122 -0
  294. package/src/hub/daemon.ts +284 -0
  295. package/src/hub/defaults.ts +70 -0
  296. package/src/hub/discovery.ts +247 -0
  297. package/src/hub/index.ts +14 -0
  298. package/src/hub/native-transport.ts +31 -0
  299. package/src/hub/runtime-handlers.ts +141 -0
  300. package/src/hub/server.ts +2317 -0
  301. package/src/hub/session-client.ts +502 -0
  302. package/src/hub/start-shared-server.ts +61 -0
  303. package/src/hub/transport.ts +14 -0
  304. package/src/hub/ui-client.ts +126 -0
  305. package/src/hub/workspace.ts +19 -0
  306. package/src/index.ts +169 -68
  307. package/src/llms/cline-recommended-models.ts +167 -0
  308. package/src/llms/configured-provider-registry.ts +193 -0
  309. package/src/llms/handler-factory.ts +56 -0
  310. package/src/llms/provider-defaults.ts +653 -0
  311. package/src/llms/provider-settings.ts +310 -0
  312. package/src/llms/runtime-config.ts +43 -0
  313. package/src/llms/runtime-registry.ts +172 -0
  314. package/src/llms/runtime-types.ts +121 -0
  315. package/src/runtime/agent-config-adapter.ts +636 -0
  316. package/src/runtime/agent-runtime-config-builder.ts +205 -0
  317. package/src/runtime/error-feedback.ts +142 -0
  318. package/src/runtime/history.ts +137 -0
  319. package/src/runtime/host.ts +127 -267
  320. package/src/runtime/index.ts +1 -0
  321. package/src/runtime/loop-detection.ts +162 -0
  322. package/src/runtime/mistake-tracker.ts +221 -0
  323. package/src/runtime/rules.ts +12 -0
  324. package/src/runtime/runtime-builder.ts +85 -13
  325. package/src/runtime/runtime-event-adapter.ts +412 -0
  326. package/src/runtime/runtime-host.ts +134 -62
  327. package/src/runtime/runtime-oauth-token-manager.ts +11 -15
  328. package/src/runtime/session-runtime-orchestrator.ts +1253 -0
  329. package/src/runtime/session-runtime.ts +16 -26
  330. package/src/runtime/user-input-builder.ts +167 -0
  331. package/src/services/global-settings.ts +122 -0
  332. package/src/services/local-runtime-bootstrap.ts +175 -31
  333. package/src/services/plugin-tools.ts +86 -0
  334. package/src/services/providers/local-provider-registry.ts +277 -61
  335. package/src/services/providers/local-provider-service.ts +109 -44
  336. package/src/services/session-data.ts +18 -10
  337. package/src/services/session-telemetry.ts +6 -15
  338. package/src/services/storage/file-team-store.ts +1 -5
  339. package/src/services/storage/provider-settings-legacy-migration.ts +14 -51
  340. package/src/services/storage/provider-settings-manager.ts +17 -2
  341. package/src/services/storage/sqlite-team-store.ts +1 -5
  342. package/src/services/workspace-manifest.ts +18 -0
  343. package/src/session/conversation-store.ts +77 -0
  344. package/src/session/file-session-service.ts +1 -1
  345. package/src/session/index.ts +6 -27
  346. package/src/session/message-builder.ts +941 -0
  347. package/src/session/persistence-service.ts +119 -504
  348. package/src/session/session-manifest-store.ts +158 -0
  349. package/src/session/session-row.ts +199 -0
  350. package/src/session/session-service.ts +17 -376
  351. package/src/session/session-team-coordination.ts +1 -1
  352. package/src/session/subagent-session-manager.ts +397 -0
  353. package/src/session/team-persistence-store.ts +176 -0
  354. package/src/transports/hub.ts +1081 -0
  355. package/src/transports/local.ts +419 -93
  356. package/src/transports/remote.ts +27 -0
  357. package/src/transports/runtime-host-support.ts +63 -9
  358. package/src/types/chat-schema.ts +4 -5
  359. package/src/types/config.ts +17 -7
  360. package/src/types/events.ts +8 -6
  361. package/src/types/index.ts +3 -0
  362. package/src/types/provider-settings.ts +18 -7
  363. package/src/types/session.ts +7 -6
  364. package/src/types.ts +42 -2
  365. package/dist/hooks/persistent.d.ts +0 -64
  366. package/dist/hooks/persistent.d.ts.map +0 -1
  367. package/dist/runtime/rpc-runtime-ensure.d.ts +0 -65
  368. package/dist/runtime/rpc-runtime-ensure.d.ts.map +0 -1
  369. package/dist/runtime/rpc-spawn-lease.d.ts +0 -8
  370. package/dist/runtime/rpc-spawn-lease.d.ts.map +0 -1
  371. package/dist/services/telemetry/index.js +0 -15
  372. package/dist/session/rpc-session-service.d.ts +0 -16
  373. package/dist/session/rpc-session-service.d.ts.map +0 -1
  374. package/dist/session/sqlite-rpc-session-backend.d.ts +0 -31
  375. package/dist/session/sqlite-rpc-session-backend.d.ts.map +0 -1
  376. package/dist/transports/rpc.d.ts +0 -51
  377. package/dist/transports/rpc.d.ts.map +0 -1
  378. package/src/ClineCore.test.ts +0 -226
  379. package/src/account/cline-account-service.test.ts +0 -185
  380. package/src/account/featurebase-token.test.ts +0 -175
  381. package/src/account/rpc.test.ts +0 -63
  382. package/src/auth/bounded-ttl-cache.test.ts +0 -38
  383. package/src/auth/client.test.ts +0 -69
  384. package/src/auth/cline.test.ts +0 -267
  385. package/src/auth/codex.test.ts +0 -170
  386. package/src/auth/oca.test.ts +0 -340
  387. package/src/auth/server.test.ts +0 -287
  388. package/src/auth/utils.test.ts +0 -128
  389. package/src/extensions/config/agent-config-loader.test.ts +0 -236
  390. package/src/extensions/config/hooks-config-loader.test.ts +0 -20
  391. package/src/extensions/config/runtime-commands.test.ts +0 -115
  392. package/src/extensions/config/unified-config-file-watcher.test.ts +0 -196
  393. package/src/extensions/config/user-instruction-config-loader.test.ts +0 -246
  394. package/src/extensions/context/compaction.test.ts +0 -483
  395. package/src/extensions/mcp/config-loader.test.ts +0 -238
  396. package/src/extensions/mcp/manager.test.ts +0 -105
  397. package/src/extensions/plugin/plugin-config-loader.test.ts +0 -184
  398. package/src/extensions/plugin/plugin-loader.test.ts +0 -292
  399. package/src/extensions/plugin/plugin-sandbox.test.ts +0 -423
  400. package/src/extensions/tools/definitions.test.ts +0 -780
  401. package/src/extensions/tools/executors/bash.test.ts +0 -87
  402. package/src/extensions/tools/executors/editor.test.ts +0 -35
  403. package/src/extensions/tools/executors/file-read.test.ts +0 -125
  404. package/src/extensions/tools/model-tool-routing.test.ts +0 -86
  405. package/src/extensions/tools/presets.test.ts +0 -70
  406. package/src/extensions/tools/team/multi-agent.lifecycle.test.ts +0 -455
  407. package/src/extensions/tools/team/spawn-agent-tool.test.ts +0 -381
  408. package/src/extensions/tools/team/team-tools.test.ts +0 -918
  409. package/src/hooks/checkpoint-hooks.test.ts +0 -168
  410. package/src/hooks/hook-file-hooks.test.ts +0 -311
  411. package/src/hooks/persistent.ts +0 -661
  412. package/src/runtime/history.test.ts +0 -114
  413. package/src/runtime/host.test.ts +0 -230
  414. package/src/runtime/rpc-runtime-ensure.test.ts +0 -123
  415. package/src/runtime/rpc-runtime-ensure.ts +0 -659
  416. package/src/runtime/rpc-spawn-lease.test.ts +0 -81
  417. package/src/runtime/rpc-spawn-lease.ts +0 -156
  418. package/src/runtime/runtime-builder.team-persistence.test.ts +0 -245
  419. package/src/runtime/runtime-builder.test.ts +0 -615
  420. package/src/runtime/runtime-oauth-token-manager.test.ts +0 -137
  421. package/src/runtime/runtime-parity.test.ts +0 -143
  422. package/src/services/providers/local-provider-service.test.ts +0 -1062
  423. package/src/services/session-data.test.ts +0 -160
  424. package/src/services/storage/provider-settings-legacy-migration.test.ts +0 -424
  425. package/src/services/storage/provider-settings-manager.test.ts +0 -191
  426. package/src/services/telemetry/OpenTelemetryAdapter.test.ts +0 -157
  427. package/src/services/telemetry/OpenTelemetryProvider.test.ts +0 -326
  428. package/src/services/telemetry/TelemetryLoggerSink.test.ts +0 -42
  429. package/src/services/telemetry/TelemetryService.test.ts +0 -134
  430. package/src/services/telemetry/distinct-id.test.ts +0 -57
  431. package/src/services/workspace/file-indexer.d.ts +0 -11
  432. package/src/services/workspace/file-indexer.test.ts +0 -156
  433. package/src/services/workspace/mention-enricher.test.ts +0 -106
  434. package/src/session/persistence-service.test.ts +0 -300
  435. package/src/session/rpc-session-service.ts +0 -114
  436. package/src/session/session-service.team-persistence.test.ts +0 -48
  437. package/src/session/sqlite-rpc-session-backend.ts +0 -301
  438. package/src/transports/local.e2e.test.ts +0 -380
  439. package/src/transports/local.test.ts +0 -2559
  440. package/src/transports/rpc.test.ts +0 -82
  441. package/src/transports/rpc.ts +0 -665
@@ -0,0 +1,489 @@
1
+ /**
2
+ * Bridges the flat `AgentRuntimeHooks` bag consumed by the
3
+ * new `AgentRuntime` and the legacy 15-stage `HookEngine` + `AgentHooks`
4
+ * + `AgentExtension[]` surface that `@clinebot/core` already speaks.
5
+ *
6
+ * @see PLAN.md §3.1 — replaces `packages/agents/src/runtime/lifecycle-orchestrator.ts`.
7
+ * @see PLAN.md §3.2.3 — public surface of `HookBridge`.
8
+ * @see PLAN.md §3.3.1 — OLD `HookStage` → NEW runtime primitive mapping.
9
+ * @see PLAN.md §3.3.3 — OLD `config.hooks.*` → NEW placement.
10
+ *
11
+ * -------------------------------------------------------------------------
12
+ * Responsibilities
13
+ * -------------------------------------------------------------------------
14
+ *
15
+ * 1. **Register** the legacy `AgentHooks` + `AgentExtension[]` on the
16
+ * `HookEngine` once at construction (via `registerLifecycleHandlers`
17
+ * — moved verbatim from the old agents package).
18
+ * 2. **Synthesize** an `AgentRuntimeHooks` bag via `toRuntimeHooks()`.
19
+ * Each runtime hook dispatches to the `HookEngine`'s
20
+ * corresponding stage (or stages, e.g. `beforeModel` fires both
21
+ * `turn_start` **and** `before_agent_start` per §3.3.1).
22
+ * 3. **Forward** `AgentRuntimeEvent`s via `onEvent` (part of the
23
+ * runtime-hooks bag) into the engine's `runtime_event` stage — and
24
+ * synthesize the stages that have no direct new-runtime primitive
25
+ * (`iteration_start`, `iteration_end`, `error`, per §3.3.2).
26
+ * 4. **Expose** imperative `dispatch(source, input)` for
27
+ * `SessionRuntime` to fire the *non*-runtime stages that live on
28
+ * the session boundary: `session_start`, `session_shutdown`,
29
+ * `input`, `run_end`, and `stop_error` (the bridge synthesizes
30
+ * these from session-level events, not from the new runtime's hooks).
31
+ * 5. **Apply** hook-returned `control.context` by invoking
32
+ * `onHookContext(source, context)` so the caller (facade or
33
+ * session-runtime) can append `<hook_context source="…">…` user
34
+ * messages to the conversation (legacy behavior at
35
+ * `packages/agents/src/agent.ts:1402-1421`).
36
+ *
37
+ * This is the **non-Step-8a** half of the core runtime port: it wires
38
+ * the existing hook ecosystem to the new runtime without changing
39
+ * either side's semantics.
40
+ */
41
+
42
+ import type {
43
+ AgentExtension,
44
+ AgentHookControl,
45
+ AgentHooks,
46
+ AgentRuntimeEvent,
47
+ AgentRuntimeHooks,
48
+ AgentStopControl,
49
+ HookDispatchInput,
50
+ HookEngine,
51
+ } from "@clinebot/shared";
52
+ import { registerLifecycleHandlers } from "./hook-registry";
53
+
54
+ export interface HookBridgeOptions {
55
+ readonly agentId: string;
56
+ readonly agentRole?: string;
57
+ readonly conversationId: string;
58
+ readonly parentAgentId: string | null;
59
+ readonly hookEngine: HookEngine;
60
+ /** Legacy flat `AgentHooks` bag — registered on the engine. */
61
+ readonly hooks?: AgentHooks;
62
+ /** Legacy `AgentExtension[]` — their `on*` callbacks are registered. */
63
+ readonly extensions?: readonly AgentExtension[];
64
+ /** Supplies the currently-active run id (stable for the duration of one run). */
65
+ readonly getRunId: () => string;
66
+ /** Called when any dispatched hook returns `control.context`. */
67
+ readonly onHookContext?: (source: string, context: string) => void;
68
+ /** Called when a dispatch throws. */
69
+ readonly onDispatchError?: (error: unknown) => void;
70
+ }
71
+
72
+ type ImperativeDispatchInput = Pick<
73
+ HookDispatchInput,
74
+ "stage" | "payload" | "iteration" | "parentEventId"
75
+ >;
76
+
77
+ export class HookBridge {
78
+ private readonly options: HookBridgeOptions;
79
+
80
+ constructor(options: HookBridgeOptions) {
81
+ this.options = options;
82
+ // Register legacy hooks + extensions on the shared engine.
83
+ // Safe to call even when both are empty: the registry is a
84
+ // no-op for unset callbacks and disabled extensions.
85
+ registerLifecycleHandlers(options.hookEngine, {
86
+ hooks: options.hooks,
87
+ extensions: options.extensions ? [...options.extensions] : undefined,
88
+ });
89
+ }
90
+
91
+ // -------------------------------------------------------------------
92
+ // Imperative dispatch (used by SessionRuntime for session-scoped stages)
93
+ // -------------------------------------------------------------------
94
+
95
+ /**
96
+ * Dispatch a lifecycle stage imperatively. `SessionRuntime` calls
97
+ * this at `session_start`, `session_shutdown`, `input`, `run_end`, and
98
+ * `stop_error` — stages that do not map cleanly onto the
99
+ * `AgentRuntime` hooks (§3.3.1).
100
+ *
101
+ * Returns the merged `AgentHookControl` from the dispatched
102
+ * handlers, or `undefined` if nothing ran. Context propagation
103
+ * (`control.context` → `onHookContext(source, …)`) is applied
104
+ * inline.
105
+ */
106
+ async dispatch(
107
+ source: string,
108
+ input: ImperativeDispatchInput,
109
+ ): Promise<AgentHookControl | undefined> {
110
+ try {
111
+ const result = await this.options.hookEngine.dispatch({
112
+ ...input,
113
+ runId: this.options.getRunId(),
114
+ agentId: this.options.agentId,
115
+ conversationId: this.options.conversationId,
116
+ parentAgentId: this.options.parentAgentId,
117
+ });
118
+ if (result.control?.context) {
119
+ this.options.onHookContext?.(source, result.control.context);
120
+ }
121
+ return result.control as AgentHookControl | undefined;
122
+ } catch (error) {
123
+ this.options.onDispatchError?.(error);
124
+ return undefined;
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Fire the `runtime_event` stage for a single `AgentRuntimeEvent`.
130
+ * Non-blocking: errors route through `onDispatchError`. Exposed
131
+ * for callers who already hold the event (e.g. the legacy facade's
132
+ * subscribeEvents adapter).
133
+ */
134
+ dispatchRuntimeEvent(event: AgentRuntimeEvent): void {
135
+ void this.dispatch("hook.runtime_event", {
136
+ stage: "runtime_event",
137
+ payload: {
138
+ agentId: this.options.agentId,
139
+ conversationId: this.options.conversationId,
140
+ parentAgentId: this.options.parentAgentId,
141
+ event,
142
+ },
143
+ });
144
+ }
145
+
146
+ async shutdown(timeoutMs?: number): Promise<void> {
147
+ await this.options.hookEngine.shutdown(timeoutMs);
148
+ }
149
+
150
+ // -------------------------------------------------------------------
151
+ // toRuntimeHooks() — the synthesized AgentRuntimeHooks bag
152
+ // -------------------------------------------------------------------
153
+
154
+ /**
155
+ * Build the `AgentRuntimeHooks` bag consumed by
156
+ * `AgentRuntime`. Each synthesized callback:
157
+ *
158
+ * - invokes `hookEngine.dispatch(stage, payload)` for the
159
+ * corresponding legacy stage(s) (§3.3.1);
160
+ * - merges the returned `AgentHookControl` into the runtime-hook's
161
+ * return shape (`AgentStopControl` / `AgentBeforeModelResult` /
162
+ * `AgentBeforeToolResult` / `AgentAfterToolResult`) per §3.3.3;
163
+ * - applies `control.context` via `onHookContext(source, …)` so
164
+ * the caller can append `<hook_context>` user messages.
165
+ *
166
+ * Legacy stages that have no direct new-runtime primitive
167
+ * (`iteration_start`, `iteration_end`, `error`) are synthesized
168
+ * inside `onEvent` from the corresponding `AgentRuntimeEvent`
169
+ * variants (§3.3.2).
170
+ */
171
+ toRuntimeHooks(): AgentRuntimeHooks {
172
+ return {
173
+ beforeRun: async (ctx) => {
174
+ const control = await this.dispatch("hook.run_start", {
175
+ stage: "run_start",
176
+ iteration: ctx.snapshot.iteration,
177
+ payload: {
178
+ agentId: this.options.agentId,
179
+ agentRole: this.options.agentRole,
180
+ conversationId: this.options.conversationId,
181
+ parentAgentId: this.options.parentAgentId,
182
+ runId: this.options.getRunId(),
183
+ snapshot: ctx.snapshot,
184
+ },
185
+ });
186
+ return controlToStop(control);
187
+ },
188
+
189
+ beforeModel: async (ctx) => {
190
+ // §3.3.1: `beforeModel` fires both `turn_start` AND
191
+ // `before_agent_start` in that exact order (legacy
192
+ // `agent.ts:599` → `:618` sequence, §3.3.3 note).
193
+ const turnStartControl = await this.dispatch("hook.turn_start", {
194
+ stage: "turn_start",
195
+ iteration: ctx.snapshot.iteration,
196
+ payload: {
197
+ agentId: this.options.agentId,
198
+ agentRole: this.options.agentRole,
199
+ conversationId: this.options.conversationId,
200
+ parentAgentId: this.options.parentAgentId,
201
+ runId: this.options.getRunId(),
202
+ snapshot: ctx.snapshot,
203
+ request: ctx.request,
204
+ },
205
+ });
206
+ const beforeAgentControl = await this.dispatch(
207
+ "hook.before_agent_start",
208
+ {
209
+ stage: "before_agent_start",
210
+ iteration: ctx.snapshot.iteration,
211
+ payload: {
212
+ agentId: this.options.agentId,
213
+ agentRole: this.options.agentRole,
214
+ conversationId: this.options.conversationId,
215
+ parentAgentId: this.options.parentAgentId,
216
+ runId: this.options.getRunId(),
217
+ snapshot: ctx.snapshot,
218
+ request: ctx.request,
219
+ },
220
+ },
221
+ );
222
+ return mergeBeforeModelControl(turnStartControl, beforeAgentControl);
223
+ },
224
+
225
+ afterModel: async (ctx) => {
226
+ const control = await this.dispatch("hook.turn_end", {
227
+ stage: "turn_end",
228
+ iteration: ctx.snapshot.iteration,
229
+ payload: {
230
+ agentId: this.options.agentId,
231
+ agentRole: this.options.agentRole,
232
+ conversationId: this.options.conversationId,
233
+ parentAgentId: this.options.parentAgentId,
234
+ runId: this.options.getRunId(),
235
+ snapshot: ctx.snapshot,
236
+ assistantMessage: ctx.assistantMessage,
237
+ finishReason: ctx.finishReason,
238
+ },
239
+ });
240
+ return controlToStop(control);
241
+ },
242
+
243
+ beforeTool: async (ctx) => {
244
+ const control = await this.dispatch("hook.tool_call_before", {
245
+ stage: "tool_call_before",
246
+ iteration: ctx.snapshot.iteration,
247
+ payload: {
248
+ agentId: this.options.agentId,
249
+ agentRole: this.options.agentRole,
250
+ conversationId: this.options.conversationId,
251
+ parentAgentId: this.options.parentAgentId,
252
+ runId: this.options.getRunId(),
253
+ snapshot: ctx.snapshot,
254
+ tool: ctx.tool,
255
+ toolCall: ctx.toolCall,
256
+ input: ctx.input,
257
+ },
258
+ });
259
+ return controlToBeforeTool(control);
260
+ },
261
+
262
+ afterTool: async (ctx) => {
263
+ const control = await this.dispatch("hook.tool_call_after", {
264
+ stage: "tool_call_after",
265
+ iteration: ctx.snapshot.iteration,
266
+ payload: {
267
+ agentId: this.options.agentId,
268
+ agentRole: this.options.agentRole,
269
+ conversationId: this.options.conversationId,
270
+ parentAgentId: this.options.parentAgentId,
271
+ runId: this.options.getRunId(),
272
+ snapshot: ctx.snapshot,
273
+ tool: ctx.tool,
274
+ toolCall: ctx.toolCall,
275
+ input: ctx.input,
276
+ result: ctx.result,
277
+ },
278
+ });
279
+ return controlToAfterTool(control);
280
+ },
281
+
282
+ onEvent: (event) => this.onRuntimeEvent(event),
283
+ };
284
+ }
285
+
286
+ // -------------------------------------------------------------------
287
+ // onRuntimeEvent — synthesizes legacy stages from runtime events
288
+ // -------------------------------------------------------------------
289
+
290
+ /**
291
+ * Handle a single `AgentRuntimeEvent`. Always forwards it to the
292
+ * engine's `runtime_event` stage (§3.3.1 last row). Additionally
293
+ * synthesizes the three legacy stages that have no direct
294
+ * new-runtime primitive (§3.3.1):
295
+ *
296
+ * turn-started → also fires `iteration_start`
297
+ * turn-finished → also fires `iteration_end`
298
+ * run-failed → also fires `error`
299
+ *
300
+ * This method is public so `SessionRuntime` can call it when it
301
+ * holds the event directly; the runtime-hooks bag's `onEvent` also
302
+ * routes through here.
303
+ */
304
+ async onRuntimeEvent(event: AgentRuntimeEvent): Promise<void> {
305
+ await this.dispatch("hook.runtime_event", {
306
+ stage: "runtime_event",
307
+ payload: {
308
+ agentId: this.options.agentId,
309
+ conversationId: this.options.conversationId,
310
+ parentAgentId: this.options.parentAgentId,
311
+ event,
312
+ },
313
+ });
314
+
315
+ switch (event.type) {
316
+ case "turn-started":
317
+ await this.dispatch("hook.iteration_start", {
318
+ stage: "iteration_start",
319
+ iteration: event.iteration,
320
+ payload: {
321
+ agentId: this.options.agentId,
322
+ agentRole: this.options.agentRole,
323
+ conversationId: this.options.conversationId,
324
+ parentAgentId: this.options.parentAgentId,
325
+ runId: this.options.getRunId(),
326
+ iteration: event.iteration,
327
+ snapshot: event.snapshot,
328
+ },
329
+ });
330
+ return;
331
+ case "turn-finished":
332
+ await this.dispatch("hook.iteration_end", {
333
+ stage: "iteration_end",
334
+ iteration: event.iteration,
335
+ payload: {
336
+ agentId: this.options.agentId,
337
+ agentRole: this.options.agentRole,
338
+ conversationId: this.options.conversationId,
339
+ parentAgentId: this.options.parentAgentId,
340
+ runId: this.options.getRunId(),
341
+ iteration: event.iteration,
342
+ hadToolCalls: event.toolCallCount > 0,
343
+ toolCallCount: event.toolCallCount,
344
+ snapshot: event.snapshot,
345
+ },
346
+ });
347
+ return;
348
+ case "run-failed":
349
+ await this.dispatch("hook.error", {
350
+ stage: "error",
351
+ iteration: event.snapshot.iteration,
352
+ payload: {
353
+ agentId: this.options.agentId,
354
+ agentRole: this.options.agentRole,
355
+ conversationId: this.options.conversationId,
356
+ parentAgentId: this.options.parentAgentId,
357
+ runId: this.options.getRunId(),
358
+ iteration: event.snapshot.iteration,
359
+ error: event.error,
360
+ recoverable: false,
361
+ },
362
+ });
363
+ return;
364
+ default:
365
+ return;
366
+ }
367
+ }
368
+ }
369
+
370
+ // =============================================================================
371
+ // Private control-mergers
372
+ // =============================================================================
373
+
374
+ /**
375
+ * Convert an `AgentHookControl` into the runtime's `AgentStopControl`
376
+ * shape. `control.cancel === true` is interpreted as
377
+ * `{ stop: true }` per §3.3.3 (legacy `cancel` flag translates to a
378
+ * stop-control on `beforeRun` / `afterModel`).
379
+ */
380
+ function controlToStop(
381
+ control: AgentHookControl | undefined,
382
+ ): AgentStopControl | undefined {
383
+ if (!control) {
384
+ return undefined;
385
+ }
386
+ if (control.cancel === true) {
387
+ return { stop: true };
388
+ }
389
+ return undefined;
390
+ }
391
+
392
+ /**
393
+ * Merge the two `AgentHookControl` returns from `turn_start` and
394
+ * `before_agent_start` into a single `AgentBeforeModelResult`
395
+ * (§3.3.3). The `before_agent_start` control wins on per-field
396
+ * conflicts — matches legacy `agent.ts:618-649` where the later hook
397
+ * can override earlier `systemPrompt` / `replaceMessages` /
398
+ * `appendMessages`.
399
+ */
400
+ function mergeBeforeModelControl(
401
+ turnStart: AgentHookControl | undefined,
402
+ beforeAgent: AgentHookControl | undefined,
403
+ ): { stop?: boolean; options?: Record<string, unknown> } | undefined {
404
+ if (!turnStart && !beforeAgent) {
405
+ return undefined;
406
+ }
407
+ const cancel = turnStart?.cancel === true || beforeAgent?.cancel === true;
408
+ const systemPrompt = beforeAgent?.systemPrompt ?? turnStart?.systemPrompt;
409
+ // Legacy `replaceMessages` / `appendMessages` carry `Message[]`
410
+ // (the old LlmsProviders shape), which is type-incompatible with
411
+ // the new runtime's `AgentMessage[]`. Rather than attempt a lossy
412
+ // cross-shape conversion here (the runtime has no direct message-
413
+ // override anyway — `AgentBeforeModelResult.messages` exists but
414
+ // carries `AgentMessage[]`), we forward both as an opaque
415
+ // `options.*` hint. The facade / SessionRuntime materializes them
416
+ // into `conversation.replaceMessages()` / `appendMessages()` on
417
+ // the next turn, preserving the legacy deferred-apply semantics.
418
+ const replaceMessages =
419
+ beforeAgent?.replaceMessages ?? turnStart?.replaceMessages;
420
+ const appendMessages =
421
+ beforeAgent?.appendMessages ?? turnStart?.appendMessages;
422
+ const out: { stop?: boolean; options?: Record<string, unknown> } = {};
423
+ if (cancel) {
424
+ out.stop = true;
425
+ }
426
+ const options: Record<string, unknown> = {};
427
+ if (replaceMessages) {
428
+ options.replaceMessages = [...replaceMessages];
429
+ }
430
+ if (appendMessages) {
431
+ options.appendMessages = [...appendMessages];
432
+ }
433
+ if (systemPrompt !== undefined) {
434
+ options.systemPrompt = systemPrompt;
435
+ }
436
+ if (Object.keys(options).length > 0) {
437
+ out.options = options;
438
+ }
439
+ return Object.keys(out).length === 0 ? undefined : out;
440
+ }
441
+
442
+ /**
443
+ * Convert an `AgentHookControl` into the runtime's
444
+ * `AgentBeforeToolResult`. Maps:
445
+ *
446
+ * control.cancel → { stop: true }
447
+ * control.overrideInput → { input: … }
448
+ * control.review (legacy) → no direct equivalent — handled by the
449
+ * core ToolApprovalController, not passed
450
+ * through the runtime hook.
451
+ */
452
+ function controlToBeforeTool(
453
+ control: AgentHookControl | undefined,
454
+ ):
455
+ | { skip?: boolean; stop?: boolean; reason?: string; input?: unknown }
456
+ | undefined {
457
+ if (!control) {
458
+ return undefined;
459
+ }
460
+ const out: {
461
+ skip?: boolean;
462
+ stop?: boolean;
463
+ reason?: string;
464
+ input?: unknown;
465
+ } = {};
466
+ if (control.cancel === true) {
467
+ out.stop = true;
468
+ }
469
+ if (control.overrideInput !== undefined) {
470
+ out.input = control.overrideInput;
471
+ }
472
+ return Object.keys(out).length === 0 ? undefined : out;
473
+ }
474
+
475
+ /**
476
+ * Convert an `AgentHookControl` into the runtime's
477
+ * `AgentAfterToolResult`.
478
+ */
479
+ function controlToAfterTool(
480
+ control: AgentHookControl | undefined,
481
+ ): { stop?: boolean; reason?: string } | undefined {
482
+ if (!control) {
483
+ return undefined;
484
+ }
485
+ if (control.cancel === true) {
486
+ return { stop: true };
487
+ }
488
+ return undefined;
489
+ }
@@ -1,11 +1,12 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { appendFileSync, readFileSync } from "node:fs";
3
3
  import { join } from "node:path";
4
- import type { AgentHooks } from "@clinebot/agents";
4
+ import type { AgentHooks } from "@clinebot/shared";
5
5
  import {
6
6
  augmentNodeCommandForDebug,
7
7
  type BasicLogger,
8
8
  type HookSessionContext,
9
+ type WorkspaceInfo,
9
10
  withResolvedClineBuildEnv,
10
11
  } from "@clinebot/shared";
11
12
  import { ensureHookLogDir } from "@clinebot/shared/storage";
@@ -46,6 +47,8 @@ type HookRuntimeOptions = {
46
47
  rootSessionId?: string;
47
48
  logger?: BasicLogger;
48
49
  toolCallTimeoutMs?: number;
50
+ /** Structured git + path metadata forwarded into every hook payload. */
51
+ workspaceInfo?: WorkspaceInfo;
49
52
  };
50
53
 
51
54
  function mapParams(input: unknown): Record<string, string> {
@@ -162,6 +165,7 @@ function createPayloadBase(
162
165
  taskId: ctx.conversationId,
163
166
  sessionContext,
164
167
  workspaceRoots: options.workspacePath ? [options.workspacePath] : [],
168
+ workspaceInfo: options.workspaceInfo,
165
169
  userId,
166
170
  agent_id: ctx.agentId,
167
171
  parent_agent_id: ctx.parentAgentId,
@@ -268,9 +272,37 @@ async function runHookCommand(
268
272
  if (options.command.length === 0) {
269
273
  throw new Error("runHookCommand requires non-empty command");
270
274
  }
275
+ try {
276
+ return await runHookCommandOnce(payload, options);
277
+ } catch (error) {
278
+ const fallbackCommand = getWindowsPythonFallbackCommand(
279
+ options.command,
280
+ process.platform,
281
+ error,
282
+ );
283
+ if (!fallbackCommand) {
284
+ throw error;
285
+ }
286
+ return await runHookCommandOnce(payload, {
287
+ ...options,
288
+ command: fallbackCommand,
289
+ });
290
+ }
291
+ }
292
+
293
+ async function runHookCommandOnce(
294
+ payload: HookEventPayload,
295
+ options: {
296
+ command: string[];
297
+ cwd: string;
298
+ env?: NodeJS.ProcessEnv;
299
+ detached: boolean;
300
+ timeoutMs?: number;
301
+ },
302
+ ): Promise<HookCommandResult | undefined> {
271
303
  const command = augmentNodeCommandForDebug(options.command, {
272
304
  env: options.env,
273
- debugRole: "hook-worker",
305
+ debugRole: "hook",
274
306
  });
275
307
  const child = spawn(command[0], command.slice(1), {
276
308
  cwd: options.cwd,
@@ -353,6 +385,29 @@ function parseShebangCommand(path: string): string[] | undefined {
353
385
  }
354
386
  }
355
387
 
388
+ function isMissingCommandError(error: unknown): boolean {
389
+ return !!(
390
+ error &&
391
+ typeof error === "object" &&
392
+ "code" in error &&
393
+ (error as { code?: unknown }).code === "ENOENT"
394
+ );
395
+ }
396
+
397
+ export function getWindowsPythonFallbackCommand(
398
+ command: string[],
399
+ platform = process.platform,
400
+ error?: unknown,
401
+ ): string[] | undefined {
402
+ if (platform !== "win32" || !isMissingCommandError(error)) {
403
+ return undefined;
404
+ }
405
+ if (command[0] !== "py" || command[1] !== "-3") {
406
+ return undefined;
407
+ }
408
+ return ["python", ...command.slice(2)];
409
+ }
410
+
356
411
  function normalizeHookInterpreter(tokens: string[]): string[] | undefined {
357
412
  if (tokens.length === 0) {
358
413
  return undefined;
@@ -370,7 +425,9 @@ function normalizeHookInterpreter(tokens: string[]): string[] | undefined {
370
425
  }
371
426
 
372
427
  if (commandName === "python3" || commandName === "python") {
373
- return [process.platform === "win32" ? "python" : commandName, ...rest];
428
+ return process.platform === "win32"
429
+ ? ["py", "-3", ...rest]
430
+ : [commandName, ...rest];
374
431
  }
375
432
 
376
433
  return tokens;
@@ -395,7 +452,7 @@ function inferHookCommand(path: string): string[] {
395
452
  lowered.endsWith(".cjs")
396
453
  ) {
397
454
  return augmentNodeCommandForDebug(["node", path], {
398
- debugRole: "hook-worker",
455
+ debugRole: "hook",
399
456
  });
400
457
  }
401
458
  if (
@@ -406,7 +463,9 @@ function inferHookCommand(path: string): string[] {
406
463
  return ["bun", "run", path];
407
464
  }
408
465
  if (lowered.endsWith(".py")) {
409
- return [process.platform === "win32" ? "python" : "python3", path];
466
+ return process.platform === "win32"
467
+ ? ["py", "-3", path]
468
+ : ["python3", path];
410
469
  }
411
470
  if (lowered.endsWith(".ps1")) {
412
471
  return [
@@ -500,11 +559,13 @@ function runAsyncHookCommands(options: {
500
559
  export function createHookAuditHooks(options: {
501
560
  rootSessionId?: string;
502
561
  workspacePath: string;
562
+ workspaceInfo?: WorkspaceInfo;
503
563
  }): AgentHooks {
504
564
  const runtimeOptions: HookRuntimeOptions = {
505
565
  cwd: options.workspacePath,
506
566
  workspacePath: options.workspacePath,
507
567
  rootSessionId: options.rootSessionId,
568
+ workspaceInfo: options.workspaceInfo,
508
569
  };
509
570
 
510
571
  const append = (payload: HookEventPayload): void => {