@selesai/code 0.8.2 → 0.8.4

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 (528) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +4 -2
  3. package/dist/cli/args.d.ts +2 -0
  4. package/dist/cli/args.js +18 -0
  5. package/dist/cli/config-selector.js +2 -2
  6. package/dist/cli/startup-ui.d.ts +1 -1
  7. package/dist/cli/startup-ui.js +2 -2
  8. package/dist/core/keybindings.d.ts +44 -4
  9. package/dist/core/llama/provider.js +22 -7
  10. package/dist/core/model-resolver.js +2 -0
  11. package/dist/core/model-runtime.d.ts +4 -2
  12. package/dist/core/model-runtime.js +23 -2
  13. package/dist/core/remote-catalog-provider.js +72 -67
  14. package/dist/core/settings-manager.d.ts +8 -0
  15. package/dist/core/settings-manager.js +18 -0
  16. package/dist/extensions/handoff-new.ts +1 -1
  17. package/dist/extensions/inline-skills.test.ts +1 -0
  18. package/dist/extensions/inline-skills.ts +1 -1
  19. package/dist/extensions/pi-intercom/CHANGELOG.md +25 -3
  20. package/dist/extensions/pi-intercom/README.md +34 -15
  21. package/dist/extensions/pi-intercom/broker/broker.ts +38 -141
  22. package/dist/extensions/pi-intercom/broker/client-liveness.test.ts +173 -0
  23. package/dist/extensions/pi-intercom/broker/client.ts +78 -150
  24. package/dist/extensions/pi-intercom/broker/extension-state.ts +18 -7
  25. package/dist/extensions/pi-intercom/broker/framing.ts +1 -1
  26. package/dist/extensions/pi-intercom/broker/protocol.ts +182 -0
  27. package/dist/extensions/pi-intercom/broker/spawn.test.ts +106 -7
  28. package/dist/extensions/pi-intercom/broker/spawn.ts +37 -11
  29. package/dist/extensions/pi-intercom/config.test.ts +8 -10
  30. package/dist/extensions/pi-intercom/config.ts +3 -3
  31. package/dist/extensions/pi-intercom/index.ts +218 -147
  32. package/dist/extensions/pi-intercom/intercom.integration.test.ts +891 -103
  33. package/dist/extensions/pi-intercom/package.json +3 -2
  34. package/dist/extensions/pi-intercom/project-agent.test.ts +145 -0
  35. package/dist/extensions/pi-intercom/project-agent.ts +324 -0
  36. package/dist/extensions/pi-intercom/reply-tracker.test.ts +86 -1
  37. package/dist/extensions/pi-intercom/reply-tracker.ts +41 -9
  38. package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +49 -9
  39. package/dist/extensions/pi-intercom/test/inline-message.test.ts +9 -9
  40. package/dist/extensions/pi-intercom/types.ts +3 -1
  41. package/dist/extensions/pi-intercom/ui/inline-message.ts +7 -7
  42. package/dist/extensions/pi-powerline-footer/.github/workflows/test.yml +2 -2
  43. package/dist/extensions/pi-powerline-footer/CHANGELOG.md +15 -1
  44. package/dist/extensions/pi-powerline-footer/README.md +20 -37
  45. package/dist/extensions/pi-powerline-footer/bash-mode/completion.ts +40 -25
  46. package/dist/extensions/pi-powerline-footer/bash-mode/editor.ts +149 -18
  47. package/dist/extensions/pi-powerline-footer/bash-mode/types.ts +1 -0
  48. package/dist/extensions/pi-powerline-footer/editor-performance.ts +99 -0
  49. package/dist/extensions/pi-powerline-footer/git-status.ts +15 -0
  50. package/dist/extensions/pi-powerline-footer/index.ts +394 -586
  51. package/dist/extensions/pi-powerline-footer/package.json +5 -6
  52. package/dist/extensions/pi-powerline-footer/powerline-config.ts +0 -18
  53. package/dist/extensions/pi-powerline-footer/queue/store.ts +8 -56
  54. package/dist/extensions/pi-powerline-footer/queue/types.ts +1 -2
  55. package/dist/extensions/pi-powerline-footer/segments.ts +0 -3
  56. package/dist/extensions/pi-powerline-footer/tests/bash-mode.test.ts +231 -1
  57. package/dist/extensions/pi-powerline-footer/tests/custom-items.test.ts +5 -19
  58. package/dist/extensions/pi-powerline-footer/tests/editor-performance.test.ts +43 -0
  59. package/dist/extensions/pi-powerline-footer/tests/fixed-editor-border.test.ts +2 -2
  60. package/dist/extensions/pi-powerline-footer/tests/git-optional-locks.test.ts +64 -0
  61. package/dist/extensions/pi-powerline-footer/tests/guide.test.ts +1 -1
  62. package/dist/extensions/pi-powerline-footer/tests/jump-shortcuts.test.ts +86 -19
  63. package/dist/extensions/pi-powerline-footer/tests/queue-store.test.ts +19 -149
  64. package/dist/extensions/pi-powerline-footer/tests/remaining-regressions.test.ts +6 -0
  65. package/dist/extensions/pi-powerline-footer/tests/usage-display.test.ts +5 -5
  66. package/dist/extensions/pi-powerline-footer/tsconfig.json +1 -1
  67. package/dist/extensions/pi-powerline-footer/types.ts +1 -2
  68. package/dist/extensions/pi-subagents/CHANGELOG.md +202 -14
  69. package/dist/extensions/pi-subagents/README.md +65 -1614
  70. package/dist/extensions/pi-subagents/agents/builder.md +0 -1
  71. package/dist/extensions/pi-subagents/agents/delegate.md +14 -0
  72. package/dist/extensions/pi-subagents/agents/oracle.md +74 -0
  73. package/dist/extensions/pi-subagents/agents/reviewer.md +78 -0
  74. package/dist/extensions/pi-subagents/agents/scout.md +50 -0
  75. package/dist/extensions/pi-subagents/agents/worker.md +58 -0
  76. package/dist/extensions/pi-subagents/docs/configuration.md +328 -0
  77. package/dist/extensions/pi-subagents/docs/extension-api.md +308 -0
  78. package/dist/extensions/pi-subagents/docs/missions.md +119 -0
  79. package/dist/extensions/pi-subagents/docs/models.md +192 -0
  80. package/dist/extensions/pi-subagents/docs/observability.md +174 -0
  81. package/dist/extensions/pi-subagents/docs/tool-reference.md +343 -0
  82. package/dist/extensions/pi-subagents/docs/watchdog.md +176 -0
  83. package/dist/extensions/pi-subagents/docs/workflows.md +163 -0
  84. package/dist/extensions/pi-subagents/inspector-runner.mjs +11 -0
  85. package/dist/extensions/pi-subagents/package-lock.json +152 -194
  86. package/dist/extensions/pi-subagents/package.json +9 -10
  87. package/dist/extensions/pi-subagents/prompts/gather-context-and-clarify.md +1 -1
  88. package/dist/extensions/pi-subagents/prompts/parallel-cleanup.md +9 -9
  89. package/dist/extensions/pi-subagents/prompts/parallel-research.md +6 -6
  90. package/dist/extensions/pi-subagents/prompts/parallel-review.md +8 -8
  91. package/dist/extensions/pi-subagents/prompts/review-loop.md +12 -12
  92. package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +22 -17
  93. package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +77 -72
  94. package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +177 -69
  95. package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +28 -8
  96. package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +88 -66
  97. package/dist/extensions/pi-subagents/src/agents/agent-management.ts +3 -3
  98. package/dist/extensions/pi-subagents/src/agents/agent-refinements.ts +624 -0
  99. package/dist/extensions/pi-subagents/src/agents/agents.ts +29 -16
  100. package/dist/extensions/pi-subagents/src/agents/frontmatter.ts +7 -3
  101. package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +2 -2
  102. package/dist/extensions/pi-subagents/src/agents/skills.ts +2 -9
  103. package/dist/extensions/pi-subagents/src/api/delegation.ts +1 -2
  104. package/dist/extensions/pi-subagents/src/api/project-panes.ts +30 -0
  105. package/dist/extensions/pi-subagents/src/extension/config.ts +56 -8
  106. package/dist/extensions/pi-subagents/src/extension/control-notices.ts +2 -2
  107. package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +51 -26
  108. package/dist/extensions/pi-subagents/src/extension/index.ts +119 -50
  109. package/dist/extensions/pi-subagents/src/extension/public-execution.ts +72 -0
  110. package/dist/extensions/pi-subagents/src/extension/rpc.ts +15 -15
  111. package/dist/extensions/pi-subagents/src/extension/schemas.ts +58 -21
  112. package/dist/extensions/pi-subagents/src/extension/subagent-guide.ts +39 -0
  113. package/dist/extensions/pi-subagents/src/extension/tool-description.ts +47 -25
  114. package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +3 -3
  115. package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +460 -64
  116. package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +102 -4
  117. package/dist/extensions/pi-subagents/src/missions/actions.ts +77 -16
  118. package/dist/extensions/pi-subagents/src/missions/goal-driver.ts +162 -0
  119. package/dist/extensions/pi-subagents/src/missions/lifecycle.ts +65 -14
  120. package/dist/extensions/pi-subagents/src/missions/store.ts +147 -5
  121. package/dist/extensions/pi-subagents/src/missions/types.ts +58 -3
  122. package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +256 -0
  123. package/dist/extensions/pi-subagents/src/profiles/profiles.ts +8 -8
  124. package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +42 -0
  125. package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +41 -7
  126. package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +294 -134
  127. package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +19 -3
  128. package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +39 -6
  129. package/dist/extensions/pi-subagents/src/runs/background/completion-replay.ts +267 -0
  130. package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +145 -60
  131. package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +114 -6
  132. package/dist/extensions/pi-subagents/src/runs/background/resume-guidance.ts +33 -0
  133. package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +68 -0
  134. package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +71 -0
  135. package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +21 -2
  136. package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +42 -14
  137. package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +12 -24
  138. package/dist/extensions/pi-subagents/src/runs/background/steering.ts +7 -5
  139. package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +152 -68
  140. package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +17 -4
  141. package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +146 -0
  142. package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +21 -5
  143. package/dist/extensions/pi-subagents/src/runs/foreground/async-dismiss-action.ts +85 -0
  144. package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +43 -18
  145. package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +20 -19
  146. package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +3 -0
  147. package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +55 -26
  148. package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +137 -0
  149. package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +798 -112
  150. package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +187 -0
  151. package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +165 -22
  152. package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
  153. package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +2 -0
  154. package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +9 -5
  155. package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +12 -2
  156. package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +1 -0
  157. package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +465 -116
  158. package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +10 -10
  159. package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +189 -32
  160. package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +2 -2
  161. package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +3 -3
  162. package/dist/extensions/pi-subagents/src/shared/artifacts.ts +128 -3
  163. package/dist/extensions/pi-subagents/src/shared/display-text.ts +100 -0
  164. package/dist/extensions/pi-subagents/src/shared/file-coalescer.ts +9 -0
  165. package/dist/extensions/pi-subagents/src/shared/fork-context.ts +13 -0
  166. package/dist/extensions/pi-subagents/src/shared/formatters.ts +4 -6
  167. package/dist/extensions/pi-subagents/src/shared/prompt-resources.ts +51 -0
  168. package/dist/extensions/pi-subagents/src/shared/settings.ts +41 -11
  169. package/dist/extensions/pi-subagents/src/shared/types.ts +100 -3
  170. package/dist/extensions/pi-subagents/src/shared/utf8.ts +11 -0
  171. package/dist/extensions/pi-subagents/src/shared/utils.ts +43 -33
  172. package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +1 -14
  173. package/dist/extensions/pi-subagents/src/slash/inline-subagents.ts +1 -1
  174. package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +14 -12
  175. package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +176 -21
  176. package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +12 -6
  177. package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +52 -18
  178. package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +36 -5
  179. package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +30 -16
  180. package/dist/extensions/pi-subagents/src/tui/fleet.ts +151 -31
  181. package/dist/extensions/pi-subagents/src/tui/render.ts +201 -68
  182. package/dist/extensions/pi-subagents/src/types/pi-runtime-compat.d.ts +0 -6
  183. package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +5 -4
  184. package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +0 -1
  185. package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +313 -25
  186. package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +15 -15
  187. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +3 -0
  188. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +2 -0
  189. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +17 -0
  190. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +57 -0
  191. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +16 -0
  192. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +15 -0
  193. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +18 -0
  194. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +9 -0
  195. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +10 -0
  196. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +10 -0
  197. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +20 -0
  198. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +3 -0
  199. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +96 -0
  200. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +119 -0
  201. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +85 -0
  202. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +620 -0
  203. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +5 -0
  204. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +56 -0
  205. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +32 -0
  206. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +49 -0
  207. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +93 -0
  208. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +128 -0
  209. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +7 -0
  210. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +38 -0
  211. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +3 -0
  212. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +15 -0
  213. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +9 -0
  214. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +29 -0
  215. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +2 -0
  216. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +22 -0
  217. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +37 -0
  218. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +34 -0
  219. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +12 -0
  220. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +23 -0
  221. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +171 -0
  222. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +1261 -0
  223. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +20 -0
  224. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +54 -0
  225. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +22 -0
  226. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +13 -0
  227. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +358 -0
  228. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +77 -0
  229. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +512 -0
  230. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +43 -0
  231. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +121 -0
  232. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +82 -0
  233. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +17 -0
  234. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +7 -0
  235. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +210 -0
  236. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +15 -0
  237. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +54 -0
  238. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +4 -0
  239. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +55 -0
  240. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +2 -0
  241. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +5 -0
  242. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +30 -0
  243. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +206 -0
  244. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +15 -0
  245. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +106 -0
  246. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +19 -0
  247. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +356 -0
  248. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +297 -0
  249. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +60 -0
  250. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +15 -0
  251. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +18 -0
  252. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +28 -0
  253. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +3 -0
  254. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +10 -0
  255. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +68 -0
  256. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +106 -0
  257. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +51 -0
  258. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +6 -0
  259. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +35 -0
  260. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +37 -0
  261. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +40 -0
  262. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +37 -0
  263. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +52 -0
  264. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +10 -0
  265. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +35 -0
  266. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +24 -0
  267. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  268. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +70 -0
  269. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +26 -0
  270. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +36 -0
  271. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +19 -0
  272. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +3 -0
  273. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +61 -0
  274. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +23 -0
  275. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +3 -0
  276. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +10 -0
  277. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +42 -0
  278. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +35 -0
  279. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +12 -0
  280. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +33 -0
  281. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +9 -0
  282. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +34 -0
  283. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +22 -0
  284. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  285. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  286. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  287. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  288. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +102 -0
  289. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  290. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +21 -0
  291. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  292. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +20 -0
  293. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  294. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +12 -0
  295. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  296. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  297. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +22 -0
  298. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +23 -0
  299. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  300. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  301. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +32 -0
  302. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +34 -0
  303. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  304. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  305. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +54 -0
  306. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  307. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
  308. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  309. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +95 -0
  310. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +77 -0
  311. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  312. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  313. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +28 -0
  314. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  315. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
  316. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +63 -0
  317. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  318. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  319. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  320. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +14 -0
  321. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  322. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +394 -0
  323. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +12 -0
  324. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
  325. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +120 -0
  326. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +28 -0
  327. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +17 -0
  328. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +246 -0
  329. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +20 -0
  330. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +457 -0
  331. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +8 -0
  332. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +3 -0
  333. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +2 -0
  334. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +22 -0
  335. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +18 -0
  336. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +11 -0
  337. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +11 -0
  338. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +4 -0
  339. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +4 -0
  340. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +5 -0
  341. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +8 -0
  342. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +5 -0
  343. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +26 -0
  344. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +7 -0
  345. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +10 -0
  346. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +18 -0
  347. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +30 -0
  348. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +2 -0
  349. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +16 -0
  350. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +3 -0
  351. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +3 -0
  352. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +9 -0
  353. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +31 -0
  354. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +21 -0
  355. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +2 -0
  356. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +31 -0
  357. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +5 -0
  358. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +12 -0
  359. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +3 -0
  360. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +15 -0
  361. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +3 -0
  362. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/index.mjs +84 -0
  363. package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/package.json +14 -0
  364. package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +15 -15
  365. package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +411 -300
  366. package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +309 -123
  367. package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +99 -56
  368. package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +62 -16
  369. package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +159 -108
  370. package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +1 -1
  371. package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +4 -2
  372. package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +56 -56
  373. package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +114 -45
  374. package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +57 -19
  375. package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +106 -106
  376. package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +416 -106
  377. package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +287 -17
  378. package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +809 -87
  379. package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +107 -20
  380. package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +9 -9
  381. package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +26 -6
  382. package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +2 -2
  383. package/dist/extensions/pi-subagents/test/support/helpers.ts +2 -0
  384. package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +1 -1
  385. package/dist/extensions/pi-subagents/test/support/ts-loader.mjs +0 -8
  386. package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +163 -58
  387. package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +15 -15
  388. package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +66 -66
  389. package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +334 -248
  390. package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +52 -52
  391. package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +26 -26
  392. package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +99 -99
  393. package/dist/extensions/pi-subagents/test/unit/agent-refinements.test.ts +160 -0
  394. package/dist/extensions/pi-subagents/test/unit/agent-selection.test.ts +9 -9
  395. package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +43 -1
  396. package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +36 -10
  397. package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +387 -30
  398. package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +9 -9
  399. package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +2 -2
  400. package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +94 -40
  401. package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +5 -3
  402. package/dist/extensions/pi-subagents/test/unit/builtin-agent-documentation.test.ts +7 -7
  403. package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +19 -19
  404. package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +19 -19
  405. package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +9 -9
  406. package/dist/extensions/pi-subagents/test/unit/chain-serializer.test.ts +20 -20
  407. package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +9 -9
  408. package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +35 -5
  409. package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +2 -2
  410. package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +52 -52
  411. package/dist/extensions/pi-subagents/test/unit/completion-replay.test.ts +187 -0
  412. package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +125 -71
  413. package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +18 -3
  414. package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +12 -12
  415. package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +17 -23
  416. package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +1 -1
  417. package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +25 -25
  418. package/dist/extensions/pi-subagents/test/unit/extra-agent-dirs.test.ts +3 -3
  419. package/dist/extensions/pi-subagents/test/unit/file-coalescer.test.ts +15 -0
  420. package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +62 -44
  421. package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +329 -37
  422. package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +4 -4
  423. package/dist/extensions/pi-subagents/test/unit/foreground-tool-call-compaction.test.ts +37 -0
  424. package/dist/extensions/pi-subagents/test/unit/herdr-inspector-bootstrap.test.ts +69 -0
  425. package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +79 -2
  426. package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +102 -49
  427. package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +98 -32
  428. package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +5 -5
  429. package/dist/extensions/pi-subagents/test/unit/mission-goal-driver.test.ts +116 -0
  430. package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +55 -7
  431. package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +289 -13
  432. package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +28 -1
  433. package/dist/extensions/pi-subagents/test/unit/model-scope-settings.test.ts +2 -2
  434. package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +11 -2
  435. package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +84 -10
  436. package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +122 -8
  437. package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +8 -8
  438. package/dist/extensions/pi-subagents/test/unit/notify.test.ts +24 -24
  439. package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +16 -2
  440. package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +7 -7
  441. package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +10 -10
  442. package/dist/extensions/pi-subagents/test/unit/path-handling.test.ts +3 -3
  443. package/dist/extensions/pi-subagents/test/unit/path-resolution.test.ts +26 -17
  444. package/dist/extensions/pi-subagents/test/unit/pi-args-permission-system.test.ts +405 -0
  445. package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +357 -92
  446. package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +22 -6
  447. package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +6 -6
  448. package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +43 -43
  449. package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +13 -13
  450. package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +4 -4
  451. package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +19 -19
  452. package/dist/extensions/pi-subagents/test/unit/project-panes-public-api.test.ts +243 -0
  453. package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +68 -168
  454. package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +58 -15
  455. package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +40 -0
  456. package/dist/extensions/pi-subagents/test/unit/reads-resolution.test.ts +66 -0
  457. package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +47 -28
  458. package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +12 -12
  459. package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +57 -0
  460. package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +107 -27
  461. package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +1 -1
  462. package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +56 -50
  463. package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +69 -28
  464. package/dist/extensions/pi-subagents/test/unit/scheduled-store-root.test.ts +67 -0
  465. package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +59 -44
  466. package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +424 -49
  467. package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +23 -1
  468. package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +32 -5
  469. package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +13 -13
  470. package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +120 -91
  471. package/dist/extensions/pi-subagents/test/unit/steering.test.ts +2 -2
  472. package/dist/extensions/pi-subagents/test/unit/subagent-action-recovery.test.ts +85 -0
  473. package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +35 -35
  474. package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +24 -0
  475. package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +312 -22
  476. package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +150 -15
  477. package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +26 -26
  478. package/dist/extensions/pi-subagents/test/unit/timeout-defaults.test.ts +73 -0
  479. package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +76 -25
  480. package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +5 -5
  481. package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +55 -6
  482. package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +13 -13
  483. package/dist/extensions/pi-subagents/test/unit/watchdog-lsp-diagnostics.test.ts +1 -1
  484. package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +1 -1
  485. package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +8 -8
  486. package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +6 -6
  487. package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +138 -11
  488. package/dist/extensions/pi-subagents/test/unit/workflow-graph.test.ts +8 -8
  489. package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +113 -0
  490. package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +7 -7
  491. package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +6 -6
  492. package/dist/extensions/workflow/extension.ts +21 -19
  493. package/dist/extensions/workflow/modes.ts +65 -0
  494. package/dist/index.d.ts +1 -1
  495. package/dist/main.js +1 -0
  496. package/dist/modes/interactive/components/settings-selector.d.ts +6 -2
  497. package/dist/modes/interactive/components/settings-selector.js +20 -0
  498. package/dist/modes/interactive/interactive-mode.d.ts +28 -0
  499. package/dist/modes/interactive/interactive-mode.js +214 -28
  500. package/dist/modes/interactive/theme/dark.json +1 -0
  501. package/dist/modes/interactive/theme/light.json +1 -0
  502. package/dist/modes/interactive/theme/theme-controller.d.ts +3 -0
  503. package/dist/modes/interactive/theme/theme-controller.js +10 -1
  504. package/dist/modes/interactive/theme/theme.d.ts +2 -2
  505. package/dist/modes/interactive/theme/theme.js +24 -6
  506. package/dist/skills/pi-subagents/SKILL.md +20 -15
  507. package/dist/skills/pi-subagents/references/constraints-and-recipes.md +77 -83
  508. package/dist/skills/pi-subagents/references/execution-controls.md +215 -106
  509. package/dist/skills/pi-subagents/references/management-authoring-rpc.md +29 -9
  510. package/dist/skills/pi-subagents/references/prompting-and-roles.md +58 -43
  511. package/docs/keybindings.md +35 -7
  512. package/docs/plans/workflow-autoloop-reference.md +192 -0
  513. package/docs/plans/workflow-subagent-consolidation-planb.md +374 -0
  514. package/docs/plans/workflow-subagent-scripted-merge.md +406 -0
  515. package/docs/settings.md +16 -14
  516. package/docs/usage.md +5 -0
  517. package/package.json +5 -5
  518. package/dist/extensions/pi-powerline-footer/fixed-editor/cluster.ts +0 -113
  519. package/dist/extensions/pi-powerline-footer/fixed-editor/terminal-split.ts +0 -1080
  520. package/dist/extensions/pi-powerline-footer/tests/fixed-editor.test.ts +0 -1452
  521. package/dist/extensions/workflow/adapter.ts +0 -949
  522. package/dist/extensions/workflow/modes/loop.ts +0 -74
  523. package/dist/extensions/workflow/modes/prototype.ts +0 -170
  524. package/dist/extensions/workflow/modes/quicktype.ts +0 -150
  525. package/dist/extensions/workflow/modes/task.ts +0 -105
  526. package/dist/extensions/workflow/run-state.ts +0 -124
  527. package/dist/extensions/workflow/state-machine.ts +0 -484
  528. package/dist/extensions/workflow/validators.ts +0 -42
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-powerline-footer",
3
- "version": "0.12.3",
3
+ "version": "0.13.0",
4
4
  "description": "Powerline-style status bar extension for pi coding agent",
5
5
  "type": "module",
6
6
  "files": [
@@ -9,7 +9,6 @@
9
9
  "*.json",
10
10
  "!progress.md",
11
11
  "bash-mode/**/*.ts",
12
- "fixed-editor/**/*.ts",
13
12
  "queue/**/*.ts"
14
13
  ],
15
14
  "keywords": [
@@ -31,14 +30,14 @@
31
30
  "test": "node --experimental-strip-types --test tests/**/*.test.ts"
32
31
  },
33
32
  "peerDependencies": {
34
- "@earendil-works/pi-ai": ">=0.81.0 <0.84.0",
33
+ "@earendil-works/pi-ai": ">=0.84.1 <0.85.0",
35
34
  "@selesai/code": "*",
36
- "@earendil-works/pi-tui": ">=0.81.0 <0.84.0"
35
+ "@earendil-works/pi-tui": ">=0.84.1 <0.85.0"
37
36
  },
38
37
  "devDependencies": {
39
- "@earendil-works/pi-ai": "^0.83.0",
38
+ "@earendil-works/pi-ai": "^0.84.1",
40
39
  "@selesai/code": "^0.1.0",
41
- "@earendil-works/pi-tui": "^0.83.0",
40
+ "@earendil-works/pi-tui": "^0.84.1",
42
41
  "@types/node": "24.13.3",
43
42
  "typescript": "5.9.3"
44
43
  },
@@ -6,8 +6,6 @@ import type { ColorValue, CustomItemPosition, CustomStatusItem, PowerlinePlaceme
6
6
  export interface PowerlineConfig {
7
7
  preset: StatusLinePreset;
8
8
  customItems: CustomStatusItem[];
9
- mouseScroll: boolean;
10
- fixedEditor: boolean;
11
9
  fixedEditorPromptGlyph: string;
12
10
  disabledSegments: StatusLineSegmentId[];
13
11
  invalidDisabledSegments: string[];
@@ -19,7 +17,6 @@ export interface PowerlineConfig {
19
17
  invalidPlacement: string | null;
20
18
  welcome: boolean;
21
19
  stashSharpSShortcut: boolean;
22
- queue: { captureSigil: string | false };
23
20
  }
24
21
 
25
22
  function isRecord(value: unknown): value is Record<string, unknown> {
@@ -91,12 +88,6 @@ function normalizeCustomPrefix(value: unknown): string | undefined {
91
88
  return normalized ? normalized : undefined;
92
89
  }
93
90
 
94
- function normalizeCaptureSigil(value: unknown): string | false {
95
- if (value === false) return false;
96
- if (typeof value !== "string") return "#";
97
- const normalized = value.trim();
98
- return normalized && !/\s/.test(normalized) ? normalized : "#";
99
- }
100
91
 
101
92
  function normalizeCustomStatusItem(raw: unknown, idOverride?: string): CustomStatusItem | null {
102
93
  if (!isRecord(raw)) return null;
@@ -305,8 +296,6 @@ export function parsePowerlineConfig(value: unknown, presets: readonly StatusLin
305
296
  const defaultConfig: PowerlineConfig = {
306
297
  preset: "default",
307
298
  customItems: [],
308
- mouseScroll: true,
309
- fixedEditor: true,
310
299
  fixedEditorPromptGlyph: "",
311
300
  disabledSegments: [],
312
301
  invalidDisabledSegments: [],
@@ -318,7 +307,6 @@ export function parsePowerlineConfig(value: unknown, presets: readonly StatusLin
318
307
  invalidPlacement: null,
319
308
  welcome: true,
320
309
  stashSharpSShortcut: false,
321
- queue: { captureSigil: "#" },
322
310
  };
323
311
 
324
312
  const directPreset = normalizePreset(value, presets);
@@ -330,15 +318,10 @@ export function parsePowerlineConfig(value: unknown, presets: readonly StatusLin
330
318
  const { disabledSegments, invalidDisabledSegments } = normalizeDisabledSegments(value.disabledSegments, customItems);
331
319
  const { layout, invalidLayoutSegments } = normalizeLayout(value.layout, customItems);
332
320
  const { placement, invalidPlacement } = normalizePlacement(value.placement);
333
- const queue = isRecord(value.queue)
334
- ? { captureSigil: normalizeCaptureSigil(value.queue.captureSigil) }
335
- : defaultConfig.queue;
336
321
 
337
322
  return {
338
323
  preset: normalizePreset(value.preset, presets) ?? defaultConfig.preset,
339
324
  customItems,
340
- mouseScroll: value.mouseScroll !== false,
341
- fixedEditor: value.fixedEditor !== false,
342
325
  fixedEditorPromptGlyph: typeof value.fixedEditorPromptGlyph === "string" ? value.fixedEditorPromptGlyph : defaultConfig.fixedEditorPromptGlyph,
343
326
  disabledSegments,
344
327
  invalidDisabledSegments,
@@ -350,7 +333,6 @@ export function parsePowerlineConfig(value: unknown, presets: readonly StatusLin
350
333
  invalidPlacement,
351
334
  welcome: value.welcome !== false,
352
335
  stashSharpSShortcut: value.stashSharpSShortcut === true,
353
- queue,
354
336
  };
355
337
  }
356
338
 
@@ -46,7 +46,7 @@ function normalizeTarget(value: unknown): QueueTarget | null {
46
46
  }
47
47
 
48
48
  function normalizeIntent(value: unknown): QueueIntent | null {
49
- return value === "steer" || value === "follow-up" || value === "post-compact" || value === "idea"
49
+ return value === "steer" || value === "follow-up" || value === "post-compact"
50
50
  ? value
51
51
  : null;
52
52
  }
@@ -189,23 +189,18 @@ export class PowerlineQueueStore {
189
189
  }
190
190
 
191
191
  queuedDeliveryItems(context: QueueContext, intent?: QueueIntent): PowerlineQueueItem[] {
192
- return this.activeItems(context).filter((item) => {
193
- if (item.status !== "queued") return false;
194
- if (item.intent === "idea") return false;
195
- return intent ? item.intent === intent : true;
196
- });
192
+ return this.activeItems(context).filter((item) => (
193
+ item.status === "queued" && (intent ? item.intent === intent : true)
194
+ ));
197
195
  }
198
196
 
199
197
  summarize(context: QueueContext, compacting: boolean): QueueSummary {
200
- const active = this.activeItems(context);
201
- const queueItems = active.filter((item) => item.intent !== "idea");
202
- const ideaItems = active.filter((item) => item.intent === "idea");
203
- const blockedItems = active.filter((item) => item.status === "blocked" || item.status === "failed");
204
- const leading = [...blockedItems, ...queueItems, ...ideaItems][0] ?? null;
198
+ const queueItems = this.activeItems(context);
199
+ const blockedItems = queueItems.filter((item) => item.status === "blocked" || item.status === "failed");
200
+ const leading = [...blockedItems, ...queueItems][0] ?? null;
205
201
 
206
202
  return {
207
203
  queueCount: queueItems.length,
208
- ideaCount: ideaItems.length,
209
204
  blockedCount: blockedItems.length,
210
205
  compacting,
211
206
  leadingText: leading?.text ?? null,
@@ -304,51 +299,8 @@ export function isActiveForContext(item: PowerlineQueueItem, context: QueueConte
304
299
  return item.source.cwd === currentCwd;
305
300
  }
306
301
 
307
- export function targetForIdea(rawTarget: string | null, store: PowerlineQueueStore, cwd: string): QueueTarget {
308
- if (!rawTarget) return { kind: "project", cwd: normalizeCwd(cwd) };
309
- if (rawTarget === "current") return { kind: "current-session" };
310
- if (rawTarget === "global") return { kind: "global" };
311
-
312
- const aliasCwd = store.resolveAlias(rawTarget);
313
- if (!aliasCwd) {
314
- throw new Error(`Unknown project alias @${rawTarget}. Use /queue alias ${rawTarget} <path> first.`);
315
- }
316
- return { kind: "project", cwd: aliasCwd, alias: rawTarget };
317
- }
318
-
319
- export function parseTargetPrefix(text: string): { target: string | null; text: string } {
320
- const trimmed = text.trim();
321
- const match = /^@([a-zA-Z0-9_-]+)(?:\s+|$)/.exec(trimmed);
322
- if (!match) return { target: null, text: trimmed };
323
- return { target: match[1], text: trimmed.slice(match[0].length).trim() };
324
- }
325
-
326
- export function parseSigilIdeaCapture(text: string, sigil: string | false): { target: string | null; text: string } | null {
327
- if (sigil === false) return null;
328
- const normalizedSigil = sigil.trim();
329
- if (!normalizedSigil) return null;
330
-
331
- const trimmed = text.trim();
332
- if (!trimmed.startsWith(normalizedSigil)) return null;
333
-
334
- const afterSigil = trimmed.slice(normalizedSigil.length);
335
- if (!/^\s/.test(afterSigil)) return null;
336
-
337
- const parsed = parseTargetPrefix(afterSigil.trim());
338
- return parsed.text ? parsed : null;
339
- }
340
-
341
302
  export function formatQueueDeliveryText(item: PowerlineQueueItem): string {
342
- if (item.intent !== "idea") return item.text;
343
- return `[powerline idea ${item.id}, captured ${new Date(item.createdAt).toISOString()} from ${item.source.cwd}]\n${item.text}`;
344
- }
345
-
346
- export function formatIdeaIssuePrompt(item: PowerlineQueueItem): string {
347
- const target = item.target.kind === "project"
348
- ? `project ${item.target.alias ? `@${item.target.alias} ` : ""}${item.target.cwd}`
349
- : item.target.kind;
350
-
351
- return `Please process this saved Powerline idea as a GitHub issue candidate.\n\n${formatQueueDeliveryText(item)}\n\nIssue filing rules:\n- If subagents are available, spawn one low-budget issue-filing lane for this idea; otherwise do the same checks directly.\n- First identify the target repository from the idea target (${target}), source cwd (${item.source.cwd}), and current session context.\n- If the target repository is unclear or is not owned/controlled by the user, ask before filing anything.\n- If the target repository is clear and owned/controlled by the user, dedupe against existing open issues first.\n- If a matching open issue already exists, report it and do not create another issue.\n- If no matching issue exists, create one self-contained GitHub issue in that repository with a clear title, context, acceptance criteria, and the Powerline idea provenance above.\n- Use explicit repository targeting for GitHub commands and do not change source files for this handoff.`;
303
+ return item.text;
352
304
  }
353
305
 
354
306
  export function parseCompactQueuedPrompt(text: string): string | null {
@@ -1,4 +1,4 @@
1
- export type QueueIntent = "steer" | "follow-up" | "post-compact" | "idea";
1
+ export type QueueIntent = "steer" | "follow-up" | "post-compact";
2
2
  export type QueueStatus = "queued" | "blocked" | "delivering" | "sent" | "failed";
3
3
 
4
4
  export type QueueTarget =
@@ -29,7 +29,6 @@ export interface QueueAliasMap {
29
29
 
30
30
  export interface QueueSummary {
31
31
  queueCount: number;
32
- ideaCount: number;
33
32
  blockedCount: number;
34
33
  compacting: boolean;
35
34
  leadingText: string | null;
@@ -257,9 +257,6 @@ const queueSegment: StatusLineSegment = {
257
257
  parts.push(`q ${summary.queueCount}`);
258
258
  }
259
259
 
260
- if (summary.ideaCount > 0) {
261
- parts.push(`ideas ${summary.ideaCount}`);
262
- }
263
260
 
264
261
  if (summary.blockedCount > 0) {
265
262
  parts.push(`blocked ${summary.blockedCount}`);
@@ -865,6 +865,9 @@ test("bash editor refreshGhostSuggestion reuses the ghost scheduling path", asyn
865
865
  let scheduled = false;
866
866
 
867
867
  getMethod(BashModeEditor.prototype, "refreshGhostSuggestion").call({
868
+ areCompletionsEnabled() {
869
+ return true;
870
+ },
868
871
  scheduleGhostUpdate() {
869
872
  scheduled = true;
870
873
  },
@@ -876,6 +879,232 @@ test("bash editor refreshGhostSuggestion reuses the ghost scheduling path", asyn
876
879
  }
877
880
  });
878
881
 
882
+ test("bash editor refreshGhostSuggestion clears ghosts when completions are disabled", async () => {
883
+ const links = ensureEditorModuleLinks();
884
+
885
+ try {
886
+ const { BashModeEditor } = await import("../bash-mode/editor.ts");
887
+ let cleared = false;
888
+ let scheduled = false;
889
+
890
+ getMethod(BashModeEditor.prototype, "refreshGhostSuggestion").call({
891
+ areCompletionsEnabled() {
892
+ return false;
893
+ },
894
+ clearGhostSuggestion() {
895
+ cleared = true;
896
+ },
897
+ scheduleGhostUpdate() {
898
+ scheduled = true;
899
+ },
900
+ });
901
+
902
+ assert.equal(cleared, true);
903
+ assert.equal(scheduled, false);
904
+ } finally {
905
+ links.cleanup();
906
+ }
907
+ });
908
+
909
+ test("bash editor hot path avoids full expansion and coalesces ghost work", async () => {
910
+ const links = ensureEditorModuleLinks();
911
+
912
+ try {
913
+ const { BashModeEditor } = await import("../bash-mode/editor.ts");
914
+ const { KeybindingsManager } = await import(new URL("../node_modules/@earendil-works/pi-coding-agent/dist/core/keybindings.js", import.meta.url).href);
915
+ const keybindings = KeybindingsManager.create();
916
+ const resolved: string[] = [];
917
+ let bashModeActive = false;
918
+ const editor = new BashModeEditor(
919
+ { requestRender() {}, terminal: { columns: 80, rows: 24 } },
920
+ { borderColor: (text: string) => text },
921
+ keybindings,
922
+ {
923
+ keybindings,
924
+ isBashModeActive: () => bashModeActive,
925
+ isShellRunning: () => false,
926
+ onExitBashMode() {},
927
+ onSubmitCommand() {},
928
+ onInterrupt() {},
929
+ onNotify() {},
930
+ getHistoryEntries: () => [],
931
+ resolveGhostSuggestion: async (text) => {
932
+ resolved.push(text);
933
+ return null;
934
+ },
935
+ },
936
+ );
937
+
938
+ (editor as { getExpandedText(): string }).getExpandedText = () => {
939
+ throw new Error("expanded text should not be read while typing");
940
+ };
941
+ const insertCharacter = Reflect.get(editor, "insertCharacter").bind(editor);
942
+ let fastInserts = 0;
943
+ Reflect.set(editor, "insertCharacter", (character: string) => {
944
+ fastInserts += 1;
945
+ insertCharacter(character);
946
+ });
947
+
948
+ for (const character of ["a", "A", ".", "漢", "🙂"]) editor.handleInput(character);
949
+ assert.equal(editor.getText(), "aA.漢🙂");
950
+ assert.equal(fastInserts, 5);
951
+ editor.onExtensionShortcut = (data) => data === "b";
952
+ editor.handleInput("b");
953
+ assert.equal(editor.getText(), "aA.漢🙂");
954
+ assert.equal(fastInserts, 5);
955
+ editor.onExtensionShortcut = undefined;
956
+ editor.render(80);
957
+
958
+ bashModeActive = true;
959
+ editor.setText("");
960
+ editor.handleInput("g");
961
+ editor.handleInput("i");
962
+ editor.handleInput("t");
963
+ assert.deepEqual(resolved, []);
964
+ await new Promise((resolve) => setTimeout(resolve, 75));
965
+ assert.deepEqual(resolved, ["git"]);
966
+ editor.clearGhostSuggestion();
967
+
968
+ } finally {
969
+ links.cleanup();
970
+ }
971
+ });
972
+
973
+ test("bash editor long ASCII backspace keeps undo without scanning the full line", async () => {
974
+ const links = ensureEditorModuleLinks();
975
+
976
+ try {
977
+ const { BashModeEditor } = await import("../bash-mode/editor.ts");
978
+ const { KeybindingsManager } = await import(new URL("../node_modules/@earendil-works/pi-coding-agent/dist/core/keybindings.js", import.meta.url).href);
979
+ const keybindings = KeybindingsManager.create();
980
+ const editor = new BashModeEditor(
981
+ { requestRender() {}, terminal: { columns: 80, rows: 24 } },
982
+ { borderColor: (text: string) => text },
983
+ keybindings,
984
+ {
985
+ keybindings,
986
+ isBashModeActive: () => false,
987
+ isShellRunning: () => false,
988
+ onExitBashMode() {},
989
+ onSubmitCommand() {},
990
+ onInterrupt() {},
991
+ onNotify() {},
992
+ getHistoryEntries: () => [],
993
+ resolveGhostSuggestion: async () => null,
994
+ },
995
+ );
996
+ const original = "x".repeat(5000);
997
+ editor.setText(original);
998
+ Reflect.get(editor, "undoStack").clear();
999
+ const segment = Reflect.get(editor, "segment").bind(editor);
1000
+ Reflect.set(editor, "segment", () => {
1001
+ throw new Error("long ASCII backspace must not segment the full line");
1002
+ });
1003
+
1004
+ editor.handleInput("\x7f");
1005
+ assert.equal(editor.getText(), original.slice(0, -1));
1006
+
1007
+ editor.handleInput("\x1b[122;9u");
1008
+ assert.equal(editor.getText(), original);
1009
+
1010
+ Reflect.set(editor, "segment", segment);
1011
+ editor.setText(`${"x".repeat(4998)}\u0600a`);
1012
+ editor.handleInput("\x7f");
1013
+ assert.equal(editor.getText(), "x".repeat(4998));
1014
+ } finally {
1015
+ links.cleanup();
1016
+ }
1017
+ });
1018
+
1019
+ test("bash editor long ASCII backspace preserves custom app bindings by input sequence", async () => {
1020
+ const links = ensureEditorModuleLinks();
1021
+
1022
+ try {
1023
+ const { BashModeEditor } = await import("../bash-mode/editor.ts");
1024
+ const { KeybindingsManager } = await import(new URL("../node_modules/@earendil-works/pi-coding-agent/dist/core/keybindings.js", import.meta.url).href);
1025
+ const keybindings = new KeybindingsManager({ "app.clear": "ctrl+h" });
1026
+ const editor = new BashModeEditor(
1027
+ { requestRender() {}, terminal: { columns: 80, rows: 24 } },
1028
+ { borderColor: (text: string) => text },
1029
+ keybindings,
1030
+ {
1031
+ keybindings,
1032
+ isBashModeActive: () => false,
1033
+ isShellRunning: () => false,
1034
+ onExitBashMode() {},
1035
+ onSubmitCommand() {},
1036
+ onInterrupt() {},
1037
+ onNotify() {},
1038
+ getHistoryEntries: () => [],
1039
+ resolveGhostSuggestion: async () => null,
1040
+ },
1041
+ );
1042
+ let cleared = false;
1043
+ editor.onAction("app.clear", () => {
1044
+ cleared = true;
1045
+ });
1046
+ const original = "x".repeat(5000);
1047
+ editor.setText(original);
1048
+
1049
+ editor.handleInput("\x7f");
1050
+ assert.equal(editor.getText(), original.slice(0, -1));
1051
+ assert.equal(cleared, false);
1052
+
1053
+ editor.handleInput("\x08");
1054
+ assert.equal(cleared, true);
1055
+ assert.equal(editor.getText(), original.slice(0, -1));
1056
+ } finally {
1057
+ links.cleanup();
1058
+ }
1059
+ });
1060
+
1061
+ test("bash editor fast path preserves plain custom keybindings", async () => {
1062
+ const links = ensureEditorModuleLinks();
1063
+
1064
+ try {
1065
+ const { BashModeEditor } = await import("../bash-mode/editor.ts");
1066
+ const { KeybindingsManager } = await import(new URL("../node_modules/@earendil-works/pi-coding-agent/dist/core/keybindings.js", import.meta.url).href);
1067
+ const { getKeybindings, setKeybindings } = await import(new URL("../node_modules/@earendil-works/pi-tui/dist/index.js", import.meta.url).href);
1068
+ const previousKeybindings = getKeybindings();
1069
+ const keybindings = new KeybindingsManager({ "tui.editor.cursorLeft": "a" });
1070
+
1071
+ try {
1072
+ setKeybindings(keybindings);
1073
+ const editor = new BashModeEditor(
1074
+ { requestRender() {}, terminal: { columns: 80, rows: 24 } },
1075
+ { borderColor: (text: string) => text },
1076
+ keybindings,
1077
+ {
1078
+ keybindings,
1079
+ isBashModeActive: () => false,
1080
+ isShellRunning: () => false,
1081
+ onExitBashMode() {},
1082
+ onSubmitCommand() {},
1083
+ onInterrupt() {},
1084
+ onNotify() {},
1085
+ getHistoryEntries: () => [],
1086
+ resolveGhostSuggestion: async () => null,
1087
+ },
1088
+ );
1089
+
1090
+ editor.setText("x");
1091
+ editor.handleInput("a");
1092
+ assert.equal(editor.getText(), "x");
1093
+ assert.deepEqual(editor.getCursor(), { line: 0, col: 0 });
1094
+
1095
+ keybindings.setUserBindings({ "tui.editor.cursorLeft": "shift+a" });
1096
+ Reflect.set(editor, "plainBoundInputs", null);
1097
+ editor.handleInput("A");
1098
+ assert.equal(editor.getText(), "x");
1099
+ assert.deepEqual(editor.getCursor(), { line: 0, col: 0 });
1100
+ } finally {
1101
+ setKeybindings(previousKeybindings);
1102
+ }
1103
+ } finally {
1104
+ links.cleanup();
1105
+ }
1106
+ });
1107
+
879
1108
  test("bash editor dismiss clears autocomplete when mode turns off", async () => {
880
1109
  const links = ensureEditorModuleLinks();
881
1110
 
@@ -1332,6 +1561,7 @@ test("bash editor command-z resets shell history and updates ghost state", async
1332
1561
  Reflect.set(shellEditor, "shellHistoryItems", ["git status"]);
1333
1562
  Reflect.set(shellEditor, "shellHistoryDraft", "git");
1334
1563
  shellEditor.handleInput("\x1b[122;9u");
1564
+ await new Promise((resolve) => setTimeout(resolve, 75));
1335
1565
 
1336
1566
  assert.equal(shellEditor.getText(), "a");
1337
1567
  assert.equal(Reflect.get(shellEditor, "shellHistoryIndex"), -1);
@@ -1602,7 +1832,7 @@ test("bash editor does not accept a hidden ghost suggestion when the cursor is n
1602
1832
  const { BashModeEditor } = await import("../bash-mode/editor.ts");
1603
1833
  const accepted = getMethod(BashModeEditor.prototype, "acceptGhostSuggestion").call({
1604
1834
  ghost: { value: "git status", source: "project-history" },
1605
- getExpandedText() {
1835
+ getText() {
1606
1836
  return "git st";
1607
1837
  },
1608
1838
  getCursor() {
@@ -35,7 +35,6 @@ test("parsePowerlineConfig supports object config with custom items", () => {
35
35
  assert.equal(config.invalidPlacement, null);
36
36
  assert.equal(config.welcome, true);
37
37
  assert.equal(config.stashSharpSShortcut, false);
38
- assert.deepEqual(config.queue, { captureSigil: "#" });
39
38
  });
40
39
 
41
40
  test("parsePowerlineConfig supports disabled segments", () => {
@@ -156,31 +155,18 @@ test("parsePowerlineConfig validates primary powerline placement", () => {
156
155
 
157
156
 
158
157
 
159
- test("parsePowerlineConfig supports welcome, legacy sharp-S, and queue capture settings", () => {
160
- const disabled = parsePowerlineConfig(
161
- { preset: "compact", welcome: false, stashSharpSShortcut: true, queue: { captureSigil: false } },
162
- ["default", "compact"],
163
- );
164
- const customSigil = parsePowerlineConfig(
165
- { preset: "compact", queue: { captureSigil: "//" } },
166
- ["default", "compact"],
167
- );
168
- const invalidSigil = parsePowerlineConfig(
169
- { preset: "compact", queue: { captureSigil: "# note" } },
158
+ test("parsePowerlineConfig supports welcome and legacy sharp-S settings", () => {
159
+ const config = parsePowerlineConfig(
160
+ { preset: "compact", welcome: false, stashSharpSShortcut: true },
170
161
  ["default", "compact"],
171
162
  );
172
163
  const shorthand = parsePowerlineConfig("compact", ["default", "compact"]);
173
164
 
174
- assert.equal(disabled.welcome, false);
175
- assert.equal(disabled.stashSharpSShortcut, true);
176
- assert.deepEqual(disabled.queue, { captureSigil: false });
177
- assert.deepEqual(customSigil.queue, { captureSigil: "//" });
178
- assert.deepEqual(invalidSigil.queue, { captureSigil: "#" });
165
+ assert.equal(config.welcome, false);
166
+ assert.equal(config.stashSharpSShortcut, true);
179
167
  assert.equal(shorthand.welcome, true);
180
168
  assert.equal(shorthand.stashSharpSShortcut, false);
181
- assert.deepEqual(shorthand.queue, { captureSigil: "#" });
182
169
  });
183
-
184
170
  test("parsePowerlineConfig extracts supported segment options", () => {
185
171
  const config = parsePowerlineConfig(
186
172
  {
@@ -0,0 +1,43 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { EditorPerfProfiler, readEditorPerfOptions } from "../editor-performance.ts";
4
+
5
+ test("editor profiling and A/B switches are opt-in", () => {
6
+ assert.deepEqual(readEditorPerfOptions({}), {
7
+ enabled: false,
8
+ fastRender: true,
9
+ editorChrome: true,
10
+ widgets: true,
11
+ bashWidgets: true,
12
+ lastPrompt: true,
13
+ });
14
+
15
+ assert.deepEqual(readEditorPerfOptions({
16
+ POWERLINE_DEBUG_PERF: "1",
17
+ POWERLINE_PERF_FAST_RENDER: "0",
18
+ POWERLINE_PERF_EDITOR_CHROME: "0",
19
+ POWERLINE_PERF_WIDGETS: "0",
20
+ POWERLINE_PERF_BASH_WIDGETS: "0",
21
+ POWERLINE_PERF_LAST_PROMPT: "0",
22
+ }), {
23
+ enabled: true,
24
+ fastRender: false,
25
+ editorChrome: false,
26
+ widgets: false,
27
+ bashWidgets: false,
28
+ lastPrompt: false,
29
+ });
30
+ });
31
+
32
+ test("editor profiler reports timings, counts, and draft size", () => {
33
+ const profiler = new EditorPerfProfiler(readEditorPerfOptions({ POWERLINE_DEBUG_PERF: "1" }));
34
+
35
+ profiler.measure("input.total", () => 42);
36
+ profiler.count("editor.render.fast-hit");
37
+ profiler.observeDraft(["hello", "world"]);
38
+
39
+ const report = profiler.report();
40
+ assert.match(report, /inputs=1, editor-renders=0, renders\/input=0\.00, max-draft=11/);
41
+ assert.match(report, /editor\.render\.fast-hit: n=1/);
42
+ assert.match(report, /input\.total: n=1, avg=/);
43
+ });
@@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest";
2
2
  import { initTheme, theme } from "../../../modes/interactive/theme/theme.ts";
3
3
 
4
4
  /**
5
- * The powerline fixed-editor render draws its own border. It must respect the
5
+ * The powerline editor render draws its own border. It must respect the
6
6
  * editor's `borderColor` (set by interactive-mode to the bash-mode / thinking
7
7
  * color) instead of always using the gray "sep" color, so typing `!` visibly
8
8
  * switches the input field to bash mode.
@@ -13,7 +13,7 @@ function powerlineBorderColor(editor: { borderColor: unknown }, s: string): stri
13
13
  : `\x1b[38;5;244m${s}\x1b[0m`;
14
14
  }
15
15
 
16
- describe("powerline fixed-editor border respects editor.borderColor", () => {
16
+ describe("powerline editor border respects editor.borderColor", () => {
17
17
  it("uses the bash-mode color when interactive-mode sets it (typing !)", () => {
18
18
  initTheme("dark");
19
19
  const editorWithBashBorder = {
@@ -0,0 +1,64 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mkdtempSync, mkdirSync, readFileSync, writeFileSync, existsSync } from "node:fs";
4
+ import { tmpdir } from "node:os";
5
+ import { join } from "node:path";
6
+
7
+ import { readOnlyGitEnv } from "../git-status.ts";
8
+
9
+ const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));
10
+
11
+ // Background fetches spawn git with up to 500ms timeouts; give them room.
12
+ const FETCH_SETTLE_MS = 1200;
13
+
14
+ test("read-only git commands opt out of git's optional index lock", () => {
15
+ const env = readOnlyGitEnv({ PATH: "/usr/bin" });
16
+ assert.equal(env.GIT_OPTIONAL_LOCKS, "0");
17
+ assert.equal(env.PATH, "/usr/bin", "must extend the ambient environment, not replace it");
18
+ });
19
+
20
+ test("readOnlyGitEnv overrides an inherited GIT_OPTIONAL_LOCKS=1", () => {
21
+ assert.equal(readOnlyGitEnv({ GIT_OPTIONAL_LOCKS: "1" }).GIT_OPTIONAL_LOCKS, "0");
22
+ });
23
+
24
+ // Guards the regression end to end, via a `git` shim on PATH: the footer polls
25
+ // every repo the user visits, so it must never take `.git/index.lock`.
26
+ test("the git process the footer spawns receives GIT_OPTIONAL_LOCKS=0", { skip: process.platform === "win32" ? "POSIX shim" : false }, async () => {
27
+ const dir = mkdtempSync(join(tmpdir(), "powerline-git-locks-"));
28
+ const bin = join(dir, "bin");
29
+ mkdirSync(bin);
30
+ const log = join(dir, "calls.log");
31
+
32
+ writeFileSync(
33
+ join(bin, "git"),
34
+ `#!/bin/sh\necho "GIT_OPTIONAL_LOCKS=\${GIT_OPTIONAL_LOCKS-unset} ARGS=$*" >> ${JSON.stringify(log)}\nexit 0\n`,
35
+ { mode: 0o755 },
36
+ );
37
+
38
+ const originalPath = process.env.PATH;
39
+ const originalOptionalLocks = process.env.GIT_OPTIONAL_LOCKS;
40
+ process.env.PATH = `${bin}:${originalPath ?? ""}`;
41
+ // Some environments export GIT_OPTIONAL_LOCKS=0 as a machine-wide workaround
42
+ // for this bug; force the opposite so we can't inherit a false pass.
43
+ process.env.GIT_OPTIONAL_LOCKS = "1";
44
+ try {
45
+ // Imported here so the module reads the shimmed PATH when it spawns.
46
+ const { getGitStatus, invalidateGitStatus, invalidateGitBranch } = await import("../git-status.ts");
47
+ invalidateGitStatus();
48
+ invalidateGitBranch();
49
+ getGitStatus("main");
50
+ await sleep(FETCH_SETTLE_MS);
51
+ } finally {
52
+ process.env.PATH = originalPath;
53
+ if (originalOptionalLocks === undefined) delete process.env.GIT_OPTIONAL_LOCKS;
54
+ else process.env.GIT_OPTIONAL_LOCKS = originalOptionalLocks;
55
+ }
56
+
57
+ assert.ok(existsSync(log), "expected the footer to spawn git");
58
+ const calls = readFileSync(log, "utf8").trim().split("\n");
59
+ const status = calls.filter((line) => line.includes("ARGS=status --porcelain"));
60
+ assert.ok(status.length > 0, `expected a status call, got:\n${calls.join("\n")}`);
61
+ for (const call of calls) {
62
+ assert.match(call, /GIT_OPTIONAL_LOCKS=0/, `git spawned without the lock opt-out: ${call}`);
63
+ }
64
+ });
@@ -36,7 +36,7 @@ test("guide dismissal and compact preferences change automatic display", () => {
36
36
  assert.equal(resolveGuideDisplayMode({ reason: "startup", hasUI: false, guideMode: "full" }), "none");
37
37
  });
38
38
 
39
- test("guide defaults to a compact header so fixed-editor mode stays active", () => {
39
+ test("guide defaults to a compact header so the native dock stays uncluttered", () => {
40
40
  const preferences = getGuidePreferences({});
41
41
  assert.equal(preferences.mode, "compact");
42
42
  assert.equal(resolveGuideDisplayMode({ reason: "startup", hasUI: true, guideMode: preferences.mode }), "compact");