gsd-pi 2.82.0 → 3.0.0-dev.04f5ccf82

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 (832) hide show
  1. package/README.md +125 -32
  2. package/dist/cli.js +20 -9
  3. package/dist/headless-ui.js +13 -6
  4. package/dist/headless.js +9 -2
  5. package/dist/resources/.managed-resources-content-hash +1 -1
  6. package/dist/resources/GSD-WORKFLOW.md +10 -1
  7. package/dist/resources/extensions/browser-tools/tools/screenshot.js +1 -0
  8. package/dist/resources/extensions/browser-tools/tools/zoom.js +1 -0
  9. package/dist/resources/extensions/claude-code-cli/partial-builder.js +2 -1
  10. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -6
  11. package/dist/resources/extensions/cmux/index.js +5 -0
  12. package/dist/resources/extensions/gsd/auto/detect-stuck.js +1 -1
  13. package/dist/resources/extensions/gsd/auto/infra-errors.js +9 -3
  14. package/dist/resources/extensions/gsd/auto/loop.js +122 -40
  15. package/dist/resources/extensions/gsd/auto/orchestrator.js +126 -8
  16. package/dist/resources/extensions/gsd/auto/phases.js +155 -49
  17. package/dist/resources/extensions/gsd/auto/session.js +6 -0
  18. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +7 -1
  19. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +3 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +12 -0
  21. package/dist/resources/extensions/gsd/auto-budget.js +9 -0
  22. package/dist/resources/extensions/gsd/auto-dashboard.js +72 -5
  23. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +1 -0
  24. package/dist/resources/extensions/gsd/auto-dispatch.js +185 -30
  25. package/dist/resources/extensions/gsd/auto-model-selection.js +2 -0
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +329 -137
  27. package/dist/resources/extensions/gsd/auto-prompts.js +47 -13
  28. package/dist/resources/extensions/gsd/auto-recovery.js +82 -16
  29. package/dist/resources/extensions/gsd/auto-start.js +99 -16
  30. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  31. package/dist/resources/extensions/gsd/auto-verification.js +146 -34
  32. package/dist/resources/extensions/gsd/auto-worktree.js +185 -26
  33. package/dist/resources/extensions/gsd/auto.js +251 -99
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +65 -10
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +13 -10
  36. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +19 -4
  37. package/dist/resources/extensions/gsd/bootstrap/subagent-input.js +21 -9
  38. package/dist/resources/extensions/gsd/bootstrap/system-context.js +55 -12
  39. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +24 -9
  40. package/dist/resources/extensions/gsd/clean-root-preflight.js +267 -8
  41. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  42. package/dist/resources/extensions/gsd/commands/handlers/core.js +39 -1
  43. package/dist/resources/extensions/gsd/commands/handlers/ops.js +20 -0
  44. package/dist/resources/extensions/gsd/commands-bootstrap.js +5 -0
  45. package/dist/resources/extensions/gsd/commands-handlers.js +17 -2
  46. package/dist/resources/extensions/gsd/commands-mcp-status.js +9 -0
  47. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +16 -4
  48. package/dist/resources/extensions/gsd/commands-verdict.js +139 -0
  49. package/dist/resources/extensions/gsd/context-store.js +112 -0
  50. package/dist/resources/extensions/gsd/crash-recovery.js +55 -7
  51. package/dist/resources/extensions/gsd/db/auto-workers.js +30 -0
  52. package/dist/resources/extensions/gsd/db/milestone-leases.js +24 -0
  53. package/dist/resources/extensions/gsd/db/unit-dispatches.js +3 -2
  54. package/dist/resources/extensions/gsd/db-base-schema.js +2 -0
  55. package/dist/resources/extensions/gsd/db-migration-steps.js +4 -0
  56. package/dist/resources/extensions/gsd/db-task-slice-rows.js +2 -0
  57. package/dist/resources/extensions/gsd/db-writer.js +150 -84
  58. package/dist/resources/extensions/gsd/dispatch-guard.js +46 -2
  59. package/dist/resources/extensions/gsd/docs/preferences-reference.md +11 -1
  60. package/dist/resources/extensions/gsd/doctor-git-checks.js +115 -9
  61. package/dist/resources/extensions/gsd/doctor-proactive.js +14 -2
  62. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +28 -11
  63. package/dist/resources/extensions/gsd/doctor.js +2 -28
  64. package/dist/resources/extensions/gsd/export-html.js +27 -425
  65. package/dist/resources/extensions/gsd/forensics.js +10 -3
  66. package/dist/resources/extensions/gsd/git-conflict-state.js +21 -0
  67. package/dist/resources/extensions/gsd/git-service.js +152 -15
  68. package/dist/resources/extensions/gsd/gsd-db.js +76 -33
  69. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -3
  70. package/dist/resources/extensions/gsd/guided-flow.js +110 -117
  71. package/dist/resources/extensions/gsd/guided-unit-context.js +23 -0
  72. package/dist/resources/extensions/gsd/init-wizard.js +17 -2
  73. package/dist/resources/extensions/gsd/knowledge-backfill.js +144 -0
  74. package/dist/resources/extensions/gsd/knowledge-capture.js +136 -0
  75. package/dist/resources/extensions/gsd/knowledge-parser.js +154 -0
  76. package/dist/resources/extensions/gsd/knowledge-projection.js +210 -0
  77. package/dist/resources/extensions/gsd/markdown-renderer.js +20 -12
  78. package/dist/resources/extensions/gsd/mcp-filter.js +58 -0
  79. package/dist/resources/extensions/gsd/md-importer.js +1 -1
  80. package/dist/resources/extensions/gsd/memory-backfill.js +73 -17
  81. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +222 -0
  82. package/dist/resources/extensions/gsd/migrate/command.js +5 -0
  83. package/dist/resources/extensions/gsd/migrate/parsers.js +121 -2
  84. package/dist/resources/extensions/gsd/migrate/preview.js +9 -0
  85. package/dist/resources/extensions/gsd/migrate/transformer.js +51 -4
  86. package/dist/resources/extensions/gsd/migrate/writer.js +11 -1
  87. package/dist/resources/extensions/gsd/migration-auto-check.js +12 -17
  88. package/dist/resources/extensions/gsd/milestone-actions.js +11 -4
  89. package/dist/resources/extensions/gsd/native-git-bridge.js +57 -14
  90. package/dist/resources/extensions/gsd/parallel-orchestrator.js +3 -0
  91. package/dist/resources/extensions/gsd/paths.js +4 -0
  92. package/dist/resources/extensions/gsd/pending-auto-start.js +52 -0
  93. package/dist/resources/extensions/gsd/planning-path-scope.js +9 -3
  94. package/dist/resources/extensions/gsd/post-execution-checks.js +73 -9
  95. package/dist/resources/extensions/gsd/pre-execution-checks.js +54 -19
  96. package/dist/resources/extensions/gsd/preferences-mcp.js +19 -0
  97. package/dist/resources/extensions/gsd/preferences-models.js +6 -4
  98. package/dist/resources/extensions/gsd/preferences-types.js +3 -0
  99. package/dist/resources/extensions/gsd/preferences-validation.js +147 -0
  100. package/dist/resources/extensions/gsd/preferences.js +35 -0
  101. package/dist/resources/extensions/gsd/prompt-loader.js +1 -1
  102. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  103. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  104. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  105. package/dist/resources/extensions/gsd/prompts/discuss.md +9 -9
  106. package/dist/resources/extensions/gsd/prompts/forensics.md +3 -3
  107. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  108. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  109. package/dist/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  110. package/dist/resources/extensions/gsd/prompts/queue.md +4 -4
  111. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  112. package/dist/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  113. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  114. package/dist/resources/extensions/gsd/prompts/system.md +2 -2
  115. package/dist/resources/extensions/gsd/provider-switch-observer.js +146 -0
  116. package/dist/resources/extensions/gsd/queue-reorder-ui.js +30 -13
  117. package/dist/resources/extensions/gsd/repo-identity.js +39 -22
  118. package/dist/resources/extensions/gsd/repository-registry.js +44 -0
  119. package/dist/resources/extensions/gsd/safety/evidence-collector.js +2 -0
  120. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +42 -18
  121. package/dist/resources/extensions/gsd/session-lock.js +15 -2
  122. package/dist/resources/extensions/gsd/slice-parallel-conflict.js +2 -2
  123. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +84 -5
  124. package/dist/resources/extensions/gsd/smart-entry-routing.js +36 -0
  125. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +6 -1
  126. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +9 -14
  127. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +19 -24
  128. package/dist/resources/extensions/gsd/state.js +28 -7
  129. package/dist/resources/extensions/gsd/status-guards.js +14 -2
  130. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  131. package/dist/resources/extensions/gsd/templates/knowledge.md +2 -2
  132. package/dist/resources/extensions/gsd/templates/plan.md +9 -5
  133. package/dist/resources/extensions/gsd/templates/task-plan.md +10 -2
  134. package/dist/resources/extensions/gsd/tools/complete-milestone.js +15 -9
  135. package/dist/resources/extensions/gsd/tools/complete-slice.js +56 -10
  136. package/dist/resources/extensions/gsd/tools/exec-tool.js +87 -5
  137. package/dist/resources/extensions/gsd/tools/plan-milestone.js +7 -1
  138. package/dist/resources/extensions/gsd/tools/plan-slice.js +151 -15
  139. package/dist/resources/extensions/gsd/tools/validate-milestone.js +32 -1
  140. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +185 -40
  141. package/dist/resources/extensions/gsd/tui/render-kit.js +33 -0
  142. package/dist/resources/extensions/gsd/unit-context-composer.js +2 -0
  143. package/dist/resources/extensions/gsd/unit-context-manifest.js +69 -17
  144. package/dist/resources/extensions/gsd/validation.js +23 -1
  145. package/dist/resources/extensions/gsd/verification-gate.js +142 -7
  146. package/dist/resources/extensions/gsd/verification-verdict.js +26 -0
  147. package/dist/resources/extensions/gsd/watch/header-renderer.js +34 -25
  148. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  149. package/dist/resources/extensions/gsd/workflow-mcp.js +17 -1
  150. package/dist/resources/extensions/gsd/workflow-projections.js +6 -8
  151. package/dist/resources/extensions/gsd/worktree-lifecycle.js +86 -19
  152. package/dist/resources/extensions/gsd/worktree-manager.js +11 -2
  153. package/dist/resources/extensions/gsd/worktree-safety.js +43 -4
  154. package/dist/resources/extensions/gsd/worktree-state-projection.js +31 -0
  155. package/dist/resources/extensions/gsd/worktree-telemetry.js +32 -0
  156. package/dist/resources/extensions/shared/html-shell.js +388 -0
  157. package/dist/resources/extensions/shared/interview-ui.js +6 -4
  158. package/dist/resources/extensions/shared/next-action-ui.js +13 -5
  159. package/dist/resources/extensions/subagent/index.js +448 -78
  160. package/dist/resources/extensions/subagent/launch.js +77 -0
  161. package/dist/resources/extensions/subagent/run-store.js +148 -0
  162. package/dist/resources/extensions/ttsr/ttsr-manager.js +3 -1
  163. package/dist/resources/extensions/visual-brief/artifact-policy.js +29 -0
  164. package/dist/resources/extensions/visual-brief/extension-manifest.json +8 -0
  165. package/dist/resources/extensions/visual-brief/index.js +5 -0
  166. package/dist/resources/extensions/visual-brief/page-contract.js +124 -0
  167. package/dist/resources/extensions/visual-brief/prompts.js +140 -0
  168. package/dist/resources/skills/forensics/SKILL.md +1 -1
  169. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  170. package/dist/web/standalone/.next/BUILD_ID +1 -1
  171. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  172. package/dist/web/standalone/.next/build-manifest.json +4 -4
  173. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  174. package/dist/web/standalone/.next/react-loadable-manifest.json +5 -5
  175. package/dist/web/standalone/.next/required-server-files.json +4 -4
  176. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  177. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  179. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  182. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  187. package/dist/web/standalone/.next/server/app/_not-found/page.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  190. package/dist/web/standalone/.next/server/app/_not-found.rsc +4 -7
  191. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +4 -7
  192. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  193. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +4 -5
  194. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  195. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  196. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -5
  197. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  204. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  214. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  216. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  236. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  246. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  252. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  266. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  267. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  268. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  269. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  270. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  272. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  273. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  274. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  275. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  276. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  277. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  278. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  279. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  280. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  281. package/dist/web/standalone/.next/server/app/index.html +1 -1
  282. package/dist/web/standalone/.next/server/app/index.rsc +5 -8
  283. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  284. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +5 -8
  285. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  286. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +4 -5
  287. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -5
  288. package/dist/web/standalone/.next/server/app/page.js +2 -2
  289. package/dist/web/standalone/.next/server/app/page.js.nft.json +1 -1
  290. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  291. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  292. package/dist/web/standalone/.next/server/chunks/4266.js +2 -0
  293. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  294. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  295. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  296. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  297. package/dist/web/standalone/.next/server/middleware.js +2 -2
  298. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  299. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  300. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  301. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  302. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  303. package/dist/web/standalone/.next/static/chunks/2973.33f26573894b6153.js +2 -0
  304. package/dist/web/standalone/.next/static/chunks/8359.65b24fac92188a6b.js +10 -0
  305. package/dist/web/standalone/.next/static/chunks/9441.ff70bb53f6835771.js +1 -0
  306. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  307. package/dist/web/standalone/.next/static/chunks/app/layout-8c10ec293ae0f1d5.js +1 -0
  308. package/dist/web/standalone/.next/static/chunks/app/page-752f1e2ebdaa3e45.js +1 -0
  309. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  310. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  311. package/dist/web/standalone/.next/static/chunks/{webpack-de742b64187e13fe.js → webpack-855d616060cb6e59.js} +1 -1
  312. package/dist/web/standalone/.next/static/css/746ee28c929d1880.css +1 -0
  313. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  314. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  315. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  316. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  317. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  318. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  319. package/dist/web/standalone/server.js +1 -1
  320. package/dist/welcome-screen.js +7 -8
  321. package/package.json +6 -5
  322. package/packages/contracts/dist/rpc.test.js +7 -0
  323. package/packages/contracts/dist/rpc.test.js.map +1 -1
  324. package/packages/contracts/dist/workflow.d.ts +21 -0
  325. package/packages/contracts/dist/workflow.d.ts.map +1 -1
  326. package/packages/contracts/dist/workflow.js +24 -0
  327. package/packages/contracts/dist/workflow.js.map +1 -1
  328. package/packages/contracts/src/rpc.test.ts +8 -0
  329. package/packages/contracts/src/workflow.ts +24 -0
  330. package/packages/daemon/package.json +2 -2
  331. package/packages/mcp-server/README.md +14 -3
  332. package/packages/mcp-server/dist/workflow-tools.d.ts +0 -3
  333. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  334. package/packages/mcp-server/dist/workflow-tools.js +80 -0
  335. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  336. package/packages/mcp-server/package.json +2 -2
  337. package/packages/mcp-server/src/workflow-tools-parity.test.ts +244 -0
  338. package/packages/mcp-server/src/workflow-tools.test.ts +23 -1
  339. package/packages/mcp-server/src/workflow-tools.ts +168 -0
  340. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  341. package/packages/native/package.json +1 -1
  342. package/packages/native/src/__tests__/stream-process.test.mjs +32 -12
  343. package/packages/native/tsconfig.json +2 -1
  344. package/packages/native/tsconfig.tsbuildinfo +1 -1
  345. package/packages/pi-agent-core/package.json +1 -1
  346. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  347. package/packages/pi-ai/dist/index.d.ts +2 -2
  348. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  349. package/packages/pi-ai/dist/index.js +1 -1
  350. package/packages/pi-ai/dist/index.js.map +1 -1
  351. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  352. package/packages/pi-ai/dist/providers/google-gemini-cli.js +5 -0
  353. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  354. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts +2 -0
  355. package/packages/pi-ai/dist/providers/google-gemini-cli.test.d.ts.map +1 -0
  356. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +41 -0
  357. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -0
  358. package/packages/pi-ai/dist/providers/openai-codex-responses.d.ts.map +1 -1
  359. package/packages/pi-ai/dist/providers/openai-codex-responses.js +82 -1
  360. package/packages/pi-ai/dist/providers/openai-codex-responses.js.map +1 -1
  361. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts +2 -0
  362. package/packages/pi-ai/dist/providers/openai-codex-responses.test.d.ts.map +1 -0
  363. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js +52 -0
  364. package/packages/pi-ai/dist/providers/openai-codex-responses.test.js.map +1 -0
  365. package/packages/pi-ai/dist/providers/simple-options.d.ts +2 -4
  366. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  367. package/packages/pi-ai/dist/providers/simple-options.js +5 -6
  368. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  369. package/packages/pi-ai/dist/providers/simple-options.test.d.ts +2 -0
  370. package/packages/pi-ai/dist/providers/simple-options.test.d.ts.map +1 -0
  371. package/packages/pi-ai/dist/providers/simple-options.test.js +50 -0
  372. package/packages/pi-ai/dist/providers/simple-options.test.js.map +1 -0
  373. package/packages/pi-ai/dist/providers/transform-messages.d.ts +11 -0
  374. package/packages/pi-ai/dist/providers/transform-messages.d.ts.map +1 -1
  375. package/packages/pi-ai/dist/providers/transform-messages.js +20 -0
  376. package/packages/pi-ai/dist/providers/transform-messages.js.map +1 -1
  377. package/packages/pi-ai/package.json +1 -1
  378. package/packages/pi-ai/src/index.ts +7 -2
  379. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +49 -0
  380. package/packages/pi-ai/src/providers/google-gemini-cli.ts +7 -0
  381. package/packages/pi-ai/src/providers/openai-codex-responses.test.ts +63 -0
  382. package/packages/pi-ai/src/providers/openai-codex-responses.ts +91 -1
  383. package/packages/pi-ai/src/providers/simple-options.test.ts +60 -0
  384. package/packages/pi-ai/src/providers/simple-options.ts +5 -6
  385. package/packages/pi-ai/src/providers/transform-messages.ts +24 -0
  386. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  387. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts +2 -0
  388. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.d.ts.map +1 -0
  389. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js +66 -0
  390. package/packages/pi-coding-agent/dist/core/agent-session-thinking-level.test.js.map +1 -0
  391. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  392. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -3
  394. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  395. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +6 -1
  396. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +7 -2
  398. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +14 -1
  400. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  402. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  403. package/packages/pi-coding-agent/dist/core/system-prompt.js +4 -4
  404. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  405. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +8 -2
  406. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  408. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +3 -0
  409. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js +16 -0
  411. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.test.js.map +1 -1
  412. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  413. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +24 -6
  414. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  415. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  416. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  417. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  418. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +82 -97
  419. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  420. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +7 -7
  421. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  422. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +11 -0
  423. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  424. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +25 -1
  425. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  426. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  427. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  428. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +24 -10
  429. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  430. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts +2 -0
  431. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.d.ts.map +1 -0
  432. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +17 -0
  433. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -0
  434. package/packages/pi-coding-agent/package.json +1 -1
  435. package/packages/pi-coding-agent/src/core/agent-session-thinking-level.test.ts +79 -0
  436. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  437. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +53 -3
  438. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +23 -1
  439. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +7 -2
  440. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  441. package/packages/pi-coding-agent/src/core/system-prompt.ts +4 -4
  442. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +17 -1
  443. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.test.ts +20 -0
  444. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -0
  445. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +23 -7
  446. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  447. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +91 -102
  448. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +15 -1
  449. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +9 -9
  450. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +30 -1
  451. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +29 -10
  452. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +22 -0
  453. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  454. package/packages/pi-tui/dist/__tests__/loader.test.d.ts +2 -0
  455. package/packages/pi-tui/dist/__tests__/loader.test.d.ts.map +1 -0
  456. package/packages/pi-tui/dist/__tests__/loader.test.js +24 -0
  457. package/packages/pi-tui/dist/__tests__/loader.test.js.map +1 -0
  458. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts +2 -0
  459. package/packages/pi-tui/dist/__tests__/terminal.test.d.ts.map +1 -0
  460. package/packages/pi-tui/dist/__tests__/terminal.test.js +103 -0
  461. package/packages/pi-tui/dist/__tests__/terminal.test.js.map +1 -0
  462. package/packages/pi-tui/dist/__tests__/tui.test.js +72 -4
  463. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  464. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  465. package/packages/pi-tui/dist/components/loader.js +3 -0
  466. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  467. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  468. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  469. package/packages/pi-tui/dist/terminal.js +12 -0
  470. package/packages/pi-tui/dist/terminal.js.map +1 -1
  471. package/packages/pi-tui/dist/tui.d.ts +1 -0
  472. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  473. package/packages/pi-tui/dist/tui.js +119 -30
  474. package/packages/pi-tui/dist/tui.js.map +1 -1
  475. package/packages/pi-tui/package.json +1 -1
  476. package/packages/pi-tui/src/__tests__/loader.test.ts +30 -0
  477. package/packages/pi-tui/src/__tests__/terminal.test.ts +121 -0
  478. package/packages/pi-tui/src/__tests__/tui.test.ts +90 -4
  479. package/packages/pi-tui/src/components/loader.ts +3 -0
  480. package/packages/pi-tui/src/terminal.ts +11 -0
  481. package/packages/pi-tui/src/tui.ts +119 -30
  482. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  483. package/packages/rpc-client/package.json +1 -1
  484. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  485. package/pkg/package.json +1 -1
  486. package/src/resources/GSD-WORKFLOW.md +10 -1
  487. package/src/resources/extensions/browser-tools/tools/screenshot.ts +1 -0
  488. package/src/resources/extensions/browser-tools/tools/zoom.ts +1 -0
  489. package/src/resources/extensions/claude-code-cli/partial-builder.ts +2 -1
  490. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +52 -6
  491. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +19 -2
  492. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +49 -2
  493. package/src/resources/extensions/cmux/index.ts +6 -0
  494. package/src/resources/extensions/gsd/auto/contracts.ts +64 -16
  495. package/src/resources/extensions/gsd/auto/detect-stuck.ts +1 -0
  496. package/src/resources/extensions/gsd/auto/infra-errors.ts +9 -3
  497. package/src/resources/extensions/gsd/auto/loop.ts +123 -40
  498. package/src/resources/extensions/gsd/auto/orchestrator.ts +131 -8
  499. package/src/resources/extensions/gsd/auto/phases.ts +186 -60
  500. package/src/resources/extensions/gsd/auto/session.ts +16 -0
  501. package/src/resources/extensions/gsd/auto/types.ts +3 -0
  502. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +6 -2
  503. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +5 -1
  504. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +13 -0
  505. package/src/resources/extensions/gsd/auto-budget.ts +11 -0
  506. package/src/resources/extensions/gsd/auto-dashboard.ts +78 -5
  507. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +1 -0
  508. package/src/resources/extensions/gsd/auto-dispatch.ts +208 -29
  509. package/src/resources/extensions/gsd/auto-model-selection.ts +2 -1
  510. package/src/resources/extensions/gsd/auto-post-unit.ts +369 -148
  511. package/src/resources/extensions/gsd/auto-prompts.ts +47 -16
  512. package/src/resources/extensions/gsd/auto-recovery.ts +86 -13
  513. package/src/resources/extensions/gsd/auto-start.ts +109 -14
  514. package/src/resources/extensions/gsd/auto-timers.ts +10 -3
  515. package/src/resources/extensions/gsd/auto-verification.ts +174 -42
  516. package/src/resources/extensions/gsd/auto-worktree.ts +202 -30
  517. package/src/resources/extensions/gsd/auto.ts +296 -107
  518. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +66 -10
  519. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -10
  520. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +19 -4
  521. package/src/resources/extensions/gsd/bootstrap/subagent-input.ts +19 -7
  522. package/src/resources/extensions/gsd/bootstrap/system-context.ts +58 -15
  523. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +27 -10
  524. package/src/resources/extensions/gsd/clean-root-preflight.ts +284 -8
  525. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  526. package/src/resources/extensions/gsd/commands/handlers/core.ts +42 -1
  527. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  528. package/src/resources/extensions/gsd/commands-bootstrap.ts +10 -0
  529. package/src/resources/extensions/gsd/commands-handlers.ts +21 -2
  530. package/src/resources/extensions/gsd/commands-mcp-status.ts +8 -0
  531. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +17 -4
  532. package/src/resources/extensions/gsd/commands-verdict.ts +202 -0
  533. package/src/resources/extensions/gsd/context-store.ts +120 -1
  534. package/src/resources/extensions/gsd/crash-recovery.ts +55 -6
  535. package/src/resources/extensions/gsd/db/auto-workers.ts +37 -0
  536. package/src/resources/extensions/gsd/db/milestone-leases.ts +26 -0
  537. package/src/resources/extensions/gsd/db/unit-dispatches.ts +4 -3
  538. package/src/resources/extensions/gsd/db-base-schema.ts +2 -0
  539. package/src/resources/extensions/gsd/db-migration-steps.ts +5 -0
  540. package/src/resources/extensions/gsd/db-task-slice-rows.ts +4 -0
  541. package/src/resources/extensions/gsd/db-writer.ts +167 -84
  542. package/src/resources/extensions/gsd/dispatch-guard.ts +60 -2
  543. package/src/resources/extensions/gsd/docs/preferences-reference.md +11 -1
  544. package/src/resources/extensions/gsd/doctor-git-checks.ts +117 -9
  545. package/src/resources/extensions/gsd/doctor-proactive.ts +18 -2
  546. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +25 -13
  547. package/src/resources/extensions/gsd/doctor-types.ts +4 -0
  548. package/src/resources/extensions/gsd/doctor.ts +2 -27
  549. package/src/resources/extensions/gsd/export-html.ts +27 -427
  550. package/src/resources/extensions/gsd/forensics.ts +9 -3
  551. package/src/resources/extensions/gsd/git-conflict-state.ts +23 -0
  552. package/src/resources/extensions/gsd/git-service.ts +182 -16
  553. package/src/resources/extensions/gsd/gsd-db.ts +80 -31
  554. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -3
  555. package/src/resources/extensions/gsd/guided-flow.ts +142 -134
  556. package/src/resources/extensions/gsd/guided-unit-context.ts +30 -0
  557. package/src/resources/extensions/gsd/init-wizard.ts +17 -2
  558. package/src/resources/extensions/gsd/journal.ts +8 -1
  559. package/src/resources/extensions/gsd/knowledge-backfill.ts +164 -0
  560. package/src/resources/extensions/gsd/knowledge-capture.ts +160 -0
  561. package/src/resources/extensions/gsd/knowledge-parser.ts +174 -0
  562. package/src/resources/extensions/gsd/knowledge-projection.ts +241 -0
  563. package/src/resources/extensions/gsd/markdown-renderer.ts +20 -12
  564. package/src/resources/extensions/gsd/mcp-filter.ts +80 -0
  565. package/src/resources/extensions/gsd/md-importer.ts +1 -1
  566. package/src/resources/extensions/gsd/memory-backfill.ts +89 -17
  567. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +277 -0
  568. package/src/resources/extensions/gsd/migrate/command.ts +5 -0
  569. package/src/resources/extensions/gsd/migrate/parsers.ts +139 -2
  570. package/src/resources/extensions/gsd/migrate/preview.ts +10 -0
  571. package/src/resources/extensions/gsd/migrate/transformer.ts +58 -4
  572. package/src/resources/extensions/gsd/migrate/writer.ts +14 -1
  573. package/src/resources/extensions/gsd/migration-auto-check.ts +15 -23
  574. package/src/resources/extensions/gsd/milestone-actions.ts +10 -4
  575. package/src/resources/extensions/gsd/native-git-bridge.ts +63 -14
  576. package/src/resources/extensions/gsd/parallel-orchestrator.ts +3 -0
  577. package/src/resources/extensions/gsd/paths.ts +5 -0
  578. package/src/resources/extensions/gsd/pending-auto-start.ts +79 -0
  579. package/src/resources/extensions/gsd/planning-path-scope.ts +10 -2
  580. package/src/resources/extensions/gsd/post-execution-checks.ts +87 -12
  581. package/src/resources/extensions/gsd/pre-execution-checks.ts +67 -19
  582. package/src/resources/extensions/gsd/preferences-mcp.ts +27 -0
  583. package/src/resources/extensions/gsd/preferences-models.ts +6 -4
  584. package/src/resources/extensions/gsd/preferences-types.ts +35 -0
  585. package/src/resources/extensions/gsd/preferences-validation.ts +154 -0
  586. package/src/resources/extensions/gsd/preferences.ts +39 -0
  587. package/src/resources/extensions/gsd/prompt-loader.ts +1 -1
  588. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  589. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  590. package/src/resources/extensions/gsd/prompts/discuss-headless.md +8 -8
  591. package/src/resources/extensions/gsd/prompts/discuss.md +9 -9
  592. package/src/resources/extensions/gsd/prompts/forensics.md +3 -3
  593. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +4 -4
  594. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +3 -3
  595. package/src/resources/extensions/gsd/prompts/plan-slice.md +4 -4
  596. package/src/resources/extensions/gsd/prompts/queue.md +4 -4
  597. package/src/resources/extensions/gsd/prompts/reactive-execute.md +1 -1
  598. package/src/resources/extensions/gsd/prompts/refine-slice.md +2 -2
  599. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  600. package/src/resources/extensions/gsd/prompts/system.md +2 -2
  601. package/src/resources/extensions/gsd/provider-switch-observer.ts +185 -0
  602. package/src/resources/extensions/gsd/queue-reorder-ui.ts +31 -13
  603. package/src/resources/extensions/gsd/repo-identity.ts +45 -25
  604. package/src/resources/extensions/gsd/repository-registry.ts +77 -0
  605. package/src/resources/extensions/gsd/safety/evidence-collector.ts +2 -0
  606. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +54 -19
  607. package/src/resources/extensions/gsd/session-lock.ts +15 -2
  608. package/src/resources/extensions/gsd/slice-parallel-conflict.ts +2 -2
  609. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +75 -3
  610. package/src/resources/extensions/gsd/smart-entry-routing.ts +77 -0
  611. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +8 -1
  612. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +12 -15
  613. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +17 -25
  614. package/src/resources/extensions/gsd/state.ts +33 -7
  615. package/src/resources/extensions/gsd/status-guards.ts +16 -2
  616. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -0
  617. package/src/resources/extensions/gsd/templates/knowledge.md +2 -2
  618. package/src/resources/extensions/gsd/templates/plan.md +9 -5
  619. package/src/resources/extensions/gsd/templates/task-plan.md +10 -2
  620. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +1 -1
  621. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +10 -1
  622. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +71 -0
  623. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +116 -0
  624. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +875 -59
  625. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +637 -16
  626. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +151 -12
  627. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +53 -2
  628. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +18 -6
  629. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +136 -13
  630. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +64 -0
  631. package/src/resources/extensions/gsd/tests/auto-retry-mcp-churn-fixes.test.ts +12 -0
  632. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +4 -4
  633. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -0
  634. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +20 -0
  635. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +29 -0
  636. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +69 -1
  637. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +21 -0
  638. package/src/resources/extensions/gsd/tests/brief-command.test.ts +89 -0
  639. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +62 -0
  640. package/src/resources/extensions/gsd/tests/checkout-branch-stash-guard.test.ts +87 -0
  641. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +170 -3
  642. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +32 -4
  643. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +16 -0
  644. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +378 -0
  645. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +55 -2
  646. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +60 -9
  647. package/src/resources/extensions/gsd/tests/complete-task.test.ts +3 -1
  648. package/src/resources/extensions/gsd/tests/context-store-decisions-from-memories.test.ts +312 -0
  649. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +104 -2
  650. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +2 -0
  651. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +208 -0
  652. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -0
  653. package/src/resources/extensions/gsd/tests/db-writer.test.ts +13 -8
  654. package/src/resources/extensions/gsd/tests/decisions-projection-from-memories.test.ts +453 -0
  655. package/src/resources/extensions/gsd/tests/decisions-stop-table-writes.test.ts +348 -0
  656. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +61 -2
  657. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +139 -1
  658. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +68 -1
  659. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +140 -1
  660. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +65 -0
  661. package/src/resources/extensions/gsd/tests/doctor-forensics-db-open-regression.test.ts +50 -0
  662. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +97 -0
  663. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +99 -1
  664. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +15 -1
  665. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +8 -0
  666. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +8 -4
  667. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +28 -0
  668. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +11 -7
  669. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +5 -2
  670. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +2 -0
  671. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +106 -0
  672. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +59 -11
  673. package/src/resources/extensions/gsd/tests/guided-flow.test.ts +21 -0
  674. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +65 -0
  675. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +7 -7
  676. package/src/resources/extensions/gsd/tests/hook-model-resolution.test.ts +5 -0
  677. package/src/resources/extensions/gsd/tests/infra-error.test.ts +2 -2
  678. package/src/resources/extensions/gsd/tests/infra-errors-cooldown.test.ts +9 -0
  679. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +22 -0
  680. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +80 -1
  681. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +33 -1
  682. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +20 -0
  683. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +226 -2
  684. package/src/resources/extensions/gsd/tests/integration/integration-lifecycle.test.ts +13 -5
  685. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +48 -3
  686. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +5 -21
  687. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +15 -0
  688. package/src/resources/extensions/gsd/tests/integration/state-machine-runtime-failures.test.ts +6 -1
  689. package/src/resources/extensions/gsd/tests/interrupted-session-auto.test.ts +40 -0
  690. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +49 -3
  691. package/src/resources/extensions/gsd/tests/journal.test.ts +32 -0
  692. package/src/resources/extensions/gsd/tests/knowledge-backfill-projection.test.ts +323 -0
  693. package/src/resources/extensions/gsd/tests/knowledge-capture.test.ts +242 -0
  694. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -2
  695. package/src/resources/extensions/gsd/tests/load-knowledge-block-rules-only.test.ts +209 -0
  696. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +287 -0
  697. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +11 -0
  698. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +316 -0
  699. package/src/resources/extensions/gsd/tests/merge-db-cycle.test.ts +179 -0
  700. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +21 -40
  701. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +5 -1
  702. package/src/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +59 -1
  703. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +6 -1
  704. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +26 -18
  705. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +60 -0
  706. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +80 -2
  707. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +121 -1
  708. package/src/resources/extensions/gsd/tests/parallel-orchestrator-zombie-cleanup.test.ts +55 -0
  709. package/src/resources/extensions/gsd/tests/park-db-sync.test.ts +55 -1
  710. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +29 -5
  711. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +2 -1
  712. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +157 -0
  713. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +26 -0
  714. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +2 -0
  715. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +343 -3
  716. package/src/resources/extensions/gsd/tests/plan-task.test.ts +18 -1
  717. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +79 -1
  718. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -3
  719. package/src/resources/extensions/gsd/tests/post-unit-git-failure.test.ts +8 -1
  720. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +84 -0
  721. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +147 -0
  722. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +54 -0
  723. package/src/resources/extensions/gsd/tests/preferences-mcp.test.ts +128 -0
  724. package/src/resources/extensions/gsd/tests/preferences.test.ts +75 -0
  725. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +148 -0
  726. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +79 -0
  727. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +42 -1
  728. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +8 -0
  729. package/src/resources/extensions/gsd/tests/prompt-loader.test.ts +23 -0
  730. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +37 -1
  731. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +252 -0
  732. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +6 -0
  733. package/src/resources/extensions/gsd/tests/queue-reorder-ui.test.ts +54 -0
  734. package/src/resources/extensions/gsd/tests/remediation-completion-guard.test.ts +89 -2
  735. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +28 -1
  736. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +52 -0
  737. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +2 -3
  738. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +35 -0
  739. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +16 -4
  740. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +59 -1
  741. package/src/resources/extensions/gsd/tests/slice-parallel-conflict.test.ts +2 -2
  742. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +112 -1
  743. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +113 -0
  744. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +94 -2
  745. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +6 -0
  746. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +119 -23
  747. package/src/resources/extensions/gsd/tests/status-guards.test.ts +17 -1
  748. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +64 -1
  749. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +2 -1
  750. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +7 -3
  751. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +22 -0
  752. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -0
  753. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +131 -9
  754. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +111 -1
  755. package/src/resources/extensions/gsd/tests/validate-milestone-stuck-guard.test.ts +29 -2
  756. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +68 -0
  757. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +42 -1
  758. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +188 -1
  759. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +78 -0
  760. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +7 -0
  761. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +19 -1
  762. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +21 -1
  763. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +153 -1
  764. package/src/resources/extensions/gsd/tests/worktree-git-pathspec.test.ts +39 -0
  765. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +64 -12
  766. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +73 -2
  767. package/src/resources/extensions/gsd/tests/worktree-preferences-sync.test.ts +25 -0
  768. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +90 -0
  769. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +95 -0
  770. package/src/resources/extensions/gsd/tests/worktree-telemetry.test.ts +16 -0
  771. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +27 -0
  772. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +59 -0
  773. package/src/resources/extensions/gsd/tools/complete-milestone.ts +18 -10
  774. package/src/resources/extensions/gsd/tools/complete-slice.ts +57 -10
  775. package/src/resources/extensions/gsd/tools/exec-tool.ts +98 -5
  776. package/src/resources/extensions/gsd/tools/plan-milestone.ts +5 -1
  777. package/src/resources/extensions/gsd/tools/plan-slice.ts +172 -12
  778. package/src/resources/extensions/gsd/tools/validate-milestone.ts +31 -0
  779. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +166 -17
  780. package/src/resources/extensions/gsd/tui/render-kit.ts +44 -0
  781. package/src/resources/extensions/gsd/types.ts +1 -1
  782. package/src/resources/extensions/gsd/unit-context-composer.ts +3 -0
  783. package/src/resources/extensions/gsd/unit-context-manifest.ts +86 -19
  784. package/src/resources/extensions/gsd/validation.ts +23 -1
  785. package/src/resources/extensions/gsd/verification-gate.ts +170 -6
  786. package/src/resources/extensions/gsd/verification-verdict.ts +47 -0
  787. package/src/resources/extensions/gsd/watch/header-renderer.ts +35 -24
  788. package/src/resources/extensions/gsd/workflow-logger.ts +4 -0
  789. package/src/resources/extensions/gsd/workflow-manifest.ts +2 -0
  790. package/src/resources/extensions/gsd/workflow-mcp.ts +18 -1
  791. package/src/resources/extensions/gsd/workflow-projections.ts +6 -8
  792. package/src/resources/extensions/gsd/worktree-lifecycle.ts +98 -20
  793. package/src/resources/extensions/gsd/worktree-manager.ts +14 -2
  794. package/src/resources/extensions/gsd/worktree-safety.ts +57 -10
  795. package/src/resources/extensions/gsd/worktree-state-projection.ts +43 -0
  796. package/src/resources/extensions/gsd/worktree-telemetry.ts +39 -0
  797. package/src/resources/extensions/shared/html-shell.ts +412 -0
  798. package/src/resources/extensions/shared/interview-ui.ts +6 -4
  799. package/src/resources/extensions/shared/next-action-ui.ts +11 -5
  800. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +15 -0
  801. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +32 -0
  802. package/src/resources/extensions/subagent/index.ts +567 -103
  803. package/src/resources/extensions/subagent/launch.ts +131 -0
  804. package/src/resources/extensions/subagent/run-store.ts +218 -0
  805. package/src/resources/extensions/subagent/tests/launch.test.ts +115 -0
  806. package/src/resources/extensions/subagent/tests/run-store.test.ts +111 -0
  807. package/src/resources/extensions/ttsr/ttsr-manager.ts +5 -1
  808. package/src/resources/extensions/visual-brief/artifact-policy.ts +41 -0
  809. package/src/resources/extensions/visual-brief/extension-manifest.json +8 -0
  810. package/src/resources/extensions/visual-brief/index.ts +8 -0
  811. package/src/resources/extensions/visual-brief/page-contract.ts +136 -0
  812. package/src/resources/extensions/visual-brief/prompts.ts +183 -0
  813. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +212 -0
  814. package/src/resources/skills/forensics/SKILL.md +1 -1
  815. package/dist/web/standalone/.next/server/chunks/5822.js +0 -2
  816. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  817. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +0 -10
  818. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  819. package/dist/web/standalone/.next/static/chunks/app/layout-9ecfd95f343793f0.js +0 -1
  820. package/dist/web/standalone/.next/static/chunks/app/page-200592a7f3baf579.js +0 -1
  821. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  822. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  823. package/dist/web/standalone/.next/static/css/54ec2745c1da488b.css +0 -1
  824. package/dist/web/standalone/.next/static/css/de70bee13400563f.css +0 -1
  825. package/dist/web/standalone/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
  826. package/dist/web/standalone/.next/static/media/747892c23ea88013-s.woff2 +0 -0
  827. package/dist/web/standalone/.next/static/media/8d697b304b401681-s.woff2 +0 -0
  828. package/dist/web/standalone/.next/static/media/93f479601ee12b01-s.p.woff2 +0 -0
  829. package/dist/web/standalone/.next/static/media/9610d9e46709d722-s.woff2 +0 -0
  830. package/dist/web/standalone/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
  831. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → w_ikFkx_-OHxisG9xjz4u}/_buildManifest.js +0 -0
  832. /package/dist/web/standalone/.next/static/{S44UQTFCUdA44dkjfYt6S → w_ikFkx_-OHxisG9xjz4u}/_ssgManifest.js +0 -0
@@ -46,6 +46,22 @@ describe("DynamicBorder spinner", () => {
46
46
  mock.timers.reset();
47
47
  }
48
48
  });
49
+ it("unref's the spinner interval so it never blocks process exit", () => {
50
+ // The pinned-zone spinner is purely cosmetic. A ref'd interval keeps the
51
+ // Node event loop alive until stopSpinner() runs — which made test
52
+ // processes hang and CI time out.
53
+ const border = new DynamicBorder((s) => s);
54
+ const tui = makeTUI();
55
+ try {
56
+ border.startSpinner(tui, (s) => s);
57
+ const interval = border.spinnerInterval;
58
+ assert.ok(interval, "startSpinner should create the animation interval");
59
+ assert.equal(interval.hasRef(), false, "spinner interval must be unref'd so it never blocks process exit");
60
+ }
61
+ finally {
62
+ border.stopSpinner();
63
+ }
64
+ });
49
65
  it("updates lastExternalRender on each render() call", () => {
50
66
  const border = new DynamicBorder((s) => s);
51
67
  const anyBorder = border;
@@ -1 +1 @@
1
- {"version":3,"file":"dynamic-border.test.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/dynamic-border.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\";\nimport { describe, it, mock } from \"node:test\";\n\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nfunction makeTUI() {\n\treturn {\n\t\trenderCount: 0,\n\t\trequestRender() {\n\t\t\tthis.renderCount++;\n\t\t},\n\t};\n}\n\ndescribe(\"DynamicBorder spinner\", () => {\n\tit(\"suppresses standalone render when an external render occurred recently\", () => {\n\t\tconst border = new DynamicBorder((s) => s);\n\t\tconst tui = makeTUI();\n\n\t\tborder.startSpinner(tui as any, (s) => s);\n\t\t// startSpinner calls requestRender once immediately\n\t\tassert.equal(tui.renderCount, 1, \"initial render on startSpinner\");\n\n\t\t// Simulate an externally-triggered render (e.g. from streaming)\n\t\tborder.render(80);\n\n\t\t// Access the private interval callback by advancing the timer\n\t\t// Instead, we directly test the render-batching logic:\n\t\t// After render() sets lastExternalRender, a spinner tick within 200ms\n\t\t// should NOT call requestRender.\n\t\tconst anyBorder = border as any;\n\t\tassert.ok(\n\t\t\tDate.now() - anyBorder.lastExternalRender < 200,\n\t\t\t\"lastExternalRender should be recent after render()\",\n\t\t);\n\n\t\tborder.stopSpinner();\n\t});\n\n\tit(\"triggers standalone render when no external render occurred recently\", () => {\n\t\tmock.timers.enable({ apis: [\"setInterval\"], now: 0 });\n\t\ttry {\n\t\t\tconst border = new DynamicBorder((s) => s);\n\t\t\tconst tui = makeTUI();\n\n\t\t\t// Set lastExternalRender to a time well in the past\n\t\t\tconst anyBorder = border as any;\n\t\t\tanyBorder.lastExternalRender = 0;\n\n\t\t\tborder.startSpinner(tui as any, (s) => s);\n\t\t\tconst initialCount = tui.renderCount;\n\n\t\t\t// Advance exactly one spinner interval (200ms). With mocked timers\n\t\t\t// this is deterministic — no flake under CI load.\n\t\t\tmock.timers.tick(200);\n\n\t\t\tassert.ok(\n\t\t\t\ttui.renderCount > initialCount,\n\t\t\t\t\"spinner should trigger requestRender after one 200ms interval when no recent external render\",\n\t\t\t);\n\n\t\t\tborder.stopSpinner();\n\t\t} finally {\n\t\t\tmock.timers.reset();\n\t\t}\n\t});\n\n\tit(\"updates lastExternalRender on each render() call\", () => {\n\t\tconst border = new DynamicBorder((s) => s);\n\t\tconst anyBorder = border as any;\n\n\t\tconst before = Date.now();\n\t\tborder.render(80);\n\t\tconst after = Date.now();\n\n\t\tassert.ok(anyBorder.lastExternalRender >= before);\n\t\tassert.ok(anyBorder.lastExternalRender <= after);\n\t});\n});\n"]}
1
+ {"version":3,"file":"dynamic-border.test.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/dynamic-border.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\";\nimport { describe, it, mock } from \"node:test\";\n\nimport { DynamicBorder } from \"./dynamic-border.js\";\n\nfunction makeTUI() {\n\treturn {\n\t\trenderCount: 0,\n\t\trequestRender() {\n\t\t\tthis.renderCount++;\n\t\t},\n\t};\n}\n\ndescribe(\"DynamicBorder spinner\", () => {\n\tit(\"suppresses standalone render when an external render occurred recently\", () => {\n\t\tconst border = new DynamicBorder((s) => s);\n\t\tconst tui = makeTUI();\n\n\t\tborder.startSpinner(tui as any, (s) => s);\n\t\t// startSpinner calls requestRender once immediately\n\t\tassert.equal(tui.renderCount, 1, \"initial render on startSpinner\");\n\n\t\t// Simulate an externally-triggered render (e.g. from streaming)\n\t\tborder.render(80);\n\n\t\t// Access the private interval callback by advancing the timer\n\t\t// Instead, we directly test the render-batching logic:\n\t\t// After render() sets lastExternalRender, a spinner tick within 200ms\n\t\t// should NOT call requestRender.\n\t\tconst anyBorder = border as any;\n\t\tassert.ok(\n\t\t\tDate.now() - anyBorder.lastExternalRender < 200,\n\t\t\t\"lastExternalRender should be recent after render()\",\n\t\t);\n\n\t\tborder.stopSpinner();\n\t});\n\n\tit(\"triggers standalone render when no external render occurred recently\", () => {\n\t\tmock.timers.enable({ apis: [\"setInterval\"], now: 0 });\n\t\ttry {\n\t\t\tconst border = new DynamicBorder((s) => s);\n\t\t\tconst tui = makeTUI();\n\n\t\t\t// Set lastExternalRender to a time well in the past\n\t\t\tconst anyBorder = border as any;\n\t\t\tanyBorder.lastExternalRender = 0;\n\n\t\t\tborder.startSpinner(tui as any, (s) => s);\n\t\t\tconst initialCount = tui.renderCount;\n\n\t\t\t// Advance exactly one spinner interval (200ms). With mocked timers\n\t\t\t// this is deterministic — no flake under CI load.\n\t\t\tmock.timers.tick(200);\n\n\t\t\tassert.ok(\n\t\t\t\ttui.renderCount > initialCount,\n\t\t\t\t\"spinner should trigger requestRender after one 200ms interval when no recent external render\",\n\t\t\t);\n\n\t\t\tborder.stopSpinner();\n\t\t} finally {\n\t\t\tmock.timers.reset();\n\t\t}\n\t});\n\n\tit(\"unref's the spinner interval so it never blocks process exit\", () => {\n\t\t// The pinned-zone spinner is purely cosmetic. A ref'd interval keeps the\n\t\t// Node event loop alive until stopSpinner() runs — which made test\n\t\t// processes hang and CI time out.\n\t\tconst border = new DynamicBorder((s) => s);\n\t\tconst tui = makeTUI();\n\t\ttry {\n\t\t\tborder.startSpinner(tui as any, (s) => s);\n\t\t\tconst interval = (border as any).spinnerInterval as NodeJS.Timeout;\n\t\t\tassert.ok(interval, \"startSpinner should create the animation interval\");\n\t\t\tassert.equal(\n\t\t\t\tinterval.hasRef(),\n\t\t\t\tfalse,\n\t\t\t\t\"spinner interval must be unref'd so it never blocks process exit\",\n\t\t\t);\n\t\t} finally {\n\t\t\tborder.stopSpinner();\n\t\t}\n\t});\n\n\tit(\"updates lastExternalRender on each render() call\", () => {\n\t\tconst border = new DynamicBorder((s) => s);\n\t\tconst anyBorder = border as any;\n\n\t\tconst before = Date.now();\n\t\tborder.render(80);\n\t\tconst after = Date.now();\n\n\t\tassert.ok(anyBorder.lastExternalRender >= before);\n\t\tassert.ok(anyBorder.lastExternalRender <= after);\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAiC,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AA4BxF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAI/C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAJnB,OAAO,CAAC,kBAAkB,CAAQ;gBAGzB,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,0BAA0B;IAG/C,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI7C;;;OAGG;IACH,UAAU,IAAI,IAAI;IAIlB;;;OAGG;IACH,OAAO,IAAI,IAAI;IAIf,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CA4K/B"}
1
+ {"version":3,"file":"footer.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAiC,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,uCAAuC,CAAC;AAuCxF;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKrD;AAED;;;GAGG;AACH,qBAAa,eAAgB,YAAW,SAAS;IAI/C,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,UAAU;IAJnB,OAAO,CAAC,kBAAkB,CAAQ;gBAGzB,OAAO,EAAE,YAAY,EACrB,UAAU,EAAE,0BAA0B;IAG/C,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI7C;;;OAGG;IACH,UAAU,IAAI,IAAI;IAIlB;;;OAGG;IACH,OAAO,IAAI,IAAI;IAIf,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;CAiL/B"}
@@ -15,6 +15,19 @@ function sanitizeStatusText(text) {
15
15
  .replace(/ +/g, " ")
16
16
  .trim();
17
17
  }
18
+ function truncateFooterPath(text, width) {
19
+ if (visibleWidth(text) <= width)
20
+ return text;
21
+ const tailMatch = text.match(/( \([^)]+\)(?: • .*)?)$/);
22
+ if (!tailMatch)
23
+ return truncateToWidth(text, width, "...");
24
+ const tail = tailMatch[1];
25
+ const tailWidth = visibleWidth(tail);
26
+ if (tailWidth >= width - 4)
27
+ return truncateToWidth(text, width, "...");
28
+ const head = text.slice(0, -tail.length);
29
+ return `${truncateToWidth(head, width - tailWidth, "...")}${tail}`;
30
+ }
18
31
  /**
19
32
  * Format token counts (similar to web-ui)
20
33
  */
@@ -197,9 +210,6 @@ export class FooterComponent {
197
210
  }
198
211
  }
199
212
  }
200
- // Apply dim to the stats group before handing it to the shared footer strip.
201
- // statsLeft may contain color codes for context %, so keep coloring local to the group.
202
- const dimStatsLeft = theme.fg("dim", statsLeft);
203
213
  // Extension statuses right-aligned on the pwd line (sorted by key).
204
214
  // Keeps the footer compact by avoiding a dedicated row when the content
205
215
  // fits alongside pwd. Falls back to pwd-only if the combined line would
@@ -211,12 +221,20 @@ export class FooterComponent {
211
221
  .map(([, text]) => sanitizeStatusText(text))
212
222
  .join(" ")
213
223
  : "";
224
+ const footerRight = [rightSide, extStatusText].filter(Boolean).join(" ");
225
+ const gsdSegment = theme.fg("accent", "● GSD");
226
+ const dimStatsLeft = theme.fg("dim", statsLeft);
227
+ const innerWidth = Math.max(1, width - 2);
228
+ const rightWidth = visibleWidth(footerRight);
229
+ const leftBudget = footerRight ? Math.max(1, innerWidth - rightWidth - 3) : innerWidth;
230
+ const sepWidth = visibleWidth(" │ ");
231
+ const pwdBudget = Math.max(1, leftBudget - visibleWidth(gsdSegment) - visibleWidth(dimStatsLeft) - sepWidth * 2);
232
+ const pwdSegment = theme.fg("dim", truncateFooterPath(pwd, pwdBudget));
214
233
  const leftSegments = [
215
- theme.fg("accent", "● GSD"),
216
- theme.fg("dim", pwd),
234
+ gsdSegment,
235
+ pwdSegment,
217
236
  dimStatsLeft,
218
237
  ];
219
- const footerRight = [rightSide, extStatusText].filter(Boolean).join(" ");
220
238
  return renderFooterStrip(leftSegments, footerRight, width);
221
239
  }
222
240
  }
@@ -1 +1 @@
1
- {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: GSD-2\n// File Purpose: Interactive terminal footer renderer for workspace, model, usage, context, and extension status.\n\nimport { type Component, truncateToWidth, visibleWidth } from \"@gsd/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.js\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { providerAuthBadge, providerDisplayName } from \"./model-selector.js\";\nimport { renderFooterStrip } from \"./transcript-design.js\";\n\n/**\n * Sanitize text for display in a single-line status.\n * Removes newlines, tabs, carriage returns, and other control characters.\n */\nfunction sanitizeStatusText(text: string): string {\n\t// Replace newlines, tabs, carriage returns with space, then collapse multiple spaces\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\n/**\n * Format token counts (similar to web-ui)\n */\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\n/**\n * Format a cost value for compact display.\n * Uses fewer decimal places for larger amounts.\n * @internal Exported for testing only.\n */\nexport function formatPromptCost(cost: number): string {\n\tif (cost < 0.001) return `$${cost.toFixed(4)}`;\n\tif (cost < 0.01) return `$${cost.toFixed(3)}`;\n\tif (cost < 1) return `$${cost.toFixed(3)}`;\n\treturn `$${cost.toFixed(2)}`;\n}\n\n/**\n * Footer component that shows pwd, token stats, and context usage.\n * Computes token/context stats from session, gets git branch and extension statuses from provider.\n */\nexport class FooterComponent implements Component {\n\tprivate autoCompactEnabled = true;\n\n\tconstructor(\n\t\tprivate session: AgentSession,\n\t\tprivate footerData: ReadonlyFooterDataProvider,\n\t) {}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.autoCompactEnabled = enabled;\n\t}\n\n\t/**\n\t * No-op: git branch caching now handled by provider.\n\t * Kept for compatibility with existing call sites in interactive-mode.\n\t */\n\tinvalidate(): void {\n\t\t// No-op: git branch is cached/invalidated by provider\n\t}\n\n\t/**\n\t * Clean up resources.\n\t * Git watcher cleanup now handled by provider.\n\t */\n\tdispose(): void {\n\t\t// Git watcher cleanup handled by provider\n\t}\n\n\trender(width: number): string[] {\n\t\tconst state = this.session.state;\n\n\t\tconst usageTotals = this.session.sessionManager.getUsageTotals();\n\t\tconst totalInput = usageTotals.input;\n\t\tconst totalOutput = usageTotals.output;\n\t\tconst totalCacheRead = usageTotals.cacheRead;\n\t\tconst totalCacheWrite = usageTotals.cacheWrite;\n\t\tconst totalCost = usageTotals.cost;\n\n\t\t// Use activeInferenceModel during streaming to show the model actually\n\t\t// being used, not the configured model which may have been switched mid-turn.\n\t\tconst displayModel = state.activeInferenceModel ?? state.model;\n\n\t\t// Calculate context usage from session (handles compaction correctly).\n\t\t// After compaction, tokens are unknown until the next LLM response.\n\t\tconst contextUsage = this.session.getContextUsage();\n\t\tconst contextWindow = contextUsage?.contextWindow ?? displayModel?.contextWindow ?? 0;\n\t\tconst contextPercentValue = contextUsage?.percent ?? 0;\n\t\tconst contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(1) : \"?\";\n\n\t\t// Replace home directory with ~\n\t\tlet pwd = process.cwd();\n\t\tconst home = process.env.HOME || process.env.USERPROFILE;\n\t\tif (home && pwd.startsWith(home)) {\n\t\t\tpwd = `~${pwd.slice(home.length)}`;\n\t\t}\n\n\t\t// Add git branch if available\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tpwd = `${pwd} (${branch})`;\n\t\t}\n\n\t\t// Add session name if set\n\t\tconst sessionName = this.session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tpwd = `${pwd} • ${sessionName}`;\n\t\t}\n\n\t\t// Build stats line as separate groups joined by a dim middle-dot separator\n\t\tconst sep = ` ${theme.fg(\"dim\", \"\\u00B7\")} `;\n\n\t\t// Group 1: total tokens.\n\t\tconst tokenGroup: string[] = [];\n\t\tconst totalTokens = totalInput + totalOutput + totalCacheRead + totalCacheWrite;\n\t\tif (totalTokens > 0) tokenGroup.push(formatTokens(totalTokens));\n\n\t\t// Group 2: cache efficiency — cacheRead / all input-side tokens.\n\t\t// Collapses the old cr/cw pair into a single \"how much was served\n\t\t// from cache\" signal. cr/cw breakdown moved to `/stats`.\n\t\tconst cacheGroup: string[] = [];\n\t\tconst inputSide = totalInput + totalCacheRead + totalCacheWrite;\n\t\tif (totalCacheRead > 0 && inputSide > 0) {\n\t\t\tconst cachedPct = Math.round((totalCacheRead / inputSide) * 100);\n\t\t\tcacheGroup.push(`${cachedPct}% cached`);\n\t\t}\n\n\t\t// Group 3: cost\n\t\tconst costGroup: string[] = [];\n\t\tconst usingSubscription = displayModel ? this.session.modelRegistry.isUsingOAuth(displayModel) : false;\n\t\tif (totalCost || usingSubscription) {\n\t\t\tconst costStr = `$${totalCost.toFixed(3)}${usingSubscription ? \" (sub)\" : \"\"}`;\n\t\t\tcostGroup.push(costStr);\n\t\t}\n\n\t\t// Per-prompt cost annotation (opt-in via show_token_cost preference, #1515)\n\t\tif (process.env.GSD_SHOW_TOKEN_COST === \"1\") {\n\t\t\tconst lastTurnCost = this.session.getLastTurnCost();\n\t\t\tif (lastTurnCost > 0) {\n\t\t\t\tcostGroup.push(`(last: ${formatPromptCost(lastTurnCost)})`);\n\t\t\t}\n\t\t}\n\n\t\t// Group 4: context bar + percentage (mirrors /gsd auto dashboard style).\n\t\t// Bar colors track the same thresholds as the percent text.\n\t\tconst autoIndicator = this.autoCompactEnabled ? \" (auto)\" : \"\";\n\t\tconst barColor: \"error\" | \"warning\" | \"success\" =\n\t\t\tcontextPercentValue > 90 ? \"error\" : contextPercentValue > 70 ? \"warning\" : \"success\";\n\t\tconst BAR_WIDTH = 8;\n\t\tconst filled = contextUsage?.percent !== null\n\t\t\t? Math.max(0, Math.min(BAR_WIDTH, Math.round((contextPercentValue / 100) * BAR_WIDTH)))\n\t\t\t: 0;\n\t\tconst bar =\n\t\t\ttheme.fg(barColor, \"█\".repeat(filled)) +\n\t\t\ttheme.fg(\"dim\", \"░\".repeat(Math.max(0, BAR_WIDTH - filled)));\n\t\tconst pctText = contextPercent === \"?\" ? \"?\" : `${contextPercent}%`;\n\t\tconst suffix = `/${formatTokens(contextWindow)}${autoIndicator}`;\n\t\tconst colorizedPct =\n\t\t\tcontextPercentValue > 90\n\t\t\t\t? theme.fg(\"error\", pctText)\n\t\t\t\t: contextPercentValue > 70\n\t\t\t\t\t? theme.fg(\"warning\", pctText)\n\t\t\t\t\t: pctText;\n\t\tconst contextPercentStr = `${bar} ${colorizedPct}${suffix}`;\n\n\t\t// Assemble groups: items within a group are space-separated,\n\t\t// groups are separated by a dim middle-dot\n\t\tconst groups: string[] = [];\n\t\tif (tokenGroup.length > 0) groups.push(tokenGroup.join(\" \"));\n\t\tif (cacheGroup.length > 0) groups.push(cacheGroup.join(\" \"));\n\t\tif (costGroup.length > 0) groups.push(costGroup.join(\" \"));\n\t\tgroups.push(contextPercentStr);\n\n\t\tlet statsLeft = groups.join(sep);\n\n\t\t// Add model name on the right side, plus thinking level if model supports it\n\t\tconst modelName = displayModel?.id || \"no-model\";\n\n\t\tlet statsLeftWidth = visibleWidth(statsLeft);\n\n\t\t// If statsLeft is too wide, truncate it\n\t\tif (statsLeftWidth > width) {\n\t\t\tstatsLeft = truncateToWidth(statsLeft, width, \"...\");\n\t\t\tstatsLeftWidth = visibleWidth(statsLeft);\n\t\t}\n\n\t\t// Calculate available space for padding (minimum 2 spaces between stats and model)\n\t\tconst minPadding = 2;\n\n\t\t// Add thinking level indicator if model supports reasoning\n\t\tlet rightSideWithoutProvider = modelName;\n\t\tif (displayModel?.reasoning) {\n\t\t\tconst thinkingLevel = state.thinkingLevel || \"off\";\n\t\t\trightSideWithoutProvider =\n\t\t\t\tthinkingLevel === \"off\" ? `${modelName} • thinking off` : `${modelName} • ${thinkingLevel}`;\n\t\t}\n\n\t\t// Prepend the provider in parentheses if there are multiple providers and there's enough room.\n\t\t// Include the auth mode so users can tell at a glance whether the active model is\n\t\t// API-key-backed, OAuth-backed, or delegated to a third-party CLI.\n\t\tlet rightSide = rightSideWithoutProvider;\n\t\tif (this.footerData.getAvailableProviderCount() > 1 && displayModel) {\n\t\t\tconst authMode = this.session.modelRegistry.getProviderAuthMode(displayModel.provider);\n\t\t\tconst authLabel = providerAuthBadge(authMode);\n\t\t\tconst providerLabel = providerDisplayName(displayModel.provider);\n\t\t\tconst parenthetical = authLabel ? `${providerLabel} · ${authLabel}` : providerLabel;\n\t\t\trightSide = `(${parenthetical}) ${rightSideWithoutProvider}`;\n\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t// Too wide: drop the auth suffix first, then fall back to no parenthetical.\n\t\t\t\trightSide = `(${providerLabel}) ${rightSideWithoutProvider}`;\n\t\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t\trightSide = rightSideWithoutProvider;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Apply dim to the stats group before handing it to the shared footer strip.\n\t\t// statsLeft may contain color codes for context %, so keep coloring local to the group.\n\t\tconst dimStatsLeft = theme.fg(\"dim\", statsLeft);\n\n\t\t// Extension statuses right-aligned on the pwd line (sorted by key).\n\t\t// Keeps the footer compact by avoiding a dedicated row when the content\n\t\t// fits alongside pwd. Falls back to pwd-only if the combined line would\n\t\t// exceed width.\n\t\tconst extensionStatuses = this.footerData.getExtensionStatuses();\n\t\tconst extStatusText =\n\t\t\textensionStatuses.size > 0\n\t\t\t\t? Array.from(extensionStatuses.entries())\n\t\t\t\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t\t\t\t.map(([, text]) => sanitizeStatusText(text))\n\t\t\t\t\t\t.join(\" \")\n\t\t\t\t: \"\";\n\n\t\tconst leftSegments = [\n\t\t\ttheme.fg(\"accent\", \"● GSD\"),\n\t\t\ttheme.fg(\"dim\", pwd),\n\t\t\tdimStatsLeft,\n\t\t];\n\t\tconst footerRight = [rightSide, extStatusText].filter(Boolean).join(\" \");\n\t\treturn renderFooterStrip(leftSegments, footerRight, width);\n\t}\n}\n"]}
1
+ {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,iHAAiH;AAEjH,OAAO,EAAkB,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;GAGG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACvC,qFAAqF;IACrF,OAAO,IAAI;SACT,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;SACzB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,IAAI,EAAE,CAAC;AACV,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,KAAa;IACtD,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS;QAAE,OAAO,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,SAAS,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,KAAa;IAClC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1C,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,IAAI,KAAK,GAAG,OAAO;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3D,IAAI,KAAK,GAAG,QAAQ;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAChE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC5C,IAAI,IAAI,GAAG,KAAK;QAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,IAAI,IAAI,GAAG,IAAI;QAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,eAAe;IAG3B,YACS,OAAqB,EACrB,UAAsC;QADtC,YAAO,GAAP,OAAO,CAAc;QACrB,eAAU,GAAV,UAAU,CAA4B;QAJvC,uBAAkB,GAAG,IAAI,CAAC;IAK/B,CAAC;IAEJ,qBAAqB,CAAC,OAAgB;QACrC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,UAAU;QACT,sDAAsD;IACvD,CAAC;IAED;;;OAGG;IACH,OAAO;QACN,0CAA0C;IAC3C,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAEjC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QACjE,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC;QACrC,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC;QACvC,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC;QAC7C,MAAM,eAAe,GAAG,WAAW,CAAC,UAAU,CAAC;QAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC;QAEnC,uEAAuE;QACvE,8EAA8E;QAC9E,MAAM,YAAY,GAAG,KAAK,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,CAAC;QAE/D,uEAAuE;QACvE,oEAAoE;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,YAAY,EAAE,aAAa,IAAI,YAAY,EAAE,aAAa,IAAI,CAAC,CAAC;QACtF,MAAM,mBAAmB,GAAG,YAAY,EAAE,OAAO,IAAI,CAAC,CAAC;QACvD,MAAM,cAAc,GAAG,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE7F,gCAAgC;QAChC,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QACzD,IAAI,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,CAAC;QAED,8BAA8B;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QAC9C,IAAI,MAAM,EAAE,CAAC;YACZ,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,GAAG,CAAC;QAC5B,CAAC;QAED,0BAA0B;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QACjE,IAAI,WAAW,EAAE,CAAC;YACjB,GAAG,GAAG,GAAG,GAAG,MAAM,WAAW,EAAE,CAAC;QACjC,CAAC;QAED,2EAA2E;QAC3E,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC;QAE7C,yBAAyB;QACzB,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,eAAe,CAAC;QAChF,IAAI,WAAW,GAAG,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;QAEhE,iEAAiE;QACjE,kEAAkE;QAClE,yDAAyD;QACzD,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,eAAe,CAAC;QAChE,IAAI,cAAc,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;YACjE,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,UAAU,CAAC,CAAC;QACzC,CAAC;QAED,gBAAgB;QAChB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,iBAAiB,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACvG,IAAI,SAAS,IAAI,iBAAiB,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/E,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,4EAA4E;QAC5E,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,EAAE,CAAC;YAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACpD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACtB,SAAS,CAAC,IAAI,CAAC,UAAU,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAC7D,CAAC;QACF,CAAC;QAED,yEAAyE;QACzE,4DAA4D;QAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,QAAQ,GACb,mBAAmB,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,MAAM,SAAS,GAAG,CAAC,CAAC;QACpB,MAAM,MAAM,GAAG,YAAY,EAAE,OAAO,KAAK,IAAI;YAC5C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,mBAAmB,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;YACvF,CAAC,CAAC,CAAC,CAAC;QACL,MAAM,GAAG,GACR,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,cAAc,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,GAAG,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,GAAG,aAAa,EAAE,CAAC;QACjE,MAAM,YAAY,GACjB,mBAAmB,GAAG,EAAE;YACvB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;YAC5B,CAAC,CAAC,mBAAmB,GAAG,EAAE;gBACzB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;gBAC9B,CAAC,CAAC,OAAO,CAAC;QACb,MAAM,iBAAiB,GAAG,GAAG,GAAG,IAAI,YAAY,GAAG,MAAM,EAAE,CAAC;QAE5D,6DAA6D;QAC7D,2CAA2C;QAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE/B,IAAI,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjC,6EAA6E;QAC7E,MAAM,SAAS,GAAG,YAAY,EAAE,EAAE,IAAI,UAAU,CAAC;QAEjD,IAAI,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAE7C,wCAAwC;QACxC,IAAI,cAAc,GAAG,KAAK,EAAE,CAAC;YAC5B,SAAS,GAAG,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACrD,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QAED,mFAAmF;QACnF,MAAM,UAAU,GAAG,CAAC,CAAC;QAErB,2DAA2D;QAC3D,IAAI,wBAAwB,GAAG,SAAS,CAAC;QACzC,IAAI,YAAY,EAAE,SAAS,EAAE,CAAC;YAC7B,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC;YACnD,wBAAwB;gBACvB,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,MAAM,aAAa,EAAE,CAAC;QAC9F,CAAC;QAED,+FAA+F;QAC/F,kFAAkF;QAClF,mEAAmE;QACnE,IAAI,SAAS,GAAG,wBAAwB,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU,CAAC,yBAAyB,EAAE,GAAG,CAAC,IAAI,YAAY,EAAE,CAAC;YACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvF,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACjE,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,aAAa,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;YACpF,SAAS,GAAG,IAAI,aAAa,KAAK,wBAAwB,EAAE,CAAC;YAC7D,IAAI,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,KAAK,EAAE,CAAC;gBACnE,4EAA4E;gBAC5E,SAAS,GAAG,IAAI,aAAa,KAAK,wBAAwB,EAAE,CAAC;gBAC7D,IAAI,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,KAAK,EAAE,CAAC;oBACnE,SAAS,GAAG,wBAAwB,CAAC;gBACtC,CAAC;YACF,CAAC;QACF,CAAC;QAED,oEAAoE;QACpE,wEAAwE;QACxE,wEAAwE;QACxE,gBAAgB;QAChB,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC;QACjE,MAAM,aAAa,GAClB,iBAAiB,CAAC,IAAI,GAAG,CAAC;YACzB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;iBACtC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;iBACtC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;iBAC3C,IAAI,CAAC,GAAG,CAAC;YACZ,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzE,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACvF,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;QACjH,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QAEvE,MAAM,YAAY,GAAG;YACpB,UAAU;YACV,UAAU;YACV,YAAY;SACZ,CAAC;QACF,OAAO,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;CACD","sourcesContent":["// Project/App: GSD-2\n// File Purpose: Interactive terminal footer renderer for workspace, model, usage, context, and extension status.\n\nimport { type Component, truncateToWidth, visibleWidth } from \"@gsd/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.js\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { providerAuthBadge, providerDisplayName } from \"./model-selector.js\";\nimport { renderFooterStrip } from \"./transcript-design.js\";\n\n/**\n * Sanitize text for display in a single-line status.\n * Removes newlines, tabs, carriage returns, and other control characters.\n */\nfunction sanitizeStatusText(text: string): string {\n\t// Replace newlines, tabs, carriage returns with space, then collapse multiple spaces\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\nfunction truncateFooterPath(text: string, width: number): string {\n\tif (visibleWidth(text) <= width) return text;\n\tconst tailMatch = text.match(/( \\([^)]+\\)(?: • .*)?)$/);\n\tif (!tailMatch) return truncateToWidth(text, width, \"...\");\n\tconst tail = tailMatch[1];\n\tconst tailWidth = visibleWidth(tail);\n\tif (tailWidth >= width - 4) return truncateToWidth(text, width, \"...\");\n\tconst head = text.slice(0, -tail.length);\n\treturn `${truncateToWidth(head, width - tailWidth, \"...\")}${tail}`;\n}\n\n/**\n * Format token counts (similar to web-ui)\n */\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\n/**\n * Format a cost value for compact display.\n * Uses fewer decimal places for larger amounts.\n * @internal Exported for testing only.\n */\nexport function formatPromptCost(cost: number): string {\n\tif (cost < 0.001) return `$${cost.toFixed(4)}`;\n\tif (cost < 0.01) return `$${cost.toFixed(3)}`;\n\tif (cost < 1) return `$${cost.toFixed(3)}`;\n\treturn `$${cost.toFixed(2)}`;\n}\n\n/**\n * Footer component that shows pwd, token stats, and context usage.\n * Computes token/context stats from session, gets git branch and extension statuses from provider.\n */\nexport class FooterComponent implements Component {\n\tprivate autoCompactEnabled = true;\n\n\tconstructor(\n\t\tprivate session: AgentSession,\n\t\tprivate footerData: ReadonlyFooterDataProvider,\n\t) {}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.autoCompactEnabled = enabled;\n\t}\n\n\t/**\n\t * No-op: git branch caching now handled by provider.\n\t * Kept for compatibility with existing call sites in interactive-mode.\n\t */\n\tinvalidate(): void {\n\t\t// No-op: git branch is cached/invalidated by provider\n\t}\n\n\t/**\n\t * Clean up resources.\n\t * Git watcher cleanup now handled by provider.\n\t */\n\tdispose(): void {\n\t\t// Git watcher cleanup handled by provider\n\t}\n\n\trender(width: number): string[] {\n\t\tconst state = this.session.state;\n\n\t\tconst usageTotals = this.session.sessionManager.getUsageTotals();\n\t\tconst totalInput = usageTotals.input;\n\t\tconst totalOutput = usageTotals.output;\n\t\tconst totalCacheRead = usageTotals.cacheRead;\n\t\tconst totalCacheWrite = usageTotals.cacheWrite;\n\t\tconst totalCost = usageTotals.cost;\n\n\t\t// Use activeInferenceModel during streaming to show the model actually\n\t\t// being used, not the configured model which may have been switched mid-turn.\n\t\tconst displayModel = state.activeInferenceModel ?? state.model;\n\n\t\t// Calculate context usage from session (handles compaction correctly).\n\t\t// After compaction, tokens are unknown until the next LLM response.\n\t\tconst contextUsage = this.session.getContextUsage();\n\t\tconst contextWindow = contextUsage?.contextWindow ?? displayModel?.contextWindow ?? 0;\n\t\tconst contextPercentValue = contextUsage?.percent ?? 0;\n\t\tconst contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(1) : \"?\";\n\n\t\t// Replace home directory with ~\n\t\tlet pwd = process.cwd();\n\t\tconst home = process.env.HOME || process.env.USERPROFILE;\n\t\tif (home && pwd.startsWith(home)) {\n\t\t\tpwd = `~${pwd.slice(home.length)}`;\n\t\t}\n\n\t\t// Add git branch if available\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tpwd = `${pwd} (${branch})`;\n\t\t}\n\n\t\t// Add session name if set\n\t\tconst sessionName = this.session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tpwd = `${pwd} • ${sessionName}`;\n\t\t}\n\n\t\t// Build stats line as separate groups joined by a dim middle-dot separator\n\t\tconst sep = ` ${theme.fg(\"dim\", \"\\u00B7\")} `;\n\n\t\t// Group 1: total tokens.\n\t\tconst tokenGroup: string[] = [];\n\t\tconst totalTokens = totalInput + totalOutput + totalCacheRead + totalCacheWrite;\n\t\tif (totalTokens > 0) tokenGroup.push(formatTokens(totalTokens));\n\n\t\t// Group 2: cache efficiency — cacheRead / all input-side tokens.\n\t\t// Collapses the old cr/cw pair into a single \"how much was served\n\t\t// from cache\" signal. cr/cw breakdown moved to `/stats`.\n\t\tconst cacheGroup: string[] = [];\n\t\tconst inputSide = totalInput + totalCacheRead + totalCacheWrite;\n\t\tif (totalCacheRead > 0 && inputSide > 0) {\n\t\t\tconst cachedPct = Math.round((totalCacheRead / inputSide) * 100);\n\t\t\tcacheGroup.push(`${cachedPct}% cached`);\n\t\t}\n\n\t\t// Group 3: cost\n\t\tconst costGroup: string[] = [];\n\t\tconst usingSubscription = displayModel ? this.session.modelRegistry.isUsingOAuth(displayModel) : false;\n\t\tif (totalCost || usingSubscription) {\n\t\t\tconst costStr = `$${totalCost.toFixed(3)}${usingSubscription ? \" (sub)\" : \"\"}`;\n\t\t\tcostGroup.push(costStr);\n\t\t}\n\n\t\t// Per-prompt cost annotation (opt-in via show_token_cost preference, #1515)\n\t\tif (process.env.GSD_SHOW_TOKEN_COST === \"1\") {\n\t\t\tconst lastTurnCost = this.session.getLastTurnCost();\n\t\t\tif (lastTurnCost > 0) {\n\t\t\t\tcostGroup.push(`(last: ${formatPromptCost(lastTurnCost)})`);\n\t\t\t}\n\t\t}\n\n\t\t// Group 4: context bar + percentage (mirrors /gsd auto dashboard style).\n\t\t// Bar colors track the same thresholds as the percent text.\n\t\tconst autoIndicator = this.autoCompactEnabled ? \" (auto)\" : \"\";\n\t\tconst barColor: \"error\" | \"warning\" | \"success\" =\n\t\t\tcontextPercentValue > 90 ? \"error\" : contextPercentValue > 70 ? \"warning\" : \"success\";\n\t\tconst BAR_WIDTH = 8;\n\t\tconst filled = contextUsage?.percent !== null\n\t\t\t? Math.max(0, Math.min(BAR_WIDTH, Math.round((contextPercentValue / 100) * BAR_WIDTH)))\n\t\t\t: 0;\n\t\tconst bar =\n\t\t\ttheme.fg(barColor, \"█\".repeat(filled)) +\n\t\t\ttheme.fg(\"dim\", \"░\".repeat(Math.max(0, BAR_WIDTH - filled)));\n\t\tconst pctText = contextPercent === \"?\" ? \"?\" : `${contextPercent}%`;\n\t\tconst suffix = `/${formatTokens(contextWindow)}${autoIndicator}`;\n\t\tconst colorizedPct =\n\t\t\tcontextPercentValue > 90\n\t\t\t\t? theme.fg(\"error\", pctText)\n\t\t\t\t: contextPercentValue > 70\n\t\t\t\t\t? theme.fg(\"warning\", pctText)\n\t\t\t\t\t: pctText;\n\t\tconst contextPercentStr = `${bar} ${colorizedPct}${suffix}`;\n\n\t\t// Assemble groups: items within a group are space-separated,\n\t\t// groups are separated by a dim middle-dot\n\t\tconst groups: string[] = [];\n\t\tif (tokenGroup.length > 0) groups.push(tokenGroup.join(\" \"));\n\t\tif (cacheGroup.length > 0) groups.push(cacheGroup.join(\" \"));\n\t\tif (costGroup.length > 0) groups.push(costGroup.join(\" \"));\n\t\tgroups.push(contextPercentStr);\n\n\t\tlet statsLeft = groups.join(sep);\n\n\t\t// Add model name on the right side, plus thinking level if model supports it\n\t\tconst modelName = displayModel?.id || \"no-model\";\n\n\t\tlet statsLeftWidth = visibleWidth(statsLeft);\n\n\t\t// If statsLeft is too wide, truncate it\n\t\tif (statsLeftWidth > width) {\n\t\t\tstatsLeft = truncateToWidth(statsLeft, width, \"...\");\n\t\t\tstatsLeftWidth = visibleWidth(statsLeft);\n\t\t}\n\n\t\t// Calculate available space for padding (minimum 2 spaces between stats and model)\n\t\tconst minPadding = 2;\n\n\t\t// Add thinking level indicator if model supports reasoning\n\t\tlet rightSideWithoutProvider = modelName;\n\t\tif (displayModel?.reasoning) {\n\t\t\tconst thinkingLevel = state.thinkingLevel || \"off\";\n\t\t\trightSideWithoutProvider =\n\t\t\t\tthinkingLevel === \"off\" ? `${modelName} • thinking off` : `${modelName} • ${thinkingLevel}`;\n\t\t}\n\n\t\t// Prepend the provider in parentheses if there are multiple providers and there's enough room.\n\t\t// Include the auth mode so users can tell at a glance whether the active model is\n\t\t// API-key-backed, OAuth-backed, or delegated to a third-party CLI.\n\t\tlet rightSide = rightSideWithoutProvider;\n\t\tif (this.footerData.getAvailableProviderCount() > 1 && displayModel) {\n\t\t\tconst authMode = this.session.modelRegistry.getProviderAuthMode(displayModel.provider);\n\t\t\tconst authLabel = providerAuthBadge(authMode);\n\t\t\tconst providerLabel = providerDisplayName(displayModel.provider);\n\t\t\tconst parenthetical = authLabel ? `${providerLabel} · ${authLabel}` : providerLabel;\n\t\t\trightSide = `(${parenthetical}) ${rightSideWithoutProvider}`;\n\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t// Too wide: drop the auth suffix first, then fall back to no parenthetical.\n\t\t\t\trightSide = `(${providerLabel}) ${rightSideWithoutProvider}`;\n\t\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t\trightSide = rightSideWithoutProvider;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Extension statuses right-aligned on the pwd line (sorted by key).\n\t\t// Keeps the footer compact by avoiding a dedicated row when the content\n\t\t// fits alongside pwd. Falls back to pwd-only if the combined line would\n\t\t// exceed width.\n\t\tconst extensionStatuses = this.footerData.getExtensionStatuses();\n\t\tconst extStatusText =\n\t\t\textensionStatuses.size > 0\n\t\t\t\t? Array.from(extensionStatuses.entries())\n\t\t\t\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t\t\t\t.map(([, text]) => sanitizeStatusText(text))\n\t\t\t\t\t\t.join(\" \")\n\t\t\t\t: \"\";\n\n\t\tconst footerRight = [rightSide, extStatusText].filter(Boolean).join(\" \");\n\t\tconst gsdSegment = theme.fg(\"accent\", \"● GSD\");\n\t\tconst dimStatsLeft = theme.fg(\"dim\", statsLeft);\n\t\tconst innerWidth = Math.max(1, width - 2);\n\t\tconst rightWidth = visibleWidth(footerRight);\n\t\tconst leftBudget = footerRight ? Math.max(1, innerWidth - rightWidth - 3) : innerWidth;\n\t\tconst sepWidth = visibleWidth(\" │ \");\n\t\tconst pwdBudget = Math.max(1, leftBudget - visibleWidth(gsdSegment) - visibleWidth(dimStatsLeft) - sepWidth * 2);\n\t\tconst pwdSegment = theme.fg(\"dim\", truncateFooterPath(pwd, pwdBudget));\n\n\t\tconst leftSegments = [\n\t\t\tgsdSegment,\n\t\t\tpwdSegment,\n\t\t\tdimStatsLeft,\n\t\t];\n\t\treturn renderFooterStrip(leftSegments, footerRight, width);\n\t}\n}\n"]}
@@ -79,7 +79,7 @@ function formatElapsed(ms) {
79
79
  return `${Math.max(1, Math.round(ms / 1000))}s`;
80
80
  }
81
81
  function formatCommandPreview(command) {
82
- return truncateToWidth(command.replace(/\s+/g, " ").trim(), 64, "");
82
+ return command.replace(/\s+/g, " ").trim();
83
83
  }
84
84
  function appendLineOrRange(displayPath, target) {
85
85
  if (!displayPath)