@bastani/atomic 0.9.13 → 0.9.14-alpha.2

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 (762) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +3 -3
  3. package/dist/builtin/intercom/package.json +2 -2
  4. package/dist/builtin/mcp/package.json +3 -3
  5. package/dist/builtin/subagents/CHANGELOG.md +14 -0
  6. package/dist/builtin/subagents/README.md +6 -4
  7. package/dist/builtin/subagents/agents/code-simplifier.md +1 -1
  8. package/dist/builtin/subagents/agents/codebase-analyzer.md +1 -1
  9. package/dist/builtin/subagents/agents/codebase-locator.md +1 -1
  10. package/dist/builtin/subagents/agents/codebase-online-researcher.md +1 -1
  11. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +1 -1
  12. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +1 -1
  13. package/dist/builtin/subagents/agents/codebase-research-locator.md +1 -1
  14. package/dist/builtin/subagents/agents/debugger.md +1 -1
  15. package/dist/builtin/subagents/agents/worker.md +1 -1
  16. package/dist/builtin/subagents/package.json +6 -5
  17. package/dist/builtin/subagents/src/agents/agent-discovery.ts +17 -11
  18. package/dist/builtin/subagents/src/agents/agent-loaders.ts +115 -43
  19. package/dist/builtin/subagents/src/agents/agent-management-helpers.ts +10 -8
  20. package/dist/builtin/subagents/src/agents/agent-management.ts +8 -7
  21. package/dist/builtin/subagents/src/agents/agent-overrides.ts +2 -2
  22. package/dist/builtin/subagents/src/agents/agent-scope.ts +1 -1
  23. package/dist/builtin/subagents/src/agents/agent-selection.ts +1 -1
  24. package/dist/builtin/subagents/src/agents/agent-serializer.ts +24 -3
  25. package/dist/builtin/subagents/src/agents/agent-types.ts +3 -1
  26. package/dist/builtin/subagents/src/agents/agents.ts +7 -5
  27. package/dist/builtin/subagents/src/agents/frontmatter.ts +67 -22
  28. package/dist/builtin/subagents/src/agents/identity.ts +1 -1
  29. package/dist/builtin/subagents/src/agents/skills-paths.ts +1 -1
  30. package/dist/builtin/subagents/src/agents/skills.ts +64 -6
  31. package/dist/builtin/subagents/src/extension/config.ts +1 -1
  32. package/dist/builtin/subagents/src/extension/control-notices.ts +2 -2
  33. package/dist/builtin/subagents/src/extension/doctor.ts +15 -5
  34. package/dist/builtin/subagents/src/extension/fanout-child.ts +12 -12
  35. package/dist/builtin/subagents/src/extension/index.ts +23 -23
  36. package/dist/builtin/subagents/src/extension/notification-content.ts +1 -1
  37. package/dist/builtin/subagents/src/extension/schemas.ts +1 -1
  38. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +3 -3
  39. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +3 -3
  40. package/dist/builtin/subagents/src/intercom/result-intercom.ts +1 -1
  41. package/dist/builtin/subagents/src/intercom/supervisor-authorization.ts +1 -1
  42. package/dist/builtin/subagents/src/runs/foreground/completion-notification.ts +2 -2
  43. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +1 -1
  44. package/dist/builtin/subagents/src/runs/foreground/execution-intercom-detach.ts +3 -3
  45. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +1 -1
  46. package/dist/builtin/subagents/src/runs/foreground/execution-updates.ts +2 -2
  47. package/dist/builtin/subagents/src/runs/foreground/execution-utils.ts +1 -1
  48. package/dist/builtin/subagents/src/runs/foreground/execution.ts +2 -2
  49. package/dist/builtin/subagents/src/runs/foreground/inprocess-run-sync.ts +27 -11
  50. package/dist/builtin/subagents/src/runs/foreground/notify.ts +3 -3
  51. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +11 -11
  52. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +3 -3
  53. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +15 -14
  54. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +19 -19
  55. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-runtime.ts +2 -2
  56. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +14 -13
  57. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +9 -9
  58. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +7 -7
  59. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-worktree.ts +6 -6
  60. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +24 -23
  61. package/dist/builtin/subagents/src/runs/inprocess/control-registry.ts +1 -1
  62. package/dist/builtin/subagents/src/runs/inprocess/control-status.ts +3 -3
  63. package/dist/builtin/subagents/src/runs/inprocess/index.ts +3 -3
  64. package/dist/builtin/subagents/src/runs/inprocess/prompt-behavior.ts +17 -8
  65. package/dist/builtin/subagents/src/runs/inprocess/runner.ts +60 -12
  66. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-api.ts +8 -8
  67. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-control.ts +3 -3
  68. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-core.ts +4 -4
  69. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-projection.ts +4 -4
  70. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-registry.ts +5 -5
  71. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-rendering.ts +3 -3
  72. package/dist/builtin/subagents/src/runs/inprocess/runtime-support/nested-sanitize.ts +3 -3
  73. package/dist/builtin/subagents/src/runs/inprocess.ts +1 -1
  74. package/dist/builtin/subagents/src/runs/shared/long-running-guard.ts +1 -1
  75. package/dist/builtin/subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +1 -1
  76. package/dist/builtin/subagents/src/runs/shared/model-candidate-filter.ts +3 -3
  77. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +2 -2
  78. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +1 -1
  79. package/dist/builtin/subagents/src/runs/shared/single-output.ts +1 -1
  80. package/dist/builtin/subagents/src/runs/shared/subagent-control.ts +1 -1
  81. package/dist/builtin/subagents/src/shared/artifacts.ts +2 -2
  82. package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +1 -1
  83. package/dist/builtin/subagents/src/shared/fast-mode.ts +1 -1
  84. package/dist/builtin/subagents/src/shared/formatters.ts +2 -2
  85. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -1
  86. package/dist/builtin/subagents/src/shared/model-resolution.ts +1 -1
  87. package/dist/builtin/subagents/src/shared/session-tokens.ts +1 -1
  88. package/dist/builtin/subagents/src/shared/settings.ts +4 -4
  89. package/dist/builtin/subagents/src/shared/status-format.ts +1 -1
  90. package/dist/builtin/subagents/src/shared/types-config.ts +16 -4
  91. package/dist/builtin/subagents/src/shared/types-depth.ts +1 -1
  92. package/dist/builtin/subagents/src/shared/types-nested.ts +1 -1
  93. package/dist/builtin/subagents/src/shared/types-output.ts +1 -1
  94. package/dist/builtin/subagents/src/shared/types-results.ts +1 -1
  95. package/dist/builtin/subagents/src/shared/types-runtime.ts +1 -1
  96. package/dist/builtin/subagents/src/shared/types.ts +6 -6
  97. package/dist/builtin/subagents/src/shared/utils.ts +3 -3
  98. package/dist/builtin/subagents/src/slash/prompt-template-bridge.ts +1 -1
  99. package/dist/builtin/subagents/src/slash/slash-bridge.ts +3 -3
  100. package/dist/builtin/subagents/src/slash/slash-commands.ts +6 -6
  101. package/dist/builtin/subagents/src/slash/slash-live-state.ts +3 -3
  102. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +2 -2
  103. package/dist/builtin/subagents/src/tui/render-layout.ts +1 -1
  104. package/dist/builtin/subagents/src/tui/render-progress.ts +2 -2
  105. package/dist/builtin/subagents/src/tui/render-result-compact.ts +7 -7
  106. package/dist/builtin/subagents/src/tui/render-result.ts +10 -10
  107. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -1
  108. package/dist/builtin/subagents/src/tui/render-status-progress.ts +5 -5
  109. package/dist/builtin/subagents/src/tui/render.ts +4 -4
  110. package/dist/builtin/web-access/package.json +2 -2
  111. package/dist/builtin/workflows/CHANGELOG.md +57 -0
  112. package/dist/builtin/workflows/README.md +39 -8
  113. package/dist/builtin/workflows/builtin/adversarial-verification-runner.ts +16 -5
  114. package/dist/builtin/workflows/builtin/adversarial-verification.ts +4 -0
  115. package/dist/builtin/workflows/builtin/classify-and-act.ts +4 -0
  116. package/dist/builtin/workflows/builtin/fan-out-and-synthesize.ts +4 -0
  117. package/dist/builtin/workflows/builtin/generate-and-filter-runner.ts +12 -4
  118. package/dist/builtin/workflows/builtin/generate-and-filter.ts +4 -0
  119. package/dist/builtin/workflows/builtin/goal-models.ts +8 -10
  120. package/dist/builtin/workflows/builtin/goal.ts +4 -0
  121. package/dist/builtin/workflows/builtin/index.d.ts +0 -4
  122. package/dist/builtin/workflows/builtin/loop-until-done-runner.ts +4 -2
  123. package/dist/builtin/workflows/builtin/loop-until-done.ts +4 -0
  124. package/dist/builtin/workflows/builtin/open-claude-design-live-protocol.ts +305 -0
  125. package/dist/builtin/workflows/builtin/open-claude-design-phases.ts +115 -171
  126. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +9 -25
  127. package/dist/builtin/workflows/builtin/open-claude-design-setup.ts +19 -86
  128. package/dist/builtin/workflows/builtin/open-claude-design-utils.ts +0 -6
  129. package/dist/builtin/workflows/builtin/open-claude-design.d.ts +0 -5
  130. package/dist/builtin/workflows/builtin/open-claude-design.ts +11 -15
  131. package/dist/builtin/workflows/builtin/ralph-models.ts +24 -29
  132. package/dist/builtin/workflows/builtin/ralph.ts +4 -0
  133. package/dist/builtin/workflows/builtin/tournament-runner.ts +6 -3
  134. package/dist/builtin/workflows/builtin/tournament.ts +4 -0
  135. package/dist/builtin/workflows/package.json +2 -2
  136. package/dist/builtin/workflows/skills/impeccable/SKILL.md +3 -3
  137. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_asset_producer.toml +25 -31
  138. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_documenter.toml +1 -0
  139. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_finish_reviewer.toml +16 -10
  140. package/dist/builtin/workflows/skills/impeccable/agents/impeccable_manual_edit_applier.toml +2 -2
  141. package/dist/builtin/workflows/skills/impeccable/reference/android.md +6 -0
  142. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +3 -0
  143. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +3 -1
  144. package/dist/builtin/workflows/skills/impeccable/reference/craft-floor.md +6 -1
  145. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +18 -2
  146. package/dist/builtin/workflows/skills/impeccable/reference/degraded/asset-producer.md +24 -30
  147. package/dist/builtin/workflows/skills/impeccable/reference/degraded/documenter.md +1 -0
  148. package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +16 -10
  149. package/dist/builtin/workflows/skills/impeccable/reference/degraded/manual-edit-applier.md +2 -2
  150. package/dist/builtin/workflows/skills/impeccable/reference/distill.md +1 -1
  151. package/dist/builtin/workflows/skills/impeccable/reference/doctor.md +1 -0
  152. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  153. package/dist/builtin/workflows/skills/impeccable/reference/extract.md +1 -1
  154. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +12 -6
  155. package/dist/builtin/workflows/skills/impeccable/reference/init.md +12 -3
  156. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +6 -0
  157. package/dist/builtin/workflows/skills/impeccable/reference/live-setup.md +102 -0
  158. package/dist/builtin/workflows/skills/impeccable/reference/live.md +113 -521
  159. package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +39 -26
  160. package/dist/builtin/workflows/skills/impeccable/reference/overdrive.md +1 -1
  161. package/dist/builtin/workflows/skills/impeccable/reference/polish.md +3 -3
  162. package/dist/builtin/workflows/skills/impeccable/reference/quieter.md +1 -1
  163. package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +25 -11
  164. package/dist/builtin/workflows/skills/impeccable/scripts/concept-seed.mjs +332 -221
  165. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +10 -19
  166. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +91 -38
  167. package/dist/builtin/workflows/skills/impeccable/scripts/critique-storage.mjs +19 -10
  168. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +56 -6
  169. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +10 -16
  170. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +140 -2
  171. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +1174 -694
  172. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns.mjs +1 -0
  173. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/browser/detect-url.mjs +5 -1
  174. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +431 -45
  175. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/css-cascade.mjs +10 -1
  176. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/static-html/detect-html.mjs +47 -6
  177. package/dist/builtin/workflows/skills/impeccable/scripts/detector/node/file-system.mjs +23 -22
  178. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +0 -10
  179. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +384 -384
  180. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/color.mjs +466 -2
  181. package/dist/builtin/workflows/skills/impeccable/scripts/doctor.mjs +2 -0
  182. package/dist/builtin/workflows/skills/impeccable/scripts/embed-prompt.mjs +270 -0
  183. package/dist/builtin/workflows/skills/impeccable/scripts/generate-image.mjs +51 -6
  184. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +70 -10
  185. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +336 -90
  186. package/dist/builtin/workflows/skills/impeccable/scripts/lib/composition-catalog.mjs +38 -3
  187. package/dist/builtin/workflows/skills/impeccable/scripts/lib/concept-catalog.mjs +77 -11
  188. package/dist/builtin/workflows/skills/impeccable/scripts/lib/design-parser.mjs +102 -19
  189. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +44 -59
  190. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +3 -0
  191. package/dist/builtin/workflows/skills/impeccable/scripts/lib/open-system-browser.mjs +57 -0
  192. package/dist/builtin/workflows/skills/impeccable/scripts/lib/roll-selection.mjs +369 -0
  193. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness-deep.mjs +31 -3
  194. package/dist/builtin/workflows/skills/impeccable/scripts/lib/staleness.mjs +73 -2
  195. package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-css.mjs +617 -0
  196. package/dist/builtin/workflows/skills/impeccable/scripts/live/accept-verify.mjs +71 -0
  197. package/dist/builtin/workflows/skills/impeccable/scripts/live/browser-script-parts.mjs +29 -2
  198. package/dist/builtin/workflows/skills/impeccable/scripts/live/event-validation.mjs +54 -7
  199. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/astro.mjs +47 -0
  200. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/detect-utils.mjs +157 -0
  201. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/index.mjs +143 -0
  202. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/journal.mjs +205 -0
  203. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nextjs.mjs +49 -0
  204. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/nuxt.mjs +170 -0
  205. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/script-src.mjs +26 -0
  206. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/static-html.mjs +26 -0
  207. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/sveltekit.mjs +71 -0
  208. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tag-strategy.mjs +247 -0
  209. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/tanstack-start.mjs +70 -0
  210. package/dist/builtin/workflows/skills/impeccable/scripts/live/frameworks/vite-generic.mjs +42 -0
  211. package/dist/builtin/workflows/skills/impeccable/scripts/live/instructions.mjs +169 -0
  212. package/dist/builtin/workflows/skills/impeccable/scripts/live/roots.mjs +670 -0
  213. package/dist/builtin/workflows/skills/impeccable/scripts/live/session-store.mjs +232 -35
  214. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-ast.mjs +969 -0
  215. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +621 -74
  216. package/dist/builtin/workflows/skills/impeccable/scripts/live/sveltekit-adapter.mjs +66 -28
  217. package/dist/builtin/workflows/skills/impeccable/scripts/live/tanstack-adapter.mjs +12 -12
  218. package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-surfaces.mjs +75 -0
  219. package/dist/builtin/workflows/skills/impeccable/scripts/live/vocabulary.mjs +135 -0
  220. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +23 -37
  221. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +945 -115
  222. package/dist/builtin/workflows/skills/impeccable/scripts/live-complete.mjs +33 -1
  223. package/dist/builtin/workflows/skills/impeccable/scripts/live-copy-edit-agent.mjs +132 -15
  224. package/dist/builtin/workflows/skills/impeccable/scripts/live-inject.mjs +173 -425
  225. package/dist/builtin/workflows/skills/impeccable/scripts/live-insert.mjs +2 -0
  226. package/dist/builtin/workflows/skills/impeccable/scripts/live-poll.mjs +16 -3
  227. package/dist/builtin/workflows/skills/impeccable/scripts/live-resume.mjs +39 -10
  228. package/dist/builtin/workflows/skills/impeccable/scripts/live-server.mjs +194 -27
  229. package/dist/builtin/workflows/skills/impeccable/scripts/live-status.mjs +10 -4
  230. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +50 -31
  231. package/dist/builtin/workflows/skills/impeccable/scripts/live.mjs +91 -28
  232. package/dist/builtin/workflows/skills/impeccable/scripts/pin.mjs +8 -5
  233. package/dist/builtin/workflows/skills/impeccable/scripts/serve-question.mjs +759 -109
  234. package/dist/builtin/workflows/src/authoring/workflow.ts +9 -0
  235. package/dist/builtin/workflows/src/authoring.d.ts +3 -0
  236. package/dist/builtin/workflows/src/durable/completed-catalog.ts +23 -2
  237. package/dist/builtin/workflows/src/durable/dbos-backend.ts +30 -17
  238. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +14 -0
  239. package/dist/builtin/workflows/src/durable/dbos-lifecycle.ts +60 -57
  240. package/dist/builtin/workflows/src/durable/dbos-process-owner.ts +87 -0
  241. package/dist/builtin/workflows/src/durable/dbos-registration-diagnostics.ts +113 -0
  242. package/dist/builtin/workflows/src/durable/factory.ts +11 -8
  243. package/dist/builtin/workflows/src/durable/tool-failure-checkpoint.ts +5 -0
  244. package/dist/builtin/workflows/src/durable/tool-primitive.ts +186 -20
  245. package/dist/builtin/workflows/src/durable/types.ts +4 -0
  246. package/dist/builtin/workflows/src/durable/workflow-heartbeat-anchor.ts +153 -0
  247. package/dist/builtin/workflows/src/engine/run-durable-stage-session.ts +28 -0
  248. package/dist/builtin/workflows/src/engine/run-tool-control-registry.ts +9 -1
  249. package/dist/builtin/workflows/src/engine/run.ts +1 -0
  250. package/dist/builtin/workflows/src/extension/adopt-session-run-state.ts +20 -0
  251. package/dist/builtin/workflows/src/extension/background-ui-adapter.ts +9 -30
  252. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  253. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +28 -10
  254. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +138 -0
  255. package/dist/builtin/workflows/src/extension/index.bundle.mjs +3365 -1341
  256. package/dist/builtin/workflows/src/extension/workflow-heartbeat-delivery.ts +197 -0
  257. package/dist/builtin/workflows/src/extension/workflow-heartbeat-notice.ts +115 -0
  258. package/dist/builtin/workflows/src/extension/workflow-heartbeat-scheduler.ts +962 -0
  259. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +4 -1
  260. package/dist/builtin/workflows/src/extension/workflow-schema.ts +29 -5
  261. package/dist/builtin/workflows/src/extension/workflow-tool-send.ts +32 -1
  262. package/dist/builtin/workflows/src/runs/background/cancellation-registry.ts +10 -1
  263. package/dist/builtin/workflows/src/runs/background/job-tracker.ts +10 -1
  264. package/dist/builtin/workflows/src/runs/foreground/executor-prompt-nodes.ts +16 -11
  265. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +31 -1
  266. package/dist/builtin/workflows/src/runs/foreground/stage-runner-context.ts +41 -10
  267. package/dist/builtin/workflows/src/runs/foreground/stage-runner-messages.ts +48 -0
  268. package/dist/builtin/workflows/src/runs/foreground/stage-runner-output.ts +4 -1
  269. package/dist/builtin/workflows/src/runs/foreground/stage-runner-structured-output.ts +45 -12
  270. package/dist/builtin/workflows/src/sdk-surface.ts +9 -0
  271. package/dist/builtin/workflows/src/shared/authoring-contract-ui.d.ts +10 -0
  272. package/dist/builtin/workflows/src/shared/authoring-contract-ui.ts +10 -0
  273. package/dist/builtin/workflows/src/shared/graph-store-snapshot.ts +14 -2
  274. package/dist/builtin/workflows/src/shared/persistence-restore.ts +12 -0
  275. package/dist/builtin/workflows/src/shared/prompt-answer.ts +130 -0
  276. package/dist/builtin/workflows/src/shared/session-scoped-singleton.ts +98 -0
  277. package/dist/builtin/workflows/src/shared/stage-ui-broker.ts +9 -1
  278. package/dist/builtin/workflows/src/shared/store-factory.ts +9 -1
  279. package/dist/builtin/workflows/src/shared/store-public-types.ts +2 -1
  280. package/dist/builtin/workflows/src/shared/store-tool-node-methods.ts +7 -0
  281. package/dist/builtin/workflows/src/shared/store-types.ts +18 -1
  282. package/dist/builtin/workflows/src/shared/tool-payload-bounds.ts +576 -0
  283. package/dist/builtin/workflows/src/shared/workflow-authoring-types.d.ts +1 -0
  284. package/dist/builtin/workflows/src/shared/workflow-authoring-types.ts +1 -0
  285. package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.d.ts +21 -0
  286. package/dist/builtin/workflows/src/shared/workflow-heartbeat-contract.ts +25 -0
  287. package/dist/builtin/workflows/src/tui/graph-theme.ts +8 -1
  288. package/dist/builtin/workflows/src/tui/graph-view-constants.ts +11 -0
  289. package/dist/builtin/workflows/src/tui/graph-view-input.ts +100 -5
  290. package/dist/builtin/workflows/src/tui/graph-view-layout.ts +42 -11
  291. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +55 -6
  292. package/dist/builtin/workflows/src/tui/graph-view-render.ts +71 -6
  293. package/dist/builtin/workflows/src/tui/graph-view-state.ts +43 -0
  294. package/dist/builtin/workflows/src/tui/keybindings-adapter.ts +2 -0
  295. package/dist/builtin/workflows/src/tui/node-card.ts +5 -1
  296. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +11 -2
  297. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +36 -10
  298. package/dist/builtin/workflows/src/tui/switcher.ts +11 -4
  299. package/dist/builtin/workflows/src/tui/tool-detail.ts +348 -0
  300. package/dist/builtin/workflows/src/tui/workflow-status.ts +5 -2
  301. package/dist/cli/args.d.ts +1 -0
  302. package/dist/cli/args.d.ts.map +1 -1
  303. package/dist/cli/args.js +11 -0
  304. package/dist/cli/args.js.map +1 -1
  305. package/dist/cli/auth-check.d.ts +1 -1
  306. package/dist/cli/auth-check.js.map +1 -1
  307. package/dist/cli/credential-print.d.ts +1 -1
  308. package/dist/cli/credential-print.js.map +1 -1
  309. package/dist/cli/list-models.d.ts +1 -1
  310. package/dist/cli/list-models.js.map +1 -1
  311. package/dist/cli/startup-ui.d.ts +9 -0
  312. package/dist/cli/startup-ui.d.ts.map +1 -1
  313. package/dist/cli/startup-ui.js +7 -1
  314. package/dist/cli/startup-ui.js.map +1 -1
  315. package/dist/core/agent-session-custom-message-commit.js +2 -2
  316. package/dist/core/agent-session-custom-message-commit.js.map +1 -1
  317. package/dist/core/agent-session-export.d.ts +6 -1
  318. package/dist/core/agent-session-export.d.ts.map +1 -1
  319. package/dist/core/agent-session-export.js +6 -3
  320. package/dist/core/agent-session-export.js.map +1 -1
  321. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  322. package/dist/core/agent-session-extension-bindings.js +6 -4
  323. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  324. package/dist/core/agent-session-methods.d.ts +5 -2
  325. package/dist/core/agent-session-methods.d.ts.map +1 -1
  326. package/dist/core/agent-session-methods.js.map +1 -1
  327. package/dist/core/agent-session-prompt.d.ts +12 -1
  328. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  329. package/dist/core/agent-session-prompt.js +31 -10
  330. package/dist/core/agent-session-prompt.js.map +1 -1
  331. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  332. package/dist/core/agent-session-services.d.ts +1 -1
  333. package/dist/core/agent-session-services.js.map +1 -1
  334. package/dist/core/agent-session-skill-block.d.ts +1 -0
  335. package/dist/core/agent-session-skill-block.d.ts.map +1 -1
  336. package/dist/core/agent-session-skill-block.js +18 -2
  337. package/dist/core/agent-session-skill-block.js.map +1 -1
  338. package/dist/core/agent-session-state.d.ts.map +1 -1
  339. package/dist/core/agent-session-state.js +2 -1
  340. package/dist/core/agent-session-state.js.map +1 -1
  341. package/dist/core/agent-session-types.d.ts +2 -1
  342. package/dist/core/agent-session-types.d.ts.map +1 -1
  343. package/dist/core/agent-session-types.js.map +1 -1
  344. package/dist/core/agent-session.d.ts +1 -1
  345. package/dist/core/agent-session.js.map +1 -1
  346. package/dist/core/atomic-guide-command.js +2 -2
  347. package/dist/core/atomic-guide-command.js.map +1 -1
  348. package/dist/core/builtin-packages.d.ts.map +1 -1
  349. package/dist/core/builtin-packages.js +0 -6
  350. package/dist/core/builtin-packages.js.map +1 -1
  351. package/dist/core/cloudflare-gateway-binding.d.ts +11 -0
  352. package/dist/core/cloudflare-gateway-binding.d.ts.map +1 -0
  353. package/dist/core/cloudflare-gateway-binding.js +11 -0
  354. package/dist/core/cloudflare-gateway-binding.js.map +1 -0
  355. package/dist/core/codex-fast-mode-transport.d.ts +12 -0
  356. package/dist/core/codex-fast-mode-transport.d.ts.map +1 -0
  357. package/dist/core/codex-fast-mode-transport.js +130 -0
  358. package/dist/core/codex-fast-mode-transport.js.map +1 -0
  359. package/dist/core/codex-fast-mode.d.ts +20 -6
  360. package/dist/core/codex-fast-mode.d.ts.map +1 -1
  361. package/dist/core/codex-fast-mode.js +111 -3
  362. package/dist/core/codex-fast-mode.js.map +1 -1
  363. package/dist/core/diagnostics.d.ts +4 -0
  364. package/dist/core/diagnostics.d.ts.map +1 -1
  365. package/dist/core/diagnostics.js.map +1 -1
  366. package/dist/core/event-bus.d.ts +12 -0
  367. package/dist/core/event-bus.d.ts.map +1 -1
  368. package/dist/core/event-bus.js +22 -0
  369. package/dist/core/event-bus.js.map +1 -1
  370. package/dist/core/experimental.d.ts +25 -0
  371. package/dist/core/experimental.d.ts.map +1 -1
  372. package/dist/core/experimental.js +24 -0
  373. package/dist/core/experimental.js.map +1 -1
  374. package/dist/core/export-html/template-js/tree-filter-render.js +4 -3
  375. package/dist/core/export-html/template.js +4 -3
  376. package/dist/core/extension-session-state.d.ts +28 -0
  377. package/dist/core/extension-session-state.d.ts.map +1 -0
  378. package/dist/core/extension-session-state.js +55 -0
  379. package/dist/core/extension-session-state.js.map +1 -0
  380. package/dist/core/extensions/api-types.d.ts +6 -0
  381. package/dist/core/extensions/api-types.d.ts.map +1 -1
  382. package/dist/core/extensions/api-types.js.map +1 -1
  383. package/dist/core/extensions/context-types.d.ts +4 -0
  384. package/dist/core/extensions/context-types.d.ts.map +1 -1
  385. package/dist/core/extensions/context-types.js.map +1 -1
  386. package/dist/core/extensions/index.d.ts +1 -0
  387. package/dist/core/extensions/index.d.ts.map +1 -1
  388. package/dist/core/extensions/index.js +1 -0
  389. package/dist/core/extensions/index.js.map +1 -1
  390. package/dist/core/extensions/loader-api.d.ts +1 -1
  391. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  392. package/dist/core/extensions/loader-api.js +16 -10
  393. package/dist/core/extensions/loader-api.js.map +1 -1
  394. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  395. package/dist/core/extensions/loader-virtual-modules.js +12 -1
  396. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  397. package/dist/core/extensions/runner-context.d.ts +2 -0
  398. package/dist/core/extensions/runner-context.d.ts.map +1 -1
  399. package/dist/core/extensions/runner-context.js +8 -0
  400. package/dist/core/extensions/runner-context.js.map +1 -1
  401. package/dist/core/extensions/runner.d.ts +1 -0
  402. package/dist/core/extensions/runner.d.ts.map +1 -1
  403. package/dist/core/extensions/runner.js +3 -0
  404. package/dist/core/extensions/runner.js.map +1 -1
  405. package/dist/core/extensions/runtime-types.d.ts +3 -0
  406. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  407. package/dist/core/extensions/runtime-types.js.map +1 -1
  408. package/dist/core/extensions/ui-types.d.ts +26 -0
  409. package/dist/core/extensions/ui-types.d.ts.map +1 -1
  410. package/dist/core/extensions/ui-types.js +17 -1
  411. package/dist/core/extensions/ui-types.js.map +1 -1
  412. package/dist/core/http-dispatcher.d.ts.map +1 -1
  413. package/dist/core/http-dispatcher.js +5 -0
  414. package/dist/core/http-dispatcher.js.map +1 -1
  415. package/dist/core/keybindings.d.ts +24 -0
  416. package/dist/core/keybindings.d.ts.map +1 -1
  417. package/dist/core/keybindings.js +6 -0
  418. package/dist/core/keybindings.js.map +1 -1
  419. package/dist/core/model-config.d.ts +5 -0
  420. package/dist/core/model-config.d.ts.map +1 -1
  421. package/dist/core/model-config.js +1 -0
  422. package/dist/core/model-config.js.map +1 -1
  423. package/dist/core/model-registry.d.ts +1 -1
  424. package/dist/core/model-registry.js.map +1 -1
  425. package/dist/core/model-resolver-cli.d.ts +1 -1
  426. package/dist/core/model-resolver-cli.js.map +1 -1
  427. package/dist/core/model-resolver-defaults.js +3 -3
  428. package/dist/core/model-resolver-defaults.js.map +1 -1
  429. package/dist/core/model-resolver-initial.d.ts +1 -1
  430. package/dist/core/model-resolver-initial.js.map +1 -1
  431. package/dist/core/model-resolver-scope.d.ts +1 -1
  432. package/dist/core/model-resolver-scope.js.map +1 -1
  433. package/dist/core/model-runtime.d.ts +54 -0
  434. package/dist/core/model-runtime.d.ts.map +1 -1
  435. package/dist/core/model-runtime.js +96 -13
  436. package/dist/core/model-runtime.js.map +1 -1
  437. package/dist/core/oauth-login.js.map +1 -1
  438. package/dist/core/project-trust.d.ts +10 -0
  439. package/dist/core/project-trust.d.ts.map +1 -1
  440. package/dist/core/project-trust.js +12 -0
  441. package/dist/core/project-trust.js.map +1 -1
  442. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  443. package/dist/core/resource-loader-assets.js +14 -5
  444. package/dist/core/resource-loader-assets.js.map +1 -1
  445. package/dist/core/resource-loader-core.d.ts +3 -0
  446. package/dist/core/resource-loader-core.d.ts.map +1 -1
  447. package/dist/core/resource-loader-core.js +5 -0
  448. package/dist/core/resource-loader-core.js.map +1 -1
  449. package/dist/core/resource-loader-internals.d.ts +2 -0
  450. package/dist/core/resource-loader-internals.d.ts.map +1 -1
  451. package/dist/core/resource-loader-internals.js.map +1 -1
  452. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  453. package/dist/core/resource-loader-reload.js +2 -0
  454. package/dist/core/resource-loader-reload.js.map +1 -1
  455. package/dist/core/resource-loader-types.d.ts +2 -0
  456. package/dist/core/resource-loader-types.d.ts.map +1 -1
  457. package/dist/core/resource-loader-types.js.map +1 -1
  458. package/dist/core/resource-loader.d.ts +2 -0
  459. package/dist/core/resource-loader.d.ts.map +1 -1
  460. package/dist/core/resource-loader.js +1 -0
  461. package/dist/core/resource-loader.js.map +1 -1
  462. package/dist/core/sdk-types.d.ts +7 -6
  463. package/dist/core/sdk-types.d.ts.map +1 -1
  464. package/dist/core/sdk-types.js.map +1 -1
  465. package/dist/core/sdk.d.ts.map +1 -1
  466. package/dist/core/sdk.js +17 -6
  467. package/dist/core/sdk.js.map +1 -1
  468. package/dist/core/session-manager-core.d.ts +7 -1
  469. package/dist/core/session-manager-core.d.ts.map +1 -1
  470. package/dist/core/session-manager-core.js +11 -2
  471. package/dist/core/session-manager-core.js.map +1 -1
  472. package/dist/core/session-manager-entries.d.ts +2 -2
  473. package/dist/core/session-manager-entries.d.ts.map +1 -1
  474. package/dist/core/session-manager-entries.js +6 -4
  475. package/dist/core/session-manager-entries.js.map +1 -1
  476. package/dist/core/session-manager-list.d.ts.map +1 -1
  477. package/dist/core/session-manager-list.js +5 -1
  478. package/dist/core/session-manager-list.js.map +1 -1
  479. package/dist/core/session-manager-types.d.ts +25 -2
  480. package/dist/core/session-manager-types.d.ts.map +1 -1
  481. package/dist/core/session-manager-types.js.map +1 -1
  482. package/dist/core/session-manager.d.ts +1 -1
  483. package/dist/core/session-manager.d.ts.map +1 -1
  484. package/dist/core/session-manager.js.map +1 -1
  485. package/dist/core/settings-manager-basic-accessors.d.ts +1 -0
  486. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  487. package/dist/core/settings-manager-basic-accessors.js +8 -0
  488. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  489. package/dist/core/settings-manager-ui-accessors.d.ts +3 -1
  490. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  491. package/dist/core/settings-manager-ui-accessors.js +9 -0
  492. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  493. package/dist/core/settings-manager.d.ts +1 -1
  494. package/dist/core/settings-manager.d.ts.map +1 -1
  495. package/dist/core/settings-manager.js.map +1 -1
  496. package/dist/core/settings-types.d.ts +4 -0
  497. package/dist/core/settings-types.d.ts.map +1 -1
  498. package/dist/core/settings-types.js.map +1 -1
  499. package/dist/core/skill-catalog.d.ts +35 -0
  500. package/dist/core/skill-catalog.d.ts.map +1 -0
  501. package/dist/core/skill-catalog.js +264 -0
  502. package/dist/core/skill-catalog.js.map +1 -0
  503. package/dist/core/skills-async.d.ts.map +1 -1
  504. package/dist/core/skills-async.js +12 -6
  505. package/dist/core/skills-async.js.map +1 -1
  506. package/dist/core/skills.d.ts +2 -0
  507. package/dist/core/skills.d.ts.map +1 -1
  508. package/dist/core/skills.js +8 -5
  509. package/dist/core/skills.js.map +1 -1
  510. package/dist/core/slash-commands.d.ts.map +1 -1
  511. package/dist/core/slash-commands.js +1 -5
  512. package/dist/core/slash-commands.js.map +1 -1
  513. package/dist/core/system-prompt.js +2 -2
  514. package/dist/core/system-prompt.js.map +1 -1
  515. package/dist/core/tools/ask-user-question/ask-user-question.d.ts +25 -2
  516. package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
  517. package/dist/core/tools/ask-user-question/ask-user-question.js +47 -18
  518. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
  519. package/dist/core/tools/ask-user-question/view/components/multi-select-view.d.ts.map +1 -1
  520. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js +5 -2
  521. package/dist/core/tools/ask-user-question/view/components/multi-select-view.js.map +1 -1
  522. package/dist/core/tools/ask-user-question/view/components/submit-picker.d.ts.map +1 -1
  523. package/dist/core/tools/ask-user-question/view/components/submit-picker.js +3 -1
  524. package/dist/core/tools/ask-user-question/view/components/submit-picker.js.map +1 -1
  525. package/dist/core/tools/ask-user-question/view/components/wrapping-select.d.ts.map +1 -1
  526. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js +8 -1
  527. package/dist/core/tools/ask-user-question/view/components/wrapping-select.js.map +1 -1
  528. package/dist/core/tools/bash.d.ts.map +1 -1
  529. package/dist/core/tools/bash.js +2 -0
  530. package/dist/core/tools/bash.js.map +1 -1
  531. package/dist/core/tools/edit.d.ts.map +1 -1
  532. package/dist/core/tools/edit.js +2 -0
  533. package/dist/core/tools/edit.js.map +1 -1
  534. package/dist/core/tools/find.d.ts.map +1 -1
  535. package/dist/core/tools/find.js +3 -1
  536. package/dist/core/tools/find.js.map +1 -1
  537. package/dist/core/tools/grep.js +1 -1
  538. package/dist/core/tools/grep.js.map +1 -1
  539. package/dist/core/tools/hashline-engine/format.d.ts +2 -0
  540. package/dist/core/tools/hashline-engine/format.d.ts.map +1 -1
  541. package/dist/core/tools/hashline-engine/format.js +4 -2
  542. package/dist/core/tools/hashline-engine/format.js.map +1 -1
  543. package/dist/core/tools/hashline-engine/messages.d.ts +2 -0
  544. package/dist/core/tools/hashline-engine/messages.d.ts.map +1 -1
  545. package/dist/core/tools/hashline-engine/messages.js +4 -2
  546. package/dist/core/tools/hashline-engine/messages.js.map +1 -1
  547. package/dist/core/tools/hashline-engine/parser.d.ts.map +1 -1
  548. package/dist/core/tools/hashline-engine/parser.js +16 -4
  549. package/dist/core/tools/hashline-engine/parser.js.map +1 -1
  550. package/dist/core/tools/hashline-engine/tokenizer.d.ts.map +1 -1
  551. package/dist/core/tools/hashline-engine/tokenizer.js +37 -27
  552. package/dist/core/tools/hashline-engine/tokenizer.js.map +1 -1
  553. package/dist/core/tools/hashline.d.ts.map +1 -1
  554. package/dist/core/tools/hashline.js +8 -2
  555. package/dist/core/tools/hashline.js.map +1 -1
  556. package/dist/core/tools/ls.d.ts.map +1 -1
  557. package/dist/core/tools/ls.js +2 -0
  558. package/dist/core/tools/ls.js.map +1 -1
  559. package/dist/core/tools/read.d.ts.map +1 -1
  560. package/dist/core/tools/read.js +8 -1
  561. package/dist/core/tools/read.js.map +1 -1
  562. package/dist/core/tools/search.d.ts.map +1 -1
  563. package/dist/core/tools/search.js +2 -0
  564. package/dist/core/tools/search.js.map +1 -1
  565. package/dist/core/tools/todos.d.ts +3 -12
  566. package/dist/core/tools/todos.d.ts.map +1 -1
  567. package/dist/core/tools/todos.js +19 -4
  568. package/dist/core/tools/todos.js.map +1 -1
  569. package/dist/core/tools/write.d.ts.map +1 -1
  570. package/dist/core/tools/write.js +2 -0
  571. package/dist/core/tools/write.js.map +1 -1
  572. package/dist/index-extensions.d.ts +1 -1
  573. package/dist/index-extensions.d.ts.map +1 -1
  574. package/dist/index-extensions.js +1 -1
  575. package/dist/index-extensions.js.map +1 -1
  576. package/dist/index.d.ts +8 -5
  577. package/dist/index.d.ts.map +1 -1
  578. package/dist/index.js +6 -2
  579. package/dist/index.js.map +1 -1
  580. package/dist/main-runtime-api-key.d.ts +1 -1
  581. package/dist/main-runtime-api-key.js.map +1 -1
  582. package/dist/main-session-options.d.ts +1 -1
  583. package/dist/main-session-options.js.map +1 -1
  584. package/dist/main.d.ts.map +1 -1
  585. package/dist/main.js +10 -2
  586. package/dist/main.js.map +1 -1
  587. package/dist/modes/interactive/components/chat-session-host-rendering.js +1 -1
  588. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  589. package/dist/modes/interactive/components/chat-session-host-state.d.ts +8 -0
  590. package/dist/modes/interactive/components/chat-session-host-state.d.ts.map +1 -1
  591. package/dist/modes/interactive/components/chat-session-host-state.js +8 -0
  592. package/dist/modes/interactive/components/chat-session-host-state.js.map +1 -1
  593. package/dist/modes/interactive/components/chat-session-host.d.ts +26 -0
  594. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  595. package/dist/modes/interactive/components/chat-session-host.js +38 -0
  596. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  597. package/dist/modes/interactive/components/chat-transcript.d.ts +37 -0
  598. package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
  599. package/dist/modes/interactive/components/chat-transcript.js +54 -1
  600. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  601. package/dist/modes/interactive/components/fast-mode-selector.js +1 -1
  602. package/dist/modes/interactive/components/fast-mode-selector.js.map +1 -1
  603. package/dist/modes/interactive/components/model-selector.d.ts +1 -1
  604. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  605. package/dist/modes/interactive/components/model-selector.js +2 -1
  606. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  607. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -1
  608. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  609. package/dist/modes/interactive/components/reserved-bottom-overlay.d.ts +95 -0
  610. package/dist/modes/interactive/components/reserved-bottom-overlay.d.ts.map +1 -0
  611. package/dist/modes/interactive/components/reserved-bottom-overlay.js +234 -0
  612. package/dist/modes/interactive/components/reserved-bottom-overlay.js.map +1 -0
  613. package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
  614. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  615. package/dist/modes/interactive/components/session-selector-search.js +4 -0
  616. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  617. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  618. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  619. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  620. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  621. package/dist/modes/interactive/components/settings-selector-items.js +7 -0
  622. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  623. package/dist/modes/interactive/components/settings-selector-types.d.ts +3 -1
  624. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  625. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  626. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  627. package/dist/modes/interactive/components/tool-execution.js +12 -1
  628. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  629. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  630. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  631. package/dist/modes/interactive/interactive-autocomplete.js +5 -4
  632. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  633. package/dist/modes/interactive/interactive-bash-compact.d.ts.map +1 -1
  634. package/dist/modes/interactive/interactive-bash-compact.js +2 -2
  635. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  636. package/dist/modes/interactive/interactive-extension-custom-ui.js +94 -6
  637. package/dist/modes/interactive/interactive-extension-custom-ui.js.map +1 -1
  638. package/dist/modes/interactive/interactive-mode-base.d.ts +41 -3
  639. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  640. package/dist/modes/interactive/interactive-mode-base.js +80 -11
  641. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  642. package/dist/modes/interactive/interactive-mode-surface.d.ts +9 -1
  643. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  644. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  645. package/dist/modes/interactive/interactive-mode-types.d.ts +2 -0
  646. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  647. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  648. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts +8 -1
  649. package/dist/modes/interactive/interactive-model-catalog-startup.d.ts.map +1 -1
  650. package/dist/modes/interactive/interactive-model-catalog-startup.js +13 -3
  651. package/dist/modes/interactive/interactive-model-catalog-startup.js.map +1 -1
  652. package/dist/modes/interactive/interactive-model-routing.js +3 -4
  653. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  654. package/dist/modes/interactive/interactive-render-chat.js +6 -0
  655. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  656. package/dist/modes/interactive/interactive-resource-disclosure.js +2 -2
  657. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  658. package/dist/modes/interactive/interactive-selectors.js +7 -3
  659. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  660. package/dist/modes/interactive/interactive-session-runtime.js +7 -1
  661. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  662. package/dist/modes/interactive/interactive-slash-commands.js +2 -2
  663. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  664. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  665. package/dist/modes/interactive/interactive-startup.js +34 -9
  666. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  667. package/dist/modes/interactive/interactive-tui.d.ts +21 -1
  668. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  669. package/dist/modes/interactive/interactive-tui.js +140 -38
  670. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  671. package/dist/modes/interactive/model-catalog-refresh.d.ts +17 -0
  672. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  673. package/dist/modes/interactive/model-catalog-refresh.js +84 -0
  674. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  675. package/dist/modes/interactive/theme/dark.json +2 -0
  676. package/dist/modes/interactive/theme/light.json +2 -0
  677. package/dist/modes/interactive/theme/theme-class.d.ts +12 -3
  678. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  679. package/dist/modes/interactive/theme/theme-class.js +6 -1
  680. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  681. package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
  682. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  683. package/dist/modes/interactive/theme/theme-controller.js +23 -10
  684. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  685. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  686. package/dist/modes/interactive/theme/theme-loading.js +1 -0
  687. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  688. package/dist/modes/interactive/theme/theme-schema.d.ts +8 -0
  689. package/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  690. package/dist/modes/interactive/theme/theme-schema.js +3 -1
  691. package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  692. package/dist/modes/interactive/theme/theme-schema.json +9 -1
  693. package/dist/modes/interactive-engine/engine-custom-ui.d.ts +2 -0
  694. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  695. package/dist/modes/interactive-engine/engine-custom-ui.js +1 -0
  696. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  697. package/dist/modes/interactive-engine/protocol.d.ts +1 -0
  698. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  699. package/dist/modes/interactive-engine/protocol.js +1 -0
  700. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  701. package/dist/modes/interactive-engine/remote-component.d.ts +3 -1
  702. package/dist/modes/interactive-engine/remote-component.d.ts.map +1 -1
  703. package/dist/modes/interactive-engine/remote-component.js +3 -2
  704. package/dist/modes/interactive-engine/remote-component.js.map +1 -1
  705. package/dist/modes/json-event.d.ts +6 -1
  706. package/dist/modes/json-event.d.ts.map +1 -1
  707. package/dist/modes/json-event.js +17 -2
  708. package/dist/modes/json-event.js.map +1 -1
  709. package/dist/modes/rpc/rpc-client.js.map +1 -1
  710. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  711. package/dist/modes/rpc/rpc-command-handler.js +5 -4
  712. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  713. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  714. package/dist/modes/rpc/rpc-responses.js.map +1 -1
  715. package/dist/modes/rpc/rpc-types.d.ts +1 -1
  716. package/dist/modes/rpc/rpc-types.js.map +1 -1
  717. package/dist/package-manager-cli.js.map +1 -1
  718. package/dist/server/create-harness.d.ts.map +1 -1
  719. package/dist/server/create-harness.js +11 -0
  720. package/dist/server/create-harness.js.map +1 -1
  721. package/dist/utils/abort.d.ts +9 -0
  722. package/dist/utils/abort.d.ts.map +1 -0
  723. package/dist/utils/abort.js +19 -0
  724. package/dist/utils/abort.js.map +1 -0
  725. package/dist/utils/tools-manager.d.ts +16 -1
  726. package/dist/utils/tools-manager.d.ts.map +1 -1
  727. package/dist/utils/tools-manager.js +19 -19
  728. package/dist/utils/tools-manager.js.map +1 -1
  729. package/docs/custom-provider.md +9 -8
  730. package/docs/development.md +0 -1
  731. package/docs/docs.json +0 -1
  732. package/docs/environment-variables.md +3 -0
  733. package/docs/extensions.md +100 -2
  734. package/docs/json.md +3 -1
  735. package/docs/keybindings.md +8 -3
  736. package/docs/models/artificial-analysis-index.md +2 -2
  737. package/docs/models/model-selection.md +32 -23
  738. package/docs/models/pareto-efficiency.md +25 -24
  739. package/docs/providers.md +95 -2
  740. package/docs/quickstart.md +4 -2
  741. package/docs/rpc.md +21 -7
  742. package/docs/sdk.md +26 -1
  743. package/docs/session-format.md +5 -2
  744. package/docs/settings.md +34 -3
  745. package/docs/skills.md +16 -1
  746. package/docs/terminal-setup.md +15 -2
  747. package/docs/themes.md +22 -4
  748. package/docs/tools.md +3 -1
  749. package/docs/tui.md +2 -0
  750. package/docs/usage.md +5 -4
  751. package/docs/workflows.md +96 -19
  752. package/npm-shrinkwrap.json +211 -232
  753. package/package.json +8 -8
  754. package/dist/builtin/i-have-adhd/CHANGELOG.md +0 -30
  755. package/dist/builtin/i-have-adhd/LICENSE +0 -21
  756. package/dist/builtin/i-have-adhd/README.md +0 -18
  757. package/dist/builtin/i-have-adhd/index.ts +0 -238
  758. package/dist/builtin/i-have-adhd/package.json +0 -56
  759. package/dist/builtin/i-have-adhd/skills/i-have-adhd/SKILL.md +0 -140
  760. package/dist/builtin/workflows/builtin/open-claude-design-feedback.ts +0 -359
  761. package/dist/builtin/workflows/skills/impeccable/scripts/live/ui-core.mjs +0 -180
  762. package/docs/i-have-adhd.md +0 -36
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-extension-custom-ui.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-extension-custom-ui.ts"],"names":[],"mappings":"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","sourcesContent":["import { InteractiveModeBase } from \"./interactive-mode-base.ts\";\nimport {\n\ttype Component,\n\ttype KeybindingsManager,\n\ttype OverlayHandle,\n\ttype OverlayOptions,\n\tText,\n\ttype Theme,\n\ttype TUI,\n\ttheme,\n} from \"./interactive-mode-deps.ts\";\n\nInteractiveModeBase.prototype.showExtensionNotify = function (\n\tthis: InteractiveModeBase,\n\tmessage: string,\n\ttype?: \"info\" | \"warning\" | \"error\",\n): void {\n\tif (type === \"error\") {\n\t\tthis.showError(message);\n\t} else if (type === \"warning\") {\n\t\tthis.showWarning(message);\n\t} else {\n\t\tthis.showStatus(message);\n\t}\n};\n\nInteractiveModeBase.prototype.showExtensionCustom = async function <T>(\n\tthis: InteractiveModeBase,\n\tfactory: (\n\t\ttui: TUI,\n\t\ttheme: Theme,\n\t\tkeybindings: KeybindingsManager,\n\t\tdone: (result: T) => void,\n\t) => (Component & { dispose?(): void }) | Promise<Component & { dispose?(): void }>,\n\toptions?: {\n\t\toverlay?: boolean;\n\t\tdeferInlineCustomUiFocus?: boolean;\n\t\thandlesInternalUiAction?: boolean;\n\t\tsignal?: AbortSignal;\n\t\toverlayOptions?: OverlayOptions | (() => OverlayOptions);\n\t\tonHandle?: (handle: OverlayHandle) => void;\n\t},\n): Promise<T> {\n\tconst savedText = this.editor.getText();\n\tconst isOverlay = options?.overlay ?? false;\n\n\tconst restoreEditor = (focusEditor: boolean) => {\n\t\tthis.editorContainer.clear();\n\t\tthis.editorContainer.addChild(this.editor);\n\t\tthis.editor.setText(savedText);\n\t\t// Focus fence: a surviving overlay owns input, and taking it away to\n\t\t// \"restore\" the editor would dismiss a newer native dialog.\n\t\tif (focusEditor && !this.ui.hasOverlay()) this.ui.setFocus(this.editor);\n\t\tthis.ui.requestRender();\n\t};\n\n\treturn new Promise((resolve, reject) => {\n\t\tlet component: (Component & { dispose?(): void }) | undefined;\n\t\tlet closed = false;\n\t\tlet mounted = false;\n\t\tlet overlayHandle: OverlayHandle | undefined;\n\t\tlet releaseHostInlineCustomUi: (() => void) | undefined;\n\t\tlet releaseOverlayInlineCustomUiFocusDeferral: (() => void) | undefined;\n\n\t\tconst disposeComponent = () => {\n\t\t\ttry {\n\t\t\t\tcomponent?.dispose?.();\n\t\t\t} catch {\n\t\t\t\t/* ignore dispose errors */\n\t\t\t}\n\t\t};\n\n\t\tconst releaseHostCustomUi = () => {\n\t\t\tif (component !== undefined && this.pendingInlineCustomUiFocus === component) {\n\t\t\t\tthis.pendingInlineCustomUiFocus = undefined;\n\t\t\t\tthis.notifyHostCustomUiStateListeners();\n\t\t\t}\n\t\t\treleaseHostInlineCustomUi?.();\n\t\t};\n\n\t\tconst cleanupAbortListener = () => {\n\t\t\toptions?.signal?.removeEventListener(\"abort\", abortCustomUi);\n\t\t};\n\n\t\tconst closeMountedUi = () => {\n\t\t\tif (!mounted) return;\n\t\t\tif (isOverlay) {\n\t\t\t\treleaseOverlayInlineCustomUiFocusDeferral?.();\n\t\t\t\treleaseOverlayInlineCustomUiFocusDeferral = undefined;\n\t\t\t\t// Hide THIS overlay, not whatever is on top: during engine-death\n\t\t\t\t// teardown an unrelated native overlay can be above this one, and the\n\t\t\t\t// generic top-overlay call would close that instead.\n\t\t\t\tif (overlayHandle) overlayHandle.hide();\n\t\t\t\telse this.ui.hideOverlay();\n\t\t\t} else {\n\t\t\t\trestoreEditor(!this.shouldDeferInlineCustomUiFocus() && this.pendingInlineCustomUiFocus !== component);\n\t\t\t}\n\t\t};\n\n\t\tconst close = (result: T) => {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tcleanupAbortListener();\n\t\t\tcloseMountedUi();\n\t\t\tdisposeComponent();\n\t\t\treleaseHostCustomUi();\n\t\t\tresolve(result);\n\t\t};\n\n\t\tconst rejectAndClose = (reason: unknown) => {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tcleanupAbortListener();\n\t\t\tcloseMountedUi();\n\t\t\tdisposeComponent();\n\t\t\treleaseHostCustomUi();\n\t\t\treject(reason);\n\t\t};\n\n\t\tfunction abortCustomUi(): void {\n\t\t\trejectAndClose(options?.signal?.reason ?? new Error(\"Extension custom UI aborted\"));\n\t\t}\n\n\t\tif (options?.signal?.aborted) {\n\t\t\tabortCustomUi();\n\t\t\treturn;\n\t\t}\n\t\treleaseHostInlineCustomUi = isOverlay ? undefined : this.beginHostInlineCustomUi();\n\t\tif (options?.signal?.aborted) {\n\t\t\tabortCustomUi();\n\t\t\treturn;\n\t\t}\n\t\toptions?.signal?.addEventListener(\"abort\", abortCustomUi, { once: true });\n\n\t\tlet factoryResult: (Component & { dispose?(): void }) | Promise<Component & { dispose?(): void }>;\n\t\ttry {\n\t\t\tfactoryResult = factory(this.ui, theme, this.keybindings, close);\n\t\t} catch (err) {\n\t\t\trejectAndClose(err);\n\t\t\treturn;\n\t\t}\n\n\t\tPromise.resolve(factoryResult)\n\t\t\t.then((c) => {\n\t\t\t\tif (closed) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tc.dispose?.();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t/* ignore dispose errors */\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcomponent = c;\n\t\t\t\tif (options?.handlesInternalUiAction === true) {\n\t\t\t\t\t(component as Component & { handlesInternalUiAction?: boolean }).handlesInternalUiAction = true;\n\t\t\t\t}\n\t\t\t\tif (isOverlay) {\n\t\t\t\t\t// Resolve overlay options - can be static or dynamic function\n\t\t\t\t\tconst resolveOptions = (): OverlayOptions | undefined => {\n\t\t\t\t\t\tif (options?.overlayOptions) {\n\t\t\t\t\t\t\tconst opts =\n\t\t\t\t\t\t\t\ttypeof options.overlayOptions === \"function\"\n\t\t\t\t\t\t\t\t\t? options.overlayOptions()\n\t\t\t\t\t\t\t\t\t: options.overlayOptions;\n\t\t\t\t\t\t\treturn opts;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Fallback: use component's width property if available\n\t\t\t\t\t\tconst w = (component as { width?: number } | undefined)?.width;\n\t\t\t\t\t\treturn w ? { width: w } : undefined;\n\t\t\t\t\t};\n\t\t\t\t\tconst handle = this.ui.showOverlay(component, resolveOptions());\n\t\t\t\t\toverlayHandle = handle;\n\t\t\t\t\tmounted = true;\n\t\t\t\t\tif (options?.deferInlineCustomUiFocus) {\n\t\t\t\t\t\tlet releaseDeferral: (() => void) | undefined = this.beginInlineCustomUiFocusDeferral();\n\t\t\t\t\t\treleaseOverlayInlineCustomUiFocusDeferral = () => {\n\t\t\t\t\t\t\treleaseDeferral?.();\n\t\t\t\t\t\t\treleaseDeferral = undefined;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst release = () => {\n\t\t\t\t\t\t\treleaseOverlayInlineCustomUiFocusDeferral?.();\n\t\t\t\t\t\t\treleaseOverlayInlineCustomUiFocusDeferral = undefined;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst wrappedHandle: OverlayHandle = {\n\t\t\t\t\t\t\thide: () => {\n\t\t\t\t\t\t\t\trelease();\n\t\t\t\t\t\t\t\thandle.hide();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsetHidden: (hidden) => {\n\t\t\t\t\t\t\t\tif (hidden) release();\n\t\t\t\t\t\t\t\thandle.setHidden(hidden);\n\t\t\t\t\t\t\t\tif (!hidden && releaseDeferral === undefined) {\n\t\t\t\t\t\t\t\t\treleaseDeferral = this.beginInlineCustomUiFocusDeferral();\n\t\t\t\t\t\t\t\t\treleaseOverlayInlineCustomUiFocusDeferral = () => {\n\t\t\t\t\t\t\t\t\t\treleaseDeferral?.();\n\t\t\t\t\t\t\t\t\t\treleaseDeferral = undefined;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tisHidden: () => handle.isHidden(),\n\t\t\t\t\t\t\tfocus: () => handle.focus(),\n\t\t\t\t\t\t\tunfocus: (unfocusOptions) => handle.unfocus(unfocusOptions),\n\t\t\t\t\t\t\tisFocused: () => handle.isFocused(),\n\t\t\t\t\t\t};\n\t\t\t\t\t\t// Expose handle to caller for visibility control\n\t\t\t\t\t\toptions?.onHandle?.(wrappedHandle);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Expose handle to caller for visibility control\n\t\t\t\t\t\toptions?.onHandle?.(handle);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.disposeActiveSelector();\n\t\t\t\t\tthis.editorContainer.clear();\n\t\t\t\t\tthis.editorContainer.addChild(component);\n\t\t\t\t\tif (this.shouldDeferInlineCustomUiFocus()) {\n\t\t\t\t\t\tthis.pendingInlineCustomUiFocus = component;\n\t\t\t\t\t\tthis.notifyHostCustomUiStateListeners();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.ui.setFocus(component);\n\t\t\t\t\t}\n\t\t\t\t\tmounted = true;\n\t\t\t\t\tthis.ui.requestRender();\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\trejectAndClose(err);\n\t\t\t});\n\t});\n};\n\nInteractiveModeBase.prototype.showExtensionError = function (\n\tthis: InteractiveModeBase,\n\textensionPath: string,\n\terror: string,\n\tstack?: string,\n): void {\n\tconst errorMsg = `Extension \"${extensionPath}\" error: ${error}`;\n\tconst errorText = new Text(theme.fg(\"error\", errorMsg), 1, 0);\n\tthis.chatContainer.addChild(errorText);\n\tif (stack) {\n\t\t// Show stack trace in dim color, indented\n\t\tconst stackLines = stack\n\t\t\t.split(\"\\n\")\n\t\t\t.slice(1) // Skip first line (duplicates error message)\n\t\t\t.map((line) => theme.fg(\"dim\", ` ${line.trim()}`))\n\t\t\t.join(\"\\n\");\n\t\tif (stackLines) {\n\t\t\tthis.chatContainer.addChild(new Text(stackLines, 1, 0));\n\t\t}\n\t}\n\tthis.ui.requestRender();\n};\n"]}
1
+ {"version":3,"file":"interactive-extension-custom-ui.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-extension-custom-ui.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tReservedBottomOverlay,\n\ttype TranscriptOverlayIntersection,\n\tTranscriptOverlayReserve,\n\ttranscriptOverlayIntersection,\n\ttype WrappedOverlayComponent,\n} from \"./components/reserved-bottom-overlay.ts\";\nimport { InteractiveModeBase, isFullscreenTranscriptScrollAction } from \"./interactive-mode-base.ts\";\nimport {\n\ttype Component,\n\ttype KeybindingsManager,\n\ttype OverlayHandle,\n\ttype OverlayOptions,\n\tText,\n\ttype Theme,\n\ttype TUI,\n\ttheme,\n} from \"./interactive-mode-deps.ts\";\nimport { isMouseWheelInput, isOverlayMounted } from \"./interactive-tui.ts\";\n\nfunction validateReservedBottomOverlayOptions(options: OverlayOptions | undefined): void {\n\tconst anchor = options?.anchor;\n\tif (anchor !== \"bottom-left\" && anchor !== \"bottom-center\" && anchor !== \"bottom-right\") {\n\t\tthrow new Error(\n\t\t\t\"reserveTranscriptRows requires an explicit bottom anchor: bottom-left, bottom-center, or bottom-right\",\n\t\t);\n\t}\n\tif (options?.row !== undefined) {\n\t\tthrow new Error(\"reserveTranscriptRows does not support overlayOptions.row\");\n\t}\n\tif (options?.offsetY !== undefined && options.offsetY !== 0) {\n\t\tthrow new Error(\"reserveTranscriptRows does not support a nonzero overlayOptions.offsetY\");\n\t}\n}\n\nInteractiveModeBase.prototype.showExtensionNotify = function (\n\tthis: InteractiveModeBase,\n\tmessage: string,\n\ttype?: \"info\" | \"warning\" | \"error\",\n): void {\n\tif (type === \"error\") {\n\t\tthis.showError(message);\n\t} else if (type === \"warning\") {\n\t\tthis.showWarning(message);\n\t} else {\n\t\tthis.showStatus(message);\n\t}\n};\n\nInteractiveModeBase.prototype.showExtensionCustom = async function <T>(\n\tthis: InteractiveModeBase,\n\tfactory: (\n\t\ttui: TUI,\n\t\ttheme: Theme,\n\t\tkeybindings: KeybindingsManager,\n\t\tdone: (result: T) => void,\n\t) => (Component & { dispose?(): void }) | Promise<Component & { dispose?(): void }>,\n\toptions?: {\n\t\toverlay?: boolean;\n\t\tdeferInlineCustomUiFocus?: boolean;\n\t\thandlesInternalUiAction?: boolean;\n\t\treserveTranscriptRows?: boolean;\n\t\tsignal?: AbortSignal;\n\t\toverlayOptions?: OverlayOptions | (() => OverlayOptions);\n\t\tonHandle?: (handle: OverlayHandle) => void;\n\t},\n): Promise<T> {\n\tconst savedText = this.editor.getText();\n\tconst isOverlay = options?.overlay ?? false;\n\n\tconst restoreEditor = (focusEditor: boolean) => {\n\t\tthis.editorContainer.clear();\n\t\tthis.editorContainer.addChild(this.editor);\n\t\tthis.editor.setText(savedText);\n\t\t// Focus fence: a surviving overlay owns input, and taking it away to\n\t\t// \"restore\" the editor would dismiss a newer native dialog.\n\t\tif (focusEditor && !this.ui.hasOverlay()) this.ui.setFocus(this.editor);\n\t\tthis.ui.requestRender();\n\t};\n\n\treturn new Promise((resolve, reject) => {\n\t\tlet component: (Component & { dispose?(): void }) | undefined;\n\t\tlet closed = false;\n\t\tlet mounted = false;\n\t\tlet overlayHandle: OverlayHandle | undefined;\n\t\tlet releaseHostInlineCustomUi: (() => void) | undefined;\n\t\tlet releaseOverlayInlineCustomUiFocusDeferral: (() => void) | undefined;\n\t\tlet transcriptReserveCoordinator: TranscriptOverlayReserve | undefined;\n\t\tlet releaseTranscriptReserveRegistration: (() => void) | undefined;\n\n\t\tconst disposeComponent = () => {\n\t\t\ttry {\n\t\t\t\tcomponent?.dispose?.();\n\t\t\t} catch {\n\t\t\t\t/* ignore dispose errors */\n\t\t\t}\n\t\t};\n\n\t\tconst releaseHostCustomUi = () => {\n\t\t\tif (component !== undefined && this.pendingInlineCustomUiFocus === component) {\n\t\t\t\tthis.pendingInlineCustomUiFocus = undefined;\n\t\t\t\tthis.notifyHostCustomUiStateListeners();\n\t\t\t}\n\t\t\treleaseHostInlineCustomUi?.();\n\t\t};\n\n\t\tconst cleanupAbortListener = () => {\n\t\t\toptions?.signal?.removeEventListener(\"abort\", abortCustomUi);\n\t\t};\n\n\t\tconst releaseTranscriptReserve = () => {\n\t\t\tconst coordinator = transcriptReserveCoordinator;\n\t\t\treleaseTranscriptReserveRegistration?.();\n\t\t\treleaseTranscriptReserveRegistration = undefined;\n\t\t\ttranscriptReserveCoordinator = undefined;\n\t\t\tif (!coordinator) return;\n\t\t\tif (coordinator.empty) {\n\t\t\t\tthis.documentContainer.removeChild(coordinator);\n\t\t\t\tif (this.transcriptOverlayReserve === coordinator) this.transcriptOverlayReserve = undefined;\n\t\t\t}\n\t\t\tthis.ui.requestRender();\n\t\t};\n\n\t\tconst closeMountedUi = () => {\n\t\t\tif (!mounted) return;\n\t\t\tif (isOverlay) {\n\t\t\t\treleaseOverlayInlineCustomUiFocusDeferral?.();\n\t\t\t\treleaseOverlayInlineCustomUiFocusDeferral = undefined;\n\t\t\t\treleaseTranscriptReserve();\n\t\t\t\t// Hide THIS overlay, not whatever is on top: during engine-death\n\t\t\t\t// teardown an unrelated native overlay can be above this one, and the\n\t\t\t\t// generic top-overlay call would close that instead.\n\t\t\t\tif (overlayHandle) overlayHandle.hide();\n\t\t\t\telse this.ui.hideOverlay();\n\t\t\t} else {\n\t\t\t\trestoreEditor(!this.shouldDeferInlineCustomUiFocus() && this.pendingInlineCustomUiFocus !== component);\n\t\t\t}\n\t\t};\n\n\t\tconst close = (result: T) => {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tcleanupAbortListener();\n\t\t\tcloseMountedUi();\n\t\t\tdisposeComponent();\n\t\t\treleaseHostCustomUi();\n\t\t\tresolve(result);\n\t\t};\n\n\t\tconst rejectAndClose = (reason: unknown) => {\n\t\t\tif (closed) return;\n\t\t\tclosed = true;\n\t\t\tcleanupAbortListener();\n\t\t\tcloseMountedUi();\n\t\t\tdisposeComponent();\n\t\t\treleaseHostCustomUi();\n\t\t\treject(reason);\n\t\t};\n\n\t\tfunction abortCustomUi(): void {\n\t\t\trejectAndClose(options?.signal?.reason ?? new Error(\"Extension custom UI aborted\"));\n\t\t}\n\n\t\tif (options?.signal?.aborted) {\n\t\t\tabortCustomUi();\n\t\t\treturn;\n\t\t}\n\t\treleaseHostInlineCustomUi = isOverlay ? undefined : this.beginHostInlineCustomUi();\n\t\tif (options?.signal?.aborted) {\n\t\t\tabortCustomUi();\n\t\t\treturn;\n\t\t}\n\t\toptions?.signal?.addEventListener(\"abort\", abortCustomUi, { once: true });\n\n\t\tlet factoryResult: (Component & { dispose?(): void }) | Promise<Component & { dispose?(): void }>;\n\t\ttry {\n\t\t\tfactoryResult = factory(this.ui, theme, this.keybindings, close);\n\t\t} catch (err) {\n\t\t\trejectAndClose(err);\n\t\t\treturn;\n\t\t}\n\n\t\tPromise.resolve(factoryResult)\n\t\t\t.then((c) => {\n\t\t\t\tif (closed) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tc.dispose?.();\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t/* ignore dispose errors */\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tcomponent = c;\n\t\t\t\tif (options?.handlesInternalUiAction === true) {\n\t\t\t\t\t(component as Component & { handlesInternalUiAction?: boolean }).handlesInternalUiAction = true;\n\t\t\t\t}\n\t\t\t\tif (isOverlay) {\n\t\t\t\t\t// Resolve overlay options - can be static or dynamic function\n\t\t\t\t\tconst resolveOptions = (): OverlayOptions | undefined => {\n\t\t\t\t\t\tif (options?.overlayOptions) {\n\t\t\t\t\t\t\tconst opts =\n\t\t\t\t\t\t\t\ttypeof options.overlayOptions === \"function\"\n\t\t\t\t\t\t\t\t\t? options.overlayOptions()\n\t\t\t\t\t\t\t\t\t: options.overlayOptions;\n\t\t\t\t\t\t\treturn opts;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Fallback: use component's width property if available\n\t\t\t\t\t\tconst w = (component as { width?: number } | undefined)?.width;\n\t\t\t\t\t\treturn w ? { width: w } : undefined;\n\t\t\t\t\t};\n\t\t\t\t\t// A reserving overlay is bounded so a transcript strip always\n\t\t\t\t\t// survives, and the rows it still covers are added to the end of\n\t\t\t\t\t// the document so the scroll clamp can raise them into that strip.\n\t\t\t\t\tconst resolvedOverlayOptions = resolveOptions();\n\t\t\t\t\tlet mountedOverlayOptions = resolvedOverlayOptions;\n\t\t\t\t\tlet mountedComponent = component;\n\t\t\t\t\tlet pendingReserve: (() => TranscriptOverlayIntersection | undefined) | undefined;\n\t\t\t\t\tif (options?.reserveTranscriptRows === true) {\n\t\t\t\t\t\tvalidateReservedBottomOverlayOptions(resolvedOverlayOptions);\n\t\t\t\t\t\t// `custom()` documents the richer `ExtensionCustomComponent`\n\t\t\t\t\t\t// contract; this signature still names pi-tui's narrower one.\n\t\t\t\t\t\tconst bounded = new ReservedBottomOverlay(\n\t\t\t\t\t\t\tcomponent as WrappedOverlayComponent,\n\t\t\t\t\t\t\t() => this.ui.terminal.rows,\n\t\t\t\t\t\t\tresolvedOverlayOptions?.margin,\n\t\t\t\t\t\t\tresolvedOverlayOptions?.maxHeight,\n\t\t\t\t\t\t\t(data) => isFullscreenTranscriptScrollAction(data, this.keybindings) || isMouseWheelInput(data),\n\t\t\t\t\t\t\t() => this.ui.requestRender(),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tmountedComponent = bounded;\n\t\t\t\t\t\tif (resolvedOverlayOptions?.maxHeight !== undefined) {\n\t\t\t\t\t\t\tmountedOverlayOptions = { ...resolvedOverlayOptions };\n\t\t\t\t\t\t\tdelete mountedOverlayOptions.maxHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// A raw host reset can remove the exact overlay without touching its\n\t\t\t\t\t\t// handle. Stop reserving in that frame, then remove the registration\n\t\t\t\t\t\t// after the document render traversal finishes.\n\t\t\t\t\t\tlet removalObserved = false;\n\t\t\t\t\t\tconst overlayShowing = (): boolean => {\n\t\t\t\t\t\t\tif (!isOverlayMounted(this.ui, mountedComponent)) {\n\t\t\t\t\t\t\t\tif (!removalObserved) {\n\t\t\t\t\t\t\t\t\tremovalObserved = true;\n\t\t\t\t\t\t\t\t\tqueueMicrotask(releaseTranscriptReserve);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (overlayHandle === undefined || overlayHandle.isHidden()) return false;\n\t\t\t\t\t\t\tconst visible = resolvedOverlayOptions?.visible;\n\t\t\t\t\t\t\treturn visible === undefined ? true : visible(this.ui.terminal.columns, this.ui.terminal.rows);\n\t\t\t\t\t\t};\n\t\t\t\t\t\tpendingReserve = () =>\n\t\t\t\t\t\t\toverlayShowing()\n\t\t\t\t\t\t\t\t? transcriptOverlayIntersection(\n\t\t\t\t\t\t\t\t\t\tbounded.renderedHeight,\n\t\t\t\t\t\t\t\t\t\tthis.ui.terminal.rows,\n\t\t\t\t\t\t\t\t\t\tthis.transcriptScrollView?.viewportHeight ?? 0,\n\t\t\t\t\t\t\t\t\t\tresolvedOverlayOptions?.margin,\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t}\n\t\t\t\t\tconst handle = this.ui.showOverlay(mountedComponent, mountedOverlayOptions);\n\t\t\t\t\toverlayHandle = handle;\n\t\t\t\t\tmounted = true;\n\t\t\t\t\t// Register only once the overlay is really up and `mounted` is\n\t\t\t\t\t// set: a throw before this point must not leave a registry entry\n\t\t\t\t\t// or blank-row component in the transcript document.\n\t\t\t\t\tif (pendingReserve) {\n\t\t\t\t\t\tlet coordinator = this.transcriptOverlayReserve;\n\t\t\t\t\t\tif (!coordinator) {\n\t\t\t\t\t\t\tcoordinator = new TranscriptOverlayReserve(() => this.transcriptScrollView?.viewportHeight ?? 0);\n\t\t\t\t\t\t\tthis.transcriptOverlayReserve = coordinator;\n\t\t\t\t\t\t\ttranscriptReserveCoordinator = coordinator;\n\t\t\t\t\t\t\tthis.documentContainer.addChild(coordinator);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttranscriptReserveCoordinator = coordinator;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treleaseTranscriptReserveRegistration = coordinator.register(pendingReserve);\n\t\t\t\t\t}\n\t\t\t\t\tlet releaseDeferral: (() => void) | undefined;\n\t\t\t\t\tif (options?.deferInlineCustomUiFocus) {\n\t\t\t\t\t\treleaseDeferral = this.beginInlineCustomUiFocusDeferral();\n\t\t\t\t\t\treleaseOverlayInlineCustomUiFocusDeferral = () => {\n\t\t\t\t\t\t\treleaseDeferral?.();\n\t\t\t\t\t\t\treleaseDeferral = undefined;\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\tif (options?.deferInlineCustomUiFocus || pendingReserve) {\n\t\t\t\t\t\tconst release = () => {\n\t\t\t\t\t\t\treleaseOverlayInlineCustomUiFocusDeferral?.();\n\t\t\t\t\t\t\treleaseOverlayInlineCustomUiFocusDeferral = undefined;\n\t\t\t\t\t\t};\n\t\t\t\t\t\tconst wrappedHandle: OverlayHandle = {\n\t\t\t\t\t\t\thide: () => {\n\t\t\t\t\t\t\t\trelease();\n\t\t\t\t\t\t\t\treleaseTranscriptReserve();\n\t\t\t\t\t\t\t\thandle.hide();\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsetHidden: (hidden) => {\n\t\t\t\t\t\t\t\tif (hidden) release();\n\t\t\t\t\t\t\t\thandle.setHidden(hidden);\n\t\t\t\t\t\t\t\tif (!hidden && options?.deferInlineCustomUiFocus && releaseDeferral === undefined) {\n\t\t\t\t\t\t\t\t\treleaseDeferral = this.beginInlineCustomUiFocusDeferral();\n\t\t\t\t\t\t\t\t\treleaseOverlayInlineCustomUiFocusDeferral = () => {\n\t\t\t\t\t\t\t\t\t\treleaseDeferral?.();\n\t\t\t\t\t\t\t\t\t\treleaseDeferral = undefined;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tisHidden: () => handle.isHidden(),\n\t\t\t\t\t\t\tfocus: () => handle.focus(),\n\t\t\t\t\t\t\tunfocus: (unfocusOptions) => handle.unfocus(unfocusOptions),\n\t\t\t\t\t\t\tisFocused: () => handle.isFocused(),\n\t\t\t\t\t\t};\n\t\t\t\t\t\toverlayHandle = wrappedHandle;\n\t\t\t\t\t\toptions?.onHandle?.(wrappedHandle);\n\t\t\t\t\t} else {\n\t\t\t\t\t\toptions?.onHandle?.(handle);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.disposeActiveSelector();\n\t\t\t\t\tthis.editorContainer.clear();\n\t\t\t\t\tthis.editorContainer.addChild(component);\n\t\t\t\t\tif (this.shouldDeferInlineCustomUiFocus()) {\n\t\t\t\t\t\tthis.pendingInlineCustomUiFocus = component;\n\t\t\t\t\t\tthis.notifyHostCustomUiStateListeners();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.ui.setFocus(component);\n\t\t\t\t\t}\n\t\t\t\t\tmounted = true;\n\t\t\t\t\tthis.ui.requestRender();\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\trejectAndClose(err);\n\t\t\t});\n\t});\n};\n\nInteractiveModeBase.prototype.showExtensionError = function (\n\tthis: InteractiveModeBase,\n\textensionPath: string,\n\terror: string,\n\tstack?: string,\n): void {\n\tconst errorMsg = `Extension \"${extensionPath}\" error: ${error}`;\n\tconst errorText = new Text(theme.fg(\"error\", errorMsg), 1, 0);\n\tthis.chatContainer.addChild(errorText);\n\tif (stack) {\n\t\t// Show stack trace in dim color, indented\n\t\tconst stackLines = stack\n\t\t\t.split(\"\\n\")\n\t\t\t.slice(1) // Skip first line (duplicates error message)\n\t\t\t.map((line) => theme.fg(\"dim\", ` ${line.trim()}`))\n\t\t\t.join(\"\\n\");\n\t\tif (stackLines) {\n\t\t\tthis.chatContainer.addChild(new Text(stackLines, 1, 0));\n\t\t}\n\t}\n\tthis.ui.requestRender();\n};\n"]}
@@ -5,23 +5,56 @@
5
5
  import { type ScrollView, type TuiInputListener } from "@earendil-works/pi-tui";
6
6
  import type { AgentSessionQueuePauseControl } from "../../core/agent-session-methods.ts";
7
7
  import type { MarkdownTransformer } from "../../core/extensions/types.ts";
8
- import type { MermaidRenderingMode } from "../../core/settings-manager.ts";
8
+ import type { FullscreenExitOutput, MermaidRenderingMode } from "../../core/settings-manager.ts";
9
9
  import type { EarlyInputSnapshot } from "../../main-early-input.ts";
10
10
  import type { RemoteToolExecutionComponent } from "../interactive-engine/remote-renderer.ts";
11
11
  import { KeybindingsReloadCoordinator } from "../rpc/rpc-keybindings-reload.ts";
12
12
  import type { AtomicWorkingLoader } from "./components/atomic-working-status.ts";
13
+ import type { TranscriptOverlayReserve } from "./components/reserved-bottom-overlay.ts";
13
14
  import { type AgentSession, type AgentSessionRuntime, type AssistantMessage, type AssistantMessageComponent, type AutocompleteProvider, type AutocompleteProviderFactory, type BashExecutionComponent, type Component, Container, type CountdownTimer, CustomEditor, type EditorComponent, type EditorFactory, type ExtensionEditorComponent, type ExtensionInputComponent, type ExtensionSelectorComponent, FooterComponent, FooterDataProvider, type HostCustomUiStateListener, InteractiveThemeController, KeybindingsManager, type Loader, type LoaderIndicatorOptions, type Spacer, type Text, type ToolExecutionComponent, type TUI, UsageMeterComponent } from "./interactive-mode-deps.ts";
14
15
  import "./interactive-mode-surface.ts";
15
16
  import type { CompactionQueuedMessage, InteractiveModeOptions } from "./interactive-mode-types.ts";
16
17
  import type { InteractiveSubmission } from "./interactive-submission.ts";
18
+ export declare function isFullscreenViewportAction(data: string, keybindings: KeybindingsManager): boolean;
19
+ /**
20
+ * Whether a key scrolls the transcript. A reserving overlay — the
21
+ * `ask_user_question` dialog, an extension component with
22
+ * `reserveTranscriptRows` — declines these so the strip above it still pages
23
+ * and jumps (#2378), and keeps everything else.
24
+ */
25
+ export declare function isFullscreenTranscriptScrollAction(data: string, keybindings: KeybindingsManager): boolean;
17
26
  /**
18
27
  * Decide whether the fullscreen viewport should run before the focused
19
28
  * component. `isMouseInput` is classified by pi-tui's own mouse predicate in
20
29
  * `AtomicTuiAltScreen`, so this policy does not duplicate terminal grammars.
21
30
  * Mouse deferral is limited to actual overlays so inline components do not
22
31
  * disable pi-tui's application-owned transcript selection path.
32
+ *
33
+ * **Who owns viewport keys while an overlay is focused.** pi-tui 0.84.2 added
34
+ * `shouldDeferViewportInputToOverlay()` (upstream #7894) and answers "the
35
+ * overlay". Atomic answers "the overlay first, the transcript with whatever it
36
+ * declines" (#2378 / PR #2381): the actions in `FULLSCREEN_VIEWPORT_ACTIONS`
37
+ * and wheel reports are offered to the focused overlay, and
38
+ * `AtomicTuiAltScreen` replays what it does not consume into pi-tui's viewport
39
+ * listener. Atomic's answer stands, because a mounted dialog that keeps its
40
+ * selection keys must not also freeze the transcript behind it.
41
+ *
42
+ * **The list covers every `tui.altScreen.*` scroll action pi-tui defines.**
43
+ * An action a focused overlay declines still reaches the transcript, so the
44
+ * shortcut is never simply lost.
45
+ *
46
+ * **A focused overlay with no `handleInput` is still an overlay.** The handler
47
+ * is optional — `ExtensionCustomComponent` marks it `handleInput?` and
48
+ * `docs/tui.md` documents it as optional — and a component that cannot answer
49
+ * declines by definition. Answering "the viewport owns it" for that shape
50
+ * would hand the key to pi-tui, whose native deferral then drops it because an
51
+ * overlay holds focus, so the transcript would freeze behind a component that
52
+ * never asked for the key. A handler-less overlay therefore takes the same
53
+ * route as one that returns `false`: nothing to offer, then replay. Only a
54
+ * focused component that is *not* an overlay keeps the shortcut, because
55
+ * pi-tui defers nothing to it.
23
56
  */
24
- export declare function shouldHandleFullscreenViewportInput(focused: Component | null, editor: Component, data: string, isMouseInput: boolean, focusedIsOverlay: boolean, keybindings: KeybindingsManager): boolean;
57
+ export declare function shouldHandleFullscreenViewportInput(focused: Component | null, editor: Component, data: string, isMouseInput: boolean, focusedIsOverlay: boolean, keybindings: KeybindingsManager, _focusedIsViewportSearch?: boolean): boolean;
25
58
  export declare function seedStartupInput(pendingUserInputs: InteractiveSubmission[], editor: {
26
59
  setText(text: string): void;
27
60
  }, startupInput: EarlyInputSnapshot | undefined, startupReplayInputs?: string[], setStartupDraftText?: (text: string) => void, setStartupReplayActiveInput?: (text: string) => void): void;
@@ -93,6 +126,10 @@ export declare class InteractiveModeBase {
93
126
  autoTrustOnReloadCwd: string | undefined;
94
127
  lastStatusSpacer: Spacer | undefined;
95
128
  lastStatusText: Text | undefined;
129
+ /** Leading spacer added once for the managed-tool startup status block. */
130
+ managedToolStatusStarted: boolean;
131
+ /** Invalidates readiness callbacks after the transcript is rebuilt for another session. */
132
+ managedToolStatusGeneration: number;
96
133
  streamingComponent: AssistantMessageComponent | undefined;
97
134
  streamingMessage: AssistantMessage | undefined;
98
135
  pendingTools: Map<string, RemoteToolExecutionComponent | ToolExecutionComponent>;
@@ -136,6 +173,7 @@ export declare class InteractiveModeBase {
136
173
  deferredInlineCustomUiFocusDepth: number;
137
174
  pendingInlineCustomUiFocus: Component | undefined;
138
175
  hostCustomUiStateListeners: Set<HostCustomUiStateListener>;
176
+ transcriptOverlayReserve: TranscriptOverlayReserve | undefined;
139
177
  themeController: InteractiveThemeController;
140
178
  extensionWidgetsAbove: Map<string, Component & {
141
179
  dispose?(): void;
@@ -172,7 +210,7 @@ export declare class InteractiveModeBase {
172
210
  onTuiRendererChange(listener: () => void): () => void;
173
211
  mountInteractiveTui(tui: TUI, components: readonly Component[]): void;
174
212
  private handleRightClickPaste;
175
- stopInteractiveTui(): void;
213
+ stopInteractiveTui(fullscreenExitOutput: FullscreenExitOutput): void;
176
214
  options: InteractiveModeOptions;
177
215
  constructor(runtimeHost: AgentSessionRuntime, options?: InteractiveModeOptions);
178
216
  static readonly MAX_WIDGET_LINES = 10;
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-mode-base.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"interactive-mode-base.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAA+B,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE7G,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,qCAAqC,CAAC;AACzF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACjG,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAIpE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AAC7F,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAEjF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACxF,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,sBAAsB,EAC3B,KAAK,SAAS,EACd,SAAS,EACT,KAAK,cAAc,EACnB,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAC/B,eAAe,EACf,kBAAkB,EAElB,KAAK,yBAAyB,EAC9B,0BAA0B,EAC1B,kBAAkB,EAClB,KAAK,MAAM,EACX,KAAK,sBAAsB,EAC3B,KAAK,MAAM,EAGX,KAAK,IAAI,EACT,KAAK,sBAAsB,EAC3B,KAAK,GAAG,EAER,mBAAmB,EAEnB,MAAM,4BAA4B,CAAC;AACpC,OAAoB,+BAA+B,CAAC;AACpD,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAEnG,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAyBzE,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,GAAG,OAAO,CAEjG;AAED;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,GAAG,OAAO,CAEzG;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,mCAAmC,CAClD,OAAO,EAAE,SAAS,GAAG,IAAI,EACzB,MAAM,EAAE,SAAS,EACjB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,OAAO,EACrB,gBAAgB,EAAE,OAAO,EACzB,WAAW,EAAE,kBAAkB,EAC/B,wBAAwB,UAAQ,GAC9B,OAAO,CAMT;AAOD,wBAAgB,gBAAgB,CAC/B,iBAAiB,EAAE,qBAAqB,EAAE,EAC1C,MAAM,EAAE;IAAE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACvC,YAAY,EAAE,kBAAkB,GAAG,SAAS,EAC5C,mBAAmB,GAAE,MAAM,EAAO,EAClC,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAC5C,2BAA2B,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAClD,IAAI,CAqBN;AAED,MAAM,WAAW,+BAA+B;IAC/C,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,qBAAa,mBAAmB;IAC/B,WAAW,EAAE,mBAAmB,CAAC;IAEjC,EAAE,EAAE,GAAG,CAAC;IACR,OAAO,CAAC,QAAQ,CAAiB;IAEjC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAexC;IACF,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAqE;IAC7G,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CACgB;IAE1D,yFAAyF;IACzF,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAMjD;IAED,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAEhC;IAEF,aAAa,EAAE,SAAS,CAAC;IACzB,iBAAiB,EAAE,SAAS,CAAC;IAE7B,oBAAoB,EAAE,UAAU,GAAG,SAAS,CAAC;IAE7C,oBAAoB,EAAE,SAAS,GAAG,SAAS,CAAC;IAE5C,2BAA2B,EAAE,SAAS,CAAC;IACvC,uBAAuB,EAAE,SAAS,CAAC;IACnC,wBAAwB,EAAE,SAAS,CAAC;IAEpC,eAAe,EAAE,SAAS,CAAC;IAE3B,aAAa,EAAE,YAAY,CAAC;IAE5B,MAAM,EAAE,eAAe,CAAC;IAExB,sBAAsB,EAAE,aAAa,GAAG,SAAS,CAAC;IAElD,oBAAoB,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAEvD,4BAA4B,EAAE,2BAA2B,EAAE,CAAM;IAEjE,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3B,eAAe,EAAE,SAAS,CAAC;IAE3B,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAC;IAExC,qBAAqB,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAEhD,MAAM,EAAE,eAAe,CAAC;IACxB,eAAe,EAAE,SAAS,CAAC;IAE3B,UAAU,EAAE,mBAAmB,CAAC;IAEhC,kBAAkB,EAAE,kBAAkB,CAAC;IAGvC,WAAW,EAAE,kBAAkB,CAAC;IAEhC,iBAAiB,EAAE,4BAA4B,CAAC;IAEhD,gCAAgC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;IAE1E,4BAA4B,EAAE,MAAM,IAAI,CAAY;IAEpD,OAAO,EAAE,MAAM,CAAC;IAEhB,aAAa,UAAS;IAEtB,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAE9D,iBAAiB,EAAE,qBAAqB,EAAE,CAAM;IAEhD,mBAAmB,EAAE,MAAM,EAAE,CAAM;IAEnC,wBAAwB,EAAE,MAAM,GAAG,SAAS,CAAa;IAEzD,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAa;IAEjD,2BAA2B,UAAS;IAEpC,0BAA0B,EAAE,MAAM,EAAE,CAAM;IAE1C,mCAAmC,6BAAoC;IAEvE,gBAAgB,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAAa;IAEvE,cAAc,EAAE,MAAM,GAAG,SAAS,CAAa;IAE/C,cAAc,UAAQ;IAEtB,uBAAuB,EAAE,sBAAsB,GAAG,SAAS,CAAa;IAExE,QAAQ,CAAC,qBAAqB,gBAAgB;IAE9C,QAAQ,CAAC,0BAA0B,iBAAiB;IAEpD,mBAAmB,SAAmC;IAEtD,cAAc,SAAK;IAEnB,cAAc,SAAK;IAEnB,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAa;IAElD,mBAAmB,UAAS;IAC5B,sBAAsB,UAAS;IAE/B,iCAAiC,UAAS;IAE1C,qBAAqB,UAAS;IAE9B,gCAAgC,UAAS;IAEzC,kCAAkC,EAAE,SAAS,EAAE,CAAM;IAErD,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IAGzC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAa;IAEjD,cAAc,EAAE,IAAI,GAAG,SAAS,CAAa;IAE7C,2EAA2E;IAC3E,wBAAwB,UAAS;IACjC,2FAA2F;IAC3F,2BAA2B,SAAK;IAGhC,kBAAkB,EAAE,yBAAyB,GAAG,SAAS,CAAa;IAEtE,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAa;IAG3D,YAAY,qEAA4E;IAGxF,kBAAkB,UAAS;IAG3B,iBAAiB,UAAS;IAC1B,SAAS,EAAE,CAAC,GAAG,CAAC,CAAK;IAErB,0BAA0B,EAAE,mBAAmB,CAG5C;IACH,8BAA8B,EAAE,oBAAoB,GAAG,SAAS,CAAC;IAGjE,aAAa,sBAA6B;IAG1C,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IAEzB,qBAAqB,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,CAAM;IAG9C,UAAU,UAAS;IAGnB,aAAa,EAAE,sBAAsB,GAAG,SAAS,CAAa;IAG9D,qBAAqB,EAAE,sBAAsB,EAAE,CAAM;IAGrD,oBAAoB,EAAE,mBAAmB,GAAG,SAAS,CAAa;IAElE,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;IAEzC,iFAAiF;IACjF,gCAAgC,UAAS;IAEzC,gEAAgE;IAChE,6BAA6B,UAAS;IAGtC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAa;IAC5C,cAAc,EAAE,MAAM,GAAG,SAAS,CAAa;IAE/C,cAAc,EAAE,cAAc,GAAG,SAAS,CAAa;IAEvD,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAGhC,wBAAwB,EAAE,uBAAuB,EAAE,CAAM;IAEzD,mFAAmF;IACnF,+BAA+B,UAAS;IAGxC,sBAAsB,UAAS;IAC/B,qBAAqB,UAAS;IAC9B,sBAAsB,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAa;IAE9D,yBAAyB,UAAS;IAElC,mBAAmB,UAAS;IAG5B,iBAAiB,UAAS;IAG1B,iBAAiB,EAAE,0BAA0B,GAAG,SAAS,CAAa;IAEtE,cAAc,EAAE,uBAAuB,GAAG,SAAS,CAAa;IAEhE,eAAe,EAAE,wBAAwB,GAAG,SAAS,CAAa;IAElE,qBAAqB,uCAA8C;IAEnE,mCAAmC,uCAA8C;IAEjF,0BAA0B,YAAiB,IAAI,EAAI;IAEnD,2BAA2B,SAAK;IAEhC,gCAAgC,SAAK;IAErC,0BAA0B,EAAE,SAAS,GAAG,SAAS,CAAa;IAE9D,0BAA0B,iCAAwC;IAElE,wBAAwB,EAAE,wBAAwB,GAAG,SAAS,CAAa;IAE3E,eAAe,EAAE,0BAA0B,CAAC;IAG5C,qBAAqB;oBAA6C,IAAI;OAAM;IAE5E,qBAAqB;oBAA6C,IAAI;OAAM;IAE5E,oBAAoB,EAAG,SAAS,CAAC;IAEjC,oBAAoB,EAAG,SAAS,CAAC;IAGjC,YAAY,EAAE,CAAC,SAAS,GAAG;QAAE,OAAO,CAAC,IAAI,IAAI,CAAA;KAAE,CAAC,GAAG,SAAS,CAAa;IAGzE,eAAe,EAAE,SAAS,CAAC;IAG3B,aAAa,EAAE,SAAS,GAAG,SAAS,CAAa;IAGjD,YAAY,EAAE,CAAC,SAAS,GAAG;QAAE,OAAO,CAAC,IAAI,IAAI,CAAA;KAAE,CAAC,GAAG,SAAS,CAAa;IAGzE,IAAI,OAAO,IAAI,YAAY,GAAG,6BAA6B,CAE1D;IAED,+EAA+E;IAC/E,IAAI,gBAAgB,IAAI,OAAO,CAE9B;IAED,IAAI,KAAK,kDAER;IAED,IAAI,cAAc,wDAEjB;IAED,IAAI,eAAe,kEAElB;IAED;;;;;;OAMG;IACH,qBAAqB,IAAI,IAAI,CAK5B;IAED,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAUzD;IAED,uBAAuB,IAAI,IAAI,CAK9B;IAED,mBAAmB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAGpD;IAED,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAMpE;YAEa,qBAAqB;IAcnC,kBAAkB,CAAC,oBAAoB,EAAE,oBAAoB,GAAG,IAAI,CAgBnE;IAEO,OAAO,EAAE,sBAAsB,CAAC;IAExC,YAAY,WAAW,EAAE,mBAAmB,EAAE,OAAO,GAAE,sBAA2B,EAsGjF;IAGD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,MAAM;IAEtC;;;;OAIG;IACH,cAAc,UAAS;CACvB"}
@@ -11,31 +11,73 @@ import { createMermaidMarkdownTransformer } from "./components/mermaid.js";
11
11
  import { Container, CustomEditor, FooterComponent, FooterDataProvider, getEditorTheme, InteractiveThemeController, KeybindingsManager, setKeybindings, setRegisteredThemes, theme, UsageMeterComponent, VERSION, } from "./interactive-mode-deps.js";
12
12
  import { StartupChatContainer } from "./interactive-startup-chat-container.js";
13
13
  import { createInteractiveTui, createInteractiveTuiReference, handleFocusedOverlayInternalUiAction, } from "./interactive-tui.js";
14
- const FULLSCREEN_VIEWPORT_ACTIONS = [
14
+ /** Move the transcript and nothing else: what a reserving overlay may release. */
15
+ const FULLSCREEN_TRANSCRIPT_SCROLL_ACTIONS = [
15
16
  "tui.altScreen.pageUp",
16
17
  "tui.altScreen.pageDown",
17
18
  "tui.altScreen.halfPageUp",
18
19
  "tui.altScreen.halfPageDown",
20
+ "tui.altScreen.lineUp",
21
+ "tui.altScreen.lineDown",
19
22
  "tui.altScreen.previousPrompt",
20
23
  "tui.altScreen.nextPrompt",
21
24
  "tui.altScreen.top",
22
25
  "tui.altScreen.bottom",
23
26
  ];
27
+ const FULLSCREEN_VIEWPORT_ACTIONS = FULLSCREEN_TRANSCRIPT_SCROLL_ACTIONS;
28
+ export function isFullscreenViewportAction(data, keybindings) {
29
+ return FULLSCREEN_VIEWPORT_ACTIONS.some((action) => keybindings.matches(data, action));
30
+ }
31
+ /**
32
+ * Whether a key scrolls the transcript. A reserving overlay — the
33
+ * `ask_user_question` dialog, an extension component with
34
+ * `reserveTranscriptRows` — declines these so the strip above it still pages
35
+ * and jumps (#2378), and keeps everything else.
36
+ */
37
+ export function isFullscreenTranscriptScrollAction(data, keybindings) {
38
+ return FULLSCREEN_TRANSCRIPT_SCROLL_ACTIONS.some((action) => keybindings.matches(data, action));
39
+ }
24
40
  /**
25
41
  * Decide whether the fullscreen viewport should run before the focused
26
42
  * component. `isMouseInput` is classified by pi-tui's own mouse predicate in
27
43
  * `AtomicTuiAltScreen`, so this policy does not duplicate terminal grammars.
28
44
  * Mouse deferral is limited to actual overlays so inline components do not
29
45
  * disable pi-tui's application-owned transcript selection path.
46
+ *
47
+ * **Who owns viewport keys while an overlay is focused.** pi-tui 0.84.2 added
48
+ * `shouldDeferViewportInputToOverlay()` (upstream #7894) and answers "the
49
+ * overlay". Atomic answers "the overlay first, the transcript with whatever it
50
+ * declines" (#2378 / PR #2381): the actions in `FULLSCREEN_VIEWPORT_ACTIONS`
51
+ * and wheel reports are offered to the focused overlay, and
52
+ * `AtomicTuiAltScreen` replays what it does not consume into pi-tui's viewport
53
+ * listener. Atomic's answer stands, because a mounted dialog that keeps its
54
+ * selection keys must not also freeze the transcript behind it.
55
+ *
56
+ * **The list covers every `tui.altScreen.*` scroll action pi-tui defines.**
57
+ * An action a focused overlay declines still reaches the transcript, so the
58
+ * shortcut is never simply lost.
59
+ *
60
+ * **A focused overlay with no `handleInput` is still an overlay.** The handler
61
+ * is optional — `ExtensionCustomComponent` marks it `handleInput?` and
62
+ * `docs/tui.md` documents it as optional — and a component that cannot answer
63
+ * declines by definition. Answering "the viewport owns it" for that shape
64
+ * would hand the key to pi-tui, whose native deferral then drops it because an
65
+ * overlay holds focus, so the transcript would freeze behind a component that
66
+ * never asked for the key. A handler-less overlay therefore takes the same
67
+ * route as one that returns `false`: nothing to offer, then replay. Only a
68
+ * focused component that is *not* an overlay keeps the shortcut, because
69
+ * pi-tui defers nothing to it.
30
70
  */
31
- export function shouldHandleFullscreenViewportInput(focused, editor, data, isMouseInput, focusedIsOverlay, keybindings) {
32
- if (focused === editor || !focused?.handleInput)
71
+ export function shouldHandleFullscreenViewportInput(focused, editor, data, isMouseInput, focusedIsOverlay, keybindings, _focusedIsViewportSearch = false) {
72
+ if (focused === editor || !focused)
73
+ return true;
74
+ if (!focused.handleInput && !focusedIsOverlay)
33
75
  return true;
34
76
  if (isMouseInput)
35
77
  return !focusedIsOverlay;
36
78
  if (focusedIsOverlay && keybindings.matches(data, "app.thinking.toggle"))
37
79
  return false;
38
- return !FULLSCREEN_VIEWPORT_ACTIONS.some((action) => keybindings.matches(data, action));
80
+ return !isFullscreenViewportAction(data, keybindings);
39
81
  }
40
82
  function isCommandLikeStartupInput(text) {
41
83
  const trimmed = text.trimStart();
@@ -154,14 +196,28 @@ export class InteractiveModeBase {
154
196
  // Clipboard paste is best-effort; permission and native-module failures are common.
155
197
  }
156
198
  }
157
- stopInteractiveTui() {
158
- while (this.renderer.hasOverlayEntries)
159
- this.renderer.hideOverlay();
160
- this.ui.stop();
199
+ stopInteractiveTui(fullscreenExitOutput) {
200
+ const isFullscreen = this.renderer.mode === "fullscreen";
201
+ if (isFullscreen && fullscreenExitOutput === "transcript") {
202
+ // Atomic has no regular renderer to switch into, so pi-tui's own
203
+ // exit paint is the only painter: its stop renders the layout root
204
+ // at natural height onto the main screen. The docked fullscreen
205
+ // layout squeezes its scroll view to `basis` (one row) at natural
206
+ // height, so hand it the document container directly — the exit
207
+ // paint then carries the whole transcript. Drop overlays first so
208
+ // what gets painted is the transcript, not the focused dialog.
209
+ while (this.renderer.hasOverlayEntries)
210
+ this.renderer.hideOverlay();
211
+ if (isViewportTUI(this.renderer))
212
+ this.renderer.setLayoutRoot(this.documentContainer);
213
+ }
214
+ // `resume-hint` keeps whatever the alternate screen held: the prior
215
+ // shell contents reappear and shutdown prints only the resume line.
216
+ this.ui.stop({ preserveScreen: isFullscreen && fullscreenExitOutput === "resume-hint" });
161
217
  }
162
218
  constructor(runtimeHost, options = {}) {
163
- this.shouldHandleViewportInput = (data, isMouseInput, focusedIsOverlay) => {
164
- return shouldHandleFullscreenViewportInput(this.renderer.getFocusedComponent(), this.editor, data, isMouseInput, focusedIsOverlay, this.keybindings);
219
+ this.shouldHandleViewportInput = (data, isMouseInput, focusedIsOverlay, focusedIsViewportSearch) => {
220
+ return shouldHandleFullscreenViewportInput(this.renderer.getFocusedComponent(), this.editor, data, isMouseInput, focusedIsOverlay, this.keybindings, focusedIsViewportSearch);
165
221
  };
166
222
  this.onOverlayUnhandledInput = (data) => this.handleOverlayUnhandledInput(data);
167
223
  this.onOverlayInternalUiAction = (url) => handleFocusedOverlayInternalUiAction(this.renderer, url);
@@ -197,6 +253,10 @@ export class InteractiveModeBase {
197
253
  // Status line tracking (for mutating immediately-sequential status updates)
198
254
  this.lastStatusSpacer = undefined;
199
255
  this.lastStatusText = undefined;
256
+ /** Leading spacer added once for the managed-tool startup status block. */
257
+ this.managedToolStatusStarted = false;
258
+ /** Invalidates readiness callbacks after the transcript is rebuilt for another session. */
259
+ this.managedToolStatusGeneration = 0;
200
260
  // Streaming message tracking
201
261
  this.streamingComponent = undefined;
202
262
  this.streamingMessage = undefined;
@@ -253,6 +313,7 @@ export class InteractiveModeBase {
253
313
  this.deferredInlineCustomUiFocusDepth = 0;
254
314
  this.pendingInlineCustomUiFocus = undefined;
255
315
  this.hostCustomUiStateListeners = new Set();
316
+ this.transcriptOverlayReserve = undefined;
256
317
  // Extension widgets (components rendered above/below the editor)
257
318
  this.extensionWidgetsAbove = new Map();
258
319
  this.extensionWidgetsBelow = new Map();
@@ -277,6 +338,9 @@ export class InteractiveModeBase {
277
338
  });
278
339
  this.runtimeHost.setRebindSession(async () => {
279
340
  await this.rebindCurrentSession();
341
+ // A rebound session can carry a different settings manager; re-apply
342
+ // the theme so the live selection tracks the session that is current.
343
+ await this.themeController.applyFromSettings();
280
344
  });
281
345
  this.version = VERSION;
282
346
  this.renderer = createInteractiveTui({
@@ -333,7 +397,12 @@ export class InteractiveModeBase {
333
397
  this.outputPad = this.settingsManager.getOutputPad();
334
398
  // Register themes from resource loader and initialize
335
399
  setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
336
- this.themeController = new InteractiveThemeController(this.ui, this.settingsManager, (message) => this.showError(message), () => this.updateEditorBorderColor());
400
+ this.themeController = new InteractiveThemeController(this.ui, {
401
+ getSettingsManager: () => this.settingsManager,
402
+ showError: (message) => this.showError(message),
403
+ onChanged: () => this.updateEditorBorderColor(),
404
+ initialThemeSetting: options.initialThemeSetting,
405
+ });
337
406
  this.disposeInteractiveEngineHost = attachInteractiveEngineHost(runtimeHost, this.createExtensionUIContext(), (diagnostic) => renderEngineDiagnostic(diagnostic, {
338
407
  stopWorkingLoader: () => this.stopWorkingLoader(),
339
408
  showStatus: (message) => this.showStatus(message),
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-mode-base.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-base.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared state and constructor wiring for interactive mode.\n * Responsibility-specific behavior is installed by sibling modules.\n */\nimport { isKeyRelease, isViewportTUI, type ScrollView, type TuiInputListener } from \"@earendil-works/pi-tui\";\n\nimport type { AgentSessionQueuePauseControl } from \"../../core/agent-session-methods.ts\";\nimport type { MarkdownTransformer } from \"../../core/extensions/types.ts\";\nimport type { MermaidRenderingMode } from \"../../core/settings-manager.ts\";\nimport type { EarlyInputSnapshot } from \"../../main-early-input.ts\";\nimport { readClipboardText } from \"../../utils/clipboard.ts\";\nimport { renderEngineDiagnostic } from \"../interactive-engine/engine-diagnostic-view.ts\";\nimport { attachInteractiveEngineHost } from \"../interactive-engine/extension-ui-bridge.ts\";\nimport type { RemoteToolExecutionComponent } from \"../interactive-engine/remote-renderer.ts\";\nimport { KeybindingsReloadCoordinator } from \"../rpc/rpc-keybindings-reload.ts\";\nimport type { AtomicWorkingLoader } from \"./components/atomic-working-status.ts\";\nimport { createMermaidMarkdownTransformer } from \"./components/mermaid.ts\";\nimport {\n\ttype AgentSession,\n\ttype AgentSessionRuntime,\n\ttype AssistantMessage,\n\ttype AssistantMessageComponent,\n\ttype AutocompleteProvider,\n\ttype AutocompleteProviderFactory,\n\ttype BashExecutionComponent,\n\ttype Component,\n\tContainer,\n\ttype CountdownTimer,\n\tCustomEditor,\n\ttype EditorComponent,\n\ttype EditorFactory,\n\ttype ExtensionEditorComponent,\n\ttype ExtensionInputComponent,\n\ttype ExtensionSelectorComponent,\n\tFooterComponent,\n\tFooterDataProvider,\n\tgetEditorTheme,\n\ttype HostCustomUiStateListener,\n\tInteractiveThemeController,\n\tKeybindingsManager,\n\ttype Loader,\n\ttype LoaderIndicatorOptions,\n\ttype Spacer,\n\tsetKeybindings,\n\tsetRegisteredThemes,\n\ttype Text,\n\ttype ToolExecutionComponent,\n\ttype TUI,\n\ttheme,\n\tUsageMeterComponent,\n\tVERSION,\n} from \"./interactive-mode-deps.ts\";\nimport type {} from \"./interactive-mode-surface.ts\";\nimport type { CompactionQueuedMessage, InteractiveModeOptions } from \"./interactive-mode-types.ts\";\nimport { StartupChatContainer } from \"./interactive-startup-chat-container.ts\";\nimport type { InteractiveSubmission } from \"./interactive-submission.ts\";\nimport {\n\tcreateInteractiveTui,\n\tcreateInteractiveTuiReference,\n\thandleFocusedOverlayInternalUiAction,\n\ttype InteractiveTui,\n\ttype InternalUiActionResult,\n} from \"./interactive-tui.ts\";\n\nconst FULLSCREEN_VIEWPORT_ACTIONS = [\n\t\"tui.altScreen.pageUp\",\n\t\"tui.altScreen.pageDown\",\n\t\"tui.altScreen.halfPageUp\",\n\t\"tui.altScreen.halfPageDown\",\n\t\"tui.altScreen.previousPrompt\",\n\t\"tui.altScreen.nextPrompt\",\n\t\"tui.altScreen.top\",\n\t\"tui.altScreen.bottom\",\n] as const;\n\n/**\n * Decide whether the fullscreen viewport should run before the focused\n * component. `isMouseInput` is classified by pi-tui's own mouse predicate in\n * `AtomicTuiAltScreen`, so this policy does not duplicate terminal grammars.\n * Mouse deferral is limited to actual overlays so inline components do not\n * disable pi-tui's application-owned transcript selection path.\n */\nexport function shouldHandleFullscreenViewportInput(\n\tfocused: Component | null,\n\teditor: Component,\n\tdata: string,\n\tisMouseInput: boolean,\n\tfocusedIsOverlay: boolean,\n\tkeybindings: KeybindingsManager,\n): boolean {\n\tif (focused === editor || !focused?.handleInput) return true;\n\tif (isMouseInput) return !focusedIsOverlay;\n\tif (focusedIsOverlay && keybindings.matches(data, \"app.thinking.toggle\")) return false;\n\treturn !FULLSCREEN_VIEWPORT_ACTIONS.some((action) => keybindings.matches(data, action));\n}\n\nfunction isCommandLikeStartupInput(text: string): boolean {\n\tconst trimmed = text.trimStart();\n\treturn trimmed.startsWith(\"/\") || trimmed.startsWith(\"!\");\n}\n\nexport function seedStartupInput(\n\tpendingUserInputs: InteractiveSubmission[],\n\teditor: { setText(text: string): void },\n\tstartupInput: EarlyInputSnapshot | undefined,\n\tstartupReplayInputs: string[] = [],\n\tsetStartupDraftText?: (text: string) => void,\n\tsetStartupReplayActiveInput?: (text: string) => void,\n): void {\n\tif (!startupInput) return;\n\tlet commandReplayStarted = false;\n\tfor (const submission of startupInput.submissions) {\n\t\tif (commandReplayStarted) {\n\t\t\tstartupReplayInputs.push(submission);\n\t\t} else if (isCommandLikeStartupInput(submission)) {\n\t\t\tconst commandText = submission.trim();\n\t\t\tcommandReplayStarted = true;\n\t\t\teditor.setText(commandText);\n\t\t\tsetStartupReplayActiveInput?.(commandText);\n\t\t} else {\n\t\t\tpendingUserInputs.push({ text: submission, draft: submission });\n\t\t}\n\t}\n\tif (startupInput.text.length === 0) return;\n\tif (commandReplayStarted) {\n\t\tsetStartupDraftText?.(startupInput.text);\n\t} else {\n\t\teditor.setText(startupInput.text);\n\t}\n}\n\nexport interface InteractiveTuiInputSubscription {\n\thandler: TuiInputListener;\n\tunsubscribe: () => void;\n}\n\nexport class InteractiveModeBase {\n\truntimeHost: AgentSessionRuntime;\n\n\tui: TUI;\n\tprivate renderer: InteractiveTui;\n\n\tprivate readonly shouldHandleViewportInput = (\n\t\tdata: string,\n\t\tisMouseInput: boolean,\n\t\tfocusedIsOverlay: boolean,\n\t): boolean => {\n\t\treturn shouldHandleFullscreenViewportInput(\n\t\t\tthis.renderer.getFocusedComponent(),\n\t\t\tthis.editor,\n\t\t\tdata,\n\t\t\tisMouseInput,\n\t\t\tfocusedIsOverlay,\n\t\t\tthis.keybindings,\n\t\t);\n\t};\n\tprivate readonly onOverlayUnhandledInput = (data: string): boolean => this.handleOverlayUnhandledInput(data);\n\tprivate readonly onOverlayInternalUiAction = (url: string): InternalUiActionResult =>\n\t\thandleFocusedOverlayInternalUiAction(this.renderer, url);\n\n\t/** Dispatch the host thinking action after a focused workflow overlay declines input. */\n\thandleOverlayUnhandledInput(data: string): boolean {\n\t\tif (isKeyRelease(data) || !this.keybindings.matches(data, \"app.thinking.toggle\")) return false;\n\t\t// Reuse the default editor's action dispatcher even while a workflow\n\t\t// overlay owns focus. This keeps the host binding and its user remap as\n\t\t// the source of truth instead of calling the implementation directly.\n\t\treturn this.defaultEditor.handleInput(data);\n\t}\n\n\tprivate readonly onRightClickPaste = (): void => {\n\t\tvoid this.handleRightClickPaste();\n\t};\n\n\tchatContainer: Container;\n\tdocumentContainer: Container;\n\n\ttranscriptScrollView: ScrollView | undefined;\n\n\tfullscreenLayoutRoot: Component | undefined;\n\n\tresourceDisclosureContainer: Container;\n\tstartupNoticesContainer: Container;\n\tpendingMessagesContainer: Container;\n\n\tstatusContainer: Container;\n\n\tdefaultEditor: CustomEditor;\n\n\teditor: EditorComponent;\n\n\teditorComponentFactory: EditorFactory | undefined;\n\n\tautocompleteProvider: AutocompleteProvider | undefined;\n\n\tautocompleteProviderWrappers: AutocompleteProviderFactory[] = [];\n\n\tfdPath: string | undefined;\n\n\teditorContainer: Container;\n\n\tactiveSelectorToken: object | undefined;\n\n\tactiveSelectorDispose: (() => void) | undefined;\n\n\tfooter: FooterComponent;\n\tfooterContainer: Container;\n\n\tusageMeter: UsageMeterComponent;\n\n\tfooterDataProvider: FooterDataProvider;\n\n\t// Stored so the same manager can be injected into custom editors, selectors, and extension UI.\n\tkeybindings: KeybindingsManager;\n\n\treloadCoordinator: KeybindingsReloadCoordinator;\n\n\tinteractiveEngineShortcutHandler: ((data: string) => boolean) | undefined;\n\n\tdisposeInteractiveEngineHost: () => void = () => {};\n\n\tversion: string;\n\n\tisInitialized = false;\n\n\tonInputCallback?: (submission: InteractiveSubmission) => void;\n\n\tpendingUserInputs: InteractiveSubmission[] = [];\n\n\tstartupReplayInputs: string[] = [];\n\n\tstartupReplayActiveInput: string | undefined = undefined;\n\n\tstartupDraftText: string | undefined = undefined;\n\n\tstartupCookedInputRecovered = false;\n\n\tdeferredRenderedUserInputs: string[] = [];\n\n\tdeferredRenderedUserInputComponents = new Map<string, Component[][]>();\n\n\tloadingAnimation: Loader | AtomicWorkingLoader | undefined = undefined;\n\n\tworkingMessage: string | undefined = undefined;\n\n\tworkingVisible = true;\n\n\tworkingIndicatorOptions: LoaderIndicatorOptions | undefined = undefined;\n\n\treadonly defaultWorkingMessage = \"Working...\";\n\n\treadonly defaultHiddenThinkingLabel = \"Thinking...\";\n\n\thiddenThinkingLabel = this.defaultHiddenThinkingLabel;\n\n\tlastSigintTime = 0;\n\n\tlastEscapeTime = 0;\n\n\tchangelogMarkdown: string | undefined = undefined;\n\n\tstartupNoticesShown = false;\n\tstartupNoticesPrepared = false;\n\n\tanthropicSubscriptionWarningShown = false;\n\n\tfirstRunNoticeVisible = false;\n\n\thadLastChangelogVersionAtStartup = false;\n\n\tfirstRunOnboardingNoticeComponents: Component[] = [];\n\n\tautoTrustOnReloadCwd: string | undefined;\n\n\t// Status line tracking (for mutating immediately-sequential status updates)\n\tlastStatusSpacer: Spacer | undefined = undefined;\n\n\tlastStatusText: Text | undefined = undefined;\n\n\t// Streaming message tracking\n\tstreamingComponent: AssistantMessageComponent | undefined = undefined;\n\n\tstreamingMessage: AssistantMessage | undefined = undefined;\n\n\t// Tool execution tracking: toolCallId -> component\n\tpendingTools = new Map<string, ToolExecutionComponent | RemoteToolExecutionComponent>();\n\n\t// Tool output expansion state\n\ttoolOutputExpanded = false;\n\n\t// Thinking block visibility state\n\thideThinkingBlock = false;\n\toutputPad: 0 | 1 = 1;\n\n\tmermaidMarkdownTransformer: MarkdownTransformer = createMermaidMarkdownTransformer({\n\t\tgetMode: () => this.settingsManager.getMermaidRenderingMode(),\n\t\ttheme,\n\t});\n\tmermaidMarkdownTransformerMode: MermaidRenderingMode | undefined;\n\n\t// Skill commands: command name -> skill file path\n\tskillCommands = new Map<string, string>();\n\n\t// Agent subscription unsubscribe function\n\tunsubscribe?: () => void;\n\n\tsignalCleanupHandlers: Array<() => void> = [];\n\n\t// Track if editor is in bash mode (text starts with !)\n\tisBashMode = false;\n\n\t// Track current bash execution component\n\tbashComponent: BashExecutionComponent | undefined = undefined;\n\n\t// Track pending bash components (shown in pending area, moved to chat on submit)\n\tpendingBashComponents: BashExecutionComponent[] = [];\n\n\t// Auto-compaction state\n\tautoCompactionLoader: AtomicWorkingLoader | undefined = undefined;\n\n\tautoCompactionEscapeHandler?: () => void;\n\n\t/** True once the pre-compaction Escape handler has been captured for restore. */\n\tautoCompactionEscapeHandlerSaved = false;\n\n\t/** True while `runUserPromptTurn()` owns the working loader. */\n\tpromptTurnWorkingLoaderActive = false;\n\n\t// Auto-retry state\n\tretryLoader: Loader | undefined = undefined;\n\tfallbackLoader: Loader | undefined = undefined;\n\n\tretryCountdown: CountdownTimer | undefined = undefined;\n\n\tretryEscapeHandler?: () => void;\n\n\t// Messages queued while compaction is running\n\tcompactionQueuedMessages: CompactionQueuedMessage[] = [];\n\n\t/** Keeps input queued while automatic compaction hands off to a manual request. */\n\tmanualCompactionTakeoverPending = false;\n\n\t// Deferred extension load state (first paint happens before extensions load)\n\tdeferredStartupPending = false;\n\tinitialStartupBinding = false;\n\tdeferredStartupPromise: Promise<void> | undefined = undefined;\n\n\tinputHandlerReadyRecorded = false;\n\n\tfirstSubmitRecorded = false;\n\n\t// Shutdown state\n\tshutdownRequested = false;\n\n\t// Extension UI state\n\textensionSelector: ExtensionSelectorComponent | undefined = undefined;\n\n\textensionInput: ExtensionInputComponent | undefined = undefined;\n\n\textensionEditor: ExtensionEditorComponent | undefined = undefined;\n\n\ttuiInputSubscriptions = new Set<InteractiveTuiInputSubscription>();\n\n\textensionTerminalInputSubscriptions = new Set<InteractiveTuiInputSubscription>();\n\n\ttuiRendererChangeListeners = new Set<() => void>();\n\n\tblockingInlineCustomUiDepth = 0;\n\n\tdeferredInlineCustomUiFocusDepth = 0;\n\n\tpendingInlineCustomUiFocus: Component | undefined = undefined;\n\n\thostCustomUiStateListeners = new Set<HostCustomUiStateListener>();\n\n\tthemeController: InteractiveThemeController;\n\n\t// Extension widgets (components rendered above/below the editor)\n\textensionWidgetsAbove = new Map<string, Component & { dispose?(): void }>();\n\n\textensionWidgetsBelow = new Map<string, Component & { dispose?(): void }>();\n\n\twidgetContainerAbove!: Container;\n\n\twidgetContainerBelow!: Container;\n\n\t// Custom footer from extension (undefined = use built-in footer)\n\tcustomFooter: (Component & { dispose?(): void }) | undefined = undefined;\n\n\t// Header container that holds the built-in or custom header\n\theaderContainer: Container;\n\n\t// Built-in header (logo + keybinding hints + changelog)\n\tbuiltInHeader: Component | undefined = undefined;\n\n\t// Custom header from extension (undefined = use built-in header)\n\tcustomHeader: (Component & { dispose?(): void }) | undefined = undefined;\n\n\t// Convenience accessors\n\tget session(): AgentSession & AgentSessionQueuePauseControl {\n\t\treturn this.runtimeHost.session as AgentSession & AgentSessionQueuePauseControl;\n\t}\n\n\t/** Includes the short handoff window that an isolated engine cannot mirror. */\n\tget compactionActive(): boolean {\n\t\treturn this.session.isCompacting || this.manualCompactionTakeoverPending;\n\t}\n\n\tget agent() {\n\t\treturn this.session.agent;\n\t}\n\n\tget sessionManager() {\n\t\treturn this.session.sessionManager;\n\t}\n\n\tget settingsManager() {\n\t\treturn this.session.settingsManager;\n\t}\n\n\t/**\n\t * Tears down the selector that owns `editorContainer`, including in-flight\n\t * work such as a model catalog refresh.\n\t *\n\t * This lives on the base class so behavior modules can dispose a selector\n\t * without relying on `interactive-selectors.ts` load order.\n\t */\n\tdisposeActiveSelector(): void {\n\t\tconst dispose = this.activeSelectorDispose;\n\t\tthis.activeSelectorToken = undefined;\n\t\tthis.activeSelectorDispose = undefined;\n\t\tdispose?.();\n\t}\n\n\taddTuiInputListener(handler: TuiInputListener): () => void {\n\t\tconst subscription: InteractiveTuiInputSubscription = {\n\t\t\thandler,\n\t\t\tunsubscribe: this.ui.addInputListener(handler),\n\t\t};\n\t\tthis.tuiInputSubscriptions.add(subscription);\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t\tthis.tuiInputSubscriptions.delete(subscription);\n\t\t};\n\t}\n\n\trebindTuiInputListeners(): void {\n\t\tfor (const subscription of this.tuiInputSubscriptions) {\n\t\t\tsubscription.unsubscribe();\n\t\t\tsubscription.unsubscribe = this.ui.addInputListener(subscription.handler);\n\t\t}\n\t}\n\n\tonTuiRendererChange(listener: () => void): () => void {\n\t\tthis.tuiRendererChangeListeners.add(listener);\n\t\treturn () => this.tuiRendererChangeListeners.delete(listener);\n\t}\n\n\tmountInteractiveTui(tui: TUI, components: readonly Component[]): void {\n\t\tfor (const component of components) tui.addChild(component);\n\t\tif (isViewportTUI(tui)) {\n\t\t\tif (!this.fullscreenLayoutRoot) throw new Error(\"Fullscreen layout is not initialized\");\n\t\t\ttui.setLayoutRoot(this.fullscreenLayoutRoot);\n\t\t}\n\t}\n\n\tprivate async handleRightClickPaste(): Promise<void> {\n\t\tconst target = this.renderer.getFocusedComponent();\n\t\tconst handleInput = target?.handleInput;\n\t\tif (!target || !handleInput) return;\n\t\ttry {\n\t\t\tconst text = await readClipboardText();\n\t\t\tif (!text || this.renderer.getFocusedComponent() !== target) return;\n\t\t\thandleInput.call(target, `\\x1b[200~${text}\\x1b[201~`);\n\t\t\tthis.ui.requestRender();\n\t\t} catch {\n\t\t\t// Clipboard paste is best-effort; permission and native-module failures are common.\n\t\t}\n\t}\n\n\tstopInteractiveTui(): void {\n\t\twhile (this.renderer.hasOverlayEntries) this.renderer.hideOverlay();\n\t\tthis.ui.stop();\n\t}\n\n\tdeclare options: InteractiveModeOptions;\n\n\tconstructor(runtimeHost: AgentSessionRuntime, options: InteractiveModeOptions = {}) {\n\t\tthis.runtimeHost = runtimeHost;\n\t\tthis.options = options;\n\t\tthis.deferredStartupPending = Boolean(options.deferredExtensionLoad);\n\t\tthis.autoTrustOnReloadCwd = options.autoTrustOnReloadCwd;\n\t\tthis.runtimeHost.setBeforeSessionInvalidate(() => {\n\t\t\tthis.resetExtensionUI();\n\t\t});\n\t\tthis.runtimeHost.setRebindSession(async () => {\n\t\t\tawait this.rebindCurrentSession();\n\t\t});\n\t\tthis.version = VERSION;\n\t\tthis.renderer = createInteractiveTui({\n\t\t\tshowHardwareCursor: this.settingsManager.getShowHardwareCursor(),\n\t\t\tlogDirectory: runtimeHost.services.agentDir,\n\t\t\tterminal: options.terminal,\n\t\t\tonRightClickPaste: this.onRightClickPaste,\n\t\t\tshouldHandleViewportInput: this.shouldHandleViewportInput,\n\t\t\tonOverlayUnhandledInput: this.onOverlayUnhandledInput,\n\t\t\tonOverlayInternalUiAction: this.onOverlayInternalUiAction,\n\t\t\tonInternalUiAction: () => {\n\t\t\t\tthis.jumpToTranscriptEnd();\n\t\t\t\treturn undefined;\n\t\t\t},\n\t\t});\n\t\tthis.ui = createInteractiveTuiReference(() => this.renderer);\n\t\tthis.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());\n\t\tthis.headerContainer = new Container();\n\t\tthis.documentContainer = new Container();\n\t\tthis.documentContainer.addChild(this.headerContainer);\n\t\tthis.chatContainer = new StartupChatContainer();\n\t\tthis.documentContainer.addChild(this.chatContainer);\n\t\tthis.resourceDisclosureContainer = new Container();\n\t\tthis.startupNoticesContainer = new Container();\n\t\t// The isolated engine can emit session_start UI requests as soon as its\n\t\t// bridge attaches below, before init() mounts chat in the TUI. Reserve the\n\t\t// ordering slots now so those messages can never precede RESOURCES.\n\t\tthis.chatContainer.addChild(this.resourceDisclosureContainer);\n\t\tthis.chatContainer.addChild(this.startupNoticesContainer);\n\t\tthis.pendingMessagesContainer = new Container();\n\t\tthis.statusContainer = new Container();\n\t\tthis.widgetContainerAbove = new Container();\n\t\tthis.widgetContainerBelow = new Container();\n\t\tthis.keybindings = KeybindingsManager.create(runtimeHost.services.agentDir);\n\t\tthis.reloadCoordinator = new KeybindingsReloadCoordinator(this.keybindings);\n\t\tsetKeybindings(this.keybindings);\n\t\tconst editorPaddingX = this.settingsManager.getEditorPaddingX();\n\t\tconst autocompleteMaxVisible = this.settingsManager.getAutocompleteMaxVisible();\n\t\tthis.defaultEditor = new CustomEditor(this.ui, getEditorTheme(), this.keybindings, {\n\t\t\tpaddingX: editorPaddingX,\n\t\t\tautocompleteMaxVisible,\n\t\t});\n\n\t\tthis.editor = this.defaultEditor;\n\t\tthis.editorContainer = new Container();\n\t\tthis.editorContainer.addChild(this.editor as Component);\n\t\tthis.footerDataProvider = new FooterDataProvider(this.sessionManager.getCwd());\n\t\tthis.footer = new FooterComponent(this.session, this.footerDataProvider);\n\t\tthis.footerContainer = new Container();\n\t\tthis.footerContainer.addChild(this.footer);\n\t\tthis.usageMeter = new UsageMeterComponent(this.session);\n\t\tthis.usageMeter.setAutoCompactEnabled(this.session.autoCompactionEnabled);\n\n\t\t// Load hide thinking block setting\n\t\tthis.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();\n\t\tthis.outputPad = this.settingsManager.getOutputPad();\n\n\t\t// Register themes from resource loader and initialize\n\t\tsetRegisteredThemes(this.session.resourceLoader.getThemes().themes);\n\t\tthis.themeController = new InteractiveThemeController(\n\t\t\tthis.ui,\n\t\t\tthis.settingsManager,\n\t\t\t(message) => this.showError(message),\n\t\t\t() => this.updateEditorBorderColor(),\n\t\t);\n\t\tthis.disposeInteractiveEngineHost = attachInteractiveEngineHost(\n\t\t\truntimeHost,\n\t\t\tthis.createExtensionUIContext(),\n\t\t\t(diagnostic) =>\n\t\t\t\trenderEngineDiagnostic(diagnostic, {\n\t\t\t\t\tstopWorkingLoader: () => this.stopWorkingLoader(),\n\t\t\t\t\tshowStatus: (message) => this.showStatus(message),\n\t\t\t\t\tshowError: (message) => this.showError(message),\n\t\t\t\t}),\n\t\t\t{\n\t\t\t\tisFullscreen: () => this.renderer.mode === \"fullscreen\",\n\t\t\t\tonRendererReplaced: (listener) => this.onTuiRendererChange(listener),\n\t\t\t},\n\t\t\t(handler) => {\n\t\t\t\tthis.interactiveEngineShortcutHandler = handler;\n\t\t\t\tthis.defaultEditor.onExtensionShortcut = handler;\n\t\t\t\treturn () => {\n\t\t\t\t\tif (this.interactiveEngineShortcutHandler === handler) this.interactiveEngineShortcutHandler = undefined;\n\t\t\t\t\tif (this.defaultEditor.onExtensionShortcut === handler)\n\t\t\t\t\t\tthis.defaultEditor.onExtensionShortcut = undefined;\n\t\t\t\t};\n\t\t\t},\n\t\t\tthis.keybindings,\n\t\t);\n\t}\n\n\t// Maximum total widget lines to prevent viewport overflow\n\tstatic readonly MAX_WIDGET_LINES = 10;\n\n\t/**\n\t * Gracefully shutdown the agent.\n\t * Stops the TUI before emitting shutdown events so extension UI cleanup cannot\n\t * repaint the final frame while the process is exiting.\n\t */\n\tisShuttingDown = false;\n}\n"]}
1
+ {"version":3,"file":"interactive-mode-base.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-base.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,aAAa,EAA0C,MAAM,wBAAwB,CAAC;AAM7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AACzF,OAAO,EAAE,2BAA2B,EAAE,MAAM,8CAA8C,CAAC;AAE3F,OAAO,EAAE,4BAA4B,EAAE,MAAM,kCAAkC,CAAC;AAEhF,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAE3E,OAAO,EASN,SAAS,EAET,YAAY,EAMZ,eAAe,EACf,kBAAkB,EAClB,cAAc,EAEd,0BAA0B,EAC1B,kBAAkB,EAIlB,cAAc,EACd,mBAAmB,EAInB,KAAK,EACL,mBAAmB,EACnB,OAAO,GACP,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAE/E,OAAO,EACN,oBAAoB,EACpB,6BAA6B,EAC7B,oCAAoC,GAGpC,MAAM,sBAAsB,CAAC;AAE9B,kFAAkF;AAClF,MAAM,oCAAoC,GAAG;IAC5C,sBAAsB;IACtB,wBAAwB;IACxB,0BAA0B;IAC1B,4BAA4B;IAC5B,sBAAsB;IACtB,wBAAwB;IACxB,8BAA8B;IAC9B,0BAA0B;IAC1B,mBAAmB;IACnB,sBAAsB;CACb,CAAC;AAEX,MAAM,2BAA2B,GAAG,oCAAoC,CAAC;AAEzE,MAAM,UAAU,0BAA0B,CAAC,IAAY,EAAE,WAA+B;IACvF,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AACxF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kCAAkC,CAAC,IAAY,EAAE,WAA+B;IAC/F,OAAO,oCAAoC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;AACjG,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,mCAAmC,CAClD,OAAyB,EACzB,MAAiB,EACjB,IAAY,EACZ,YAAqB,EACrB,gBAAyB,EACzB,WAA+B,EAC/B,wBAAwB,GAAG,KAAK;IAEhC,IAAI,OAAO,KAAK,MAAM,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAChD,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,YAAY;QAAE,OAAO,CAAC,gBAAgB,CAAC;IAC3C,IAAI,gBAAgB,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC;QAAE,OAAO,KAAK,CAAC;IACvF,OAAO,CAAC,0BAA0B,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,yBAAyB,CAAC,IAAY;IAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IACjC,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC/B,iBAA0C,EAC1C,MAAuC,EACvC,YAA4C,EAC5C,mBAAmB,GAAa,EAAE,EAClC,mBAA4C,EAC5C,2BAAoD;IAEpD,IAAI,CAAC,YAAY;QAAE,OAAO;IAC1B,IAAI,oBAAoB,GAAG,KAAK,CAAC;IACjC,KAAK,MAAM,UAAU,IAAI,YAAY,CAAC,WAAW,EAAE,CAAC;QACnD,IAAI,oBAAoB,EAAE,CAAC;YAC1B,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,yBAAyB,CAAC,UAAU,CAAC,EAAE,CAAC;YAClD,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;YACtC,oBAAoB,GAAG,IAAI,CAAC;YAC5B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC5B,2BAA2B,EAAE,CAAC,WAAW,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACP,iBAAiB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC;QACjE,CAAC;IACF,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC3C,IAAI,oBAAoB,EAAE,CAAC;QAC1B,mBAAmB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;SAAM,CAAC;QACP,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;AACF,CAAC;AAOD,MAAM,OAAO,mBAAmB;IA0B/B,yFAAyF;IACzF,2BAA2B,CAAC,IAAY;QACvC,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC;YAAE,OAAO,KAAK,CAAC;QAC/F,qEAAqE;QACrE,wEAAwE;QACxE,sEAAsE;QACtE,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IA6OD,wBAAwB;IACxB,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,WAAW,CAAC,OAAuD,CAAC;IACjF,CAAC;IAED,+EAA+E;IAC/E,IAAI,gBAAgB;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,+BAA+B,CAAC;IAC1E,CAAC;IAED,IAAI,KAAK;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;IAC3B,CAAC;IAED,IAAI,cAAc;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;IACpC,CAAC;IAED,IAAI,eAAe;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IACrC,CAAC;IAED;;;;;;OAMG;IACH,qBAAqB;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAC3C,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;QACrC,IAAI,CAAC,qBAAqB,GAAG,SAAS,CAAC;QACvC,OAAO,EAAE,EAAE,CAAC;IACb,CAAC;IAED,mBAAmB,CAAC,OAAyB;QAC5C,MAAM,YAAY,GAAoC;YACrD,OAAO;YACP,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC;SAC9C,CAAC;QACF,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC7C,OAAO,GAAG,EAAE;YACX,YAAY,CAAC,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACjD,CAAC,CAAC;IACH,CAAC;IAED,uBAAuB;QACtB,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACvD,YAAY,CAAC,WAAW,EAAE,CAAC;YAC3B,YAAY,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC3E,CAAC;IACF,CAAC;IAED,mBAAmB,CAAC,QAAoB;QACvC,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/D,CAAC;IAED,mBAAmB,CAAC,GAAQ,EAAE,UAAgC;QAC7D,KAAK,MAAM,SAAS,IAAI,UAAU;YAAE,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,IAAI,CAAC,oBAAoB;gBAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACxF,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC9C,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,qBAAqB;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;QACnD,MAAM,WAAW,GAAG,MAAM,EAAE,WAAW,CAAC;QACxC,IAAI,CAAC,MAAM,IAAI,CAAC,WAAW;YAAE,OAAO;QACpC,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAC;YACvC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,KAAK,MAAM;gBAAE,OAAO;YACpE,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,IAAI,WAAW,CAAC,CAAC;YACtD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACR,oFAAoF;QACrF,CAAC;IACF,CAAC;IAED,kBAAkB,CAAC,oBAA0C;QAC5D,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY,CAAC;QACzD,IAAI,YAAY,IAAI,oBAAoB,KAAK,YAAY,EAAE,CAAC;YAC3D,iEAAiE;YACjE,mEAAmE;YACnE,gEAAgE;YAChE,kEAAkE;YAClE,gEAAgE;YAChE,kEAAkE;YAClE,+DAA+D;YAC/D,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB;gBAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YACpE,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACvF,CAAC;QACD,oEAAoE;QACpE,oEAAoE;QACpE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,cAAc,EAAE,YAAY,IAAI,oBAAoB,KAAK,aAAa,EAAE,CAAC,CAAC;IAC1F,CAAC;IAID,YAAY,WAAgC,EAAE,OAAO,GAA2B,EAAE;QA9WjE,8BAAyB,GAAG,CAC5C,IAAY,EACZ,YAAqB,EACrB,gBAAyB,EACzB,uBAAgC,EACtB,EAAE;YACZ,OAAO,mCAAmC,CACzC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EACnC,IAAI,CAAC,MAAM,EACX,IAAI,EACJ,YAAY,EACZ,gBAAgB,EAChB,IAAI,CAAC,WAAW,EAChB,uBAAuB,CACvB,CAAC;QACH,CAAC,CAAC;QACe,4BAAuB,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,CAAC;QAC5F,8BAAyB,GAAG,CAAC,GAAW,EAA0B,EAAE,CACpF,oCAAoC,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAWzC,sBAAiB,GAAG,GAAS,EAAE;YAC/C,KAAK,IAAI,CAAC,qBAAqB,EAAE,CAAC;QACnC,CAAC,CAAC;QAuBF,iCAA4B,GAAkC,EAAE,CAAC;QAwBjE,iCAA4B,GAAe,GAAG,EAAE,GAAE,CAAC,CAAC;QAIpD,kBAAa,GAAG,KAAK,CAAC;QAItB,sBAAiB,GAA4B,EAAE,CAAC;QAEhD,wBAAmB,GAAa,EAAE,CAAC;QAEnC,6BAAwB,GAAuB,SAAS,CAAC;QAEzD,qBAAgB,GAAuB,SAAS,CAAC;QAEjD,gCAA2B,GAAG,KAAK,CAAC;QAEpC,+BAA0B,GAAa,EAAE,CAAC;QAE1C,wCAAmC,GAAG,IAAI,GAAG,EAAyB,CAAC;QAEvE,qBAAgB,GAA6C,SAAS,CAAC;QAEvE,mBAAc,GAAuB,SAAS,CAAC;QAE/C,mBAAc,GAAG,IAAI,CAAC;QAEtB,4BAAuB,GAAuC,SAAS,CAAC;QAE/D,0BAAqB,GAAG,YAAY,CAAC;QAErC,+BAA0B,GAAG,aAAa,CAAC;QAEpD,wBAAmB,GAAG,IAAI,CAAC,0BAA0B,CAAC;QAEtD,mBAAc,GAAG,CAAC,CAAC;QAEnB,mBAAc,GAAG,CAAC,CAAC;QAEnB,sBAAiB,GAAuB,SAAS,CAAC;QAElD,wBAAmB,GAAG,KAAK,CAAC;QAC5B,2BAAsB,GAAG,KAAK,CAAC;QAE/B,sCAAiC,GAAG,KAAK,CAAC;QAE1C,0BAAqB,GAAG,KAAK,CAAC;QAE9B,qCAAgC,GAAG,KAAK,CAAC;QAEzC,uCAAkC,GAAgB,EAAE,CAAC;QAIrD,4EAA4E;QAC5E,qBAAgB,GAAuB,SAAS,CAAC;QAEjD,mBAAc,GAAqB,SAAS,CAAC;QAE7C,2EAA2E;QAC3E,6BAAwB,GAAG,KAAK,CAAC;QACjC,2FAA2F;QAC3F,gCAA2B,GAAG,CAAC,CAAC;QAEhC,6BAA6B;QAC7B,uBAAkB,GAA0C,SAAS,CAAC;QAEtE,qBAAgB,GAAiC,SAAS,CAAC;QAE3D,mDAAmD;QACnD,iBAAY,GAAG,IAAI,GAAG,EAAiE,CAAC;QAExF,8BAA8B;QAC9B,uBAAkB,GAAG,KAAK,CAAC;QAE3B,kCAAkC;QAClC,sBAAiB,GAAG,KAAK,CAAC;QAC1B,cAAS,GAAU,CAAC,CAAC;QAErB,+BAA0B,GAAwB,gCAAgC,CAAC;YAClF,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,uBAAuB,EAAE;YAC7D,KAAK;SACL,CAAC,CAAC;QAGH,kDAAkD;QAClD,kBAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;QAK1C,0BAAqB,GAAsB,EAAE,CAAC;QAE9C,uDAAuD;QACvD,eAAU,GAAG,KAAK,CAAC;QAEnB,yCAAyC;QACzC,kBAAa,GAAuC,SAAS,CAAC;QAE9D,iFAAiF;QACjF,0BAAqB,GAA6B,EAAE,CAAC;QAErD,wBAAwB;QACxB,yBAAoB,GAAoC,SAAS,CAAC;QAIlE,iFAAiF;QACjF,qCAAgC,GAAG,KAAK,CAAC;QAEzC,gEAAgE;QAChE,kCAA6B,GAAG,KAAK,CAAC;QAEtC,mBAAmB;QACnB,gBAAW,GAAuB,SAAS,CAAC;QAC5C,mBAAc,GAAuB,SAAS,CAAC;QAE/C,mBAAc,GAA+B,SAAS,CAAC;QAIvD,8CAA8C;QAC9C,6BAAwB,GAA8B,EAAE,CAAC;QAEzD,mFAAmF;QACnF,oCAA+B,GAAG,KAAK,CAAC;QAExC,6EAA6E;QAC7E,2BAAsB,GAAG,KAAK,CAAC;QAC/B,0BAAqB,GAAG,KAAK,CAAC;QAC9B,2BAAsB,GAA8B,SAAS,CAAC;QAE9D,8BAAyB,GAAG,KAAK,CAAC;QAElC,wBAAmB,GAAG,KAAK,CAAC;QAE5B,iBAAiB;QACjB,sBAAiB,GAAG,KAAK,CAAC;QAE1B,qBAAqB;QACrB,sBAAiB,GAA2C,SAAS,CAAC;QAEtE,mBAAc,GAAwC,SAAS,CAAC;QAEhE,oBAAe,GAAyC,SAAS,CAAC;QAElE,0BAAqB,GAAG,IAAI,GAAG,EAAmC,CAAC;QAEnE,wCAAmC,GAAG,IAAI,GAAG,EAAmC,CAAC;QAEjF,+BAA0B,GAAG,IAAI,GAAG,EAAc,CAAC;QAEnD,gCAA2B,GAAG,CAAC,CAAC;QAEhC,qCAAgC,GAAG,CAAC,CAAC;QAErC,+BAA0B,GAA0B,SAAS,CAAC;QAE9D,+BAA0B,GAAG,IAAI,GAAG,EAA6B,CAAC;QAElE,6BAAwB,GAAyC,SAAS,CAAC;QAI3E,iEAAiE;QACjE,0BAAqB,GAAG,IAAI,GAAG,EAA4C,CAAC;QAE5E,0BAAqB,GAAG,IAAI,GAAG,EAA4C,CAAC;QAM5E,iEAAiE;QACjE,iBAAY,GAAmD,SAAS,CAAC;QAKzE,wDAAwD;QACxD,kBAAa,GAA0B,SAAS,CAAC;QAEjD,iEAAiE;QACjE,iBAAY,GAAmD,SAAS,CAAC;QAmNzE;;;;WAIG;QACH,mBAAc,GAAG,KAAK,CAAC;QA/GtB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACrE,IAAI,CAAC,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;QACzD,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC,GAAG,EAAE;YAChD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE;YAC5C,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAClC,qEAAqE;YACrE,sEAAsE;YACtE,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,oBAAoB,CAAC;YACpC,kBAAkB,EAAE,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE;YAChE,YAAY,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ;YAC3C,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,yBAAyB,EAAE,IAAI,CAAC,yBAAyB;YACzD,uBAAuB,EAAE,IAAI,CAAC,uBAAuB;YACrD,yBAAyB,EAAE,IAAI,CAAC,yBAAyB;YACzD,kBAAkB,EAAE,GAAG,EAAE;gBACxB,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAC3B,OAAO,SAAS,CAAC;YAClB,CAAC;SACD,CAAC,CAAC;QACH,IAAI,CAAC,EAAE,GAAG,6BAA6B,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAClE,IAAI,CAAC,eAAe,GAAG,IAAI,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,iBAAiB,GAAG,IAAI,SAAS,EAAE,CAAC;QACzC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACtD,IAAI,CAAC,aAAa,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAChD,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpD,IAAI,CAAC,2BAA2B,GAAG,IAAI,SAAS,EAAE,CAAC;QACnD,IAAI,CAAC,uBAAuB,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/C,wEAAwE;QACxE,2EAA2E;QAC3E,oEAAoE;QACpE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC1D,IAAI,CAAC,wBAAwB,GAAG,IAAI,SAAS,EAAE,CAAC;QAChD,IAAI,CAAC,eAAe,GAAG,IAAI,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,oBAAoB,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5C,IAAI,CAAC,oBAAoB,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5E,IAAI,CAAC,iBAAiB,GAAG,IAAI,4BAA4B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5E,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE,CAAC;QAChE,MAAM,sBAAsB,GAAG,IAAI,CAAC,eAAe,CAAC,yBAAyB,EAAE,CAAC;QAChF,IAAI,CAAC,aAAa,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE;YAClF,QAAQ,EAAE,cAAc;YACxB,sBAAsB;SACtB,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,IAAI,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAmB,CAAC,CAAC;QACxD,IAAI,CAAC,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACzE,IAAI,CAAC,eAAe,GAAG,IAAI,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAE1E,mCAAmC;QACnC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,oBAAoB,EAAE,CAAC;QACrE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,CAAC;QAErD,sDAAsD;QACtD,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;QACpE,IAAI,CAAC,eAAe,GAAG,IAAI,0BAA0B,CAAC,IAAI,CAAC,EAAE,EAAE;YAC9D,kBAAkB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,eAAe;YAC9C,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC/C,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE;YAC/C,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;SAChD,CAAC,CAAC;QACH,IAAI,CAAC,4BAA4B,GAAG,2BAA2B,CAC9D,WAAW,EACX,IAAI,CAAC,wBAAwB,EAAE,EAC/B,CAAC,UAAU,EAAE,EAAE,CACd,sBAAsB,CAAC,UAAU,EAAE;YAClC,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACjD,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YACjD,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC/C,CAAC,EACH;YACC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;YACvD,kBAAkB,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC;SACpE,EACD,CAAC,OAAO,EAAE,EAAE;YACX,IAAI,CAAC,gCAAgC,GAAG,OAAO,CAAC;YAChD,IAAI,CAAC,aAAa,CAAC,mBAAmB,GAAG,OAAO,CAAC;YACjD,OAAO,GAAG,EAAE;gBACX,IAAI,IAAI,CAAC,gCAAgC,KAAK,OAAO;oBAAE,IAAI,CAAC,gCAAgC,GAAG,SAAS,CAAC;gBACzG,IAAI,IAAI,CAAC,aAAa,CAAC,mBAAmB,KAAK,OAAO;oBACrD,IAAI,CAAC,aAAa,CAAC,mBAAmB,GAAG,SAAS,CAAC;YACrD,CAAC,CAAC;QACH,CAAC,EACD,IAAI,CAAC,WAAW,CAChB,CAAC;IACH,CAAC;IAED,0DAA0D;aAC1C,qBAAgB,GAAG,EAAE,AAAL,CAAM;CAQtC","sourcesContent":["/**\n * Shared state and constructor wiring for interactive mode.\n * Responsibility-specific behavior is installed by sibling modules.\n */\nimport { isKeyRelease, isViewportTUI, type ScrollView, type TuiInputListener } from \"@earendil-works/pi-tui\";\n\nimport type { AgentSessionQueuePauseControl } from \"../../core/agent-session-methods.ts\";\nimport type { MarkdownTransformer } from \"../../core/extensions/types.ts\";\nimport type { FullscreenExitOutput, MermaidRenderingMode } from \"../../core/settings-manager.ts\";\nimport type { EarlyInputSnapshot } from \"../../main-early-input.ts\";\nimport { readClipboardText } from \"../../utils/clipboard.ts\";\nimport { renderEngineDiagnostic } from \"../interactive-engine/engine-diagnostic-view.ts\";\nimport { attachInteractiveEngineHost } from \"../interactive-engine/extension-ui-bridge.ts\";\nimport type { RemoteToolExecutionComponent } from \"../interactive-engine/remote-renderer.ts\";\nimport { KeybindingsReloadCoordinator } from \"../rpc/rpc-keybindings-reload.ts\";\nimport type { AtomicWorkingLoader } from \"./components/atomic-working-status.ts\";\nimport { createMermaidMarkdownTransformer } from \"./components/mermaid.ts\";\nimport type { TranscriptOverlayReserve } from \"./components/reserved-bottom-overlay.ts\";\nimport {\n\ttype AgentSession,\n\ttype AgentSessionRuntime,\n\ttype AssistantMessage,\n\ttype AssistantMessageComponent,\n\ttype AutocompleteProvider,\n\ttype AutocompleteProviderFactory,\n\ttype BashExecutionComponent,\n\ttype Component,\n\tContainer,\n\ttype CountdownTimer,\n\tCustomEditor,\n\ttype EditorComponent,\n\ttype EditorFactory,\n\ttype ExtensionEditorComponent,\n\ttype ExtensionInputComponent,\n\ttype ExtensionSelectorComponent,\n\tFooterComponent,\n\tFooterDataProvider,\n\tgetEditorTheme,\n\ttype HostCustomUiStateListener,\n\tInteractiveThemeController,\n\tKeybindingsManager,\n\ttype Loader,\n\ttype LoaderIndicatorOptions,\n\ttype Spacer,\n\tsetKeybindings,\n\tsetRegisteredThemes,\n\ttype Text,\n\ttype ToolExecutionComponent,\n\ttype TUI,\n\ttheme,\n\tUsageMeterComponent,\n\tVERSION,\n} from \"./interactive-mode-deps.ts\";\nimport type {} from \"./interactive-mode-surface.ts\";\nimport type { CompactionQueuedMessage, InteractiveModeOptions } from \"./interactive-mode-types.ts\";\nimport { StartupChatContainer } from \"./interactive-startup-chat-container.ts\";\nimport type { InteractiveSubmission } from \"./interactive-submission.ts\";\nimport {\n\tcreateInteractiveTui,\n\tcreateInteractiveTuiReference,\n\thandleFocusedOverlayInternalUiAction,\n\ttype InteractiveTui,\n\ttype InternalUiActionResult,\n} from \"./interactive-tui.ts\";\n\n/** Move the transcript and nothing else: what a reserving overlay may release. */\nconst FULLSCREEN_TRANSCRIPT_SCROLL_ACTIONS = [\n\t\"tui.altScreen.pageUp\",\n\t\"tui.altScreen.pageDown\",\n\t\"tui.altScreen.halfPageUp\",\n\t\"tui.altScreen.halfPageDown\",\n\t\"tui.altScreen.lineUp\",\n\t\"tui.altScreen.lineDown\",\n\t\"tui.altScreen.previousPrompt\",\n\t\"tui.altScreen.nextPrompt\",\n\t\"tui.altScreen.top\",\n\t\"tui.altScreen.bottom\",\n] as const;\n\nconst FULLSCREEN_VIEWPORT_ACTIONS = FULLSCREEN_TRANSCRIPT_SCROLL_ACTIONS;\n\nexport function isFullscreenViewportAction(data: string, keybindings: KeybindingsManager): boolean {\n\treturn FULLSCREEN_VIEWPORT_ACTIONS.some((action) => keybindings.matches(data, action));\n}\n\n/**\n * Whether a key scrolls the transcript. A reserving overlay — the\n * `ask_user_question` dialog, an extension component with\n * `reserveTranscriptRows` — declines these so the strip above it still pages\n * and jumps (#2378), and keeps everything else.\n */\nexport function isFullscreenTranscriptScrollAction(data: string, keybindings: KeybindingsManager): boolean {\n\treturn FULLSCREEN_TRANSCRIPT_SCROLL_ACTIONS.some((action) => keybindings.matches(data, action));\n}\n\n/**\n * Decide whether the fullscreen viewport should run before the focused\n * component. `isMouseInput` is classified by pi-tui's own mouse predicate in\n * `AtomicTuiAltScreen`, so this policy does not duplicate terminal grammars.\n * Mouse deferral is limited to actual overlays so inline components do not\n * disable pi-tui's application-owned transcript selection path.\n *\n * **Who owns viewport keys while an overlay is focused.** pi-tui 0.84.2 added\n * `shouldDeferViewportInputToOverlay()` (upstream #7894) and answers \"the\n * overlay\". Atomic answers \"the overlay first, the transcript with whatever it\n * declines\" (#2378 / PR #2381): the actions in `FULLSCREEN_VIEWPORT_ACTIONS`\n * and wheel reports are offered to the focused overlay, and\n * `AtomicTuiAltScreen` replays what it does not consume into pi-tui's viewport\n * listener. Atomic's answer stands, because a mounted dialog that keeps its\n * selection keys must not also freeze the transcript behind it.\n *\n * **The list covers every `tui.altScreen.*` scroll action pi-tui defines.**\n * An action a focused overlay declines still reaches the transcript, so the\n * shortcut is never simply lost.\n *\n * **A focused overlay with no `handleInput` is still an overlay.** The handler\n * is optional — `ExtensionCustomComponent` marks it `handleInput?` and\n * `docs/tui.md` documents it as optional — and a component that cannot answer\n * declines by definition. Answering \"the viewport owns it\" for that shape\n * would hand the key to pi-tui, whose native deferral then drops it because an\n * overlay holds focus, so the transcript would freeze behind a component that\n * never asked for the key. A handler-less overlay therefore takes the same\n * route as one that returns `false`: nothing to offer, then replay. Only a\n * focused component that is *not* an overlay keeps the shortcut, because\n * pi-tui defers nothing to it.\n */\nexport function shouldHandleFullscreenViewportInput(\n\tfocused: Component | null,\n\teditor: Component,\n\tdata: string,\n\tisMouseInput: boolean,\n\tfocusedIsOverlay: boolean,\n\tkeybindings: KeybindingsManager,\n\t_focusedIsViewportSearch = false,\n): boolean {\n\tif (focused === editor || !focused) return true;\n\tif (!focused.handleInput && !focusedIsOverlay) return true;\n\tif (isMouseInput) return !focusedIsOverlay;\n\tif (focusedIsOverlay && keybindings.matches(data, \"app.thinking.toggle\")) return false;\n\treturn !isFullscreenViewportAction(data, keybindings);\n}\n\nfunction isCommandLikeStartupInput(text: string): boolean {\n\tconst trimmed = text.trimStart();\n\treturn trimmed.startsWith(\"/\") || trimmed.startsWith(\"!\");\n}\n\nexport function seedStartupInput(\n\tpendingUserInputs: InteractiveSubmission[],\n\teditor: { setText(text: string): void },\n\tstartupInput: EarlyInputSnapshot | undefined,\n\tstartupReplayInputs: string[] = [],\n\tsetStartupDraftText?: (text: string) => void,\n\tsetStartupReplayActiveInput?: (text: string) => void,\n): void {\n\tif (!startupInput) return;\n\tlet commandReplayStarted = false;\n\tfor (const submission of startupInput.submissions) {\n\t\tif (commandReplayStarted) {\n\t\t\tstartupReplayInputs.push(submission);\n\t\t} else if (isCommandLikeStartupInput(submission)) {\n\t\t\tconst commandText = submission.trim();\n\t\t\tcommandReplayStarted = true;\n\t\t\teditor.setText(commandText);\n\t\t\tsetStartupReplayActiveInput?.(commandText);\n\t\t} else {\n\t\t\tpendingUserInputs.push({ text: submission, draft: submission });\n\t\t}\n\t}\n\tif (startupInput.text.length === 0) return;\n\tif (commandReplayStarted) {\n\t\tsetStartupDraftText?.(startupInput.text);\n\t} else {\n\t\teditor.setText(startupInput.text);\n\t}\n}\n\nexport interface InteractiveTuiInputSubscription {\n\thandler: TuiInputListener;\n\tunsubscribe: () => void;\n}\n\nexport class InteractiveModeBase {\n\truntimeHost: AgentSessionRuntime;\n\n\tui: TUI;\n\tprivate renderer: InteractiveTui;\n\n\tprivate readonly shouldHandleViewportInput = (\n\t\tdata: string,\n\t\tisMouseInput: boolean,\n\t\tfocusedIsOverlay: boolean,\n\t\tfocusedIsViewportSearch: boolean,\n\t): boolean => {\n\t\treturn shouldHandleFullscreenViewportInput(\n\t\t\tthis.renderer.getFocusedComponent(),\n\t\t\tthis.editor,\n\t\t\tdata,\n\t\t\tisMouseInput,\n\t\t\tfocusedIsOverlay,\n\t\t\tthis.keybindings,\n\t\t\tfocusedIsViewportSearch,\n\t\t);\n\t};\n\tprivate readonly onOverlayUnhandledInput = (data: string): boolean => this.handleOverlayUnhandledInput(data);\n\tprivate readonly onOverlayInternalUiAction = (url: string): InternalUiActionResult =>\n\t\thandleFocusedOverlayInternalUiAction(this.renderer, url);\n\n\t/** Dispatch the host thinking action after a focused workflow overlay declines input. */\n\thandleOverlayUnhandledInput(data: string): boolean {\n\t\tif (isKeyRelease(data) || !this.keybindings.matches(data, \"app.thinking.toggle\")) return false;\n\t\t// Reuse the default editor's action dispatcher even while a workflow\n\t\t// overlay owns focus. This keeps the host binding and its user remap as\n\t\t// the source of truth instead of calling the implementation directly.\n\t\treturn this.defaultEditor.handleInput(data);\n\t}\n\n\tprivate readonly onRightClickPaste = (): void => {\n\t\tvoid this.handleRightClickPaste();\n\t};\n\n\tchatContainer: Container;\n\tdocumentContainer: Container;\n\n\ttranscriptScrollView: ScrollView | undefined;\n\n\tfullscreenLayoutRoot: Component | undefined;\n\n\tresourceDisclosureContainer: Container;\n\tstartupNoticesContainer: Container;\n\tpendingMessagesContainer: Container;\n\n\tstatusContainer: Container;\n\n\tdefaultEditor: CustomEditor;\n\n\teditor: EditorComponent;\n\n\teditorComponentFactory: EditorFactory | undefined;\n\n\tautocompleteProvider: AutocompleteProvider | undefined;\n\n\tautocompleteProviderWrappers: AutocompleteProviderFactory[] = [];\n\n\tfdPath: string | undefined;\n\n\teditorContainer: Container;\n\n\tactiveSelectorToken: object | undefined;\n\n\tactiveSelectorDispose: (() => void) | undefined;\n\n\tfooter: FooterComponent;\n\tfooterContainer: Container;\n\n\tusageMeter: UsageMeterComponent;\n\n\tfooterDataProvider: FooterDataProvider;\n\n\t// Stored so the same manager can be injected into custom editors, selectors, and extension UI.\n\tkeybindings: KeybindingsManager;\n\n\treloadCoordinator: KeybindingsReloadCoordinator;\n\n\tinteractiveEngineShortcutHandler: ((data: string) => boolean) | undefined;\n\n\tdisposeInteractiveEngineHost: () => void = () => {};\n\n\tversion: string;\n\n\tisInitialized = false;\n\n\tonInputCallback?: (submission: InteractiveSubmission) => void;\n\n\tpendingUserInputs: InteractiveSubmission[] = [];\n\n\tstartupReplayInputs: string[] = [];\n\n\tstartupReplayActiveInput: string | undefined = undefined;\n\n\tstartupDraftText: string | undefined = undefined;\n\n\tstartupCookedInputRecovered = false;\n\n\tdeferredRenderedUserInputs: string[] = [];\n\n\tdeferredRenderedUserInputComponents = new Map<string, Component[][]>();\n\n\tloadingAnimation: Loader | AtomicWorkingLoader | undefined = undefined;\n\n\tworkingMessage: string | undefined = undefined;\n\n\tworkingVisible = true;\n\n\tworkingIndicatorOptions: LoaderIndicatorOptions | undefined = undefined;\n\n\treadonly defaultWorkingMessage = \"Working...\";\n\n\treadonly defaultHiddenThinkingLabel = \"Thinking...\";\n\n\thiddenThinkingLabel = this.defaultHiddenThinkingLabel;\n\n\tlastSigintTime = 0;\n\n\tlastEscapeTime = 0;\n\n\tchangelogMarkdown: string | undefined = undefined;\n\n\tstartupNoticesShown = false;\n\tstartupNoticesPrepared = false;\n\n\tanthropicSubscriptionWarningShown = false;\n\n\tfirstRunNoticeVisible = false;\n\n\thadLastChangelogVersionAtStartup = false;\n\n\tfirstRunOnboardingNoticeComponents: Component[] = [];\n\n\tautoTrustOnReloadCwd: string | undefined;\n\n\t// Status line tracking (for mutating immediately-sequential status updates)\n\tlastStatusSpacer: Spacer | undefined = undefined;\n\n\tlastStatusText: Text | undefined = undefined;\n\n\t/** Leading spacer added once for the managed-tool startup status block. */\n\tmanagedToolStatusStarted = false;\n\t/** Invalidates readiness callbacks after the transcript is rebuilt for another session. */\n\tmanagedToolStatusGeneration = 0;\n\n\t// Streaming message tracking\n\tstreamingComponent: AssistantMessageComponent | undefined = undefined;\n\n\tstreamingMessage: AssistantMessage | undefined = undefined;\n\n\t// Tool execution tracking: toolCallId -> component\n\tpendingTools = new Map<string, ToolExecutionComponent | RemoteToolExecutionComponent>();\n\n\t// Tool output expansion state\n\ttoolOutputExpanded = false;\n\n\t// Thinking block visibility state\n\thideThinkingBlock = false;\n\toutputPad: 0 | 1 = 1;\n\n\tmermaidMarkdownTransformer: MarkdownTransformer = createMermaidMarkdownTransformer({\n\t\tgetMode: () => this.settingsManager.getMermaidRenderingMode(),\n\t\ttheme,\n\t});\n\tmermaidMarkdownTransformerMode: MermaidRenderingMode | undefined;\n\n\t// Skill commands: command name -> skill file path\n\tskillCommands = new Map<string, string>();\n\n\t// Agent subscription unsubscribe function\n\tunsubscribe?: () => void;\n\n\tsignalCleanupHandlers: Array<() => void> = [];\n\n\t// Track if editor is in bash mode (text starts with !)\n\tisBashMode = false;\n\n\t// Track current bash execution component\n\tbashComponent: BashExecutionComponent | undefined = undefined;\n\n\t// Track pending bash components (shown in pending area, moved to chat on submit)\n\tpendingBashComponents: BashExecutionComponent[] = [];\n\n\t// Auto-compaction state\n\tautoCompactionLoader: AtomicWorkingLoader | undefined = undefined;\n\n\tautoCompactionEscapeHandler?: () => void;\n\n\t/** True once the pre-compaction Escape handler has been captured for restore. */\n\tautoCompactionEscapeHandlerSaved = false;\n\n\t/** True while `runUserPromptTurn()` owns the working loader. */\n\tpromptTurnWorkingLoaderActive = false;\n\n\t// Auto-retry state\n\tretryLoader: Loader | undefined = undefined;\n\tfallbackLoader: Loader | undefined = undefined;\n\n\tretryCountdown: CountdownTimer | undefined = undefined;\n\n\tretryEscapeHandler?: () => void;\n\n\t// Messages queued while compaction is running\n\tcompactionQueuedMessages: CompactionQueuedMessage[] = [];\n\n\t/** Keeps input queued while automatic compaction hands off to a manual request. */\n\tmanualCompactionTakeoverPending = false;\n\n\t// Deferred extension load state (first paint happens before extensions load)\n\tdeferredStartupPending = false;\n\tinitialStartupBinding = false;\n\tdeferredStartupPromise: Promise<void> | undefined = undefined;\n\n\tinputHandlerReadyRecorded = false;\n\n\tfirstSubmitRecorded = false;\n\n\t// Shutdown state\n\tshutdownRequested = false;\n\n\t// Extension UI state\n\textensionSelector: ExtensionSelectorComponent | undefined = undefined;\n\n\textensionInput: ExtensionInputComponent | undefined = undefined;\n\n\textensionEditor: ExtensionEditorComponent | undefined = undefined;\n\n\ttuiInputSubscriptions = new Set<InteractiveTuiInputSubscription>();\n\n\textensionTerminalInputSubscriptions = new Set<InteractiveTuiInputSubscription>();\n\n\ttuiRendererChangeListeners = new Set<() => void>();\n\n\tblockingInlineCustomUiDepth = 0;\n\n\tdeferredInlineCustomUiFocusDepth = 0;\n\n\tpendingInlineCustomUiFocus: Component | undefined = undefined;\n\n\thostCustomUiStateListeners = new Set<HostCustomUiStateListener>();\n\n\ttranscriptOverlayReserve: TranscriptOverlayReserve | undefined = undefined;\n\n\tthemeController: InteractiveThemeController;\n\n\t// Extension widgets (components rendered above/below the editor)\n\textensionWidgetsAbove = new Map<string, Component & { dispose?(): void }>();\n\n\textensionWidgetsBelow = new Map<string, Component & { dispose?(): void }>();\n\n\twidgetContainerAbove!: Container;\n\n\twidgetContainerBelow!: Container;\n\n\t// Custom footer from extension (undefined = use built-in footer)\n\tcustomFooter: (Component & { dispose?(): void }) | undefined = undefined;\n\n\t// Header container that holds the built-in or custom header\n\theaderContainer: Container;\n\n\t// Built-in header (logo + keybinding hints + changelog)\n\tbuiltInHeader: Component | undefined = undefined;\n\n\t// Custom header from extension (undefined = use built-in header)\n\tcustomHeader: (Component & { dispose?(): void }) | undefined = undefined;\n\n\t// Convenience accessors\n\tget session(): AgentSession & AgentSessionQueuePauseControl {\n\t\treturn this.runtimeHost.session as AgentSession & AgentSessionQueuePauseControl;\n\t}\n\n\t/** Includes the short handoff window that an isolated engine cannot mirror. */\n\tget compactionActive(): boolean {\n\t\treturn this.session.isCompacting || this.manualCompactionTakeoverPending;\n\t}\n\n\tget agent() {\n\t\treturn this.session.agent;\n\t}\n\n\tget sessionManager() {\n\t\treturn this.session.sessionManager;\n\t}\n\n\tget settingsManager() {\n\t\treturn this.session.settingsManager;\n\t}\n\n\t/**\n\t * Tears down the selector that owns `editorContainer`, including in-flight\n\t * work such as a model catalog refresh.\n\t *\n\t * This lives on the base class so behavior modules can dispose a selector\n\t * without relying on `interactive-selectors.ts` load order.\n\t */\n\tdisposeActiveSelector(): void {\n\t\tconst dispose = this.activeSelectorDispose;\n\t\tthis.activeSelectorToken = undefined;\n\t\tthis.activeSelectorDispose = undefined;\n\t\tdispose?.();\n\t}\n\n\taddTuiInputListener(handler: TuiInputListener): () => void {\n\t\tconst subscription: InteractiveTuiInputSubscription = {\n\t\t\thandler,\n\t\t\tunsubscribe: this.ui.addInputListener(handler),\n\t\t};\n\t\tthis.tuiInputSubscriptions.add(subscription);\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t\tthis.tuiInputSubscriptions.delete(subscription);\n\t\t};\n\t}\n\n\trebindTuiInputListeners(): void {\n\t\tfor (const subscription of this.tuiInputSubscriptions) {\n\t\t\tsubscription.unsubscribe();\n\t\t\tsubscription.unsubscribe = this.ui.addInputListener(subscription.handler);\n\t\t}\n\t}\n\n\tonTuiRendererChange(listener: () => void): () => void {\n\t\tthis.tuiRendererChangeListeners.add(listener);\n\t\treturn () => this.tuiRendererChangeListeners.delete(listener);\n\t}\n\n\tmountInteractiveTui(tui: TUI, components: readonly Component[]): void {\n\t\tfor (const component of components) tui.addChild(component);\n\t\tif (isViewportTUI(tui)) {\n\t\t\tif (!this.fullscreenLayoutRoot) throw new Error(\"Fullscreen layout is not initialized\");\n\t\t\ttui.setLayoutRoot(this.fullscreenLayoutRoot);\n\t\t}\n\t}\n\n\tprivate async handleRightClickPaste(): Promise<void> {\n\t\tconst target = this.renderer.getFocusedComponent();\n\t\tconst handleInput = target?.handleInput;\n\t\tif (!target || !handleInput) return;\n\t\ttry {\n\t\t\tconst text = await readClipboardText();\n\t\t\tif (!text || this.renderer.getFocusedComponent() !== target) return;\n\t\t\thandleInput.call(target, `\\x1b[200~${text}\\x1b[201~`);\n\t\t\tthis.ui.requestRender();\n\t\t} catch {\n\t\t\t// Clipboard paste is best-effort; permission and native-module failures are common.\n\t\t}\n\t}\n\n\tstopInteractiveTui(fullscreenExitOutput: FullscreenExitOutput): void {\n\t\tconst isFullscreen = this.renderer.mode === \"fullscreen\";\n\t\tif (isFullscreen && fullscreenExitOutput === \"transcript\") {\n\t\t\t// Atomic has no regular renderer to switch into, so pi-tui's own\n\t\t\t// exit paint is the only painter: its stop renders the layout root\n\t\t\t// at natural height onto the main screen. The docked fullscreen\n\t\t\t// layout squeezes its scroll view to `basis` (one row) at natural\n\t\t\t// height, so hand it the document container directly — the exit\n\t\t\t// paint then carries the whole transcript. Drop overlays first so\n\t\t\t// what gets painted is the transcript, not the focused dialog.\n\t\t\twhile (this.renderer.hasOverlayEntries) this.renderer.hideOverlay();\n\t\t\tif (isViewportTUI(this.renderer)) this.renderer.setLayoutRoot(this.documentContainer);\n\t\t}\n\t\t// `resume-hint` keeps whatever the alternate screen held: the prior\n\t\t// shell contents reappear and shutdown prints only the resume line.\n\t\tthis.ui.stop({ preserveScreen: isFullscreen && fullscreenExitOutput === \"resume-hint\" });\n\t}\n\n\tdeclare options: InteractiveModeOptions;\n\n\tconstructor(runtimeHost: AgentSessionRuntime, options: InteractiveModeOptions = {}) {\n\t\tthis.runtimeHost = runtimeHost;\n\t\tthis.options = options;\n\t\tthis.deferredStartupPending = Boolean(options.deferredExtensionLoad);\n\t\tthis.autoTrustOnReloadCwd = options.autoTrustOnReloadCwd;\n\t\tthis.runtimeHost.setBeforeSessionInvalidate(() => {\n\t\t\tthis.resetExtensionUI();\n\t\t});\n\t\tthis.runtimeHost.setRebindSession(async () => {\n\t\t\tawait this.rebindCurrentSession();\n\t\t\t// A rebound session can carry a different settings manager; re-apply\n\t\t\t// the theme so the live selection tracks the session that is current.\n\t\t\tawait this.themeController.applyFromSettings();\n\t\t});\n\t\tthis.version = VERSION;\n\t\tthis.renderer = createInteractiveTui({\n\t\t\tshowHardwareCursor: this.settingsManager.getShowHardwareCursor(),\n\t\t\tlogDirectory: runtimeHost.services.agentDir,\n\t\t\tterminal: options.terminal,\n\t\t\tonRightClickPaste: this.onRightClickPaste,\n\t\t\tshouldHandleViewportInput: this.shouldHandleViewportInput,\n\t\t\tonOverlayUnhandledInput: this.onOverlayUnhandledInput,\n\t\t\tonOverlayInternalUiAction: this.onOverlayInternalUiAction,\n\t\t\tonInternalUiAction: () => {\n\t\t\t\tthis.jumpToTranscriptEnd();\n\t\t\t\treturn undefined;\n\t\t\t},\n\t\t});\n\t\tthis.ui = createInteractiveTuiReference(() => this.renderer);\n\t\tthis.ui.setClearOnShrink(this.settingsManager.getClearOnShrink());\n\t\tthis.headerContainer = new Container();\n\t\tthis.documentContainer = new Container();\n\t\tthis.documentContainer.addChild(this.headerContainer);\n\t\tthis.chatContainer = new StartupChatContainer();\n\t\tthis.documentContainer.addChild(this.chatContainer);\n\t\tthis.resourceDisclosureContainer = new Container();\n\t\tthis.startupNoticesContainer = new Container();\n\t\t// The isolated engine can emit session_start UI requests as soon as its\n\t\t// bridge attaches below, before init() mounts chat in the TUI. Reserve the\n\t\t// ordering slots now so those messages can never precede RESOURCES.\n\t\tthis.chatContainer.addChild(this.resourceDisclosureContainer);\n\t\tthis.chatContainer.addChild(this.startupNoticesContainer);\n\t\tthis.pendingMessagesContainer = new Container();\n\t\tthis.statusContainer = new Container();\n\t\tthis.widgetContainerAbove = new Container();\n\t\tthis.widgetContainerBelow = new Container();\n\t\tthis.keybindings = KeybindingsManager.create(runtimeHost.services.agentDir);\n\t\tthis.reloadCoordinator = new KeybindingsReloadCoordinator(this.keybindings);\n\t\tsetKeybindings(this.keybindings);\n\t\tconst editorPaddingX = this.settingsManager.getEditorPaddingX();\n\t\tconst autocompleteMaxVisible = this.settingsManager.getAutocompleteMaxVisible();\n\t\tthis.defaultEditor = new CustomEditor(this.ui, getEditorTheme(), this.keybindings, {\n\t\t\tpaddingX: editorPaddingX,\n\t\t\tautocompleteMaxVisible,\n\t\t});\n\n\t\tthis.editor = this.defaultEditor;\n\t\tthis.editorContainer = new Container();\n\t\tthis.editorContainer.addChild(this.editor as Component);\n\t\tthis.footerDataProvider = new FooterDataProvider(this.sessionManager.getCwd());\n\t\tthis.footer = new FooterComponent(this.session, this.footerDataProvider);\n\t\tthis.footerContainer = new Container();\n\t\tthis.footerContainer.addChild(this.footer);\n\t\tthis.usageMeter = new UsageMeterComponent(this.session);\n\t\tthis.usageMeter.setAutoCompactEnabled(this.session.autoCompactionEnabled);\n\n\t\t// Load hide thinking block setting\n\t\tthis.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();\n\t\tthis.outputPad = this.settingsManager.getOutputPad();\n\n\t\t// Register themes from resource loader and initialize\n\t\tsetRegisteredThemes(this.session.resourceLoader.getThemes().themes);\n\t\tthis.themeController = new InteractiveThemeController(this.ui, {\n\t\t\tgetSettingsManager: () => this.settingsManager,\n\t\t\tshowError: (message) => this.showError(message),\n\t\t\tonChanged: () => this.updateEditorBorderColor(),\n\t\t\tinitialThemeSetting: options.initialThemeSetting,\n\t\t});\n\t\tthis.disposeInteractiveEngineHost = attachInteractiveEngineHost(\n\t\t\truntimeHost,\n\t\t\tthis.createExtensionUIContext(),\n\t\t\t(diagnostic) =>\n\t\t\t\trenderEngineDiagnostic(diagnostic, {\n\t\t\t\t\tstopWorkingLoader: () => this.stopWorkingLoader(),\n\t\t\t\t\tshowStatus: (message) => this.showStatus(message),\n\t\t\t\t\tshowError: (message) => this.showError(message),\n\t\t\t\t}),\n\t\t\t{\n\t\t\t\tisFullscreen: () => this.renderer.mode === \"fullscreen\",\n\t\t\t\tonRendererReplaced: (listener) => this.onTuiRendererChange(listener),\n\t\t\t},\n\t\t\t(handler) => {\n\t\t\t\tthis.interactiveEngineShortcutHandler = handler;\n\t\t\t\tthis.defaultEditor.onExtensionShortcut = handler;\n\t\t\t\treturn () => {\n\t\t\t\t\tif (this.interactiveEngineShortcutHandler === handler) this.interactiveEngineShortcutHandler = undefined;\n\t\t\t\t\tif (this.defaultEditor.onExtensionShortcut === handler)\n\t\t\t\t\t\tthis.defaultEditor.onExtensionShortcut = undefined;\n\t\t\t\t};\n\t\t\t},\n\t\t\tthis.keybindings,\n\t\t);\n\t}\n\n\t// Maximum total widget lines to prevent viewport overflow\n\tstatic readonly MAX_WIDGET_LINES = 10;\n\n\t/**\n\t * Gracefully shutdown the agent.\n\t * Stops the TUI before emitting shutdown events so extension UI cleanup cannot\n\t * repaint the final frame while the process is exiting.\n\t */\n\tisShuttingDown = false;\n}\n"]}
@@ -1,6 +1,8 @@
1
1
  /** Method surface installed onto InteractiveModeBase by sibling modules. */
2
2
  import type { MarkdownTransformer } from "../../core/extensions/types.ts";
3
3
  import type { CustomEntry, SessionEntry } from "../../core/session-manager.ts";
4
+ import type { FullscreenExitOutput } from "../../core/settings-manager.ts";
5
+ import type { ToolStatus } from "../../utils/tools-manager.ts";
4
6
  import type { JsonAgentSessionEvent } from "../json-event.ts";
5
7
  import type { AtomicWorkingLoader } from "./components/atomic-working-status.ts";
6
8
  import type { AgentMessage, AgentSession, AgentSessionEvent, Api, AppKeybinding, AuthSelectorProvider, AutocompleteProvider, ChatMessageEntry, ChatMessageRenderOptions, Component, Container, EditorFactory, ExtensionCommandContext, ExtensionEditorComponent, ExtensionInputComponent, ExtensionRunner, ExtensionSelectorComponent, ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions, HostCustomUiState, HostCustomUiStateListener, Keybinding, KeybindingsManager, Loader, LoaderIndicatorOptions, LoginDialogComponent, MarkdownTheme, Message, MissingSessionCwdError, Model, OAuthSelectPrompt, OverlayHandle, OverlayOptions, ProjectTrustContext, ReadonlyFooterDataProvider, ResourceDiagnostic, SessionContext, SlashCommand, SourceInfo, Theme, TUI, VerbatimCompactionResult } from "./interactive-mode-deps.ts";
@@ -198,6 +200,8 @@ declare module "./interactive-mode-base.ts" {
198
200
  overlay?: boolean;
199
201
  deferInlineCustomUiFocus?: boolean;
200
202
  handlesInternalUiAction?: boolean;
203
+ /** Overlay-only: bound the overlay and reserve transcript scroll extent. */
204
+ reserveTranscriptRows?: boolean;
201
205
  signal?: AbortSignal;
202
206
  overlayOptions?: OverlayOptions | (() => OverlayOptions);
203
207
  onHandle?: (handle: OverlayHandle) => void;
@@ -214,6 +218,10 @@ declare module "./interactive-mode-base.ts" {
214
218
  handleEvent(event: AgentSessionEvent | JsonAgentSessionEvent): Promise<void>;
215
219
  getUserMessageText(message: Message): string;
216
220
  showStatus(message: string): void;
221
+ /** Report a managed-tool (fd/rg) readiness update inside the transcript. */
222
+ showManagedToolStatus(status: ToolStatus): void;
223
+ /** Bring fd/rg to readiness after first paint; progress lands in the transcript. */
224
+ ensureManagedToolsReady(): Promise<void>;
217
225
  chatMessageRenderOptions(): ChatMessageRenderOptions;
218
226
  addRenderedChatEntry(entry: ChatMessageEntry): Component;
219
227
  addCompactionBoundaryToChat(result: VerbatimCompactionResult): void;
@@ -354,7 +362,7 @@ declare module "./interactive-mode-base.ts" {
354
362
  }): void;
355
363
  handleBashCommand(command: string, excludeFromContext?: boolean): Promise<void>;
356
364
  handleCompactCommand(): Promise<void>;
357
- stop(): void;
365
+ stop(fullscreenExitOutput?: FullscreenExitOutput): void;
358
366
  }
359
367
  }
360
368
  //# sourceMappingURL=interactive-mode-surface.d.ts.map