@opengsd/gsd-pi 1.2.0-dev.0b870afa → 1.2.0-dev.23d85b63

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 (579) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +14 -19
  4. package/dist/headless-events.d.ts +16 -1
  5. package/dist/headless-events.js +19 -2
  6. package/dist/headless.js +8 -1
  7. package/dist/loader.js +6 -4
  8. package/dist/onboarding.js +9 -4
  9. package/dist/provider-migrations.d.ts +23 -0
  10. package/dist/provider-migrations.js +41 -0
  11. package/dist/register-agent-bundles.d.ts +11 -2
  12. package/dist/register-agent-bundles.js +18 -4
  13. package/dist/resource-loader.d.ts +10 -5
  14. package/dist/resource-loader.js +121 -6
  15. package/dist/resources/.managed-resources-content-hash +1 -1
  16. package/dist/resources/extensions/ask-user-questions.js +3 -2
  17. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  18. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  19. package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
  20. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  21. package/dist/resources/extensions/gsd/auto/dispatch-history.js +21 -6
  22. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  23. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  24. package/dist/resources/extensions/gsd/auto/loop.js +4 -1
  25. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  26. package/dist/resources/extensions/gsd/auto/orchestrator.js +119 -18
  27. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  28. package/dist/resources/extensions/gsd/auto/phases.js +17 -2372
  29. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +542 -0
  30. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  31. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  33. package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
  34. package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
  35. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
  36. package/dist/resources/extensions/gsd/auto-dispatch.js +19 -1
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +9 -6
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +12 -8
  39. package/dist/resources/extensions/gsd/auto-prompts.js +5 -1
  40. package/dist/resources/extensions/gsd/auto-recovery.js +52 -6
  41. package/dist/resources/extensions/gsd/auto-start.js +28 -7
  42. package/dist/resources/extensions/gsd/auto-worktree.js +48 -3
  43. package/dist/resources/extensions/gsd/auto.js +83 -19
  44. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +4 -2
  45. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
  46. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -1
  47. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +32 -3
  48. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +56 -16
  49. package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
  50. package/dist/resources/extensions/gsd/commands/handlers/core.js +22 -8
  51. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  52. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  53. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +8 -0
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  55. package/dist/resources/extensions/gsd/config-overlay.js +11 -8
  56. package/dist/resources/extensions/gsd/db/engine.js +24 -6
  57. package/dist/resources/extensions/gsd/db/queries.js +30 -0
  58. package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
  59. package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
  60. package/dist/resources/extensions/gsd/db-transaction.js +27 -23
  61. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  62. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  63. package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
  64. package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
  65. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +11 -9
  66. package/dist/resources/extensions/gsd/gsd-db.js +15 -20
  67. package/dist/resources/extensions/gsd/guided-flow.js +88 -2
  68. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  69. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  70. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  71. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  72. package/dist/resources/extensions/gsd/notifications.js +12 -7
  73. package/dist/resources/extensions/gsd/preferences-models.js +17 -9
  74. package/dist/resources/extensions/gsd/preferences.js +91 -5
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +6 -2
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +7 -2
  78. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/run-uat.md +7 -1
  81. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  83. package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
  84. package/dist/resources/extensions/gsd/session-lock.js +4 -3
  85. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  86. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +13 -6
  87. package/dist/resources/extensions/gsd/state.js +6 -2
  88. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  89. package/dist/resources/extensions/gsd/tools/complete-task.js +62 -0
  90. package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
  91. package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
  92. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  93. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  94. package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
  95. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  96. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  97. package/dist/resources/extensions/gsd/worktree-manager.js +101 -2
  98. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  99. package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
  100. package/dist/resources/extensions/gsd/worktree.js +8 -1
  101. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  102. package/dist/resources/extensions/search-the-web/index.js +41 -9
  103. package/dist/resources/extensions/search-the-web/native-search.js +18 -4
  104. package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
  105. package/dist/resources/extensions/subagent/index.js +20 -15
  106. package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
  107. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  108. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  109. package/dist/runtime-checks.d.ts +10 -0
  110. package/dist/runtime-checks.js +27 -0
  111. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  112. package/dist/web/standalone/.next/BUILD_ID +1 -1
  113. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  114. package/dist/web/standalone/.next/build-manifest.json +2 -2
  115. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  116. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  129. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  130. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  133. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  134. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  135. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  136. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  137. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  138. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  139. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  140. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  141. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  142. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  143. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  144. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  145. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  146. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  147. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  149. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  151. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  153. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  159. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  165. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/index.html +1 -1
  167. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  168. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  174. package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
  175. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  176. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  178. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  179. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  180. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  181. package/package.json +4 -4
  182. package/packages/cloud-mcp-gateway/package.json +2 -2
  183. package/packages/contracts/package.json +1 -1
  184. package/packages/daemon/package.json +4 -4
  185. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  186. package/packages/gsd-agent-core/dist/sdk.js +12 -6
  187. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  188. package/packages/gsd-agent-core/package.json +5 -5
  189. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
  190. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  191. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
  192. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
  193. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
  194. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
  195. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
  196. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  197. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
  198. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  199. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
  200. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
  201. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
  202. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
  203. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
  204. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  205. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
  206. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  207. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
  208. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  209. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
  210. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
  211. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
  212. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
  213. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
  214. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
  215. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
  216. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
  217. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
  218. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
  219. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
  220. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
  221. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
  222. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
  223. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
  224. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  225. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
  226. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  227. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  228. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  229. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  230. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  231. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
  232. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  233. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
  234. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  235. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +11 -0
  236. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  237. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +85 -19
  238. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  239. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +71 -3
  240. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +257 -37
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
  244. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
  246. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
  248. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -10
  250. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
  252. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  254. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +5 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  260. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  261. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
  262. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  263. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
  264. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  265. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
  266. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  267. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
  268. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  269. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
  270. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
  271. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
  272. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
  273. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
  274. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
  275. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
  276. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
  277. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  278. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  279. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +10 -2
  280. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  281. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +48 -6
  282. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  283. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  284. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  285. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  286. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
  287. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
  288. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
  289. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  290. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -0
  291. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  292. package/packages/gsd-agent-modes/package.json +7 -7
  293. package/packages/mcp-server/README.md +12 -3
  294. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  295. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  296. package/packages/mcp-server/dist/cli-runner.js +137 -0
  297. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  298. package/packages/mcp-server/dist/cli.js +2 -58
  299. package/packages/mcp-server/dist/cli.js.map +1 -1
  300. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  301. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  302. package/packages/mcp-server/dist/pid-registry.js +459 -0
  303. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  304. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  305. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  306. package/packages/mcp-server/dist/probe-mode.js +10 -0
  307. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  308. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  309. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  310. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  311. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  312. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  313. package/packages/mcp-server/dist/workflow-tools.js +62 -43
  314. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  315. package/packages/mcp-server/package.json +5 -5
  316. package/packages/native/package.json +1 -1
  317. package/packages/pi-agent-core/dist/agent-loop.js +52 -2
  318. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  319. package/packages/pi-agent-core/package.json +1 -1
  320. package/packages/pi-ai/package.json +1 -1
  321. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
  322. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  323. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  325. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
  328. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
  330. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  331. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  332. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  333. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  334. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  336. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  337. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  340. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  341. package/packages/pi-coding-agent/package.json +8 -8
  342. package/packages/pi-tui/README.md +15 -0
  343. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  344. package/packages/pi-tui/dist/autocomplete.js +6 -1
  345. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  346. package/packages/pi-tui/dist/components/input.js +1 -1
  347. package/packages/pi-tui/dist/components/input.js.map +1 -1
  348. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  349. package/packages/pi-tui/dist/components/loader.js +1 -0
  350. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  351. package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/components/select-list.js +8 -2
  353. package/packages/pi-tui/dist/components/select-list.js.map +1 -1
  354. package/packages/pi-tui/dist/index.d.ts +2 -2
  355. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  356. package/packages/pi-tui/dist/index.js +2 -2
  357. package/packages/pi-tui/dist/index.js.map +1 -1
  358. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  359. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  360. package/packages/pi-tui/dist/terminal-image.js +54 -2
  361. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  362. package/packages/pi-tui/dist/terminal.d.ts +12 -0
  363. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  364. package/packages/pi-tui/dist/terminal.js +70 -25
  365. package/packages/pi-tui/dist/terminal.js.map +1 -1
  366. package/packages/pi-tui/dist/tui.d.ts +15 -0
  367. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  368. package/packages/pi-tui/dist/tui.js +106 -21
  369. package/packages/pi-tui/dist/tui.js.map +1 -1
  370. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  371. package/packages/pi-tui/dist/utils.js +110 -36
  372. package/packages/pi-tui/dist/utils.js.map +1 -1
  373. package/packages/pi-tui/package.json +2 -2
  374. package/packages/rpc-client/package.json +2 -2
  375. package/pkg/dist/theme/theme.d.ts.map +1 -1
  376. package/pkg/dist/theme/theme.js +45 -17
  377. package/pkg/dist/theme/theme.js.map +1 -1
  378. package/pkg/package.json +1 -1
  379. package/src/resources/extensions/ask-user-questions.ts +7 -2
  380. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
  381. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  382. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  383. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  384. package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
  385. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  386. package/src/resources/extensions/gsd/auto/dispatch-history.ts +22 -6
  387. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  388. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  389. package/src/resources/extensions/gsd/auto/loop.ts +4 -1
  390. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  391. package/src/resources/extensions/gsd/auto/orchestrator.ts +140 -18
  392. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  393. package/src/resources/extensions/gsd/auto/phases.ts +58 -3061
  394. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +716 -0
  395. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  396. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  397. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  398. package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
  399. package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
  400. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  401. package/src/resources/extensions/gsd/auto-dispatch.ts +24 -2
  402. package/src/resources/extensions/gsd/auto-model-selection.ts +20 -5
  403. package/src/resources/extensions/gsd/auto-post-unit.ts +16 -9
  404. package/src/resources/extensions/gsd/auto-prompts.ts +5 -1
  405. package/src/resources/extensions/gsd/auto-recovery.ts +62 -8
  406. package/src/resources/extensions/gsd/auto-start.ts +44 -7
  407. package/src/resources/extensions/gsd/auto-worktree.ts +51 -3
  408. package/src/resources/extensions/gsd/auto.ts +118 -18
  409. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +6 -2
  410. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
  411. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -1
  412. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +36 -3
  413. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +69 -16
  414. package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
  415. package/src/resources/extensions/gsd/commands/handlers/core.ts +27 -8
  416. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -2
  417. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  418. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +7 -0
  419. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  420. package/src/resources/extensions/gsd/config-overlay.ts +22 -9
  421. package/src/resources/extensions/gsd/db/engine.ts +26 -6
  422. package/src/resources/extensions/gsd/db/queries.ts +29 -0
  423. package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
  424. package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
  425. package/src/resources/extensions/gsd/db-transaction.ts +37 -20
  426. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  427. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  428. package/src/resources/extensions/gsd/doctor-git-checks.ts +4 -1
  429. package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
  430. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +10 -10
  431. package/src/resources/extensions/gsd/gsd-db.ts +15 -19
  432. package/src/resources/extensions/gsd/guided-flow.ts +128 -2
  433. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  434. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  435. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  436. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  437. package/src/resources/extensions/gsd/notifications.ts +13 -6
  438. package/src/resources/extensions/gsd/preferences-models.ts +26 -8
  439. package/src/resources/extensions/gsd/preferences.ts +111 -5
  440. package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  441. package/src/resources/extensions/gsd/prompts/complete-slice.md +6 -2
  442. package/src/resources/extensions/gsd/prompts/execute-task.md +7 -2
  443. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  444. package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  445. package/src/resources/extensions/gsd/prompts/run-uat.md +7 -1
  446. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  448. package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
  449. package/src/resources/extensions/gsd/session-lock.ts +8 -7
  450. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  451. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +23 -10
  452. package/src/resources/extensions/gsd/state.ts +7 -1
  453. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  454. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
  456. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
  457. package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
  458. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  459. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
  460. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +16 -1
  461. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +89 -22
  462. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  463. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +97 -4
  464. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  465. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  466. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  467. package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
  468. package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
  469. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
  470. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  471. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
  472. package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
  473. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
  474. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
  475. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  476. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +2 -1
  477. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
  478. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  479. package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
  480. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +55 -0
  481. package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
  482. package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
  483. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  484. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
  485. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  486. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  487. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
  488. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
  489. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +19 -0
  490. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +16 -0
  491. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
  492. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  493. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  494. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +18 -0
  495. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
  496. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  497. package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
  498. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  499. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  500. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  501. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  503. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  504. package/src/resources/extensions/gsd/tests/model-router.test.ts +139 -0
  505. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  506. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
  507. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
  508. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +335 -0
  509. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  510. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +5 -0
  511. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  512. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +1 -1
  513. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  514. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
  515. package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
  516. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
  517. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +11 -2
  518. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
  519. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  520. package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
  521. package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
  522. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
  523. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
  524. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  525. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
  526. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +7 -1
  527. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
  528. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
  529. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  530. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  531. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  532. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +17 -1
  533. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  534. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  535. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
  536. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
  537. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  538. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
  539. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
  540. package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
  541. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  542. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  543. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  544. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  545. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  546. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  547. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +36 -0
  548. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  549. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  550. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  551. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  552. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
  553. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  554. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  555. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  556. package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
  557. package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
  558. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  559. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  560. package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
  561. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  562. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  563. package/src/resources/extensions/gsd/worktree-manager.ts +97 -2
  564. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  565. package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
  566. package/src/resources/extensions/gsd/worktree.ts +7 -1
  567. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  568. package/src/resources/extensions/search-the-web/index.ts +45 -9
  569. package/src/resources/extensions/search-the-web/native-search.ts +16 -4
  570. package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
  571. package/src/resources/extensions/subagent/index.ts +20 -15
  572. package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
  573. package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
  574. package/src/resources/skills/create-skill/SKILL.md +3 -0
  575. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  576. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  577. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  578. /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_buildManifest.js +0 -0
  579. /package/dist/web/standalone/.next/static/{T-LTxEw5wir5Lm5T3qEVd → Wn9u2NYq0cyUigB_3Z0_N}/_ssgManifest.js +0 -0
@@ -98,6 +98,24 @@ export async function initExtensions(host) {
98
98
  }
99
99
  export function setExtensionStatus(host, key, text) {
100
100
  host.footerDataProvider.setExtensionStatus(key, text);
101
+ host.footer.invalidate();
102
+ host.ui.requestRender();
103
+ }
104
+ export function setGsdProgress(host, state, dispose) {
105
+ if (dispose !== undefined) {
106
+ const prev = host.gsdProgressDispose;
107
+ host.gsdProgressDispose = dispose;
108
+ // Reset user's manual expansion for the new unit so widgetMode drives
109
+ // the initial state again (the user can re-collapse via ctrl+shift+d).
110
+ host.gsdStatusExpanded = undefined;
111
+ prev?.();
112
+ }
113
+ else if (state === undefined) {
114
+ const prev = host.gsdProgressDispose;
115
+ host.gsdProgressDispose = undefined;
116
+ prev?.();
117
+ }
118
+ host.gsdProgressState = state;
101
119
  host.ui.requestRender();
102
120
  }
103
121
  /**
@@ -169,6 +187,10 @@ export function resetExtensionUI(host) {
169
187
  host.setExtensionFooter(undefined);
170
188
  host.setExtensionHeader(undefined);
171
189
  clearExtensionWidgets(host);
190
+ const prevGsdDispose = host.gsdProgressDispose;
191
+ host.gsdProgressDispose = undefined;
192
+ host.gsdProgressState = undefined;
193
+ prevGsdDispose?.();
172
194
  host.footerDataProvider.clearExtensionStatuses();
173
195
  host.footer.invalidate();
174
196
  host.setCustomEditorComponent(undefined);
@@ -194,6 +216,9 @@ export function renderWidgets(host) {
194
216
  render: () => pinned.children.length > 0 ? [] : [""],
195
217
  invalidate: () => { },
196
218
  });
219
+ if (host.gsdStatusWidget) {
220
+ host.widgetContainerAbove.addChild(host.gsdStatusWidget);
221
+ }
197
222
  for (const component of host.extensionWidgetsAbove.values()) {
198
223
  host.widgetContainerAbove.addChild(component);
199
224
  }
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-extension-widgets.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-extension-widgets.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,gFAAgF;AAChF,cAAc;AAEd,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAA4B,MAAM,aAAa,CAAC;AAEhF,OAAO,EAAE,uBAAuB,EAAE,MAAM,kCAAkC,CAAC;AAC3E,OAAO,EAAE,2BAA2B,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAEtG,OAAO,EAAE,mBAAmB,EAAmB,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAClG,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAC;AAO1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAKzE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAiC;IACpE,IAAI,IAAI,CAAC,OAAO,CAAC,cAAc,KAAK,KAAK,EAAE,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAClD,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;YACjC,SAAS;YACT,qBAAqB,EAAE;gBACtB,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE;gBACnD,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;oBAC7B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;wBAC3B,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;wBAC7B,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;oBACnC,CAAC;oBACD,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;oBAE7B,8DAA8D;oBAC9D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;oBACvD,IAAI,CAAC,OAAO,EAAE,CAAC;wBACd,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;oBAC5B,CAAC;oBAED,iBAAiB;oBACjB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;oBAC3B,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;oBACtC,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAC;oBACnC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;oBACpC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC;oBAClC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;oBAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;oBAE1B,6DAA6D;oBAC7D,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC7B,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;oBAExB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBAC7B,CAAC;gBACD,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;oBACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAChD,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;wBACtB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;oBAC5B,CAAC;oBAED,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;oBAC3B,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC7B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;oBACzC,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;oBAEzC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBAC7B,CAAC;gBACD,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;oBACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,QAAQ,EAAE;wBACxD,SAAS,EAAE,OAAO,EAAE,SAAS;wBAC7B,kBAAkB,EAAE,OAAO,EAAE,kBAAkB;wBAC/C,mBAAmB,EAAE,OAAO,EAAE,mBAAmB;wBACjD,KAAK,EAAE,OAAO,EAAE,KAAK;qBACrB,CAAC,CAAC;oBACH,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;wBACtB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;oBAC5B,CAAC;oBAED,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;oBAC3B,IAAI,CAAC,qBAAqB,EAAE,CAAC;oBAC7B,IAAI,MAAM,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;wBACxD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBACxC,CAAC;oBACD,IAAI,CAAC,UAAU,CAAC,6BAA6B,CAAC,CAAC;oBAE/C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBAC7B,CAAC;gBACD,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;oBACpC,MAAM,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;oBAC5C,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;gBAC7B,CAAC;gBACD,MAAM,EAAE,KAAK,IAAI,EAAE;oBAClB,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBAClC,CAAC;aACD;YACD,eAAe,EAAE,GAAG,EAAE;gBACrB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;oBAC/B,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACtB,CAAC;YACF,CAAC;YACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBAClB,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YACxE,CAAC;SACD,CAAC,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC;IACpE,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAEzB,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IACrD,IAAI,CAAC,eAAe,EAAE,CAAC;QACtB,IAAI,CAAC,mBAAmB,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,OAAO;IACR,CAAC;IAED,uBAAuB,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAC/C,IAAI,CAAC,mBAAmB,CAAC,EAAE,cAAc,EAAE,eAAe,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACjG,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAiC,EAAE,GAAW,EAAE,IAAwB;IACzG,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACJ,MAAM,UAAU,kBAAkB,CAAC,IAAiC,EAAE,GAAW,EAC/E,OAA4F,EAC5F,OAAgC;IAEhC,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,aAAa,CAAC;IACtD,MAAM,cAAc,GAAG,CAAC,GAAkD,EAAE,EAAE;QAC7E,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,QAAQ,EAAE,OAAO;YAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC,CAAC;IAEF,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC3C,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAE3C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,aAAa,CAAC,IAAI,CAAG,CAAC;QACtB,OAAO;IACR,CAAC;IAED,IAAI,SAA2C,CAAC;IAEhD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,wDAAwD;QACxD,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,EAAE,CAAC;YACvD,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;YACvC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,wBAAwB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjF,CAAC;QACD,SAAS,GAAG,SAAS,CAAC;IACvB,CAAC;SAAM,CAAC;QACP,sCAAsC;QACtC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC;IACxG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC9B,aAAa,CAAC,IAAI,CAAG,CAAC;IACtB,0EAA0E;IAC1E,wEAAwE;IACxE,yDAAyD;IACzD,IAAI,GAAG,KAAK,aAAa,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QACpD,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,IAAiC;IACrE,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1D,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;IACpB,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1D,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;IACpB,CAAC;IACD,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;IACnC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;IACnC,aAAa,CAAC,IAAI,CAAG,CAAC;AACvB,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,IAAiC;IAChE,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC5B,qBAAqB,CAAC,IAAI,CAAG,CAAC;IAC/B,CAAC;IACD,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACzB,kBAAkB,CAAC,IAAI,CAAG,CAAC;IAC5B,CAAC;IACD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1B,mBAAmB,CAAC,IAAI,CAAG,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IACtB,IAAI,CAAC,oCAAoC,EAAE,CAAC;IAC5C,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IACnC,qBAAqB,CAAC,IAAI,CAAG,CAAC;IAC9B,IAAI,CAAC,kBAAkB,CAAC,sBAAsB,EAAE,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IACzB,IAAI,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACzC,IAAI,CAAC,aAAa,CAAC,mBAAmB,GAAG,SAAS,CAAC;IACnD,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC3B,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAC/B,GAAG,IAAI,CAAC,qBAAqB,KAAK,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,gBAAgB,CACvF,CAAC;IACH,CAAC;AACF,CAAC;AAED;;GAEG;AACJ,MAAM,UAAU,aAAa,CAAC,IAAiC;IAC7D,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,oBAAoB;QAAE,OAAO;IAErE,wEAAwE;IACxE,8EAA8E;IAC9E,0EAA0E;IAC1E,2EAA2E;IAC3E,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,CAAC;IAC3C,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC;QAClC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,UAAU,EAAE,GAAG,EAAE,GAAE,CAAC;KACpB,CAAC,CAAC;IACH,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,EAAE,CAAC;QAC7D,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,qBAAqB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACjG,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,IAAiC,EACrE,SAAoB,EACpB,OAAsD,EACtD,eAAwB,EACxB,aAAsB;IAEtB,uEAAuE;IACvE,uEAAuE;IACvE,SAAS,CAAC,cAAc,EAAE,CAAC;IAE3B,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACxB,IAAI,eAAe,EAAE,CAAC;YACrB,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,OAAO;IACR,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QACnB,SAAS,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1C,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;AACF,CAAC;AAED;;GAEG;AACJ,MAAM,UAAU,kBAAkB,CAAC,IAAiC,EAAE,OAExD;IAEZ,iCAAiC;IACjC,IAAI,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,gCAAgC;IAChC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACvB,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACb,0DAA0D;QAC1D,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACrE,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACP,0BAA0B;QAC1B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACJ,MAAM,UAAU,kBAAkB,CAAC,IAAiC,EAAE,OAAiF;IACrJ,0EAA0E;IAC1E,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO;IACR,CAAC;IAED,iCAAiC;IACjC,IAAI,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,+DAA+D;IAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAEnE,IAAI,OAAO,EAAE,CAAC;QACb,+BAA+B;QAC/B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;QAC1D,CAAC;aAAM,CAAC;YACP,oEAAoE;YACpE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1D,CAAC;IACF,CAAC;SAAM,CAAC;QACP,0BAA0B;QAC1B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;QAC9B,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAC3D,CAAC;IACF,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC;AAEF,MAAM,UAAU,iCAAiC,CAChD,IAAiC,EACjC,OAA2E;IAE1E,MAAM,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtD,IAAI,CAAC,mCAAmC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC1D,OAAO,GAAG,EAAE;QACX,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,mCAAmC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC9D,CAAC,CAAC;AACH,CAAC;AAEF,MAAM,UAAU,oCAAoC,CAAC,IAAiC;IACpF,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,mCAAmC,EAAE,CAAC;QACpE,WAAW,EAAE,CAAC;IACf,CAAC;IACD,IAAI,CAAC,mCAAmC,CAAC,KAAK,EAAE,CAAC;AAClD,CAAC","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n// @ts-nocheck\n\nimport { Container, Spacer, Text, type Component, type TUI } from \"@gsd/pi-tui\";\nimport type { ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions } from \"@gsd/pi-coding-agent/core/extensions/index.js\";\nimport { setupExtensionShortcuts } from \"./interactive-extension-tools.js\";\nexport { getRegisteredToolDefinition, formatWebSearchResult } from \"./interactive-extension-tools.js\";\nimport { FooterDataProvider, type ReadonlyFooterDataProvider } from \"@gsd/pi-coding-agent/core/footer-data-provider.js\";\nimport { setRegisteredThemes, setTheme, Theme, theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey } from \"./components/keybinding-hints.js\";\nimport { ExtensionEditorComponent } from \"./components/extension-editor.js\";\nimport { ExtensionInputComponent } from \"./components/extension-input.js\";\nimport { ExtensionSelectorComponent } from \"./components/extension-selector.js\";\nimport type { ExtensionNotifyType } from \"./interactive-notify-render.js\";\nimport { renderBlockingErrorBanner, renderExtensionNotifyInChat } from \"./interactive-notify-render.js\";\nimport { createExtensionUIContext as buildExtensionUIContext } from \"./controllers/extension-ui-controller.js\";\nimport { MAX_WIDGET_LINES } from \"./interactive-mode-class-constants.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\nimport { getEditorTheme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport type { EditorComponent, EditorTheme, KeybindingsManager, OverlayHandle, OverlayOptions } from \"@gsd/pi-tui\";\n\nexport async function initExtensions(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tif (host.options.bindExtensions !== false) {\n\t\t\tconst uiContext = host.createExtensionUIContext();\n\t\t\tawait host.session.bindExtensions({\n\t\t\t\tuiContext,\n\t\t\t\tcommandContextActions: {\n\t\t\t\t\twaitForIdle: () => host.session.agent.waitForIdle(),\n\t\t\t\t\tnewSession: async (options) => {\n\t\t\t\t\t\tif (host.loadingAnimation) {\n\t\t\t\t\t\t\thost.loadingAnimation.stop();\n\t\t\t\t\t\t\thost.loadingAnimation = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.statusContainer.clear();\n\n\t\t\t\t\t\t// Delegate to AgentSession (handles setup + agent state sync)\n\t\t\t\t\t\tconst success = await host.session.newSession(options);\n\t\t\t\t\t\tif (!success) {\n\t\t\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Clear UI state\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.pendingMessagesContainer.clear();\n\t\t\t\t\t\thost.compactionQueuedMessages = [];\n\t\t\t\t\t\thost.streamingComponent = undefined;\n\t\t\t\t\t\thost.streamingMessage = undefined;\n\t\t\t\t\t\thost.pendingTools.clear();\n\t\t\t\t\t\thost.clearBlockingError();\n\n\t\t\t\t\t\t// Render any messages added via setup, or show empty session\n\t\t\t\t\t\thost.renderInitialMessages();\n\t\t\t\t\t\thost.ui.requestRender();\n\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\tfork: async (entryId) => {\n\t\t\t\t\t\tconst result = await host.session.fork(entryId);\n\t\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.renderInitialMessages();\n\t\t\t\t\t\thost.editor.setText(result.selectedText);\n\t\t\t\t\t\thost.showStatus(\"Forked to new session\");\n\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\t\t\tconst result = await host.session.navigateTree(targetId, {\n\t\t\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\t\t\tlabel: options?.label,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.renderInitialMessages();\n\t\t\t\t\t\tif (result.editorText && !host.editor.getText().trim()) {\n\t\t\t\t\t\t\thost.editor.setText(result.editorText);\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.showStatus(\"Navigated to selected point\");\n\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\tswitchSession: async (sessionPath) => {\n\t\t\t\t\t\tawait host.handleResumeSession(sessionPath);\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\treload: async () => {\n\t\t\t\t\t\tawait host.handleReloadCommand();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tshutdownHandler: () => {\n\t\t\t\t\thost.shutdownRequested = true;\n\t\t\t\t\tif (!host.session.isStreaming) {\n\t\t\t\t\t\tvoid host.shutdown();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\thost.showExtensionError(error.extensionPath, error.error, error.stack);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tsetRegisteredThemes(host.session.resourceLoader.getThemes().themes);\n\t\thost.setupAutocomplete();\n\n\t\tconst extensionRunner = host.session.extensionRunner;\n\t\tif (!extensionRunner) {\n\t\t\thost.showLoadedResources({ extensionPaths: [], force: false });\n\t\t\treturn;\n\t\t}\n\n\t\tsetupExtensionShortcuts(host, extensionRunner);\n\t\thost.showLoadedResources({ extensionPaths: extensionRunner.getExtensionPaths(), force: false });\n\t}\n\nexport function setExtensionStatus(host: InteractiveModeDelegateHost, key: string, text: string | undefined): void {\n\t\thost.footerDataProvider.setExtensionStatus(key, text);\n\t\thost.ui.requestRender();\n\t}\n\n\t/**\n\t * Set an extension widget (string array or custom component).\n\t */\nexport function setExtensionWidget(host: InteractiveModeDelegateHost, key: string,\n\t\tcontent: string[] | ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined,\n\t\toptions?: ExtensionWidgetOptions,\n\t): void {\n\t\tconst placement = options?.placement ?? \"aboveEditor\";\n\t\tconst removeExisting = (map: Map<string, Component & { dispose?(): void }>) => {\n\t\t\tconst existing = map.get(key);\n\t\t\tif (existing?.dispose) existing.dispose();\n\t\t\tmap.delete(key);\n\t\t};\n\n\t\tremoveExisting(host.extensionWidgetsAbove);\n\t\tremoveExisting(host.extensionWidgetsBelow);\n\n\t\tif (content === undefined) {\n\t\t\trenderWidgets(host, );\n\t\t\treturn;\n\t\t}\n\n\t\tlet component: Component & { dispose?(): void };\n\n\t\tif (Array.isArray(content)) {\n\t\t\t// Wrap string array in a Container with Text components\n\t\t\tconst container = new Container();\n\t\t\tfor (const line of content.slice(0, MAX_WIDGET_LINES)) {\n\t\t\t\tcontainer.addChild(new Text(line, 1, 0));\n\t\t\t}\n\t\t\tif (content.length > MAX_WIDGET_LINES) {\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"... (widget truncated)\"), 1, 0));\n\t\t\t}\n\t\t\tcomponent = container;\n\t\t} else {\n\t\t\t// Factory function - create component\n\t\t\tcomponent = content(host.ui, theme);\n\t\t}\n\n\t\tconst targetMap = placement === \"belowEditor\" ? host.extensionWidgetsBelow : host.extensionWidgetsAbove;\n\t\ttargetMap.set(key, component);\n\t\trenderWidgets(host, );\n\t\t// Step-complete / handoff widgets replace the live progress panel and can\n\t\t// shrink the layout after pinned streaming output is torn down. Force a\n\t\t// full viewport realign so the transcript stays visible.\n\t\tif (key === \"gsd-outcome\" && content !== undefined) {\n\t\t\thost.ui.requestRender(true);\n\t\t}\n\t}\n\nexport function clearExtensionWidgets(host: InteractiveModeDelegateHost): void {\n\t\tfor (const widget of host.extensionWidgetsAbove.values()) {\n\t\t\twidget.dispose?.();\n\t\t}\n\t\tfor (const widget of host.extensionWidgetsBelow.values()) {\n\t\t\twidget.dispose?.();\n\t\t}\n\t\thost.extensionWidgetsAbove.clear();\n\t\thost.extensionWidgetsBelow.clear();\n\t\trenderWidgets(host, );\n\t}\n\nexport function resetExtensionUI(host: InteractiveModeDelegateHost): void {\n\t\tif (host.extensionSelector) {\n\t\t\thideExtensionSelector(host, );\n\t\t}\n\t\tif (host.extensionInput) {\n\t\t\thideExtensionInput(host, );\n\t\t}\n\t\tif (host.extensionEditor) {\n\t\t\thideExtensionEditor(host, );\n\t\t}\n\t\thost.ui.hideOverlay();\n\t\thost.clearExtensionTerminalInputListeners();\n\t\thost.setExtensionFooter(undefined);\n\t\thost.setExtensionHeader(undefined);\n\t\tclearExtensionWidgets(host, );\n\t\thost.footerDataProvider.clearExtensionStatuses();\n\t\thost.footer.invalidate();\n\t\thost.setCustomEditorComponent(undefined);\n\t\thost.defaultEditor.onExtensionShortcut = undefined;\n\t\thost.updateTerminalTitle();\n\t\tif (host.loadingAnimation) {\n\t\t\thost.loadingAnimation.setMessage(\n\t\t\t\t`${host.defaultWorkingMessage} (${appKey(host.keybindings, \"interrupt\")} to interrupt)`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Render all extension widgets to the widget container.\n\t */\nexport function renderWidgets(host: InteractiveModeDelegateHost): void {\n\t\tif (!host.widgetContainerAbove || !host.widgetContainerBelow) return;\n\n\t\t// widgetContainerAbove: spacer collapses when pinned content is visible\n\t\t// so there's no extra blank line between pinned output and the editor border.\n\t\t// Use detachChildren() (not clear()) — the extensionWidgetsAbove map owns\n\t\t// disposal; clear() would dispose every mounted widget on every re-render.\n\t\thost.widgetContainerAbove.detachChildren();\n\t\tconst pinned = host.pinnedMessageContainer;\n\t\thost.widgetContainerAbove.addChild({\n\t\t\trender: () => pinned.children.length > 0 ? [] : [\"\"],\n\t\t\tinvalidate: () => {},\n\t\t});\n\t\tfor (const component of host.extensionWidgetsAbove.values()) {\n\t\t\thost.widgetContainerAbove.addChild(component);\n\t\t}\n\n\t\trenderWidgetContainer(host, host.widgetContainerBelow, host.extensionWidgetsBelow, false, false);\n\t\thost.ui.requestRender();\n\t}\n\nexport function renderWidgetContainer(host: InteractiveModeDelegateHost, \n\t\tcontainer: Container,\n\t\twidgets: Map<string, Component & { dispose?(): void }>,\n\t\tspacerWhenEmpty: boolean,\n\t\tleadingSpacer: boolean,\n\t): void {\n\t\t// Detach without disposing — the widgets map owns lifecycle; disposing\n\t\t// here would kill refresh timers and subscriptions on every re-render.\n\t\tcontainer.detachChildren();\n\n\t\tif (widgets.size === 0) {\n\t\t\tif (spacerWhenEmpty) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (leadingSpacer) {\n\t\t\tcontainer.addChild(new Spacer(1));\n\t\t}\n\t\tfor (const component of widgets.values()) {\n\t\t\tcontainer.addChild(component);\n\t\t}\n\t}\n\n\t/**\n\t * Set a custom footer component, or restore the built-in footer.\n\t */\nexport function setExtensionFooter(host: InteractiveModeDelegateHost, factory:\n\t\t\t| ((tui: TUI, thm: Theme, footerData: ReadonlyFooterDataProvider) => Component & { dispose?(): void })\n\t\t\t| undefined,\n\t): void {\n\t\t// Dispose existing custom footer\n\t\tif (host.customFooter?.dispose) {\n\t\t\thost.customFooter.dispose();\n\t\t}\n\n\t\t// Remove current footer from UI\n\t\tif (host.customFooter) {\n\t\t\thost.ui.removeChild(host.customFooter);\n\t\t} else {\n\t\t\thost.ui.removeChild(host.footer);\n\t\t}\n\n\t\tif (factory) {\n\t\t\t// Create and add custom footer, passing the data provider\n\t\t\thost.customFooter = factory(host.ui, theme, host.footerDataProvider);\n\t\t\thost.ui.addChild(host.customFooter);\n\t\t} else {\n\t\t\t// Restore built-in footer\n\t\t\thost.customFooter = undefined;\n\t\t\thost.ui.addChild(host.footer);\n\t\t}\n\n\t\thost.ui.requestRender();\n\t}\n\n\t/**\n\t * Set a custom header component, or restore the built-in header.\n\t */\nexport function setExtensionHeader(host: InteractiveModeDelegateHost, factory: ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined): void {\n\t\t// Header may not be initialized yet if called during early initialization\n\t\tif (!host.builtInHeader) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Dispose existing custom header\n\t\tif (host.customHeader?.dispose) {\n\t\t\thost.customHeader.dispose();\n\t\t}\n\n\t\t// Find the index of the current header in the header container\n\t\tconst currentHeader = host.customHeader || host.builtInHeader;\n\t\tconst index = host.headerContainer.children.indexOf(currentHeader);\n\n\t\tif (factory) {\n\t\t\t// Create and add custom header\n\t\t\thost.customHeader = factory(host.ui, theme);\n\t\t\tif (index !== -1) {\n\t\t\t\thost.headerContainer.children[index] = host.customHeader;\n\t\t\t} else {\n\t\t\t\t// If not found (e.g. builtInHeader was never added), add at the top\n\t\t\t\thost.headerContainer.children.unshift(host.customHeader);\n\t\t\t}\n\t\t} else {\n\t\t\t// Restore built-in header\n\t\t\thost.customHeader = undefined;\n\t\t\tif (index !== -1) {\n\t\t\t\thost.headerContainer.children[index] = host.builtInHeader;\n\t\t\t}\n\t\t}\n\n\t\thost.ui.requestRender();\n\t}\n\nexport function addExtensionTerminalInputListener(\n\thost: InteractiveModeDelegateHost,\n\thandler: (data: string) => { consume?: boolean; data?: string } | undefined,\n): () => void {\n\t\tconst unsubscribe = host.ui.addInputListener(handler);\n\t\thost.extensionTerminalInputUnsubscribers.add(unsubscribe);\n\t\treturn () => {\n\t\t\tunsubscribe();\n\t\t\thost.extensionTerminalInputUnsubscribers.delete(unsubscribe);\n\t\t};\n\t}\n\nexport function clearExtensionTerminalInputListeners(host: InteractiveModeDelegateHost): void {\n\t\tfor (const unsubscribe of host.extensionTerminalInputUnsubscribers) {\n\t\t\tunsubscribe();\n\t\t}\n\t\thost.extensionTerminalInputUnsubscribers.clear();\n\t}\n"]}
1
+ {"version":3,"file":"interactive-extension-widgets.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-extension-widgets.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n// @ts-nocheck\n\nimport { Container, Spacer, Text, type Component, type TUI } from \"@gsd/pi-tui\";\nimport type { ExtensionUIContext, ExtensionUIDialogOptions, ExtensionWidgetOptions } from \"@gsd/pi-coding-agent/core/extensions/index.js\";\nimport { setupExtensionShortcuts } from \"./interactive-extension-tools.js\";\nexport { getRegisteredToolDefinition, formatWebSearchResult } from \"./interactive-extension-tools.js\";\nimport { FooterDataProvider, type ReadonlyFooterDataProvider } from \"@gsd/pi-coding-agent/core/footer-data-provider.js\";\nimport { setRegisteredThemes, setTheme, Theme, theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey } from \"./components/keybinding-hints.js\";\nimport { ExtensionEditorComponent } from \"./components/extension-editor.js\";\nimport { ExtensionInputComponent } from \"./components/extension-input.js\";\nimport { ExtensionSelectorComponent } from \"./components/extension-selector.js\";\nimport type { ExtensionNotifyType } from \"./interactive-notify-render.js\";\nimport { renderBlockingErrorBanner, renderExtensionNotifyInChat } from \"./interactive-notify-render.js\";\nimport { createExtensionUIContext as buildExtensionUIContext } from \"./controllers/extension-ui-controller.js\";\nimport { MAX_WIDGET_LINES } from \"./interactive-mode-class-constants.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\nimport { getEditorTheme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport type { EditorComponent, EditorTheme, KeybindingsManager, OverlayHandle, OverlayOptions } from \"@gsd/pi-tui\";\n\nexport async function initExtensions(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tif (host.options.bindExtensions !== false) {\n\t\t\tconst uiContext = host.createExtensionUIContext();\n\t\t\tawait host.session.bindExtensions({\n\t\t\t\tuiContext,\n\t\t\t\tcommandContextActions: {\n\t\t\t\t\twaitForIdle: () => host.session.agent.waitForIdle(),\n\t\t\t\t\tnewSession: async (options) => {\n\t\t\t\t\t\tif (host.loadingAnimation) {\n\t\t\t\t\t\t\thost.loadingAnimation.stop();\n\t\t\t\t\t\t\thost.loadingAnimation = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.statusContainer.clear();\n\n\t\t\t\t\t\t// Delegate to AgentSession (handles setup + agent state sync)\n\t\t\t\t\t\tconst success = await host.session.newSession(options);\n\t\t\t\t\t\tif (!success) {\n\t\t\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Clear UI state\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.pendingMessagesContainer.clear();\n\t\t\t\t\t\thost.compactionQueuedMessages = [];\n\t\t\t\t\t\thost.streamingComponent = undefined;\n\t\t\t\t\t\thost.streamingMessage = undefined;\n\t\t\t\t\t\thost.pendingTools.clear();\n\t\t\t\t\t\thost.clearBlockingError();\n\n\t\t\t\t\t\t// Render any messages added via setup, or show empty session\n\t\t\t\t\t\thost.renderInitialMessages();\n\t\t\t\t\t\thost.ui.requestRender();\n\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\tfork: async (entryId) => {\n\t\t\t\t\t\tconst result = await host.session.fork(entryId);\n\t\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.renderInitialMessages();\n\t\t\t\t\t\thost.editor.setText(result.selectedText);\n\t\t\t\t\t\thost.showStatus(\"Forked to new session\");\n\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\t\t\tconst result = await host.session.navigateTree(targetId, {\n\t\t\t\t\t\t\tsummarize: options?.summarize,\n\t\t\t\t\t\t\tcustomInstructions: options?.customInstructions,\n\t\t\t\t\t\t\treplaceInstructions: options?.replaceInstructions,\n\t\t\t\t\t\t\tlabel: options?.label,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tif (result.cancelled) {\n\t\t\t\t\t\t\treturn { cancelled: true };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thost.chatContainer.clear();\n\t\t\t\t\t\thost.renderInitialMessages();\n\t\t\t\t\t\tif (result.editorText && !host.editor.getText().trim()) {\n\t\t\t\t\t\t\thost.editor.setText(result.editorText);\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.showStatus(\"Navigated to selected point\");\n\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\tswitchSession: async (sessionPath) => {\n\t\t\t\t\t\tawait host.handleResumeSession(sessionPath);\n\t\t\t\t\t\treturn { cancelled: false };\n\t\t\t\t\t},\n\t\t\t\t\treload: async () => {\n\t\t\t\t\t\tawait host.handleReloadCommand();\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tshutdownHandler: () => {\n\t\t\t\t\thost.shutdownRequested = true;\n\t\t\t\t\tif (!host.session.isStreaming) {\n\t\t\t\t\t\tvoid host.shutdown();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\thost.showExtensionError(error.extensionPath, error.error, error.stack);\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\n\t\tsetRegisteredThemes(host.session.resourceLoader.getThemes().themes);\n\t\thost.setupAutocomplete();\n\n\t\tconst extensionRunner = host.session.extensionRunner;\n\t\tif (!extensionRunner) {\n\t\t\thost.showLoadedResources({ extensionPaths: [], force: false });\n\t\t\treturn;\n\t\t}\n\n\t\tsetupExtensionShortcuts(host, extensionRunner);\n\t\thost.showLoadedResources({ extensionPaths: extensionRunner.getExtensionPaths(), force: false });\n\t}\n\nexport function setExtensionStatus(host: InteractiveModeDelegateHost, key: string, text: string | undefined): void {\n\t\thost.footerDataProvider.setExtensionStatus(key, text);\n\t\thost.footer.invalidate();\n\t\thost.ui.requestRender();\n\t}\n\nexport function setGsdProgress(\n\thost: InteractiveModeDelegateHost,\n\tstate: import(\"@gsd/pi-coding-agent/core/extensions/extension-upstream-types.js\").GsdProgressState | undefined,\n\tdispose?: () => void,\n): void {\n\tif (dispose !== undefined) {\n\t\tconst prev = host.gsdProgressDispose;\n\t\thost.gsdProgressDispose = dispose;\n\t\t// Reset user's manual expansion for the new unit so widgetMode drives\n\t\t// the initial state again (the user can re-collapse via ctrl+shift+d).\n\t\thost.gsdStatusExpanded = undefined;\n\t\tprev?.();\n\t} else if (state === undefined) {\n\t\tconst prev = host.gsdProgressDispose;\n\t\thost.gsdProgressDispose = undefined;\n\t\tprev?.();\n\t}\n\thost.gsdProgressState = state;\n\thost.ui.requestRender();\n}\n\n\t/**\n\t * Set an extension widget (string array or custom component).\n\t */\nexport function setExtensionWidget(host: InteractiveModeDelegateHost, key: string,\n\t\tcontent: string[] | ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined,\n\t\toptions?: ExtensionWidgetOptions,\n\t): void {\n\t\tconst placement = options?.placement ?? \"aboveEditor\";\n\t\tconst removeExisting = (map: Map<string, Component & { dispose?(): void }>) => {\n\t\t\tconst existing = map.get(key);\n\t\t\tif (existing?.dispose) existing.dispose();\n\t\t\tmap.delete(key);\n\t\t};\n\n\t\tremoveExisting(host.extensionWidgetsAbove);\n\t\tremoveExisting(host.extensionWidgetsBelow);\n\n\t\tif (content === undefined) {\n\t\t\trenderWidgets(host, );\n\t\t\treturn;\n\t\t}\n\n\t\tlet component: Component & { dispose?(): void };\n\n\t\tif (Array.isArray(content)) {\n\t\t\t// Wrap string array in a Container with Text components\n\t\t\tconst container = new Container();\n\t\t\tfor (const line of content.slice(0, MAX_WIDGET_LINES)) {\n\t\t\t\tcontainer.addChild(new Text(line, 1, 0));\n\t\t\t}\n\t\t\tif (content.length > MAX_WIDGET_LINES) {\n\t\t\t\tcontainer.addChild(new Text(theme.fg(\"muted\", \"... (widget truncated)\"), 1, 0));\n\t\t\t}\n\t\t\tcomponent = container;\n\t\t} else {\n\t\t\t// Factory function - create component\n\t\t\tcomponent = content(host.ui, theme);\n\t\t}\n\n\t\tconst targetMap = placement === \"belowEditor\" ? host.extensionWidgetsBelow : host.extensionWidgetsAbove;\n\t\ttargetMap.set(key, component);\n\t\trenderWidgets(host, );\n\t\t// Step-complete / handoff widgets replace the live progress panel and can\n\t\t// shrink the layout after pinned streaming output is torn down. Force a\n\t\t// full viewport realign so the transcript stays visible.\n\t\tif (key === \"gsd-outcome\" && content !== undefined) {\n\t\t\thost.ui.requestRender(true);\n\t\t}\n\t}\n\nexport function clearExtensionWidgets(host: InteractiveModeDelegateHost): void {\n\t\tfor (const widget of host.extensionWidgetsAbove.values()) {\n\t\t\twidget.dispose?.();\n\t\t}\n\t\tfor (const widget of host.extensionWidgetsBelow.values()) {\n\t\t\twidget.dispose?.();\n\t\t}\n\t\thost.extensionWidgetsAbove.clear();\n\t\thost.extensionWidgetsBelow.clear();\n\t\trenderWidgets(host, );\n\t}\n\nexport function resetExtensionUI(host: InteractiveModeDelegateHost): void {\n\t\tif (host.extensionSelector) {\n\t\t\thideExtensionSelector(host, );\n\t\t}\n\t\tif (host.extensionInput) {\n\t\t\thideExtensionInput(host, );\n\t\t}\n\t\tif (host.extensionEditor) {\n\t\t\thideExtensionEditor(host, );\n\t\t}\n\t\thost.ui.hideOverlay();\n\t\thost.clearExtensionTerminalInputListeners();\n\t\thost.setExtensionFooter(undefined);\n\t\thost.setExtensionHeader(undefined);\n\t\tclearExtensionWidgets(host, );\n\t\tconst prevGsdDispose = host.gsdProgressDispose;\n\t\thost.gsdProgressDispose = undefined;\n\t\thost.gsdProgressState = undefined;\n\t\tprevGsdDispose?.();\n\t\thost.footerDataProvider.clearExtensionStatuses();\n\t\thost.footer.invalidate();\n\t\thost.setCustomEditorComponent(undefined);\n\t\thost.defaultEditor.onExtensionShortcut = undefined;\n\t\thost.updateTerminalTitle();\n\t\tif (host.loadingAnimation) {\n\t\t\thost.loadingAnimation.setMessage(\n\t\t\t\t`${host.defaultWorkingMessage} (${appKey(host.keybindings, \"interrupt\")} to interrupt)`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Render all extension widgets to the widget container.\n\t */\nexport function renderWidgets(host: InteractiveModeDelegateHost): void {\n\t\tif (!host.widgetContainerAbove || !host.widgetContainerBelow) return;\n\n\t\t// widgetContainerAbove: spacer collapses when pinned content is visible\n\t\t// so there's no extra blank line between pinned output and the editor border.\n\t\t// Use detachChildren() (not clear()) — the extensionWidgetsAbove map owns\n\t\t// disposal; clear() would dispose every mounted widget on every re-render.\n\t\thost.widgetContainerAbove.detachChildren();\n\t\tconst pinned = host.pinnedMessageContainer;\n\t\thost.widgetContainerAbove.addChild({\n\t\t\trender: () => pinned.children.length > 0 ? [] : [\"\"],\n\t\t\tinvalidate: () => {},\n\t\t});\n\t\tif (host.gsdStatusWidget) {\n\t\t\thost.widgetContainerAbove.addChild(host.gsdStatusWidget);\n\t\t}\n\t\tfor (const component of host.extensionWidgetsAbove.values()) {\n\t\t\thost.widgetContainerAbove.addChild(component);\n\t\t}\n\n\t\trenderWidgetContainer(host, host.widgetContainerBelow, host.extensionWidgetsBelow, false, false);\n\t\thost.ui.requestRender();\n\t}\n\nexport function renderWidgetContainer(host: InteractiveModeDelegateHost, \n\t\tcontainer: Container,\n\t\twidgets: Map<string, Component & { dispose?(): void }>,\n\t\tspacerWhenEmpty: boolean,\n\t\tleadingSpacer: boolean,\n\t): void {\n\t\t// Detach without disposing — the widgets map owns lifecycle; disposing\n\t\t// here would kill refresh timers and subscriptions on every re-render.\n\t\tcontainer.detachChildren();\n\n\t\tif (widgets.size === 0) {\n\t\t\tif (spacerWhenEmpty) {\n\t\t\t\tcontainer.addChild(new Spacer(1));\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (leadingSpacer) {\n\t\t\tcontainer.addChild(new Spacer(1));\n\t\t}\n\t\tfor (const component of widgets.values()) {\n\t\t\tcontainer.addChild(component);\n\t\t}\n\t}\n\n\t/**\n\t * Set a custom footer component, or restore the built-in footer.\n\t */\nexport function setExtensionFooter(host: InteractiveModeDelegateHost, factory:\n\t\t\t| ((tui: TUI, thm: Theme, footerData: ReadonlyFooterDataProvider) => Component & { dispose?(): void })\n\t\t\t| undefined,\n\t): void {\n\t\t// Dispose existing custom footer\n\t\tif (host.customFooter?.dispose) {\n\t\t\thost.customFooter.dispose();\n\t\t}\n\n\t\t// Remove current footer from UI\n\t\tif (host.customFooter) {\n\t\t\thost.ui.removeChild(host.customFooter);\n\t\t} else {\n\t\t\thost.ui.removeChild(host.footer);\n\t\t}\n\n\t\tif (factory) {\n\t\t\t// Create and add custom footer, passing the data provider\n\t\t\thost.customFooter = factory(host.ui, theme, host.footerDataProvider);\n\t\t\thost.ui.addChild(host.customFooter);\n\t\t} else {\n\t\t\t// Restore built-in footer\n\t\t\thost.customFooter = undefined;\n\t\t\thost.ui.addChild(host.footer);\n\t\t}\n\n\t\thost.ui.requestRender();\n\t}\n\n\t/**\n\t * Set a custom header component, or restore the built-in header.\n\t */\nexport function setExtensionHeader(host: InteractiveModeDelegateHost, factory: ((tui: TUI, thm: Theme) => Component & { dispose?(): void }) | undefined): void {\n\t\t// Header may not be initialized yet if called during early initialization\n\t\tif (!host.builtInHeader) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Dispose existing custom header\n\t\tif (host.customHeader?.dispose) {\n\t\t\thost.customHeader.dispose();\n\t\t}\n\n\t\t// Find the index of the current header in the header container\n\t\tconst currentHeader = host.customHeader || host.builtInHeader;\n\t\tconst index = host.headerContainer.children.indexOf(currentHeader);\n\n\t\tif (factory) {\n\t\t\t// Create and add custom header\n\t\t\thost.customHeader = factory(host.ui, theme);\n\t\t\tif (index !== -1) {\n\t\t\t\thost.headerContainer.children[index] = host.customHeader;\n\t\t\t} else {\n\t\t\t\t// If not found (e.g. builtInHeader was never added), add at the top\n\t\t\t\thost.headerContainer.children.unshift(host.customHeader);\n\t\t\t}\n\t\t} else {\n\t\t\t// Restore built-in header\n\t\t\thost.customHeader = undefined;\n\t\t\tif (index !== -1) {\n\t\t\t\thost.headerContainer.children[index] = host.builtInHeader;\n\t\t\t}\n\t\t}\n\n\t\thost.ui.requestRender();\n\t}\n\nexport function addExtensionTerminalInputListener(\n\thost: InteractiveModeDelegateHost,\n\thandler: (data: string) => { consume?: boolean; data?: string } | undefined,\n): () => void {\n\t\tconst unsubscribe = host.ui.addInputListener(handler);\n\t\thost.extensionTerminalInputUnsubscribers.add(unsubscribe);\n\t\treturn () => {\n\t\t\tunsubscribe();\n\t\t\thost.extensionTerminalInputUnsubscribers.delete(unsubscribe);\n\t\t};\n\t}\n\nexport function clearExtensionTerminalInputListeners(host: InteractiveModeDelegateHost): void {\n\t\tfor (const unsubscribe of host.extensionTerminalInputUnsubscribers) {\n\t\t\tunsubscribe();\n\t\t}\n\t\thost.extensionTerminalInputUnsubscribers.clear();\n\t}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-key-handlers.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-key-handlers.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAWvF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAuEvE;AAEF,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB/F;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CA4C9F;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAQlE;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAGlE;AAED;;;GAGG;AAEJ,wBAAsB,QAAQ,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD9E;AAED;;GAEG;AACJ,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5F;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CA6BlE;AAEF,wBAAsB,cAAc,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCpF;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAOpE;AAEF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAQ9E;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CASzE;AAEF,wBAAsB,UAAU,CAAC,IAAI,EAAE,2BAA2B,EAAE,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBnH;AAEF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAEhF;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAQ1F;AAEF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAgBpF;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAqDzE"}
1
+ {"version":3,"file":"interactive-key-handlers.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-key-handlers.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAWvF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAwEvE;AAEF,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB/F;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CA4C9F;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAQlE;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAGlE;AAED;;;GAGG;AAEJ,wBAAsB,QAAQ,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAkD9E;AAED;;GAEG;AACJ,wBAAsB,sBAAsB,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAG5F;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CA6BlE;AAEF,wBAAsB,cAAc,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CAuCpF;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAOpE;AAEF,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAQ9E;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CASzE;AAEF,wBAAsB,UAAU,CAAC,IAAI,EAAE,2BAA2B,EAAE,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBnH;AAEF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAEhF;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,2BAA2B,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAQ1F;AAEF,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAgBpF;AAEF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAqDzE"}
@@ -58,6 +58,7 @@ export function setupKeyHandlers(host) {
58
58
  host.ui.onDebug = () => host.handleDebugCommand();
59
59
  host.defaultEditor.onAction("selectModel", () => host.showModelSelector());
60
60
  host.defaultEditor.onAction("expandTools", () => host.toggleToolOutputExpansion());
61
+ host.defaultEditor.onToggleGsdStatus = () => host.toggleGsdStatusWidget?.();
61
62
  host.defaultEditor.onAction("toggleThinking", () => host.toggleThinkingBlockVisibility());
62
63
  host.defaultEditor.onAction("externalEditor", () => host.openExternalEditor());
63
64
  host.defaultEditor.onAction("followUp", () => host.handleFollowUp());
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-key-handlers.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-key-handlers.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,gFAAgF;AAEhF,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AACnF,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAM3F,SAAS,YAAY,CAAC,GAAY;IACjC,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,aAAa,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,WAAW,KAAK,UAAU,CAAC;AACjH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAiC;IAChE,0EAA0E;IAC1E,8DAA8D;IAC9D,IAAI,CAAC,aAAa,CAAC,QAAQ,GAAG,GAAG,EAAE;QAClC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,IAAI,CAAC,6BAA6B,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACvC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChC,CAAC;aAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAC1C,qFAAqF;YACrF,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,EAAE,CAAC;YAC5D,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACvB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvB,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC;oBACrC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;wBACvB,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBACzB,CAAC;yBAAM,CAAC;wBACP,IAAI,CAAC,uBAAuB,EAAE,CAAC;oBAChC,CAAC;oBACD,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;gBACzB,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;gBAC3B,CAAC;YACF,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IAEF,+BAA+B;IAC/B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAG,CAAC,CAAC;IAChE,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAG,CAAC;IACvD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACnF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;IACnF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAErF,0DAA0D;IAC1D,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAClD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;IACnF,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC,CAAC;IAC1F,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC3E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAExE,IAAI,CAAC,aAAa,CAAC,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAE;QAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,WAAW,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAChC,CAAC;IACF,CAAC,CAAC;IAEF,qDAAqD;IACrD,IAAI,CAAC,aAAa,CAAC,YAAY,GAAG,GAAG,EAAE;QACtC,IAAI,CAAC,yBAAyB,EAAE,CAAC;IAClC,CAAC,CAAC;IAEF,sEAAsE;IACtE,+FAA+F;IAC/F,IAAI,CAAC,aAAa,CAAC,gBAAgB,GAAG,CAAC,QAAgB,EAAE,EAAE;QAC1D,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,CAAC;AACH,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAAiC;IAC/E,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,kBAAkB,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACZ,OAAO;QACR,CAAC;QAED,iEAAiE;QACjE,MAAM,YAAY,GAAiB;YAClC,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACjD,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACxB,CAAC;QACF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEtC,mDAAmD;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,WAAW,QAAQ,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,mEAAmE;IACpE,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,IAAiC,EAAE,QAAgB;IACvF,IAAI,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACf,oEAAoE;YACpE,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QAED,qEAAqE;QACrE,4CAA4C;QAC5C,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAEvC,gEAAgE;QAChE,gDAAgD;QAChD,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;YACxB,OAAO;QACR,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC7B,QAAQ;SACR,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,WAAW,QAAQ,GAAG,CAAC,CAAC;QACzD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACR,4DAA4D;QAC5D,IAAI,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAiC;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,GAAG,GAAG,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE,CAAC;QACrC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;IAC3B,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAiC;IAC3D,8DAA8D;IAC9D,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED;;;GAGG;AAEJ,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAiC;IAC9D,MAAM,gBAAgB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,cAAc,CAAC;IACzE,IAAI,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,sDAAsD,CAAC,CAAC;QACxE,OAAO;IACR,CAAC;IAED,IAAI,IAAI,CAAC,cAAc;QAAE,OAAO;IAChC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAE3B,mDAAmD;IACnD,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAEnC,oCAAoC;IACpC,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;IACrD,IAAI,eAAe,EAAE,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACtD,MAAM,eAAe,CAAC,IAAI,CAAC;YAC1B,IAAI,EAAE,kBAAkB;YACxB,MAAM,EAAE,MAAM;SACd,CAAC,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,+DAA+D;IAC/D,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAE1D,gEAAgE;IAChE,iFAAiF;IACjF,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAExC,IAAI,CAAC,IAAI,EAAE,CAAC;IACZ,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO;IACR,CAAC;IAED,iFAAiF;IACjF,IAAI,CAAC;QACJ,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjD,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;YACpC,IAAI,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QACpD,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;YACvD,KAAK,MAAM,QAAQ,IAAI,WAAW,EAAE,CAAC;gBACpC,IAAI,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAA,CAAC;YACpD,CAAC;QACF,CAAC;IACF,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;IAEV,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC;AAED;;GAEG;AACJ,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,IAAiC;IAC5E,IAAI,CAAC,IAAI,CAAC,iBAAiB;QAAE,OAAO;IACpC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AACvB,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAiC;IAC3D,8DAA8D;IAC9D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QAClC,OAAO;IACR,CAAC;IAED,mEAAmE;IACnE,mEAAmE;IACnE,MAAM,YAAY,GAAG,GAAG,EAAE,GAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAEnC,IAAI,CAAC;QACJ,6CAA6C;QAC7C,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC5B,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YAC/C,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,iDAAiD;QACjD,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAEf,qEAAqE;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACR,4DAA4D;QAC5D,gCAAgC;QAChC,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;AACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAiC;IACpE,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/E,IAAI,CAAC,IAAI;QAAE,OAAO;IAElB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,SAAS,CAAC,oBAAoB,OAAO,qDAAqD,CAAC,CAAC;QACjG,OAAO;IACR,CAAC;IAED,yBAAyB;IACzB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnF,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9B,yEAAyE;IACzE,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO;IACR,CAAC;IAED,oEAAoE;IACpE,iGAAiG;IACjG,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACpC,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC;IACD,yEAAyE;SACpE,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,IAAiC;IAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,6BAA6B,EAAE,CAAC;IACtD,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;QACpB,IAAI,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,UAAU,CAAC,YAAY,QAAQ,kBAAkB,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC;IAC5F,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,uBAAuB,CAAC,IAAiC;IACvE,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,sBAAsB,EAAE,CAAC;IAC1D,CAAC;SAAM,CAAC;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAI,KAAK,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAiC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;IACnD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,yCAAyC,CAAC,CAAC;IAC5D,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IAChD,CAAC;AACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAiC,EAAE,SAAiC;IACnG,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,0BAA0B,CAAC;YAC1G,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACzB,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC/B,MAAM,WAAW,GAChB,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,MAAM,CAAC,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACxG,IAAI,CAAC,UAAU,CAAC,eAAe,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC;QACtF,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,CAAC,SAAS,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;AACF,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,IAAiC;IACzE,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AACjD,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAAC,IAAiC,EAAE,QAAiB;IACnF,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QACjD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC7B,CAAC;IACF,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC;AAEF,MAAM,UAAU,6BAA6B,CAAC,IAAiC;IAC7E,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC;IACjD,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAElE,qCAAqC;IACrC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC3B,IAAI,CAAC,uBAAuB,EAAE,CAAC;IAE/B,qFAAqF;IACrF,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtD,IAAI,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACrE,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC7D,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,CAAC,UAAU,CAAC,oBAAoB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;AACtF,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,IAAiC;IAClE,mDAAmD;IACnD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;IAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,IAAI,GAAG,GAAG,oEAAoE,CAAC;QAC/E,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,WAAW,EAAE,CAAC;YAC9C,GAAG;gBACF,sFAAsF;oBACtF,6EAA6E;oBAC7E,mCAAmC,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACtB,OAAO;IACR,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAExE,IAAI,CAAC;QACJ,qCAAqC;QACrC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAEhD,+BAA+B;QAC/B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAEf,mEAAmE;QACnE,MAAM,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAErD,0EAA0E;QAC1E,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,UAAU,EAAE,OAAO,CAAC,EAAE;YAC1D,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACnC,CAAC,CAAC;QAEH,wDAAwD;QACxD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;QACD,0DAA0D;IAC3D,CAAC;YAAS,CAAC;QACV,qBAAqB;QACrB,IAAI,CAAC;YACJ,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACR,wBAAwB;QACzB,CAAC;QAED,cAAc;QACd,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAChB,mEAAmE;QACnE,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACF,CAAC","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ImageContent } from \"@gsd/pi-ai\";\nimport { listDescendants } from \"@gsd/native\";\nimport { spawnSync } from \"child_process\";\nimport { readClipboardImage } from \"@gsd/pi-coding-agent/utils/clipboard-image.js\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\nimport { MIME_BY_EXT, matchesImageSignature } from \"./interactive-mode-class-constants.js\";\n\ninterface Expandable {\n\tsetExpanded(expanded: boolean): void;\n}\n\nfunction isExpandable(obj: unknown): obj is Expandable {\n\treturn typeof obj === \"object\" && obj !== null && \"setExpanded\" in obj && typeof obj.setExpanded === \"function\";\n}\n\nexport function setupKeyHandlers(host: InteractiveModeDelegateHost): void {\n\t\t// Set up handlers on defaultEditor - they use host.editor for text access\n\t\t// so they work correctly regardless of which editor is active\n\t\thost.defaultEditor.onEscape = () => {\n\t\t\tif (host.loadingAnimation) {\n\t\t\t\thost.restoreQueuedMessagesToEditor({ abort: true });\n\t\t\t} else if (host.session.isBashRunning) {\n\t\t\t\thost.session.abortBash();\n\t\t\t} else if (host.isBashMode) {\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\thost.pendingImages.length = 0;\n\t\t\t\thost.isBashMode = false;\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t} else if (!host.editor.getText().trim()) {\n\t\t\t\t// Double-escape with empty editor triggers /tree, /fork, or nothing based on setting\n\t\t\t\tconst action = host.settingsManager.getDoubleEscapeAction();\n\t\t\t\tif (action !== \"none\") {\n\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\tif (now - host.lastEscapeTime < 500) {\n\t\t\t\t\t\tif (action === \"tree\") {\n\t\t\t\t\t\t\thost.showTreeSelector();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thost.showUserMessageSelector();\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.lastEscapeTime = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thost.lastEscapeTime = now;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Register app action handlers\n\t\thost.defaultEditor.onAction(\"clear\", () => handleCtrlC(host, ));\n\t\thost.defaultEditor.onCtrlD = () => handleCtrlD(host, );\n\t\thost.defaultEditor.onAction(\"suspend\", () => host.handleCtrlZ());\n\t\thost.defaultEditor.onAction(\"cycleThinkingLevel\", () => host.cycleThinkingLevel());\n\t\thost.defaultEditor.onAction(\"cycleModelForward\", () => host.cycleModel(\"forward\"));\n\t\thost.defaultEditor.onAction(\"cycleModelBackward\", () => host.cycleModel(\"backward\"));\n\n\t\t// Global debug handler on TUI (works regardless of focus)\n\t\thost.ui.onDebug = () => host.handleDebugCommand();\n\t\thost.defaultEditor.onAction(\"selectModel\", () => host.showModelSelector());\n\t\thost.defaultEditor.onAction(\"expandTools\", () => host.toggleToolOutputExpansion());\n\t\thost.defaultEditor.onAction(\"toggleThinking\", () => host.toggleThinkingBlockVisibility());\n\t\thost.defaultEditor.onAction(\"externalEditor\", () => host.openExternalEditor());\n\t\thost.defaultEditor.onAction(\"followUp\", () => host.handleFollowUp());\n\t\thost.defaultEditor.onAction(\"dequeue\", () => host.handleDequeue());\n\t\thost.defaultEditor.onAction(\"newSession\", () => host.handleClearCommand());\n\t\thost.defaultEditor.onAction(\"tree\", () => host.showTreeSelector());\n\t\thost.defaultEditor.onAction(\"fork\", () => host.showUserMessageSelector());\n\t\thost.defaultEditor.onAction(\"resume\", () => host.showSessionSelector());\n\n\t\thost.defaultEditor.onChange = (text: string) => {\n\t\t\tconst wasBashMode = host.isBashMode;\n\t\t\thost.isBashMode = text.trimStart().startsWith(\"!\");\n\t\t\tif (wasBashMode !== host.isBashMode) {\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t}\n\t\t};\n\n\t\t// Handle clipboard image paste (triggered on Ctrl+V)\n\t\thost.defaultEditor.onPasteImage = () => {\n\t\t\thost.handleClipboardImagePaste();\n\t\t};\n\n\t\t// Handle image file paths pasted via terminal emulator (e.g. iTerm2).\n\t\t// Set on defaultEditor here; setCustomEditorComponent guards re-assignment for custom editors.\n\t\thost.defaultEditor.onPasteImagePath = (filePath: string) => {\n\t\t\thost.handlePastedImagePath(filePath);\n\t\t};\n\t}\n\nexport async function handleClipboardImagePaste(host: InteractiveModeDelegateHost): Promise<void> {\n\t\ttry {\n\t\t\tconst image = await readClipboardImage();\n\t\t\tif (!image) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Store image as base64 ImageContent for sending with the prompt\n\t\t\tconst imageContent: ImageContent = {\n\t\t\t\ttype: \"image\",\n\t\t\t\tdata: Buffer.from(image.bytes).toString(\"base64\"),\n\t\t\t\tmimeType: image.mimeType,\n\t\t\t};\n\t\t\thost.pendingImages.push(imageContent);\n\n\t\t\t// Insert friendly placeholder instead of file path\n\t\t\tconst imageNum = host.pendingImages.length;\n\t\t\thost.editor.insertTextAtCursor?.(`[Image #${imageNum}]`);\n\t\t\thost.ui.requestRender();\n\t\t} catch {\n\t\t\t// Silently ignore clipboard errors (may not have permission, etc.)\n\t\t}\n\t}\n\nexport function handlePastedImagePath(host: InteractiveModeDelegateHost, filePath: string): void {\n\t\ttry {\n\t\t\tconst ext = path.extname(filePath).slice(1).toLowerCase();\n\t\t\tconst mimeType = MIME_BY_EXT[ext];\n\t\t\tif (!mimeType) {\n\t\t\t\t// Unsupported / unsafe extension — fall back to inserting raw path.\n\t\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\t\thost.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Reject symlinks to prevent reading sensitive files via a symlinked\n\t\t\t// `.png` that points at e.g. ~/.ssh/id_rsa.\n\t\t\tconst lst = fs.lstatSync(filePath);\n\t\t\tif (!lst.isFile()) {\n\t\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\t\thost.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst data = fs.readFileSync(filePath);\n\n\t\t\t// Magic-byte check — confirms file content actually matches the\n\t\t\t// extension before we forward bytes to a model.\n\t\t\tif (!matchesImageSignature(data, mimeType)) {\n\t\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\t\thost.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thost.pendingImages.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\tdata: data.toString(\"base64\"),\n\t\t\t\tmimeType,\n\t\t\t});\n\n\t\t\tconst imageNum = host.pendingImages.length;\n\t\t\thost.editor.insertTextAtCursor?.(`[Image #${imageNum}]`);\n\t\t\thost.ui.requestRender();\n\t\t} catch {\n\t\t\t// Fall back to inserting the raw path if file can't be read\n\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\thost.ui.requestRender();\n\t\t}\n\t}\n\nexport function handleCtrlC(host: InteractiveModeDelegateHost): void {\n\t\tconst now = Date.now();\n\t\tif (now - host.lastSigintTime < 500) {\n\t\t\tvoid host.shutdown();\n\t\t} else {\n\t\t\thost.clearEditor();\n\t\t\thost.lastSigintTime = now;\n\t\t}\n\t}\n\nexport function handleCtrlD(host: InteractiveModeDelegateHost): void {\n\t\t// Only called when editor is empty (enforced by CustomEditor)\n\t\tvoid host.shutdown();\n\t}\n\n\t/**\n\t * Gracefully shutdown the agent.\n\t * Emits shutdown event to extensions, then exits.\n\t */\n\nexport async function shutdown(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tconst shutdownBehavior = host.options.shutdownBehavior ?? \"exit_process\";\n\t\tif (shutdownBehavior === \"ignore\") {\n\t\t\thost.showStatus(\"Quit is unavailable in the browser-attached terminal\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (host.isShuttingDown) return;\n\t\thost.isShuttingDown = true;\n\n\t\t// Flush any queued settings writes before shutdown\n\t\tawait host.settingsManager.flush();\n\n\t\t// Emit shutdown event to extensions\n\t\tconst extensionRunner = host.session.extensionRunner;\n\t\tif (extensionRunner?.hasHandlers(\"session_shutdown\")) {\n\t\t\tawait extensionRunner.emit({\n\t\t\t\ttype: \"session_shutdown\",\n\t\t\t\treason: \"quit\",\n\t\t\t});\n\t\t}\n\n\t\t// Wait for any pending renders to complete\n\t\t// requestRender() uses process.nextTick(), so we wait one tick\n\t\tawait new Promise((resolve) => process.nextTick(resolve));\n\n\t\t// Drain any in-flight Kitty key release events before stopping.\n\t\t// This prevents escape sequences from leaking to the parent shell over slow SSH.\n\t\tawait host.ui.terminal.drainInput(1000);\n\n\t\thost.stop();\n\t\tif (shutdownBehavior === \"stop_ui\") {\n\t\t\treturn;\n\t\t}\n\n\t\t// Kill ALL descendant processes to prevent orphans (next-server, pnpm dev, etc.)\n\t\ttry {\n\t\t\tconst descendants = listDescendants(process.pid);\n\t\t\tfor (const childPid of descendants) {\n\t\t\t\ttry { process.kill(childPid, \"SIGTERM\"); } catch {}\n\t\t\t}\n\t\t\tif (descendants.length > 0) {\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 500));\n\t\t\t\tfor (const childPid of descendants) {\n\t\t\t\t\ttry { process.kill(childPid, \"SIGKILL\"); } catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\tprocess.exit(0);\n\t}\n\n\t/**\n\t * Check if shutdown was requested and perform shutdown if so.\n\t */\nexport async function checkShutdownRequested(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tif (!host.shutdownRequested) return;\n\t\tawait host.shutdown();\n\t}\n\nexport function handleCtrlZ(host: InteractiveModeDelegateHost): void {\n\t\t// On Windows, SIGTSTP doesn't exist - Ctrl+Z is not supported\n\t\tif (process.platform === \"win32\") {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ignore SIGINT while suspended so Ctrl+C in the terminal does not\n\t\t// kill the backgrounded process. The handler is removed on resume.\n\t\tconst ignoreSigint = () => {};\n\t\tprocess.on(\"SIGINT\", ignoreSigint);\n\n\t\ttry {\n\t\t\t// Set up handler to restore TUI when resumed\n\t\t\tprocess.once(\"SIGCONT\", () => {\n\t\t\t\tprocess.removeListener(\"SIGINT\", ignoreSigint);\n\t\t\t\thost.ui.start();\n\t\t\t\thost.ui.requestRender(true);\n\t\t\t});\n\n\t\t\t// Stop the TUI (restore terminal to normal mode)\n\t\t\thost.ui.stop();\n\n\t\t\t// Send SIGTSTP to process group (pid=0 means all processes in group)\n\t\t\tprocess.kill(0, \"SIGTSTP\");\n\t\t} catch {\n\t\t\t// If suspend fails (e.g. SIGTSTP not supported), ensure the\n\t\t\t// SIGINT listener doesn't leak.\n\t\t\tprocess.removeListener(\"SIGINT\", ignoreSigint);\n\t\t}\n\t}\n\nexport async function handleFollowUp(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tconst text = (host.editor.getExpandedText?.() ?? host.editor.getText()).trim();\n\t\tif (!text) return;\n\n\t\tif (text.startsWith(\"/\") && !host.isKnownSlashCommand(text)) {\n\t\t\tconst command = text.split(/\\s/)[0];\n\t\t\thost.showError(`Unknown command: ${command}. Use slash autocomplete to see available commands.`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Consume pending images\n\t\tconst images = host.pendingImages.length > 0 ? [...host.pendingImages] : undefined;\n\t\thost.pendingImages.length = 0;\n\n\t\t// Queue input during compaction (extension commands execute immediately)\n\t\tif (host.session.isCompacting) {\n\t\t\tif (host.isExtensionCommand(text)) {\n\t\t\t\thost.editor.addToHistory?.(text);\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\tawait host.session.prompt(text, { images });\n\t\t\t} else {\n\t\t\t\thost.queueCompactionMessage(text, \"followUp\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Alt+Enter queues a follow-up message (waits until agent finishes)\n\t\t// This handles extension commands (execute immediately), prompt template expansion, and queueing\n\t\tif (host.session.isStreaming) {\n\t\t\thost.editor.addToHistory?.(text);\n\t\t\thost.editor.setText(\"\");\n\t\t\tawait host.session.prompt(text, { streamingBehavior: \"followUp\", images });\n\t\t\thost.updatePendingMessagesDisplay();\n\t\t\thost.ui.requestRender();\n\t\t}\n\t\t// If not streaming, Alt+Enter acts like regular Enter (trigger onSubmit)\n\t\telse if (host.editor.onSubmit) {\n\t\t\thost.editor.onSubmit(text);\n\t\t}\n\t}\n\nexport function handleDequeue(host: InteractiveModeDelegateHost): void {\n\t\tconst restored = host.restoreQueuedMessagesToEditor();\n\t\tif (restored === 0) {\n\t\t\thost.showStatus(\"No queued messages to restore\");\n\t\t} else {\n\t\t\thost.showStatus(`Restored ${restored} queued message${restored > 1 ? \"s\" : \"\"} to editor`);\n\t\t}\n\t}\n\nexport function updateEditorBorderColor(host: InteractiveModeDelegateHost): void {\n\t\tif (host.isBashMode) {\n\t\t\thost.editor.borderColor = theme.getBashModeBorderColor();\n\t\t} else {\n\t\t\tconst level = host.session.thinkingLevel || \"off\";\n\t\t\thost.editor.borderColor = theme.getThinkingBorderColor(level);\n\t\t}\n\t\thost.ui.requestRender();\n\t}\n\nexport function cycleThinkingLevel(host: InteractiveModeDelegateHost): void {\n\t\tconst newLevel = host.session.cycleThinkingLevel();\n\t\tif (newLevel === undefined) {\n\t\t\thost.showStatus(\"Current model does not support thinking\");\n\t\t} else {\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t\thost.showStatus(`Thinking level: ${newLevel}`);\n\t\t}\n\t}\n\nexport async function cycleModel(host: InteractiveModeDelegateHost, direction: \"forward\" | \"backward\"): Promise<void> {\n\t\ttry {\n\t\t\tconst result = await host.session.cycleModel(direction);\n\t\t\tif (result === undefined) {\n\t\t\t\tconst msg = host.session.scopedModels.length > 0 ? \"Only one model in scope\" : \"Only one model available\";\n\t\t\t\thost.showStatus(msg);\n\t\t\t} else {\n\t\t\t\thost.footer.invalidate();\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tconst thinkingStr =\n\t\t\t\t\tresult.model.reasoning && result.thinkingLevel !== \"off\" ? ` (thinking: ${result.thinkingLevel})` : \"\";\n\t\t\t\thost.showStatus(`Switched to ${result.model.name || result.model.id}${thinkingStr}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t}\n\nexport function toggleToolOutputExpansion(host: InteractiveModeDelegateHost): void {\n\t\thost.setToolsExpanded(!host.toolOutputExpanded);\n\t}\n\nexport function setToolsExpanded(host: InteractiveModeDelegateHost, expanded: boolean): void {\n\t\thost.toolOutputExpanded = expanded;\n\t\tfor (const child of host.chatContainer.children) {\n\t\t\tif (isExpandable(child)) {\n\t\t\t\tchild.setExpanded(expanded);\n\t\t\t}\n\t\t}\n\t\thost.ui.requestRender();\n\t}\n\nexport function toggleThinkingBlockVisibility(host: InteractiveModeDelegateHost): void {\n\t\thost.hideThinkingBlock = !host.hideThinkingBlock;\n\t\thost.settingsManager.setHideThinkingBlock(host.hideThinkingBlock);\n\n\t\t// Rebuild chat from session messages\n\t\thost.chatContainer.clear();\n\t\thost.rebuildChatFromMessages();\n\n\t\t// If streaming, re-add the streaming component with updated visibility and re-render\n\t\tif (host.streamingComponent && host.streamingMessage) {\n\t\t\thost.streamingComponent.setHideThinkingBlock(host.hideThinkingBlock);\n\t\t\thost.streamingComponent.updateContent(host.streamingMessage);\n\t\t\thost.chatContainer.addChild(host.streamingComponent);\n\t\t}\n\n\t\thost.showStatus(`Thinking blocks: ${host.hideThinkingBlock ? \"hidden\" : \"visible\"}`);\n\t}\n\nexport function openExternalEditor(host: InteractiveModeDelegateHost): void {\n\t\t// Determine editor (respect $VISUAL, then $EDITOR)\n\t\tconst editorCmd = process.env.VISUAL || process.env.EDITOR;\n\t\tif (!editorCmd) {\n\t\t\tlet msg = \"No editor configured. Set $VISUAL or $EDITOR environment variable.\";\n\t\t\tif (process.env.TERM_PROGRAM === \"iTerm.app\") {\n\t\t\t\tmsg +=\n\t\t\t\t\t\"\\n\\nTip: If you meant to open the GSD dashboard (Ctrl+Alt+G), set Left Option Key to\" +\n\t\t\t\t\t\" \\\"Esc+\\\" in iTerm2 → Profiles → Keys. With the default \\\"Normal\\\" setting,\" +\n\t\t\t\t\t\" Ctrl+Alt+G sends Ctrl+G instead.\";\n\t\t\t}\n\t\t\thost.showWarning(msg);\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentText = host.editor.getExpandedText?.() ?? host.editor.getText();\n\t\tconst tmpFile = path.join(os.tmpdir(), `pi-editor-${Date.now()}.pi.md`);\n\n\t\ttry {\n\t\t\t// Write current content to temp file\n\t\t\tfs.writeFileSync(tmpFile, currentText, \"utf-8\");\n\n\t\t\t// Stop TUI to release terminal\n\t\t\thost.ui.stop();\n\n\t\t\t// Split by space to support editor arguments (e.g., \"code --wait\")\n\t\t\tconst [editor, ...editorArgs] = editorCmd.split(\" \");\n\n\t\t\t// Spawn editor synchronously with inherited stdio for interactive editing\n\t\t\tconst result = spawnSync(editor, [...editorArgs, tmpFile], {\n\t\t\t\tstdio: \"inherit\",\n\t\t\t\tshell: process.platform === \"win32\",\n\t\t\t});\n\n\t\t\t// On successful exit (status 0), replace editor content\n\t\t\tif (result.status === 0) {\n\t\t\t\tconst newContent = fs.readFileSync(tmpFile, \"utf-8\").replace(/\\n$/, \"\");\n\t\t\t\thost.editor.setText(newContent);\n\t\t\t}\n\t\t\t// On non-zero exit, keep original text (no action needed)\n\t\t} finally {\n\t\t\t// Clean up temp file\n\t\t\ttry {\n\t\t\t\tfs.unlinkSync(tmpFile);\n\t\t\t} catch {\n\t\t\t\t// Ignore cleanup errors\n\t\t\t}\n\n\t\t\t// Restart TUI\n\t\t\thost.ui.start();\n\t\t\t// Force full re-render since external editor uses alternate screen\n\t\t\thost.ui.requestRender(true);\n\t\t}\n\t}\n"]}
1
+ {"version":3,"file":"interactive-key-handlers.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-key-handlers.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ImageContent } from \"@gsd/pi-ai\";\nimport { listDescendants } from \"@gsd/native\";\nimport { spawnSync } from \"child_process\";\nimport { readClipboardImage } from \"@gsd/pi-coding-agent/utils/clipboard-image.js\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\nimport { MIME_BY_EXT, matchesImageSignature } from \"./interactive-mode-class-constants.js\";\n\ninterface Expandable {\n\tsetExpanded(expanded: boolean): void;\n}\n\nfunction isExpandable(obj: unknown): obj is Expandable {\n\treturn typeof obj === \"object\" && obj !== null && \"setExpanded\" in obj && typeof obj.setExpanded === \"function\";\n}\n\nexport function setupKeyHandlers(host: InteractiveModeDelegateHost): void {\n\t\t// Set up handlers on defaultEditor - they use host.editor for text access\n\t\t// so they work correctly regardless of which editor is active\n\t\thost.defaultEditor.onEscape = () => {\n\t\t\tif (host.loadingAnimation) {\n\t\t\t\thost.restoreQueuedMessagesToEditor({ abort: true });\n\t\t\t} else if (host.session.isBashRunning) {\n\t\t\t\thost.session.abortBash();\n\t\t\t} else if (host.isBashMode) {\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\thost.pendingImages.length = 0;\n\t\t\t\thost.isBashMode = false;\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t} else if (!host.editor.getText().trim()) {\n\t\t\t\t// Double-escape with empty editor triggers /tree, /fork, or nothing based on setting\n\t\t\t\tconst action = host.settingsManager.getDoubleEscapeAction();\n\t\t\t\tif (action !== \"none\") {\n\t\t\t\t\tconst now = Date.now();\n\t\t\t\t\tif (now - host.lastEscapeTime < 500) {\n\t\t\t\t\t\tif (action === \"tree\") {\n\t\t\t\t\t\t\thost.showTreeSelector();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thost.showUserMessageSelector();\n\t\t\t\t\t\t}\n\t\t\t\t\t\thost.lastEscapeTime = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thost.lastEscapeTime = now;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Register app action handlers\n\t\thost.defaultEditor.onAction(\"clear\", () => handleCtrlC(host, ));\n\t\thost.defaultEditor.onCtrlD = () => handleCtrlD(host, );\n\t\thost.defaultEditor.onAction(\"suspend\", () => host.handleCtrlZ());\n\t\thost.defaultEditor.onAction(\"cycleThinkingLevel\", () => host.cycleThinkingLevel());\n\t\thost.defaultEditor.onAction(\"cycleModelForward\", () => host.cycleModel(\"forward\"));\n\t\thost.defaultEditor.onAction(\"cycleModelBackward\", () => host.cycleModel(\"backward\"));\n\n\t\t// Global debug handler on TUI (works regardless of focus)\n\t\thost.ui.onDebug = () => host.handleDebugCommand();\n\t\thost.defaultEditor.onAction(\"selectModel\", () => host.showModelSelector());\n\t\thost.defaultEditor.onAction(\"expandTools\", () => host.toggleToolOutputExpansion());\n\t\thost.defaultEditor.onToggleGsdStatus = () => host.toggleGsdStatusWidget?.();\n\t\thost.defaultEditor.onAction(\"toggleThinking\", () => host.toggleThinkingBlockVisibility());\n\t\thost.defaultEditor.onAction(\"externalEditor\", () => host.openExternalEditor());\n\t\thost.defaultEditor.onAction(\"followUp\", () => host.handleFollowUp());\n\t\thost.defaultEditor.onAction(\"dequeue\", () => host.handleDequeue());\n\t\thost.defaultEditor.onAction(\"newSession\", () => host.handleClearCommand());\n\t\thost.defaultEditor.onAction(\"tree\", () => host.showTreeSelector());\n\t\thost.defaultEditor.onAction(\"fork\", () => host.showUserMessageSelector());\n\t\thost.defaultEditor.onAction(\"resume\", () => host.showSessionSelector());\n\n\t\thost.defaultEditor.onChange = (text: string) => {\n\t\t\tconst wasBashMode = host.isBashMode;\n\t\t\thost.isBashMode = text.trimStart().startsWith(\"!\");\n\t\t\tif (wasBashMode !== host.isBashMode) {\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t}\n\t\t};\n\n\t\t// Handle clipboard image paste (triggered on Ctrl+V)\n\t\thost.defaultEditor.onPasteImage = () => {\n\t\t\thost.handleClipboardImagePaste();\n\t\t};\n\n\t\t// Handle image file paths pasted via terminal emulator (e.g. iTerm2).\n\t\t// Set on defaultEditor here; setCustomEditorComponent guards re-assignment for custom editors.\n\t\thost.defaultEditor.onPasteImagePath = (filePath: string) => {\n\t\t\thost.handlePastedImagePath(filePath);\n\t\t};\n\t}\n\nexport async function handleClipboardImagePaste(host: InteractiveModeDelegateHost): Promise<void> {\n\t\ttry {\n\t\t\tconst image = await readClipboardImage();\n\t\t\tif (!image) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Store image as base64 ImageContent for sending with the prompt\n\t\t\tconst imageContent: ImageContent = {\n\t\t\t\ttype: \"image\",\n\t\t\t\tdata: Buffer.from(image.bytes).toString(\"base64\"),\n\t\t\t\tmimeType: image.mimeType,\n\t\t\t};\n\t\t\thost.pendingImages.push(imageContent);\n\n\t\t\t// Insert friendly placeholder instead of file path\n\t\t\tconst imageNum = host.pendingImages.length;\n\t\t\thost.editor.insertTextAtCursor?.(`[Image #${imageNum}]`);\n\t\t\thost.ui.requestRender();\n\t\t} catch {\n\t\t\t// Silently ignore clipboard errors (may not have permission, etc.)\n\t\t}\n\t}\n\nexport function handlePastedImagePath(host: InteractiveModeDelegateHost, filePath: string): void {\n\t\ttry {\n\t\t\tconst ext = path.extname(filePath).slice(1).toLowerCase();\n\t\t\tconst mimeType = MIME_BY_EXT[ext];\n\t\t\tif (!mimeType) {\n\t\t\t\t// Unsupported / unsafe extension — fall back to inserting raw path.\n\t\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\t\thost.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Reject symlinks to prevent reading sensitive files via a symlinked\n\t\t\t// `.png` that points at e.g. ~/.ssh/id_rsa.\n\t\t\tconst lst = fs.lstatSync(filePath);\n\t\t\tif (!lst.isFile()) {\n\t\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\t\thost.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst data = fs.readFileSync(filePath);\n\n\t\t\t// Magic-byte check — confirms file content actually matches the\n\t\t\t// extension before we forward bytes to a model.\n\t\t\tif (!matchesImageSignature(data, mimeType)) {\n\t\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\t\thost.ui.requestRender();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\thost.pendingImages.push({\n\t\t\t\ttype: \"image\",\n\t\t\t\tdata: data.toString(\"base64\"),\n\t\t\t\tmimeType,\n\t\t\t});\n\n\t\t\tconst imageNum = host.pendingImages.length;\n\t\t\thost.editor.insertTextAtCursor?.(`[Image #${imageNum}]`);\n\t\t\thost.ui.requestRender();\n\t\t} catch {\n\t\t\t// Fall back to inserting the raw path if file can't be read\n\t\t\thost.editor.insertTextAtCursor?.(filePath);\n\t\t\thost.ui.requestRender();\n\t\t}\n\t}\n\nexport function handleCtrlC(host: InteractiveModeDelegateHost): void {\n\t\tconst now = Date.now();\n\t\tif (now - host.lastSigintTime < 500) {\n\t\t\tvoid host.shutdown();\n\t\t} else {\n\t\t\thost.clearEditor();\n\t\t\thost.lastSigintTime = now;\n\t\t}\n\t}\n\nexport function handleCtrlD(host: InteractiveModeDelegateHost): void {\n\t\t// Only called when editor is empty (enforced by CustomEditor)\n\t\tvoid host.shutdown();\n\t}\n\n\t/**\n\t * Gracefully shutdown the agent.\n\t * Emits shutdown event to extensions, then exits.\n\t */\n\nexport async function shutdown(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tconst shutdownBehavior = host.options.shutdownBehavior ?? \"exit_process\";\n\t\tif (shutdownBehavior === \"ignore\") {\n\t\t\thost.showStatus(\"Quit is unavailable in the browser-attached terminal\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (host.isShuttingDown) return;\n\t\thost.isShuttingDown = true;\n\n\t\t// Flush any queued settings writes before shutdown\n\t\tawait host.settingsManager.flush();\n\n\t\t// Emit shutdown event to extensions\n\t\tconst extensionRunner = host.session.extensionRunner;\n\t\tif (extensionRunner?.hasHandlers(\"session_shutdown\")) {\n\t\t\tawait extensionRunner.emit({\n\t\t\t\ttype: \"session_shutdown\",\n\t\t\t\treason: \"quit\",\n\t\t\t});\n\t\t}\n\n\t\t// Wait for any pending renders to complete\n\t\t// requestRender() uses process.nextTick(), so we wait one tick\n\t\tawait new Promise((resolve) => process.nextTick(resolve));\n\n\t\t// Drain any in-flight Kitty key release events before stopping.\n\t\t// This prevents escape sequences from leaking to the parent shell over slow SSH.\n\t\tawait host.ui.terminal.drainInput(1000);\n\n\t\thost.stop();\n\t\tif (shutdownBehavior === \"stop_ui\") {\n\t\t\treturn;\n\t\t}\n\n\t\t// Kill ALL descendant processes to prevent orphans (next-server, pnpm dev, etc.)\n\t\ttry {\n\t\t\tconst descendants = listDescendants(process.pid);\n\t\t\tfor (const childPid of descendants) {\n\t\t\t\ttry { process.kill(childPid, \"SIGTERM\"); } catch {}\n\t\t\t}\n\t\t\tif (descendants.length > 0) {\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, 500));\n\t\t\t\tfor (const childPid of descendants) {\n\t\t\t\t\ttry { process.kill(childPid, \"SIGKILL\"); } catch {}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\n\t\tprocess.exit(0);\n\t}\n\n\t/**\n\t * Check if shutdown was requested and perform shutdown if so.\n\t */\nexport async function checkShutdownRequested(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tif (!host.shutdownRequested) return;\n\t\tawait host.shutdown();\n\t}\n\nexport function handleCtrlZ(host: InteractiveModeDelegateHost): void {\n\t\t// On Windows, SIGTSTP doesn't exist - Ctrl+Z is not supported\n\t\tif (process.platform === \"win32\") {\n\t\t\treturn;\n\t\t}\n\n\t\t// Ignore SIGINT while suspended so Ctrl+C in the terminal does not\n\t\t// kill the backgrounded process. The handler is removed on resume.\n\t\tconst ignoreSigint = () => {};\n\t\tprocess.on(\"SIGINT\", ignoreSigint);\n\n\t\ttry {\n\t\t\t// Set up handler to restore TUI when resumed\n\t\t\tprocess.once(\"SIGCONT\", () => {\n\t\t\t\tprocess.removeListener(\"SIGINT\", ignoreSigint);\n\t\t\t\thost.ui.start();\n\t\t\t\thost.ui.requestRender(true);\n\t\t\t});\n\n\t\t\t// Stop the TUI (restore terminal to normal mode)\n\t\t\thost.ui.stop();\n\n\t\t\t// Send SIGTSTP to process group (pid=0 means all processes in group)\n\t\t\tprocess.kill(0, \"SIGTSTP\");\n\t\t} catch {\n\t\t\t// If suspend fails (e.g. SIGTSTP not supported), ensure the\n\t\t\t// SIGINT listener doesn't leak.\n\t\t\tprocess.removeListener(\"SIGINT\", ignoreSigint);\n\t\t}\n\t}\n\nexport async function handleFollowUp(host: InteractiveModeDelegateHost): Promise<void> {\n\t\tconst text = (host.editor.getExpandedText?.() ?? host.editor.getText()).trim();\n\t\tif (!text) return;\n\n\t\tif (text.startsWith(\"/\") && !host.isKnownSlashCommand(text)) {\n\t\t\tconst command = text.split(/\\s/)[0];\n\t\t\thost.showError(`Unknown command: ${command}. Use slash autocomplete to see available commands.`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Consume pending images\n\t\tconst images = host.pendingImages.length > 0 ? [...host.pendingImages] : undefined;\n\t\thost.pendingImages.length = 0;\n\n\t\t// Queue input during compaction (extension commands execute immediately)\n\t\tif (host.session.isCompacting) {\n\t\t\tif (host.isExtensionCommand(text)) {\n\t\t\t\thost.editor.addToHistory?.(text);\n\t\t\t\thost.editor.setText(\"\");\n\t\t\t\tawait host.session.prompt(text, { images });\n\t\t\t} else {\n\t\t\t\thost.queueCompactionMessage(text, \"followUp\");\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Alt+Enter queues a follow-up message (waits until agent finishes)\n\t\t// This handles extension commands (execute immediately), prompt template expansion, and queueing\n\t\tif (host.session.isStreaming) {\n\t\t\thost.editor.addToHistory?.(text);\n\t\t\thost.editor.setText(\"\");\n\t\t\tawait host.session.prompt(text, { streamingBehavior: \"followUp\", images });\n\t\t\thost.updatePendingMessagesDisplay();\n\t\t\thost.ui.requestRender();\n\t\t}\n\t\t// If not streaming, Alt+Enter acts like regular Enter (trigger onSubmit)\n\t\telse if (host.editor.onSubmit) {\n\t\t\thost.editor.onSubmit(text);\n\t\t}\n\t}\n\nexport function handleDequeue(host: InteractiveModeDelegateHost): void {\n\t\tconst restored = host.restoreQueuedMessagesToEditor();\n\t\tif (restored === 0) {\n\t\t\thost.showStatus(\"No queued messages to restore\");\n\t\t} else {\n\t\t\thost.showStatus(`Restored ${restored} queued message${restored > 1 ? \"s\" : \"\"} to editor`);\n\t\t}\n\t}\n\nexport function updateEditorBorderColor(host: InteractiveModeDelegateHost): void {\n\t\tif (host.isBashMode) {\n\t\t\thost.editor.borderColor = theme.getBashModeBorderColor();\n\t\t} else {\n\t\t\tconst level = host.session.thinkingLevel || \"off\";\n\t\t\thost.editor.borderColor = theme.getThinkingBorderColor(level);\n\t\t}\n\t\thost.ui.requestRender();\n\t}\n\nexport function cycleThinkingLevel(host: InteractiveModeDelegateHost): void {\n\t\tconst newLevel = host.session.cycleThinkingLevel();\n\t\tif (newLevel === undefined) {\n\t\t\thost.showStatus(\"Current model does not support thinking\");\n\t\t} else {\n\t\t\thost.footer.invalidate();\n\t\t\thost.updateEditorBorderColor();\n\t\t\thost.showStatus(`Thinking level: ${newLevel}`);\n\t\t}\n\t}\n\nexport async function cycleModel(host: InteractiveModeDelegateHost, direction: \"forward\" | \"backward\"): Promise<void> {\n\t\ttry {\n\t\t\tconst result = await host.session.cycleModel(direction);\n\t\t\tif (result === undefined) {\n\t\t\t\tconst msg = host.session.scopedModels.length > 0 ? \"Only one model in scope\" : \"Only one model available\";\n\t\t\t\thost.showStatus(msg);\n\t\t\t} else {\n\t\t\t\thost.footer.invalidate();\n\t\t\t\thost.updateEditorBorderColor();\n\t\t\t\tconst thinkingStr =\n\t\t\t\t\tresult.model.reasoning && result.thinkingLevel !== \"off\" ? ` (thinking: ${result.thinkingLevel})` : \"\";\n\t\t\t\thost.showStatus(`Switched to ${result.model.name || result.model.id}${thinkingStr}`);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\thost.showError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t}\n\nexport function toggleToolOutputExpansion(host: InteractiveModeDelegateHost): void {\n\t\thost.setToolsExpanded(!host.toolOutputExpanded);\n\t}\n\nexport function setToolsExpanded(host: InteractiveModeDelegateHost, expanded: boolean): void {\n\t\thost.toolOutputExpanded = expanded;\n\t\tfor (const child of host.chatContainer.children) {\n\t\t\tif (isExpandable(child)) {\n\t\t\t\tchild.setExpanded(expanded);\n\t\t\t}\n\t\t}\n\t\thost.ui.requestRender();\n\t}\n\nexport function toggleThinkingBlockVisibility(host: InteractiveModeDelegateHost): void {\n\t\thost.hideThinkingBlock = !host.hideThinkingBlock;\n\t\thost.settingsManager.setHideThinkingBlock(host.hideThinkingBlock);\n\n\t\t// Rebuild chat from session messages\n\t\thost.chatContainer.clear();\n\t\thost.rebuildChatFromMessages();\n\n\t\t// If streaming, re-add the streaming component with updated visibility and re-render\n\t\tif (host.streamingComponent && host.streamingMessage) {\n\t\t\thost.streamingComponent.setHideThinkingBlock(host.hideThinkingBlock);\n\t\t\thost.streamingComponent.updateContent(host.streamingMessage);\n\t\t\thost.chatContainer.addChild(host.streamingComponent);\n\t\t}\n\n\t\thost.showStatus(`Thinking blocks: ${host.hideThinkingBlock ? \"hidden\" : \"visible\"}`);\n\t}\n\nexport function openExternalEditor(host: InteractiveModeDelegateHost): void {\n\t\t// Determine editor (respect $VISUAL, then $EDITOR)\n\t\tconst editorCmd = process.env.VISUAL || process.env.EDITOR;\n\t\tif (!editorCmd) {\n\t\t\tlet msg = \"No editor configured. Set $VISUAL or $EDITOR environment variable.\";\n\t\t\tif (process.env.TERM_PROGRAM === \"iTerm.app\") {\n\t\t\t\tmsg +=\n\t\t\t\t\t\"\\n\\nTip: If you meant to open the GSD dashboard (Ctrl+Alt+G), set Left Option Key to\" +\n\t\t\t\t\t\" \\\"Esc+\\\" in iTerm2 → Profiles → Keys. With the default \\\"Normal\\\" setting,\" +\n\t\t\t\t\t\" Ctrl+Alt+G sends Ctrl+G instead.\";\n\t\t\t}\n\t\t\thost.showWarning(msg);\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentText = host.editor.getExpandedText?.() ?? host.editor.getText();\n\t\tconst tmpFile = path.join(os.tmpdir(), `pi-editor-${Date.now()}.pi.md`);\n\n\t\ttry {\n\t\t\t// Write current content to temp file\n\t\t\tfs.writeFileSync(tmpFile, currentText, \"utf-8\");\n\n\t\t\t// Stop TUI to release terminal\n\t\t\thost.ui.stop();\n\n\t\t\t// Split by space to support editor arguments (e.g., \"code --wait\")\n\t\t\tconst [editor, ...editorArgs] = editorCmd.split(\" \");\n\n\t\t\t// Spawn editor synchronously with inherited stdio for interactive editing\n\t\t\tconst result = spawnSync(editor, [...editorArgs, tmpFile], {\n\t\t\t\tstdio: \"inherit\",\n\t\t\t\tshell: process.platform === \"win32\",\n\t\t\t});\n\n\t\t\t// On successful exit (status 0), replace editor content\n\t\t\tif (result.status === 0) {\n\t\t\t\tconst newContent = fs.readFileSync(tmpFile, \"utf-8\").replace(/\\n$/, \"\");\n\t\t\t\thost.editor.setText(newContent);\n\t\t\t}\n\t\t\t// On non-zero exit, keep original text (no action needed)\n\t\t} finally {\n\t\t\t// Clean up temp file\n\t\t\ttry {\n\t\t\t\tfs.unlinkSync(tmpFile);\n\t\t\t} catch {\n\t\t\t\t// Ignore cleanup errors\n\t\t\t}\n\n\t\t\t// Restart TUI\n\t\t\thost.ui.start();\n\t\t\t// Force full re-render since external editor uses alternate screen\n\t\t\thost.ui.requestRender(true);\n\t\t}\n\t}\n"]}
@@ -2,6 +2,7 @@ import type { InteractiveModeDelegateHost } from "./interactive-mode-delegate-ho
2
2
  export { getChangelogForDisplay, checkForNewVersion, checkTmuxKeyboardSetup } from "./interactive-startup.js";
3
3
  export declare function installStdinErrorRecovery(host: InteractiveModeDelegateHost): void;
4
4
  export declare function mountStartupHeader(host: InteractiveModeDelegateHost): void;
5
+ export declare function dismissStartupHeader(host: InteractiveModeDelegateHost): void;
5
6
  export declare function updateTerminalTitle(host: InteractiveModeDelegateHost): void;
6
7
  export { showNewVersionNotification } from "./interactive-ui-messaging.js";
7
8
  //# sourceMappingURL=interactive-mode-init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-mode-init.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-init.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAEvF,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAE9G,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAcjF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CA8D1E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAQ3E;AAED,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"interactive-mode-init.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-init.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAEvF,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAE9G,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAcjF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CA+B1E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAO5E;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,2BAA2B,GAAG,IAAI,CAQ3E;AAED,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC"}
@@ -2,13 +2,9 @@
2
2
  // File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).
3
3
  // @ts-nocheck
4
4
  import * as path from "node:path";
5
- import { Markdown, Spacer, Text } from "@gsd/pi-tui";
5
+ import { Text } from "@gsd/pi-tui";
6
6
  import { APP_NAME } from "@gsd/pi-coding-agent/config.js";
7
7
  import { theme } from "@gsd/pi-coding-agent/theme/theme.js";
8
- import { appKey, appKeyHint, keyHint, rawKeyHint } from "./components/keybinding-hints.js";
9
- import { DynamicBorder } from "./components/dynamic-border.js";
10
- import { getToolExpansionStartupHint } from "./interactive-notify-render.js";
11
- import { getMarkdownThemeWithSettings } from "./interactive-theme-cache.js";
12
8
  export { getChangelogForDisplay, checkForNewVersion, checkTmuxKeyboardSetup } from "./interactive-startup.js";
13
9
  export function installStdinErrorRecovery(host) {
14
10
  if (host.stdinErrorHandler)
@@ -27,64 +23,39 @@ export function installStdinErrorRecovery(host) {
27
23
  process.stdin.on("error", host.stdinErrorHandler);
28
24
  }
29
25
  export function mountStartupHeader(host) {
26
+ const logo = theme.bold(theme.fg("accent", APP_NAME)) + theme.fg("dim", ` v${host.version}`);
27
+ const model = host.session.state.model?.id ?? "no model";
28
+ const lineOne = `${logo} · ${theme.fg("dim", model)} · ${theme.fg("accent", "/help")}`;
30
29
  if (host.options.verbose || !host.settingsManager.getQuietStartup()) {
31
- const logo = theme.bold(theme.fg("accent", APP_NAME)) + theme.fg("dim", ` v${host.version}`);
32
- const kb = host.keybindings;
33
- const hint = (action, desc) => appKeyHint(kb, action, desc);
34
- const instructions = [
35
- hint("interrupt", "to interrupt"),
36
- hint("clear", "to clear"),
37
- rawKeyHint(`${appKey(kb, "clear")} twice`, "to exit"),
38
- hint("exit", "to exit (empty)"),
39
- hint("suspend", "to suspend"),
40
- keyHint("deleteToLineEnd", "to delete to end"),
41
- hint("cycleThinkingLevel", "to cycle thinking level"),
42
- rawKeyHint(`${appKey(kb, "cycleModelForward")}/${appKey(kb, "cycleModelBackward")}`, "to cycle models"),
43
- hint("selectModel", "to select model"),
44
- getToolExpansionStartupHint(host.toolOutputExpanded, kb),
45
- hint("toggleThinking", "to expand thinking"),
46
- hint("externalEditor", "for external editor"),
47
- rawKeyHint("/", "for commands"),
48
- rawKeyHint("!", "to run bash"),
49
- rawKeyHint("!!", "to run bash (no context)"),
50
- hint("followUp", "to queue follow-up"),
51
- hint("dequeue", "to edit all queued messages"),
52
- hint("pasteImage", "to paste image"),
53
- rawKeyHint("drop files", "to attach"),
54
- ].join("\n");
55
- host.builtInHeader = new Text(`${logo}\n${instructions}`, 1, 0);
56
- host.headerContainer.addChild(new Spacer(1));
30
+ host.builtInHeader = new Text(lineOne, 1, 0);
57
31
  host.headerContainer.addChild(host.builtInHeader);
58
- host.headerContainer.addChild(new Spacer(1));
59
32
  if (host.changelogMarkdown) {
60
- host.headerContainer.addChild(new DynamicBorder());
61
- if (host.settingsManager.getCollapseChangelog()) {
62
- const versionMatch = host.changelogMarkdown.match(/##\s+\[?(\d+\.\d+\.\d+)\]?/);
63
- const latestVersion = versionMatch ? versionMatch[1] : host.version;
64
- const condensedText = `Updated to v${latestVersion}. Use ${theme.bold("/changelog")} to view full changelog.`;
65
- host.headerContainer.addChild(new Text(condensedText, 1, 0));
66
- }
67
- else {
68
- host.headerContainer.addChild(new Text(theme.bold(theme.fg("accent", "What's New")), 1, 0));
69
- host.headerContainer.addChild(new Spacer(1));
70
- host.headerContainer.addChild(new Markdown(host.changelogMarkdown.trim(), 1, 0, getMarkdownThemeWithSettings(host)));
71
- host.headerContainer.addChild(new Spacer(1));
72
- }
73
- host.headerContainer.addChild(new DynamicBorder());
33
+ const versionMatch = host.changelogMarkdown.match(/##\s+\[?(\d+\.\d+\.\d+)\]?/);
34
+ const latestVersion = versionMatch ? versionMatch[1] : host.version;
35
+ const condensedText = theme.fg("muted", `Updated to v${latestVersion}. Use ${theme.bold("/changelog")} for details.`);
36
+ host.headerContainer.addChild(new Text(condensedText, 1, 0));
74
37
  }
75
38
  }
76
39
  else {
77
- host.builtInHeader = new Text("", 0, 0);
40
+ host.builtInHeader = new Text(lineOne, 1, 0);
78
41
  host.headerContainer.addChild(host.builtInHeader);
79
42
  if (host.changelogMarkdown) {
80
- host.headerContainer.addChild(new Spacer(1));
81
43
  const versionMatch = host.changelogMarkdown.match(/##\s+\[?(\d+\.\d+\.\d+)\]?/);
82
44
  const latestVersion = versionMatch ? versionMatch[1] : host.version;
83
- const condensedText = `Updated to v${latestVersion}. Use ${theme.bold("/changelog")} to view full changelog.`;
45
+ const condensedText = theme.fg("muted", `Updated to v${latestVersion}. Use ${theme.bold("/changelog")} for details.`);
84
46
  host.headerContainer.addChild(new Text(condensedText, 1, 0));
85
47
  }
86
48
  }
87
49
  }
50
+ export function dismissStartupHeader(host) {
51
+ if (host.startupHeaderDismissed)
52
+ return;
53
+ host.startupHeaderDismissed = true;
54
+ host.headerContainer.clear();
55
+ host.builtInHeader = new Text("", 0, 0);
56
+ host.headerContainer.addChild(host.builtInHeader);
57
+ host.ui.requestRender();
58
+ }
88
59
  export function updateTerminalTitle(host) {
89
60
  const cwdBasename = path.basename(process.cwd());
90
61
  const sessionName = host.sessionManager.getSessionName();
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-mode-init.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-init.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n// @ts-nocheck\n\nimport * as path from \"node:path\";\nimport { Markdown, Spacer, Text } from \"@gsd/pi-tui\";\nimport { APP_NAME } from \"@gsd/pi-coding-agent/config.js\";\nimport type { AppAction } from \"@gsd/agent-core\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { appKey, appKeyHint, keyHint, rawKeyHint } from \"./components/keybinding-hints.js\";\nimport { DynamicBorder } from \"./components/dynamic-border.js\";\nimport { getToolExpansionStartupHint } from \"./interactive-notify-render.js\";\nimport { getChangelogForDisplay } from \"./interactive-startup.js\";\nimport { getMarkdownThemeWithSettings } from \"./interactive-theme-cache.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\nexport { getChangelogForDisplay, checkForNewVersion, checkTmuxKeyboardSetup } from \"./interactive-startup.js\";\n\nexport function installStdinErrorRecovery(host: InteractiveModeDelegateHost): void {\n\tif (host.stdinErrorHandler) return;\n\thost.stdinErrorHandler = (err: Error) => {\n\t\tconst errno = err as NodeJS.ErrnoException;\n\t\tconst isReadEio = errno.code === \"EIO\" || /read EIO/i.test(err.message);\n\t\tif (!isReadEio) return;\n\n\t\tprocess.stderr.write(`[pi] stdin EIO detected, aborting active stream\\n`);\n\t\tif (host.session.isStreaming) {\n\t\t\thost.agent.abort();\n\t\t\thost.showWarning(\"Terminal input was interrupted (EIO). Aborted the active response; send your message again.\");\n\t\t}\n\t};\n\tprocess.stdin.on(\"error\", host.stdinErrorHandler);\n}\n\nexport function mountStartupHeader(host: InteractiveModeDelegateHost): void {\n\tif (host.options.verbose || !host.settingsManager.getQuietStartup()) {\n\t\tconst logo = theme.bold(theme.fg(\"accent\", APP_NAME)) + theme.fg(\"dim\", ` v${host.version}`);\n\n\t\tconst kb = host.keybindings;\n\t\tconst hint = (action: AppAction, desc: string) => appKeyHint(kb, action, desc);\n\n\t\tconst instructions = [\n\t\t\thint(\"interrupt\", \"to interrupt\"),\n\t\t\thint(\"clear\", \"to clear\"),\n\t\t\trawKeyHint(`${appKey(kb, \"clear\")} twice`, \"to exit\"),\n\t\t\thint(\"exit\", \"to exit (empty)\"),\n\t\t\thint(\"suspend\", \"to suspend\"),\n\t\t\tkeyHint(\"deleteToLineEnd\", \"to delete to end\"),\n\t\t\thint(\"cycleThinkingLevel\", \"to cycle thinking level\"),\n\t\t\trawKeyHint(`${appKey(kb, \"cycleModelForward\")}/${appKey(kb, \"cycleModelBackward\")}`, \"to cycle models\"),\n\t\t\thint(\"selectModel\", \"to select model\"),\n\t\t\tgetToolExpansionStartupHint(host.toolOutputExpanded, kb),\n\t\t\thint(\"toggleThinking\", \"to expand thinking\"),\n\t\t\thint(\"externalEditor\", \"for external editor\"),\n\t\t\trawKeyHint(\"/\", \"for commands\"),\n\t\t\trawKeyHint(\"!\", \"to run bash\"),\n\t\t\trawKeyHint(\"!!\", \"to run bash (no context)\"),\n\t\t\thint(\"followUp\", \"to queue follow-up\"),\n\t\t\thint(\"dequeue\", \"to edit all queued messages\"),\n\t\t\thint(\"pasteImage\", \"to paste image\"),\n\t\t\trawKeyHint(\"drop files\", \"to attach\"),\n\t\t].join(\"\\n\");\n\t\thost.builtInHeader = new Text(`${logo}\\n${instructions}`, 1, 0);\n\n\t\thost.headerContainer.addChild(new Spacer(1));\n\t\thost.headerContainer.addChild(host.builtInHeader);\n\t\thost.headerContainer.addChild(new Spacer(1));\n\n\t\tif (host.changelogMarkdown) {\n\t\t\thost.headerContainer.addChild(new DynamicBorder());\n\t\t\tif (host.settingsManager.getCollapseChangelog()) {\n\t\t\t\tconst versionMatch = host.changelogMarkdown.match(/##\\s+\\[?(\\d+\\.\\d+\\.\\d+)\\]?/);\n\t\t\t\tconst latestVersion = versionMatch ? versionMatch[1] : host.version;\n\t\t\t\tconst condensedText = `Updated to v${latestVersion}. Use ${theme.bold(\"/changelog\")} to view full changelog.`;\n\t\t\t\thost.headerContainer.addChild(new Text(condensedText, 1, 0));\n\t\t\t} else {\n\t\t\t\thost.headerContainer.addChild(new Text(theme.bold(theme.fg(\"accent\", \"What's New\")), 1, 0));\n\t\t\t\thost.headerContainer.addChild(new Spacer(1));\n\t\t\t\thost.headerContainer.addChild(\n\t\t\t\t\tnew Markdown(host.changelogMarkdown.trim(), 1, 0, getMarkdownThemeWithSettings(host)),\n\t\t\t\t);\n\t\t\t\thost.headerContainer.addChild(new Spacer(1));\n\t\t\t}\n\t\t\thost.headerContainer.addChild(new DynamicBorder());\n\t\t}\n\t} else {\n\t\thost.builtInHeader = new Text(\"\", 0, 0);\n\t\thost.headerContainer.addChild(host.builtInHeader);\n\t\tif (host.changelogMarkdown) {\n\t\t\thost.headerContainer.addChild(new Spacer(1));\n\t\t\tconst versionMatch = host.changelogMarkdown.match(/##\\s+\\[?(\\d+\\.\\d+\\.\\d+)\\]?/);\n\t\t\tconst latestVersion = versionMatch ? versionMatch[1] : host.version;\n\t\t\tconst condensedText = `Updated to v${latestVersion}. Use ${theme.bold(\"/changelog\")} to view full changelog.`;\n\t\t\thost.headerContainer.addChild(new Text(condensedText, 1, 0));\n\t\t}\n\t}\n}\n\nexport function updateTerminalTitle(host: InteractiveModeDelegateHost): void {\n\tconst cwdBasename = path.basename(process.cwd());\n\tconst sessionName = host.sessionManager.getSessionName();\n\tif (sessionName) {\n\t\thost.ui.terminal.setTitle(`π - ${sessionName} - ${cwdBasename}`);\n\t} else {\n\t\thost.ui.terminal.setTitle(`π - ${cwdBasename}`);\n\t}\n}\n\nexport { showNewVersionNotification } from \"./interactive-ui-messaging.js\";\n"]}
1
+ {"version":3,"file":"interactive-mode-init.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-init.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,gFAAgF;AAChF,cAAc;AAEd,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,qCAAqC,CAAC;AAI5D,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAE9G,MAAM,UAAU,yBAAyB,CAAC,IAAiC;IAC1E,IAAI,IAAI,CAAC,iBAAiB;QAAE,OAAO;IACnC,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAU,EAAE,EAAE;QACvC,MAAM,KAAK,GAAG,GAA4B,CAAC;QAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxE,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QAC1E,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,WAAW,CAAC,6FAA6F,CAAC,CAAC;QACjH,CAAC;IACF,CAAC,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAiC;IACnE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,UAAU,CAAC;IACzD,MAAM,OAAO,GAAG,GAAG,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC;IAEvF,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,eAAe,EAAE,EAAE,CAAC;QACrE,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAElD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChF,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACpE,MAAM,aAAa,GAAG,KAAK,CAAC,EAAE,CAC7B,OAAO,EACP,eAAe,aAAa,SAAS,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,CAC5E,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;IACF,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChF,MAAM,aAAa,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACpE,MAAM,aAAa,GAAG,KAAK,CAAC,EAAE,CAC7B,OAAO,EACP,eAAe,aAAa,SAAS,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,CAC5E,CAAC;YACF,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;IACF,CAAC;AACF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAiC;IACrE,IAAI,IAAI,CAAC,sBAAsB;QAAE,OAAO;IACxC,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;IACnC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACxC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClD,IAAI,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAiC;IACpE,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;IACzD,IAAI,WAAW,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,WAAW,MAAM,WAAW,EAAE,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACP,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,WAAW,EAAE,CAAC,CAAC;IACjD,CAAC;AACF,CAAC;AAED,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Extracted from interactive-mode.ts (Phase E2 seam remediation).\n// @ts-nocheck\n\nimport * as path from \"node:path\";\nimport { Text } from \"@gsd/pi-tui\";\nimport { APP_NAME } from \"@gsd/pi-coding-agent/config.js\";\nimport { theme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { getChangelogForDisplay } from \"./interactive-startup.js\";\nimport type { InteractiveModeDelegateHost } from \"./interactive-mode-delegate-host.js\";\n\nexport { getChangelogForDisplay, checkForNewVersion, checkTmuxKeyboardSetup } from \"./interactive-startup.js\";\n\nexport function installStdinErrorRecovery(host: InteractiveModeDelegateHost): void {\n\tif (host.stdinErrorHandler) return;\n\thost.stdinErrorHandler = (err: Error) => {\n\t\tconst errno = err as NodeJS.ErrnoException;\n\t\tconst isReadEio = errno.code === \"EIO\" || /read EIO/i.test(err.message);\n\t\tif (!isReadEio) return;\n\n\t\tprocess.stderr.write(`[pi] stdin EIO detected, aborting active stream\\n`);\n\t\tif (host.session.isStreaming) {\n\t\t\thost.agent.abort();\n\t\t\thost.showWarning(\"Terminal input was interrupted (EIO). Aborted the active response; send your message again.\");\n\t\t}\n\t};\n\tprocess.stdin.on(\"error\", host.stdinErrorHandler);\n}\n\nexport function mountStartupHeader(host: InteractiveModeDelegateHost): void {\n\tconst logo = theme.bold(theme.fg(\"accent\", APP_NAME)) + theme.fg(\"dim\", ` v${host.version}`);\n\tconst model = host.session.state.model?.id ?? \"no model\";\n\tconst lineOne = `${logo} · ${theme.fg(\"dim\", model)} · ${theme.fg(\"accent\", \"/help\")}`;\n\n\tif (host.options.verbose || !host.settingsManager.getQuietStartup()) {\n\t\thost.builtInHeader = new Text(lineOne, 1, 0);\n\t\thost.headerContainer.addChild(host.builtInHeader);\n\n\t\tif (host.changelogMarkdown) {\n\t\t\tconst versionMatch = host.changelogMarkdown.match(/##\\s+\\[?(\\d+\\.\\d+\\.\\d+)\\]?/);\n\t\t\tconst latestVersion = versionMatch ? versionMatch[1] : host.version;\n\t\t\tconst condensedText = theme.fg(\n\t\t\t\t\"muted\",\n\t\t\t\t`Updated to v${latestVersion}. Use ${theme.bold(\"/changelog\")} for details.`,\n\t\t\t);\n\t\t\thost.headerContainer.addChild(new Text(condensedText, 1, 0));\n\t\t}\n\t} else {\n\t\thost.builtInHeader = new Text(lineOne, 1, 0);\n\t\thost.headerContainer.addChild(host.builtInHeader);\n\t\tif (host.changelogMarkdown) {\n\t\t\tconst versionMatch = host.changelogMarkdown.match(/##\\s+\\[?(\\d+\\.\\d+\\.\\d+)\\]?/);\n\t\t\tconst latestVersion = versionMatch ? versionMatch[1] : host.version;\n\t\t\tconst condensedText = theme.fg(\n\t\t\t\t\"muted\",\n\t\t\t\t`Updated to v${latestVersion}. Use ${theme.bold(\"/changelog\")} for details.`,\n\t\t\t);\n\t\t\thost.headerContainer.addChild(new Text(condensedText, 1, 0));\n\t\t}\n\t}\n}\n\nexport function dismissStartupHeader(host: InteractiveModeDelegateHost): void {\n\tif (host.startupHeaderDismissed) return;\n\thost.startupHeaderDismissed = true;\n\thost.headerContainer.clear();\n\thost.builtInHeader = new Text(\"\", 0, 0);\n\thost.headerContainer.addChild(host.builtInHeader);\n\thost.ui.requestRender();\n}\n\nexport function updateTerminalTitle(host: InteractiveModeDelegateHost): void {\n\tconst cwdBasename = path.basename(process.cwd());\n\tconst sessionName = host.sessionManager.getSessionName();\n\tif (sessionName) {\n\t\thost.ui.terminal.setTitle(`π - ${sessionName} - ${cwdBasename}`);\n\t} else {\n\t\thost.ui.terminal.setTitle(`π - ${cwdBasename}`);\n\t}\n}\n\nexport { showNewVersionNotification } from \"./interactive-ui-messaging.js\";\n"]}
@@ -18,7 +18,11 @@ export interface InteractiveModeStateHost {
18
18
  onInputCallback?: (text: string) => void;
19
19
  isInitialized: boolean;
20
20
  loadingAnimation?: any;
21
+ activityLoader?: any;
21
22
  pendingWorkingMessage?: string | null;
23
+ gsdProgressState?: {
24
+ phase?: string;
25
+ };
22
26
  clearBlockingError(): void;
23
27
  defaultWorkingMessage: string;
24
28
  streamingComponent?: any;
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-mode-state.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,WAAW,wBAAwB;IACxC,aAAa,EAAE,GAAG,CAAC;IACnB,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;IACb,EAAE,EAAE,GAAG,CAAC;IACR,MAAM,EAAE,GAAG,CAAC;IACZ,WAAW,EAAE,GAAG,CAAC;IACjB,eAAe,EAAE,GAAG,CAAC;IACrB,aAAa,EAAE,GAAG,CAAC;IACnB,sBAAsB,EAAE,GAAG,CAAC;IAC5B,eAAe,EAAE,GAAG,CAAC;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,kBAAkB,IAAI,IAAI,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,GAAG,CAAC;IACzB,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,oBAAoB,CAAC,EAAE,GAAG,CAAC;IAC3B,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;IACzC,wBAAwB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAAA;KAAE,CAAC,CAAC;IAC9E,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,eAAe,EAAE,GAAG,CAAC;IACrB,kBAAkB,CAAC,EAAE,GAAG,CAAC;IACzB,aAAa,EAAE,YAAY,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAC"}
1
+ {"version":3,"file":"interactive-mode-state.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,MAAM,WAAW,wBAAwB;IACxC,aAAa,EAAE,GAAG,CAAC;IACnB,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;IACb,EAAE,EAAE,GAAG,CAAC;IACR,MAAM,EAAE,GAAG,CAAC;IACZ,WAAW,EAAE,GAAG,CAAC;IACjB,eAAe,EAAE,GAAG,CAAC;IACrB,aAAa,EAAE,GAAG,CAAC;IACnB,sBAAsB,EAAE,GAAG,CAAC;IAC5B,eAAe,EAAE,GAAG,CAAC;IACrB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,aAAa,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,gBAAgB,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,kBAAkB,IAAI,IAAI,CAAC;IAC3B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,kBAAkB,CAAC,EAAE,GAAG,CAAC;IACzB,gBAAgB,CAAC,EAAE,GAAG,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,oBAAoB,CAAC,EAAE,GAAG,CAAC;IAC3B,2BAA2B,CAAC,EAAE,MAAM,IAAI,CAAC;IACzC,wBAAwB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAAA;KAAE,CAAC,CAAC;IAC9E,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,eAAe,EAAE,GAAG,CAAC;IACrB,kBAAkB,CAAC,EAAE,GAAG,CAAC;IACzB,aAAa,EAAE,YAAY,EAAE,CAAC;CAC9B;AAED,MAAM,MAAM,oBAAoB,GAAG,iBAAiB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-mode-state.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-state.ts"],"names":[],"mappings":"","sourcesContent":["import type { ImageContent } from \"@gsd/pi-ai\";\nimport type { AgentSessionEvent } from \"@gsd/agent-core\";\n\nexport interface InteractiveModeStateHost {\n\tdefaultEditor: any;\n\teditor: any;\n\tsession: any;\n\tui: any;\n\tfooter: any;\n\tkeybindings: any;\n\tstatusContainer: any;\n\tchatContainer: any;\n\tpinnedMessageContainer: any;\n\tsettingsManager: any;\n\tpendingTools: Map<string, any>;\n\ttoolOutputExpanded: boolean;\n\thideThinkingBlock: boolean;\n\tisBashMode: boolean;\n\tonInputCallback?: (text: string) => void;\n\tisInitialized: boolean;\n\tloadingAnimation?: any;\n\tpendingWorkingMessage?: string | null;\n\tclearBlockingError(): void;\n\tdefaultWorkingMessage: string;\n\tstreamingComponent?: any;\n\tstreamingMessage?: any;\n\tretryEscapeHandler?: () => void;\n\tretryLoader?: any;\n\tautoCompactionLoader?: any;\n\tautoCompactionEscapeHandler?: () => void;\n\tcompactionQueuedMessages: Array<{ text: string; mode: \"steer\" | \"followUp\" }>;\n\textensionSelector?: any;\n\textensionInput?: any;\n\textensionEditor?: any;\n\teditorContainer: any;\n\tkeybindingsManager?: any;\n\tpendingImages: ImageContent[];\n}\n\nexport type InteractiveModeEvent = AgentSessionEvent;\n"]}
1
+ {"version":3,"file":"interactive-mode-state.js","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-state.ts"],"names":[],"mappings":"","sourcesContent":["import type { ImageContent } from \"@gsd/pi-ai\";\nimport type { AgentSessionEvent } from \"@gsd/agent-core\";\n\nexport interface InteractiveModeStateHost {\n\tdefaultEditor: any;\n\teditor: any;\n\tsession: any;\n\tui: any;\n\tfooter: any;\n\tkeybindings: any;\n\tstatusContainer: any;\n\tchatContainer: any;\n\tpinnedMessageContainer: any;\n\tsettingsManager: any;\n\tpendingTools: Map<string, any>;\n\ttoolOutputExpanded: boolean;\n\thideThinkingBlock: boolean;\n\tisBashMode: boolean;\n\tonInputCallback?: (text: string) => void;\n\tisInitialized: boolean;\n\tloadingAnimation?: any;\n\tactivityLoader?: any;\n\tpendingWorkingMessage?: string | null;\n\tgsdProgressState?: { phase?: string };\n\tclearBlockingError(): void;\n\tdefaultWorkingMessage: string;\n\tstreamingComponent?: any;\n\tstreamingMessage?: any;\n\tretryEscapeHandler?: () => void;\n\tretryLoader?: any;\n\tautoCompactionLoader?: any;\n\tautoCompactionEscapeHandler?: () => void;\n\tcompactionQueuedMessages: Array<{ text: string; mode: \"steer\" | \"followUp\" }>;\n\textensionSelector?: any;\n\textensionInput?: any;\n\textensionEditor?: any;\n\teditorContainer: any;\n\tkeybindingsManager?: any;\n\tpendingImages: ImageContent[];\n}\n\nexport type InteractiveModeEvent = AgentSessionEvent;\n"]}
@@ -36,7 +36,10 @@ export declare class InteractiveMode {
36
36
  private ui;
37
37
  private chatContainer;
38
38
  private pendingMessagesContainer;
39
- private adaptiveLayout;
39
+ private gsdStatusWidget;
40
+ private gsdStatusExpanded;
41
+ private gsdProgressState;
42
+ private gsdProgressDispose?;
40
43
  private statusContainer;
41
44
  private pinnedMessageContainer;
42
45
  private blockingErrorContainer;
@@ -51,12 +54,14 @@ export declare class InteractiveMode {
51
54
  private isInitialized;
52
55
  private onInputCallback?;
53
56
  private loadingAnimation;
57
+ private activityLoader;
54
58
  private pendingWorkingMessage;
55
59
  private readonly defaultWorkingMessage;
56
60
  private lastBlockingError;
57
61
  private lastSigintTime;
58
62
  private lastEscapeTime;
59
63
  private changelogMarkdown;
64
+ private startupHeaderDismissed;
60
65
  private lastStatusSpacer;
61
66
  private lastStatusText;
62
67
  private streamingComponent;
@@ -116,7 +121,7 @@ export declare class InteractiveMode {
116
121
  getContextPercent(): number | undefined;
117
122
  renderInitialMessages(): void;
118
123
  getUserInput(): Promise<string>;
119
- getExtensionUIContext(): import("@gsd/pi-coding-agent/core/extensions/extension-upstream-types").ExtensionUIContext;
124
+ getExtensionUIContext(): import("@gsd/pi-coding-agent/core/extensions/extension-upstream-types.js").ExtensionUIContext;
120
125
  requestRender(force?: boolean): void;
121
126
  stop(): void;
122
127
  private formatDisplayPath;
@@ -127,6 +132,7 @@ export declare class InteractiveMode {
127
132
  private formatWebSearchResult;
128
133
  private setupExtensionShortcuts;
129
134
  private setExtensionStatus;
135
+ private setGsdProgress;
130
136
  private setExtensionWidget;
131
137
  private clearExtensionWidgets;
132
138
  private resetExtensionUI;
@@ -181,6 +187,8 @@ export declare class InteractiveMode {
181
187
  private cycleModel;
182
188
  private toggleToolOutputExpansion;
183
189
  private setToolsExpanded;
190
+ toggleGsdStatusWidget(): void;
191
+ private setToolRailAnimation;
184
192
  private toggleThinkingBlockVisibility;
185
193
  private openExternalEditor;
186
194
  private showSelector;