@caupulican/pi-adaptative 0.81.37 → 0.81.39

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 (451) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +1 -1
  3. package/dist/bundled-resources/extensions/tmux-agent-manager/README.md +18 -1
  4. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +131 -0
  5. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +1 -0
  6. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +196 -0
  7. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +1 -0
  8. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +308 -0
  9. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +22 -2
  10. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
  11. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +585 -24
  12. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
  13. package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +749 -27
  14. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/__init__.py +43 -0
  15. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/fs.py +270 -0
  16. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/search.py +252 -0
  17. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/strings.py +399 -0
  18. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/text.py +575 -0
  19. package/dist/bundled-resources/runtimes/pi-shell-engine/context.py +52 -0
  20. package/dist/bundled-resources/runtimes/pi-shell-engine/errors.py +49 -0
  21. package/dist/bundled-resources/runtimes/pi-shell-engine/exec.py +734 -0
  22. package/dist/bundled-resources/runtimes/pi-shell-engine/expand.py +238 -0
  23. package/dist/bundled-resources/runtimes/pi-shell-engine/main.py +132 -0
  24. package/dist/bundled-resources/runtimes/pi-shell-engine/nodes.py +116 -0
  25. package/dist/bundled-resources/runtimes/pi-shell-engine/parser.py +287 -0
  26. package/dist/bundled-resources/runtimes/pi-shell-engine/proc.py +137 -0
  27. package/dist/bundled-resources/runtimes/pi-shell-engine/state.py +100 -0
  28. package/dist/bundled-resources/runtimes/pi-shell-engine/tokens.py +579 -0
  29. package/dist/bundled-resources/skills/tool-call-repair/SKILL.md +19 -9
  30. package/dist/bundled-resources/skills/tool-call-repair/references/failure-grammar.md +22 -5
  31. package/dist/bundled-resources/skills/tool-call-repair/references/repair-catalogue.md +5 -5
  32. package/dist/bundled-resources/skills/tool-call-repair/references/text-protocol-grammar.md +28 -7
  33. package/dist/cli/args.d.ts +3 -0
  34. package/dist/cli/args.d.ts.map +1 -1
  35. package/dist/cli/args.js +15 -0
  36. package/dist/cli/args.js.map +1 -1
  37. package/dist/core/agent-paths.d.ts +49 -0
  38. package/dist/core/agent-paths.d.ts.map +1 -0
  39. package/dist/core/agent-paths.js +107 -0
  40. package/dist/core/agent-paths.js.map +1 -0
  41. package/dist/core/agent-session-services.d.ts.map +1 -1
  42. package/dist/core/agent-session-services.js +3 -3
  43. package/dist/core/agent-session-services.js.map +1 -1
  44. package/dist/core/agent-session.d.ts +234 -17
  45. package/dist/core/agent-session.d.ts.map +1 -1
  46. package/dist/core/agent-session.js +484 -62
  47. package/dist/core/agent-session.js.map +1 -1
  48. package/dist/core/autonomy/contracts.d.ts +9 -0
  49. package/dist/core/autonomy/contracts.d.ts.map +1 -1
  50. package/dist/core/autonomy/contracts.js.map +1 -1
  51. package/dist/core/autonomy/lane-tracker.d.ts +10 -1
  52. package/dist/core/autonomy/lane-tracker.d.ts.map +1 -1
  53. package/dist/core/autonomy/lane-tracker.js +5 -1
  54. package/dist/core/autonomy/lane-tracker.js.map +1 -1
  55. package/dist/core/background-lane-controller.d.ts +122 -6
  56. package/dist/core/background-lane-controller.d.ts.map +1 -1
  57. package/dist/core/background-lane-controller.js +447 -90
  58. package/dist/core/background-lane-controller.js.map +1 -1
  59. package/dist/core/bash-execution-controller.d.ts +4 -0
  60. package/dist/core/bash-execution-controller.d.ts.map +1 -1
  61. package/dist/core/bash-execution-controller.js +7 -1
  62. package/dist/core/bash-execution-controller.js.map +1 -1
  63. package/dist/core/compaction-support.d.ts +13 -3
  64. package/dist/core/compaction-support.d.ts.map +1 -1
  65. package/dist/core/compaction-support.js +43 -7
  66. package/dist/core/compaction-support.js.map +1 -1
  67. package/dist/core/context/context-audit.d.ts +33 -1
  68. package/dist/core/context/context-audit.d.ts.map +1 -1
  69. package/dist/core/context/context-audit.js +31 -5
  70. package/dist/core/context/context-audit.js.map +1 -1
  71. package/dist/core/context/sqlite-runtime-index.d.ts.map +1 -1
  72. package/dist/core/context/sqlite-runtime-index.js +13 -7
  73. package/dist/core/context/sqlite-runtime-index.js.map +1 -1
  74. package/dist/core/context-gc.d.ts.map +1 -1
  75. package/dist/core/context-gc.js +16 -1
  76. package/dist/core/context-gc.js.map +1 -1
  77. package/dist/core/context-pipeline.d.ts +26 -4
  78. package/dist/core/context-pipeline.d.ts.map +1 -1
  79. package/dist/core/context-pipeline.js +137 -14
  80. package/dist/core/context-pipeline.js.map +1 -1
  81. package/dist/core/cost-guard.d.ts +19 -3
  82. package/dist/core/cost-guard.d.ts.map +1 -1
  83. package/dist/core/cost-guard.js +18 -3
  84. package/dist/core/cost-guard.js.map +1 -1
  85. package/dist/core/delegation/session-worker-result.d.ts +34 -4
  86. package/dist/core/delegation/session-worker-result.d.ts.map +1 -1
  87. package/dist/core/delegation/session-worker-result.js +64 -4
  88. package/dist/core/delegation/session-worker-result.js.map +1 -1
  89. package/dist/core/delegation/worker-actions.d.ts.map +1 -1
  90. package/dist/core/delegation/worker-actions.js +1 -1
  91. package/dist/core/delegation/worker-actions.js.map +1 -1
  92. package/dist/core/delegation/worker-result.d.ts +42 -1
  93. package/dist/core/delegation/worker-result.d.ts.map +1 -1
  94. package/dist/core/delegation/worker-result.js +68 -0
  95. package/dist/core/delegation/worker-result.js.map +1 -1
  96. package/dist/core/extensions/loader.d.ts.map +1 -1
  97. package/dist/core/extensions/loader.js +23 -7
  98. package/dist/core/extensions/loader.js.map +1 -1
  99. package/dist/core/extensions/runner.d.ts.map +1 -1
  100. package/dist/core/extensions/runner.js +1 -0
  101. package/dist/core/extensions/runner.js.map +1 -1
  102. package/dist/core/extensions/types.d.ts +51 -0
  103. package/dist/core/extensions/types.d.ts.map +1 -1
  104. package/dist/core/extensions/types.js.map +1 -1
  105. package/dist/core/goal-loop-controller.d.ts +17 -1
  106. package/dist/core/goal-loop-controller.d.ts.map +1 -1
  107. package/dist/core/goal-loop-controller.js +79 -11
  108. package/dist/core/goal-loop-controller.js.map +1 -1
  109. package/dist/core/goals/goal-continuation-controller.d.ts +48 -2
  110. package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
  111. package/dist/core/goals/goal-continuation-controller.js +77 -0
  112. package/dist/core/goals/goal-continuation-controller.js.map +1 -1
  113. package/dist/core/goals/goal-continuation-defaults.d.ts +39 -0
  114. package/dist/core/goals/goal-continuation-defaults.d.ts.map +1 -1
  115. package/dist/core/goals/goal-continuation-defaults.js +42 -0
  116. package/dist/core/goals/goal-continuation-defaults.js.map +1 -1
  117. package/dist/core/goals/goal-continuation-prompt.d.ts +4 -0
  118. package/dist/core/goals/goal-continuation-prompt.d.ts.map +1 -1
  119. package/dist/core/goals/goal-continuation-prompt.js +51 -10
  120. package/dist/core/goals/goal-continuation-prompt.js.map +1 -1
  121. package/dist/core/goals/goal-runtime-snapshot.d.ts +101 -2
  122. package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -1
  123. package/dist/core/goals/goal-runtime-snapshot.js +87 -4
  124. package/dist/core/goals/goal-runtime-snapshot.js.map +1 -1
  125. package/dist/core/goals/goal-state.d.ts +89 -1
  126. package/dist/core/goals/goal-state.d.ts.map +1 -1
  127. package/dist/core/goals/goal-state.js +71 -5
  128. package/dist/core/goals/goal-state.js.map +1 -1
  129. package/dist/core/goals/goal-tool-core.d.ts +56 -2
  130. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  131. package/dist/core/goals/goal-tool-core.js +111 -5
  132. package/dist/core/goals/goal-tool-core.js.map +1 -1
  133. package/dist/core/goals/session-goal-state.d.ts +11 -2
  134. package/dist/core/goals/session-goal-state.d.ts.map +1 -1
  135. package/dist/core/goals/session-goal-state.js +32 -17
  136. package/dist/core/goals/session-goal-state.js.map +1 -1
  137. package/dist/core/keybindings.d.ts +10 -0
  138. package/dist/core/keybindings.d.ts.map +1 -1
  139. package/dist/core/keybindings.js +10 -2
  140. package/dist/core/keybindings.js.map +1 -1
  141. package/dist/core/learning/observation-store.d.ts +12 -3
  142. package/dist/core/learning/observation-store.d.ts.map +1 -1
  143. package/dist/core/learning/observation-store.js +30 -15
  144. package/dist/core/learning/observation-store.js.map +1 -1
  145. package/dist/core/learning/skill-curator.d.ts +5 -1
  146. package/dist/core/learning/skill-curator.d.ts.map +1 -1
  147. package/dist/core/learning/skill-curator.js +21 -19
  148. package/dist/core/learning/skill-curator.js.map +1 -1
  149. package/dist/core/local-runtime-controller.d.ts +65 -3
  150. package/dist/core/local-runtime-controller.d.ts.map +1 -1
  151. package/dist/core/local-runtime-controller.js +186 -26
  152. package/dist/core/local-runtime-controller.js.map +1 -1
  153. package/dist/core/memory/providers/file-store.d.ts +1 -1
  154. package/dist/core/memory/providers/file-store.d.ts.map +1 -1
  155. package/dist/core/memory/providers/file-store.js +6 -6
  156. package/dist/core/memory/providers/file-store.js.map +1 -1
  157. package/dist/core/model-capability.d.ts +34 -0
  158. package/dist/core/model-capability.d.ts.map +1 -1
  159. package/dist/core/model-capability.js +42 -1
  160. package/dist/core/model-capability.js.map +1 -1
  161. package/dist/core/model-router/tool-escalation.d.ts +15 -0
  162. package/dist/core/model-router/tool-escalation.d.ts.map +1 -1
  163. package/dist/core/model-router/tool-escalation.js +23 -1
  164. package/dist/core/model-router/tool-escalation.js.map +1 -1
  165. package/dist/core/model-router-controller.d.ts +34 -7
  166. package/dist/core/model-router-controller.d.ts.map +1 -1
  167. package/dist/core/model-router-controller.js +95 -16
  168. package/dist/core/model-router-controller.js.map +1 -1
  169. package/dist/core/models/adaptation-store.d.ts +7 -0
  170. package/dist/core/models/adaptation-store.d.ts.map +1 -1
  171. package/dist/core/models/adaptation-store.js +47 -11
  172. package/dist/core/models/adaptation-store.js.map +1 -1
  173. package/dist/core/models/default-model-suggestions.d.ts.map +1 -1
  174. package/dist/core/models/default-model-suggestions.js +17 -0
  175. package/dist/core/models/default-model-suggestions.js.map +1 -1
  176. package/dist/core/models/fitness-store.d.ts +3 -0
  177. package/dist/core/models/fitness-store.d.ts.map +1 -1
  178. package/dist/core/models/fitness-store.js +11 -2
  179. package/dist/core/models/fitness-store.js.map +1 -1
  180. package/dist/core/models/llamacpp-runtime.d.ts +180 -0
  181. package/dist/core/models/llamacpp-runtime.d.ts.map +1 -0
  182. package/dist/core/models/llamacpp-runtime.js +475 -0
  183. package/dist/core/models/llamacpp-runtime.js.map +1 -0
  184. package/dist/core/models/local-registration.d.ts +40 -0
  185. package/dist/core/models/local-registration.d.ts.map +1 -1
  186. package/dist/core/models/local-registration.js +94 -5
  187. package/dist/core/models/local-registration.js.map +1 -1
  188. package/dist/core/models/local-runtime.d.ts.map +1 -1
  189. package/dist/core/models/local-runtime.js +9 -7
  190. package/dist/core/models/local-runtime.js.map +1 -1
  191. package/dist/core/models/model-ref.d.ts +7 -0
  192. package/dist/core/models/model-ref.d.ts.map +1 -1
  193. package/dist/core/models/model-ref.js +26 -0
  194. package/dist/core/models/model-ref.js.map +1 -1
  195. package/dist/core/models/needle-runtime.d.ts +257 -0
  196. package/dist/core/models/needle-runtime.d.ts.map +1 -0
  197. package/dist/core/models/needle-runtime.js +519 -0
  198. package/dist/core/models/needle-runtime.js.map +1 -0
  199. package/dist/core/models/prism-llamacpp-lifecycle.d.ts +89 -0
  200. package/dist/core/models/prism-llamacpp-lifecycle.d.ts.map +1 -0
  201. package/dist/core/models/prism-llamacpp-lifecycle.js +121 -0
  202. package/dist/core/models/prism-llamacpp-lifecycle.js.map +1 -0
  203. package/dist/core/package-manager.d.ts.map +1 -1
  204. package/dist/core/package-manager.js +11 -10
  205. package/dist/core/package-manager.js.map +1 -1
  206. package/dist/core/process-matrix/codes.d.ts +72 -0
  207. package/dist/core/process-matrix/codes.d.ts.map +1 -0
  208. package/dist/core/process-matrix/codes.js +15 -0
  209. package/dist/core/process-matrix/codes.js.map +1 -0
  210. package/dist/core/process-matrix/runtime.d.ts +63 -0
  211. package/dist/core/process-matrix/runtime.d.ts.map +1 -0
  212. package/dist/core/process-matrix/runtime.js +310 -0
  213. package/dist/core/process-matrix/runtime.js.map +1 -0
  214. package/dist/core/process-matrix/store.d.ts +22 -0
  215. package/dist/core/process-matrix/store.d.ts.map +1 -0
  216. package/dist/core/process-matrix/store.js +80 -0
  217. package/dist/core/process-matrix/store.js.map +1 -0
  218. package/dist/core/process-matrix/supervisor.d.ts +72 -0
  219. package/dist/core/process-matrix/supervisor.d.ts.map +1 -0
  220. package/dist/core/process-matrix/supervisor.js +130 -0
  221. package/dist/core/process-matrix/supervisor.js.map +1 -0
  222. package/dist/core/profile-registry.d.ts +7 -0
  223. package/dist/core/profile-registry.d.ts.map +1 -1
  224. package/dist/core/profile-registry.js +20 -0
  225. package/dist/core/profile-registry.js.map +1 -1
  226. package/dist/core/python-runtime.d.ts.map +1 -1
  227. package/dist/core/python-runtime.js +3 -3
  228. package/dist/core/python-runtime.js.map +1 -1
  229. package/dist/core/reflection-controller.d.ts +29 -5
  230. package/dist/core/reflection-controller.d.ts.map +1 -1
  231. package/dist/core/reflection-controller.js +215 -126
  232. package/dist/core/reflection-controller.js.map +1 -1
  233. package/dist/core/reload-blockers.d.ts +36 -0
  234. package/dist/core/reload-blockers.d.ts.map +1 -1
  235. package/dist/core/reload-blockers.js +44 -0
  236. package/dist/core/reload-blockers.js.map +1 -1
  237. package/dist/core/resource-loader.d.ts.map +1 -1
  238. package/dist/core/resource-loader.js +8 -7
  239. package/dist/core/resource-loader.js.map +1 -1
  240. package/dist/core/runtime-builder.d.ts +58 -5
  241. package/dist/core/runtime-builder.d.ts.map +1 -1
  242. package/dist/core/runtime-builder.js +209 -25
  243. package/dist/core/runtime-builder.js.map +1 -1
  244. package/dist/core/scout-controller.d.ts +6 -0
  245. package/dist/core/scout-controller.d.ts.map +1 -1
  246. package/dist/core/scout-controller.js +66 -52
  247. package/dist/core/scout-controller.js.map +1 -1
  248. package/dist/core/sdk.d.ts.map +1 -1
  249. package/dist/core/sdk.js +3 -3
  250. package/dist/core/sdk.js.map +1 -1
  251. package/dist/core/session-role.d.ts +31 -0
  252. package/dist/core/session-role.d.ts.map +1 -0
  253. package/dist/core/session-role.js +52 -0
  254. package/dist/core/session-role.js.map +1 -0
  255. package/dist/core/settings-manager.d.ts +42 -3
  256. package/dist/core/settings-manager.d.ts.map +1 -1
  257. package/dist/core/settings-manager.js +94 -60
  258. package/dist/core/settings-manager.js.map +1 -1
  259. package/dist/core/system-prompt-builder.d.ts +12 -0
  260. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  261. package/dist/core/system-prompt-builder.js +6 -0
  262. package/dist/core/system-prompt-builder.js.map +1 -1
  263. package/dist/core/system-prompt.d.ts +14 -1
  264. package/dist/core/system-prompt.d.ts.map +1 -1
  265. package/dist/core/system-prompt.js +20 -3
  266. package/dist/core/system-prompt.js.map +1 -1
  267. package/dist/core/tasks/session-task-state.d.ts +11 -2
  268. package/dist/core/tasks/session-task-state.d.ts.map +1 -1
  269. package/dist/core/tasks/session-task-state.js +27 -11
  270. package/dist/core/tasks/session-task-state.js.map +1 -1
  271. package/dist/core/tasks/task-contract-monitor.d.ts +45 -0
  272. package/dist/core/tasks/task-contract-monitor.d.ts.map +1 -0
  273. package/dist/core/tasks/task-contract-monitor.js +56 -0
  274. package/dist/core/tasks/task-contract-monitor.js.map +1 -0
  275. package/dist/core/tasks/task-state.d.ts +8 -0
  276. package/dist/core/tasks/task-state.d.ts.map +1 -1
  277. package/dist/core/tasks/task-state.js +28 -1
  278. package/dist/core/tasks/task-state.js.map +1 -1
  279. package/dist/core/tool-gate-controller.d.ts.map +1 -1
  280. package/dist/core/tool-gate-controller.js +5 -0
  281. package/dist/core/tool-gate-controller.js.map +1 -1
  282. package/dist/core/tool-recovery-log-records.d.ts +7 -0
  283. package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
  284. package/dist/core/tool-recovery-log-records.js +14 -6
  285. package/dist/core/tool-recovery-log-records.js.map +1 -1
  286. package/dist/core/tool-selection/promotion.d.ts +54 -0
  287. package/dist/core/tool-selection/promotion.d.ts.map +1 -0
  288. package/dist/core/tool-selection/promotion.js +81 -0
  289. package/dist/core/tool-selection/promotion.js.map +1 -0
  290. package/dist/core/tool-selection/tool-performance-store.d.ts +37 -0
  291. package/dist/core/tool-selection/tool-performance-store.d.ts.map +1 -1
  292. package/dist/core/tool-selection/tool-performance-store.js +87 -3
  293. package/dist/core/tool-selection/tool-performance-store.js.map +1 -1
  294. package/dist/core/tool-selection/tool-selection-controller.d.ts +45 -0
  295. package/dist/core/tool-selection/tool-selection-controller.d.ts.map +1 -1
  296. package/dist/core/tool-selection/tool-selection-controller.js +96 -0
  297. package/dist/core/tool-selection/tool-selection-controller.js.map +1 -1
  298. package/dist/core/tools/bash.d.ts +18 -0
  299. package/dist/core/tools/bash.d.ts.map +1 -1
  300. package/dist/core/tools/bash.js +97 -18
  301. package/dist/core/tools/bash.js.map +1 -1
  302. package/dist/core/tools/delegate-status.d.ts +14 -0
  303. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  304. package/dist/core/tools/delegate-status.js +82 -7
  305. package/dist/core/tools/delegate-status.js.map +1 -1
  306. package/dist/core/tools/delegate.d.ts.map +1 -1
  307. package/dist/core/tools/delegate.js +25 -8
  308. package/dist/core/tools/delegate.js.map +1 -1
  309. package/dist/core/tools/find.d.ts.map +1 -1
  310. package/dist/core/tools/find.js +52 -44
  311. package/dist/core/tools/find.js.map +1 -1
  312. package/dist/core/tools/goal.d.ts +94 -3
  313. package/dist/core/tools/goal.d.ts.map +1 -1
  314. package/dist/core/tools/goal.js +165 -15
  315. package/dist/core/tools/goal.js.map +1 -1
  316. package/dist/core/tools/grep.d.ts.map +1 -1
  317. package/dist/core/tools/grep.js +5 -4
  318. package/dist/core/tools/grep.js.map +1 -1
  319. package/dist/core/tools/model-fitness.d.ts +7 -0
  320. package/dist/core/tools/model-fitness.d.ts.map +1 -1
  321. package/dist/core/tools/model-fitness.js +2 -2
  322. package/dist/core/tools/model-fitness.js.map +1 -1
  323. package/dist/core/tools/render-utils.d.ts.map +1 -1
  324. package/dist/core/tools/render-utils.js +1 -1
  325. package/dist/core/tools/render-utils.js.map +1 -1
  326. package/dist/core/tools/shell-contract-router.d.ts +6 -1
  327. package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
  328. package/dist/core/tools/shell-contract-router.js +69 -13
  329. package/dist/core/tools/shell-contract-router.js.map +1 -1
  330. package/dist/core/tools/shell-session.d.ts +89 -0
  331. package/dist/core/tools/shell-session.d.ts.map +1 -0
  332. package/dist/core/tools/shell-session.js +432 -0
  333. package/dist/core/tools/shell-session.js.map +1 -0
  334. package/dist/core/tools/task-steps.d.ts +4 -0
  335. package/dist/core/tools/task-steps.d.ts.map +1 -1
  336. package/dist/core/tools/task-steps.js +63 -8
  337. package/dist/core/tools/task-steps.js.map +1 -1
  338. package/dist/core/tools/tmux-dispatch.d.ts +86 -0
  339. package/dist/core/tools/tmux-dispatch.d.ts.map +1 -0
  340. package/dist/core/tools/tmux-dispatch.js +91 -0
  341. package/dist/core/tools/tmux-dispatch.js.map +1 -0
  342. package/dist/core/tools/windows-shell-engine.d.ts +42 -0
  343. package/dist/core/tools/windows-shell-engine.d.ts.map +1 -0
  344. package/dist/core/tools/windows-shell-engine.js +153 -0
  345. package/dist/core/tools/windows-shell-engine.js.map +1 -0
  346. package/dist/core/tools/windows-shell-state.d.ts +40 -0
  347. package/dist/core/tools/windows-shell-state.d.ts.map +1 -0
  348. package/dist/core/tools/windows-shell-state.js +59 -0
  349. package/dist/core/tools/windows-shell-state.js.map +1 -0
  350. package/dist/core/tools/worktree-sync.d.ts +24 -0
  351. package/dist/core/tools/worktree-sync.d.ts.map +1 -0
  352. package/dist/core/tools/worktree-sync.js +338 -0
  353. package/dist/core/tools/worktree-sync.js.map +1 -0
  354. package/dist/core/trust-manager.d.ts +4 -1
  355. package/dist/core/trust-manager.d.ts.map +1 -1
  356. package/dist/core/trust-manager.js +20 -2
  357. package/dist/core/trust-manager.js.map +1 -1
  358. package/dist/core/util/atomic-file.d.ts +55 -0
  359. package/dist/core/util/atomic-file.d.ts.map +1 -0
  360. package/dist/core/util/atomic-file.js +255 -0
  361. package/dist/core/util/atomic-file.js.map +1 -0
  362. package/dist/core/util/minimatch-cache.d.ts +33 -0
  363. package/dist/core/util/minimatch-cache.d.ts.map +1 -0
  364. package/dist/core/util/minimatch-cache.js +0 -0
  365. package/dist/core/util/minimatch-cache.js.map +1 -0
  366. package/dist/core/worktree-sync/codes.d.ts +227 -0
  367. package/dist/core/worktree-sync/codes.d.ts.map +1 -0
  368. package/dist/core/worktree-sync/codes.js +14 -0
  369. package/dist/core/worktree-sync/codes.js.map +1 -0
  370. package/dist/core/worktree-sync/git-engine.d.ts +156 -0
  371. package/dist/core/worktree-sync/git-engine.d.ts.map +1 -0
  372. package/dist/core/worktree-sync/git-engine.js +1191 -0
  373. package/dist/core/worktree-sync/git-engine.js.map +1 -0
  374. package/dist/core/worktree-sync/lane-gate.d.ts +75 -0
  375. package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -0
  376. package/dist/core/worktree-sync/lane-gate.js +360 -0
  377. package/dist/core/worktree-sync/lane-gate.js.map +1 -0
  378. package/dist/core/worktree-sync/runtime.d.ts +47 -0
  379. package/dist/core/worktree-sync/runtime.d.ts.map +1 -0
  380. package/dist/core/worktree-sync/runtime.js +96 -0
  381. package/dist/core/worktree-sync/runtime.js.map +1 -0
  382. package/dist/core/worktree-sync/store.d.ts +69 -0
  383. package/dist/core/worktree-sync/store.d.ts.map +1 -0
  384. package/dist/core/worktree-sync/store.js +247 -0
  385. package/dist/core/worktree-sync/store.js.map +1 -0
  386. package/dist/core/worktree-sync/watcher.d.ts +29 -0
  387. package/dist/core/worktree-sync/watcher.d.ts.map +1 -0
  388. package/dist/core/worktree-sync/watcher.js +93 -0
  389. package/dist/core/worktree-sync/watcher.js.map +1 -0
  390. package/dist/main.d.ts.map +1 -1
  391. package/dist/main.js +94 -0
  392. package/dist/main.js.map +1 -1
  393. package/dist/migrations.d.ts +9 -0
  394. package/dist/migrations.d.ts.map +1 -1
  395. package/dist/migrations.js +38 -0
  396. package/dist/migrations.js.map +1 -1
  397. package/dist/modes/interactive/auto-learn-controller.d.ts +16 -1
  398. package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
  399. package/dist/modes/interactive/auto-learn-controller.js +50 -8
  400. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  401. package/dist/modes/interactive/components/profile-resource-editor.d.ts.map +1 -1
  402. package/dist/modes/interactive/components/profile-resource-editor.js +23 -1
  403. package/dist/modes/interactive/components/profile-resource-editor.js.map +1 -1
  404. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  405. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  406. package/dist/modes/interactive/interactive-mode.js +4 -0
  407. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  408. package/dist/modes/interactive/local-model-commands.d.ts +43 -0
  409. package/dist/modes/interactive/local-model-commands.d.ts.map +1 -1
  410. package/dist/modes/interactive/local-model-commands.js +290 -3
  411. package/dist/modes/interactive/local-model-commands.js.map +1 -1
  412. package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
  413. package/dist/modes/interactive/session-flow-commands.js +24 -4
  414. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  415. package/dist/utils/fs-watch.d.ts +11 -0
  416. package/dist/utils/fs-watch.d.ts.map +1 -1
  417. package/dist/utils/fs-watch.js +20 -2
  418. package/dist/utils/fs-watch.js.map +1 -1
  419. package/dist/utils/highlight-js-languages.d.ts +4 -0
  420. package/dist/utils/highlight-js-languages.d.ts.map +1 -0
  421. package/dist/utils/highlight-js-languages.js +573 -0
  422. package/dist/utils/highlight-js-languages.js.map +1 -0
  423. package/dist/utils/shell.d.ts +7 -1
  424. package/dist/utils/shell.d.ts.map +1 -1
  425. package/dist/utils/shell.js +39 -9
  426. package/dist/utils/shell.js.map +1 -1
  427. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  428. package/dist/utils/syntax-highlight.js +53 -5
  429. package/dist/utils/syntax-highlight.js.map +1 -1
  430. package/dist/utils/tools-manager.d.ts.map +1 -1
  431. package/dist/utils/tools-manager.js +112 -1
  432. package/dist/utils/tools-manager.js.map +1 -1
  433. package/docs/development.md +2 -0
  434. package/docs/packages.md +1 -1
  435. package/docs/process-matrix.md +120 -0
  436. package/docs/settings.md +5 -2
  437. package/docs/tmux-agent-manager.md +85 -2
  438. package/docs/windows.md +52 -3
  439. package/docs/work-directory.md +29 -0
  440. package/docs/worktree-sync.md +250 -0
  441. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  442. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  443. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  444. package/examples/extensions/sandbox/package-lock.json +2 -2
  445. package/examples/extensions/sandbox/package.json +1 -1
  446. package/examples/extensions/with-deps/package-lock.json +2 -2
  447. package/examples/extensions/with-deps/package.json +1 -1
  448. package/npm-shrinkwrap.json +12 -12
  449. package/package.json +10 -4
  450. package/docs/integration-sweep-builder-blueprint-2026-07-09.md +0 -365
  451. package/docs/integration-sweep-resume-2026-07-09.md +0 -407
@@ -32,9 +32,11 @@
32
32
  * load / unload / reconcile API and for `getAllTools` / `getToolDefinition`, and a private
33
33
  * `_refreshToolRegistry` delegation for its internal callers.
34
34
  */
35
+ import { createHash } from "node:crypto";
35
36
  import { existsSync, readFileSync } from "node:fs";
36
37
  import { isAbsolute, join } from "node:path";
37
38
  import { DEFAULT_ACTIVE_TOOL_NAMES, mapToolNamesForPlatform } from "./default-tool-surface.js";
39
+ import { acknowledgeWorkerResultReview } from "./delegation/session-worker-result.js";
38
40
  import { createCoreDiagnosticsToolDefinitions } from "./extensions/builtin.js";
39
41
  import { ExtensionRunner, wrapRegisteredTools, } from "./extensions/index.js";
40
42
  import { disposeExtensionEventSubscriptions } from "./extensions/loader.js";
@@ -42,7 +44,9 @@ import { emitSessionShutdownEvent } from "./extensions/runner.js";
42
44
  import { resolveCliModel } from "./model-resolver.js";
43
45
  import { evaluateSurfaceFitness } from "./model-router/fitness-gate.js";
44
46
  import { FitnessStore } from "./models/fitness-store.js";
47
+ import { describeInFlightWorkUnit, getInFlightWorkUnits } from "./reload-blockers.js";
45
48
  import { ScoutController } from "./scout-controller.js";
49
+ import { getSessionRole, isWorkerSession, WORKER_FORBIDDEN_TOOLS } from "./session-role.js";
46
50
  import { matchesResourceProfilePattern, } from "./settings-manager.js";
47
51
  import { createSyntheticSourceInfo } from "./source-info.js";
48
52
  import { buildReflexUserPrompt, parseReflexPlan, REFLEX_INTERPRETER_SYSTEM_PROMPT, } from "./toolkit/reflex-interpreter.js";
@@ -55,10 +59,51 @@ import { createGoalToolDefinition } from "./tools/goal.js";
55
59
  import { createGrepTool } from "./tools/grep.js";
56
60
  import { createAllToolDefinitions } from "./tools/index.js";
57
61
  import { createModelFitnessToolDefinition } from "./tools/model-fitness.js";
62
+ import { resolveToCwd } from "./tools/path-utils.js";
58
63
  import { createReadTool } from "./tools/read.js";
59
64
  import { createRunToolkitScriptToolDefinition } from "./tools/run-toolkit-script.js";
60
65
  import { createTaskStepsToolDefinition } from "./tools/task-steps.js";
66
+ import { dispatchTmuxWorker } from "./tools/tmux-dispatch.js";
61
67
  import { createToolDefinitionFromAgentTool } from "./tools/tool-definition-wrapper.js";
68
+ import { createWorktreeSyncToolDefinition } from "./tools/worktree-sync.js";
69
+ import { createLane } from "./worktree-sync/git-engine.js";
70
+ import { WorktreeLaneGate } from "./worktree-sync/lane-gate.js";
71
+ import { buildWorktreeSyncEngineDeps, getBoundWorktreeLaneKey } from "./worktree-sync/runtime.js";
72
+ /**
73
+ * Deterministic `addSpawnedUsage` reportId: `kind` + session id + a content hash of `identity`
74
+ * (never `Date.now`/random). Same identity on a retry of the same logical work unit yields the same
75
+ * id, so the ledger's `seenSubagentReportIds` dedupe catches a duplicate report instead of
76
+ * double-counting spend.
77
+ */
78
+ function deriveSpawnedUsageReportId(kind, sessionId, identity) {
79
+ const digest = createHash("sha256").update(identity).digest("hex").slice(0, 16);
80
+ return `${kind}:${sessionId}:${digest}`;
81
+ }
82
+ /**
83
+ * Is `toolCallId` a real, answered tool call on `sessionManager`'s active branch? A
84
+ * toolCallId is "real" iff a toolResult message on that branch responded to it -- the same
85
+ * toolResult/toolCallId match `context-pipeline.ts`'s `_buildSessionEntryIdLookup` uses, and
86
+ * branch-scoped (via `getBranch()`) so a sibling branch's tool calls never count. Exported (pure,
87
+ * no `this`) so the goal tool's `hasToolCallId` wiring below is directly testable against a real
88
+ * `SessionManager` without constructing the whole `RuntimeBuilder`.
89
+ */
90
+ export function hasAnsweredToolCallOnBranch(sessionManager, toolCallId) {
91
+ return sessionManager
92
+ .getBranch()
93
+ .some((entry) => entry.type === "message" && entry.message.role === "toolResult" && entry.message.toolCallId === toolCallId);
94
+ }
95
+ /**
96
+ * Project a task-steps snapshot down to the OPEN (non-terminal) steps the goal tool's
97
+ * cross-visibility nudge needs. Mirrors `goal-runtime-snapshot.ts`'s `openTaskSteps` filter
98
+ * (status not "completed"/"cancelled", `activeForm || content`) so the two read the same
99
+ * "open" definition, narrowed to `OpenTaskStepRef`'s id+content shape. Exported (pure, no
100
+ * `this`) so the goal tool's `getOpenTaskSteps` wiring below is directly testable.
101
+ */
102
+ export function deriveOpenTaskStepRefs(taskStepsState) {
103
+ return (taskStepsState?.steps ?? [])
104
+ .filter((step) => step.status !== "completed" && step.status !== "cancelled")
105
+ .map((step) => ({ id: step.id, content: step.activeForm || step.content }));
106
+ }
62
107
  /**
63
108
  * Owns the tool-registry build and the self-modification-safe extension reload extracted from
64
109
  * {@link AgentSession}. See the module header for the snapshot-ownership and host-binding boundaries.
@@ -89,6 +134,9 @@ export class RuntimeBuilder {
89
134
  streamFn: this.deps.getAgent().streamFn,
90
135
  fileExists: (path) => existsSync(resolveCwdPath(cwd, path)),
91
136
  countLines: (path) => countFileLines(resolveCwdPath(cwd, path)),
137
+ // Lets the scout register itself in the reload-gate quiesce registry (see
138
+ // reload-blockers.ts) for its own agentDir — the same key `_assertReloadQuiescent` reads.
139
+ getAgentDir: () => this.deps.getAgentDir(),
92
140
  });
93
141
  return controller.run(query, maxTurns);
94
142
  }
@@ -124,6 +172,7 @@ export class RuntimeBuilder {
124
172
  return this._toolDefinitions.get(name)?.definition;
125
173
  }
126
174
  refreshToolRegistry(options) {
175
+ const role = getSessionRole();
127
176
  const previousRegistryNames = new Set(this._toolRegistry.keys());
128
177
  // Re-derive from the pre-filter REQUEST, never from agent.state.tools: the active set is
129
178
  // capability/profile-filtered, so feeding it back through setActiveToolsByName would
@@ -145,6 +194,11 @@ export class RuntimeBuilder {
145
194
  }
146
195
  : undefined;
147
196
  const isAllowedTool = (name) => {
197
+ // Strict worker UAC ceiling: wins over allow-list/exclude/profile -- a worker session
198
+ // (lane-bound or dispatched) can never activate this tool no matter how permissively the
199
+ // active profile or an explicit request names it. See session-role.ts.
200
+ if (role === "worker" && WORKER_FORBIDDEN_TOOLS.has(name))
201
+ return false;
148
202
  if (allowedToolNames && !allowedToolNames.has(name))
149
203
  return false;
150
204
  if (excludedToolNames?.has(name))
@@ -262,7 +316,7 @@ export class RuntimeBuilder {
262
316
  nextActiveToolNames.push(toolName);
263
317
  }
264
318
  }
265
- // G13: an explicit grant that binds to NO registered tool is a silent no-op — typo'd
319
+ // An explicit grant that binds to NO registered tool is a silent no-op — typo'd
266
320
  // name, or the owning extension is not granted/loaded. Surface it.
267
321
  this.deps.setUnboundToolGrantWarnings(explicitAllowPatterns
268
322
  .filter((pattern) => !boundPatterns.has(pattern))
@@ -383,7 +437,7 @@ export class RuntimeBuilder {
383
437
  ? Object.fromEntries(Object.entries(baseToolsOverride).map(([name, tool]) => [name, createToolDefinitionFromAgentTool(tool)]))
384
438
  : createAllToolDefinitions(this.deps.getCwd(), {
385
439
  read: { autoResizeImages },
386
- bash: { commandPrefix: shellCommandPrefix, shellPath },
440
+ bash: { commandPrefix: shellCommandPrefix, shellPath, sessionKey: this.deps.getShellSessionKey() },
387
441
  grep: { artifactStore: toolArtifactStore },
388
442
  find: { artifactStore: toolArtifactStore },
389
443
  artifact_retrieve: { artifactStore: toolArtifactStore },
@@ -393,11 +447,67 @@ export class RuntimeBuilder {
393
447
  for (const definition of createCoreDiagnosticsToolDefinitions(() => this.deps.getActiveToolNames(), () => this.getAllTools(), (messages) => this.deps.getContextGcReport(messages), () => this.deps.getMemoryAuditDiagnostics())) {
394
448
  this._baseToolDefinitions.set(definition.name, definition);
395
449
  }
450
+ // Hoisted above the goal-tool registration (rather than declared only inside the
451
+ // worktreeSync-enabled block further below) so the SAME settings/deps factory backs both
452
+ // the goal->tmux lane-first dispatch dep (`createLaneWorktree`, immediately below) and the
453
+ // `worktree_sync` tool registration later in this method -- one source of truth, no drift.
454
+ const worktreeSyncSettings = settingsManager.getWorktreeSyncSettings();
455
+ const worktreeSyncEngineDeps = () => buildWorktreeSyncEngineDeps({
456
+ cwd: this.deps.getCwd(),
457
+ agentDir: this.deps.getAgentDir(),
458
+ settingsManager: this.deps.getSettingsManager(),
459
+ sessionId: this.deps.getSessionManager().getSessionId(),
460
+ });
396
461
  const goalToolDefinition = createGoalToolDefinition({
397
462
  getGoalState: () => this.deps.getGoalStateSnapshot(),
398
463
  saveGoalState: (state) => {
399
464
  this.deps.saveGoalStateSnapshot(state);
400
465
  },
466
+ // kind:"tool" evidence refs verify against real session records.
467
+ hasToolCallId: (toolCallId) => hasAnsweredToolCallOnBranch(this.deps.getSessionManager(), toolCallId),
468
+ // kind:"worker" evidence refs verify against the SAME live lane/result accessors the
469
+ // delegate_status tool already uses below -- live wiring (these were declared optional
470
+ // and read-defensive on the goal-tool deps type).
471
+ getLaneRecords: () => this.deps.getWorkerLaneRecords(),
472
+ getWorkerResultSnapshots: () => this.deps.getWorkerResultSnapshots(),
473
+ // dispatch_worker's tool-layer side effect for the default (in_process) route: starts a
474
+ // real in-process worker lane through the SAME starter the delegate tool uses (below),
475
+ // adapted from its `{started:true;record}|{started:false;skipReason}` shape onto this
476
+ // tool's narrower `{laneId}|{skipReason}` shape.
477
+ startWorkerDelegation: (args) => {
478
+ const outcome = this.deps.startWorkerDelegation({ instructions: args.instructions });
479
+ return outcome.started ? { laneId: outcome.record.laneId } : { skipReason: outcome.skipReason };
480
+ },
481
+ // dispatch_worker's tool-layer side effect for `dispatchTarget:"tmux"`: core structurally
482
+ // invokes the SAME tmux_agent_manager fire_task call the model itself would make (no
483
+ // extension change, no faked launch/laneId) -- see tmux-dispatch.ts's doc comment.
484
+ dispatchTmuxWorker: (args) => dispatchTmuxWorker({
485
+ getToolDefinition: (name) => this.getToolDefinition(name),
486
+ createExtensionContext: () => this.deps.getExtensionRunner().createContext(),
487
+ resolveManagedLaneId: (id) => this.deps.resolveManagedLaneId(id),
488
+ getGoalId: () => this.deps.getGoalStateSnapshot()?.goalId,
489
+ evaluateWorkerLaneRefusal: () => this.deps.getLaneWorkerRefusal(),
490
+ // Lane-first dispatch, wired ONLY when worktree-sync is enabled -- absent otherwise,
491
+ // so a disabled/default session gets the existing byte-identical fire_task params.
492
+ createLaneWorktree: worktreeSyncSettings.enabled
493
+ ? async (laneArgs) => {
494
+ const created = await createLane(worktreeSyncEngineDeps(), {
495
+ ...(laneArgs.goalId !== undefined ? { goalId: laneArgs.goalId } : {}),
496
+ requirementId: laneArgs.requirementId,
497
+ });
498
+ // Never fake a lane: any non-"ok" engine code (max lanes, invalid key, git
499
+ // error, ...) is refused, mapped by the caller onto the stable
500
+ // "worktree_create_failed" skip reason before any fire_task call runs.
501
+ if (created.code !== "ok")
502
+ return { skipReason: created.code };
503
+ return { laneKey: created.lane.laneKey, worktreePath: created.lane.worktreePath };
504
+ }
505
+ : undefined,
506
+ }, args),
507
+ cwd: () => this.deps.getCwd(),
508
+ // Reuses the already branch-scoped getTaskStepsStateSnapshot dep -- no new
509
+ // SessionManager access needed for the cross-visibility nudge.
510
+ getOpenTaskSteps: () => deriveOpenTaskStepRefs(this.deps.getTaskStepsStateSnapshot()),
401
511
  });
402
512
  this._baseToolDefinitions.set(goalToolDefinition.name, goalToolDefinition);
403
513
  const taskStepsToolDefinition = createTaskStepsToolDefinition({
@@ -414,6 +524,10 @@ export class RuntimeBuilder {
414
524
  const delegateStatusToolDefinition = createDelegateStatusToolDefinition({
415
525
  getLaneRecords: () => this.deps.getWorkerLaneRecords(),
416
526
  getWorkerResultSnapshots: () => this.deps.getWorkerResultSnapshots(),
527
+ // Durable ack persists straight through the session log; routed here (rather than
528
+ // a new agent-session dep) because getSessionManager() is already a stable, generic
529
+ // passthrough dep, so no other package needs to change for this to work.
530
+ acknowledgeWorkerReview: (requestId) => acknowledgeWorkerResultReview(this.deps.getSessionManager(), requestId),
417
531
  });
418
532
  this._baseToolDefinitions.set(delegateToolDefinition.name, delegateToolDefinition);
419
533
  this._baseToolDefinitions.set(delegateStatusToolDefinition.name, delegateStatusToolDefinition);
@@ -452,14 +566,69 @@ export class RuntimeBuilder {
452
566
  thinkingLevel: "off",
453
567
  maxTokens: 256,
454
568
  cacheRetention: "short",
569
+ // Stable per-lane synthetic affinity key so repeat ambiguous-request
570
+ // interpretations hit the same cache-warm backend.
571
+ laneKind: "toolkit-brain",
455
572
  });
456
573
  if (completion.usage.cost.total > 0 || completion.usage.totalTokens > 0) {
457
- this.deps.addSpawnedUsage(completion.usage, { label: "toolkit-brain" });
574
+ // `reportId` keyed on the ambiguous request text driving THIS interpretation —
575
+ // stable across a retry of the same tool call, distinct across genuinely
576
+ // different requests.
577
+ const reportId = deriveSpawnedUsageReportId("toolkit-brain", this.deps.getSessionManager().getSessionId(), request);
578
+ this.deps.addSpawnedUsage(completion.usage, { label: "toolkit-brain", reportId });
458
579
  }
459
580
  return parseReflexPlan(completion.text);
460
581
  },
461
582
  });
462
583
  this._baseToolDefinitions.set(runToolkitScriptToolDefinition.name, runToolkitScriptToolDefinition);
584
+ // Worktree-sync (opt-in): the closed-action lane workflow tool, plus -- for a session
585
+ // launched lane-bound (PI_WORKTREE_LANE) -- the G8/G10 lane gate wrapped UNDER the
586
+ // file-mutation tools (edit/write, plus cooperative bash only for interactive lanes), so a sync_required lane fails closed with the
587
+ // exact recovery step rather than relying on prompt compliance. `worktreeSyncSettings` /
588
+ // `worktreeSyncEngineDeps` are hoisted above (declared before the goal-tool registration)
589
+ // so the goal->tmux lane-first dispatch dep and this tool share one settings/deps source.
590
+ if (worktreeSyncSettings.enabled) {
591
+ const worktreeSyncToolDefinition = createWorktreeSyncToolDefinition({
592
+ engineDeps: worktreeSyncEngineDeps,
593
+ settings: () => this.deps.getSettingsManager().getWorktreeSyncSettings(),
594
+ boundLaneKey: () => getBoundWorktreeLaneKey(),
595
+ isWorker: () => isWorkerSession(),
596
+ });
597
+ this._baseToolDefinitions.set(worktreeSyncToolDefinition.name, worktreeSyncToolDefinition);
598
+ const boundLaneKey = getBoundWorktreeLaneKey();
599
+ if (boundLaneKey) {
600
+ const laneGate = new WorktreeLaneGate({
601
+ laneKey: boundLaneKey,
602
+ engineDeps: worktreeSyncEngineDeps,
603
+ policy: () => this.deps.getSettingsManager().getWorktreeSyncSettings().syncPolicy,
604
+ hardShell: isWorkerSession(),
605
+ trustedGateCommand: () => this.deps.getSettingsManager().getWorktreeSyncSettings().gateCommand,
606
+ });
607
+ for (const gatedToolName of ["edit", "write", "bash"]) {
608
+ const original = this._baseToolDefinitions.get(gatedToolName);
609
+ if (!original)
610
+ continue;
611
+ this._baseToolDefinitions.set(gatedToolName, {
612
+ ...original,
613
+ execute: async (toolCallId, params, signal, onUpdate, ctx) => {
614
+ const bashCommand = gatedToolName === "bash" ? params?.command : undefined;
615
+ const rawPath = gatedToolName === "edit" || gatedToolName === "write"
616
+ ? params?.path
617
+ : undefined;
618
+ const targetPath = rawPath !== undefined ? resolveToCwd(rawPath, this.deps.getCwd()) : undefined;
619
+ const check = await laneGate.checkMutation(gatedToolName, bashCommand, targetPath);
620
+ if (!check.allowed) {
621
+ return {
622
+ content: [{ type: "text", text: check.message }],
623
+ details: { code: check.code },
624
+ };
625
+ }
626
+ return original.execute(toolCallId, params, signal, onUpdate, ctx);
627
+ },
628
+ });
629
+ }
630
+ }
631
+ }
463
632
  }
464
633
  const extensionsResult = this.deps.getResourceLoader().getExtensions();
465
634
  if (options.flagValues) {
@@ -482,10 +651,21 @@ export class RuntimeBuilder {
482
651
  throw error;
483
652
  }
484
653
  this.deps.applyExtensionBindings(runner);
654
+ const boundLaneKey = getBoundWorktreeLaneKey();
655
+ const hardLaneWorker = boundLaneKey !== undefined && isWorkerSession();
656
+ const explicitlyRequestedTools = options.activeToolNames ?? (baseToolsOverride ? Object.keys(baseToolsOverride) : undefined);
657
+ if (hardLaneWorker && explicitlyRequestedTools?.includes("bash")) {
658
+ throw new Error("hard lane workers cannot request unrestricted bash; use typed worktree_sync actions");
659
+ }
485
660
  const defaultActiveToolNames = mapToolNamesForPlatform(baseToolsOverride
486
661
  ? Object.keys(baseToolsOverride)
487
662
  : [...DEFAULT_ACTIVE_TOOL_NAMES, ...(settingsManager.getScoutSettings().enabled ? ["context_scout"] : [])]);
488
- const baseActiveToolNames = mapToolNamesForPlatform(options.activeToolNames ?? defaultActiveToolNames);
663
+ const baseActiveToolNames = mapToolNamesForPlatform(options.activeToolNames ?? defaultActiveToolNames).filter((name) => !hardLaneWorker || name !== "bash");
664
+ if (hardLaneWorker &&
665
+ settingsManager.getWorktreeSyncSettings().enabled &&
666
+ !baseActiveToolNames.includes("worktree_sync")) {
667
+ baseActiveToolNames.push("worktree_sync");
668
+ }
489
669
  this.refreshToolRegistry({
490
670
  activeToolNames: baseActiveToolNames,
491
671
  includeAllExtensionTools: options.includeAllExtensionTools,
@@ -525,13 +705,29 @@ export class RuntimeBuilder {
525
705
  this._reloadRequested = false;
526
706
  }
527
707
  }
528
- async _reloadOnce() {
708
+ /**
709
+ * Unified reload-gate quiescence check: refuses the caller's action (message-prefixed by
710
+ * `action`) while the agent is streaming, is compacting, or ANY background work unit is still
711
+ * registered in the in-process quiesce registry — background lanes (research/worker/
712
+ * model-fitness), a context-scout run, or an isolated completion (see reload-blockers.ts). Every
713
+ * live-op entry point below calls this so they refuse identically; this is a synchronous refusal
714
+ * (not a wait/poll) — callers retry via the same coalescing `reload()` already provides.
715
+ */
716
+ _assertReloadQuiescent(action) {
529
717
  if (this.deps.isStreaming()) {
530
- throw new Error("Cannot reload while the agent is streaming or a tool call is active");
718
+ throw new Error(`Cannot ${action} while the agent is streaming or a tool call is active`);
531
719
  }
532
720
  if (this.deps.isCompacting()) {
533
- throw new Error("Cannot reload while context compaction or branch summarization is active");
721
+ throw new Error(`Cannot ${action} while context compaction or branch summarization is active`);
534
722
  }
723
+ const units = getInFlightWorkUnits(this.deps.getAgentDir());
724
+ if (units.length > 0) {
725
+ const summary = units.map(describeInFlightWorkUnit).join(", ");
726
+ throw new Error(`Cannot ${action} while background work is in flight: ${summary}`);
727
+ }
728
+ }
729
+ async _reloadOnce() {
730
+ this._assertReloadQuiescent("reload");
535
731
  const previousRunner = this.deps.getExtensionRunner();
536
732
  const snapshot = this._createReloadRuntimeSnapshot();
537
733
  // Preserve the pre-filter tool REQUEST across the rebuild, not the capability/profile-filtered
@@ -600,6 +796,9 @@ export class RuntimeBuilder {
600
796
  await this.deps.getResourceLoader().commitReload?.();
601
797
  // Re-derive the memory subsystem from the reloaded settings/providers.
602
798
  await this.deps.initializeMemory();
799
+ // This generation has fully committed (no rollback below this point), so any local
800
+ // runtime the host no longer routes to under the new configuration can be stopped now.
801
+ this.deps.reconcileLocalRuntimes?.();
603
802
  }
604
803
  catch (error) {
605
804
  offReloadErrors?.();
@@ -618,12 +817,7 @@ export class RuntimeBuilder {
618
817
  * Falls back to full reload on error.
619
818
  */
620
819
  async unloadExtensionLive(extensionPath) {
621
- if (this.deps.isStreaming()) {
622
- throw new Error("Cannot unload extension while the agent is streaming or a tool call is active");
623
- }
624
- if (this.deps.isCompacting()) {
625
- throw new Error("Cannot unload extension while context compaction or branch summarization is active");
626
- }
820
+ this._assertReloadQuiescent("unload extension");
627
821
  const ext = this.deps.getResourceLoader().getLoadedExtension(extensionPath);
628
822
  if (!ext) {
629
823
  return; // Nothing to unload
@@ -682,12 +876,7 @@ export class RuntimeBuilder {
682
876
  * Falls back to full reload on error.
683
877
  */
684
878
  async loadExtensionLive(extensionPath) {
685
- if (this.deps.isStreaming()) {
686
- throw new Error("Cannot load extension while the agent is streaming or a tool call is active");
687
- }
688
- if (this.deps.isCompacting()) {
689
- throw new Error("Cannot load extension while context compaction or branch summarization is active");
690
- }
879
+ this._assertReloadQuiescent("load extension");
691
880
  const previousRunner = this.deps.getExtensionRunner();
692
881
  try {
693
882
  // Load the extension with fresh import
@@ -728,12 +917,7 @@ export class RuntimeBuilder {
728
917
  * Falls back to full reload if any individual load/unload fails.
729
918
  */
730
919
  async reconcileLoadedExtensions() {
731
- if (this.deps.isStreaming()) {
732
- throw new Error("Cannot reconcile extensions while the agent is streaming or a tool call is active");
733
- }
734
- if (this.deps.isCompacting()) {
735
- throw new Error("Cannot reconcile extensions while context compaction or branch summarization is active");
736
- }
920
+ this._assertReloadQuiescent("reconcile extensions");
737
921
  try {
738
922
  // Get all discoverable extension paths
739
923
  const allDiscoverablePaths = await this.deps.getResourceLoader().getDiscoverableExtensionPaths();