@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
@@ -8,6 +8,12 @@ export type FrameTone = "assistant" | "user" | "compaction" | "skill";
8
8
  export declare function chatMessageWidth(width: number): number;
9
9
  /** Outer indent for user turns and tool/work cards in the connected transcript. */
10
10
  export declare const TRANSCRIPT_CARD_INDENT = 4;
11
+ /** Tool rows in the transcript (Variant A). */
12
+ export declare const TRANSCRIPT_TOOL_MARKER = "\u25B8";
13
+ /** System/compaction/skill notices in the transcript (Variant A). */
14
+ export declare const TRANSCRIPT_SYSTEM_MARKER = "\u25C7";
15
+ export declare function setRailAnimationEnabled(enabled: boolean): void;
16
+ export declare function isRailAnimationEnabled(): boolean;
11
17
  export declare function headerLabel(text: string): string;
12
18
  export declare function renderChatTurnBridge(width: number, fromIndent?: number, railColor?: ThemeColor): string[];
13
19
  /** Bridge from a left-pegged assistant turn down into the next indented user turn. */
@@ -26,6 +32,8 @@ export declare function trimOuterBlankLines(lines: string[]): string[];
26
32
  export declare function collapseBlankLines(lines: string[]): string[];
27
33
  export declare function breakpoint(width: number): TuiBreakpoint;
28
34
  export declare function badge(text: string, tone?: TuiTone): string;
35
+ /** Compact braille spinner for live auto-mode status chrome. */
36
+ export declare function styledActivitySpinner(tone?: TuiTone): string;
29
37
  export declare function keyValue(label: string, value: string, valueColor?: ThemeColor, labelWidth?: number): string;
30
38
  export declare function roundedPanel(lines: string[], width: number, opts?: {
31
39
  tone?: TuiTone;
@@ -49,9 +57,8 @@ export declare function openSurface(lines: string[], width: number, opts: {
49
57
  paddingX?: number;
50
58
  }): string[];
51
59
  /**
52
- * Render a framed system/conversation surface (compaction notices, skill
53
- * invocations) as a copy-clean open surface (ADR-019): a titled top rule
54
- * and body lines with no border column. Replaces the former chat-frame.ts.
60
+ * Render a system/conversation notice (compaction, skill invocations) as a
61
+ * plain header plus copy-clean body lines (Variant A no horizontal rules).
55
62
  */
56
63
  export declare function renderChatFrame(contentLines: string[], width: number, opts: {
57
64
  label: string;
@@ -60,6 +67,18 @@ export declare function renderChatFrame(contentLines: string[], width: number, o
60
67
  timestampFormat: TimestampFormat;
61
68
  showTimestamp?: boolean;
62
69
  }): string[];
70
+ /** Chat/dialog corner glyph — top-left opener on speaker headers. */
71
+ export declare const CHAT_CORNER_TOP_LEFT = "\u256D\u2500 ";
72
+ /** @deprecated Prefer renderCornerSpeakerHeader via renderPlainSpeakerMessage. */
73
+ export declare function renderPlainSpeakerHeader(label: string, meta: string | undefined, width: number, tone: "user" | "assistant"): string;
74
+ export declare function renderPlainSpeakerBody(lines: string[], width: number, bodyColor: "userMessageText" | "assistantMessageText"): string[];
75
+ export declare function renderPlainSpeakerMessage(lines: string[], width: number, opts: {
76
+ label: string;
77
+ meta?: string;
78
+ tone: "user" | "assistant";
79
+ trailingBlank?: boolean;
80
+ }): string[];
81
+ /** @deprecated Connected rails — Variant B. Prefer renderPlainSpeakerMessage. */
63
82
  export declare function renderAssistantRail(lines: string[], width: number, opts?: {
64
83
  label?: string;
65
84
  meta?: string;
@@ -67,6 +86,7 @@ export declare function renderAssistantRail(lines: string[], width: number, opts
67
86
  connected?: boolean;
68
87
  continuesToUser?: boolean;
69
88
  }): string[];
89
+ /** @deprecated Connected rails — Variant B. Prefer renderPlainSpeakerMessage. */
70
90
  export declare function renderUserRail(lines: string[], width: number, opts: {
71
91
  label?: string;
72
92
  meta?: string;
@@ -80,6 +100,18 @@ export declare function renderTranscriptCard(lines: string[], width: number, opt
80
100
  footerRight?: string;
81
101
  indent?: number;
82
102
  }): string[];
103
+ export declare function renderCompactToolStrip(title: string, target: string | undefined, width: number, opts: {
104
+ status: string;
105
+ tone: StatusTone;
106
+ hidden?: boolean;
107
+ }): string[];
108
+ export declare function renderPlainToolMessage(bodyLines: string[], width: number, opts: {
109
+ title: string;
110
+ target?: string;
111
+ meta?: string;
112
+ tone: StatusTone;
113
+ }): string[];
114
+ /** @deprecated Prefer renderCompactToolStrip (Variant A). */
83
115
  export declare function renderToolLineCard(title: string, target: string | undefined, width: number, opts: {
84
116
  status: string;
85
117
  tone: StatusTone;
@@ -95,5 +127,41 @@ export declare function renderCommandCard(command: string, width: number, opts:
95
127
  indent?: number;
96
128
  }): string[];
97
129
  export declare function renderProgressBar(done: number, total: number, width: number, tone?: StatusTone): string;
130
+ export type StepDotMode = "position" | "completed";
131
+ /**
132
+ * Discrete step indicator — ● for reached steps, ○ for pending.
133
+ * `position`: done is the active step index (1-based, includes current).
134
+ * `completed`: done is the count of fully finished steps.
135
+ */
136
+ export declare function renderStepDots(done: number, total: number, opts?: {
137
+ maxDots?: number;
138
+ mode?: StepDotMode;
139
+ }): string;
140
+ /** Label + step dots + numeric count, e.g. `tasks ●●●○○ 3/5`. */
141
+ export declare function formatStepProgress(label: string, done: number, total: number, opts?: {
142
+ maxDots?: number;
143
+ mode?: StepDotMode;
144
+ countColor?: ThemeColor;
145
+ }): string;
98
146
  export declare function renderFooterStrip(leftSegments: string[], right: string, width: number): string[];
147
+ /**
148
+ * Full-width footer: fixed segments plus one flex segment (typically context + bar).
149
+ * The flex segment receives all remaining horizontal space.
150
+ */
151
+ export declare function layoutFullWidthFooter(segments: string[], width: number, flexAt: number, flexRender: (segmentBudget: number) => string): string;
152
+ export declare function renderFullWidthFooterStrip(segments: string[], width: number, flex?: {
153
+ at: number;
154
+ render: (segmentBudget: number) => string;
155
+ }): string[];
156
+ /** Single-line footer — no box, ` · ` separators. */
157
+ export declare function layoutMinimalFooter(segments: string[], width: number, flex?: {
158
+ at: number;
159
+ render: (segmentBudget: number) => string;
160
+ }): string;
161
+ /**
162
+ * Full-width minimal footer: left + center (flex) flush left, stats flush right.
163
+ */
164
+ export declare function layoutFullWidthMinimalFooter(leftSegments: string[], rightSegments: string[], width: number, flexRender: (segmentBudget: number) => string): string;
165
+ /** Single-line footer output — no rounded panel. */
166
+ export declare function renderMinimalFooterLine(line: string, width: number): string[];
99
167
  //# sourceMappingURL=transcript-design.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-design.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/transcript-design.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transcript-design.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/transcript-design.ts"],"names":[],"mappings":"AAIA,OAAO,EAAS,KAAK,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvE,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAC/E,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;AACvF,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAE3D,+EAA+E;AAC/E,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,GAAG,OAAO,CAAC;AAEtE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,mFAAmF;AACnF,eAAO,MAAM,sBAAsB,IAAI,CAAC;AAExC,+CAA+C;AAC/C,eAAO,MAAM,sBAAsB,WAAM,CAAC;AAE1C,qEAAqE;AACrE,eAAO,MAAM,wBAAwB,WAAM,CAAC;AAa5C,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE9D;AACD,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAqDD,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,MAAM,EACb,UAAU,SAAyB,EACnC,SAAS,GAAE,UAA2B,GACpC,MAAM,EAAE,CAGV;AAED,sFAAsF;AACtF,wBAAgB,0BAA0B,CACzC,KAAK,EAAE,MAAM,EACb,SAAS,GAAE,UAAqB,GAC9B,MAAM,EAAE,CAGV;AAED,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EAAE,EACnB,IAAI,GAAE;IACL,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACf,GACJ,MAAM,EAAE,CAqDV;AAUD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAM7D;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAQ5D;AAiBD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAIvD;AAcD,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,OAAmB,GAAG,MAAM,CAErE;AAID,gEAAgE;AAChE,wBAAgB,qBAAqB,CAAC,IAAI,GAAE,OAAkB,GAAG,MAAM,CAGtE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,GAAE,UAAmB,EAAE,UAAU,SAAK,GAAG,MAAM,CAE/G;AAED,wBAAgB,YAAY,CAC3B,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IACL,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACb,GACJ,MAAM,EAAE,CAkBV;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAC1B,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1E,MAAM,EAAE,CAaV;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB,GACC,MAAM,EAAE,CA4BV;AAED,qEAAqE;AACrE,eAAO,MAAM,oBAAoB,kBAAQ,CAAC;AAoB1C,kFAAkF;AAClF,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GAAG,WAAW,GACxB,MAAM,CAER;AAED,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,iBAAiB,GAAG,sBAAsB,GACnD,MAAM,EAAE,CAGV;AAED,wBAAgB,yBAAyB,CACxC,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GACzF,MAAM,EAAE,CASV;AAED,iFAAiF;AACjF,wBAAgB,mBAAmB,CAClC,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IACL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CACrB,GACJ,MAAM,EAAE,CAmBV;AAED,iFAAiF;AACjF,wBAAgB,cAAc,CAC7B,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAE,GACrE,MAAM,EAAE,CAWV;AAwCD,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,GACC,MAAM,EAAE,CAmBV;AASD,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1D,MAAM,EAAE,CAQV;AAED,wBAAgB,sBAAsB,CACrC,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,GACvE,MAAM,EAAE,CA2BV;AAED,6DAA6D;AAC7D,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/G,MAAM,EAAE,CAMV;AAED,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5E,MAAM,EAAE,CAQV;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,UAAsB,GAAG,MAAM,CAQlH;AAED,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;AAInD;;;;GAIG;AACH,wBAAgB,cAAc,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAA;CAAO,GACjD,MAAM,CA6BR;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CACjC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,WAAW,CAAC;IAAC,UAAU,CAAC,EAAE,UAAU,CAAA;CAAO,GAC1E,MAAM,CAIR;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAUhG;AAID;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAC3C,MAAM,CAiBR;AAED,wBAAgB,0BAA0B,CACzC,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GAC9D,MAAM,EAAE,CAOV;AAED,qDAAqD;AACrD,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GAC9D,MAAM,CAgBR;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAC3C,YAAY,EAAE,MAAM,EAAE,EACtB,aAAa,EAAE,MAAM,EAAE,EACvB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAC3C,MAAM,CAmBR;AAED,oDAAoD;AACpD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAG7E"}
@@ -1,6 +1,6 @@
1
1
  // Project/App: gsd-pi
2
2
  // File Purpose: Shared recommended transcript rendering primitives for assistant, tool, command, footer, and auto-mode TUI surfaces.
3
- import { alignRight, padRight, style, truncateToWidth, visibleWidth } from "@gsd/pi-tui";
3
+ import { alignRight, isImageLine, padRight, style, truncateToWidth, visibleWidth } from "@gsd/pi-tui";
4
4
  import { theme } from "@gsd/pi-coding-agent/theme/theme.js";
5
5
  import { formatTimestamp } from "./timestamp.js";
6
6
  export function chatMessageWidth(width) {
@@ -8,10 +8,27 @@ export function chatMessageWidth(width) {
8
8
  }
9
9
  /** Outer indent for user turns and tool/work cards in the connected transcript. */
10
10
  export const TRANSCRIPT_CARD_INDENT = 4;
11
+ /** Tool rows in the transcript (Variant A). */
12
+ export const TRANSCRIPT_TOOL_MARKER = "▸";
13
+ /** System/compaction/skill notices in the transcript (Variant A). */
14
+ export const TRANSCRIPT_SYSTEM_MARKER = "◇";
11
15
  const RUNNING_RAIL_FRAME_MS = 70;
12
16
  const RUNNING_RAIL_TRAIL = 5;
13
17
  const HORIZONTAL_RAIL = "─";
14
18
  const HORIZONTAL_RAIL_HEAD = "━";
19
+ // Whether the "running" rail sweeps (animates) or renders as a static rule. User
20
+ // setting `terminal.toolRailAnimation` (default on). When off, running cards show
21
+ // a static rail and ToolExecutionComponent does not arm its re-render timer, so a
22
+ // long-running tool costs zero idle CPU. Module-level (not per-card) because every
23
+ // running card shares the one preference; the interactive mode sets it at startup
24
+ // and when the setting is toggled.
25
+ let railAnimationEnabled = true;
26
+ export function setRailAnimationEnabled(enabled) {
27
+ railAnimationEnabled = enabled;
28
+ }
29
+ export function isRailAnimationEnabled() {
30
+ return railAnimationEnabled;
31
+ }
15
32
  export function headerLabel(text) {
16
33
  return text.toUpperCase();
17
34
  }
@@ -74,7 +91,7 @@ export function renderConnectedCard(width, title, bodyLines, opts = {}) {
74
91
  const indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;
75
92
  const prefix = indentSpaces(indent);
76
93
  const railColor = opts.railColor ?? "borderAccent";
77
- const sweepFrame = opts.railSweep ? runningRailFrame() : undefined;
94
+ const sweepFrame = opts.railSweep && railAnimationEnabled ? runningRailFrame() : undefined;
78
95
  const rail = (text) => renderRailText(text, railColor, sweepFrame);
79
96
  const resolvedTitleColor = opts.titleColor ??
80
97
  (title.includes("✕") ? "error" : title.includes("✓") ? "success" : railColor);
@@ -95,12 +112,26 @@ export function renderConnectedCard(width, title, bodyLines, opts = {}) {
95
112
  }
96
113
  }
97
114
  const paintBody = (line) => {
115
+ // Image (Kitty/iTerm2) sequence lines carry raw terminal graphics escapes and
116
+ // rely on exact column/row positioning. Prepend the SAME left offset normal
117
+ // body lines get (card indent + 3 spaces) so the image aligns under the card
118
+ // text rather than hugging column 0, but do NOT padRight/truncate — trailing
119
+ // padding or clipping after the sequence would corrupt the placement. The
120
+ // leading spaces simply advance the cursor before the image draws.
121
+ if (isImageLine(line)) {
122
+ return prefix + " " + line;
123
+ }
98
124
  const innerWidth = Math.max(1, width - indent);
99
125
  const inner = padRight(" " + line, innerWidth);
100
126
  const painted = opts.bodyBg ? theme.bg(opts.bodyBg, inner) : inner;
101
127
  return prefix + painted;
102
128
  };
103
- const bodySource = trimOuterBlankLines(bodyLines);
129
+ // When the body contains an inline image, its reserved blank padding rows (the
130
+ // rows the TUI counts so content below the image lands in the right place) must
131
+ // NOT be trimmed/collapsed — trimming them collapses a tall image to one line
132
+ // and the terminal then paints the full image over the chat and footer below.
133
+ const hasImage = bodyLines.some((l) => isImageLine(l));
134
+ const bodySource = hasImage ? bodyLines : trimOuterBlankLines(bodyLines);
104
135
  const out = [padLine(topLine, width)];
105
136
  for (const line of bodySource) {
106
137
  out.push(paintBody(line));
@@ -110,12 +141,18 @@ export function renderConnectedCard(width, title, bodyLines, opts = {}) {
110
141
  }
111
142
  return out;
112
143
  }
144
+ function stripAnsiCodes(text) {
145
+ return text.replace(/\x1b\[[0-9;]*m/g, "");
146
+ }
147
+ function isBlankRenderLine(line) {
148
+ return stripAnsiCodes(line).trim().length === 0;
149
+ }
113
150
  export function trimOuterBlankLines(lines) {
114
151
  let start = 0;
115
152
  let end = lines.length;
116
- while (start < end && lines[start].trim().length === 0)
153
+ while (start < end && isBlankRenderLine(lines[start]))
117
154
  start++;
118
- while (end > start && lines[end - 1].trim().length === 0)
155
+ while (end > start && isBlankRenderLine(lines[end - 1]))
119
156
  end--;
120
157
  return lines.slice(start, end);
121
158
  }
@@ -123,8 +160,8 @@ export function trimOuterBlankLines(lines) {
123
160
  export function collapseBlankLines(lines) {
124
161
  const out = [];
125
162
  for (const line of lines) {
126
- const blank = line.trim().length === 0;
127
- if (blank && out.length > 0 && out[out.length - 1].trim().length === 0)
163
+ const blank = isBlankRenderLine(line);
164
+ if (blank && out.length > 0 && isBlankRenderLine(out[out.length - 1]))
128
165
  continue;
129
166
  out.push(line);
130
167
  }
@@ -164,6 +201,12 @@ function panelToneColor(tone) {
164
201
  export function badge(text, tone = "default") {
165
202
  return theme.fg(panelToneColor(tone), text);
166
203
  }
204
+ const ACTIVITY_SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
205
+ /** Compact braille spinner for live auto-mode status chrome. */
206
+ export function styledActivitySpinner(tone = "accent") {
207
+ const frame = ACTIVITY_SPINNER_FRAMES[Math.floor(Date.now() / 120) % ACTIVITY_SPINNER_FRAMES.length];
208
+ return theme.fg(panelToneColor(tone), frame);
209
+ }
167
210
  export function keyValue(label, value, valueColor = "text", labelWidth = 10) {
168
211
  return `${theme.fg("dim", padRight(label, labelWidth))}${theme.fg(valueColor, value)}`;
169
212
  }
@@ -211,9 +254,8 @@ export function openSurface(lines, width, opts) {
211
254
  return surface.render(lines, Math.max(20, width));
212
255
  }
213
256
  /**
214
- * Render a framed system/conversation surface (compaction notices, skill
215
- * invocations) as a copy-clean open surface (ADR-019): a titled top rule
216
- * and body lines with no border column. Replaces the former chat-frame.ts.
257
+ * Render a system/conversation notice (compaction, skill invocations) as a
258
+ * plain header plus copy-clean body lines (Variant A no horizontal rules).
217
259
  */
218
260
  export function renderChatFrame(contentLines, width, opts) {
219
261
  const outerWidth = Math.max(20, width);
@@ -222,21 +264,47 @@ export function renderChatFrame(contentLines, width, opts) {
222
264
  const bodyColor = opts.tone === "user" ? "userMessageText" : isPurple ? "customMessageText" : "assistantMessageText";
223
265
  // A label may carry a " - " splitting a bold name from a dim detail.
224
266
  const dashIdx = opts.label.indexOf(" - ");
225
- const titleStyled = dashIdx >= 0
267
+ const labelStyled = dashIdx >= 0
226
268
  ? theme.fg(frameColor, theme.bold(opts.label.slice(0, dashIdx))) + theme.fg("dim", opts.label.slice(dashIdx))
227
269
  : theme.fg(frameColor, theme.bold(opts.label));
228
270
  const rightRaw = opts.showTimestamp === false || !opts.timestamp ? "" : formatTimestamp(opts.timestamp, opts.timestampFormat);
271
+ const metaStyled = rightRaw ? theme.fg("dim", ` · ${rightRaw}`) : "";
272
+ const header = padLine(truncateToWidth(`${theme.fg(frameColor, TRANSCRIPT_SYSTEM_MARKER)} ${labelStyled}${metaStyled}`, outerWidth, "…"), outerWidth);
229
273
  const source = trimOuterBlankLines(contentLines);
230
- const body = (source.length > 0 ? source : [""]).map((line) => theme.fg(bodyColor, line));
231
- let surface = style()
232
- .border("open")
233
- .borderColor((text) => theme.fg(frameColor, text))
234
- .title(titleStyled);
235
- if (rightRaw) {
236
- surface = surface.titleRight(theme.fg("dim", rightRaw));
274
+ const body = (source.length > 0 ? source : [""]).map((line) => padLine(theme.fg(bodyColor, line), outerWidth));
275
+ return [header, ...body, ""];
276
+ }
277
+ /** Chat/dialog corner glyph — top-left opener on speaker headers. */
278
+ export const CHAT_CORNER_TOP_LEFT = "╭─ ";
279
+ function speakerCornerColor(tone) {
280
+ return tone === "user" ? "border" : "borderAccent";
281
+ }
282
+ function renderCornerSpeakerHeader(label, meta, width, tone) {
283
+ const cornerColor = speakerCornerColor(tone);
284
+ const labelStyled = tone === "user" ? theme.fg("border", theme.bold(label)) : theme.fg("accent", theme.bold(label));
285
+ const metaStyled = meta ? theme.fg("dim", ` · ${meta}`) : "";
286
+ const topLeft = theme.fg(cornerColor, CHAT_CORNER_TOP_LEFT) + labelStyled + metaStyled;
287
+ return padLine(truncateToWidth(topLeft, width, "…"), width);
288
+ }
289
+ /** @deprecated Prefer renderCornerSpeakerHeader via renderPlainSpeakerMessage. */
290
+ export function renderPlainSpeakerHeader(label, meta, width, tone) {
291
+ return renderCornerSpeakerHeader(label, meta, width, tone);
292
+ }
293
+ export function renderPlainSpeakerBody(lines, width, bodyColor) {
294
+ const source = trimOuterBlankLines(lines);
295
+ return source.map((line) => padLine(theme.fg(bodyColor, line), width));
296
+ }
297
+ export function renderPlainSpeakerMessage(lines, width, opts) {
298
+ const outerWidth = Math.max(20, width);
299
+ const bodyColor = opts.tone === "user" ? "userMessageText" : "assistantMessageText";
300
+ const body = renderPlainSpeakerBody(lines, outerWidth, bodyColor);
301
+ const out = [renderCornerSpeakerHeader(opts.label, opts.meta, outerWidth, opts.tone), ...body];
302
+ if (opts.trailingBlank !== false) {
303
+ out.push("");
237
304
  }
238
- return surface.render(body, outerWidth);
305
+ return out;
239
306
  }
307
+ /** @deprecated Connected rails — Variant B. Prefer renderPlainSpeakerMessage. */
240
308
  export function renderAssistantRail(lines, width, opts = {}) {
241
309
  const railColor = opts.railColor ?? "borderAccent";
242
310
  const source = trimOuterBlankLines(lines);
@@ -257,11 +325,12 @@ export function renderAssistantRail(lines, width, opts = {}) {
257
325
  }
258
326
  return result;
259
327
  }
328
+ /** @deprecated Connected rails — Variant B. Prefer renderPlainSpeakerMessage. */
260
329
  export function renderUserRail(lines, width, opts) {
261
330
  const source = trimOuterBlankLines(lines);
262
331
  const body = (source.length > 0 ? source : [""]).map((line) => theme.fg("userMessageText", line));
263
332
  const titleRight = opts.meta ? theme.fg("dim", opts.meta) : undefined;
264
- return renderConnectedCard(width, opts.label ?? "You", body, {
333
+ return renderConnectedCard(width, opts.label ?? "YOU", body, {
265
334
  indent: TRANSCRIPT_CARD_INDENT,
266
335
  titleRight,
267
336
  railColor: "border",
@@ -288,7 +357,7 @@ function openRuleLine(title, right, width, tone, sweep = false) {
288
357
  const clippedRight = truncateToWidth(right, rightBudget, "");
289
358
  const fixed = 4 + visibleWidth(clippedTitle) + 2 + visibleWidth(clippedRight) + 4;
290
359
  const fill = Math.max(1, w - fixed);
291
- const sweepFrame = sweep ? runningRailFrame() : undefined;
360
+ const sweepFrame = sweep && railAnimationEnabled ? runningRailFrame() : undefined;
292
361
  return padLine(renderRailText("─── ", tone) +
293
362
  clippedTitle +
294
363
  renderRailText(` ${"─".repeat(fill)} `, tone, sweepFrame) +
@@ -305,7 +374,9 @@ export function renderTranscriptCard(lines, width, opts) {
305
374
  const outerWidth = Math.max(20, width);
306
375
  const indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;
307
376
  const tone = toneColor(opts.tone);
308
- const body = trimOuterBlankLines(lines);
377
+ // Preserve image padding rows (see renderConnectedCard) — trimming them would
378
+ // collapse a tall inline image and make it overflow the card.
379
+ const body = lines.some((l) => isImageLine(l)) ? lines : trimOuterBlankLines(lines);
309
380
  let titleRight = opts.right ? theme.fg(tone, opts.right) : undefined;
310
381
  if (opts.footerLeft || opts.footerRight) {
311
382
  const hint = [opts.footerLeft, opts.footerRight].filter(Boolean).join(" · ");
@@ -319,27 +390,64 @@ export function renderTranscriptCard(lines, width, opts) {
319
390
  railSweep: opts.tone === "running",
320
391
  });
321
392
  }
322
- export function renderToolLineCard(title, target, width, opts) {
323
- const tone = toneColor(opts.tone);
324
- const indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;
325
- const innerWidth = Math.max(20, width - indent);
326
- const titleText = `${opts.titlePrefix ?? ""}${styledHeader(title, "borderAccent")}${target ? ` ${theme.fg("text", target)}` : ""}`;
393
+ function statusColorForTone(tone) {
394
+ if (tone === "error")
395
+ return "error";
396
+ if (tone === "running")
397
+ return "accent";
398
+ if (tone === "warning")
399
+ return "warning";
400
+ return "success";
401
+ }
402
+ export function renderCompactToolStrip(title, target, width, opts) {
403
+ const titleText = target
404
+ ? `${styledHeader(title, "borderAccent")} ${theme.fg("text", target)}`
405
+ : styledHeader(title, "borderAccent");
406
+ const left = `${theme.fg("borderAccent", TRANSCRIPT_TOOL_MARKER)} ${titleText}`;
327
407
  const statusText = opts.hidden ? `${opts.status} · output hidden · ctrl+o expand` : opts.status;
328
- const right = theme.fg(opts.tone === "success" ? "success" : tone, statusText);
329
- const rule = openRuleLine(titleText, right, innerWidth, tone, opts.tone === "running");
330
- const line = opts.bg ? theme.bg(opts.bg, rule) : rule;
331
- return indentRenderedLines([line], indent, width);
408
+ const right = theme.fg(statusColorForTone(opts.tone), statusText);
409
+ return [padLine(alignRight(left, right, width), width)];
410
+ }
411
+ export function renderPlainToolMessage(bodyLines, width, opts) {
412
+ const outerWidth = Math.max(20, width);
413
+ const indent = TRANSCRIPT_CARD_INDENT;
414
+ const prefix = indentSpaces(indent);
415
+ const innerWidth = Math.max(1, outerWidth - indent);
416
+ const titleText = opts.target
417
+ ? `${styledHeader(opts.title, "borderAccent")} ${theme.fg("text", opts.target)}`
418
+ : styledHeader(opts.title, "borderAccent");
419
+ const left = `${theme.fg("borderAccent", TRANSCRIPT_TOOL_MARKER)} ${titleText}`;
420
+ const right = opts.meta ? theme.fg(statusColorForTone(opts.tone), opts.meta) : "";
421
+ const header = padLine(alignRight(left, right, outerWidth), outerWidth);
422
+ const hasImage = bodyLines.some((line) => isImageLine(line));
423
+ const bodySource = hasImage ? bodyLines : collapseBlankLines(bodyLines);
424
+ const paintBody = (line) => {
425
+ if (isImageLine(line)) {
426
+ return prefix + " " + line;
427
+ }
428
+ if (hasImage && isBlankRenderLine(line)) {
429
+ return padLine(prefix + padRight("", innerWidth), outerWidth);
430
+ }
431
+ return padLine(truncateToWidth(line, outerWidth, ""), outerWidth);
432
+ };
433
+ return [header, ...bodySource.map(paintBody), ""];
434
+ }
435
+ /** @deprecated Prefer renderCompactToolStrip (Variant A). */
436
+ export function renderToolLineCard(title, target, width, opts) {
437
+ return renderCompactToolStrip(title, target, width, {
438
+ status: opts.status,
439
+ tone: opts.tone,
440
+ hidden: opts.hidden,
441
+ });
332
442
  }
333
443
  export function renderCommandCard(command, width, opts) {
334
- const tone = toneColor(opts.tone);
335
- const indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;
336
- const innerWidth = Math.max(20, width - indent);
337
- const titleText = `${theme.fg("accent", "$")} ${theme.fg("text", command)}`;
444
+ const left = `${theme.fg("accent", "$")} ${theme.fg("text", command)}`;
338
445
  const statusText = opts.progress
339
446
  ? `${opts.progress} ${opts.status}`
340
447
  : `${opts.status} · output hidden · ctrl+o expand`;
341
- const right = theme.fg(opts.tone === "success" ? "success" : tone, statusText);
342
- return indentRenderedLines([openRuleLine(titleText, right, innerWidth, tone, opts.tone === "running")], indent, width);
448
+ const statusColor = opts.tone === "error" ? "error" : opts.tone === "running" ? "accent" : "success";
449
+ const right = theme.fg(statusColor, statusText);
450
+ return [padLine(alignRight(left, right, width), width)];
343
451
  }
344
452
  export function renderProgressBar(done, total, width, tone = "success") {
345
453
  const clampedWidth = Math.max(0, width);
@@ -348,6 +456,46 @@ export function renderProgressBar(done, total, width, tone = "success") {
348
456
  return (theme.fg(toneColor(tone), "█".repeat(filled)) +
349
457
  theme.fg("dim", "░".repeat(clampedWidth - filled)));
350
458
  }
459
+ const STEP_DOT_MAX = 12;
460
+ /**
461
+ * Discrete step indicator — ● for reached steps, ○ for pending.
462
+ * `position`: done is the active step index (1-based, includes current).
463
+ * `completed`: done is the count of fully finished steps.
464
+ */
465
+ export function renderStepDots(done, total, opts = {}) {
466
+ if (total <= 0)
467
+ return "";
468
+ const maxDots = opts.maxDots ?? STEP_DOT_MAX;
469
+ const mode = opts.mode ?? "position";
470
+ const complete = done >= total;
471
+ let displayTotal = total;
472
+ let displayDone = Math.max(0, Math.min(done, total));
473
+ let overflowSuffix = "";
474
+ if (total > maxDots) {
475
+ displayTotal = maxDots;
476
+ displayDone = Math.max(0, Math.min(displayTotal, Math.round((done / total) * displayTotal)));
477
+ overflowSuffix = theme.fg("dim", `+${total - maxDots}`);
478
+ }
479
+ let dots = "";
480
+ for (let i = 0; i < displayTotal; i++) {
481
+ const reached = i < displayDone;
482
+ if (reached) {
483
+ const isCurrent = !complete && mode === "position" && i === displayDone - 1;
484
+ const color = complete ? "success" : isCurrent ? "accent" : "text";
485
+ dots += theme.fg(color, "●");
486
+ }
487
+ else {
488
+ dots += theme.fg("dim", "○");
489
+ }
490
+ }
491
+ return dots + overflowSuffix;
492
+ }
493
+ /** Label + step dots + numeric count, e.g. `tasks ●●●○○ 3/5`. */
494
+ export function formatStepProgress(label, done, total, opts = {}) {
495
+ const dots = renderStepDots(done, total, opts);
496
+ const countColor = opts.countColor ?? "dim";
497
+ return `${theme.fg("dim", label)} ${dots}${theme.fg(countColor, ` ${done}/${total}`)}`;
498
+ }
351
499
  export function renderFooterStrip(leftSegments, right, width) {
352
500
  const outerWidth = Math.max(20, width);
353
501
  const innerWidth = Math.max(1, outerWidth - 2);
@@ -359,4 +507,76 @@ export function renderFooterStrip(leftSegments, right, width) {
359
507
  const content = rightAlign(left, rightStyled, innerWidth);
360
508
  return roundedPanel([content], outerWidth);
361
509
  }
510
+ const footerSegmentSep = () => theme.fg("dim", " │ ");
511
+ /**
512
+ * Full-width footer: fixed segments plus one flex segment (typically context + bar).
513
+ * The flex segment receives all remaining horizontal space.
514
+ */
515
+ export function layoutFullWidthFooter(segments, width, flexAt, flexRender) {
516
+ const sep = footerSegmentSep();
517
+ const sepWidth = visibleWidth(sep);
518
+ const slotCount = segments.length + 1;
519
+ const separators = Math.max(0, slotCount - 1) * sepWidth;
520
+ let fixedWidth = 0;
521
+ for (const segment of segments) {
522
+ fixedWidth += visibleWidth(segment);
523
+ }
524
+ const flexBudget = Math.max(12, width - fixedWidth - separators);
525
+ const flexSegment = flexRender(flexBudget);
526
+ const parts = [...segments.slice(0, flexAt), flexSegment, ...segments.slice(flexAt)];
527
+ const line = parts.join(sep);
528
+ return truncateToWidth(line, width, "…");
529
+ }
530
+ export function renderFullWidthFooterStrip(segments, width, flex) {
531
+ const outerWidth = Math.max(20, width);
532
+ const innerWidth = Math.max(1, outerWidth - 2);
533
+ const content = flex
534
+ ? layoutFullWidthFooter(segments, innerWidth, flex.at, flex.render)
535
+ : truncateToWidth(segments.filter(Boolean).join(footerSegmentSep()), innerWidth, "…");
536
+ return roundedPanel([content], outerWidth);
537
+ }
538
+ /** Single-line footer — no box, ` · ` separators. */
539
+ export function layoutMinimalFooter(segments, width, flex) {
540
+ const sep = theme.fg("dim", " · ");
541
+ const sepWidth = visibleWidth(sep);
542
+ if (flex) {
543
+ const slotCount = segments.length + 1;
544
+ const separators = Math.max(0, slotCount - 1) * sepWidth;
545
+ let fixedWidth = 0;
546
+ for (const segment of segments) {
547
+ fixedWidth += visibleWidth(segment);
548
+ }
549
+ const flexBudget = Math.max(8, width - fixedWidth - separators);
550
+ const flexSegment = flex.render(flexBudget);
551
+ const parts = [...segments.slice(0, flex.at), flexSegment, ...segments.slice(flex.at)];
552
+ return truncateToWidth(parts.join(sep), width, "…");
553
+ }
554
+ return truncateToWidth(segments.filter(Boolean).join(sep), width, "…");
555
+ }
556
+ /**
557
+ * Full-width minimal footer: left + center (flex) flush left, stats flush right.
558
+ */
559
+ export function layoutFullWidthMinimalFooter(leftSegments, rightSegments, width, flexRender) {
560
+ const sep = theme.fg("dim", " · ");
561
+ const left = leftSegments.filter(Boolean).join(sep);
562
+ const right = rightSegments.filter(Boolean).join(sep);
563
+ const leftWidth = left ? visibleWidth(left) : 0;
564
+ const rightWidth = right ? visibleWidth(right) : 0;
565
+ const sepWidth = visibleWidth(sep);
566
+ if (!right) {
567
+ const flexBudget = Math.max(8, width - leftWidth - (left ? sepWidth : 0));
568
+ const center = flexRender(flexBudget);
569
+ const line = [left, center].filter(Boolean).join(sep);
570
+ return truncateToWidth(line, width, "…");
571
+ }
572
+ const flexBudget = Math.max(8, width - leftWidth - rightWidth - sepWidth - 1);
573
+ const center = flexRender(flexBudget);
574
+ const leftBlock = center ? (left ? `${left}${sep}${center}` : center) : left;
575
+ return alignRight(leftBlock, right, width);
576
+ }
577
+ /** Single-line footer output — no rounded panel. */
578
+ export function renderMinimalFooterLine(line, width) {
579
+ const outerWidth = Math.max(20, width);
580
+ return [padRight(truncateToWidth(line, outerWidth, "…"), outerWidth)];
581
+ }
362
582
  //# sourceMappingURL=transcript-design.js.map