@caupulican/pi-adaptative 0.81.38 → 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 (433) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/dist/bundled-resources/extensions/tmux-agent-manager/README.md +18 -1
  3. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts +131 -0
  4. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.d.ts.map +1 -0
  5. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js +196 -0
  6. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.js.map +1 -0
  7. package/dist/bundled-resources/extensions/tmux-agent-manager/dispatch-grant.ts +308 -0
  8. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts +22 -2
  9. package/dist/bundled-resources/extensions/tmux-agent-manager/index.d.ts.map +1 -1
  10. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js +585 -24
  11. package/dist/bundled-resources/extensions/tmux-agent-manager/index.js.map +1 -1
  12. package/dist/bundled-resources/extensions/tmux-agent-manager/index.ts +749 -27
  13. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/__init__.py +43 -0
  14. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/fs.py +270 -0
  15. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/search.py +252 -0
  16. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/strings.py +399 -0
  17. package/dist/bundled-resources/runtimes/pi-shell-engine/commands/text.py +575 -0
  18. package/dist/bundled-resources/runtimes/pi-shell-engine/context.py +52 -0
  19. package/dist/bundled-resources/runtimes/pi-shell-engine/errors.py +49 -0
  20. package/dist/bundled-resources/runtimes/pi-shell-engine/exec.py +734 -0
  21. package/dist/bundled-resources/runtimes/pi-shell-engine/expand.py +238 -0
  22. package/dist/bundled-resources/runtimes/pi-shell-engine/main.py +132 -0
  23. package/dist/bundled-resources/runtimes/pi-shell-engine/nodes.py +116 -0
  24. package/dist/bundled-resources/runtimes/pi-shell-engine/parser.py +287 -0
  25. package/dist/bundled-resources/runtimes/pi-shell-engine/proc.py +137 -0
  26. package/dist/bundled-resources/runtimes/pi-shell-engine/state.py +100 -0
  27. package/dist/bundled-resources/runtimes/pi-shell-engine/tokens.py +579 -0
  28. package/dist/bundled-resources/skills/tool-call-repair/SKILL.md +19 -9
  29. package/dist/bundled-resources/skills/tool-call-repair/references/failure-grammar.md +22 -5
  30. package/dist/bundled-resources/skills/tool-call-repair/references/repair-catalogue.md +5 -5
  31. package/dist/bundled-resources/skills/tool-call-repair/references/text-protocol-grammar.md +28 -7
  32. package/dist/cli/args.d.ts +3 -0
  33. package/dist/cli/args.d.ts.map +1 -1
  34. package/dist/cli/args.js +15 -0
  35. package/dist/cli/args.js.map +1 -1
  36. package/dist/core/agent-paths.d.ts +49 -0
  37. package/dist/core/agent-paths.d.ts.map +1 -0
  38. package/dist/core/agent-paths.js +107 -0
  39. package/dist/core/agent-paths.js.map +1 -0
  40. package/dist/core/agent-session-services.d.ts.map +1 -1
  41. package/dist/core/agent-session-services.js +3 -3
  42. package/dist/core/agent-session-services.js.map +1 -1
  43. package/dist/core/agent-session.d.ts +234 -17
  44. package/dist/core/agent-session.d.ts.map +1 -1
  45. package/dist/core/agent-session.js +484 -62
  46. package/dist/core/agent-session.js.map +1 -1
  47. package/dist/core/autonomy/contracts.d.ts +9 -0
  48. package/dist/core/autonomy/contracts.d.ts.map +1 -1
  49. package/dist/core/autonomy/contracts.js.map +1 -1
  50. package/dist/core/autonomy/lane-tracker.d.ts +10 -1
  51. package/dist/core/autonomy/lane-tracker.d.ts.map +1 -1
  52. package/dist/core/autonomy/lane-tracker.js +5 -1
  53. package/dist/core/autonomy/lane-tracker.js.map +1 -1
  54. package/dist/core/background-lane-controller.d.ts +122 -6
  55. package/dist/core/background-lane-controller.d.ts.map +1 -1
  56. package/dist/core/background-lane-controller.js +446 -89
  57. package/dist/core/background-lane-controller.js.map +1 -1
  58. package/dist/core/bash-execution-controller.d.ts +4 -0
  59. package/dist/core/bash-execution-controller.d.ts.map +1 -1
  60. package/dist/core/bash-execution-controller.js +7 -1
  61. package/dist/core/bash-execution-controller.js.map +1 -1
  62. package/dist/core/compaction-support.d.ts +13 -3
  63. package/dist/core/compaction-support.d.ts.map +1 -1
  64. package/dist/core/compaction-support.js +43 -7
  65. package/dist/core/compaction-support.js.map +1 -1
  66. package/dist/core/context/context-audit.d.ts +33 -1
  67. package/dist/core/context/context-audit.d.ts.map +1 -1
  68. package/dist/core/context/context-audit.js +31 -5
  69. package/dist/core/context/context-audit.js.map +1 -1
  70. package/dist/core/context-gc.d.ts.map +1 -1
  71. package/dist/core/context-gc.js +16 -1
  72. package/dist/core/context-gc.js.map +1 -1
  73. package/dist/core/context-pipeline.d.ts +26 -4
  74. package/dist/core/context-pipeline.d.ts.map +1 -1
  75. package/dist/core/context-pipeline.js +137 -14
  76. package/dist/core/context-pipeline.js.map +1 -1
  77. package/dist/core/cost-guard.d.ts +19 -3
  78. package/dist/core/cost-guard.d.ts.map +1 -1
  79. package/dist/core/cost-guard.js +18 -3
  80. package/dist/core/cost-guard.js.map +1 -1
  81. package/dist/core/delegation/session-worker-result.d.ts +34 -4
  82. package/dist/core/delegation/session-worker-result.d.ts.map +1 -1
  83. package/dist/core/delegation/session-worker-result.js +64 -4
  84. package/dist/core/delegation/session-worker-result.js.map +1 -1
  85. package/dist/core/delegation/worker-result.d.ts +42 -1
  86. package/dist/core/delegation/worker-result.d.ts.map +1 -1
  87. package/dist/core/delegation/worker-result.js +68 -0
  88. package/dist/core/delegation/worker-result.js.map +1 -1
  89. package/dist/core/extensions/loader.d.ts.map +1 -1
  90. package/dist/core/extensions/loader.js +20 -0
  91. package/dist/core/extensions/loader.js.map +1 -1
  92. package/dist/core/extensions/runner.d.ts.map +1 -1
  93. package/dist/core/extensions/runner.js +1 -0
  94. package/dist/core/extensions/runner.js.map +1 -1
  95. package/dist/core/extensions/types.d.ts +51 -0
  96. package/dist/core/extensions/types.d.ts.map +1 -1
  97. package/dist/core/extensions/types.js.map +1 -1
  98. package/dist/core/goal-loop-controller.d.ts +17 -1
  99. package/dist/core/goal-loop-controller.d.ts.map +1 -1
  100. package/dist/core/goal-loop-controller.js +79 -11
  101. package/dist/core/goal-loop-controller.js.map +1 -1
  102. package/dist/core/goals/goal-continuation-controller.d.ts +48 -2
  103. package/dist/core/goals/goal-continuation-controller.d.ts.map +1 -1
  104. package/dist/core/goals/goal-continuation-controller.js +77 -0
  105. package/dist/core/goals/goal-continuation-controller.js.map +1 -1
  106. package/dist/core/goals/goal-continuation-defaults.d.ts +39 -0
  107. package/dist/core/goals/goal-continuation-defaults.d.ts.map +1 -1
  108. package/dist/core/goals/goal-continuation-defaults.js +42 -0
  109. package/dist/core/goals/goal-continuation-defaults.js.map +1 -1
  110. package/dist/core/goals/goal-continuation-prompt.d.ts +4 -0
  111. package/dist/core/goals/goal-continuation-prompt.d.ts.map +1 -1
  112. package/dist/core/goals/goal-continuation-prompt.js +51 -10
  113. package/dist/core/goals/goal-continuation-prompt.js.map +1 -1
  114. package/dist/core/goals/goal-runtime-snapshot.d.ts +101 -2
  115. package/dist/core/goals/goal-runtime-snapshot.d.ts.map +1 -1
  116. package/dist/core/goals/goal-runtime-snapshot.js +87 -4
  117. package/dist/core/goals/goal-runtime-snapshot.js.map +1 -1
  118. package/dist/core/goals/goal-state.d.ts +89 -1
  119. package/dist/core/goals/goal-state.d.ts.map +1 -1
  120. package/dist/core/goals/goal-state.js +71 -5
  121. package/dist/core/goals/goal-state.js.map +1 -1
  122. package/dist/core/goals/goal-tool-core.d.ts +56 -2
  123. package/dist/core/goals/goal-tool-core.d.ts.map +1 -1
  124. package/dist/core/goals/goal-tool-core.js +111 -5
  125. package/dist/core/goals/goal-tool-core.js.map +1 -1
  126. package/dist/core/goals/session-goal-state.d.ts +11 -2
  127. package/dist/core/goals/session-goal-state.d.ts.map +1 -1
  128. package/dist/core/goals/session-goal-state.js +32 -17
  129. package/dist/core/goals/session-goal-state.js.map +1 -1
  130. package/dist/core/keybindings.d.ts +10 -0
  131. package/dist/core/keybindings.d.ts.map +1 -1
  132. package/dist/core/keybindings.js +10 -2
  133. package/dist/core/keybindings.js.map +1 -1
  134. package/dist/core/learning/observation-store.d.ts +12 -3
  135. package/dist/core/learning/observation-store.d.ts.map +1 -1
  136. package/dist/core/learning/observation-store.js +30 -15
  137. package/dist/core/learning/observation-store.js.map +1 -1
  138. package/dist/core/learning/skill-curator.d.ts +5 -1
  139. package/dist/core/learning/skill-curator.d.ts.map +1 -1
  140. package/dist/core/learning/skill-curator.js +21 -19
  141. package/dist/core/learning/skill-curator.js.map +1 -1
  142. package/dist/core/local-runtime-controller.d.ts +65 -3
  143. package/dist/core/local-runtime-controller.d.ts.map +1 -1
  144. package/dist/core/local-runtime-controller.js +186 -26
  145. package/dist/core/local-runtime-controller.js.map +1 -1
  146. package/dist/core/memory/providers/file-store.d.ts +1 -1
  147. package/dist/core/memory/providers/file-store.d.ts.map +1 -1
  148. package/dist/core/memory/providers/file-store.js +6 -6
  149. package/dist/core/memory/providers/file-store.js.map +1 -1
  150. package/dist/core/model-capability.d.ts +34 -0
  151. package/dist/core/model-capability.d.ts.map +1 -1
  152. package/dist/core/model-capability.js +42 -1
  153. package/dist/core/model-capability.js.map +1 -1
  154. package/dist/core/model-router/tool-escalation.d.ts +15 -0
  155. package/dist/core/model-router/tool-escalation.d.ts.map +1 -1
  156. package/dist/core/model-router/tool-escalation.js +23 -1
  157. package/dist/core/model-router/tool-escalation.js.map +1 -1
  158. package/dist/core/model-router-controller.d.ts +34 -7
  159. package/dist/core/model-router-controller.d.ts.map +1 -1
  160. package/dist/core/model-router-controller.js +95 -16
  161. package/dist/core/model-router-controller.js.map +1 -1
  162. package/dist/core/models/adaptation-store.d.ts +7 -0
  163. package/dist/core/models/adaptation-store.d.ts.map +1 -1
  164. package/dist/core/models/adaptation-store.js +47 -11
  165. package/dist/core/models/adaptation-store.js.map +1 -1
  166. package/dist/core/models/default-model-suggestions.d.ts.map +1 -1
  167. package/dist/core/models/default-model-suggestions.js +17 -0
  168. package/dist/core/models/default-model-suggestions.js.map +1 -1
  169. package/dist/core/models/fitness-store.d.ts +3 -0
  170. package/dist/core/models/fitness-store.d.ts.map +1 -1
  171. package/dist/core/models/fitness-store.js +11 -2
  172. package/dist/core/models/fitness-store.js.map +1 -1
  173. package/dist/core/models/llamacpp-runtime.d.ts +180 -0
  174. package/dist/core/models/llamacpp-runtime.d.ts.map +1 -0
  175. package/dist/core/models/llamacpp-runtime.js +475 -0
  176. package/dist/core/models/llamacpp-runtime.js.map +1 -0
  177. package/dist/core/models/local-registration.d.ts +40 -0
  178. package/dist/core/models/local-registration.d.ts.map +1 -1
  179. package/dist/core/models/local-registration.js +94 -5
  180. package/dist/core/models/local-registration.js.map +1 -1
  181. package/dist/core/models/local-runtime.d.ts.map +1 -1
  182. package/dist/core/models/local-runtime.js +6 -5
  183. package/dist/core/models/local-runtime.js.map +1 -1
  184. package/dist/core/models/model-ref.d.ts +7 -0
  185. package/dist/core/models/model-ref.d.ts.map +1 -1
  186. package/dist/core/models/model-ref.js +26 -0
  187. package/dist/core/models/model-ref.js.map +1 -1
  188. package/dist/core/models/needle-runtime.d.ts +257 -0
  189. package/dist/core/models/needle-runtime.d.ts.map +1 -0
  190. package/dist/core/models/needle-runtime.js +519 -0
  191. package/dist/core/models/needle-runtime.js.map +1 -0
  192. package/dist/core/models/prism-llamacpp-lifecycle.d.ts +89 -0
  193. package/dist/core/models/prism-llamacpp-lifecycle.d.ts.map +1 -0
  194. package/dist/core/models/prism-llamacpp-lifecycle.js +121 -0
  195. package/dist/core/models/prism-llamacpp-lifecycle.js.map +1 -0
  196. package/dist/core/package-manager.d.ts.map +1 -1
  197. package/dist/core/package-manager.js +11 -10
  198. package/dist/core/package-manager.js.map +1 -1
  199. package/dist/core/process-matrix/codes.d.ts +72 -0
  200. package/dist/core/process-matrix/codes.d.ts.map +1 -0
  201. package/dist/core/process-matrix/codes.js +15 -0
  202. package/dist/core/process-matrix/codes.js.map +1 -0
  203. package/dist/core/process-matrix/runtime.d.ts +63 -0
  204. package/dist/core/process-matrix/runtime.d.ts.map +1 -0
  205. package/dist/core/process-matrix/runtime.js +310 -0
  206. package/dist/core/process-matrix/runtime.js.map +1 -0
  207. package/dist/core/process-matrix/store.d.ts +22 -0
  208. package/dist/core/process-matrix/store.d.ts.map +1 -0
  209. package/dist/core/process-matrix/store.js +80 -0
  210. package/dist/core/process-matrix/store.js.map +1 -0
  211. package/dist/core/process-matrix/supervisor.d.ts +72 -0
  212. package/dist/core/process-matrix/supervisor.d.ts.map +1 -0
  213. package/dist/core/process-matrix/supervisor.js +130 -0
  214. package/dist/core/process-matrix/supervisor.js.map +1 -0
  215. package/dist/core/profile-registry.d.ts +7 -0
  216. package/dist/core/profile-registry.d.ts.map +1 -1
  217. package/dist/core/profile-registry.js +20 -0
  218. package/dist/core/profile-registry.js.map +1 -1
  219. package/dist/core/python-runtime.d.ts.map +1 -1
  220. package/dist/core/python-runtime.js +3 -3
  221. package/dist/core/python-runtime.js.map +1 -1
  222. package/dist/core/reflection-controller.d.ts +29 -5
  223. package/dist/core/reflection-controller.d.ts.map +1 -1
  224. package/dist/core/reflection-controller.js +215 -126
  225. package/dist/core/reflection-controller.js.map +1 -1
  226. package/dist/core/reload-blockers.d.ts +36 -0
  227. package/dist/core/reload-blockers.d.ts.map +1 -1
  228. package/dist/core/reload-blockers.js +44 -0
  229. package/dist/core/reload-blockers.js.map +1 -1
  230. package/dist/core/resource-loader.d.ts.map +1 -1
  231. package/dist/core/resource-loader.js +8 -7
  232. package/dist/core/resource-loader.js.map +1 -1
  233. package/dist/core/runtime-builder.d.ts +58 -5
  234. package/dist/core/runtime-builder.d.ts.map +1 -1
  235. package/dist/core/runtime-builder.js +209 -25
  236. package/dist/core/runtime-builder.js.map +1 -1
  237. package/dist/core/scout-controller.d.ts +6 -0
  238. package/dist/core/scout-controller.d.ts.map +1 -1
  239. package/dist/core/scout-controller.js +66 -52
  240. package/dist/core/scout-controller.js.map +1 -1
  241. package/dist/core/sdk.d.ts.map +1 -1
  242. package/dist/core/sdk.js +3 -3
  243. package/dist/core/sdk.js.map +1 -1
  244. package/dist/core/session-role.d.ts +31 -0
  245. package/dist/core/session-role.d.ts.map +1 -0
  246. package/dist/core/session-role.js +52 -0
  247. package/dist/core/session-role.js.map +1 -0
  248. package/dist/core/settings-manager.d.ts +42 -3
  249. package/dist/core/settings-manager.d.ts.map +1 -1
  250. package/dist/core/settings-manager.js +94 -60
  251. package/dist/core/settings-manager.js.map +1 -1
  252. package/dist/core/system-prompt-builder.d.ts +12 -0
  253. package/dist/core/system-prompt-builder.d.ts.map +1 -1
  254. package/dist/core/system-prompt-builder.js +6 -0
  255. package/dist/core/system-prompt-builder.js.map +1 -1
  256. package/dist/core/system-prompt.d.ts +14 -1
  257. package/dist/core/system-prompt.d.ts.map +1 -1
  258. package/dist/core/system-prompt.js +20 -3
  259. package/dist/core/system-prompt.js.map +1 -1
  260. package/dist/core/tasks/session-task-state.d.ts +11 -2
  261. package/dist/core/tasks/session-task-state.d.ts.map +1 -1
  262. package/dist/core/tasks/session-task-state.js +27 -11
  263. package/dist/core/tasks/session-task-state.js.map +1 -1
  264. package/dist/core/tasks/task-contract-monitor.d.ts +45 -0
  265. package/dist/core/tasks/task-contract-monitor.d.ts.map +1 -0
  266. package/dist/core/tasks/task-contract-monitor.js +56 -0
  267. package/dist/core/tasks/task-contract-monitor.js.map +1 -0
  268. package/dist/core/tasks/task-state.d.ts +8 -0
  269. package/dist/core/tasks/task-state.d.ts.map +1 -1
  270. package/dist/core/tasks/task-state.js +28 -1
  271. package/dist/core/tasks/task-state.js.map +1 -1
  272. package/dist/core/tool-gate-controller.d.ts.map +1 -1
  273. package/dist/core/tool-gate-controller.js +5 -0
  274. package/dist/core/tool-gate-controller.js.map +1 -1
  275. package/dist/core/tool-recovery-log-records.d.ts +7 -0
  276. package/dist/core/tool-recovery-log-records.d.ts.map +1 -1
  277. package/dist/core/tool-recovery-log-records.js +14 -6
  278. package/dist/core/tool-recovery-log-records.js.map +1 -1
  279. package/dist/core/tool-selection/promotion.d.ts +54 -0
  280. package/dist/core/tool-selection/promotion.d.ts.map +1 -0
  281. package/dist/core/tool-selection/promotion.js +81 -0
  282. package/dist/core/tool-selection/promotion.js.map +1 -0
  283. package/dist/core/tool-selection/tool-performance-store.d.ts +37 -0
  284. package/dist/core/tool-selection/tool-performance-store.d.ts.map +1 -1
  285. package/dist/core/tool-selection/tool-performance-store.js +87 -3
  286. package/dist/core/tool-selection/tool-performance-store.js.map +1 -1
  287. package/dist/core/tool-selection/tool-selection-controller.d.ts +45 -0
  288. package/dist/core/tool-selection/tool-selection-controller.d.ts.map +1 -1
  289. package/dist/core/tool-selection/tool-selection-controller.js +96 -0
  290. package/dist/core/tool-selection/tool-selection-controller.js.map +1 -1
  291. package/dist/core/tools/bash.d.ts +18 -0
  292. package/dist/core/tools/bash.d.ts.map +1 -1
  293. package/dist/core/tools/bash.js +95 -16
  294. package/dist/core/tools/bash.js.map +1 -1
  295. package/dist/core/tools/delegate-status.d.ts +14 -0
  296. package/dist/core/tools/delegate-status.d.ts.map +1 -1
  297. package/dist/core/tools/delegate-status.js +82 -7
  298. package/dist/core/tools/delegate-status.js.map +1 -1
  299. package/dist/core/tools/delegate.d.ts.map +1 -1
  300. package/dist/core/tools/delegate.js +25 -8
  301. package/dist/core/tools/delegate.js.map +1 -1
  302. package/dist/core/tools/goal.d.ts +94 -3
  303. package/dist/core/tools/goal.d.ts.map +1 -1
  304. package/dist/core/tools/goal.js +165 -15
  305. package/dist/core/tools/goal.js.map +1 -1
  306. package/dist/core/tools/model-fitness.d.ts +7 -0
  307. package/dist/core/tools/model-fitness.d.ts.map +1 -1
  308. package/dist/core/tools/model-fitness.js +2 -2
  309. package/dist/core/tools/model-fitness.js.map +1 -1
  310. package/dist/core/tools/shell-contract-router.d.ts +6 -1
  311. package/dist/core/tools/shell-contract-router.d.ts.map +1 -1
  312. package/dist/core/tools/shell-contract-router.js +23 -2
  313. package/dist/core/tools/shell-contract-router.js.map +1 -1
  314. package/dist/core/tools/shell-session.d.ts +89 -0
  315. package/dist/core/tools/shell-session.d.ts.map +1 -0
  316. package/dist/core/tools/shell-session.js +432 -0
  317. package/dist/core/tools/shell-session.js.map +1 -0
  318. package/dist/core/tools/task-steps.d.ts +4 -0
  319. package/dist/core/tools/task-steps.d.ts.map +1 -1
  320. package/dist/core/tools/task-steps.js +63 -8
  321. package/dist/core/tools/task-steps.js.map +1 -1
  322. package/dist/core/tools/tmux-dispatch.d.ts +86 -0
  323. package/dist/core/tools/tmux-dispatch.d.ts.map +1 -0
  324. package/dist/core/tools/tmux-dispatch.js +91 -0
  325. package/dist/core/tools/tmux-dispatch.js.map +1 -0
  326. package/dist/core/tools/windows-shell-engine.d.ts +42 -0
  327. package/dist/core/tools/windows-shell-engine.d.ts.map +1 -0
  328. package/dist/core/tools/windows-shell-engine.js +153 -0
  329. package/dist/core/tools/windows-shell-engine.js.map +1 -0
  330. package/dist/core/tools/windows-shell-state.d.ts +40 -0
  331. package/dist/core/tools/windows-shell-state.d.ts.map +1 -0
  332. package/dist/core/tools/windows-shell-state.js +59 -0
  333. package/dist/core/tools/windows-shell-state.js.map +1 -0
  334. package/dist/core/tools/worktree-sync.d.ts +24 -0
  335. package/dist/core/tools/worktree-sync.d.ts.map +1 -0
  336. package/dist/core/tools/worktree-sync.js +338 -0
  337. package/dist/core/tools/worktree-sync.js.map +1 -0
  338. package/dist/core/trust-manager.d.ts +4 -1
  339. package/dist/core/trust-manager.d.ts.map +1 -1
  340. package/dist/core/trust-manager.js +20 -2
  341. package/dist/core/trust-manager.js.map +1 -1
  342. package/dist/core/util/atomic-file.d.ts +55 -0
  343. package/dist/core/util/atomic-file.d.ts.map +1 -0
  344. package/dist/core/util/atomic-file.js +255 -0
  345. package/dist/core/util/atomic-file.js.map +1 -0
  346. package/dist/core/util/minimatch-cache.d.ts +33 -0
  347. package/dist/core/util/minimatch-cache.d.ts.map +1 -0
  348. package/dist/core/util/minimatch-cache.js +0 -0
  349. package/dist/core/util/minimatch-cache.js.map +1 -0
  350. package/dist/core/worktree-sync/codes.d.ts +227 -0
  351. package/dist/core/worktree-sync/codes.d.ts.map +1 -0
  352. package/dist/core/worktree-sync/codes.js +14 -0
  353. package/dist/core/worktree-sync/codes.js.map +1 -0
  354. package/dist/core/worktree-sync/git-engine.d.ts +156 -0
  355. package/dist/core/worktree-sync/git-engine.d.ts.map +1 -0
  356. package/dist/core/worktree-sync/git-engine.js +1191 -0
  357. package/dist/core/worktree-sync/git-engine.js.map +1 -0
  358. package/dist/core/worktree-sync/lane-gate.d.ts +75 -0
  359. package/dist/core/worktree-sync/lane-gate.d.ts.map +1 -0
  360. package/dist/core/worktree-sync/lane-gate.js +360 -0
  361. package/dist/core/worktree-sync/lane-gate.js.map +1 -0
  362. package/dist/core/worktree-sync/runtime.d.ts +47 -0
  363. package/dist/core/worktree-sync/runtime.d.ts.map +1 -0
  364. package/dist/core/worktree-sync/runtime.js +96 -0
  365. package/dist/core/worktree-sync/runtime.js.map +1 -0
  366. package/dist/core/worktree-sync/store.d.ts +69 -0
  367. package/dist/core/worktree-sync/store.d.ts.map +1 -0
  368. package/dist/core/worktree-sync/store.js +247 -0
  369. package/dist/core/worktree-sync/store.js.map +1 -0
  370. package/dist/core/worktree-sync/watcher.d.ts +29 -0
  371. package/dist/core/worktree-sync/watcher.d.ts.map +1 -0
  372. package/dist/core/worktree-sync/watcher.js +93 -0
  373. package/dist/core/worktree-sync/watcher.js.map +1 -0
  374. package/dist/main.d.ts.map +1 -1
  375. package/dist/main.js +94 -0
  376. package/dist/main.js.map +1 -1
  377. package/dist/migrations.d.ts +9 -0
  378. package/dist/migrations.d.ts.map +1 -1
  379. package/dist/migrations.js +38 -0
  380. package/dist/migrations.js.map +1 -1
  381. package/dist/modes/interactive/auto-learn-controller.d.ts +16 -1
  382. package/dist/modes/interactive/auto-learn-controller.d.ts.map +1 -1
  383. package/dist/modes/interactive/auto-learn-controller.js +50 -8
  384. package/dist/modes/interactive/auto-learn-controller.js.map +1 -1
  385. package/dist/modes/interactive/components/profile-resource-editor.d.ts.map +1 -1
  386. package/dist/modes/interactive/components/profile-resource-editor.js +23 -1
  387. package/dist/modes/interactive/components/profile-resource-editor.js.map +1 -1
  388. package/dist/modes/interactive/interactive-mode.d.ts +1 -0
  389. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  390. package/dist/modes/interactive/interactive-mode.js +4 -0
  391. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  392. package/dist/modes/interactive/local-model-commands.d.ts +43 -0
  393. package/dist/modes/interactive/local-model-commands.d.ts.map +1 -1
  394. package/dist/modes/interactive/local-model-commands.js +290 -3
  395. package/dist/modes/interactive/local-model-commands.js.map +1 -1
  396. package/dist/modes/interactive/session-flow-commands.d.ts.map +1 -1
  397. package/dist/modes/interactive/session-flow-commands.js +24 -4
  398. package/dist/modes/interactive/session-flow-commands.js.map +1 -1
  399. package/dist/utils/fs-watch.d.ts +11 -0
  400. package/dist/utils/fs-watch.d.ts.map +1 -1
  401. package/dist/utils/fs-watch.js +20 -2
  402. package/dist/utils/fs-watch.js.map +1 -1
  403. package/dist/utils/highlight-js-languages.d.ts +4 -0
  404. package/dist/utils/highlight-js-languages.d.ts.map +1 -0
  405. package/dist/utils/highlight-js-languages.js +573 -0
  406. package/dist/utils/highlight-js-languages.js.map +1 -0
  407. package/dist/utils/shell.d.ts +7 -1
  408. package/dist/utils/shell.d.ts.map +1 -1
  409. package/dist/utils/shell.js +21 -6
  410. package/dist/utils/shell.js.map +1 -1
  411. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  412. package/dist/utils/syntax-highlight.js +53 -5
  413. package/dist/utils/syntax-highlight.js.map +1 -1
  414. package/dist/utils/tools-manager.d.ts.map +1 -1
  415. package/dist/utils/tools-manager.js +112 -1
  416. package/dist/utils/tools-manager.js.map +1 -1
  417. package/docs/process-matrix.md +120 -0
  418. package/docs/settings.md +3 -0
  419. package/docs/tmux-agent-manager.md +85 -2
  420. package/docs/windows.md +52 -3
  421. package/docs/work-directory.md +29 -0
  422. package/docs/worktree-sync.md +250 -0
  423. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  424. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  425. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  426. package/examples/extensions/sandbox/package-lock.json +2 -2
  427. package/examples/extensions/sandbox/package.json +1 -1
  428. package/examples/extensions/with-deps/package-lock.json +2 -2
  429. package/examples/extensions/with-deps/package.json +1 -1
  430. package/npm-shrinkwrap.json +12 -12
  431. package/package.json +10 -4
  432. package/docs/integration-sweep-builder-blueprint-2026-07-09.md +0 -365
  433. package/docs/integration-sweep-resume-2026-07-09.md +0 -407
@@ -37,12 +37,95 @@ Run `/tmux-agents` or call `tmux_agent_manager` with `action: "status"` to check
37
37
  2. writes one atomic terminal result when it sees the worker's `DONE` or `BLOCKED` marker, the pane closes, or its one-shot deadline expires;
38
38
  3. updates tmux status metadata and emits a display notification.
39
39
 
40
- The parent Pi session watches result-file events. Once every worker is terminal, it records an exactly-once notification marker and sends a bounded, source-labelled untrusted handoff with `triggerTurn: true`. Startup performs one reconciliation pass for terminal events produced while Pi was offline.
40
+ The parent Pi session watches result-file events. Once a turn's worker is terminal, it records a per-agent notification marker (`notifiedTurn`) and sends a bounded, source-labelled untrusted handoff with `triggerTurn: true`. Startup performs one reconciliation pass for terminal events produced while Pi was offline, and also reconciles tmux **sessions**: see [Persistence](#persistence-follow-ups-reconcile-dismiss) below.
41
41
 
42
42
  Do not poll pane state, capture pane output, or inspect logs merely to detect completion. Use `job_status` or terminal artifacts after the handoff only when its bounded evidence is insufficient.
43
43
 
44
+ ## Persistence: follow-ups, reconcile, dismiss
45
+
46
+ A `fire_task` pane's provider CLI stays alive and interactive after its first terminal marker. Three
47
+ actions manage that persistence:
48
+
49
+ - **`send_followup`** — re-injects a new prompt into an already-live job's pane (default: the job's
50
+ first/primary agent; pass `agentId` to target another). It re-arms the completion watcher for a fresh
51
+ turn using a unique per-turn marker pair, so it cannot be confused with an earlier turn's markers, and
52
+ reuses the same event-driven, exactly-once handoff. Refuses if the tmux session or pane is gone
53
+ (relaunch with `fire_task` instead) or if the job was `dismiss`ed.
54
+ - **`dismiss`** — stops tracking a job (no more re-arming, no more handoffs) without killing its tmux
55
+ session; the pane keeps running and can still be attached to (`tmux attach -t <session>`) or stopped
56
+ later with `stop_job`/`stop_session`.
57
+ - **Session reconcile** — on session start, Pi diffs live tmux sessions against its own job records for
58
+ jobs it started. A session that has disappeared while its job was not yet terminal is marked orphaned
59
+ (informational only — nothing is ever killed to produce this state, and the job directory is never
60
+ deleted automatically). A session that is still alive with a pending turn has its watcher re-armed so
61
+ the job can still complete normally. Killing a session always stays behind the explicit
62
+ `stop_job`/`stop_session` confirm path.
63
+
64
+ An idle worker (no turn currently dispatched) does not hold this session's reload-quiesce; `/reload` is
65
+ never blocked merely because a persistent tmux worker exists between turns.
66
+
67
+ ## Approval-gated dispatch: the standing grant
68
+
69
+ A real (non-dry-run) `fire_task` or `send_followup` launch requires either a **standing grant** or a
70
+ one-shot interactive approval — never a silent launch:
71
+
72
+ - **`grant_dispatch`** authorizes repeated unattended dispatch. Set `agent` (required), `maxLaunches`
73
+ (required), and optionally `goalId` (an unscoped grant covers any goal), `allowedTools`,
74
+ `resourceProfile`, `writePaths`, and `expiresInMinutes`. Requires interactive confirmation when a UI is
75
+ attached; in print/rpc/non-interactive mode, requires the `--allow-tmux-dispatch` CLI flag instead.
76
+ Once granted, matching launches proceed unattended and consume one unit of `maxLaunches` for each child process launched.
77
+ - **`revoke_grant`** ends a standing grant early (defaults to whichever grant is currently active).
78
+ - With **no covering grant**: an interactive session is prompted for a one-shot approval; a
79
+ non-interactive session (no UI, no grant) is **refused** with a clear error — never launched silently.
80
+
81
+ A grant-covered (or one-shot-approved) `pi` child is launched with a **restricted profile**: `--tools`
82
+ (or a read-biased default), `--resource-profile` (or `--no-extensions --no-skills`), and a scoped
83
+ `--append-system-prompt` naming the grant and a fixed hard-stop list (publish/push/tag/credential
84
+ changes/destructive deletion must come back BLOCKED, never self-approved). This pushes the envelope into
85
+ the **child's own** launch configuration — it is not an in-process sandbox, and non-`pi` agents
86
+ (`agy`/`claude`/`codex`/`opencode`/custom) are bounded only at the launch layer; their internal tool-loop
87
+ behavior is that CLI's own responsibility.
88
+
89
+ Grant budget (`maxLaunches`, `expiresInMinutes`) is real and enforced. `maxUsdAdvisory` and any
90
+ self-reported worker usage are **advisory** — a claim to review, never a hard cap across the process
91
+ boundary (the child bills under its own authentication).
92
+
93
+ Dispatched tmux workers appear as `tmux-worker` lanes alongside in-process worker lanes in `/autonomy`
94
+ and `delegate_status`; a worker's self-reported changed files are re-checked against the session's active
95
+ write scope and flagged for parent review when out of scope, exactly like an in-process worker's.
96
+
97
+ ## Goal-bound dispatch (`goal dispatch_worker dispatchTarget:"tmux"`)
98
+
99
+ The `goal` tool's `dispatch_worker` action can bind a single open requirement to a persistent tmux worker
100
+ instead of the default in-process one: pass `dispatchTarget: "tmux"`. Core invokes `fire_task` itself (the
101
+ same call the model would make) with exactly one `pi` agent, so the dispatch maps 1:1 to the
102
+ requirement's bound lane; the launch still goes through the standing-grant authorization above unchanged
103
+ — an unattended goal/idle loop with no covering grant is honestly refused, never silently launched. The
104
+ requirement's binding is recorded either way; a successful tmux dispatch waits and resumes through the
105
+ same lane machinery as an in-process worker.
106
+
107
+ When no worker was dispatched, the tool response's `dispatchSkipReason` explains why:
108
+
109
+ - `no_standing_grant` — no covering grant, and this call had no UI to prompt (run `grant_dispatch` first).
110
+ - `tmux_extension_not_loaded` — `tmux_agent_manager` is not loaded in this session (see Enable above).
111
+ - `tmux_dispatch_failed` — the `fire_task` launch threw for a reason other than the grant (a bad jobId, a
112
+ live session-name collision, an environment failure).
113
+ - `tmux_dispatch_incomplete` — the launch call returned without the job/agent details needed to identify
114
+ the new lane.
115
+ - `lane_correlation_failed` — the new lane could not be resolved to its internal tracking id.
116
+ - `worktree_create_failed` — worktree-sync refused the lane before any tmux pane was launched.
117
+ - `worker_capability_insufficient` — the selected model is not eligible for a lane worker; no lane or pane was created.
118
+ - `requirement_already_bound` — the requirement is already bound to a lane that is still queued/running;
119
+ no duplicate dispatch was attempted.
120
+ - `bound_lane_indeterminate` — the requirement is bound to a lane whose liveness/outcome cannot be
121
+ determined (e.g. after `/reload`); dispatch is refused rather than risking a duplicate worker. A bound
122
+ lane with a confirmed terminal outcome allows a fresh dispatch normally.
123
+
44
124
  ## Safety
45
125
 
46
- Launch actions run directly unless `dryRun: true` is requested. Stop actions can discard active pane work, so they remain previews by default and require `confirm: "yes-tmux-stop"` for execution. Existing sessions are never replaced silently; `force: true` archives an old job directory but does not kill a live tmux session.
126
+ Launch actions run directly unless `dryRun: true` is requested, and are approval-gated per the standing
127
+ grant above. Stop actions can discard active pane work, so they remain previews by default and require
128
+ `confirm: "yes-tmux-stop"` for execution. Existing sessions are never replaced silently; `force: true`
129
+ archives an old job directory but does not kill a live tmux session.
47
130
 
48
131
  The package includes the extension README and team templates under `dist/bundled-resources/extensions/tmux-agent-manager/`; the source repository keeps them under the matching `src/bundled-resources/` path.
package/docs/windows.md CHANGED
@@ -10,13 +10,62 @@ Pi supports native Windows on x64 and ARM64. The Node.js package runs under Wind
10
10
  - Git for Windows for native Git commands
11
11
  - Windows Terminal, WezTerm, or the VS Code terminal for the best keyboard support
12
12
 
13
- The model always sees one stable `bash` tool contract. On Windows, Pi parses one simple command, converts supported Bash-like builtins and external argv deterministically to PowerShell, and fails closed for unsupported syntax. The agent never selects a shell or emits native PowerShell. Pi resolves the Windows backend in this order:
13
+ The model always sees one stable `bash` tool contract. On Windows, a deterministic router classifies every command into one of three tiers instead of parsing the full Bash grammar in one place:
14
+
15
+ 1. **PowerShell floor** (always available): one simple command — a bounded set of builtin translations or a quoted external argv — converted deterministically to PowerShell, exactly as before this tier existed.
16
+ 2. **Bundled Python engine** (uv-provisioned Python 3.13, on by default): pipelines, redirection, chaining, quoting, expansion, globs, and the coreutils vocabulary below, plus every state-mutating command (`cd`, `export`, `unset`), which the engine always owns so there is a single mutator.
17
+ 3. **Named fail-closed refusal**: constructs outside the supported grammar (see below) return an actionable error naming the construct instead of guessing or downgrading silently.
18
+
19
+ The agent never selects a shell or emits native PowerShell or Python. Pi resolves the PowerShell executable in this order:
14
20
 
15
21
  1. `shellPath` in `%USERPROFILE%\.pi\agent\settings.json`
16
22
  2. PowerShell 7 (`pwsh.exe`) on `PATH` or under `Program Files`
17
23
  3. Windows PowerShell (`powershell.exe`) under `System32` or on `PATH`
18
24
 
19
- The backend runs with `-NoLogo -NoProfile -NonInteractive -Command` and a best-effort UTF-8 console-output prefix. Supported contract forms include quoted external commands and bounded forms of `pwd`, `echo`, `which`, `ls`, `cat`, `head`, `tail`, `grep`, `find`, `rm`, `cp`, `mv`, `mkdir`, and `touch`. Pipelines, redirection, variable or command expansion, shell chaining, nested shells, POSIX scripts, unclosed quotes, and unsupported builtin options return an actionable error instead of reaching PowerShell unchanged. Every agent, interactive, and RPC shell call has a 120-second wall-clock default, even while output continues.
25
+ The PowerShell tier runs with `-NoLogo -NoProfile -NonInteractive -Command` and a best-effort UTF-8 console-output prefix. Every agent, interactive, and RPC shell call has a 120-second wall-clock default, even while output continues.
26
+
27
+ ### Supported forms
28
+
29
+ | Grammar | Forms | Notes |
30
+ | --- | --- | --- |
31
+ | Pipeline | `a \| b \| c` | Real OS pipes, binary-safe; exit code is the last element's (after `!`). |
32
+ | Sequencing | `a ; b`, newline-separated, `a && b`, `a \|\| b`, `! pipeline` | Left-to-right / short-circuit / negation, bash-standard. |
33
+ | Subshell | `( … )` | Isolated cwd/env copy — inner `cd`/`export` do not leak out. |
34
+ | Brace group | `{ …; }` | Shares state — inner `cd`/`export` persist. |
35
+ | Redirection | `>`, `>>`, `1>`, `1>>`, `<`, `2>`, `2>>`, `2>&1`, `&>`, `>&` | `/dev/null` maps to `os.devnull`. A builtin's stderr is merged into its own stdout (one sink) — an explicit `2>file` on a builtin does not capture its error text; external commands capture normally. |
36
+ | Quoting | `'…'`, `"…"`, `\x`, `$'…'` | Standard single/double/backslash/ANSI-C semantics. |
37
+ | Tilde | `~`, `~/x` | Word-start, unquoted, expands to `$HOME`. `~user` is unsupported (refusal). |
38
+ | Parameter expansion | `$VAR`, `${VAR}`, `${V:-w}`, `${V:=w}`, `${V:+w}`, `${V:?w}`, `${#VAR}` | POSIX `:`-prefixed (empty-or-unset) semantics only; other `${…}` operators refuse. |
39
+ | Command substitution | `$(…)`, `` `…` `` | Runs through the same executor; trailing newlines stripped; nesting bounded to depth 8. |
40
+ | Glob | `*`, `?`, `[…]` | Case-sensitive, `/`-normalized, ordinal (`LC_ALL=C`) sort; final path segment only; no match falls back to the literal word. |
41
+ | Assignment | `NAME=value` (standalone or prefixed to a command) | Standalone sets engine env for the session; prefixed applies only to that command. No shell-var/exported-env split — every assignment sets env. |
42
+
43
+ Builtins: `cd`, `pwd`, `echo [-n -e -E]`, `printf`, `export`, `unset`, `true`, `false`, `which`, `test`/`[`, `ls [-a -A -1 -r]`, `cat`, `head [-n N]`, `tail [-n N]`, `grep [-i -v -n -c -l -w -F -E]`, `find [-type f|d] [-name GLOB]`, `rm [-f -r -rf]`, `cp [-r|-R]`, `mv`, `mkdir [-p]`, `touch`, `wc [-l -w -c -m]`, `sort [-r -n -u -f]`, `uniq [-c -d -u -i]`, `cut -d/-f` or `-c`, `tr [-d -s -c]`, `basename`, `dirname`, `sed 's/RE/REPL/[g][i]'` (substitute only), `xargs [-0 -n -I]`. An unknown flag on a listed builtin, or any builtin/form not listed, returns a named `unsupported-flag`/`unsupported-builtin` refusal rather than a guess.
44
+
45
+ ### Divergences from bash (intentional, documented)
46
+
47
+ - `grep`/`sed` regex is Python `re`, not POSIX BRE/ERE.
48
+ - `ls`/`find` output always uses a trailing `/` on directories, `/`-normalized paths, and ordinal sort — matching the PowerShell floor so output is identical regardless of which tier ran.
49
+ - `wc`/`uniq -c` column widths reproduce GNU's dynamic field width only for the single-count stdin case; multi-count/file-arg forms use fixed deterministic padding.
50
+ - No shell-variable vs. exported-environment distinction: every `NAME=value` sets engine env.
51
+ - Sorting is always ordinal (`LC_ALL=C`): globs, `ls`, `find`, and default `sort`.
52
+ - A builtin's stderr is merged into its own stdout; only external commands honor an explicit `2>`.
53
+ - Globs expand only the final path segment (`dir/*.py` works; `*/x.py` matches the directory part literally).
54
+ - `wc -m` counts UTF-8 characters (bash under `LC_ALL=C` counts bytes).
55
+
56
+ ### Named unsupported constructs
57
+
58
+ Each of these fails closed with a named, actionable error instead of an approximation: `job-control` (trailing `&`, `fg`/`bg`/`jobs`/`wait`/`disown`), `process-substitution` (`<(…)`/`>(…)`), `arithmetic-expansion` (`$((…))`, `((…))`, `let`), `brace-expansion` (`{a,b,c}`), `nested-shell` (`bash`/`sh`/`cmd`/`powershell`/`pwsh`/`wsl`/… as a command word), `exec-builtin`, `heredoc`/`here-string` (`<<`, `<<-`, `<<<`), `function-definition`, `control-flow` (`if`/`for`/`while`/`until`/`case`/`select`), `extended-glob` (`@(…)`, `!(…)`, etc.), `unsupported-builtin` (`eval`, `source`/`.`, `alias`, `trap`, `set`, `shopt`, `read`, `declare`, `local`), `unsupported-flag`, `posix-script` (`*.sh`, `/bin/…`), `cwd-missing`, `tilde-user`, `malformed-syntax` (unbalanced quote/paren/brace, empty pipeline element, missing redirect target), `parameter-expansion` (a `${…}` form outside the supported op set).
59
+
60
+ ### State and session semantics
61
+
62
+ `cd`, `export`, and `unset` always route to the Python engine, the sole mutator of session state (working directory and environment). That state is held once per agent session and read by both tiers: the next call — whether it routes to the PowerShell floor or back to the engine — sees the updated cwd/env. A subshell `( … )` runs against an isolated copy and never leaks its `cd`/`export` back out; a brace group `{ …; }` shares and persists state like the top level.
63
+
64
+ ### The `windowsShell.pythonEngine` setting and degradation
65
+
66
+ `windowsShell.pythonEngine` (default `true`) is the kill switch. Set it to `false` to restore the PowerShell-only contract verbatim: only the simple-command floor is used, and every pipeline/redirection/expansion/chaining form that would have routed to the engine instead returns the same fail-closed error it did before the engine existed.
67
+
68
+ When the setting is left on but the bundled Python runtime cannot be resolved (uv missing, network failure provisioning Python 3.13, or similar), the engine tier is simply unavailable: simple commands still run on the PowerShell floor exactly as always, and any command that needs the engine returns a named error stating the Python runtime is unavailable, that the simple-command floor still works, and to fix `uv`/network to restore pipelines, redirection, expansion, and chaining. There is no silent approximation — a complex command is never downgraded to a plausible-but-wrong simple execution.
20
69
 
21
70
  The native `python` tool uses the same contract on Windows and Unix-like systems. Pi provisions a pinned uv executable, resolves or installs Python 3.13 through uv, then spawns the interpreter directly with UTF-8 and bytecode-cache suppression. Python calls default to 30 seconds. See [Native Python](python.md).
22
71
 
@@ -47,7 +96,7 @@ A Windows release is expected to preserve the same Pi features as Linux and macO
47
96
  | --- | --- | --- |
48
97
  | CLI, print, JSON, and RPC modes | Native | Full package build and test suite on `windows-latest` |
49
98
  | Interactive TUI and configurable keybindings | Native | TUI tests on Windows; packaged `win32-console-mode.node`; Windows Terminal mappings below |
50
- | `read`, `write`, `edit`, `grep`, `find`, and stable `bash` contract tools | Native; Bash-like commands are routed deterministically to PowerShell | Router/platform-shell tests plus native Windows CI; release `pi.exe` executes the platform shell through RPC |
99
+ | `read`, `write`, `edit`, `grep`, `find`, and stable `bash` contract tools | Native; Bash-like commands are routed deterministically across a PowerShell floor and a bundled Python shell engine (pipelines, redirection, chaining, expansion, coreutils), with named refusals outside that grammar | Router/platform-shell tests, engine conformance suite, Linux differential bash-oracle suite, and Windows cross-tier integration tests, plus native Windows CI; release `pi.exe` executes the platform shell through RPC |
51
100
  | Provider APIs, OAuth, API-key auth, model routing, and retries | Native | AI, agent, and coding-agent tests on Windows; live credentials are not used in CI |
52
101
  | Extensions, skills, prompts, themes, and pi packages | Native | Discovery, loading, reload, package-manager, and isolation tests on Windows |
53
102
  | Sessions, branching, compaction, context storage, export, and sharing | Native | Agent and coding-agent session tests on Windows |
@@ -39,3 +39,32 @@ Use a named run only for transient coordination that must be shared across Pi pr
39
39
  Configuration and durable user data stay outside `work/`: `settings.json`, `auth.json`, `models.json`, `sessions/`, `state/`, `skills/`, `extensions/`, `prompts/`, `themes/`, profiles, backups, and managed binaries.
40
40
 
41
41
  Do not put Automata memory or its graph in Pi's work directory. Automata remains an external memory system.
42
+
43
+ ## Agent directory layout
44
+
45
+ `work/` is one wedge of the full canonical layout under `~/.pi/agent/` (`getAgentDir()`). Everything
46
+ machine-managed resolves through one typed path module, `src/core/agent-paths.ts` — every writer of
47
+ machine data (stores, caches, managed runtimes/models, cross-process coordination) goes through it
48
+ instead of hand-rolling `join(agentDir, …)`, so a new writer can't silently reintroduce a root-level
49
+ straggler:
50
+
51
+ ```text
52
+ ~/.pi/agent/
53
+ auth.json settings.json models.json keybindings.json MEMORY.md USER.md SYSTEM.md … user config/memory (root)
54
+ skills/ extensions/ prompts/ themes/ profiles/ user resources (root)
55
+ state/ durable machine state: model adaptation/fitness, tool-performance, -- stateDir/stateFile
56
+ learning observations, trust decisions (trust.json), failure corpus, …
57
+ cache/ rebuildable, safe to delete: tool-path probes, jiti transform cache, uv -- cacheDir/cacheFile
58
+ bin/ managed executable helpers (fd, rg) -- binDir (legacy getBinDir accessor)
59
+ work/ transient/scratch (this document) -- re-exported from agent-paths.ts
60
+ runtimes/<kind> models/<kind> sessions/ npm/ git/ worktrees/ -- runtimesDir/modelsDir/sessionsDir/npmDir/gitDir/worktreesDir
61
+ ```
62
+
63
+ `state/` holds durable history — deleting it loses real data, not just cache. `cache/` is always safe
64
+ to delete; the next run re-probes or recomputes it. A startup migration (`migrateAgentDirLayout`,
65
+ `src/migrations.ts`, run before any store/trust read) relocates confirmed root-level stragglers into
66
+ their canonical location — currently just `trust.json` into `state/` — idempotently and without ever
67
+ overwriting an already-migrated target. `resource-profiles/` intentionally stays at the agent-directory
68
+ root rather than moving under `state/`: it's surfaced in two user-visible profile-menu description
69
+ strings, and moving it needs those updated in the same change (tracked open in the bug ledger, not a
70
+ silent gap).
@@ -0,0 +1,250 @@
1
+ # worktree-sync
2
+
3
+ `worktree_sync` is a core (built-in, not extension) tool: a hard-gated, worktree-per-lane
4
+ parallel-work workflow for a solo developer who does not use PRs. Every writing agent works in
5
+ its own local git worktree on its own lane branch; integration is always rebase-onto-main +
6
+ fast-forward — linear history, no merge commits, no PRs, no push. `origin` is never touched;
7
+ push stays a manual owner act.
8
+
9
+ ## Workflow overview
10
+
11
+ 1. A lane worktree is created off main (`create_lane`) with its own branch (`pi/wt/<laneKey>`).
12
+ 2. The agent bound to the lane works and commits inside that worktree only.
13
+ 3. Before landing, the lane must be fresh relative to main: `sync` rebases current main onto the
14
+ lane branch. A clean rebase leaves the lane fresh; conflicts leave the rebase in progress and
15
+ return a structured worklist.
16
+ 4. `land` is the only door to main: serialized under one integration lock, freshness-checked,
17
+ gate-command-verified, fast-forward-only.
18
+ 5. A successful land bumps a shared integration epoch and marks every other active lane stale —
19
+ structurally, not by convention — so the next lane to touch files or land is directed to sync
20
+ first.
21
+ 6. `release_lane` removes a fully-landed, clean lane worktree and branch.
22
+
23
+ Correctness never depends on a notification arriving; it depends on `land`'s own freshness check
24
+ (G3 below), re-derived from git at land time while holding the lock. Notifications only make
25
+ lanes aware *promptly*.
26
+
27
+ ## Enabling
28
+
29
+ Enabled by default; `"worktreeSync": { "enabled": false }` is the explicit off-switch — zero
30
+ behavior change once set. Settings live under `worktreeSync` in `settings.json`:
31
+
32
+ | Key | Default | Meaning |
33
+ |---|---|---|
34
+ | `enabled` | `true` | Master switch. Explicit `false` is the hard off-switch: the tool is hidden and no gating runs. |
35
+ | `mainBranch` | unset (auto) | Overrides default-branch resolution (`main`, then `master`; never guessed further). |
36
+ | `syncPolicy` | `"on_land_mandatory"` | Staleness-propagation policy — see below. |
37
+ | `gateCommand` | unset | Land gate command (G4), e.g. `"npm run check"`, run in the lane worktree at the exact tip that becomes main. |
38
+ | `gate` | `"on"` | `"off"` is the owner-level G4 opt-out, recorded per land event. Agents cannot flip this at runtime. |
39
+ | `gateTimeoutMs` | `900000` | Gate command timeout. |
40
+ | `maxLanes` | `5` | Active-lane ceiling; `create_lane` refuses beyond it. |
41
+ | `worktreesRoot` | agent-paths default | Overrides the lane-checkout root. |
42
+ | `workerLand` | `"deny"` | `"allow"` lets a WORKER session (see "Identity, UAC, and zero footprint" below) run `land` on its own bound lane; still subject to normal freshness/ownership gating. |
43
+
44
+ `syncPolicy` values:
45
+
46
+ - **`on_land_mandatory`** (default) — every successful land marks every *other* active lane
47
+ `sync_required`; under this policy a stale lane's file mutations are refused until it syncs.
48
+ - **`overlap_mandatory`** — `sync_required` fires only when the land's changed paths overlap the
49
+ lane's own changed paths; otherwise staleness stays advisory until land time.
50
+ - **`land_time_only`** — staleness is always advisory; only the land gate (G3) enforces.
51
+
52
+ ## The hard gates (G1–G11)
53
+
54
+ Enforced in core code paths, never by prompt compliance. Every refusal carries a tagged code and
55
+ appends an audit event.
56
+
57
+ | # | Gate |
58
+ |---|---|
59
+ | G1 | `land` is serialized under one integration lock — two concurrent lands are impossible. |
60
+ | G2 | `land` requires the lane worktree clean (no uncommitted/untracked-modified state). Refusal: `lane_dirty`. |
61
+ | G3 | `land` requires the lane fresh (current main is an ancestor of the lane tip), re-derived from git while holding the lock. Refusal: `stale_lane` + a structural sync directive. This is the backstop that cannot be evaded even if every notification failed. |
62
+ | G4 | `land` requires the configured gate command to pass at the exact tip that will become main, unless the owner set `gate: "off"` (recorded per land event). |
63
+ | G5 | Main only ever moves by a fast-forward merge of the lane branch in the hub checkout — no merge commits, no force, no rewrite of main. |
64
+ | G6 | `land` refuses `hub_dirty` only when hub-local modifications intersect the land's changed-file set (overlap-based, not pristine-hub-based). |
65
+ | G7 | A successful land bumps the epoch and broadcasts staleness in the same critical section as the merge, before the lock releases. |
66
+ | G8 | A stale lane under the mandatory policy is refused by the file-mutation tools (edit/write/mutating bash) of a lane-bound `pi` session until it syncs. Hard for `pi` children; cooperative for foreign CLIs. |
67
+ | G9 | Sync completion requires the rebase finished, zero conflict markers (byte-scanned), and freshness passing. Refusals: `conflict_markers_present`, `rebase_in_progress`. |
68
+ | G10 | No lane touches main directly — a lane-bound `pi` session's `git commit/merge/rebase/reset/switch` targeting main is refused (`main_mutation_refused`). Main is written by the land gate alone. |
69
+ | G11 | A lane with unlanded commits or dirty state is never auto-deleted; `release_lane` on such a lane requires `confirm: "yes-discard-lane"`. |
70
+
71
+ ## The `worktree_sync` tool
72
+
73
+ One tool, eight actions — the entire agent-facing surface, so a model never improvises git
74
+ ceremony. Every outcome carries a tagged code (`details.code`) and refusal text always names the
75
+ exact recovery step.
76
+
77
+ | Action | Effect |
78
+ |---|---|
79
+ | `status` | The deterministic full picture: epoch, hub state, lock, per-lane freshness/staleness/dirty/rebase state, and a one-sentence assembled `advice`. Read-only. |
80
+ | `create_lane` | Worktree add + branch + registration off main. Params: `laneKey?` (else auto-allocated), `goalId?`, `requirementId?`. |
81
+ | `sync` | Rebases current main into the lane branch. Clean → lane fresh. Conflicts → rebase left in progress plus a structured worklist. |
82
+ | `continue` | After conflicts are resolved: verifies zero conflict markers, stages, and drives the rebase to completion (looping per conflicted commit). |
83
+ | `abort_sync` | Aborts the in-progress rebase; the lane returns to its pre-sync tip, still honestly reported as stale. |
84
+ | `land` | The full G1–G7 pipeline. On success returns the new epoch and main sha. |
85
+ | `release_lane` | Unregisters the lane and removes the worktree/branch — only when fully landed and clean, else the G11 confirm. |
86
+ | `reconcile` | Re-syncs the lane registry with git reality (orphaned worktrees, stale locks, cleared owners). Runs automatically at startup; also directly callable. |
87
+
88
+ ## Lane lifecycle
89
+
90
+ `create` → work/commit on the lane branch → `sync` (rebase current main in) → resolve conflicts
91
+ locally and `continue` → `land` → (optionally) `release`. Landing does not happen automatically
92
+ when a worker finishes its task — it is a distinct, deliberate step the orchestrator (or the
93
+ worker, when instructed) triggers, since the gate run at land time is itself the evidence the
94
+ goal record relies on.
95
+
96
+ ## Session binding: `PI_WORKTREE_LANE` / `--worktree-lane`
97
+
98
+ A session becomes lane-bound via the `PI_WORKTREE_LANE=<laneKey>` environment variable, or the
99
+ `--worktree-lane <laneKey>` CLI flag (sugar over the same env contract — tmux panes launched by a
100
+ lane-first goal dispatch inherit it automatically). A lane-bound session:
101
+
102
+ - gets the G8/G10 lane gate wrapped under its file-mutation tools (edit/write/bash);
103
+ - defaults `worktree_sync`'s `laneKey` param to its own bound lane for `sync`/`continue`/
104
+ `abort_sync`/`land`, so the model rarely needs to pass it explicitly;
105
+ - runs a lane-sync watcher (an `fs.watch` on the shared epoch file, checked at every turn start)
106
+ that injects a source-labelled system notice when the epoch changes, so the session learns
107
+ about staleness promptly instead of only at its next `status` call.
108
+
109
+ A goal-bound tmux dispatch (`goal` tool's `dispatch_worker` with `dispatchTarget: "tmux"`, when
110
+ `worktreeSync.enabled`) creates the lane first, then launches its `pi` worker with `--worktree-lane
111
+ <laneKey>` and one extra system-prompt clause naming the lane doctrine (work only inside this
112
+ lane's worktree; integrate exclusively via `worktree_sync land`; never touch main directly). A
113
+ lane-creation refusal (e.g. `maxLanes` reached) aborts the dispatch cleanly before any tmux
114
+ session is ever launched (`dispatchSkipReason: "worktree_create_failed"`).
115
+
116
+ ## Capability adaptation
117
+
118
+ The lane-worker surface adapts to the model actually driving it, riding the existing model-capability
119
+ system (`core/model-capability.ts`) rather than a parallel mechanism. A model is eligible to drive a
120
+ worktree-sync lane worker only if it is BOTH capability class `full` AND has a working native
121
+ tool-call path:
122
+
123
+ - **Class `full`** with a DECLARED context window: the classifier reads the model's own REGISTRY
124
+ metadata (`Model.contextWindow` -- the source of truth), never the live serving context a local
125
+ runtime happens to be configured with; an unknown/undeclared window is treated as ineligible for
126
+ lane-worker duty even though it defaults to class `full` for the general tool surface.
127
+ - **Advertised native tool calling**: `Model.textToolCallProtocol` unset or `false`. A model with
128
+ `textToolCallProtocol: true` is phone-only by declaration and never eligible.
129
+ - **Not graded-demoted**: a persisted `/toolprobe` verdict of `"text-protocol"` or `"none"` makes the
130
+ model ineligible. An UNPROBED model (no verdict on record yet) is eligible on its advertised
131
+ support alone -- unprobed is never treated as demoted.
132
+
133
+ Additionally, the lean capability class (16k-32k context window) sheds the orchestration surface
134
+ entirely: `goal`, `worktree_sync`, `improvement_loop`, `extensionify`, `skillify`, `model_fitness`,
135
+ `context_scout`, and `tmux_agent_manager` are blocked for a lean-class session regardless of lane
136
+ binding (`MODEL_CAPABILITY_LEAN_BLOCKED_TOOLS`) -- `run_toolkit_script` and `task_steps` stay
137
+ available by design.
138
+
139
+ Two refusal points, one authority:
140
+
141
+ - A goal→tmux dispatch (`tools/tmux-dispatch.ts`'s `dispatchTmuxWorker`) checks the DISPATCHING
142
+ session's own eligibility FIRST, before `createLaneWorktree` or any `fire_task` call --
143
+ `dispatchSkipReason: "worker_capability_insufficient"`, zero lane/pane side effect on refusal. This
144
+ is the parent's best-effort expectation only; it can race a model swap between dispatch and child
145
+ startup.
146
+ - The DISPATCHED child session refuses AUTHORITATIVELY at its own startup (main.ts), regardless of
147
+ how it became lane-bound (`--worktree-lane`, `PI_WORKTREE_LANE`, or a launcher-set env): an
148
+ ineligible model prints a deterministic, greppable refusal line (`formatLaneWorkerRefusal`, prefix
149
+ `worktree-sync lane-worker refusal:`) and exits with a non-zero status before the lane gate or the
150
+ epoch watcher ever start. There is no silent unbinding -- a session that cannot drive the surface
151
+ never gets a reduced version of it, it never starts.
152
+
153
+ Enforcement is orthogonal to prompt complexity: the lane gate (G8/G10) and the epoch watcher stay
154
+ wired for every OTHER session exactly as before this system existed. An ineligible session simply
155
+ never reaches them, because it never reaches session startup's live phase at all.
156
+
157
+ ## Identity, UAC, and zero footprint
158
+
159
+ A session's **role** (`main` or `worker`) is derived structurally, never asserted by the session
160
+ itself (`core/session-role.ts`): a session is a **worker** iff it is bound to a worktree-sync lane
161
+ (`PI_WORKTREE_LANE`) OR launched with `PI_SESSION_ROLE=worker`. `PI_SESSION_ROLE=main` is
162
+ deliberately **not** an escalation -- it can never override a bound lane, so there is no
163
+ environment value a lane-bound process can set to shed the worker ceiling below.
164
+
165
+ ### Forbidden-tool ceiling
166
+
167
+ A worker session can never activate: `goal`, `delegate`, `delegate_status`, `improvement_loop`,
168
+ `extensionify`, `skillify`, `run_toolkit_script`, `model_fitness`, `tmux_agent_manager`,
169
+ `context_scout`, `python`. This is enforced as the FIRST line of the tool registry's allow
170
+ predicate (`RuntimeBuilder.refreshToolRegistry`'s `isAllowedTool`) -- it wins over an allow-list,
171
+ an exclude-list, or an active resource profile that names the tool explicitly. `goal`/`delegate`/
172
+ `delegate_status`/`tmux_agent_manager` are sub-orchestration (a worker dispatching its own workers
173
+ defeats single-owner lane accountability); `improvement_loop`/`extensionify`/`skillify` are
174
+ self-adaptation surface a worker should never mutate; `run_toolkit_script`/`model_fitness` spend
175
+ budget a worker's dispatcher does not control. **`python`** is included because it is a bounded but
176
+ still largely unrestricted execution contract -- excluding it is load-bearing for the zero-footprint
177
+ guarantee below (an unbounded interpreter can write state anywhere it can reach on disk).
178
+ **`context_scout`** is excluded because it is itself sub-orchestration: it spawns its own isolated
179
+ agent loop.
180
+
181
+ `bash` is deliberately **not** forbidden. It stays available as the same documented cooperative
182
+ boundary the lane gate already applies to foreign (non-`pi`) CLIs it cannot structurally contain --
183
+ a worker's bash access is bounded by the lane gate's G8/G10 rules and the path envelope below, not
184
+ by removing the tool.
185
+
186
+ ### `worktree_sync` tool scoping for a worker
187
+
188
+ A worker session's `worktree_sync` calls are narrowed at the tool layer (independent of the engine
189
+ -- see the next section):
190
+
191
+ - `status`, `sync`, `continue`, `abort_sync` stay available unconditionally.
192
+ - `create_lane`, `release_lane`, `reconcile` are always refused (`role_forbidden`).
193
+ - `land` is refused by default (`role_forbidden`); the new `worktreeSync.workerLand` setting
194
+ (`"deny"` default, `"allow"` opt-in) lets a worker land its own lane when set -- still subject to
195
+ the normal freshness/ownership gates below.
196
+ - An explicit `laneKey` that differs from the session's own bound lane is always refused
197
+ (`role_forbidden`): a worker may only ever target its own lane.
198
+
199
+ ### Land/release ownership
200
+
201
+ `land` and `release_lane` refuse `lane_owner_conflict` when the target lane is owned (its
202
+ registration's `ownerSessionId`) by a **different, still-alive** session -- same-host pid liveness,
203
+ the same pattern the integration lock and `reconcile` already use. A lane with no recorded owner,
204
+ owned by the calling session itself, or whose recorded owner is dead never conflicts. This check is
205
+ deliberately engine-level and applies to `land`/`release_lane` ONLY -- `sync`/`continue`/
206
+ `abort_sync` are never owner-gated at the engine; a worker's cross-lane containment for those comes
207
+ from the tool-layer `laneKey` check above. `release_lane`'s existing G11 discard-confirm requirement
208
+ is unaffected: it still applies once ownership no longer conflicts.
209
+
210
+ ### Edit/write path envelope
211
+
212
+ For a lane-bound session, `edit`/`write` targets are checked against the lane's own worktree root
213
+ (`WorktreeLaneGate.checkMutation`'s `targetPath` parameter, resolved by `RuntimeBuilder`'s tool
214
+ wrapper via the same `resolveToCwd` the tools themselves use). The check is symlink-safe: the
215
+ lane's worktree root and the target are both resolved through `realpath` (walking up to the target's
216
+ nearest EXISTING ancestor when the target itself does not exist yet, so a not-yet-created file
217
+ cannot be smuggled through a symlink that escapes the lane). A target outside the resolved lane root
218
+ is refused (`path_outside_lane`). No active lane record leaves the existing fail-open behavior
219
+ unchanged. `bash` is untouched by this check -- its containment stays the G10 cooperative boundary
220
+ described above.
221
+
222
+ ### Zero state/settings footprint
223
+
224
+ A worker session leaves no footprint in `~/.pi/agent/state` or `settings.json`: every scattered
225
+ on-disk store (`ToolPerformanceStore`, `ObservationStore`, `ModelAdaptationStore`, `FitnessStore`,
226
+ `ProjectTrustStore`) takes a `readOnly` constructor option defaulting to `isWorkerSession()`, gated
227
+ ABOVE any locking/directory-creation the store's write path performs -- never at the innermost
228
+ `writeFileSync` alone, since the lock itself already creates a lockfile and parent directory before
229
+ any write. A read-only store still returns the value a real write would have produced (e.g.
230
+ `ObservationStore.increment` returns `base + 1`, `ModelAdaptationStore`'s internal `store()` returns
231
+ the computed entry) so callers see normal in-memory behavior; nothing durable ever lands on disk.
232
+ `SettingsManager`'s single write choke (`enqueueWrite`, used by every settings scope: global,
233
+ project, and directory-profile) is gated the same way -- a worker session never writes
234
+ `settings.json` in any scope; in-memory settings reads are unaffected since callers update the
235
+ in-memory state before reaching the write queue. The one INTENTIONAL artifact a worker session still
236
+ produces is its own session transcript -- that is the point of running it, not a footprint to avoid.
237
+
238
+ ## Trust boundary (honest, not faked)
239
+
240
+ - **`pi` children are hard-gated**: G8/G10 run in core code, wrapped under the file-mutation
241
+ tools of any lane-bound `pi` session — a stale mutation or a direct write to main is refused
242
+ structurally, not by prompt compliance.
243
+ - **Foreign CLIs (agy/claude/codex/opencode/custom) are cooperative only**: their internal tool
244
+ loop is that CLI's own responsibility; the harness cannot enforce G8/G10 inside a process it
245
+ does not control. Sync directives can still be pushed to a live foreign pane via the tmux
246
+ extension's existing `send_followup`, but compliance is not guaranteed.
247
+ - **The land gate (G1–G7) is the backstop that cannot be evaded by either kind of worker**: no
248
+ matter how a lane got dirty, stale, or ignored a notification, `land` re-derives freshness and
249
+ cleanliness from git itself while holding the integration lock. A stale or dirty lane cannot
250
+ land, full stop.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "0.81.38",
3
+ "version": "0.81.39",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-custom-provider",
9
- "version": "0.81.38",
9
+ "version": "0.81.39",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.52.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "0.81.38",
4
+ "version": "0.81.39",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "0.81.38",
4
+ "version": "0.81.39",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
- "version": "0.81.38",
3
+ "version": "0.81.39",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-sandbox",
9
- "version": "0.81.38",
9
+ "version": "0.81.39",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
3
  "private": true,
4
- "version": "0.81.38",
4
+ "version": "0.81.39",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "0.81.38",
3
+ "version": "0.81.39",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "0.81.38",
9
+ "version": "0.81.39",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "0.81.38",
4
+ "version": "0.81.39",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "name": "@caupulican/pi-adaptative",
3
- "version": "0.81.38",
3
+ "version": "0.81.39",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@caupulican/pi-adaptative",
9
- "version": "0.81.38",
9
+ "version": "0.81.39",
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
- "@caupulican/pi-agent-core": "^0.81.38",
13
- "@caupulican/pi-ai": "^0.81.38",
14
- "@caupulican/pi-tui": "^0.81.38",
12
+ "@caupulican/pi-agent-core": "^0.81.39",
13
+ "@caupulican/pi-ai": "^0.81.39",
14
+ "@caupulican/pi-tui": "^0.81.39",
15
15
  "@silvia-odwyer/photon-node": "0.3.4",
16
16
  "chalk": "5.6.2",
17
17
  "cross-spawn": "7.0.6",
@@ -475,11 +475,11 @@
475
475
  }
476
476
  },
477
477
  "node_modules/@caupulican/pi-agent-core": {
478
- "version": "0.81.38",
479
- "resolved": "https://registry.npmjs.org/@caupulican/pi-agent-core/-/pi-agent-core-0.81.38.tgz",
478
+ "version": "0.81.39",
479
+ "resolved": "https://registry.npmjs.org/@caupulican/pi-agent-core/-/pi-agent-core-0.81.39.tgz",
480
480
  "license": "MIT",
481
481
  "dependencies": {
482
- "@caupulican/pi-ai": "^0.81.38",
482
+ "@caupulican/pi-ai": "^0.81.39",
483
483
  "ignore": "7.0.5",
484
484
  "typebox": "1.1.38",
485
485
  "yaml": "2.9.0"
@@ -489,8 +489,8 @@
489
489
  }
490
490
  },
491
491
  "node_modules/@caupulican/pi-ai": {
492
- "version": "0.81.38",
493
- "resolved": "https://registry.npmjs.org/@caupulican/pi-ai/-/pi-ai-0.81.38.tgz",
492
+ "version": "0.81.39",
493
+ "resolved": "https://registry.npmjs.org/@caupulican/pi-ai/-/pi-ai-0.81.39.tgz",
494
494
  "license": "MIT",
495
495
  "dependencies": {
496
496
  "@anthropic-ai/sdk": "0.91.1",
@@ -542,8 +542,8 @@
542
542
  }
543
543
  },
544
544
  "node_modules/@caupulican/pi-tui": {
545
- "version": "0.81.38",
546
- "resolved": "https://registry.npmjs.org/@caupulican/pi-tui/-/pi-tui-0.81.38.tgz",
545
+ "version": "0.81.39",
546
+ "resolved": "https://registry.npmjs.org/@caupulican/pi-tui/-/pi-tui-0.81.39.tgz",
547
547
  "license": "MIT",
548
548
  "dependencies": {
549
549
  "get-east-asian-width": "1.6.0",