@selesai/code 0.13.15 → 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 (473) hide show
  1. package/CHANGELOG.md +37 -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/capability-gateway/index.ts +12 -1
  65. package/dist/extensions/capability-gateway/integration.test.ts +23 -0
  66. package/dist/extensions/pi-hermes-memory/CHANGELOG.md +18 -0
  67. package/dist/extensions/pi-hermes-memory/README.md +16 -12
  68. package/dist/extensions/pi-hermes-memory/docs/ROADMAP.md +1 -1
  69. package/dist/extensions/pi-hermes-memory/package-lock.json +587 -62
  70. package/dist/extensions/pi-hermes-memory/package.json +4 -4
  71. package/dist/extensions/pi-hermes-memory/src/config.ts +32 -0
  72. package/dist/extensions/pi-hermes-memory/src/constants.ts +12 -2
  73. package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +109 -51
  74. package/dist/extensions/pi-hermes-memory/src/handlers/index-sessions.ts +9 -3
  75. package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +257 -98
  76. package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +9 -2
  77. package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +5 -0
  78. package/dist/extensions/pi-hermes-memory/src/index.ts +22 -2
  79. package/dist/extensions/pi-hermes-memory/src/paths.ts +1 -1
  80. package/dist/extensions/pi-hermes-memory/src/store/db.ts +6 -0
  81. package/dist/extensions/pi-hermes-memory/src/store/fts-query.ts +58 -1
  82. package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +60 -8
  83. package/dist/extensions/pi-hermes-memory/src/store/session-indexer.ts +169 -7
  84. package/dist/extensions/pi-hermes-memory/src/store/session-search.ts +7 -21
  85. package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +134 -15
  86. package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +4 -2
  87. package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +24 -9
  88. package/dist/extensions/pi-hermes-memory/src/types.ts +11 -0
  89. package/dist/extensions/pi-hermes-memory/tests/config.test.ts +42 -0
  90. package/dist/extensions/pi-hermes-memory/tests/handlers/background-review.test.ts +159 -3
  91. package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +452 -0
  92. package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +39 -0
  93. package/dist/extensions/pi-hermes-memory/tests/integration/corruption-recovery-integration.test.ts +91 -0
  94. package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +29 -0
  95. package/dist/extensions/pi-hermes-memory/tests/store/fts-query.test.ts +116 -0
  96. package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +163 -0
  97. package/dist/extensions/pi-hermes-memory/tests/store/session-indexer.test.ts +233 -0
  98. package/dist/extensions/pi-hermes-memory/tests/store/session-search.test.ts +12 -0
  99. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +175 -0
  100. package/dist/extensions/pi-hermes-memory/tests/store/sqlite-native.test.ts +2 -2
  101. package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +22 -0
  102. package/dist/extensions/pi-hermes-memory/tests/tools/memory-tool.test.ts +37 -1
  103. package/dist/extensions/pi-intercom/CHANGELOG.md +13 -0
  104. package/dist/extensions/pi-intercom/README.md +16 -2
  105. package/dist/extensions/pi-intercom/broker/spawn.test.ts +19 -2
  106. package/dist/extensions/pi-intercom/broker/spawn.ts +4 -4
  107. package/dist/extensions/pi-intercom/index.ts +1 -1
  108. package/dist/extensions/pi-intercom/intercom.integration.test.ts +121 -2
  109. package/dist/extensions/pi-intercom/package.json +1 -1
  110. package/dist/extensions/pi-intercom/project-agent.test.ts +1 -1
  111. package/dist/extensions/pi-intercom/project-agent.ts +1 -6
  112. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +7 -6
  113. package/dist/extensions/pi-rewind-hook/index.test.ts +7 -0
  114. package/dist/extensions/pi-subagents/.github/workflows/test.yml +36 -4
  115. package/dist/extensions/pi-subagents/CHANGELOG.md +120 -0
  116. package/dist/extensions/pi-subagents/README.md +3 -3
  117. package/dist/extensions/pi-subagents/agents/researcher.md +23 -13
  118. package/dist/extensions/pi-subagents/agents/reviewer.md +1 -1
  119. package/dist/extensions/pi-subagents/agents/scout.md +1 -1
  120. package/dist/extensions/pi-subagents/docs/agents.md +32 -16
  121. package/dist/extensions/pi-subagents/docs/configuration.md +41 -15
  122. package/dist/extensions/pi-subagents/docs/extension-api.md +109 -6
  123. package/dist/extensions/pi-subagents/docs/missions.md +2 -0
  124. package/dist/extensions/pi-subagents/docs/models.md +58 -1
  125. package/dist/extensions/pi-subagents/docs/observability.md +50 -12
  126. package/dist/extensions/pi-subagents/docs/tool-reference.md +17 -10
  127. package/dist/extensions/pi-subagents/docs/watchdog.md +1 -1
  128. package/dist/extensions/pi-subagents/docs/workflows.md +26 -9
  129. package/dist/extensions/pi-subagents/package-lock.json +747 -177
  130. package/dist/extensions/pi-subagents/package.json +6 -4
  131. package/dist/extensions/pi-subagents/runner-server-preload.mjs +13 -0
  132. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +2 -1
  133. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +1 -1
  134. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +21 -4
  135. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -1
  136. package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +2 -0
  137. package/dist/extensions/pi-subagents/src/agents/advertised-agent-prompt.ts +63 -0
  138. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +61 -16
  139. package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +2 -0
  140. package/dist/extensions/pi-subagents/src/agents/agents.ts +8 -0
  141. package/dist/extensions/pi-subagents/src/api/capability-ceiling.ts +0 -1
  142. package/dist/extensions/pi-subagents/src/api/{pi-args.ts → child-tool-plan.ts} +1 -1
  143. package/dist/extensions/pi-subagents/src/api/preflight.ts +7 -4
  144. package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -2
  145. package/dist/extensions/pi-subagents/src/api/workflow-resources.ts +6 -0
  146. package/dist/extensions/pi-subagents/src/extension/config.ts +4 -2
  147. package/dist/extensions/pi-subagents/src/extension/doctor.ts +2 -10
  148. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +9 -11
  149. package/dist/extensions/pi-subagents/src/extension/index.ts +99 -10
  150. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +13 -0
  151. package/dist/extensions/pi-subagents/src/extension/rpc.ts +7 -23
  152. package/dist/extensions/pi-subagents/src/extension/schemas.ts +11 -8
  153. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +25 -7
  154. package/dist/extensions/pi-subagents/src/integrations/pi-web-session-liveness.ts +73 -0
  155. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +228 -136
  156. package/dist/extensions/pi-subagents/src/intercom/supervisor-ui.ts +244 -0
  157. package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +37 -16
  158. package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +18 -18
  159. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +51 -25
  160. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +46 -3
  161. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +14 -3
  162. package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +9 -0
  163. package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +10 -12
  164. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -15
  165. package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +40 -29
  166. package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +8 -0
  167. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +79 -247
  168. package/dist/extensions/pi-subagents/src/runs/background/notify.ts +88 -12
  169. package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +6 -6
  170. package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +24 -24
  171. package/dist/extensions/pi-subagents/src/runs/background/retained-nested-route-tracker.ts +96 -0
  172. package/dist/extensions/pi-subagents/src/runs/background/run-child-session.ts +642 -0
  173. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +75 -6
  174. package/dist/extensions/pi-subagents/src/runs/background/runner-aliases.ts +163 -0
  175. package/dist/extensions/pi-subagents/src/runs/background/runner-child-launch.ts +86 -0
  176. package/dist/extensions/pi-subagents/src/runs/background/runner-child-sessions.ts +31 -0
  177. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +18 -4
  178. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +3 -1
  179. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +597 -1092
  180. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +3 -0
  181. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +4 -0
  182. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +20 -17
  183. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +296 -394
  184. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +4 -0
  185. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +3 -1
  186. package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +9 -5
  187. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +630 -283
  188. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +8 -5
  189. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +78 -98
  190. package/dist/extensions/pi-subagents/src/runs/shared/abort-recovery.ts +3 -3
  191. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +16 -3
  192. package/dist/extensions/pi-subagents/src/runs/shared/agent-contract.ts +1 -1
  193. package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +47 -47
  194. package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +1 -2
  195. package/dist/extensions/pi-subagents/src/runs/shared/child-hooks.ts +174 -0
  196. package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +14 -3
  197. package/dist/extensions/pi-subagents/src/runs/shared/child-launch.ts +319 -0
  198. package/dist/extensions/pi-subagents/src/runs/shared/child-lifecycle.ts +25 -0
  199. package/dist/extensions/pi-subagents/src/runs/shared/child-runtime-config.ts +126 -0
  200. package/dist/extensions/pi-subagents/src/runs/shared/child-session.ts +373 -0
  201. package/dist/extensions/pi-subagents/src/runs/shared/child-tool-plan.ts +530 -0
  202. package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +2 -2
  203. package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +2 -1
  204. package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +16 -0
  205. package/dist/extensions/pi-subagents/src/runs/shared/host-step-status.ts +11 -11
  206. package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +30 -20
  207. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +5 -4
  208. package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +84 -15
  209. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +88 -12
  210. package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +37 -53
  211. package/dist/extensions/pi-subagents/src/runs/shared/nested-path.ts +1 -1
  212. package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +18 -7
  213. package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +57 -12
  214. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +3 -4
  215. package/dist/extensions/pi-subagents/src/runs/shared/permissions.ts +0 -11
  216. package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +4 -1
  217. package/dist/extensions/pi-subagents/src/runs/shared/readonly-drain-observation.ts +42 -0
  218. package/dist/extensions/pi-subagents/src/runs/shared/readonly-model-continuation.ts +69 -0
  219. package/dist/extensions/pi-subagents/src/runs/shared/readonly-session-evidence.ts +307 -0
  220. package/dist/extensions/pi-subagents/src/runs/shared/run-fanout-budget.ts +8 -21
  221. package/dist/extensions/pi-subagents/src/runs/shared/runtime-acknowledged-extensions.ts +3 -30
  222. package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +17 -4
  223. package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +2 -0
  224. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +99 -386
  225. package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +18 -62
  226. package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +0 -14
  227. package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +31 -9
  228. package/dist/extensions/pi-subagents/src/runs/shared/worktree-setup-command.ts +190 -0
  229. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +506 -226
  230. package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +1 -1
  231. package/dist/extensions/pi-subagents/src/shared/jsonl-writer.ts +11 -0
  232. package/dist/extensions/pi-subagents/src/shared/model-response-aliases.ts +13 -0
  233. package/dist/extensions/pi-subagents/src/shared/thinking-ceiling.ts +0 -6
  234. package/dist/extensions/pi-subagents/src/shared/types.ts +145 -89
  235. package/dist/extensions/pi-subagents/src/shared/utils.ts +13 -6
  236. package/dist/extensions/pi-subagents/src/shared/watch-strategy.ts +2 -0
  237. package/dist/extensions/pi-subagents/src/shared/workflow-child-permit.ts +18 -13
  238. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +0 -6
  239. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +1 -1
  240. package/dist/extensions/pi-subagents/src/tui/fleet.ts +11 -6
  241. package/dist/extensions/pi-subagents/src/tui/render.ts +277 -46
  242. package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +0 -1
  243. package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +12 -12
  244. package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +3 -3
  245. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +116 -15
  246. package/dist/extensions/pi-subagents/src/workflows/workflow-checklist.ts +15 -18
  247. package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +57 -8
  248. package/dist/extensions/pi-subagents/src/workflows/workflow-preflight.ts +19 -19
  249. package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +3 -3
  250. package/dist/extensions/pi-subagents/src/workflows/workflow-resources.ts +97 -22
  251. package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +3 -0
  252. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +336 -21
  253. package/dist/extensions/pi-subagents/test/integration/async-execution.part-1.test.ts +1181 -0
  254. package/dist/extensions/pi-subagents/test/integration/async-execution.part-2.test.ts +2240 -0
  255. package/dist/extensions/pi-subagents/test/integration/async-execution.part-3.test.ts +2268 -0
  256. package/dist/extensions/pi-subagents/test/integration/async-execution.part-4.test.ts +1512 -0
  257. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +231 -16
  258. package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +4 -18
  259. package/dist/extensions/pi-subagents/test/integration/foreign-workflow-steering.test.ts +95 -0
  260. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +9 -15
  261. package/dist/extensions/pi-subagents/test/integration/in-process-child.test.ts +374 -0
  262. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +20 -10
  263. package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +18 -6
  264. package/dist/extensions/pi-subagents/test/integration/recovered-assistant-error.test.ts +151 -0
  265. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +42 -1
  266. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +150 -25
  267. package/dist/extensions/pi-subagents/test/integration/result-publication.test.ts +354 -0
  268. package/dist/extensions/pi-subagents/test/integration/shared-cwd-terminal-evidence.test.ts +117 -0
  269. package/dist/extensions/pi-subagents/test/integration/single-execution.part-1.test.ts +3678 -0
  270. package/dist/extensions/pi-subagents/test/integration/{single-execution.test.ts → single-execution.part-2.test.ts} +500 -4207
  271. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +1 -2
  272. package/dist/extensions/pi-subagents/test/integration/workflow-result-publication.test.ts +127 -0
  273. package/dist/extensions/pi-subagents/test/integration/workflow-steer-inbox.test.ts +365 -0
  274. package/dist/extensions/pi-subagents/test/smoke/pi085-child.ts +31 -0
  275. package/dist/extensions/pi-subagents/test/smoke/pi085-clean-install.mjs +74 -0
  276. package/dist/extensions/pi-subagents/test/smoke/pi085-extension.ts +16 -0
  277. package/dist/extensions/pi-subagents/test/support/async-execution-fixture.ts +699 -0
  278. package/dist/extensions/pi-subagents/test/support/fake-child-session.ts +418 -0
  279. package/dist/extensions/pi-subagents/test/support/foreign-workflow-steer-host.mjs +13 -0
  280. package/dist/extensions/pi-subagents/test/support/mock-pi.ts +30 -76
  281. package/dist/extensions/pi-subagents/test/support/notify-diagnostics-fixture.ts +84 -0
  282. package/dist/extensions/pi-subagents/test/support/result-publication-capacity-preload.mjs +70 -0
  283. package/dist/extensions/pi-subagents/test/support/runner-child-session-factory.ts +17 -0
  284. package/dist/extensions/pi-subagents/test/support/single-execution-fixture.ts +390 -0
  285. package/dist/extensions/pi-subagents/test/unit/acceptance-compaction.test.ts +120 -0
  286. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +24 -3
  287. package/dist/extensions/pi-subagents/test/unit/advertised-agent-prompt.test.ts +87 -0
  288. package/dist/extensions/pi-subagents/test/unit/advertised-agent-refresh.test.ts +163 -0
  289. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +70 -31
  290. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +78 -3
  291. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +2 -8
  292. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +1 -1
  293. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +73 -66
  294. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +51 -1
  295. package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +49 -1
  296. package/dist/extensions/pi-subagents/test/unit/async-spawn-preload.test.ts +103 -0
  297. package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +3 -3
  298. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +9 -8
  299. package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +10 -7
  300. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +48 -6
  301. package/dist/extensions/pi-subagents/test/unit/child-runtime-config.test.ts +90 -0
  302. package/dist/extensions/pi-subagents/test/unit/{pi-args-permission-system.test.ts → child-tool-plan-permission-system.test.ts} +48 -86
  303. package/dist/extensions/pi-subagents/test/unit/child-tool-plan.test.ts +33 -0
  304. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +18 -18
  305. package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +9 -9
  306. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +8 -7
  307. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +225 -65
  308. package/dist/extensions/pi-subagents/test/unit/extension-bindings.test.ts +17 -22
  309. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +11 -1
  310. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +47 -3
  311. package/dist/extensions/pi-subagents/test/unit/foreign-workflow-steering.test.ts +74 -0
  312. package/dist/extensions/pi-subagents/test/unit/fork-cache-key.test.ts +23 -29
  313. package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +96 -4
  314. package/dist/extensions/pi-subagents/test/unit/host-step-status.test.ts +4 -4
  315. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +116 -55
  316. package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +58 -1
  317. package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +104 -3
  318. package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +10 -1
  319. package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +31 -1
  320. package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +102 -51
  321. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +196 -6
  322. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +181 -38
  323. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +62 -70
  324. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +58 -53
  325. package/dist/extensions/pi-subagents/test/unit/notify-diagnostics.test.ts +42 -0
  326. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +84 -0
  327. package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +13 -5
  328. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +21 -5
  329. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +5 -4
  330. package/dist/extensions/pi-subagents/test/unit/permissions.test.ts +2 -6
  331. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +28 -2
  332. package/dist/extensions/pi-subagents/test/unit/pi-web-session-liveness.test.ts +209 -0
  333. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +38 -1
  334. package/dist/extensions/pi-subagents/test/unit/prompt-audit-optional-peers.test.ts +43 -0
  335. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +24 -2
  336. package/dist/extensions/pi-subagents/test/unit/readonly-drain-observation.test.ts +174 -0
  337. package/dist/extensions/pi-subagents/test/unit/readonly-model-continuation.test.ts +94 -0
  338. package/dist/extensions/pi-subagents/test/unit/readonly-session-evidence.test.ts +1329 -0
  339. package/dist/extensions/pi-subagents/test/unit/recursion-guard.test.ts +29 -80
  340. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +11 -8
  341. package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +2 -2
  342. package/dist/extensions/pi-subagents/test/unit/retained-nested-route-tracker.test.ts +175 -0
  343. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +38 -12
  344. package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +2 -5
  345. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +89 -1
  346. package/dist/extensions/pi-subagents/test/unit/runtime-acknowledged-extensions.test.ts +2 -16
  347. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +27 -3
  348. package/dist/extensions/pi-subagents/test/unit/scheduled-supervisor-demand.test.ts +215 -0
  349. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +15 -11
  350. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +237 -1
  351. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +2 -5
  352. package/dist/extensions/pi-subagents/test/unit/streamed-progress-bounds.test.ts +2 -2
  353. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +14 -1
  354. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +130 -739
  355. package/dist/extensions/pi-subagents/test/unit/supervisor-ask-registration.test.ts +682 -0
  356. package/dist/extensions/pi-subagents/test/unit/supervisor-ui.test.ts +137 -0
  357. package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +1 -11
  358. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +23 -3
  359. package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +8 -1
  360. package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +19 -1
  361. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +72 -4
  362. package/dist/extensions/pi-subagents/test/unit/workflow-checklist.test.ts +17 -3
  363. package/dist/extensions/pi-subagents/test/unit/workflow-child-summary.test.ts +34 -0
  364. package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +12 -2
  365. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +46 -6
  366. package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +3 -3
  367. package/dist/extensions/pi-subagents/test/unit/workflow-resources.test.ts +133 -1
  368. package/dist/extensions/pi-subagents/test/unit/workflow-resume-hint.test.ts +53 -2
  369. package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +222 -14
  370. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +526 -85
  371. package/dist/extensions/pi-web-agent/src/backends/config.ts +1 -0
  372. package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +5 -3
  373. package/dist/extensions/pi-web-agent/src/search/tokenin.ts +7 -3
  374. package/dist/extensions/pi-web-agent/src/types.ts +1 -1
  375. package/dist/extensions/pi-zentui/README.md +17 -0
  376. package/dist/extensions/pi-zentui/assets/screenshots/footer-status-hyperlink.png +0 -0
  377. package/dist/extensions/pi-zentui/docs/configuration.md +71 -2
  378. package/dist/extensions/pi-zentui/extensions/zentui/config.ts +11 -0
  379. package/dist/extensions/pi-zentui/extensions/zentui/editor-transfer.ts +14 -0
  380. package/dist/extensions/pi-zentui/extensions/zentui/extension-status.ts +29 -13
  381. package/dist/extensions/pi-zentui/extensions/zentui/footer-layout.ts +5 -4
  382. package/dist/extensions/pi-zentui/extensions/zentui/footer-text.ts +11 -0
  383. package/dist/extensions/pi-zentui/extensions/zentui/footer.ts +11 -10
  384. package/dist/extensions/pi-zentui/extensions/zentui/index.ts +77 -3
  385. package/dist/extensions/pi-zentui/extensions/zentui/presets.ts +77 -0
  386. package/dist/extensions/pi-zentui/extensions/zentui/settings-command.ts +103 -2
  387. package/dist/extensions/pi-zentui/extensions/zentui/working-line-extension-segments.ts +115 -0
  388. package/dist/extensions/pi-zentui/extensions/zentui/working-line.ts +87 -5
  389. package/dist/extensions/pi-zentui/package-lock.json +277 -517
  390. package/dist/extensions/pi-zentui/package.json +7 -4
  391. package/dist/extensions/pi-zentui/test/config-presets.test.ts +238 -0
  392. package/dist/extensions/pi-zentui/test/editor-transfer.test.ts +24 -1
  393. package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +570 -2
  394. package/dist/extensions/pi-zentui/test/extension-status.test.ts +90 -0
  395. package/dist/extensions/pi-zentui/test/footer-hyperlink.test.ts +243 -0
  396. package/dist/extensions/pi-zentui/test/package-contents.mjs +1 -0
  397. package/dist/extensions/pi-zentui/test/presets.test.ts +121 -0
  398. package/dist/extensions/pi-zentui/test/settings-command.test.ts +205 -1
  399. package/dist/extensions/pi-zentui/test/working-line-extension-segments.test.ts +139 -0
  400. package/dist/extensions/pi-zentui/test/working-line-lifecycle.integration.test.ts +237 -3
  401. package/dist/extensions/pi-zentui/test/working-line.test.ts +94 -2
  402. package/dist/index.d.ts +1 -1
  403. package/dist/main.js +4 -1
  404. package/dist/modes/interactive/chat-viewport.d.ts +19 -0
  405. package/dist/modes/interactive/chat-viewport.js +27 -0
  406. package/dist/modes/interactive/components/assistant-message.d.ts +6 -2
  407. package/dist/modes/interactive/components/assistant-message.js +30 -13
  408. package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
  409. package/dist/modes/interactive/components/custom-editor.js +39 -1
  410. package/dist/modes/interactive/components/first-time-setup.js +1 -1
  411. package/dist/modes/interactive/components/index.d.ts +1 -1
  412. package/dist/modes/interactive/components/markdown-transform.d.ts +2 -0
  413. package/dist/modes/interactive/components/markdown-transform.js +18 -0
  414. package/dist/modes/interactive/components/model-selector.js +19 -17
  415. package/dist/modes/interactive/components/scoped-models-selector.js +21 -23
  416. package/dist/modes/interactive/components/settings-selector.d.ts +7 -1
  417. package/dist/modes/interactive/components/settings-selector.js +128 -20
  418. package/dist/modes/interactive/components/settings-submenu.d.ts +71 -0
  419. package/dist/modes/interactive/components/settings-submenu.js +164 -0
  420. package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
  421. package/dist/modes/interactive/components/status-indicator.js +10 -3
  422. package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
  423. package/dist/modes/interactive/components/thinking-selector.js +75 -18
  424. package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
  425. package/dist/modes/interactive/components/tool-execution.js +35 -33
  426. package/dist/modes/interactive/components/trust-selector.js +2 -2
  427. package/dist/modes/interactive/interactive-mode.d.ts +13 -15
  428. package/dist/modes/interactive/interactive-mode.js +144 -80
  429. package/dist/modes/interactive/session-share.d.ts +15 -0
  430. package/dist/modes/interactive/session-share.js +183 -0
  431. package/dist/modes/interactive/theme/dark.json +2 -1
  432. package/dist/modes/interactive/theme/light.json +2 -1
  433. package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
  434. package/dist/modes/interactive/theme/theme-controller.js +5 -0
  435. package/dist/modes/interactive/theme/theme-json.d.ts +83 -0
  436. package/dist/modes/interactive/theme/theme-json.js +129 -0
  437. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  438. package/dist/modes/interactive/theme/theme.d.ts +14 -5
  439. package/dist/modes/interactive/theme/theme.js +18 -119
  440. package/dist/modes/interactive/tui-renderer.d.ts +20 -0
  441. package/dist/modes/interactive/tui-renderer.js +65 -0
  442. package/dist/utils/exif-orientation.js +2 -3
  443. package/dist/utils/management-http.d.ts +24 -0
  444. package/dist/utils/management-http.js +53 -0
  445. package/dist/utils/text.d.ts +7 -0
  446. package/dist/utils/text.js +8 -0
  447. package/dist/utils/tools-manager.d.ts +1 -0
  448. package/dist/utils/tools-manager.js +43 -21
  449. package/docs/docs.json +0 -4
  450. package/package.json +4 -4
  451. package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +0 -415
  452. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +0 -1059
  453. package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +0 -116
  454. package/dist/extensions/pi-subagents/src/shared/post-exit-stdio-guard.ts +0 -85
  455. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +0 -224
  456. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +0 -6986
  457. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +0 -447
  458. package/dist/extensions/pi-subagents/test/support/real-session-child-cli.mjs +0 -185
  459. package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +0 -311
  460. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-pi-args.test.ts +0 -84
  461. package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +0 -202
  462. package/dist/extensions/pi-subagents/test/unit/close-grace-timer.test.ts +0 -101
  463. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +0 -2347
  464. package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +0 -104
  465. package/dist/extensions/pi-subagents/test/unit/windows-hide-spawn.test.ts +0 -49
  466. package/dist/skills/imagegen-frontend-mobile/SKILL.md +0 -1465
  467. package/dist/skills/imagegen-frontend-web/SKILL.md +0 -987
  468. package/dist/skills/implanger/SKILL.md +0 -70
  469. package/dist/skills/output/SKILL.md +0 -49
  470. package/dist/skills/planger/SKILL.md +0 -167
  471. package/dist/skills/workflow/SKILL.md +0 -95
  472. package/docs/workflows.md +0 -18
  473. /package/dist/bun/{register-bedrock.d.ts → runtime-setup.d.ts} +0 -0
@@ -40,7 +40,7 @@ export interface CustomMessage<T = unknown> {
40
40
  export interface BranchSummaryMessage {
41
41
  role: "branchSummary";
42
42
  summary: string;
43
- fromId: string;
43
+ fromId: string | null;
44
44
  timestamp: number;
45
45
  }
46
46
  export interface CompactionSummaryMessage {
@@ -92,6 +92,7 @@ declare const ModelDefinitionSchema: Type.TObject<{
92
92
  deferredToolsMode: Type.TOptional<Type.TLiteral<"kimi">>;
93
93
  sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
94
94
  supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
95
+ vllmPriority: Type.TOptional<Type.TNumber>;
95
96
  }>, Type.TObject<{
96
97
  supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
97
98
  sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
@@ -100,6 +101,7 @@ declare const ModelDefinitionSchema: Type.TObject<{
100
101
  supportsOpenAIGrammarTools: Type.TOptional<Type.TBoolean>;
101
102
  supportsAdditionalTools: Type.TOptional<Type.TBoolean>;
102
103
  supportsToolSearch: Type.TOptional<Type.TBoolean>;
104
+ supportsMaxOutputTokens: Type.TOptional<Type.TBoolean>;
103
105
  }>, Type.TObject<{
104
106
  supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
105
107
  supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
@@ -109,6 +111,7 @@ declare const ModelDefinitionSchema: Type.TObject<{
109
111
  forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
110
112
  allowEmptySignature: Type.TOptional<Type.TBoolean>;
111
113
  supportsStrictTools: Type.TOptional<Type.TBoolean>;
114
+ supportsMidConvoEffort: Type.TOptional<Type.TBoolean>;
112
115
  supportsToolReferences: Type.TOptional<Type.TBoolean>;
113
116
  }>]>>;
114
117
  }>;
@@ -201,6 +204,7 @@ declare const ModelOverrideSchema: Type.TObject<{
201
204
  deferredToolsMode: Type.TOptional<Type.TLiteral<"kimi">>;
202
205
  sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
203
206
  supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
207
+ vllmPriority: Type.TOptional<Type.TNumber>;
204
208
  }>, Type.TObject<{
205
209
  supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
206
210
  sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
@@ -209,6 +213,7 @@ declare const ModelOverrideSchema: Type.TObject<{
209
213
  supportsOpenAIGrammarTools: Type.TOptional<Type.TBoolean>;
210
214
  supportsAdditionalTools: Type.TOptional<Type.TBoolean>;
211
215
  supportsToolSearch: Type.TOptional<Type.TBoolean>;
216
+ supportsMaxOutputTokens: Type.TOptional<Type.TBoolean>;
212
217
  }>, Type.TObject<{
213
218
  supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
214
219
  supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
@@ -218,6 +223,7 @@ declare const ModelOverrideSchema: Type.TObject<{
218
223
  forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
219
224
  allowEmptySignature: Type.TOptional<Type.TBoolean>;
220
225
  supportsStrictTools: Type.TOptional<Type.TBoolean>;
226
+ supportsMidConvoEffort: Type.TOptional<Type.TBoolean>;
221
227
  supportsToolReferences: Type.TOptional<Type.TBoolean>;
222
228
  }>]>>;
223
229
  }>;
@@ -288,6 +294,7 @@ declare const ProviderConfigSchema: Type.TObject<{
288
294
  deferredToolsMode: Type.TOptional<Type.TLiteral<"kimi">>;
289
295
  sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
290
296
  supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
297
+ vllmPriority: Type.TOptional<Type.TNumber>;
291
298
  }>, Type.TObject<{
292
299
  supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
293
300
  sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
@@ -296,6 +303,7 @@ declare const ProviderConfigSchema: Type.TObject<{
296
303
  supportsOpenAIGrammarTools: Type.TOptional<Type.TBoolean>;
297
304
  supportsAdditionalTools: Type.TOptional<Type.TBoolean>;
298
305
  supportsToolSearch: Type.TOptional<Type.TBoolean>;
306
+ supportsMaxOutputTokens: Type.TOptional<Type.TBoolean>;
299
307
  }>, Type.TObject<{
300
308
  supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
301
309
  supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
@@ -305,6 +313,7 @@ declare const ProviderConfigSchema: Type.TObject<{
305
313
  forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
306
314
  allowEmptySignature: Type.TOptional<Type.TBoolean>;
307
315
  supportsStrictTools: Type.TOptional<Type.TBoolean>;
316
+ supportsMidConvoEffort: Type.TOptional<Type.TBoolean>;
308
317
  supportsToolReferences: Type.TOptional<Type.TBoolean>;
309
318
  }>]>>;
310
319
  authHeader: Type.TOptional<Type.TBoolean>;
@@ -400,6 +409,7 @@ declare const ProviderConfigSchema: Type.TObject<{
400
409
  deferredToolsMode: Type.TOptional<Type.TLiteral<"kimi">>;
401
410
  sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
402
411
  supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
412
+ vllmPriority: Type.TOptional<Type.TNumber>;
403
413
  }>, Type.TObject<{
404
414
  supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
405
415
  sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
@@ -408,6 +418,7 @@ declare const ProviderConfigSchema: Type.TObject<{
408
418
  supportsOpenAIGrammarTools: Type.TOptional<Type.TBoolean>;
409
419
  supportsAdditionalTools: Type.TOptional<Type.TBoolean>;
410
420
  supportsToolSearch: Type.TOptional<Type.TBoolean>;
421
+ supportsMaxOutputTokens: Type.TOptional<Type.TBoolean>;
411
422
  }>, Type.TObject<{
412
423
  supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
413
424
  supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
@@ -417,6 +428,7 @@ declare const ProviderConfigSchema: Type.TObject<{
417
428
  forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
418
429
  allowEmptySignature: Type.TOptional<Type.TBoolean>;
419
430
  supportsStrictTools: Type.TOptional<Type.TBoolean>;
431
+ supportsMidConvoEffort: Type.TOptional<Type.TBoolean>;
420
432
  supportsToolReferences: Type.TOptional<Type.TBoolean>;
421
433
  }>]>>;
422
434
  }>>>;
@@ -509,6 +521,7 @@ declare const ProviderConfigSchema: Type.TObject<{
509
521
  deferredToolsMode: Type.TOptional<Type.TLiteral<"kimi">>;
510
522
  sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
511
523
  supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
524
+ vllmPriority: Type.TOptional<Type.TNumber>;
512
525
  }>, Type.TObject<{
513
526
  supportsDeveloperRole: Type.TOptional<Type.TBoolean>;
514
527
  sessionAffinityFormat: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"openai-nosession">, Type.TLiteral<"openrouter">]>>;
@@ -517,6 +530,7 @@ declare const ProviderConfigSchema: Type.TObject<{
517
530
  supportsOpenAIGrammarTools: Type.TOptional<Type.TBoolean>;
518
531
  supportsAdditionalTools: Type.TOptional<Type.TBoolean>;
519
532
  supportsToolSearch: Type.TOptional<Type.TBoolean>;
533
+ supportsMaxOutputTokens: Type.TOptional<Type.TBoolean>;
520
534
  }>, Type.TObject<{
521
535
  supportsEagerToolInputStreaming: Type.TOptional<Type.TBoolean>;
522
536
  supportsLongCacheRetention: Type.TOptional<Type.TBoolean>;
@@ -526,6 +540,7 @@ declare const ProviderConfigSchema: Type.TObject<{
526
540
  forceAdaptiveThinking: Type.TOptional<Type.TBoolean>;
527
541
  allowEmptySignature: Type.TOptional<Type.TBoolean>;
528
542
  supportsStrictTools: Type.TOptional<Type.TBoolean>;
543
+ supportsMidConvoEffort: Type.TOptional<Type.TBoolean>;
529
544
  supportsToolReferences: Type.TOptional<Type.TBoolean>;
530
545
  }>]>>;
531
546
  }>>>;
@@ -89,6 +89,7 @@ const OpenAICompletionsCompatSchema = Type.Object({
89
89
  deferredToolsMode: Type.Optional(Type.Literal("kimi")),
90
90
  sessionAffinityFormat: Type.Optional(Type.Union([Type.Literal("openai"), Type.Literal("openai-nosession"), Type.Literal("openrouter")])),
91
91
  supportsLongCacheRetention: Type.Optional(Type.Boolean()),
92
+ vllmPriority: Type.Optional(Type.Number()),
92
93
  });
93
94
  const OpenAIResponsesCompatSchema = Type.Object({
94
95
  supportsDeveloperRole: Type.Optional(Type.Boolean()),
@@ -98,6 +99,7 @@ const OpenAIResponsesCompatSchema = Type.Object({
98
99
  supportsOpenAIGrammarTools: Type.Optional(Type.Boolean()),
99
100
  supportsAdditionalTools: Type.Optional(Type.Boolean()),
100
101
  supportsToolSearch: Type.Optional(Type.Boolean()),
102
+ supportsMaxOutputTokens: Type.Optional(Type.Boolean()),
101
103
  });
102
104
  const AnthropicMessagesCompatSchema = Type.Object({
103
105
  supportsEagerToolInputStreaming: Type.Optional(Type.Boolean()),
@@ -108,6 +110,7 @@ const AnthropicMessagesCompatSchema = Type.Object({
108
110
  forceAdaptiveThinking: Type.Optional(Type.Boolean()),
109
111
  allowEmptySignature: Type.Optional(Type.Boolean()),
110
112
  supportsStrictTools: Type.Optional(Type.Boolean()),
113
+ supportsMidConvoEffort: Type.Optional(Type.Boolean()),
111
114
  supportsToolReferences: Type.Optional(Type.Boolean()),
112
115
  });
113
116
  const ProviderCompatSchema = Type.Union([
@@ -73,6 +73,7 @@ export declare class ModelRuntime implements Models {
73
73
  complete<TApi extends Api>(model: Model<TApi>, context: Context, options?: ModelsApiStreamOptions<TApi>): Promise<AssistantMessage>;
74
74
  streamSimple(model: Model<Api>, context: Context, options?: ModelsSimpleStreamOptions): AssistantMessageEventStream;
75
75
  completeSimple(model: Model<Api>, context: Context, options?: ModelsSimpleStreamOptions): Promise<AssistantMessage>;
76
+ streamDeferred(model: Model<Api>, handle: DeferredHandle, options?: ModelsDeferredFetchOptions): AssistantMessageEventStream;
76
77
  fetchDeferred(model: Model<Api>, handle: DeferredHandle, options?: ModelsDeferredFetchOptions): Promise<AssistantMessage>;
77
78
  cancelDeferred(model: Model<Api>, handle: DeferredHandle, options?: ModelsDeferredCancelOptions): Promise<void>;
78
79
  login(providerId: string, type: AuthType, interaction: AuthInteraction): Promise<Credential>;
@@ -357,14 +357,17 @@ export class ModelRuntime {
357
357
  completeSimple(model, context, options) {
358
358
  return this.streamSimple(model, context, options).result();
359
359
  }
360
- async fetchDeferred(model, handle, options) {
360
+ streamDeferred(model, handle, options) {
361
361
  return lazyStream(model, async () => {
362
362
  const prepared = await this.prepareRequest(model, options);
363
363
  if (!prepared.provider.fetchDeferred) {
364
364
  throw new ModelsError("provider", `Provider ${model.provider} does not support deferred responses`);
365
365
  }
366
366
  return prepared.provider.fetchDeferred(prepared.model, handle, prepared.options);
367
- }).result();
367
+ });
368
+ }
369
+ async fetchDeferred(model, handle, options) {
370
+ return this.streamDeferred(model, handle, options).result();
368
371
  }
369
372
  async cancelDeferred(model, handle, options) {
370
373
  const prepared = await this.prepareRequest(model, options);
@@ -85,6 +85,12 @@ function modelFromJson(providerId, definition, providerConfig, defaults) {
85
85
  compat: mergeCompat(providerConfig.compat, definition.compat),
86
86
  };
87
87
  }
88
+ function findModelDefaults(models, modelId, api) {
89
+ return (models.find((model) => model.id === modelId) ??
90
+ (api ? models.find((model) => model.api === api) : undefined) ??
91
+ models.find((model) => model.api === "openai-completions") ??
92
+ models[0]);
93
+ }
88
94
  function applyModelsJson(providerId, baseModels, config) {
89
95
  if (!config)
90
96
  return [...baseModels];
@@ -109,7 +115,7 @@ function applyModelsJson(providerId, baseModels, config) {
109
115
  }));
110
116
  for (const definition of config.models ?? []) {
111
117
  const existingIndex = models.findIndex((model) => model.id === definition.id);
112
- const defaults = existingIndex >= 0 ? models[existingIndex] : models[0];
118
+ const defaults = findModelDefaults(models, definition.id, definition.api ?? config.api);
113
119
  const model = modelFromJson(providerId, definition, config, defaults);
114
120
  if (existingIndex >= 0)
115
121
  models[existingIndex] = model;
@@ -125,7 +131,7 @@ function applyExtension(providerId, models, config) {
125
131
  return config.baseUrl ? models.map((model) => ({ ...model, baseUrl: config.baseUrl })) : [...models];
126
132
  }
127
133
  return config.models.map((definition) => {
128
- const defaults = models.find((model) => model.id === definition.id) ?? models[0];
134
+ const defaults = findModelDefaults(models, definition.id, definition.api ?? config.api);
129
135
  const api = definition.api ?? config.api ?? defaults?.api;
130
136
  if (!api) {
131
137
  throw new Error(`Provider ${providerId}, model ${definition.id}: no "api" specified. Set at provider or model level.`);
@@ -0,0 +1,3 @@
1
+ import { type SessionManager } from "./session-manager.ts";
2
+ /** Write the current session branch and optional trailing export-only entries as JSONL. */
3
+ export declare function exportSessionToJsonl(sessionManager: SessionManager, outputPath?: string, createTrailingEntries?: (parentId: string | null, timestamp: string) => readonly object[]): string;
@@ -0,0 +1,31 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { resolvePath } from "../utils/paths.js";
4
+ import { CURRENT_SESSION_VERSION } from "./session-manager.js";
5
+ /** Write the current session branch and optional trailing export-only entries as JSONL. */
6
+ export function exportSessionToJsonl(sessionManager, outputPath, createTrailingEntries) {
7
+ const filePath = resolvePath(outputPath ?? `session-${new Date().toISOString().replace(/[:.]/g, "-")}.jsonl`, process.cwd());
8
+ const dir = dirname(filePath);
9
+ if (!existsSync(dir)) {
10
+ mkdirSync(dir, { recursive: true });
11
+ }
12
+ const timestamp = new Date().toISOString();
13
+ const header = {
14
+ type: "session",
15
+ version: CURRENT_SESSION_VERSION,
16
+ id: sessionManager.getSessionId(),
17
+ timestamp,
18
+ cwd: sessionManager.getCwd(),
19
+ };
20
+ const lines = [JSON.stringify(header)];
21
+ let parentId = null;
22
+ for (const entry of sessionManager.getBranch()) {
23
+ lines.push(JSON.stringify({ ...entry, parentId }));
24
+ parentId = entry.id;
25
+ }
26
+ for (const entry of createTrailingEntries?.(parentId, timestamp) ?? []) {
27
+ lines.push(JSON.stringify(entry));
28
+ }
29
+ writeFileSync(filePath, `${lines.join("\n")}\n`);
30
+ return filePath;
31
+ }
@@ -198,6 +198,7 @@ export declare class SessionManager {
198
198
  setSessionFile(sessionFile: string): void;
199
199
  private _setSessionFile;
200
200
  newSession(options?: NewSessionOptions): string | undefined;
201
+ private _loadEntries;
201
202
  private _buildIndex;
202
203
  private _rewriteFile;
203
204
  isPersisted(): boolean;
@@ -329,8 +330,8 @@ export declare class SessionManager {
329
330
  * @param sessionDir Optional session directory. If omitted, uses the configured agent sessions directory.
330
331
  */
331
332
  static continueRecent(cwd: string, sessionDir?: string): SessionManager;
332
- /** Create an in-memory session (no file persistence) */
333
- static inMemory(cwd?: string, options?: NewSessionOptions): SessionManager;
333
+ /** Create an in-memory session (no file persistence), optionally from entries held outside the filesystem. */
334
+ static inMemory(cwd?: string, options?: NewSessionOptions, entries?: FileEntry[]): SessionManager;
334
335
  /**
335
336
  * Fork a session from another project directory into the current project.
336
337
  * Creates a new session in the target cwd with the full history from the source session.
@@ -605,6 +605,9 @@ export class SessionManager {
605
605
  if (sessionFile) {
606
606
  this._setSessionFile(sessionFile, preloadedFileEntries);
607
607
  }
608
+ else if (preloadedFileEntries?.length) {
609
+ this._loadEntries(preloadedFileEntries, newSessionOptions);
610
+ }
608
611
  else {
609
612
  this.newSession(newSessionOptions);
610
613
  }
@@ -616,10 +619,10 @@ export class SessionManager {
616
619
  _setSessionFile(sessionFile, preloadedFileEntries) {
617
620
  this.sessionFile = resolvePath(sessionFile);
618
621
  if (existsSync(this.sessionFile)) {
619
- this.fileEntries = preloadedFileEntries ?? loadEntriesFromFile(this.sessionFile);
622
+ const entries = preloadedFileEntries ?? loadEntriesFromFile(this.sessionFile);
620
623
  // If file was empty, initialize it with a valid session header. If it was
621
624
  // non-empty but did not parse as a pi session, fail without modifying it.
622
- if (this.fileEntries.length === 0) {
625
+ if (entries.length === 0) {
623
626
  const explicitPath = this.sessionFile;
624
627
  if (statSync(explicitPath).size > 0) {
625
628
  throw new Error(`Session file is not a valid ${APP_NAME} session: ${explicitPath}`);
@@ -630,12 +633,7 @@ export class SessionManager {
630
633
  this.flushed = true;
631
634
  return;
632
635
  }
633
- const header = this.fileEntries.find((e) => e.type === "session");
634
- this.sessionId = header?.id ?? createSessionId();
635
- if (migrateToCurrentVersion(this.fileEntries)) {
636
- this._rewriteFile();
637
- }
638
- this._buildIndex();
636
+ this._loadEntries(entries);
639
637
  this.flushed = true;
640
638
  }
641
639
  else {
@@ -670,6 +668,21 @@ export class SessionManager {
670
668
  }
671
669
  return this.sessionFile;
672
670
  }
671
+ _loadEntries(entries, options) {
672
+ const header = entries.find((e) => e.type === "session");
673
+ if (header) {
674
+ this.fileEntries = entries;
675
+ this.sessionId = header.id;
676
+ if (migrateToCurrentVersion(this.fileEntries)) {
677
+ this._rewriteFile();
678
+ }
679
+ }
680
+ else {
681
+ this.newSession(options);
682
+ this.fileEntries = this.fileEntries.concat(entries);
683
+ }
684
+ this._buildIndex();
685
+ }
673
686
  _buildIndex() {
674
687
  this.byId.clear();
675
688
  this.labelsById.clear();
@@ -1086,11 +1099,25 @@ export class SessionManager {
1086
1099
  // Because labels are real tree entries, later entries can be children of labels;
1087
1100
  // removing labels requires re-chaining the retained path to avoid orphaned subtrees.
1088
1101
  const pathWithoutLabels = [];
1102
+ const replacementByLabelId = new Map();
1103
+ const pendingLabelIds = [];
1089
1104
  let pathParentId = null;
1090
1105
  for (const entry of path) {
1091
- if (entry.type === "label")
1106
+ if (entry.type === "label") {
1107
+ pendingLabelIds.push(entry.id);
1092
1108
  continue;
1093
- pathWithoutLabels.push({ ...entry, parentId: pathParentId });
1109
+ }
1110
+ for (const labelId of pendingLabelIds) {
1111
+ replacementByLabelId.set(labelId, entry.id);
1112
+ }
1113
+ pendingLabelIds.length = 0;
1114
+ pathWithoutLabels.push(entry.type === "compaction"
1115
+ ? {
1116
+ ...entry,
1117
+ parentId: pathParentId,
1118
+ firstKeptEntryId: replacementByLabelId.get(entry.firstKeptEntryId) ?? entry.firstKeptEntryId,
1119
+ }
1120
+ : { ...entry, parentId: pathParentId });
1094
1121
  pathParentId = entry.id;
1095
1122
  }
1096
1123
  const newSessionId = createSessionId();
@@ -1222,9 +1249,9 @@ export class SessionManager {
1222
1249
  }
1223
1250
  return new SessionManager(cwd, dir, undefined, true);
1224
1251
  }
1225
- /** Create an in-memory session (no file persistence) */
1226
- static inMemory(cwd = process.cwd(), options) {
1227
- return new SessionManager(cwd, "", undefined, false, options);
1252
+ /** Create an in-memory session (no file persistence), optionally from entries held outside the filesystem. */
1253
+ static inMemory(cwd = process.cwd(), options, entries) {
1254
+ return new SessionManager(cwd, "", undefined, false, options, entries);
1228
1255
  }
1229
1256
  /**
1230
1257
  * Fork a session from another project directory into the current project.
@@ -52,7 +52,7 @@ export declare function loadSkillsFromDir(options: LoadSkillsFromDirOptions): Lo
52
52
  * Skills with disableModelInvocation=true are excluded from the prompt
53
53
  * (they can only be invoked explicitly via /skill:name commands).
54
54
  */
55
- export declare function formatSkillsForPrompt(skills: Skill[]): string;
55
+ export declare function formatSkillsForPrompt(skills: Skill[], fileReadTool?: "read" | "bash"): string;
56
56
  export interface LoadSkillsOptions {
57
57
  /** Working directory for project-local skills. */
58
58
  cwd: string;
@@ -255,14 +255,16 @@ function loadSkillFromFile(filePath, source) {
255
255
  * Skills with disableModelInvocation=true are excluded from the prompt
256
256
  * (they can only be invoked explicitly via /skill:name commands).
257
257
  */
258
- export function formatSkillsForPrompt(skills) {
258
+ export function formatSkillsForPrompt(skills, fileReadTool = "read") {
259
259
  const visibleSkills = skills.filter((s) => !s.disableModelInvocation);
260
260
  if (visibleSkills.length === 0) {
261
261
  return "";
262
262
  }
263
263
  const lines = [
264
264
  "\n\nThe following skills provide specialized instructions for specific tasks.",
265
- "Use the read tool to load a skill's file when the task matches its description, unless its full instructions are already embedded in the current user message inside a <skill> block.",
265
+ fileReadTool === "read"
266
+ ? "Use the read tool to load a skill's file when the task matches its description, unless its full instructions are already embedded in the current user message inside a <skill> block."
267
+ : "Use bash to load a skill's file when the task matches its description, unless its full instructions are already embedded in the current user message inside a <skill> block.",
266
268
  "When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.",
267
269
  "",
268
270
  "<available_skills>",
@@ -18,6 +18,9 @@ export function buildSystemPrompt(options) {
18
18
  const contextFiles = providedContextFiles ?? [];
19
19
  const skills = providedSkills ?? [];
20
20
  const agents = options.agents ?? [];
21
+ const tools = selectedTools || ["read", "bash", "edit", "write"];
22
+ const hasRead = tools.includes("read");
23
+ const skillFileReadTool = ["read", "bash"].find((tool) => tools.includes(tool));
21
24
  if (customPrompt) {
22
25
  let prompt = customPrompt;
23
26
  if (appendSection) {
@@ -32,12 +35,11 @@ export function buildSystemPrompt(options) {
32
35
  }
33
36
  prompt += "</project_context>\n";
34
37
  }
35
- // Append skills section (only if read tool is available)
36
- const customPromptHasRead = !selectedTools || selectedTools.includes("read");
37
- if (customPromptHasRead && skills.length > 0) {
38
- prompt += formatSkillsForPrompt(skills);
38
+ // Append skills when a tool capable of reading their files is available.
39
+ if (skillFileReadTool && skills.length > 0) {
40
+ prompt += formatSkillsForPrompt(skills, skillFileReadTool);
39
41
  }
40
- if (customPromptHasRead && agents.length > 0) {
42
+ if (hasRead && agents.length > 0) {
41
43
  prompt += formatAgentsForPrompt(agents);
42
44
  }
43
45
  // Render active-tool guidelines (e.g., mandatory delegation contracts) in
@@ -60,7 +62,6 @@ export function buildSystemPrompt(options) {
60
62
  const examplesPath = getExamplesPath();
61
63
  // Build tools list based on selected tools.
62
64
  // A tool appears in Available tools only when the caller provides a one-line snippet.
63
- const tools = selectedTools || ["read", "bash", "edit", "write", "grep", "find", "ls"];
64
65
  const visibleTools = tools.filter((name) => !!toolSnippets?.[name]);
65
66
  const toolsList = visibleTools.length > 0 ? visibleTools.map((name) => `- ${name}: ${toolSnippets[name]}`).join("\n") : "(none)";
66
67
  // Build guidelines based on which tools are actually available
@@ -77,7 +78,6 @@ export function buildSystemPrompt(options) {
77
78
  const hasGrep = tools.includes("grep");
78
79
  const hasFind = tools.includes("find");
79
80
  const hasLs = tools.includes("ls");
80
- const hasRead = tools.includes("read");
81
81
  // File exploration guidelines
82
82
  if (hasBash && !hasGrep && !hasFind && !hasLs) {
83
83
  addGuideline("Use bash for file operations like ls, rg, find");
@@ -117,9 +117,9 @@ When working on pi topics, resolve docs/... and examples/... under those paths (
117
117
  }
118
118
  prompt += "</project_context>\n";
119
119
  }
120
- // Append skills section (only if read tool is available)
121
- if (hasRead && skills.length > 0) {
122
- prompt += formatSkillsForPrompt(skills);
120
+ // Append skills when a tool capable of reading their files is available.
121
+ if (skillFileReadTool && skills.length > 0) {
122
+ prompt += formatSkillsForPrompt(skills, skillFileReadTool);
123
123
  }
124
124
  if (hasRead && agents.length > 0) {
125
125
  prompt += formatAgentsForPrompt(agents);
@@ -1,16 +1,12 @@
1
1
  import { constants } from "node:fs";
2
2
  import { access as fsAccess } from "node:fs/promises";
3
- import { Container, Text, truncateToWidth } from "@earendil-works/pi-tui";
4
3
  import { spawn } from "child_process";
5
4
  import { Type } from "typebox";
6
- import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
7
- import { truncateToVisualLines } from "../../modes/interactive/components/visual-truncate.js";
8
- import { theme } from "../../modes/interactive/theme/theme.js";
9
5
  import { waitForChildProcess } from "../../utils/child-process.js";
10
6
  import { getShellConfig, getShellEnv, killProcessTree, trackDetachedChildPid, untrackDetachedChildPid, } from "../../utils/shell.js";
11
7
  import { getExperimentalToolSampling } from "../experimental.js";
12
8
  import { OutputAccumulator } from "./output-accumulator.js";
13
- import { getTextOutput, invalidArgText, str } from "./render-utils.js";
9
+ import { BASH_UPDATE_THROTTLE_MS, createShellRenderers } from "./renderers/bash.js";
14
10
  import { wrapToolDefinition } from "./tool-definition-wrapper.js";
15
11
  import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize } from "./truncate.js";
16
12
  const MAX_TIMEOUT_MS = 2_147_483_647;
@@ -143,90 +139,6 @@ function resolveSpawnContext(command, cwd, spawnHook, exposeSessionEnvironment,
143
139
  const baseContext = { command, cwd, env };
144
140
  return spawnHook ? spawnHook(baseContext) : baseContext;
145
141
  }
146
- const BASH_PREVIEW_LINES = 5;
147
- const BASH_UPDATE_THROTTLE_MS = 100;
148
- class BashResultRenderComponent extends Container {
149
- state = {
150
- cachedWidth: undefined,
151
- cachedLines: undefined,
152
- cachedSkipped: undefined,
153
- };
154
- }
155
- function formatDuration(ms) {
156
- return `${(ms / 1000).toFixed(1)}s`;
157
- }
158
- function formatShellCall(args, prompt) {
159
- const command = str(args?.command);
160
- const timeout = args?.timeout;
161
- const timeoutSuffix = timeout ? theme.fg("muted", ` (timeout ${timeout}s)`) : "";
162
- const commandDisplay = command === null ? invalidArgText(theme) : command ? command : theme.fg("toolOutput", "...");
163
- return theme.fg("toolTitle", theme.bold(`${prompt} ${commandDisplay}`)) + timeoutSuffix;
164
- }
165
- function rebuildBashResultRenderComponent(component, result, options, showImages, startedAt, endedAt) {
166
- const state = component.state;
167
- component.clear();
168
- let output = getTextOutput(result, showImages).trim();
169
- const truncation = result.details?.truncation;
170
- const fullOutputPath = result.details?.fullOutputPath;
171
- if (!options.isPartial && truncation?.truncated && fullOutputPath && output.endsWith("]")) {
172
- const footerStart = output.lastIndexOf("\n\n[");
173
- if (footerStart !== -1 && output.slice(footerStart).includes(fullOutputPath)) {
174
- output = output.slice(0, footerStart).trimEnd();
175
- }
176
- }
177
- if (output) {
178
- const styledOutput = output
179
- .split("\n")
180
- .map((line) => theme.fg("toolOutput", line))
181
- .join("\n");
182
- if (options.expanded) {
183
- component.addChild(new Text(`\n${styledOutput}`, 0, 0));
184
- }
185
- else {
186
- component.addChild({
187
- render: (width) => {
188
- if (state.cachedLines === undefined || state.cachedWidth !== width) {
189
- const preview = truncateToVisualLines(styledOutput, BASH_PREVIEW_LINES, width);
190
- state.cachedLines = preview.visualLines;
191
- state.cachedSkipped = preview.skippedCount;
192
- state.cachedWidth = width;
193
- }
194
- if (state.cachedSkipped && state.cachedSkipped > 0) {
195
- const hint = theme.fg("muted", `... (${state.cachedSkipped} earlier lines,`) +
196
- ` ${keyHint("app.tools.expand", "to expand")}${theme.fg("muted", ")")}`;
197
- return ["", truncateToWidth(hint, width, "..."), ...(state.cachedLines ?? [])];
198
- }
199
- return ["", ...(state.cachedLines ?? [])];
200
- },
201
- invalidate: () => {
202
- state.cachedWidth = undefined;
203
- state.cachedLines = undefined;
204
- state.cachedSkipped = undefined;
205
- },
206
- });
207
- }
208
- }
209
- if (truncation?.truncated || fullOutputPath) {
210
- const warnings = [];
211
- if (fullOutputPath) {
212
- warnings.push(`Full output: ${fullOutputPath}`);
213
- }
214
- if (truncation?.truncated) {
215
- if (truncation.truncatedBy === "lines") {
216
- warnings.push(`Truncated: showing ${truncation.outputLines} of ${truncation.totalLines} lines`);
217
- }
218
- else {
219
- warnings.push(`Truncated: ${truncation.outputLines} lines shown (${formatSize(truncation.maxBytes ?? DEFAULT_MAX_BYTES)} limit)`);
220
- }
221
- }
222
- component.addChild(new Text(`\n${theme.fg("warning", `[${warnings.join(". ")}]`)}`, 0, 0));
223
- }
224
- if (startedAt !== undefined) {
225
- const label = options.isPartial ? "Elapsed" : "Took";
226
- const endTime = endedAt ?? Date.now();
227
- component.addChild(new Text(`\n${theme.fg("muted", `${label} ${formatDuration(endTime - startedAt)}`)}`, 0, 0));
228
- }
229
- }
230
142
  export function createShellToolDefinition(cwd, config, options) {
231
143
  const ops = options?.operations ?? createLocalBashOperations({ shellPath: options?.shellPath });
232
144
  const commandPrefix = options?.commandPrefix;
@@ -242,7 +154,7 @@ export function createShellToolDefinition(cwd, config, options) {
242
154
  constrainedSampling: getExperimentalToolSampling(),
243
155
  async execute(_toolCallId, { command, timeout }, signal, onUpdate, ctx) {
244
156
  const resolvedCommand = commandPrefix ? `${commandPrefix}\n${command}` : command;
245
- const spawnContext = resolveSpawnContext(resolvedCommand, cwd, spawnHook, exposeSessionEnvironment, ctx);
157
+ const spawnContext = resolveSpawnContext(resolvedCommand, ctx?.cwd || cwd, spawnHook, exposeSessionEnvironment, ctx);
246
158
  const output = new OutputAccumulator({ tempFilePrefix: config.tempFilePrefix });
247
159
  let acceptingOutput = true;
248
160
  let updateTimer;
@@ -357,33 +269,7 @@ export function createShellToolDefinition(cwd, config, options) {
357
269
  clearUpdateTimer();
358
270
  }
359
271
  },
360
- renderCall(args, _theme, context) {
361
- const state = context.state;
362
- if (context.executionStarted && state.startedAt === undefined) {
363
- state.startedAt = Date.now();
364
- state.endedAt = undefined;
365
- }
366
- const text = context.lastComponent ?? new Text("", 0, 0);
367
- text.setText(formatShellCall(args, config.prompt));
368
- return text;
369
- },
370
- renderResult(result, options, _theme, context) {
371
- const state = context.state;
372
- if (state.startedAt !== undefined && options.isPartial && !state.interval) {
373
- state.interval = setInterval(() => context.invalidate(), 1000);
374
- }
375
- if (!options.isPartial || context.isError) {
376
- state.endedAt ??= Date.now();
377
- if (state.interval) {
378
- clearInterval(state.interval);
379
- state.interval = undefined;
380
- }
381
- }
382
- const component = context.lastComponent ?? new BashResultRenderComponent();
383
- rebuildBashResultRenderComponent(component, result, options, context.showImages, state.startedAt, state.endedAt);
384
- component.invalidate();
385
- return component;
386
- },
272
+ ...createShellRenderers(config.prompt),
387
273
  };
388
274
  }
389
275
  const bashToolConfig = {
@@ -1,12 +1,7 @@
1
1
  import type { AgentTool } from "@earendil-works/pi-agent-core";
2
- import { Box } from "@earendil-works/pi-tui";
3
2
  import { type Static, Type } from "typebox";
4
3
  import type { ToolDefinition } from "../extensions/types.ts";
5
- import { type EditDiffError, type EditDiffResult } from "./edit-diff.ts";
6
- type EditPreview = EditDiffResult | EditDiffError;
7
- type EditRenderState = {
8
- callComponent?: EditCallRenderComponent;
9
- };
4
+ import { type EditRenderState } from "./renderers/edit.ts";
10
5
  declare const editSchema: Type.TObject<{
11
6
  path: Type.TString;
12
7
  edits: Type.TArray<Type.TObject<{
@@ -39,12 +34,6 @@ export interface EditToolOptions {
39
34
  /** Custom operations for file editing. Default: local filesystem */
40
35
  operations?: EditOperations;
41
36
  }
42
- type EditCallRenderComponent = Box & {
43
- preview?: EditPreview;
44
- previewArgsKey?: string;
45
- previewPending?: boolean;
46
- settledError?: boolean;
47
- };
48
37
  export declare function createEditToolDefinition(cwd: string, options?: EditToolOptions): ToolDefinition<typeof editSchema, EditToolDetails | undefined, EditRenderState>;
49
38
  export declare function createEditTool(cwd: string, options?: EditToolOptions): AgentTool<typeof editSchema>;
50
39
  export {};