@selesai/code 0.13.16 → 0.13.18

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 (467) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +2 -14
  3. package/dist/bun/cli.d.ts +3 -1
  4. package/dist/bun/cli.js +3 -9
  5. package/dist/bun/{register-bedrock.js → runtime-setup.js} +5 -0
  6. package/dist/bun/sandbox-env-setup.d.ts +1 -0
  7. package/dist/bun/sandbox-env-setup.js +3 -0
  8. package/dist/cli/auth-command.d.ts +23 -0
  9. package/dist/cli/auth-command.js +102 -0
  10. package/dist/cli/config-selector.js +2 -1
  11. package/dist/cli/setup.d.ts +1 -0
  12. package/dist/cli/setup.js +11 -0
  13. package/dist/cli.js +2 -14
  14. package/dist/config.d.ts +3 -2
  15. package/dist/config.js +9 -4
  16. package/dist/core/agent-session-runtime.js +15 -7
  17. package/dist/core/agent-session.d.ts +2 -6
  18. package/dist/core/agent-session.js +15 -4
  19. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  20. package/dist/core/compaction/branch-summarization.js +2 -1
  21. package/dist/core/extensions/loader.js +3 -0
  22. package/dist/core/extensions/types.d.ts +16 -2
  23. package/dist/core/http-dispatcher.js +2 -0
  24. package/dist/core/keybindings.d.ts +5 -0
  25. package/dist/core/keybindings.js +4 -0
  26. package/dist/core/messages.d.ts +1 -1
  27. package/dist/core/model-config.d.ts +15 -0
  28. package/dist/core/model-config.js +3 -0
  29. package/dist/core/model-runtime.d.ts +1 -0
  30. package/dist/core/model-runtime.js +5 -2
  31. package/dist/core/provider-composer.js +8 -2
  32. package/dist/core/session-export.d.ts +3 -0
  33. package/dist/core/session-export.js +31 -0
  34. package/dist/core/session-manager.d.ts +3 -2
  35. package/dist/core/session-manager.js +40 -13
  36. package/dist/core/skills.d.ts +1 -1
  37. package/dist/core/skills.js +4 -2
  38. package/dist/core/system-prompt.js +10 -10
  39. package/dist/core/tools/bash.js +3 -117
  40. package/dist/core/tools/edit.d.ts +1 -12
  41. package/dist/core/tools/edit.js +5 -163
  42. package/dist/core/tools/find.js +4 -55
  43. package/dist/core/tools/grep.js +4 -60
  44. package/dist/core/tools/ls.js +4 -49
  45. package/dist/core/tools/read.d.ts +4 -0
  46. package/dist/core/tools/read.js +10 -122
  47. package/dist/core/tools/renderers/bash.d.ts +11 -0
  48. package/dist/core/tools/renderers/bash.js +129 -0
  49. package/dist/core/tools/renderers/edit.d.ts +22 -0
  50. package/dist/core/tools/renderers/edit.js +166 -0
  51. package/dist/core/tools/renderers/find.d.ts +9 -0
  52. package/dist/core/tools/renderers/find.js +63 -0
  53. package/dist/core/tools/renderers/grep.d.ts +9 -0
  54. package/dist/core/tools/renderers/grep.js +68 -0
  55. package/dist/core/tools/renderers/index.d.ts +27 -0
  56. package/dist/core/tools/renderers/index.js +46 -0
  57. package/dist/core/tools/renderers/ls.d.ts +9 -0
  58. package/dist/core/tools/renderers/ls.js +57 -0
  59. package/dist/core/tools/renderers/read.d.ts +10 -0
  60. package/dist/core/tools/renderers/read.js +128 -0
  61. package/dist/core/tools/renderers/write.d.ts +9 -0
  62. package/dist/core/tools/renderers/write.js +152 -0
  63. package/dist/core/tools/write.js +5 -146
  64. package/dist/extensions/pi-hermes-memory/CHANGELOG.md +18 -0
  65. package/dist/extensions/pi-hermes-memory/README.md +16 -12
  66. package/dist/extensions/pi-hermes-memory/docs/ROADMAP.md +1 -1
  67. package/dist/extensions/pi-hermes-memory/package-lock.json +587 -62
  68. package/dist/extensions/pi-hermes-memory/package.json +4 -4
  69. package/dist/extensions/pi-hermes-memory/src/config.ts +32 -0
  70. package/dist/extensions/pi-hermes-memory/src/constants.ts +12 -2
  71. package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +109 -51
  72. package/dist/extensions/pi-hermes-memory/src/handlers/index-sessions.ts +9 -3
  73. package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +257 -98
  74. package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +9 -2
  75. package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +5 -0
  76. package/dist/extensions/pi-hermes-memory/src/index.ts +22 -2
  77. package/dist/extensions/pi-hermes-memory/src/paths.ts +1 -1
  78. package/dist/extensions/pi-hermes-memory/src/store/db.ts +6 -0
  79. package/dist/extensions/pi-hermes-memory/src/store/fts-query.ts +58 -1
  80. package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +60 -8
  81. package/dist/extensions/pi-hermes-memory/src/store/session-indexer.ts +169 -7
  82. package/dist/extensions/pi-hermes-memory/src/store/session-search.ts +7 -21
  83. package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +134 -15
  84. package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +4 -2
  85. package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +24 -9
  86. package/dist/extensions/pi-hermes-memory/src/types.ts +11 -0
  87. package/dist/extensions/pi-hermes-memory/tests/config.test.ts +42 -0
  88. package/dist/extensions/pi-hermes-memory/tests/handlers/background-review.test.ts +159 -3
  89. package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +452 -0
  90. package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +39 -0
  91. package/dist/extensions/pi-hermes-memory/tests/integration/corruption-recovery-integration.test.ts +91 -0
  92. package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +29 -0
  93. package/dist/extensions/pi-hermes-memory/tests/store/fts-query.test.ts +116 -0
  94. package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +163 -0
  95. package/dist/extensions/pi-hermes-memory/tests/store/session-indexer.test.ts +233 -0
  96. package/dist/extensions/pi-hermes-memory/tests/store/session-search.test.ts +12 -0
  97. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +175 -0
  98. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-native.test.ts +2 -2
  99. package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +22 -0
  100. package/dist/extensions/pi-hermes-memory/tests/tools/memory-tool.test.ts +37 -1
  101. package/dist/extensions/pi-intercom/CHANGELOG.md +13 -0
  102. package/dist/extensions/pi-intercom/README.md +16 -2
  103. package/dist/extensions/pi-intercom/broker/spawn.test.ts +19 -2
  104. package/dist/extensions/pi-intercom/broker/spawn.ts +4 -4
  105. package/dist/extensions/pi-intercom/index.ts +1 -1
  106. package/dist/extensions/pi-intercom/intercom.integration.test.ts +121 -2
  107. package/dist/extensions/pi-intercom/package.json +1 -1
  108. package/dist/extensions/pi-intercom/project-agent.test.ts +1 -1
  109. package/dist/extensions/pi-intercom/project-agent.ts +1 -6
  110. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +7 -6
  111. package/dist/extensions/pi-rewind-hook/index.test.ts +7 -0
  112. package/dist/extensions/pi-subagents/.github/workflows/test.yml +36 -4
  113. package/dist/extensions/pi-subagents/CHANGELOG.md +120 -0
  114. package/dist/extensions/pi-subagents/README.md +3 -3
  115. package/dist/extensions/pi-subagents/agents/researcher.md +23 -13
  116. package/dist/extensions/pi-subagents/agents/reviewer.md +1 -1
  117. package/dist/extensions/pi-subagents/agents/scout.md +1 -1
  118. package/dist/extensions/pi-subagents/docs/agents.md +32 -16
  119. package/dist/extensions/pi-subagents/docs/configuration.md +41 -15
  120. package/dist/extensions/pi-subagents/docs/extension-api.md +109 -6
  121. package/dist/extensions/pi-subagents/docs/missions.md +2 -0
  122. package/dist/extensions/pi-subagents/docs/models.md +58 -1
  123. package/dist/extensions/pi-subagents/docs/observability.md +50 -12
  124. package/dist/extensions/pi-subagents/docs/tool-reference.md +17 -10
  125. package/dist/extensions/pi-subagents/docs/watchdog.md +1 -1
  126. package/dist/extensions/pi-subagents/docs/workflows.md +26 -9
  127. package/dist/extensions/pi-subagents/package-lock.json +747 -177
  128. package/dist/extensions/pi-subagents/package.json +6 -4
  129. package/dist/extensions/pi-subagents/runner-server-preload.mjs +13 -0
  130. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +2 -1
  131. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +1 -1
  132. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +21 -4
  133. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -1
  134. package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +2 -0
  135. package/dist/extensions/pi-subagents/src/agents/advertised-agent-prompt.ts +63 -0
  136. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +61 -16
  137. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +2 -0
  138. package/dist/extensions/pi-subagents/src/agents/agents.ts +8 -0
  139. package/dist/extensions/pi-subagents/src/api/capability-ceiling.ts +0 -1
  140. package/dist/extensions/pi-subagents/src/api/{pi-args.ts → child-tool-plan.ts} +1 -1
  141. package/dist/extensions/pi-subagents/src/api/preflight.ts +7 -4
  142. package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -2
  143. package/dist/extensions/pi-subagents/src/api/workflow-resources.ts +6 -0
  144. package/dist/extensions/pi-subagents/src/extension/config.ts +4 -2
  145. package/dist/extensions/pi-subagents/src/extension/doctor.ts +2 -10
  146. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +9 -11
  147. package/dist/extensions/pi-subagents/src/extension/index.ts +99 -10
  148. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +13 -0
  149. package/dist/extensions/pi-subagents/src/extension/rpc.ts +7 -23
  150. package/dist/extensions/pi-subagents/src/extension/schemas.ts +11 -8
  151. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +25 -7
  152. package/dist/extensions/pi-subagents/src/integrations/pi-web-session-liveness.ts +73 -0
  153. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +228 -136
  154. package/dist/extensions/pi-subagents/src/intercom/supervisor-ui.ts +244 -0
  155. package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +37 -16
  156. package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +18 -18
  157. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +51 -25
  158. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +46 -3
  159. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +14 -3
  160. package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +9 -0
  161. package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +10 -12
  162. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -15
  163. package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +40 -29
  164. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +8 -0
  165. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +79 -247
  166. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +88 -12
  167. package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +6 -6
  168. package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +24 -24
  169. package/dist/extensions/pi-subagents/src/runs/background/retained-nested-route-tracker.ts +96 -0
  170. package/dist/extensions/pi-subagents/src/runs/background/run-child-session.ts +642 -0
  171. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +75 -6
  172. package/dist/extensions/pi-subagents/src/runs/background/runner-aliases.ts +163 -0
  173. package/dist/extensions/pi-subagents/src/runs/background/runner-child-launch.ts +86 -0
  174. package/dist/extensions/pi-subagents/src/runs/background/runner-child-sessions.ts +31 -0
  175. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +18 -4
  176. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +3 -1
  177. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +597 -1092
  178. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +3 -0
  179. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +4 -0
  180. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +20 -17
  181. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +296 -394
  182. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +4 -0
  183. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +3 -1
  184. package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +9 -5
  185. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +630 -283
  186. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +8 -5
  187. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +78 -98
  188. package/dist/extensions/pi-subagents/src/runs/shared/abort-recovery.ts +3 -3
  189. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +16 -3
  190. package/dist/extensions/pi-subagents/src/runs/shared/agent-contract.ts +1 -1
  191. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +47 -47
  192. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +1 -2
  193. package/dist/extensions/pi-subagents/src/runs/shared/child-hooks.ts +174 -0
  194. package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +14 -3
  195. package/dist/extensions/pi-subagents/src/runs/shared/child-launch.ts +319 -0
  196. package/dist/extensions/pi-subagents/src/runs/shared/child-lifecycle.ts +25 -0
  197. package/dist/extensions/pi-subagents/src/runs/shared/child-runtime-config.ts +126 -0
  198. package/dist/extensions/pi-subagents/src/runs/shared/child-session.ts +373 -0
  199. package/dist/extensions/pi-subagents/src/runs/shared/child-tool-plan.ts +530 -0
  200. package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +2 -2
  201. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +2 -1
  202. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +16 -0
  203. package/dist/extensions/pi-subagents/src/runs/shared/host-step-status.ts +11 -11
  204. package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +30 -20
  205. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +5 -4
  206. package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +84 -15
  207. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +88 -12
  208. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +37 -53
  209. package/dist/extensions/pi-subagents/src/runs/shared/nested-path.ts +1 -1
  210. package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +18 -7
  211. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +57 -12
  212. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +3 -4
  213. package/dist/extensions/pi-subagents/src/runs/shared/permissions.ts +0 -11
  214. package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +4 -1
  215. package/dist/extensions/pi-subagents/src/runs/shared/readonly-drain-observation.ts +42 -0
  216. package/dist/extensions/pi-subagents/src/runs/shared/readonly-model-continuation.ts +69 -0
  217. package/dist/extensions/pi-subagents/src/runs/shared/readonly-session-evidence.ts +307 -0
  218. package/dist/extensions/pi-subagents/src/runs/shared/run-fanout-budget.ts +8 -21
  219. package/dist/extensions/pi-subagents/src/runs/shared/runtime-acknowledged-extensions.ts +3 -30
  220. package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +17 -4
  221. package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +2 -0
  222. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +99 -386
  223. package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +18 -62
  224. package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +0 -14
  225. package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +31 -9
  226. package/dist/extensions/pi-subagents/src/runs/shared/worktree-setup-command.ts +190 -0
  227. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +506 -226
  228. package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +1 -1
  229. package/dist/extensions/pi-subagents/src/shared/jsonl-writer.ts +11 -0
  230. package/dist/extensions/pi-subagents/src/shared/model-response-aliases.ts +13 -0
  231. package/dist/extensions/pi-subagents/src/shared/thinking-ceiling.ts +0 -6
  232. package/dist/extensions/pi-subagents/src/shared/types.ts +145 -89
  233. package/dist/extensions/pi-subagents/src/shared/utils.ts +13 -6
  234. package/dist/extensions/pi-subagents/src/shared/watch-strategy.ts +2 -0
  235. package/dist/extensions/pi-subagents/src/shared/workflow-child-permit.ts +18 -13
  236. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +0 -6
  237. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +1 -1
  238. package/dist/extensions/pi-subagents/src/tui/fleet.ts +11 -6
  239. package/dist/extensions/pi-subagents/src/tui/render.ts +277 -46
  240. package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +0 -1
  241. package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +12 -12
  242. package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +3 -3
  243. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +116 -15
  244. package/dist/extensions/pi-subagents/src/workflows/workflow-checklist.ts +15 -18
  245. package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +57 -8
  246. package/dist/extensions/pi-subagents/src/workflows/workflow-preflight.ts +19 -19
  247. package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +3 -3
  248. package/dist/extensions/pi-subagents/src/workflows/workflow-resources.ts +97 -22
  249. package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +3 -0
  250. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +336 -21
  251. package/dist/extensions/pi-subagents/test/integration/async-execution.part-1.test.ts +1181 -0
  252. package/dist/extensions/pi-subagents/test/integration/async-execution.part-2.test.ts +2240 -0
  253. package/dist/extensions/pi-subagents/test/integration/async-execution.part-3.test.ts +2268 -0
  254. package/dist/extensions/pi-subagents/test/integration/async-execution.part-4.test.ts +1512 -0
  255. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +231 -16
  256. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +4 -18
  257. package/dist/extensions/pi-subagents/test/integration/foreign-workflow-steering.test.ts +95 -0
  258. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +9 -15
  259. package/dist/extensions/pi-subagents/test/integration/in-process-child.test.ts +374 -0
  260. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +20 -10
  261. package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +18 -6
  262. package/dist/extensions/pi-subagents/test/integration/recovered-assistant-error.test.ts +151 -0
  263. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +42 -1
  264. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +150 -25
  265. package/dist/extensions/pi-subagents/test/integration/result-publication.test.ts +354 -0
  266. package/dist/extensions/pi-subagents/test/integration/shared-cwd-terminal-evidence.test.ts +117 -0
  267. package/dist/extensions/pi-subagents/test/integration/single-execution.part-1.test.ts +3678 -0
  268. package/dist/extensions/pi-subagents/test/integration/{single-execution.test.ts → single-execution.part-2.test.ts} +500 -4207
  269. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +1 -2
  270. package/dist/extensions/pi-subagents/test/integration/workflow-result-publication.test.ts +127 -0
  271. package/dist/extensions/pi-subagents/test/integration/workflow-steer-inbox.test.ts +365 -0
  272. package/dist/extensions/pi-subagents/test/smoke/pi085-child.ts +31 -0
  273. package/dist/extensions/pi-subagents/test/smoke/pi085-clean-install.mjs +74 -0
  274. package/dist/extensions/pi-subagents/test/smoke/pi085-extension.ts +16 -0
  275. package/dist/extensions/pi-subagents/test/support/async-execution-fixture.ts +699 -0
  276. package/dist/extensions/pi-subagents/test/support/fake-child-session.ts +418 -0
  277. package/dist/extensions/pi-subagents/test/support/foreign-workflow-steer-host.mjs +13 -0
  278. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +30 -76
  279. package/dist/extensions/pi-subagents/test/support/notify-diagnostics-fixture.ts +84 -0
  280. package/dist/extensions/pi-subagents/test/support/result-publication-capacity-preload.mjs +70 -0
  281. package/dist/extensions/pi-subagents/test/support/runner-child-session-factory.ts +17 -0
  282. package/dist/extensions/pi-subagents/test/support/single-execution-fixture.ts +390 -0
  283. package/dist/extensions/pi-subagents/test/unit/acceptance-compaction.test.ts +120 -0
  284. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +24 -3
  285. package/dist/extensions/pi-subagents/test/unit/advertised-agent-prompt.test.ts +87 -0
  286. package/dist/extensions/pi-subagents/test/unit/advertised-agent-refresh.test.ts +163 -0
  287. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +70 -31
  288. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +78 -3
  289. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +2 -8
  290. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +1 -1
  291. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +73 -66
  292. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +51 -1
  293. package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +49 -1
  294. package/dist/extensions/pi-subagents/test/unit/async-spawn-preload.test.ts +103 -0
  295. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +3 -3
  296. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +9 -8
  297. package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +10 -7
  298. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +48 -6
  299. package/dist/extensions/pi-subagents/test/unit/child-runtime-config.test.ts +90 -0
  300. package/dist/extensions/pi-subagents/test/unit/{pi-args-permission-system.test.ts → child-tool-plan-permission-system.test.ts} +48 -86
  301. package/dist/extensions/pi-subagents/test/unit/child-tool-plan.test.ts +33 -0
  302. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +18 -18
  303. package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +9 -9
  304. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +8 -7
  305. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +225 -65
  306. package/dist/extensions/pi-subagents/test/unit/extension-bindings.test.ts +17 -22
  307. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +11 -1
  308. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +47 -3
  309. package/dist/extensions/pi-subagents/test/unit/foreign-workflow-steering.test.ts +74 -0
  310. package/dist/extensions/pi-subagents/test/unit/fork-cache-key.test.ts +23 -29
  311. package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +96 -4
  312. package/dist/extensions/pi-subagents/test/unit/host-step-status.test.ts +4 -4
  313. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +116 -55
  314. package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +58 -1
  315. package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +104 -3
  316. package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +10 -1
  317. package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +31 -1
  318. package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +102 -51
  319. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +196 -6
  320. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +181 -38
  321. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +62 -70
  322. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +58 -53
  323. package/dist/extensions/pi-subagents/test/unit/notify-diagnostics.test.ts +42 -0
  324. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +84 -0
  325. package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +13 -5
  326. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +21 -5
  327. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +5 -4
  328. package/dist/extensions/pi-subagents/test/unit/permissions.test.ts +2 -6
  329. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +28 -2
  330. package/dist/extensions/pi-subagents/test/unit/pi-web-session-liveness.test.ts +209 -0
  331. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +38 -1
  332. package/dist/extensions/pi-subagents/test/unit/prompt-audit-optional-peers.test.ts +43 -0
  333. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +24 -2
  334. package/dist/extensions/pi-subagents/test/unit/readonly-drain-observation.test.ts +174 -0
  335. package/dist/extensions/pi-subagents/test/unit/readonly-model-continuation.test.ts +94 -0
  336. package/dist/extensions/pi-subagents/test/unit/readonly-session-evidence.test.ts +1329 -0
  337. package/dist/extensions/pi-subagents/test/unit/recursion-guard.test.ts +29 -80
  338. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +11 -8
  339. package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +2 -2
  340. package/dist/extensions/pi-subagents/test/unit/retained-nested-route-tracker.test.ts +175 -0
  341. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +38 -12
  342. package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +2 -5
  343. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +89 -1
  344. package/dist/extensions/pi-subagents/test/unit/runtime-acknowledged-extensions.test.ts +2 -16
  345. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +27 -3
  346. package/dist/extensions/pi-subagents/test/unit/scheduled-supervisor-demand.test.ts +215 -0
  347. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +15 -11
  348. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +237 -1
  349. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +2 -5
  350. package/dist/extensions/pi-subagents/test/unit/streamed-progress-bounds.test.ts +2 -2
  351. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +14 -1
  352. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +130 -739
  353. package/dist/extensions/pi-subagents/test/unit/supervisor-ask-registration.test.ts +682 -0
  354. package/dist/extensions/pi-subagents/test/unit/supervisor-ui.test.ts +137 -0
  355. package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +1 -11
  356. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +23 -3
  357. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +8 -1
  358. package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +19 -1
  359. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +72 -4
  360. package/dist/extensions/pi-subagents/test/unit/workflow-checklist.test.ts +17 -3
  361. package/dist/extensions/pi-subagents/test/unit/workflow-child-summary.test.ts +34 -0
  362. package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +12 -2
  363. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +46 -6
  364. package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +3 -3
  365. package/dist/extensions/pi-subagents/test/unit/workflow-resources.test.ts +133 -1
  366. package/dist/extensions/pi-subagents/test/unit/workflow-resume-hint.test.ts +53 -2
  367. package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +222 -14
  368. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +526 -85
  369. package/dist/extensions/pi-zentui/README.md +17 -0
  370. package/dist/extensions/pi-zentui/assets/screenshots/footer-status-hyperlink.png +0 -0
  371. package/dist/extensions/pi-zentui/docs/configuration.md +71 -2
  372. package/dist/extensions/pi-zentui/extensions/zentui/config.ts +11 -0
  373. package/dist/extensions/pi-zentui/extensions/zentui/editor-transfer.ts +14 -0
  374. package/dist/extensions/pi-zentui/extensions/zentui/extension-status.ts +29 -13
  375. package/dist/extensions/pi-zentui/extensions/zentui/footer-layout.ts +5 -4
  376. package/dist/extensions/pi-zentui/extensions/zentui/footer-text.ts +11 -0
  377. package/dist/extensions/pi-zentui/extensions/zentui/footer.ts +11 -10
  378. package/dist/extensions/pi-zentui/extensions/zentui/index.ts +77 -3
  379. package/dist/extensions/pi-zentui/extensions/zentui/presets.ts +77 -0
  380. package/dist/extensions/pi-zentui/extensions/zentui/settings-command.ts +103 -2
  381. package/dist/extensions/pi-zentui/extensions/zentui/working-line-extension-segments.ts +115 -0
  382. package/dist/extensions/pi-zentui/extensions/zentui/working-line.ts +87 -5
  383. package/dist/extensions/pi-zentui/package-lock.json +277 -517
  384. package/dist/extensions/pi-zentui/package.json +7 -4
  385. package/dist/extensions/pi-zentui/test/config-presets.test.ts +238 -0
  386. package/dist/extensions/pi-zentui/test/editor-transfer.test.ts +24 -1
  387. package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +570 -2
  388. package/dist/extensions/pi-zentui/test/extension-status.test.ts +90 -0
  389. package/dist/extensions/pi-zentui/test/footer-hyperlink.test.ts +243 -0
  390. package/dist/extensions/pi-zentui/test/package-contents.mjs +1 -0
  391. package/dist/extensions/pi-zentui/test/presets.test.ts +121 -0
  392. package/dist/extensions/pi-zentui/test/settings-command.test.ts +205 -1
  393. package/dist/extensions/pi-zentui/test/working-line-extension-segments.test.ts +139 -0
  394. package/dist/extensions/pi-zentui/test/working-line-lifecycle.integration.test.ts +237 -3
  395. package/dist/extensions/pi-zentui/test/working-line.test.ts +94 -2
  396. package/dist/index.d.ts +1 -1
  397. package/dist/main.js +4 -1
  398. package/dist/modes/interactive/chat-viewport.d.ts +19 -0
  399. package/dist/modes/interactive/chat-viewport.js +27 -0
  400. package/dist/modes/interactive/components/assistant-message.d.ts +6 -2
  401. package/dist/modes/interactive/components/assistant-message.js +30 -13
  402. package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
  403. package/dist/modes/interactive/components/custom-editor.js +39 -1
  404. package/dist/modes/interactive/components/first-time-setup.js +1 -1
  405. package/dist/modes/interactive/components/index.d.ts +1 -1
  406. package/dist/modes/interactive/components/markdown-transform.d.ts +2 -0
  407. package/dist/modes/interactive/components/markdown-transform.js +18 -0
  408. package/dist/modes/interactive/components/model-selector.js +19 -17
  409. package/dist/modes/interactive/components/scoped-models-selector.js +21 -23
  410. package/dist/modes/interactive/components/settings-selector.d.ts +7 -1
  411. package/dist/modes/interactive/components/settings-selector.js +128 -20
  412. package/dist/modes/interactive/components/settings-submenu.d.ts +71 -0
  413. package/dist/modes/interactive/components/settings-submenu.js +164 -0
  414. package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
  415. package/dist/modes/interactive/components/status-indicator.js +10 -3
  416. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  417. package/dist/modes/interactive/components/thinking-selector.js +75 -18
  418. package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
  419. package/dist/modes/interactive/components/tool-execution.js +35 -33
  420. package/dist/modes/interactive/components/trust-selector.js +2 -2
  421. package/dist/modes/interactive/interactive-mode.d.ts +13 -15
  422. package/dist/modes/interactive/interactive-mode.js +144 -80
  423. package/dist/modes/interactive/session-share.d.ts +15 -0
  424. package/dist/modes/interactive/session-share.js +183 -0
  425. package/dist/modes/interactive/theme/dark.json +2 -1
  426. package/dist/modes/interactive/theme/light.json +2 -1
  427. package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
  428. package/dist/modes/interactive/theme/theme-controller.js +5 -0
  429. package/dist/modes/interactive/theme/theme-json.d.ts +83 -0
  430. package/dist/modes/interactive/theme/theme-json.js +129 -0
  431. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  432. package/dist/modes/interactive/theme/theme.d.ts +14 -5
  433. package/dist/modes/interactive/theme/theme.js +18 -119
  434. package/dist/modes/interactive/tui-renderer.d.ts +20 -0
  435. package/dist/modes/interactive/tui-renderer.js +65 -0
  436. package/dist/utils/exif-orientation.js +2 -3
  437. package/dist/utils/management-http.d.ts +24 -0
  438. package/dist/utils/management-http.js +53 -0
  439. package/dist/utils/text.d.ts +7 -0
  440. package/dist/utils/text.js +8 -0
  441. package/dist/utils/tools-manager.d.ts +1 -0
  442. package/dist/utils/tools-manager.js +43 -21
  443. package/docs/docs.json +0 -4
  444. package/package.json +4 -4
  445. package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +0 -415
  446. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +0 -1059
  447. package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +0 -116
  448. package/dist/extensions/pi-subagents/src/shared/post-exit-stdio-guard.ts +0 -85
  449. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +0 -224
  450. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +0 -6986
  451. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +0 -447
  452. package/dist/extensions/pi-subagents/test/support/real-session-child-cli.mjs +0 -185
  453. package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +0 -311
  454. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-pi-args.test.ts +0 -84
  455. package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +0 -202
  456. package/dist/extensions/pi-subagents/test/unit/close-grace-timer.test.ts +0 -101
  457. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +0 -2347
  458. package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +0 -104
  459. package/dist/extensions/pi-subagents/test/unit/windows-hide-spawn.test.ts +0 -49
  460. package/dist/skills/imagegen-frontend-mobile/SKILL.md +0 -1465
  461. package/dist/skills/imagegen-frontend-web/SKILL.md +0 -987
  462. package/dist/skills/implanger/SKILL.md +0 -70
  463. package/dist/skills/output/SKILL.md +0 -49
  464. package/dist/skills/planger/SKILL.md +0 -167
  465. package/dist/skills/workflow/SKILL.md +0 -95
  466. package/docs/workflows.md +0 -18
  467. /package/dist/bun/{register-bedrock.d.ts → runtime-setup.d.ts} +0 -0
@@ -1,13 +1,11 @@
1
- import { Box, Container, Spacer, Text } from "@earendil-works/pi-tui";
2
1
  import { constants } from "fs";
3
2
  import { access as fsAccess, readFile as fsReadFile, writeFile as fsWriteFile } from "fs/promises";
4
3
  import { Type } from "typebox";
5
- import { renderDiff } from "../../modes/interactive/components/diff.js";
6
4
  import { getExperimentalToolSampling } from "../experimental.js";
7
- import { applyEditsToNormalizedContent, computeEditsDiff, detectLineEnding, generateDiffString, generateUnifiedPatch, normalizeToLF, restoreLineEndings, stripBom, } from "./edit-diff.js";
5
+ import { applyEditsToNormalizedContent, detectLineEnding, generateDiffString, generateUnifiedPatch, normalizeToLF, restoreLineEndings, stripBom, } from "./edit-diff.js";
8
6
  import { withFileMutationQueue } from "./file-mutation-queue.js";
9
7
  import { resolveToCwd } from "./path-utils.js";
10
- import { renderToolPath, str } from "./render-utils.js";
8
+ import { editRenderers } from "./renderers/edit.js";
11
9
  import { wrapToolDefinition } from "./tool-definition-wrapper.js";
12
10
  const replaceEditSchema = Type.Object({
13
11
  oldText: Type.String({
@@ -55,107 +53,6 @@ function validateEditInput(input) {
55
53
  }
56
54
  return { path: input.path, edits: input.edits };
57
55
  }
58
- function createEditCallRenderComponent() {
59
- return Object.assign(new Box(1, 1, (text) => text), {
60
- preview: undefined,
61
- previewArgsKey: undefined,
62
- previewPending: false,
63
- settledError: false,
64
- });
65
- }
66
- function getEditCallRenderComponent(state, lastComponent) {
67
- if (lastComponent instanceof Box) {
68
- const component = lastComponent;
69
- state.callComponent = component;
70
- return component;
71
- }
72
- if (state.callComponent) {
73
- return state.callComponent;
74
- }
75
- const component = createEditCallRenderComponent();
76
- state.callComponent = component;
77
- return component;
78
- }
79
- function getRenderablePreviewInput(args) {
80
- if (!args) {
81
- return null;
82
- }
83
- const path = typeof args.path === "string" ? args.path : typeof args.file_path === "string" ? args.file_path : null;
84
- if (!path) {
85
- return null;
86
- }
87
- if (Array.isArray(args.edits) &&
88
- args.edits.length > 0 &&
89
- args.edits.every((edit) => typeof edit?.oldText === "string" && typeof edit?.newText === "string")) {
90
- return { path, edits: args.edits };
91
- }
92
- if (typeof args.oldText === "string" && typeof args.newText === "string") {
93
- return { path, edits: [{ oldText: args.oldText, newText: args.newText }] };
94
- }
95
- return null;
96
- }
97
- function formatEditCall(args, theme, cwd) {
98
- const pathDisplay = renderToolPath(str(args?.file_path ?? args?.path), theme, cwd);
99
- return `${theme.fg("toolTitle", theme.bold("edit"))} ${pathDisplay}`;
100
- }
101
- function formatEditResult(args, preview, result, theme, isError) {
102
- const rawPath = str(args?.file_path ?? args?.path);
103
- const previewDiff = preview && !("error" in preview) ? preview.diff : undefined;
104
- const previewError = preview && "error" in preview ? preview.error : undefined;
105
- if (isError) {
106
- const errorText = result.content
107
- .filter((c) => c.type === "text")
108
- .map((c) => c.text || "")
109
- .join("\n");
110
- if (!errorText || errorText === previewError) {
111
- return undefined;
112
- }
113
- return theme.fg("error", errorText);
114
- }
115
- const resultDiff = result.details?.diff;
116
- if (resultDiff && resultDiff !== previewDiff) {
117
- return renderDiff(resultDiff, { filePath: rawPath ?? undefined });
118
- }
119
- return undefined;
120
- }
121
- function getEditHeaderBg(preview, settledError, theme) {
122
- if (preview) {
123
- if ("error" in preview) {
124
- return (text) => theme.bg("toolErrorBg", text);
125
- }
126
- return (text) => theme.bg("toolSuccessBg", text);
127
- }
128
- if (settledError) {
129
- return (text) => theme.bg("toolErrorBg", text);
130
- }
131
- return (text) => theme.bg("toolPendingBg", text);
132
- }
133
- function buildEditCallComponent(component, args, theme, cwd) {
134
- component.setBgFn(getEditHeaderBg(component.preview, component.settledError, theme));
135
- component.clear();
136
- component.addChild(new Text(formatEditCall(args, theme, cwd), 0, 0));
137
- if (!component.preview) {
138
- return component;
139
- }
140
- const body = "error" in component.preview ? theme.fg("error", component.preview.error) : renderDiff(component.preview.diff);
141
- component.addChild(new Spacer(1));
142
- component.addChild(new Text(body, 0, 0));
143
- return component;
144
- }
145
- function setEditPreview(component, preview, argsKey) {
146
- const current = component.preview;
147
- const changed = current === undefined ||
148
- ("error" in current && "error" in preview
149
- ? current.error !== preview.error
150
- : "error" in current !== "error" in preview) ||
151
- (!("error" in current) &&
152
- !("error" in preview) &&
153
- (current.diff !== preview.diff || current.firstChangedLine !== preview.firstChangedLine));
154
- component.preview = preview;
155
- component.previewArgsKey = argsKey;
156
- component.previewPending = false;
157
- return changed;
158
- }
159
56
  export function createEditToolDefinition(cwd, options) {
160
57
  const ops = options?.operations ?? defaultEditOperations;
161
58
  return {
@@ -173,9 +70,9 @@ export function createEditToolDefinition(cwd, options) {
173
70
  constrainedSampling: getExperimentalToolSampling(),
174
71
  renderShell: "self",
175
72
  prepareArguments: prepareEditArguments,
176
- async execute(_toolCallId, input, signal, _onUpdate, _ctx) {
73
+ async execute(_toolCallId, input, signal, _onUpdate, ctx) {
177
74
  const { path, edits } = validateEditInput(input);
178
- const absolutePath = resolveToCwd(path, cwd);
75
+ const absolutePath = resolveToCwd(path, ctx?.cwd || cwd);
179
76
  return withFileMutationQueue(absolutePath, async () => {
180
77
  // Do not reject from an abort event listener here: that would release the
181
78
  // mutation queue while an in-flight filesystem operation may still finish.
@@ -222,62 +119,7 @@ export function createEditToolDefinition(cwd, options) {
222
119
  };
223
120
  });
224
121
  },
225
- renderCall(args, theme, context) {
226
- const component = getEditCallRenderComponent(context.state, context.lastComponent);
227
- const previewInput = getRenderablePreviewInput(args);
228
- const argsKey = previewInput
229
- ? JSON.stringify({ path: previewInput.path, edits: previewInput.edits })
230
- : undefined;
231
- if (component.previewArgsKey !== argsKey) {
232
- component.preview = undefined;
233
- component.previewArgsKey = argsKey;
234
- component.previewPending = false;
235
- component.settledError = false;
236
- }
237
- if (context.argsComplete && previewInput && !component.preview && !component.previewPending) {
238
- component.previewPending = true;
239
- const requestKey = argsKey;
240
- void computeEditsDiff(previewInput.path, previewInput.edits, context.cwd).then((preview) => {
241
- if (component.previewArgsKey === requestKey) {
242
- setEditPreview(component, preview, requestKey);
243
- context.invalidate();
244
- }
245
- });
246
- }
247
- return buildEditCallComponent(component, args, theme, context.cwd);
248
- },
249
- renderResult(result, _options, theme, context) {
250
- const callComponent = context.state.callComponent;
251
- const previewInput = getRenderablePreviewInput(context.args);
252
- const argsKey = previewInput
253
- ? JSON.stringify({ path: previewInput.path, edits: previewInput.edits })
254
- : undefined;
255
- const typedResult = result;
256
- const resultDiff = !context.isError ? typedResult.details?.diff : undefined;
257
- let changed = false;
258
- if (callComponent) {
259
- if (typeof resultDiff === "string") {
260
- changed =
261
- setEditPreview(callComponent, { diff: resultDiff, firstChangedLine: typedResult.details?.firstChangedLine }, argsKey) || changed;
262
- }
263
- if (callComponent.settledError !== context.isError) {
264
- callComponent.settledError = context.isError;
265
- changed = true;
266
- }
267
- if (changed) {
268
- buildEditCallComponent(callComponent, context.args, theme, context.cwd);
269
- }
270
- }
271
- const output = formatEditResult(context.args, callComponent?.preview, typedResult, theme, context.isError);
272
- const component = context.lastComponent ?? new Container();
273
- component.clear();
274
- if (!output) {
275
- return component;
276
- }
277
- component.addChild(new Spacer(1));
278
- component.addChild(new Text(output, 1, 0));
279
- return component;
280
- },
122
+ ...editRenderers,
281
123
  };
282
124
  }
283
125
  export function createEditTool(cwd, options) {
@@ -1,12 +1,10 @@
1
1
  import { createInterface } from "node:readline";
2
- import { Text } from "@earendil-works/pi-tui";
3
2
  import { spawn } from "child_process";
4
3
  import path from "path";
5
4
  import { Type } from "typebox";
6
- import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
7
5
  import { ensureTool } from "../../utils/tools-manager.js";
8
6
  import { pathExists, resolveToCwd } from "./path-utils.js";
9
- import { getTextOutput, invalidArgText, shortenPath, str } from "./render-utils.js";
7
+ import { findRenderers } from "./renderers/find.js";
10
8
  import { wrapToolDefinition } from "./tool-definition-wrapper.js";
11
9
  import { DEFAULT_MAX_BYTES, formatSize, truncateHead } from "./truncate.js";
12
10
  function toPosixPath(value) {
@@ -25,46 +23,6 @@ const defaultFindOperations = {
25
23
  // This is a placeholder. Actual fd execution happens in execute() when no custom glob is provided.
26
24
  glob: () => [],
27
25
  };
28
- function formatFindCall(args, theme) {
29
- const pattern = str(args?.pattern);
30
- const rawPath = str(args?.path);
31
- const path = rawPath !== null ? shortenPath(rawPath || ".") : null;
32
- const limit = args?.limit;
33
- const invalidArg = invalidArgText(theme);
34
- let text = theme.fg("toolTitle", theme.bold("find")) +
35
- " " +
36
- (pattern === null ? invalidArg : theme.fg("accent", pattern || "")) +
37
- theme.fg("toolOutput", ` in ${path === null ? invalidArg : path}`);
38
- if (limit !== undefined) {
39
- text += theme.fg("toolOutput", ` (limit ${limit})`);
40
- }
41
- return text;
42
- }
43
- function formatFindResult(result, options, theme, showImages) {
44
- const output = getTextOutput(result, showImages).trim();
45
- let text = "";
46
- if (output) {
47
- const lines = output.split("\n");
48
- const maxLines = options.expanded ? lines.length : 20;
49
- const displayLines = lines.slice(0, maxLines);
50
- const remaining = lines.length - maxLines;
51
- text += `\n${displayLines.map((line) => theme.fg("toolOutput", line)).join("\n")}`;
52
- if (remaining > 0) {
53
- text += `${theme.fg("muted", `\n... (${remaining} more lines,`)} ${keyHint("app.tools.expand", "to expand")}${theme.fg("muted", ")")}`;
54
- }
55
- }
56
- const resultLimit = result.details?.resultLimitReached;
57
- const truncation = result.details?.truncation;
58
- if (resultLimit || truncation?.truncated) {
59
- const warnings = [];
60
- if (resultLimit)
61
- warnings.push(`${resultLimit} results limit`);
62
- if (truncation?.truncated)
63
- warnings.push(`${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit`);
64
- text += `\n${theme.fg("warning", `[Truncated: ${warnings.join(", ")}]`)}`;
65
- }
66
- return text;
67
- }
68
26
  export function createFindToolDefinition(cwd, options) {
69
27
  const customOps = options?.operations;
70
28
  return {
@@ -73,7 +31,7 @@ export function createFindToolDefinition(cwd, options) {
73
31
  description: `Search for files by glob pattern. Returns matching file paths relative to the search directory. Respects .gitignore. Output is truncated to ${DEFAULT_LIMIT} results or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,
74
32
  promptSnippet: "Find files by glob pattern (respects .gitignore)",
75
33
  parameters: findSchema,
76
- async execute(_toolCallId, { pattern, path: searchDir, limit }, signal, _onUpdate, _ctx) {
34
+ async execute(_toolCallId, { pattern, path: searchDir, limit }, signal, _onUpdate, ctx) {
77
35
  return new Promise((resolve, reject) => {
78
36
  if (signal?.aborted) {
79
37
  reject(new Error("Operation aborted"));
@@ -96,7 +54,7 @@ export function createFindToolDefinition(cwd, options) {
96
54
  signal?.addEventListener("abort", onAbort, { once: true });
97
55
  (async () => {
98
56
  try {
99
- const searchPath = resolveToCwd(searchDir || ".", cwd);
57
+ const searchPath = resolveToCwd(searchDir || ".", ctx?.cwd || cwd);
100
58
  const effectiveLimit = limit ?? DEFAULT_LIMIT;
101
59
  const ops = customOps ?? defaultFindOperations;
102
60
  // If custom operations provide glob(), use that instead of fd.
@@ -287,16 +245,7 @@ export function createFindToolDefinition(cwd, options) {
287
245
  })();
288
246
  });
289
247
  },
290
- renderCall(args, theme, context) {
291
- const text = context.lastComponent ?? new Text("", 0, 0);
292
- text.setText(formatFindCall(args, theme));
293
- return text;
294
- },
295
- renderResult(result, options, theme, context) {
296
- const text = context.lastComponent ?? new Text("", 0, 0);
297
- text.setText(formatFindResult(result, options, theme, context.showImages));
298
- return text;
299
- },
248
+ ...findRenderers,
300
249
  };
301
250
  }
302
251
  export function createFindTool(cwd, options) {
@@ -1,13 +1,11 @@
1
1
  import { readFile as fsReadFile, stat as fsStat } from "node:fs/promises";
2
2
  import { createInterface } from "node:readline";
3
- import { Text } from "@earendil-works/pi-tui";
4
3
  import { spawn } from "child_process";
5
4
  import path from "path";
6
5
  import { Type } from "typebox";
7
- import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
8
6
  import { ensureTool } from "../../utils/tools-manager.js";
9
7
  import { resolveToCwd } from "./path-utils.js";
10
- import { getTextOutput, invalidArgText, shortenPath, str } from "./render-utils.js";
8
+ import { grepRenderers } from "./renderers/grep.js";
11
9
  import { wrapToolDefinition } from "./tool-definition-wrapper.js";
12
10
  import { DEFAULT_MAX_BYTES, formatSize, GREP_MAX_LINE_LENGTH, truncateHead, truncateLine, } from "./truncate.js";
13
11
  const grepSchema = Type.Object({
@@ -24,51 +22,6 @@ const defaultGrepOperations = {
24
22
  isDirectory: async (p) => (await fsStat(p)).isDirectory(),
25
23
  readFile: (p) => fsReadFile(p, "utf-8"),
26
24
  };
27
- function formatGrepCall(args, theme) {
28
- const pattern = str(args?.pattern);
29
- const rawPath = str(args?.path);
30
- const path = rawPath !== null ? shortenPath(rawPath || ".") : null;
31
- const glob = str(args?.glob);
32
- const limit = args?.limit;
33
- const invalidArg = invalidArgText(theme);
34
- let text = theme.fg("toolTitle", theme.bold("grep")) +
35
- " " +
36
- (pattern === null ? invalidArg : theme.fg("accent", `/${pattern || ""}/`)) +
37
- theme.fg("toolOutput", ` in ${path === null ? invalidArg : path}`);
38
- if (glob)
39
- text += theme.fg("toolOutput", ` (${glob})`);
40
- if (limit !== undefined)
41
- text += theme.fg("toolOutput", ` limit ${limit}`);
42
- return text;
43
- }
44
- function formatGrepResult(result, options, theme, showImages) {
45
- const output = getTextOutput(result, showImages).trim();
46
- let text = "";
47
- if (output) {
48
- const lines = output.split("\n");
49
- const maxLines = options.expanded ? lines.length : 15;
50
- const displayLines = lines.slice(0, maxLines);
51
- const remaining = lines.length - maxLines;
52
- text += `\n${displayLines.map((line) => theme.fg("toolOutput", line)).join("\n")}`;
53
- if (remaining > 0) {
54
- text += `${theme.fg("muted", `\n... (${remaining} more lines,`)} ${keyHint("app.tools.expand", "to expand")}${theme.fg("muted", ")")}`;
55
- }
56
- }
57
- const matchLimit = result.details?.matchLimitReached;
58
- const truncation = result.details?.truncation;
59
- const linesTruncated = result.details?.linesTruncated;
60
- if (matchLimit || truncation?.truncated || linesTruncated) {
61
- const warnings = [];
62
- if (matchLimit)
63
- warnings.push(`${matchLimit} matches limit`);
64
- if (truncation?.truncated)
65
- warnings.push(`${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit`);
66
- if (linesTruncated)
67
- warnings.push("some lines truncated");
68
- text += `\n${theme.fg("warning", `[Truncated: ${warnings.join(", ")}]`)}`;
69
- }
70
- return text;
71
- }
72
25
  export function createGrepToolDefinition(cwd, options) {
73
26
  const customOps = options?.operations;
74
27
  return {
@@ -77,7 +30,7 @@ export function createGrepToolDefinition(cwd, options) {
77
30
  description: `Search file contents for a pattern. Returns matching lines with file paths and line numbers. Respects .gitignore. Output is truncated to ${DEFAULT_LIMIT} matches or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first). Long lines are truncated to ${GREP_MAX_LINE_LENGTH} chars.`,
78
31
  promptSnippet: "Search file contents for patterns (respects .gitignore)",
79
32
  parameters: grepSchema,
80
- async execute(_toolCallId, { pattern, path: searchDir, glob, ignoreCase, literal, context, limit, }, signal, _onUpdate, _ctx) {
33
+ async execute(_toolCallId, { pattern, path: searchDir, glob, ignoreCase, literal, context, limit, }, signal, _onUpdate, ctx) {
81
34
  return new Promise((resolve, reject) => {
82
35
  if (signal?.aborted) {
83
36
  reject(new Error("Operation aborted"));
@@ -97,7 +50,7 @@ export function createGrepToolDefinition(cwd, options) {
97
50
  settle(() => reject(new Error("ripgrep (rg) is not available and could not be downloaded")));
98
51
  return;
99
52
  }
100
- const searchPath = resolveToCwd(searchDir || ".", cwd);
53
+ const searchPath = resolveToCwd(searchDir || ".", ctx?.cwd || cwd);
101
54
  const ops = customOps ?? defaultGrepOperations;
102
55
  let isDirectory;
103
56
  try {
@@ -286,16 +239,7 @@ export function createGrepToolDefinition(cwd, options) {
286
239
  })();
287
240
  });
288
241
  },
289
- renderCall(args, theme, context) {
290
- const text = context.lastComponent ?? new Text("", 0, 0);
291
- text.setText(formatGrepCall(args, theme));
292
- return text;
293
- },
294
- renderResult(result, options, theme, context) {
295
- const text = context.lastComponent ?? new Text("", 0, 0);
296
- text.setText(formatGrepResult(result, options, theme, context.showImages));
297
- return text;
298
- },
242
+ ...grepRenderers,
299
243
  };
300
244
  }
301
245
  export function createGrepTool(cwd, options) {
@@ -1,10 +1,8 @@
1
1
  import { readdir as fsReaddir, stat as fsStat } from "node:fs/promises";
2
- import { Text } from "@earendil-works/pi-tui";
3
2
  import nodePath from "path";
4
3
  import { Type } from "typebox";
5
- import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
6
4
  import { pathExists, resolveToCwd } from "./path-utils.js";
7
- import { getTextOutput, renderToolPath, str } from "./render-utils.js";
5
+ import { lsRenderers } from "./renderers/ls.js";
8
6
  import { wrapToolDefinition } from "./tool-definition-wrapper.js";
9
7
  import { DEFAULT_MAX_BYTES, formatSize, truncateHead } from "./truncate.js";
10
8
  const lsSchema = Type.Object({
@@ -17,40 +15,6 @@ const defaultLsOperations = {
17
15
  stat: fsStat,
18
16
  readdir: fsReaddir,
19
17
  };
20
- function formatLsCall(args, theme, cwd) {
21
- const limit = args?.limit;
22
- const pathDisplay = renderToolPath(str(args?.path), theme, cwd, { emptyFallback: "." });
23
- let text = `${theme.fg("toolTitle", theme.bold("ls"))} ${pathDisplay}`;
24
- if (limit !== undefined) {
25
- text += theme.fg("toolOutput", ` (limit ${limit})`);
26
- }
27
- return text;
28
- }
29
- function formatLsResult(result, options, theme, showImages) {
30
- const output = getTextOutput(result, showImages).trim();
31
- let text = "";
32
- if (output) {
33
- const lines = output.split("\n");
34
- const maxLines = options.expanded ? lines.length : 20;
35
- const displayLines = lines.slice(0, maxLines);
36
- const remaining = lines.length - maxLines;
37
- text += `\n${displayLines.map((line) => theme.fg("toolOutput", line)).join("\n")}`;
38
- if (remaining > 0) {
39
- text += `${theme.fg("muted", `\n... (${remaining} more lines,`)} ${keyHint("app.tools.expand", "to expand")}${theme.fg("muted", ")")}`;
40
- }
41
- }
42
- const entryLimit = result.details?.entryLimitReached;
43
- const truncation = result.details?.truncation;
44
- if (entryLimit || truncation?.truncated) {
45
- const warnings = [];
46
- if (entryLimit)
47
- warnings.push(`${entryLimit} entries limit`);
48
- if (truncation?.truncated)
49
- warnings.push(`${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit`);
50
- text += `\n${theme.fg("warning", `[Truncated: ${warnings.join(", ")}]`)}`;
51
- }
52
- return text;
53
- }
54
18
  export function createLsToolDefinition(cwd, options) {
55
19
  const ops = options?.operations ?? defaultLsOperations;
56
20
  return {
@@ -59,7 +23,7 @@ export function createLsToolDefinition(cwd, options) {
59
23
  description: `List directory contents. Returns entries sorted alphabetically, with '/' suffix for directories. Includes dotfiles. Output is truncated to ${DEFAULT_LIMIT} entries or ${DEFAULT_MAX_BYTES / 1024}KB (whichever is hit first).`,
60
24
  promptSnippet: "List directory contents",
61
25
  parameters: lsSchema,
62
- async execute(_toolCallId, { path, limit }, signal, _onUpdate, _ctx) {
26
+ async execute(_toolCallId, { path, limit }, signal, _onUpdate, ctx) {
63
27
  return new Promise((resolve, reject) => {
64
28
  if (signal?.aborted) {
65
29
  reject(new Error("Operation aborted"));
@@ -69,7 +33,7 @@ export function createLsToolDefinition(cwd, options) {
69
33
  signal?.addEventListener("abort", onAbort, { once: true });
70
34
  (async () => {
71
35
  try {
72
- const dirPath = resolveToCwd(path || ".", cwd);
36
+ const dirPath = resolveToCwd(path || ".", ctx?.cwd || cwd);
73
37
  const effectiveLimit = limit ?? DEFAULT_LIMIT;
74
38
  // Check if path exists.
75
39
  if (!(await ops.exists(dirPath))) {
@@ -149,16 +113,7 @@ export function createLsToolDefinition(cwd, options) {
149
113
  })();
150
114
  });
151
115
  },
152
- renderCall(args, theme, context) {
153
- const text = context.lastComponent ?? new Text("", 0, 0);
154
- text.setText(formatLsCall(args, theme, context.cwd));
155
- return text;
156
- },
157
- renderResult(result, options, theme, context) {
158
- const text = context.lastComponent ?? new Text("", 0, 0);
159
- text.setText(formatLsResult(result, options, theme, context.showImages));
160
- return text;
161
- },
116
+ ...lsRenderers,
162
117
  };
163
118
  }
164
119
  export function createLsTool(cwd, options) {
@@ -8,6 +8,10 @@ declare const readSchema: Type.TObject<{
8
8
  offset: Type.TOptional<Type.TNumber>;
9
9
  limit: Type.TOptional<Type.TNumber>;
10
10
  }>;
11
+ export declare const readToolSystemPromptContribution: {
12
+ readonly snippet: "Read file contents";
13
+ readonly guidelines: readonly ["Use read to examine files instead of cat or sed."];
14
+ };
11
15
  export type ReadToolInput = Static<typeof readSchema>;
12
16
  export interface ReadToolDetails {
13
17
  truncation?: TruncationResult;