@opengsd/gsd-pi 1.2.0-dev.fbdca60b → 1.3.0-dev.65546769

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 (835) hide show
  1. package/README.md +13 -7
  2. package/dist/cli.js +28 -1
  3. package/dist/headless-context.js +0 -1
  4. package/dist/headless-events.d.ts +16 -1
  5. package/dist/headless-events.js +19 -2
  6. package/dist/headless.js +8 -1
  7. package/dist/help-text.js +29 -0
  8. package/dist/hermes-integration-install.d.ts +17 -0
  9. package/dist/hermes-integration-install.js +199 -0
  10. package/dist/jiti-workspace-aliases.d.ts +11 -2
  11. package/dist/jiti-workspace-aliases.js +19 -3
  12. package/dist/onboarding.js +9 -4
  13. package/dist/provider-migrations.d.ts +23 -0
  14. package/dist/provider-migrations.js +41 -0
  15. package/dist/read-cli.d.ts +23 -0
  16. package/dist/read-cli.js +90 -0
  17. package/dist/resource-loader.d.ts +3 -3
  18. package/dist/resource-loader.js +4 -13
  19. package/dist/resources/.managed-resources-content-hash +1 -1
  20. package/dist/resources/GSD-WORKFLOW.md +22 -22
  21. package/dist/resources/extensions/claude-code-cli/index.js +7 -1
  22. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +73 -20
  23. package/dist/resources/extensions/google-cli/stream-adapter.js +16 -1
  24. package/dist/resources/extensions/gsd/auto/dispatch-history.js +6 -1
  25. package/dist/resources/extensions/gsd/auto/loop.js +67 -2
  26. package/dist/resources/extensions/gsd/auto/orchestrator.js +50 -10
  27. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +8 -0
  28. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +15 -1
  29. package/dist/resources/extensions/gsd/auto-artifact-paths.js +81 -19
  30. package/dist/resources/extensions/gsd/auto-closeout-messaging.js +90 -0
  31. package/dist/resources/extensions/gsd/auto-dashboard.js +255 -431
  32. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +15 -3
  33. package/dist/resources/extensions/gsd/auto-dispatch.js +47 -8
  34. package/dist/resources/extensions/gsd/auto-model-selection.js +14 -8
  35. package/dist/resources/extensions/gsd/auto-post-unit.js +39 -29
  36. package/dist/resources/extensions/gsd/auto-prompts.js +44 -30
  37. package/dist/resources/extensions/gsd/auto-recovery.js +118 -40
  38. package/dist/resources/extensions/gsd/auto-runtime-state.js +13 -0
  39. package/dist/resources/extensions/gsd/auto-start.js +58 -31
  40. package/dist/resources/extensions/gsd/auto-verification.js +5 -2
  41. package/dist/resources/extensions/gsd/auto-worktree.js +149 -91
  42. package/dist/resources/extensions/gsd/auto.js +97 -31
  43. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +42 -54
  44. package/dist/resources/extensions/gsd/bootstrap/fallback-continuation.js +25 -0
  45. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +24 -2
  46. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +108 -9
  47. package/dist/resources/extensions/gsd/bootstrap/system-context.js +164 -44
  48. package/dist/resources/extensions/gsd/bootstrap/tool-search-shim.js +22 -3
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +113 -27
  50. package/dist/resources/extensions/gsd/closeout-consistency-gate.js +92 -4
  51. package/dist/resources/extensions/gsd/closeout-wizard.js +8 -3
  52. package/dist/resources/extensions/gsd/codebase-generator.js +5 -8
  53. package/dist/resources/extensions/gsd/commands/catalog.js +6 -0
  54. package/dist/resources/extensions/gsd/commands/dispatcher.js +3 -0
  55. package/dist/resources/extensions/gsd/commands/gsd-core-aliases-handler.js +39 -0
  56. package/dist/resources/extensions/gsd/commands/gsd-core-aliases.js +44 -0
  57. package/dist/resources/extensions/gsd/commands/handlers/core.js +52 -8
  58. package/dist/resources/extensions/gsd/commands/handlers/ops.js +227 -3
  59. package/dist/resources/extensions/gsd/commands-cmux.js +3 -1
  60. package/dist/resources/extensions/gsd/commands-gsd-core.js +868 -0
  61. package/dist/resources/extensions/gsd/commands-handlers.js +67 -1
  62. package/dist/resources/extensions/gsd/commands-maintenance.js +79 -2
  63. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +14 -1
  64. package/dist/resources/extensions/gsd/commands-verdict.js +17 -11
  65. package/dist/resources/extensions/gsd/compat/compat-marker.js +172 -0
  66. package/dist/resources/extensions/gsd/compat/index.js +3 -0
  67. package/dist/resources/extensions/gsd/compat/planning-compat.js +142 -0
  68. package/dist/resources/extensions/gsd/config-overlay.js +11 -8
  69. package/dist/resources/extensions/gsd/consent-question.js +12 -0
  70. package/dist/resources/extensions/gsd/consent-verdict.js +10 -0
  71. package/dist/resources/extensions/gsd/dashboard-overlay.js +39 -3
  72. package/dist/resources/extensions/gsd/db/engine.js +27 -0
  73. package/dist/resources/extensions/gsd/db/queries.js +54 -0
  74. package/dist/resources/extensions/gsd/db/unit-dispatches.js +22 -1
  75. package/dist/resources/extensions/gsd/db/writers/reconcile.js +19 -1
  76. package/dist/resources/extensions/gsd/db-workspace.js +13 -1
  77. package/dist/resources/extensions/gsd/discussion-handoff.js +9 -5
  78. package/dist/resources/extensions/gsd/doctor-git-checks.js +30 -4
  79. package/dist/resources/extensions/gsd/doctor-providers.js +1 -1
  80. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +13 -24
  81. package/dist/resources/extensions/gsd/doctor.js +28 -7
  82. package/dist/resources/extensions/gsd/error-classifier.js +13 -1
  83. package/dist/resources/extensions/gsd/escalation.js +11 -4
  84. package/dist/resources/extensions/gsd/export-html.js +10 -3
  85. package/dist/resources/extensions/gsd/export.js +73 -0
  86. package/dist/resources/extensions/gsd/file-lock.js +1 -1
  87. package/dist/resources/extensions/gsd/flat-phase-migration.js +176 -0
  88. package/dist/resources/extensions/gsd/forensics.js +2 -1
  89. package/dist/resources/extensions/gsd/git-service.js +7 -4
  90. package/dist/resources/extensions/gsd/gitignore.js +6 -2
  91. package/dist/resources/extensions/gsd/guidance.js +7 -7
  92. package/dist/resources/extensions/gsd/guided-flow.js +11 -6
  93. package/dist/resources/extensions/gsd/layout-policy.js +75 -0
  94. package/dist/resources/extensions/gsd/markdown-renderer.js +391 -116
  95. package/dist/resources/extensions/gsd/mcp-filter.js +44 -10
  96. package/dist/resources/extensions/gsd/md-importer.js +153 -51
  97. package/dist/resources/extensions/gsd/metrics.js +19 -11
  98. package/dist/resources/extensions/gsd/migrate/layout-detect.js +32 -0
  99. package/dist/resources/extensions/gsd/migrate/planning-writer.js +203 -0
  100. package/dist/resources/extensions/gsd/migrate-external.js +51 -6
  101. package/dist/resources/extensions/gsd/migration-auto-check.js +5 -14
  102. package/dist/resources/extensions/gsd/milestone-actions.js +5 -3
  103. package/dist/resources/extensions/gsd/milestone-closeout.js +12 -2
  104. package/dist/resources/extensions/gsd/milestone-ids.js +50 -19
  105. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +8 -0
  106. package/dist/resources/extensions/gsd/milestone-validation-verdict.js +7 -4
  107. package/dist/resources/extensions/gsd/model-router.js +79 -20
  108. package/dist/resources/extensions/gsd/notification-store.js +22 -29
  109. package/dist/resources/extensions/gsd/notifications.js +36 -7
  110. package/dist/resources/extensions/gsd/observability-validator.js +12 -4
  111. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +133 -35
  112. package/dist/resources/extensions/gsd/parsers-legacy.js +40 -14
  113. package/dist/resources/extensions/gsd/paths.js +356 -44
  114. package/dist/resources/extensions/gsd/planning-depth.js +2 -1
  115. package/dist/resources/extensions/gsd/post-execution-checks.js +26 -3
  116. package/dist/resources/extensions/gsd/preferences-models.js +34 -14
  117. package/dist/resources/extensions/gsd/preferences.js +148 -13
  118. package/dist/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
  119. package/dist/resources/extensions/gsd/prompts/audit-fix.md +39 -0
  120. package/dist/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
  121. package/dist/resources/extensions/gsd/prompts/audit-uat.md +24 -0
  122. package/dist/resources/extensions/gsd/prompts/autonomous.md +31 -0
  123. package/dist/resources/extensions/gsd/prompts/code-review.md +37 -0
  124. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  125. package/dist/resources/extensions/gsd/prompts/complete-slice.md +24 -15
  126. package/dist/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
  127. package/dist/resources/extensions/gsd/prompts/docs-update.md +13 -0
  128. package/dist/resources/extensions/gsd/prompts/execute-phase.md +33 -0
  129. package/dist/resources/extensions/gsd/prompts/execute-task.md +5 -1
  130. package/dist/resources/extensions/gsd/prompts/explore.md +58 -0
  131. package/dist/resources/extensions/gsd/prompts/graphify.md +27 -0
  132. package/dist/resources/extensions/gsd/prompts/health.md +37 -0
  133. package/dist/resources/extensions/gsd/prompts/import.md +30 -0
  134. package/dist/resources/extensions/gsd/prompts/inbox.md +27 -0
  135. package/dist/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
  136. package/dist/resources/extensions/gsd/prompts/manager.md +21 -0
  137. package/dist/resources/extensions/gsd/prompts/map-codebase.md +42 -0
  138. package/dist/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
  139. package/dist/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
  140. package/dist/resources/extensions/gsd/prompts/pause-work.md +24 -0
  141. package/dist/resources/extensions/gsd/prompts/phase.md +22 -0
  142. package/dist/resources/extensions/gsd/prompts/plan-phase.md +34 -0
  143. package/dist/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
  144. package/dist/resources/extensions/gsd/prompts/profile-user.md +28 -0
  145. package/dist/resources/extensions/gsd/prompts/progress.md +30 -0
  146. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  147. package/dist/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  148. package/dist/resources/extensions/gsd/prompts/resume-work.md +20 -0
  149. package/dist/resources/extensions/gsd/prompts/review-backlog.md +21 -0
  150. package/dist/resources/extensions/gsd/prompts/review.md +27 -0
  151. package/dist/resources/extensions/gsd/prompts/run-uat.md +5 -1
  152. package/dist/resources/extensions/gsd/prompts/secure-phase.md +24 -0
  153. package/dist/resources/extensions/gsd/prompts/settings.md +24 -0
  154. package/dist/resources/extensions/gsd/prompts/sketch.md +59 -0
  155. package/dist/resources/extensions/gsd/prompts/spec-phase.md +29 -0
  156. package/dist/resources/extensions/gsd/prompts/spike.md +59 -0
  157. package/dist/resources/extensions/gsd/prompts/stats.md +43 -0
  158. package/dist/resources/extensions/gsd/prompts/surface.md +25 -0
  159. package/dist/resources/extensions/gsd/prompts/thread.md +24 -0
  160. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  161. package/dist/resources/extensions/gsd/prompts/ui-phase.md +29 -0
  162. package/dist/resources/extensions/gsd/prompts/ui-review.md +29 -0
  163. package/dist/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
  164. package/dist/resources/extensions/gsd/prompts/validate-phase.md +26 -0
  165. package/dist/resources/extensions/gsd/prompts/verify-work.md +24 -0
  166. package/dist/resources/extensions/gsd/prompts/workspace.md +22 -0
  167. package/dist/resources/extensions/gsd/prompts/workstreams.md +24 -0
  168. package/dist/resources/extensions/gsd/provider-error-guidance.js +24 -0
  169. package/dist/resources/extensions/gsd/queue-order.js +3 -2
  170. package/dist/resources/extensions/gsd/recovery-classification.js +8 -0
  171. package/dist/resources/extensions/gsd/roadmap-slices.js +1 -1
  172. package/dist/resources/extensions/gsd/safety/content-validator.js +2 -1
  173. package/dist/resources/extensions/gsd/safety/evidence-cross-ref.js +43 -1
  174. package/dist/resources/extensions/gsd/service-tier.js +2 -1
  175. package/dist/resources/extensions/gsd/session-lock.js +11 -9
  176. package/dist/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
  177. package/dist/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
  178. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +51 -10
  179. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +24 -3
  180. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.js +82 -0
  181. package/dist/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.js +142 -0
  182. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +19 -6
  183. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +2 -2
  184. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +95 -19
  185. package/dist/resources/extensions/gsd/state-reconciliation/index.js +36 -3
  186. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +12 -0
  187. package/dist/resources/extensions/gsd/state.js +48 -17
  188. package/dist/resources/extensions/gsd/sync-lock.js +11 -18
  189. package/dist/resources/extensions/gsd/tool-surface-readiness.js +205 -16
  190. package/dist/resources/extensions/gsd/tools/complete-milestone.js +4 -2
  191. package/dist/resources/extensions/gsd/tools/complete-slice.js +12 -2
  192. package/dist/resources/extensions/gsd/tools/complete-task.js +15 -1
  193. package/dist/resources/extensions/gsd/tools/exec-tool.js +2 -109
  194. package/dist/resources/extensions/gsd/tools/plan-slice.js +1 -3
  195. package/dist/resources/extensions/gsd/tools/plan-task.js +16 -1
  196. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +9 -3
  197. package/dist/resources/extensions/gsd/tools/validate-milestone.js +8 -3
  198. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +44 -5
  199. package/dist/resources/extensions/gsd/triage-resolution.js +14 -7
  200. package/dist/resources/extensions/gsd/tui/render-kit.js +38 -13
  201. package/dist/resources/extensions/gsd/undo.js +8 -9
  202. package/dist/resources/extensions/gsd/unit-registry.js +27 -3
  203. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +58 -2
  204. package/dist/resources/extensions/gsd/validation-block-guard.js +45 -0
  205. package/dist/resources/extensions/gsd/visualizer-data.js +35 -0
  206. package/dist/resources/extensions/gsd/visualizer-views.js +21 -2
  207. package/dist/resources/extensions/gsd/workflow-logger.js +4 -0
  208. package/dist/resources/extensions/gsd/workflow-mcp.js +9 -1
  209. package/dist/resources/extensions/gsd/workflow-projections.js +25 -4
  210. package/dist/resources/extensions/gsd/worktree-command.js +6 -6
  211. package/dist/resources/extensions/gsd/worktree-health.js +6 -3
  212. package/dist/resources/extensions/gsd/worktree-manager.js +109 -16
  213. package/dist/resources/extensions/gsd/worktree-safety.js +20 -11
  214. package/dist/resources/extensions/gsd/worktree-shell-guard.js +113 -0
  215. package/dist/resources/extensions/mcp-client/manager.js +3 -3
  216. package/dist/resources/extensions/search-the-web/index.js +41 -9
  217. package/dist/resources/extensions/search-the-web/native-search.js +18 -4
  218. package/dist/resources/extensions/shared/gsd-browser-cli.js +40 -2
  219. package/dist/resources/extensions/subagent/index.js +20 -15
  220. package/dist/resources/extensions/subagent/worktree-cwd.js +31 -0
  221. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  222. package/dist/update-check.js +15 -4
  223. package/dist/web/standalone/.next/BUILD_ID +1 -1
  224. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  225. package/dist/web/standalone/.next/build-manifest.json +3 -3
  226. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  227. package/dist/web/standalone/.next/react-loadable-manifest.json +3 -3
  228. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  229. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  230. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  231. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  232. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  233. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  234. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  235. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  236. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  237. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  238. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  239. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  240. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  241. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  242. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  243. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  244. package/dist/web/standalone/.next/server/app/index.html +1 -1
  245. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  246. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  247. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  248. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  249. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  250. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  251. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  252. package/dist/web/standalone/.next/server/chunks/1128.js +1 -1
  253. package/dist/web/standalone/.next/server/chunks/5124.js +1 -1
  254. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  255. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  257. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  258. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  259. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  260. package/dist/web/standalone/.next/static/chunks/{4283.e4873b058df143a1.js → 4283.8e446784528ed9dc.js} +2 -2
  261. package/dist/web/standalone/.next/static/chunks/8785.481aa5869991b760.js +1 -0
  262. package/dist/web/standalone/.next/static/chunks/{webpack-f0285ce91d4ec9ef.js → webpack-f46ea08200a0227e.js} +1 -1
  263. package/dist/web/standalone/node_modules/@gsd/native/package.json +1 -1
  264. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  265. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  266. package/dist/web-mode.d.ts +3 -1
  267. package/dist/web-mode.js +7 -5
  268. package/integrations/hermes/README.md +48 -0
  269. package/integrations/hermes/docs/setup.md +272 -0
  270. package/integrations/hermes/docs/upstream-hermes-pr.md +40 -0
  271. package/integrations/hermes/open_gsd_hermes/__init__.py +105 -0
  272. package/integrations/hermes/open_gsd_hermes/binding.py +107 -0
  273. package/integrations/hermes/open_gsd_hermes/commands.py +186 -0
  274. package/integrations/hermes/open_gsd_hermes/config.py +59 -0
  275. package/integrations/hermes/open_gsd_hermes/credentials.py +51 -0
  276. package/integrations/hermes/open_gsd_hermes/cron.py +85 -0
  277. package/integrations/hermes/open_gsd_hermes/formatting.py +13 -0
  278. package/integrations/hermes/open_gsd_hermes/gsd_client.py +269 -0
  279. package/integrations/hermes/open_gsd_hermes/inject.py +31 -0
  280. package/integrations/hermes/open_gsd_hermes/memory.py +66 -0
  281. package/integrations/hermes/open_gsd_hermes/notifications.py +71 -0
  282. package/integrations/hermes/open_gsd_hermes/snapshot.py +42 -0
  283. package/integrations/hermes/open_gsd_hermes/supervisor.py +180 -0
  284. package/integrations/hermes/open_gsd_hermes/types.py +100 -0
  285. package/integrations/hermes/plugin.yaml +38 -0
  286. package/integrations/hermes/pyproject.toml +32 -0
  287. package/integrations/hermes/scripts/preflight.sh +92 -0
  288. package/integrations/hermes/tests/fixtures/minimal-project/.gsd/STATE.md +17 -0
  289. package/integrations/hermes/tests/golden/memory_prefetch.txt +5 -0
  290. package/integrations/hermes/tests/golden/snapshot.txt +8 -0
  291. package/integrations/hermes/tests/test_binding.py +103 -0
  292. package/integrations/hermes/tests/test_config.py +36 -0
  293. package/integrations/hermes/tests/test_cron.py +34 -0
  294. package/integrations/hermes/tests/test_gsd_client_cache.py +120 -0
  295. package/integrations/hermes/tests/test_memory.py +59 -0
  296. package/integrations/hermes/tests/test_read_cli_contract.py +50 -0
  297. package/integrations/hermes/tests/test_register.py +56 -0
  298. package/integrations/hermes/tests/test_snapshot.py +53 -0
  299. package/integrations/hermes/tests/test_supervisor_fsm.py +581 -0
  300. package/package.json +8 -7
  301. package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts +8 -0
  302. package/packages/cloud-mcp-gateway/dist/runtime-registry.d.ts.map +1 -1
  303. package/packages/cloud-mcp-gateway/dist/runtime-registry.js +19 -2
  304. package/packages/cloud-mcp-gateway/dist/runtime-registry.js.map +1 -1
  305. package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js +71 -2
  306. package/packages/cloud-mcp-gateway/dist/runtime-registry.test.js.map +1 -1
  307. package/packages/cloud-mcp-gateway/package.json +2 -2
  308. package/packages/contracts/package.json +1 -1
  309. package/packages/daemon/package.json +4 -4
  310. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  311. package/packages/gsd-agent-core/dist/sdk.js +6 -2
  312. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  313. package/packages/gsd-agent-core/package.json +5 -5
  314. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts +5 -5
  315. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  316. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js +12 -24
  317. package/packages/gsd-agent-modes/dist/modes/interactive/components/assistant-message.js.map +1 -1
  318. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js +5 -5
  319. package/packages/gsd-agent-modes/dist/modes/interactive/components/bash-execution.js.map +1 -1
  320. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts +3 -3
  321. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  322. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js +20 -11
  323. package/packages/gsd-agent-modes/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  324. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts +4 -3
  325. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.d.ts.map +1 -1
  326. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js +5 -54
  327. package/packages/gsd-agent-modes/dist/modes/interactive/components/chat-turn-connect.js.map +1 -1
  328. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -4
  329. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  330. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js +2 -4
  331. package/packages/gsd-agent-modes/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  332. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts +2 -0
  333. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  334. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js +4 -0
  335. package/packages/gsd-agent-modes/dist/modes/interactive/components/custom-editor.js.map +1 -1
  336. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts +9 -12
  337. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.d.ts.map +1 -1
  338. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js +100 -166
  339. package/packages/gsd-agent-modes/dist/modes/interactive/components/footer.js.map +1 -1
  340. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts +2 -0
  341. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.d.ts.map +1 -0
  342. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js +4 -0
  343. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-progress-state.js.map +1 -0
  344. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts +23 -0
  345. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.d.ts.map +1 -0
  346. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js +178 -0
  347. package/packages/gsd-agent-modes/dist/modes/interactive/components/gsd-status-widget.js.map +1 -0
  348. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts +8 -0
  349. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  350. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js +21 -9
  351. package/packages/gsd-agent-modes/dist/modes/interactive/components/login-dialog.js.map +1 -1
  352. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -3
  353. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  354. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js +2 -3
  355. package/packages/gsd-agent-modes/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  356. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +3 -0
  357. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  358. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +37 -15
  359. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  360. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +69 -3
  361. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  362. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +223 -32
  363. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  364. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts +3 -3
  365. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  366. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js +19 -19
  367. package/packages/gsd-agent-modes/dist/modes/interactive/components/user-message.js.map +1 -1
  368. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts +3 -0
  369. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  370. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js +26 -10
  371. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  372. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.d.ts.map +1 -1
  373. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js +12 -1
  374. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/extension-ui-controller.js.map +1 -1
  375. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  376. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js +5 -0
  377. package/packages/gsd-agent-modes/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  378. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  379. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js +3 -1
  380. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  381. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.d.ts.map +1 -1
  382. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js +3 -5
  383. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-chat-render.js.map +1 -1
  384. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js +2 -2
  385. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  386. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts +1 -0
  387. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.d.ts.map +1 -1
  388. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js +25 -0
  389. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-extension-widgets.js.map +1 -1
  390. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.d.ts.map +1 -1
  391. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js +1 -0
  392. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-key-handlers.js.map +1 -1
  393. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts +1 -0
  394. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.d.ts.map +1 -1
  395. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js +20 -49
  396. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-init.js.map +1 -1
  397. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts +4 -0
  398. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  399. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  400. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +9 -2
  401. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  402. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +31 -6
  403. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  404. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.d.ts.map +1 -1
  405. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js +0 -1
  406. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-ui-messaging.js.map +1 -1
  407. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  408. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js +3 -0
  409. package/packages/gsd-agent-modes/dist/modes/rpc/rpc-mode.js.map +1 -1
  410. package/packages/gsd-agent-modes/package.json +7 -7
  411. package/packages/mcp-server/README.md +10 -0
  412. package/packages/mcp-server/dist/cli-errors.d.ts +11 -0
  413. package/packages/mcp-server/dist/cli-errors.d.ts.map +1 -1
  414. package/packages/mcp-server/dist/cli-errors.js +12 -0
  415. package/packages/mcp-server/dist/cli-errors.js.map +1 -1
  416. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -1
  417. package/packages/mcp-server/dist/cli-runner.js +33 -0
  418. package/packages/mcp-server/dist/cli-runner.js.map +1 -1
  419. package/packages/mcp-server/dist/cli.d.ts +1 -0
  420. package/packages/mcp-server/dist/cli.d.ts.map +1 -1
  421. package/packages/mcp-server/dist/cli.js +1 -0
  422. package/packages/mcp-server/dist/cli.js.map +1 -1
  423. package/packages/mcp-server/dist/server.d.ts +29 -0
  424. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  425. package/packages/mcp-server/dist/server.js +82 -3
  426. package/packages/mcp-server/dist/server.js.map +1 -1
  427. package/packages/mcp-server/package.json +21 -5
  428. package/packages/native/package.json +1 -1
  429. package/packages/pi-agent-core/dist/agent-loop.js +9 -0
  430. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  431. package/packages/pi-agent-core/package.json +1 -1
  432. package/packages/pi-ai/package.json +1 -1
  433. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts +28 -2
  434. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/core/extensions/extension-upstream-types.js.map +1 -1
  436. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  437. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  438. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  439. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -1
  440. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  441. package/packages/pi-coding-agent/dist/core/extensions/runner.js +3 -1
  442. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  443. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  444. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  445. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  446. package/packages/pi-coding-agent/package.json +8 -8
  447. package/packages/pi-tui/dist/autocomplete.d.ts.map +1 -1
  448. package/packages/pi-tui/dist/autocomplete.js +6 -1
  449. package/packages/pi-tui/dist/autocomplete.js.map +1 -1
  450. package/packages/pi-tui/dist/components/input.js +1 -1
  451. package/packages/pi-tui/dist/components/input.js.map +1 -1
  452. package/packages/pi-tui/dist/components/loader.d.ts.map +1 -1
  453. package/packages/pi-tui/dist/components/loader.js +1 -0
  454. package/packages/pi-tui/dist/components/loader.js.map +1 -1
  455. package/packages/pi-tui/dist/components/select-list.d.ts.map +1 -1
  456. package/packages/pi-tui/dist/components/select-list.js +8 -2
  457. package/packages/pi-tui/dist/components/select-list.js.map +1 -1
  458. package/packages/pi-tui/package.json +2 -2
  459. package/packages/rpc-client/package.json +2 -2
  460. package/pkg/package.json +1 -1
  461. package/src/resources/GSD-WORKFLOW.md +22 -22
  462. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +80 -0
  463. package/src/resources/extensions/claude-code-cli/index.ts +8 -1
  464. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +83 -20
  465. package/src/resources/extensions/claude-code-cli/tests/index.test.ts +47 -0
  466. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +182 -10
  467. package/src/resources/extensions/google-cli/stream-adapter.ts +22 -1
  468. package/src/resources/extensions/gsd/auto/dispatch-history.ts +19 -1
  469. package/src/resources/extensions/gsd/auto/loop.ts +69 -2
  470. package/src/resources/extensions/gsd/auto/orchestrator.ts +63 -10
  471. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +13 -1
  472. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +25 -3
  473. package/src/resources/extensions/gsd/auto-artifact-paths.ts +83 -20
  474. package/src/resources/extensions/gsd/auto-closeout-messaging.ts +90 -0
  475. package/src/resources/extensions/gsd/auto-dashboard.ts +310 -454
  476. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  477. package/src/resources/extensions/gsd/auto-dispatch.ts +57 -12
  478. package/src/resources/extensions/gsd/auto-model-selection.ts +27 -5
  479. package/src/resources/extensions/gsd/auto-post-unit.ts +52 -31
  480. package/src/resources/extensions/gsd/auto-prompts.ts +45 -30
  481. package/src/resources/extensions/gsd/auto-recovery.ts +126 -37
  482. package/src/resources/extensions/gsd/auto-runtime-state.ts +13 -0
  483. package/src/resources/extensions/gsd/auto-start.ts +82 -36
  484. package/src/resources/extensions/gsd/auto-verification.ts +5 -7
  485. package/src/resources/extensions/gsd/auto-worktree.ts +83 -15
  486. package/src/resources/extensions/gsd/auto.ts +133 -32
  487. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +45 -61
  488. package/src/resources/extensions/gsd/bootstrap/fallback-continuation.ts +31 -0
  489. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +23 -2
  490. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +123 -9
  491. package/src/resources/extensions/gsd/bootstrap/system-context.ts +185 -46
  492. package/src/resources/extensions/gsd/bootstrap/tool-search-shim.ts +21 -3
  493. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +138 -29
  494. package/src/resources/extensions/gsd/closeout-consistency-gate.ts +107 -3
  495. package/src/resources/extensions/gsd/closeout-wizard.ts +11 -2
  496. package/src/resources/extensions/gsd/codebase-generator.ts +6 -9
  497. package/src/resources/extensions/gsd/commands/catalog.ts +6 -0
  498. package/src/resources/extensions/gsd/commands/dispatcher.ts +3 -0
  499. package/src/resources/extensions/gsd/commands/gsd-core-aliases-handler.ts +48 -0
  500. package/src/resources/extensions/gsd/commands/gsd-core-aliases.ts +63 -0
  501. package/src/resources/extensions/gsd/commands/handlers/core.ts +58 -8
  502. package/src/resources/extensions/gsd/commands/handlers/ops.ts +230 -3
  503. package/src/resources/extensions/gsd/commands-cmux.ts +3 -0
  504. package/src/resources/extensions/gsd/commands-gsd-core.ts +1142 -0
  505. package/src/resources/extensions/gsd/commands-handlers.ts +76 -1
  506. package/src/resources/extensions/gsd/commands-maintenance.ts +98 -2
  507. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +13 -0
  508. package/src/resources/extensions/gsd/commands-verdict.ts +16 -15
  509. package/src/resources/extensions/gsd/compat/compat-marker.ts +210 -0
  510. package/src/resources/extensions/gsd/compat/index.ts +12 -0
  511. package/src/resources/extensions/gsd/compat/planning-compat.ts +168 -0
  512. package/src/resources/extensions/gsd/config-overlay.ts +24 -9
  513. package/src/resources/extensions/gsd/consent-question.ts +11 -1
  514. package/src/resources/extensions/gsd/consent-verdict.ts +30 -1
  515. package/src/resources/extensions/gsd/dashboard-overlay.ts +41 -4
  516. package/src/resources/extensions/gsd/db/engine.ts +26 -0
  517. package/src/resources/extensions/gsd/db/queries.ts +78 -0
  518. package/src/resources/extensions/gsd/db/unit-dispatches.ts +24 -0
  519. package/src/resources/extensions/gsd/db/writers/reconcile.ts +24 -1
  520. package/src/resources/extensions/gsd/db-workspace.ts +15 -0
  521. package/src/resources/extensions/gsd/discussion-handoff.ts +9 -5
  522. package/src/resources/extensions/gsd/doctor-git-checks.ts +28 -3
  523. package/src/resources/extensions/gsd/doctor-providers.ts +1 -1
  524. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +12 -25
  525. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  526. package/src/resources/extensions/gsd/doctor.ts +30 -7
  527. package/src/resources/extensions/gsd/error-classifier.ts +14 -1
  528. package/src/resources/extensions/gsd/escalation.ts +9 -4
  529. package/src/resources/extensions/gsd/export-html.ts +11 -4
  530. package/src/resources/extensions/gsd/export.ts +88 -1
  531. package/src/resources/extensions/gsd/file-lock.ts +1 -1
  532. package/src/resources/extensions/gsd/flat-phase-migration.ts +205 -0
  533. package/src/resources/extensions/gsd/forensics.ts +2 -1
  534. package/src/resources/extensions/gsd/git-constants.ts +1 -1
  535. package/src/resources/extensions/gsd/git-service.ts +7 -2
  536. package/src/resources/extensions/gsd/gitignore.ts +7 -3
  537. package/src/resources/extensions/gsd/guidance.ts +7 -7
  538. package/src/resources/extensions/gsd/guided-flow.ts +11 -6
  539. package/src/resources/extensions/gsd/layout-policy.ts +85 -0
  540. package/src/resources/extensions/gsd/markdown-renderer.ts +404 -104
  541. package/src/resources/extensions/gsd/mcp-filter.ts +59 -10
  542. package/src/resources/extensions/gsd/md-importer.ts +215 -65
  543. package/src/resources/extensions/gsd/metrics.ts +23 -10
  544. package/src/resources/extensions/gsd/migrate/layout-detect.ts +38 -0
  545. package/src/resources/extensions/gsd/migrate/planning-writer.ts +259 -0
  546. package/src/resources/extensions/gsd/migrate-external.ts +49 -6
  547. package/src/resources/extensions/gsd/migration-auto-check.ts +4 -13
  548. package/src/resources/extensions/gsd/milestone-actions.ts +5 -2
  549. package/src/resources/extensions/gsd/milestone-closeout.ts +13 -2
  550. package/src/resources/extensions/gsd/milestone-ids.ts +49 -19
  551. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +8 -0
  552. package/src/resources/extensions/gsd/milestone-validation-verdict.ts +7 -9
  553. package/src/resources/extensions/gsd/model-router.ts +98 -18
  554. package/src/resources/extensions/gsd/notification-store.ts +17 -28
  555. package/src/resources/extensions/gsd/notifications.ts +37 -6
  556. package/src/resources/extensions/gsd/observability-validator.ts +12 -4
  557. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +151 -31
  558. package/src/resources/extensions/gsd/parsers-legacy.ts +42 -15
  559. package/src/resources/extensions/gsd/paths.ts +348 -39
  560. package/src/resources/extensions/gsd/planning-depth.ts +2 -1
  561. package/src/resources/extensions/gsd/post-execution-checks.ts +43 -3
  562. package/src/resources/extensions/gsd/preferences-models.ts +47 -13
  563. package/src/resources/extensions/gsd/preferences.ts +188 -14
  564. package/src/resources/extensions/gsd/prompts/ai-integration-phase.md +28 -0
  565. package/src/resources/extensions/gsd/prompts/audit-fix.md +39 -0
  566. package/src/resources/extensions/gsd/prompts/audit-milestone.md +26 -0
  567. package/src/resources/extensions/gsd/prompts/audit-uat.md +24 -0
  568. package/src/resources/extensions/gsd/prompts/autonomous.md +31 -0
  569. package/src/resources/extensions/gsd/prompts/code-review.md +37 -0
  570. package/src/resources/extensions/gsd/prompts/complete-milestone.md +8 -2
  571. package/src/resources/extensions/gsd/prompts/complete-slice.md +24 -15
  572. package/src/resources/extensions/gsd/prompts/discuss-phase.md +31 -0
  573. package/src/resources/extensions/gsd/prompts/docs-update.md +13 -0
  574. package/src/resources/extensions/gsd/prompts/execute-phase.md +33 -0
  575. package/src/resources/extensions/gsd/prompts/execute-task.md +5 -1
  576. package/src/resources/extensions/gsd/prompts/explore.md +58 -0
  577. package/src/resources/extensions/gsd/prompts/graphify.md +27 -0
  578. package/src/resources/extensions/gsd/prompts/health.md +37 -0
  579. package/src/resources/extensions/gsd/prompts/import.md +30 -0
  580. package/src/resources/extensions/gsd/prompts/inbox.md +27 -0
  581. package/src/resources/extensions/gsd/prompts/ingest-docs.md +30 -0
  582. package/src/resources/extensions/gsd/prompts/manager.md +21 -0
  583. package/src/resources/extensions/gsd/prompts/map-codebase.md +42 -0
  584. package/src/resources/extensions/gsd/prompts/milestone-summary.md +27 -0
  585. package/src/resources/extensions/gsd/prompts/mvp-phase.md +23 -0
  586. package/src/resources/extensions/gsd/prompts/pause-work.md +24 -0
  587. package/src/resources/extensions/gsd/prompts/phase.md +22 -0
  588. package/src/resources/extensions/gsd/prompts/plan-phase.md +34 -0
  589. package/src/resources/extensions/gsd/prompts/plan-review-convergence.md +34 -0
  590. package/src/resources/extensions/gsd/prompts/profile-user.md +28 -0
  591. package/src/resources/extensions/gsd/prompts/progress.md +30 -0
  592. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  593. package/src/resources/extensions/gsd/prompts/reactive-execute.md +2 -2
  594. package/src/resources/extensions/gsd/prompts/resume-work.md +20 -0
  595. package/src/resources/extensions/gsd/prompts/review-backlog.md +21 -0
  596. package/src/resources/extensions/gsd/prompts/review.md +27 -0
  597. package/src/resources/extensions/gsd/prompts/run-uat.md +5 -1
  598. package/src/resources/extensions/gsd/prompts/secure-phase.md +24 -0
  599. package/src/resources/extensions/gsd/prompts/settings.md +24 -0
  600. package/src/resources/extensions/gsd/prompts/sketch.md +59 -0
  601. package/src/resources/extensions/gsd/prompts/spec-phase.md +29 -0
  602. package/src/resources/extensions/gsd/prompts/spike.md +59 -0
  603. package/src/resources/extensions/gsd/prompts/stats.md +43 -0
  604. package/src/resources/extensions/gsd/prompts/surface.md +25 -0
  605. package/src/resources/extensions/gsd/prompts/thread.md +24 -0
  606. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  607. package/src/resources/extensions/gsd/prompts/ui-phase.md +29 -0
  608. package/src/resources/extensions/gsd/prompts/ui-review.md +29 -0
  609. package/src/resources/extensions/gsd/prompts/ultraplan-phase.md +24 -0
  610. package/src/resources/extensions/gsd/prompts/validate-phase.md +26 -0
  611. package/src/resources/extensions/gsd/prompts/verify-work.md +24 -0
  612. package/src/resources/extensions/gsd/prompts/workspace.md +22 -0
  613. package/src/resources/extensions/gsd/prompts/workstreams.md +24 -0
  614. package/src/resources/extensions/gsd/provider-error-guidance.ts +32 -0
  615. package/src/resources/extensions/gsd/queue-order.ts +3 -2
  616. package/src/resources/extensions/gsd/recovery-classification.ts +7 -0
  617. package/src/resources/extensions/gsd/roadmap-slices.ts +1 -1
  618. package/src/resources/extensions/gsd/safety/content-validator.ts +2 -1
  619. package/src/resources/extensions/gsd/safety/evidence-cross-ref.ts +45 -1
  620. package/src/resources/extensions/gsd/service-tier.ts +2 -0
  621. package/src/resources/extensions/gsd/session-lock.ts +15 -13
  622. package/src/resources/extensions/gsd/skills/gsd-headless/SKILL.md +3 -0
  623. package/src/resources/extensions/gsd/skills/gsd-headless/references/commands.md +51 -0
  624. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +58 -14
  625. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +22 -2
  626. package/src/resources/extensions/gsd/state-reconciliation/drift/external-markdown-edit.ts +105 -0
  627. package/src/resources/extensions/gsd/state-reconciliation/drift/external-planning-edit.ts +180 -0
  628. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +19 -6
  629. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +2 -2
  630. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +98 -26
  631. package/src/resources/extensions/gsd/state-reconciliation/index.ts +36 -3
  632. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +12 -0
  633. package/src/resources/extensions/gsd/state-reconciliation/types.ts +19 -0
  634. package/src/resources/extensions/gsd/state.ts +57 -15
  635. package/src/resources/extensions/gsd/sync-lock.ts +11 -20
  636. package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-01-PLAN.md +13 -0
  637. package/src/resources/extensions/gsd/tests/__fixtures__/flat-phase/.gsd/phases/01-foundation/01-ROADMAP.md +8 -0
  638. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/M001-ROADMAP.md +13 -0
  639. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/m001-basic/.gsd/milestones/M001/slices/S01/S01-PLAN.md +5 -0
  640. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/PROJECT.md +1 -0
  641. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/ROADMAP.md +5 -0
  642. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/STATE.md +10 -0
  643. package/src/resources/extensions/gsd/tests/__fixtures__/round-trip/planning-flat-phases/.planning/phases/01-foundation/01-01-PLAN.md +13 -0
  644. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +322 -1
  645. package/src/resources/extensions/gsd/tests/auto-closeout-messaging.test.ts +71 -0
  646. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +68 -116
  647. package/src/resources/extensions/gsd/tests/auto-direct-dispatch-parse.test.ts +33 -0
  648. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +104 -0
  649. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +32 -1
  650. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +7 -2
  651. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +10 -0
  652. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +28 -22
  653. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +11 -2
  654. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +19 -2
  655. package/src/resources/extensions/gsd/tests/auto-verification.test.ts +36 -0
  656. package/src/resources/extensions/gsd/tests/auto-worktree-auto-resolve.test.ts +17 -0
  657. package/src/resources/extensions/gsd/tests/blocker-placeholder-logs.test.ts +218 -0
  658. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +15 -11
  659. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +89 -0
  660. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +37 -1
  661. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +31 -30
  662. package/src/resources/extensions/gsd/tests/commands-gsd-core.test.ts +862 -0
  663. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +1 -1
  664. package/src/resources/extensions/gsd/tests/compat-health-line.test.ts +102 -0
  665. package/src/resources/extensions/gsd/tests/compat-marker-invalidation.test.ts +51 -0
  666. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +105 -0
  667. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +6 -2
  668. package/src/resources/extensions/gsd/tests/complete-slice-reopen-handoff.test.ts +82 -0
  669. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +7 -7
  670. package/src/resources/extensions/gsd/tests/complete-task.test.ts +7 -7
  671. package/src/resources/extensions/gsd/tests/consent-question.test.ts +45 -0
  672. package/src/resources/extensions/gsd/tests/core-overlay-fallback.test.ts +1 -0
  673. package/src/resources/extensions/gsd/tests/dashboard-overlay.test.ts +37 -0
  674. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
  675. package/src/resources/extensions/gsd/tests/db-engine-logs.test.ts +207 -0
  676. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +63 -1
  677. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +49 -5
  678. package/src/resources/extensions/gsd/tests/discuss-cold-start-db-open.test.ts +10 -27
  679. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +20 -1
  680. package/src/resources/extensions/gsd/tests/dispatch-db-degradation-logs.test.ts +98 -0
  681. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +102 -0
  682. package/src/resources/extensions/gsd/tests/dispatch-logs.test.ts +103 -0
  683. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +38 -49
  684. package/src/resources/extensions/gsd/tests/dispatch-reactive-logs.test.ts +98 -0
  685. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +7 -0
  686. package/src/resources/extensions/gsd/tests/doctor-git-checks-autoresolve.test.ts +149 -0
  687. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +6 -4
  688. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +17 -10
  689. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +95 -0
  690. package/src/resources/extensions/gsd/tests/export-html-enhancements.test.ts +25 -0
  691. package/src/resources/extensions/gsd/tests/export-memory.test.ts +179 -0
  692. package/src/resources/extensions/gsd/tests/extension-bootstrap-isolation.test.ts +53 -0
  693. package/src/resources/extensions/gsd/tests/external-markdown-edit.test.ts +137 -0
  694. package/src/resources/extensions/gsd/tests/external-planning-edit.test.ts +199 -0
  695. package/src/resources/extensions/gsd/tests/fallback-continuation.test.ts +36 -0
  696. package/src/resources/extensions/gsd/tests/file-lock.test.ts +43 -0
  697. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +114 -0
  698. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +83 -0
  699. package/src/resources/extensions/gsd/tests/flat-phase-round-trip.test.ts +72 -0
  700. package/src/resources/extensions/gsd/tests/flat-phase-validation-integration.test.ts +120 -0
  701. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +74 -0
  702. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -1
  703. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +40 -7
  704. package/src/resources/extensions/gsd/tests/gsd-core-parity-routing.test.ts +183 -0
  705. package/src/resources/extensions/gsd/tests/guidance.test.ts +25 -0
  706. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +19 -11
  707. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +75 -0
  708. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +6 -2
  709. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +55 -0
  710. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +4 -3
  711. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +11 -7
  712. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -0
  713. package/src/resources/extensions/gsd/tests/knowledge-cold-start.test.ts +372 -0
  714. package/src/resources/extensions/gsd/tests/layout-policy.test.ts +59 -0
  715. package/src/resources/extensions/gsd/tests/loop.test.ts +60 -0
  716. package/src/resources/extensions/gsd/tests/markdown-renderer-parse-cache.test.ts +1 -1
  717. package/src/resources/extensions/gsd/tests/markdown-renderer.test.ts +214 -82
  718. package/src/resources/extensions/gsd/tests/mcp-filter.test.ts +74 -1
  719. package/src/resources/extensions/gsd/tests/metrics-ledger-cap.test.ts +239 -0
  720. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +7 -2
  721. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +6 -1
  722. package/src/resources/extensions/gsd/tests/model-router.test.ts +343 -7
  723. package/src/resources/extensions/gsd/tests/notification-store.test.ts +23 -0
  724. package/src/resources/extensions/gsd/tests/notifications.test.ts +33 -0
  725. package/src/resources/extensions/gsd/tests/oauth-api-model-routing.test.ts +13 -1
  726. package/src/resources/extensions/gsd/tests/observability-validator-boundary.test.ts +194 -0
  727. package/src/resources/extensions/gsd/tests/orchestrator-legacy-parity.test.ts +1 -1
  728. package/src/resources/extensions/gsd/tests/orchestrator-logs.test.ts +339 -0
  729. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +52 -1
  730. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +91 -0
  731. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +7 -2
  732. package/src/resources/extensions/gsd/tests/plan-milestone-sketch-render.test.ts +7 -2
  733. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +9 -6
  734. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +58 -23
  735. package/src/resources/extensions/gsd/tests/plan-task.test.ts +4 -4
  736. package/src/resources/extensions/gsd/tests/planning-crossval.test.ts +19 -0
  737. package/src/resources/extensions/gsd/tests/planning-layout-detect.test.ts +84 -0
  738. package/src/resources/extensions/gsd/tests/planning-marker.test.ts +107 -0
  739. package/src/resources/extensions/gsd/tests/planning-projection-hook.test.ts +123 -0
  740. package/src/resources/extensions/gsd/tests/planning-round-trip-property.test.ts +164 -0
  741. package/src/resources/extensions/gsd/tests/planning-writer.test.ts +82 -0
  742. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +48 -1
  743. package/src/resources/extensions/gsd/tests/preferences.test.ts +47 -1
  744. package/src/resources/extensions/gsd/tests/prefs-missing-models-crash.test.ts +35 -4
  745. package/src/resources/extensions/gsd/tests/progress-strip-test-helpers.ts +79 -0
  746. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +2 -0
  747. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +16 -0
  748. package/src/resources/extensions/gsd/tests/provider-error-guidance.test.ts +15 -0
  749. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +107 -0
  750. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +22 -13
  751. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +9 -8
  752. package/src/resources/extensions/gsd/tests/reconcile-logs.test.ts +244 -0
  753. package/src/resources/extensions/gsd/tests/recovery-finalize-logs.test.ts +119 -0
  754. package/src/resources/extensions/gsd/tests/recovery-verify-logs.test.ts +428 -0
  755. package/src/resources/extensions/gsd/tests/register-extension-guard.test.ts +25 -0
  756. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +79 -4
  757. package/src/resources/extensions/gsd/tests/replan-handler.test.ts +4 -4
  758. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +5 -5
  759. package/src/resources/extensions/gsd/tests/round-trip-property.test.ts +137 -0
  760. package/src/resources/extensions/gsd/tests/session-lock-transient-read.test.ts +28 -2
  761. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +68 -0
  762. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +3 -0
  763. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +1 -0
  764. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +7 -1
  765. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +155 -58
  766. package/src/resources/extensions/gsd/tests/stop-backtrack.test.ts +6 -2
  767. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +85 -0
  768. package/src/resources/extensions/gsd/tests/sync-lock.test.ts +23 -0
  769. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +29 -1
  770. package/src/resources/extensions/gsd/tests/terminal-tool-surface-classification.test.ts +80 -0
  771. package/src/resources/extensions/gsd/tests/thinking-level-resolution.test.ts +1 -1
  772. package/src/resources/extensions/gsd/tests/tool-schema-model-fallback.test.ts +64 -0
  773. package/src/resources/extensions/gsd/tests/tool-search-shim.test.ts +71 -0
  774. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +26 -7
  775. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +23 -0
  776. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +40 -86
  777. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +44 -6
  778. package/src/resources/extensions/gsd/tests/undo.test.ts +39 -37
  779. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +22 -0
  780. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +62 -0
  781. package/src/resources/extensions/gsd/tests/uok-audit.test.ts +194 -0
  782. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +72 -1
  783. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +9 -1
  784. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +51 -0
  785. package/src/resources/extensions/gsd/tests/validation-gate-patterns.test.ts +34 -6
  786. package/src/resources/extensions/gsd/tests/verify-artifact-tightened.test.ts +90 -0
  787. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +87 -0
  788. package/src/resources/extensions/gsd/tests/visualizer-views.test.ts +27 -0
  789. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +51 -0
  790. package/src/resources/extensions/gsd/tests/workflow-mcp-preflight.test.ts +133 -0
  791. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +34 -8
  792. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +3 -4
  793. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +64 -8
  794. package/src/resources/extensions/gsd/tests/worktree-health.test.ts +43 -3
  795. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +62 -0
  796. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +39 -18
  797. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +75 -3
  798. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +4 -1
  799. package/src/resources/extensions/gsd/tests/write-gate.test.ts +103 -0
  800. package/src/resources/extensions/gsd/tool-surface-readiness.ts +226 -16
  801. package/src/resources/extensions/gsd/tools/complete-milestone.ts +4 -7
  802. package/src/resources/extensions/gsd/tools/complete-slice.ts +12 -9
  803. package/src/resources/extensions/gsd/tools/complete-task.ts +15 -1
  804. package/src/resources/extensions/gsd/tools/exec-tool.ts +2 -118
  805. package/src/resources/extensions/gsd/tools/plan-slice.ts +1 -3
  806. package/src/resources/extensions/gsd/tools/plan-task.ts +17 -1
  807. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +9 -10
  808. package/src/resources/extensions/gsd/tools/validate-milestone.ts +8 -13
  809. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +43 -4
  810. package/src/resources/extensions/gsd/triage-resolution.ts +14 -7
  811. package/src/resources/extensions/gsd/tui/render-kit.ts +56 -13
  812. package/src/resources/extensions/gsd/undo.ts +8 -9
  813. package/src/resources/extensions/gsd/unit-registry.ts +27 -3
  814. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +60 -1
  815. package/src/resources/extensions/gsd/validation-block-guard.ts +46 -0
  816. package/src/resources/extensions/gsd/visualizer-data.ts +55 -0
  817. package/src/resources/extensions/gsd/visualizer-views.ts +27 -2
  818. package/src/resources/extensions/gsd/workflow-logger.ts +5 -0
  819. package/src/resources/extensions/gsd/workflow-mcp.ts +12 -1
  820. package/src/resources/extensions/gsd/workflow-projections.ts +24 -4
  821. package/src/resources/extensions/gsd/worktree-command.ts +6 -6
  822. package/src/resources/extensions/gsd/worktree-health.ts +6 -3
  823. package/src/resources/extensions/gsd/worktree-manager.ts +122 -16
  824. package/src/resources/extensions/gsd/worktree-safety.ts +31 -11
  825. package/src/resources/extensions/gsd/worktree-shell-guard.ts +123 -0
  826. package/src/resources/extensions/mcp-client/manager.ts +3 -3
  827. package/src/resources/extensions/search-the-web/index.ts +45 -9
  828. package/src/resources/extensions/search-the-web/native-search.ts +16 -4
  829. package/src/resources/extensions/shared/gsd-browser-cli.ts +41 -2
  830. package/src/resources/extensions/subagent/index.ts +20 -15
  831. package/src/resources/extensions/subagent/tests/worktree-cwd.test.ts +57 -0
  832. package/src/resources/extensions/subagent/worktree-cwd.ts +35 -0
  833. package/dist/web/standalone/.next/static/chunks/8785.2e5a118797fb2dd2.js +0 -1
  834. /package/dist/web/standalone/.next/static/{2T9IOdiiM3o3gZ4UbPi8E → BTKtGFF1Y-hvVJEGhBRo9}/_buildManifest.js +0 -0
  835. /package/dist/web/standalone/.next/static/{2T9IOdiiM3o3gZ4UbPi8E → BTKtGFF1Y-hvVJEGhBRo9}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-design.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/transcript-design.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Shared recommended transcript rendering primitives for assistant, tool, command, footer, and auto-mode TUI surfaces.\n\nimport { alignRight, isImageLine, padRight, style, truncateToWidth, visibleWidth } from \"@gsd/pi-tui\";\nimport { theme, type ThemeBg, type ThemeColor } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { formatTimestamp, type TimestampFormat } from \"./timestamp.js\";\n\nexport type StatusTone = \"running\" | \"success\" | \"error\" | \"warning\" | \"muted\";\nexport type TuiTone = \"default\" | \"accent\" | \"success\" | \"warning\" | \"error\" | \"muted\";\nexport type TuiBreakpoint = \"compact\" | \"regular\" | \"wide\";\n\n/** Conversation/system surfaces that the chat frame distinguishes by color. */\nexport type FrameTone = \"assistant\" | \"user\" | \"compaction\" | \"skill\";\n\nexport function chatMessageWidth(width: number): number {\n\treturn Math.max(24, Math.min(width, Math.floor(width * 0.72)));\n}\n\n/** Outer indent for user turns and tool/work cards in the connected transcript. */\nexport const TRANSCRIPT_CARD_INDENT = 4;\nconst RUNNING_RAIL_FRAME_MS = 70;\nconst RUNNING_RAIL_TRAIL = 5;\nconst HORIZONTAL_RAIL = \"─\";\nconst HORIZONTAL_RAIL_HEAD = \"━\";\n\n// Whether the \"running\" rail sweeps (animates) or renders as a static rule. User\n// setting `terminal.toolRailAnimation` (default on). When off, running cards show\n// a static rail and ToolExecutionComponent does not arm its re-render timer, so a\n// long-running tool costs zero idle CPU. Module-level (not per-card) because every\n// running card shares the one preference; the interactive mode sets it at startup\n// and when the setting is toggled.\nlet railAnimationEnabled = true;\nexport function setRailAnimationEnabled(enabled: boolean): void {\n\trailAnimationEnabled = enabled;\n}\nexport function isRailAnimationEnabled(): boolean {\n\treturn railAnimationEnabled;\n}\n\nexport function headerLabel(text: string): string {\n\treturn text.toUpperCase();\n}\n\nfunction styledHeader(text: string, color: ThemeColor): string {\n\treturn theme.fg(color, theme.bold(headerLabel(text)));\n}\n\nfunction indentSpaces(cols: number): string {\n\treturn cols > 0 ? \" \".repeat(cols) : \"\";\n}\n\nfunction connectedRuleFill(width: number, indent = TRANSCRIPT_CARD_INDENT): string {\n\treturn \"─\".repeat(Math.max(16, Math.min(40, width - indent - 1)));\n}\n\nfunction runningRailFrame(): number {\n\treturn Math.floor(Date.now() / RUNNING_RAIL_FRAME_MS);\n}\n\nfunction trianglePosition(frame: number, maxPosition: number): number {\n\tconst max = Math.max(0, maxPosition);\n\tif (max === 0) return 0;\n\tconst period = max * 2;\n\tconst step = frame % period;\n\treturn step <= max ? step : period - step;\n}\n\nfunction renderRailText(text: string, railColor: ThemeColor, sweepFrame?: number): string {\n\tif (sweepFrame === undefined) return theme.fg(railColor, text);\n\n\tconst railCells = Array.from(text).filter((char) => char === HORIZONTAL_RAIL).length;\n\tconst head = trianglePosition(sweepFrame, railCells - 1);\n\tlet railIndex = -1;\n\tlet rendered = \"\";\n\n\tfor (const char of text) {\n\t\tif (char !== HORIZONTAL_RAIL) {\n\t\t\trendered += theme.fg(railColor, char);\n\t\t\tcontinue;\n\t\t}\n\n\t\trailIndex++;\n\t\tconst distance = Math.abs(railIndex - head);\n\t\tif (distance === 0) {\n\t\t\trendered += theme.fg(railColor, theme.bold(HORIZONTAL_RAIL_HEAD));\n\t\t} else if (distance <= RUNNING_RAIL_TRAIL) {\n\t\t\trendered += theme.fg(railColor, HORIZONTAL_RAIL_HEAD);\n\t\t} else {\n\t\t\trendered += theme.fg(railColor, HORIZONTAL_RAIL);\n\t\t}\n\t}\n\treturn rendered;\n}\n\nexport function renderChatTurnBridge(\n\twidth: number,\n\tfromIndent = TRANSCRIPT_CARD_INDENT,\n\trailColor: ThemeColor = \"borderAccent\",\n): string[] {\n\tconst bridge = indentSpaces(fromIndent) + \"╰──────╮\";\n\treturn [padLine(theme.fg(railColor, bridge), width)];\n}\n\n/** Bridge from a left-pegged assistant turn down into the next indented user turn. */\nexport function renderChatTurnBridgeToUser(\n\twidth: number,\n\trailColor: ThemeColor = \"border\",\n): string[] {\n\tconst bridge = \"╰──────╮\";\n\treturn [padLine(theme.fg(railColor, bridge), width)];\n}\n\nexport function renderConnectedCard(\n\twidth: number,\n\ttitle: string,\n\tbodyLines: string[],\n\topts: {\n\t\tindent?: number;\n\t\ttitleRight?: string;\n\t\trailColor?: ThemeColor;\n\t\ttitleColor?: ThemeColor;\n\t\tbodyBg?: ThemeBg;\n\t\tcloseBottom?: boolean;\n\t\trailSweep?: boolean;\n\t} = {},\n): string[] {\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst prefix = indentSpaces(indent);\n\tconst railColor = opts.railColor ?? \"borderAccent\";\n\tconst sweepFrame = opts.railSweep && railAnimationEnabled ? runningRailFrame() : undefined;\n\tconst rail = (text: string) => renderRailText(text, railColor, sweepFrame);\n\tconst resolvedTitleColor =\n\t\topts.titleColor ??\n\t\t(title.includes(\"✕\") ? \"error\" : title.includes(\"✓\") ? \"success\" : railColor);\n\tconst titleStyled = theme.fg(resolvedTitleColor, theme.bold(headerLabel(title)));\n\tconst lead = prefix + rail(\"╭─ \") + titleStyled;\n\tlet topLine = lead;\n\tif (opts.titleRight) {\n\t\tconst available = width - visibleWidth(lead) - 1;\n\t\tconst rightWidth = visibleWidth(opts.titleRight);\n\t\tif (rightWidth + 5 <= available) {\n\t\t\tconst fill = Math.max(1, available - rightWidth - 2);\n\t\t\ttopLine = lead + rail(\" \" + \"─\".repeat(fill) + \" \") + opts.titleRight;\n\t\t} else {\n\t\t\tconst clippedRight = truncateToWidth(opts.titleRight, Math.max(8, available - 5), \"\");\n\t\t\tconst fill = Math.max(1, available - visibleWidth(clippedRight) - 2);\n\t\t\ttopLine = lead + rail(\" \" + \"─\".repeat(fill) + \" \") + clippedRight;\n\t\t}\n\t}\n\tconst paintBody = (line: string) => {\n\t\t// Image (Kitty/iTerm2) sequence lines carry raw terminal graphics escapes and\n\t\t// rely on exact column/row positioning. Prepend the SAME left offset normal\n\t\t// body lines get (card indent + 3 spaces) so the image aligns under the card\n\t\t// text rather than hugging column 0, but do NOT padRight/truncate — trailing\n\t\t// padding or clipping after the sequence would corrupt the placement. The\n\t\t// leading spaces simply advance the cursor before the image draws.\n\t\tif (isImageLine(line)) {\n\t\t\treturn prefix + \" \" + line;\n\t\t}\n\t\tconst innerWidth = Math.max(1, width - indent);\n\t\tconst inner = padRight(\" \" + line, innerWidth);\n\t\tconst painted = opts.bodyBg ? theme.bg(opts.bodyBg, inner) : inner;\n\t\treturn prefix + painted;\n\t};\n\t// When the body contains an inline image, its reserved blank padding rows (the\n\t// rows the TUI counts so content below the image lands in the right place) must\n\t// NOT be trimmed/collapsed — trimming them collapses a tall image to one line\n\t// and the terminal then paints the full image over the chat and footer below.\n\tconst hasImage = bodyLines.some((l) => isImageLine(l));\n\tconst bodySource = hasImage ? bodyLines : trimOuterBlankLines(bodyLines);\n\tconst out = [padLine(topLine, width)];\n\tfor (const line of bodySource) {\n\t\tout.push(paintBody(line));\n\t}\n\tif (opts.closeBottom !== false) {\n\t\tout.push(padLine(prefix + rail(\"╰\" + connectedRuleFill(width, indent)), width));\n\t}\n\treturn out;\n}\n\nexport function trimOuterBlankLines(lines: string[]): string[] {\n\tlet start = 0;\n\tlet end = lines.length;\n\twhile (start < end && lines[start].trim().length === 0) start++;\n\twhile (end > start && lines[end - 1].trim().length === 0) end--;\n\treturn lines.slice(start, end);\n}\n\n/** Collapse runs of blank lines to a single blank line (tool output only). */\nexport function collapseBlankLines(lines: string[]): string[] {\n\tconst out: string[] = [];\n\tfor (const line of lines) {\n\t\tconst blank = line.trim().length === 0;\n\t\tif (blank && out.length > 0 && out[out.length - 1]!.trim().length === 0) continue;\n\t\tout.push(line);\n\t}\n\treturn trimOuterBlankLines(out);\n}\n\nfunction padLine(line: string, width: number): string {\n\treturn padRight(truncateToWidth(line, width, \"\"), width);\n}\n\nfunction toneColor(tone: StatusTone): ThemeColor {\n\tswitch (tone) {\n\t\tcase \"running\": return \"toolRunning\";\n\t\tcase \"success\": return \"border\";\n\t\tcase \"error\": return \"toolError\";\n\t\tcase \"warning\": return \"warning\";\n\t\tcase \"muted\":\n\t\tdefault: return \"toolMuted\";\n\t}\n}\n\nexport function breakpoint(width: number): TuiBreakpoint {\n\tif (width < 72) return \"compact\";\n\tif (width < 112) return \"regular\";\n\treturn \"wide\";\n}\n\nfunction panelToneColor(tone: TuiTone): ThemeColor {\n\tswitch (tone) {\n\t\tcase \"accent\": return \"borderAccent\";\n\t\tcase \"success\": return \"success\";\n\t\tcase \"warning\": return \"warning\";\n\t\tcase \"error\": return \"error\";\n\t\tcase \"muted\": return \"borderMuted\";\n\t\tcase \"default\":\n\t\tdefault: return \"border\";\n\t}\n}\n\nexport function badge(text: string, tone: TuiTone = \"default\"): string {\n\treturn theme.fg(panelToneColor(tone), text);\n}\n\nexport function keyValue(label: string, value: string, valueColor: ThemeColor = \"text\", labelWidth = 10): string {\n\treturn `${theme.fg(\"dim\", padRight(label, labelWidth))}${theme.fg(valueColor, value)}`;\n}\n\nexport function roundedPanel(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\ttone?: TuiTone;\n\t\ttitle?: string;\n\t\trightTitle?: string;\n\t\tpaddingX?: number;\n\t} = {},\n): string[] {\n\tconst outerWidth = Math.max(1, width);\n\tconst body = lines.length > 0 ? lines : [\"\"];\n\tif (outerWidth < 3) {\n\t\treturn body.map((line) => truncateToWidth(line, outerWidth, \"\"));\n\t}\n\n\tlet panel = style()\n\t\t.border(\"rounded\")\n\t\t.borderColor((text) => theme.fg(panelToneColor(opts.tone ?? \"default\"), text))\n\t\t.paddingX(Math.max(0, opts.paddingX ?? 0));\n\tif (opts.title) {\n\t\tpanel = panel.title(theme.fg(\"borderAccent\", opts.title));\n\t}\n\tif (opts.rightTitle) {\n\t\tpanel = panel.titleRight(theme.fg(\"dim\", opts.rightTitle));\n\t}\n\treturn panel.render(body, outerWidth);\n}\n\nexport function rightAlign(left: string, right: string, width: number): string {\n\treturn alignRight(left, right, width);\n}\n\n/**\n * Render a copy-clean content surface (ADR-019): a titled top rule, body\n * lines emitted with no border column or leading glyph, and a closing rule.\n * Selecting a body line in the terminal copies only its content.\n *\n * This is the target surface for transcript messages, tool output, and\n * summaries. Migration steps 3–5 move existing renderers onto it.\n */\nexport function openSurface(\n\tlines: string[],\n\twidth: number,\n\topts: { title: string; right?: string; tone: StatusTone; paddingX?: number },\n): string[] {\n\tconst tc = toneColor(opts.tone);\n\tlet surface = style()\n\t\t.border(\"open\")\n\t\t.title(opts.title, (text) => theme.fg(\"borderAccent\", text))\n\t\t.borderColor((text) => theme.fg(tc, text));\n\tif (opts.right) {\n\t\tsurface = surface.titleRight(opts.right, (text) => theme.fg(tc, text));\n\t}\n\tif (opts.paddingX !== undefined) {\n\t\tsurface = surface.paddingX(opts.paddingX);\n\t}\n\treturn surface.render(lines, Math.max(20, width));\n}\n\n/**\n * Render a framed system/conversation surface (compaction notices, skill\n * invocations) as a copy-clean open surface (ADR-019): a titled top rule\n * and body lines with no border column. Replaces the former chat-frame.ts.\n */\nexport function renderChatFrame(\n\tcontentLines: string[],\n\twidth: number,\n\topts: {\n\t\tlabel: string;\n\t\ttone: FrameTone;\n\t\ttimestamp?: number;\n\t\ttimestampFormat: TimestampFormat;\n\t\tshowTimestamp?: boolean;\n\t},\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst isPurple = opts.tone === \"compaction\" || opts.tone === \"skill\";\n\tconst frameColor: ThemeColor = opts.tone === \"user\" ? \"border\" : isPurple ? \"customMessageLabel\" : \"borderAccent\";\n\tconst bodyColor: ThemeColor =\n\t\topts.tone === \"user\" ? \"userMessageText\" : isPurple ? \"customMessageText\" : \"assistantMessageText\";\n\n\t// A label may carry a \" - \" splitting a bold name from a dim detail.\n\tconst dashIdx = opts.label.indexOf(\" - \");\n\tconst titleStyled =\n\t\tdashIdx >= 0\n\t\t\t? theme.fg(frameColor, theme.bold(opts.label.slice(0, dashIdx))) + theme.fg(\"dim\", opts.label.slice(dashIdx))\n\t\t\t: theme.fg(frameColor, theme.bold(opts.label));\n\tconst rightRaw =\n\t\topts.showTimestamp === false || !opts.timestamp ? \"\" : formatTimestamp(opts.timestamp, opts.timestampFormat);\n\n\tconst source = trimOuterBlankLines(contentLines);\n\tconst body = (source.length > 0 ? source : [\"\"]).map((line) => theme.fg(bodyColor, line));\n\n\tlet surface = style()\n\t\t.border(\"open\")\n\t\t.borderColor((text) => theme.fg(frameColor, text))\n\t\t.title(titleStyled);\n\tif (rightRaw) {\n\t\tsurface = surface.titleRight(theme.fg(\"dim\", rightRaw));\n\t}\n\treturn surface.render(body, outerWidth);\n}\n\nexport function renderAssistantRail(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\tlabel?: string;\n\t\tmeta?: string;\n\t\trailColor?: ThemeColor;\n\t\tconnected?: boolean;\n\t\tcontinuesToUser?: boolean;\n\t} = {},\n): string[] {\n\tconst railColor = opts.railColor ?? \"borderAccent\";\n\tconst source = trimOuterBlankLines(lines);\n\tconst body = (source.length > 0 ? source : [\"\"]).map((line) => theme.fg(\"assistantMessageText\", line));\n\tconst titleRight = opts.meta ? theme.fg(\"dim\", opts.meta) : undefined;\n\tconst card = renderConnectedCard(width, opts.label ?? \"GSD\", body, {\n\t\tindent: 0,\n\t\ttitleRight,\n\t\trailColor,\n\t\tcloseBottom: !opts.continuesToUser,\n\t});\n\tlet result = card;\n\tif (opts.connected) {\n\t\tresult = [...renderChatTurnBridge(width, TRANSCRIPT_CARD_INDENT), ...result];\n\t}\n\tif (opts.continuesToUser) {\n\t\tresult = [...result, ...renderChatTurnBridgeToUser(width)];\n\t}\n\treturn result;\n}\n\nexport function renderUserRail(\n\tlines: string[],\n\twidth: number,\n\topts: { label?: string; meta?: string; continuesToAssistant?: boolean },\n): string[] {\n\tconst source = trimOuterBlankLines(lines);\n\tconst body = (source.length > 0 ? source : [\"\"]).map((line) => theme.fg(\"userMessageText\", line));\n\tconst titleRight = opts.meta ? theme.fg(\"dim\", opts.meta) : undefined;\n\treturn renderConnectedCard(width, opts.label ?? \"You\", body, {\n\t\tindent: TRANSCRIPT_CARD_INDENT,\n\t\ttitleRight,\n\t\trailColor: \"border\",\n\t\ttitleColor: \"border\",\n\t\tcloseBottom: !opts.continuesToAssistant,\n\t});\n}\n\n/**\n * Render a single titled rule line — the collapsed form of a tool/command\n * card on the \"open\" surface. `title` and `right` must be pre-styled.\n */\nfunction openRuleLine(title: string, right: string, width: number, tone: ThemeColor, sweep = false): string {\n\tconst w = Math.max(20, width);\n\tif (!right) {\n\t\tconst clippedTitle = truncateToWidth(title, Math.max(0, w - 6), \"\");\n\t\tconst fill = Math.max(1, w - 5 - visibleWidth(clippedTitle));\n\t\treturn padLine(renderRailText(\"─── \", tone) + clippedTitle + renderRailText(` ${\"─\".repeat(fill)}`, tone), w);\n\t}\n\n\tconst titleBudget = Math.max(0, w - 11);\n\tconst rightReserve = titleBudget > 1 && visibleWidth(right) > 0 ? 1 : 0;\n\tconst leftBudget = Math.min(visibleWidth(title), Math.max(0, titleBudget - rightReserve));\n\tconst rightBudget = Math.max(0, titleBudget - leftBudget);\n\tconst clippedTitle = truncateToWidth(title, leftBudget, \"\");\n\tconst clippedRight = truncateToWidth(right, rightBudget, \"\");\n\tconst fixed = 4 + visibleWidth(clippedTitle) + 2 + visibleWidth(clippedRight) + 4;\n\tconst fill = Math.max(1, w - fixed);\n\tconst sweepFrame = sweep && railAnimationEnabled ? runningRailFrame() : undefined;\n\n\treturn padLine(\n\t\trenderRailText(\"─── \", tone) +\n\t\t\tclippedTitle +\n\t\t\trenderRailText(` ${\"─\".repeat(fill)} `, tone, sweepFrame) +\n\t\t\tclippedRight +\n\t\t\trenderRailText(\" ───\", tone),\n\t\tw,\n\t);\n}\n\nfunction indentRenderedLines(lines: string[], indent: number, width: number): string[] {\n\tif (indent <= 0) return lines;\n\tconst prefix = indentSpaces(indent);\n\treturn lines.map((line) => padLine(prefix + truncateToWidth(line, Math.max(1, width - indent), \"\"), width));\n}\n\nexport function renderTranscriptCard(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\ttitle: string;\n\t\tright?: string;\n\t\ttone: StatusTone;\n\t\tfooterLeft?: string;\n\t\tfooterRight?: string;\n\t\tindent?: number;\n\t},\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst tone = toneColor(opts.tone);\n\t// Preserve image padding rows (see renderConnectedCard) — trimming them would\n\t// collapse a tall inline image and make it overflow the card.\n\tconst body = lines.some((l) => isImageLine(l)) ? lines : trimOuterBlankLines(lines);\n\tlet titleRight = opts.right ? theme.fg(tone, opts.right) : undefined;\n\tif (opts.footerLeft || opts.footerRight) {\n\t\tconst hint = [opts.footerLeft, opts.footerRight].filter(Boolean).join(\" · \");\n\t\tconst hintStyled = theme.fg(\"dim\", hint);\n\t\ttitleRight = titleRight ? `${titleRight} · ${hintStyled}` : hintStyled;\n\t}\n\treturn renderConnectedCard(outerWidth, opts.title, body, {\n\t\tindent,\n\t\ttitleRight,\n\t\trailColor: tone,\n\t\trailSweep: opts.tone === \"running\",\n\t});\n}\n\nexport function renderToolLineCard(\n\ttitle: string,\n\ttarget: string | undefined,\n\twidth: number,\n\topts: { status: string; tone: StatusTone; hidden?: boolean; titlePrefix?: string; bg?: ThemeBg; indent?: number },\n): string[] {\n\tconst tone = toneColor(opts.tone);\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst innerWidth = Math.max(20, width - indent);\n\tconst titleText = `${opts.titlePrefix ?? \"\"}${styledHeader(title, \"borderAccent\")}${\n\t\ttarget ? ` ${theme.fg(\"text\", target)}` : \"\"\n\t}`;\n\tconst statusText = opts.hidden ? `${opts.status} · output hidden · ctrl+o expand` : opts.status;\n\tconst right = theme.fg(opts.tone === \"success\" ? \"success\" : tone, statusText);\n\tconst rule = openRuleLine(titleText, right, innerWidth, tone, opts.tone === \"running\");\n\tconst line = opts.bg ? theme.bg(opts.bg, rule) : rule;\n\treturn indentRenderedLines([line], indent, width);\n}\n\nexport function renderCommandCard(\n\tcommand: string,\n\twidth: number,\n\topts: { status: string; tone: StatusTone; progress?: string; indent?: number },\n): string[] {\n\tconst tone = toneColor(opts.tone);\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst innerWidth = Math.max(20, width - indent);\n\tconst titleText = `${theme.fg(\"accent\", \"$\")} ${theme.fg(\"text\", command)}`;\n\tconst statusText = opts.progress\n\t\t? `${opts.progress} ${opts.status}`\n\t\t: `${opts.status} · output hidden · ctrl+o expand`;\n\tconst right = theme.fg(opts.tone === \"success\" ? \"success\" : tone, statusText);\n\treturn indentRenderedLines([openRuleLine(titleText, right, innerWidth, tone, opts.tone === \"running\")], indent, width);\n}\n\nexport function renderProgressBar(done: number, total: number, width: number, tone: StatusTone = \"success\"): string {\n\tconst clampedWidth = Math.max(0, width);\n\tconst pct = total > 0 ? Math.max(0, Math.min(1, done / total)) : 0;\n\tconst filled = Math.round(pct * clampedWidth);\n\treturn (\n\t\ttheme.fg(toneColor(tone), \"█\".repeat(filled)) +\n\t\ttheme.fg(\"dim\", \"░\".repeat(clampedWidth - filled))\n\t);\n}\n\nexport function renderFooterStrip(leftSegments: string[], right: string, width: number): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst innerWidth = Math.max(1, outerWidth - 2);\n\tconst sep = theme.fg(\"dim\", \" │ \");\n\tconst rightStyled = theme.fg(\"dim\", right);\n\tconst rightWidth = visibleWidth(rightStyled);\n\tconst leftBudget = right ? Math.max(1, innerWidth - rightWidth - 3) : innerWidth;\n\tconst left = truncateToWidth(leftSegments.filter(Boolean).join(sep), leftBudget, \"\");\n\tconst content = rightAlign(left, rightStyled, innerWidth);\n\treturn roundedPanel([content], outerWidth);\n}\n"]}
1
+ {"version":3,"file":"transcript-design.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/transcript-design.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Shared recommended transcript rendering primitives for assistant, tool, command, footer, and auto-mode TUI surfaces.\n\nimport { alignRight, isImageLine, padRight, style, truncateToWidth, visibleWidth } from \"@gsd/pi-tui\";\nimport { theme, type ThemeBg, type ThemeColor } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { formatTimestamp, type TimestampFormat } from \"./timestamp.js\";\n\nexport type StatusTone = \"running\" | \"success\" | \"error\" | \"warning\" | \"muted\";\nexport type TuiTone = \"default\" | \"accent\" | \"success\" | \"warning\" | \"error\" | \"muted\";\nexport type TuiBreakpoint = \"compact\" | \"regular\" | \"wide\";\n\n/** Conversation/system surfaces that the chat frame distinguishes by color. */\nexport type FrameTone = \"assistant\" | \"user\" | \"compaction\" | \"skill\";\n\nexport function chatMessageWidth(width: number): number {\n\treturn Math.max(24, Math.min(width, Math.floor(width * 0.72)));\n}\n\n/** Outer indent for user turns and tool/work cards in the connected transcript. */\nexport const TRANSCRIPT_CARD_INDENT = 4;\n\n/** Tool rows in the transcript (Variant A). */\nexport const TRANSCRIPT_TOOL_MARKER = \"▸\";\n\n/** System/compaction/skill notices in the transcript (Variant A). */\nexport const TRANSCRIPT_SYSTEM_MARKER = \"◇\";\nconst RUNNING_RAIL_FRAME_MS = 70;\nconst RUNNING_RAIL_TRAIL = 5;\nconst HORIZONTAL_RAIL = \"─\";\nconst HORIZONTAL_RAIL_HEAD = \"━\";\n\n// Whether the \"running\" rail sweeps (animates) or renders as a static rule. User\n// setting `terminal.toolRailAnimation` (default on). When off, running cards show\n// a static rail and ToolExecutionComponent does not arm its re-render timer, so a\n// long-running tool costs zero idle CPU. Module-level (not per-card) because every\n// running card shares the one preference; the interactive mode sets it at startup\n// and when the setting is toggled.\nlet railAnimationEnabled = true;\nexport function setRailAnimationEnabled(enabled: boolean): void {\n\trailAnimationEnabled = enabled;\n}\nexport function isRailAnimationEnabled(): boolean {\n\treturn railAnimationEnabled;\n}\n\nexport function headerLabel(text: string): string {\n\treturn text.toUpperCase();\n}\n\nfunction styledHeader(text: string, color: ThemeColor): string {\n\treturn theme.fg(color, theme.bold(headerLabel(text)));\n}\n\nfunction indentSpaces(cols: number): string {\n\treturn cols > 0 ? \" \".repeat(cols) : \"\";\n}\n\nfunction connectedRuleFill(width: number, indent = TRANSCRIPT_CARD_INDENT): string {\n\treturn \"─\".repeat(Math.max(16, Math.min(40, width - indent - 1)));\n}\n\nfunction runningRailFrame(): number {\n\treturn Math.floor(Date.now() / RUNNING_RAIL_FRAME_MS);\n}\n\nfunction trianglePosition(frame: number, maxPosition: number): number {\n\tconst max = Math.max(0, maxPosition);\n\tif (max === 0) return 0;\n\tconst period = max * 2;\n\tconst step = frame % period;\n\treturn step <= max ? step : period - step;\n}\n\nfunction renderRailText(text: string, railColor: ThemeColor, sweepFrame?: number): string {\n\tif (sweepFrame === undefined) return theme.fg(railColor, text);\n\n\tconst railCells = Array.from(text).filter((char) => char === HORIZONTAL_RAIL).length;\n\tconst head = trianglePosition(sweepFrame, railCells - 1);\n\tlet railIndex = -1;\n\tlet rendered = \"\";\n\n\tfor (const char of text) {\n\t\tif (char !== HORIZONTAL_RAIL) {\n\t\t\trendered += theme.fg(railColor, char);\n\t\t\tcontinue;\n\t\t}\n\n\t\trailIndex++;\n\t\tconst distance = Math.abs(railIndex - head);\n\t\tif (distance === 0) {\n\t\t\trendered += theme.fg(railColor, theme.bold(HORIZONTAL_RAIL_HEAD));\n\t\t} else if (distance <= RUNNING_RAIL_TRAIL) {\n\t\t\trendered += theme.fg(railColor, HORIZONTAL_RAIL_HEAD);\n\t\t} else {\n\t\t\trendered += theme.fg(railColor, HORIZONTAL_RAIL);\n\t\t}\n\t}\n\treturn rendered;\n}\n\nexport function renderChatTurnBridge(\n\twidth: number,\n\tfromIndent = TRANSCRIPT_CARD_INDENT,\n\trailColor: ThemeColor = \"borderAccent\",\n): string[] {\n\tconst bridge = indentSpaces(fromIndent) + \"╰──────╮\";\n\treturn [padLine(theme.fg(railColor, bridge), width)];\n}\n\n/** Bridge from a left-pegged assistant turn down into the next indented user turn. */\nexport function renderChatTurnBridgeToUser(\n\twidth: number,\n\trailColor: ThemeColor = \"border\",\n): string[] {\n\tconst bridge = \"╰──────╮\";\n\treturn [padLine(theme.fg(railColor, bridge), width)];\n}\n\nexport function renderConnectedCard(\n\twidth: number,\n\ttitle: string,\n\tbodyLines: string[],\n\topts: {\n\t\tindent?: number;\n\t\ttitleRight?: string;\n\t\trailColor?: ThemeColor;\n\t\ttitleColor?: ThemeColor;\n\t\tbodyBg?: ThemeBg;\n\t\tcloseBottom?: boolean;\n\t\trailSweep?: boolean;\n\t} = {},\n): string[] {\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst prefix = indentSpaces(indent);\n\tconst railColor = opts.railColor ?? \"borderAccent\";\n\tconst sweepFrame = opts.railSweep && railAnimationEnabled ? runningRailFrame() : undefined;\n\tconst rail = (text: string) => renderRailText(text, railColor, sweepFrame);\n\tconst resolvedTitleColor =\n\t\topts.titleColor ??\n\t\t(title.includes(\"✕\") ? \"error\" : title.includes(\"✓\") ? \"success\" : railColor);\n\tconst titleStyled = theme.fg(resolvedTitleColor, theme.bold(headerLabel(title)));\n\tconst lead = prefix + rail(\"╭─ \") + titleStyled;\n\tlet topLine = lead;\n\tif (opts.titleRight) {\n\t\tconst available = width - visibleWidth(lead) - 1;\n\t\tconst rightWidth = visibleWidth(opts.titleRight);\n\t\tif (rightWidth + 5 <= available) {\n\t\t\tconst fill = Math.max(1, available - rightWidth - 2);\n\t\t\ttopLine = lead + rail(\" \" + \"─\".repeat(fill) + \" \") + opts.titleRight;\n\t\t} else {\n\t\t\tconst clippedRight = truncateToWidth(opts.titleRight, Math.max(8, available - 5), \"\");\n\t\t\tconst fill = Math.max(1, available - visibleWidth(clippedRight) - 2);\n\t\t\ttopLine = lead + rail(\" \" + \"─\".repeat(fill) + \" \") + clippedRight;\n\t\t}\n\t}\n\tconst paintBody = (line: string) => {\n\t\t// Image (Kitty/iTerm2) sequence lines carry raw terminal graphics escapes and\n\t\t// rely on exact column/row positioning. Prepend the SAME left offset normal\n\t\t// body lines get (card indent + 3 spaces) so the image aligns under the card\n\t\t// text rather than hugging column 0, but do NOT padRight/truncate — trailing\n\t\t// padding or clipping after the sequence would corrupt the placement. The\n\t\t// leading spaces simply advance the cursor before the image draws.\n\t\tif (isImageLine(line)) {\n\t\t\treturn prefix + \" \" + line;\n\t\t}\n\t\tconst innerWidth = Math.max(1, width - indent);\n\t\tconst inner = padRight(\" \" + line, innerWidth);\n\t\tconst painted = opts.bodyBg ? theme.bg(opts.bodyBg, inner) : inner;\n\t\treturn prefix + painted;\n\t};\n\t// When the body contains an inline image, its reserved blank padding rows (the\n\t// rows the TUI counts so content below the image lands in the right place) must\n\t// NOT be trimmed/collapsed — trimming them collapses a tall image to one line\n\t// and the terminal then paints the full image over the chat and footer below.\n\tconst hasImage = bodyLines.some((l) => isImageLine(l));\n\tconst bodySource = hasImage ? bodyLines : trimOuterBlankLines(bodyLines);\n\tconst out = [padLine(topLine, width)];\n\tfor (const line of bodySource) {\n\t\tout.push(paintBody(line));\n\t}\n\tif (opts.closeBottom !== false) {\n\t\tout.push(padLine(prefix + rail(\"╰\" + connectedRuleFill(width, indent)), width));\n\t}\n\treturn out;\n}\n\nfunction stripAnsiCodes(text: string): string {\n\treturn text.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n}\n\nfunction isBlankRenderLine(line: string): boolean {\n\treturn stripAnsiCodes(line).trim().length === 0;\n}\n\nexport function trimOuterBlankLines(lines: string[]): string[] {\n\tlet start = 0;\n\tlet end = lines.length;\n\twhile (start < end && isBlankRenderLine(lines[start]!)) start++;\n\twhile (end > start && isBlankRenderLine(lines[end - 1]!)) end--;\n\treturn lines.slice(start, end);\n}\n\n/** Collapse runs of blank lines to a single blank line (tool output only). */\nexport function collapseBlankLines(lines: string[]): string[] {\n\tconst out: string[] = [];\n\tfor (const line of lines) {\n\t\tconst blank = isBlankRenderLine(line);\n\t\tif (blank && out.length > 0 && isBlankRenderLine(out[out.length - 1]!)) continue;\n\t\tout.push(line);\n\t}\n\treturn trimOuterBlankLines(out);\n}\n\nfunction padLine(line: string, width: number): string {\n\treturn padRight(truncateToWidth(line, width, \"\"), width);\n}\n\nfunction toneColor(tone: StatusTone): ThemeColor {\n\tswitch (tone) {\n\t\tcase \"running\": return \"toolRunning\";\n\t\tcase \"success\": return \"border\";\n\t\tcase \"error\": return \"toolError\";\n\t\tcase \"warning\": return \"warning\";\n\t\tcase \"muted\":\n\t\tdefault: return \"toolMuted\";\n\t}\n}\n\nexport function breakpoint(width: number): TuiBreakpoint {\n\tif (width < 72) return \"compact\";\n\tif (width < 112) return \"regular\";\n\treturn \"wide\";\n}\n\nfunction panelToneColor(tone: TuiTone): ThemeColor {\n\tswitch (tone) {\n\t\tcase \"accent\": return \"borderAccent\";\n\t\tcase \"success\": return \"success\";\n\t\tcase \"warning\": return \"warning\";\n\t\tcase \"error\": return \"error\";\n\t\tcase \"muted\": return \"borderMuted\";\n\t\tcase \"default\":\n\t\tdefault: return \"border\";\n\t}\n}\n\nexport function badge(text: string, tone: TuiTone = \"default\"): string {\n\treturn theme.fg(panelToneColor(tone), text);\n}\n\nconst ACTIVITY_SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"] as const;\n\n/** Compact braille spinner for live auto-mode status chrome. */\nexport function styledActivitySpinner(tone: TuiTone = \"accent\"): string {\n\tconst frame = ACTIVITY_SPINNER_FRAMES[Math.floor(Date.now() / 120) % ACTIVITY_SPINNER_FRAMES.length];\n\treturn theme.fg(panelToneColor(tone), frame);\n}\n\nexport function keyValue(label: string, value: string, valueColor: ThemeColor = \"text\", labelWidth = 10): string {\n\treturn `${theme.fg(\"dim\", padRight(label, labelWidth))}${theme.fg(valueColor, value)}`;\n}\n\nexport function roundedPanel(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\ttone?: TuiTone;\n\t\ttitle?: string;\n\t\trightTitle?: string;\n\t\tpaddingX?: number;\n\t} = {},\n): string[] {\n\tconst outerWidth = Math.max(1, width);\n\tconst body = lines.length > 0 ? lines : [\"\"];\n\tif (outerWidth < 3) {\n\t\treturn body.map((line) => truncateToWidth(line, outerWidth, \"\"));\n\t}\n\n\tlet panel = style()\n\t\t.border(\"rounded\")\n\t\t.borderColor((text) => theme.fg(panelToneColor(opts.tone ?? \"default\"), text))\n\t\t.paddingX(Math.max(0, opts.paddingX ?? 0));\n\tif (opts.title) {\n\t\tpanel = panel.title(theme.fg(\"borderAccent\", opts.title));\n\t}\n\tif (opts.rightTitle) {\n\t\tpanel = panel.titleRight(theme.fg(\"dim\", opts.rightTitle));\n\t}\n\treturn panel.render(body, outerWidth);\n}\n\nexport function rightAlign(left: string, right: string, width: number): string {\n\treturn alignRight(left, right, width);\n}\n\n/**\n * Render a copy-clean content surface (ADR-019): a titled top rule, body\n * lines emitted with no border column or leading glyph, and a closing rule.\n * Selecting a body line in the terminal copies only its content.\n *\n * This is the target surface for transcript messages, tool output, and\n * summaries. Migration steps 3–5 move existing renderers onto it.\n */\nexport function openSurface(\n\tlines: string[],\n\twidth: number,\n\topts: { title: string; right?: string; tone: StatusTone; paddingX?: number },\n): string[] {\n\tconst tc = toneColor(opts.tone);\n\tlet surface = style()\n\t\t.border(\"open\")\n\t\t.title(opts.title, (text) => theme.fg(\"borderAccent\", text))\n\t\t.borderColor((text) => theme.fg(tc, text));\n\tif (opts.right) {\n\t\tsurface = surface.titleRight(opts.right, (text) => theme.fg(tc, text));\n\t}\n\tif (opts.paddingX !== undefined) {\n\t\tsurface = surface.paddingX(opts.paddingX);\n\t}\n\treturn surface.render(lines, Math.max(20, width));\n}\n\n/**\n * Render a system/conversation notice (compaction, skill invocations) as a\n * plain ◇ header plus copy-clean body lines (Variant A — no horizontal rules).\n */\nexport function renderChatFrame(\n\tcontentLines: string[],\n\twidth: number,\n\topts: {\n\t\tlabel: string;\n\t\ttone: FrameTone;\n\t\ttimestamp?: number;\n\t\ttimestampFormat: TimestampFormat;\n\t\tshowTimestamp?: boolean;\n\t},\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst isPurple = opts.tone === \"compaction\" || opts.tone === \"skill\";\n\tconst frameColor: ThemeColor = opts.tone === \"user\" ? \"border\" : isPurple ? \"customMessageLabel\" : \"borderAccent\";\n\tconst bodyColor: ThemeColor =\n\t\topts.tone === \"user\" ? \"userMessageText\" : isPurple ? \"customMessageText\" : \"assistantMessageText\";\n\n\t// A label may carry a \" - \" splitting a bold name from a dim detail.\n\tconst dashIdx = opts.label.indexOf(\" - \");\n\tconst labelStyled =\n\t\tdashIdx >= 0\n\t\t\t? theme.fg(frameColor, theme.bold(opts.label.slice(0, dashIdx))) + theme.fg(\"dim\", opts.label.slice(dashIdx))\n\t\t\t: theme.fg(frameColor, theme.bold(opts.label));\n\tconst rightRaw =\n\t\topts.showTimestamp === false || !opts.timestamp ? \"\" : formatTimestamp(opts.timestamp, opts.timestampFormat);\n\tconst metaStyled = rightRaw ? theme.fg(\"dim\", ` · ${rightRaw}`) : \"\";\n\tconst header = padLine(\n\t\ttruncateToWidth(\n\t\t\t`${theme.fg(frameColor, TRANSCRIPT_SYSTEM_MARKER)} ${labelStyled}${metaStyled}`,\n\t\t\touterWidth,\n\t\t\t\"…\",\n\t\t),\n\t\touterWidth,\n\t);\n\n\tconst source = trimOuterBlankLines(contentLines);\n\tconst body = (source.length > 0 ? source : [\"\"]).map((line) => padLine(theme.fg(bodyColor, line), outerWidth));\n\treturn [header, ...body, \"\"];\n}\n\n/** Chat/dialog corner glyph — top-left opener on speaker headers. */\nexport const CHAT_CORNER_TOP_LEFT = \"╭─ \";\n\nfunction speakerCornerColor(tone: \"user\" | \"assistant\"): ThemeColor {\n\treturn tone === \"user\" ? \"border\" : \"borderAccent\";\n}\n\nfunction renderCornerSpeakerHeader(\n\tlabel: string,\n\tmeta: string | undefined,\n\twidth: number,\n\ttone: \"user\" | \"assistant\",\n): string {\n\tconst cornerColor = speakerCornerColor(tone);\n\tconst labelStyled =\n\t\ttone === \"user\" ? theme.fg(\"border\", theme.bold(label)) : theme.fg(\"accent\", theme.bold(label));\n\tconst metaStyled = meta ? theme.fg(\"dim\", ` · ${meta}`) : \"\";\n\tconst topLeft = theme.fg(cornerColor, CHAT_CORNER_TOP_LEFT) + labelStyled + metaStyled;\n\treturn padLine(truncateToWidth(topLeft, width, \"…\"), width);\n}\n\n/** @deprecated Prefer renderCornerSpeakerHeader via renderPlainSpeakerMessage. */\nexport function renderPlainSpeakerHeader(\n\tlabel: string,\n\tmeta: string | undefined,\n\twidth: number,\n\ttone: \"user\" | \"assistant\",\n): string {\n\treturn renderCornerSpeakerHeader(label, meta, width, tone);\n}\n\nexport function renderPlainSpeakerBody(\n\tlines: string[],\n\twidth: number,\n\tbodyColor: \"userMessageText\" | \"assistantMessageText\",\n): string[] {\n\tconst source = trimOuterBlankLines(lines);\n\treturn source.map((line) => padLine(theme.fg(bodyColor, line), width));\n}\n\nexport function renderPlainSpeakerMessage(\n\tlines: string[],\n\twidth: number,\n\topts: { label: string; meta?: string; tone: \"user\" | \"assistant\"; trailingBlank?: boolean },\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst bodyColor = opts.tone === \"user\" ? \"userMessageText\" : \"assistantMessageText\";\n\tconst body = renderPlainSpeakerBody(lines, outerWidth, bodyColor);\n\tconst out = [renderCornerSpeakerHeader(opts.label, opts.meta, outerWidth, opts.tone), ...body];\n\tif (opts.trailingBlank !== false) {\n\t\tout.push(\"\");\n\t}\n\treturn out;\n}\n\n/** @deprecated Connected rails — Variant B. Prefer renderPlainSpeakerMessage. */\nexport function renderAssistantRail(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\tlabel?: string;\n\t\tmeta?: string;\n\t\trailColor?: ThemeColor;\n\t\tconnected?: boolean;\n\t\tcontinuesToUser?: boolean;\n\t} = {},\n): string[] {\n\tconst railColor = opts.railColor ?? \"borderAccent\";\n\tconst source = trimOuterBlankLines(lines);\n\tconst body = (source.length > 0 ? source : [\"\"]).map((line) => theme.fg(\"assistantMessageText\", line));\n\tconst titleRight = opts.meta ? theme.fg(\"dim\", opts.meta) : undefined;\n\tconst card = renderConnectedCard(width, opts.label ?? \"GSD\", body, {\n\t\tindent: 0,\n\t\ttitleRight,\n\t\trailColor,\n\t\tcloseBottom: !opts.continuesToUser,\n\t});\n\tlet result = card;\n\tif (opts.connected) {\n\t\tresult = [...renderChatTurnBridge(width, TRANSCRIPT_CARD_INDENT), ...result];\n\t}\n\tif (opts.continuesToUser) {\n\t\tresult = [...result, ...renderChatTurnBridgeToUser(width)];\n\t}\n\treturn result;\n}\n\n/** @deprecated Connected rails — Variant B. Prefer renderPlainSpeakerMessage. */\nexport function renderUserRail(\n\tlines: string[],\n\twidth: number,\n\topts: { label?: string; meta?: string; continuesToAssistant?: boolean },\n): string[] {\n\tconst source = trimOuterBlankLines(lines);\n\tconst body = (source.length > 0 ? source : [\"\"]).map((line) => theme.fg(\"userMessageText\", line));\n\tconst titleRight = opts.meta ? theme.fg(\"dim\", opts.meta) : undefined;\n\treturn renderConnectedCard(width, opts.label ?? \"YOU\", body, {\n\t\tindent: TRANSCRIPT_CARD_INDENT,\n\t\ttitleRight,\n\t\trailColor: \"border\",\n\t\ttitleColor: \"border\",\n\t\tcloseBottom: !opts.continuesToAssistant,\n\t});\n}\n\n/**\n * Render a single titled rule line — the collapsed form of a tool/command\n * card on the \"open\" surface. `title` and `right` must be pre-styled.\n */\nfunction openRuleLine(title: string, right: string, width: number, tone: ThemeColor, sweep = false): string {\n\tconst w = Math.max(20, width);\n\tif (!right) {\n\t\tconst clippedTitle = truncateToWidth(title, Math.max(0, w - 6), \"\");\n\t\tconst fill = Math.max(1, w - 5 - visibleWidth(clippedTitle));\n\t\treturn padLine(renderRailText(\"─── \", tone) + clippedTitle + renderRailText(` ${\"─\".repeat(fill)}`, tone), w);\n\t}\n\n\tconst titleBudget = Math.max(0, w - 11);\n\tconst rightReserve = titleBudget > 1 && visibleWidth(right) > 0 ? 1 : 0;\n\tconst leftBudget = Math.min(visibleWidth(title), Math.max(0, titleBudget - rightReserve));\n\tconst rightBudget = Math.max(0, titleBudget - leftBudget);\n\tconst clippedTitle = truncateToWidth(title, leftBudget, \"\");\n\tconst clippedRight = truncateToWidth(right, rightBudget, \"\");\n\tconst fixed = 4 + visibleWidth(clippedTitle) + 2 + visibleWidth(clippedRight) + 4;\n\tconst fill = Math.max(1, w - fixed);\n\tconst sweepFrame = sweep && railAnimationEnabled ? runningRailFrame() : undefined;\n\n\treturn padLine(\n\t\trenderRailText(\"─── \", tone) +\n\t\t\tclippedTitle +\n\t\t\trenderRailText(` ${\"─\".repeat(fill)} `, tone, sweepFrame) +\n\t\t\tclippedRight +\n\t\t\trenderRailText(\" ───\", tone),\n\t\tw,\n\t);\n}\n\nfunction indentRenderedLines(lines: string[], indent: number, width: number): string[] {\n\tif (indent <= 0) return lines;\n\tconst prefix = indentSpaces(indent);\n\treturn lines.map((line) => padLine(prefix + truncateToWidth(line, Math.max(1, width - indent), \"\"), width));\n}\n\nexport function renderTranscriptCard(\n\tlines: string[],\n\twidth: number,\n\topts: {\n\t\ttitle: string;\n\t\tright?: string;\n\t\ttone: StatusTone;\n\t\tfooterLeft?: string;\n\t\tfooterRight?: string;\n\t\tindent?: number;\n\t},\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst indent = opts.indent ?? TRANSCRIPT_CARD_INDENT;\n\tconst tone = toneColor(opts.tone);\n\t// Preserve image padding rows (see renderConnectedCard) — trimming them would\n\t// collapse a tall inline image and make it overflow the card.\n\tconst body = lines.some((l) => isImageLine(l)) ? lines : trimOuterBlankLines(lines);\n\tlet titleRight = opts.right ? theme.fg(tone, opts.right) : undefined;\n\tif (opts.footerLeft || opts.footerRight) {\n\t\tconst hint = [opts.footerLeft, opts.footerRight].filter(Boolean).join(\" · \");\n\t\tconst hintStyled = theme.fg(\"dim\", hint);\n\t\ttitleRight = titleRight ? `${titleRight} · ${hintStyled}` : hintStyled;\n\t}\n\treturn renderConnectedCard(outerWidth, opts.title, body, {\n\t\tindent,\n\t\ttitleRight,\n\t\trailColor: tone,\n\t\trailSweep: opts.tone === \"running\",\n\t});\n}\n\nfunction statusColorForTone(tone: StatusTone): ThemeColor {\n\tif (tone === \"error\") return \"error\";\n\tif (tone === \"running\") return \"accent\";\n\tif (tone === \"warning\") return \"warning\";\n\treturn \"success\";\n}\n\nexport function renderCompactToolStrip(\n\ttitle: string,\n\ttarget: string | undefined,\n\twidth: number,\n\topts: { status: string; tone: StatusTone; hidden?: boolean },\n): string[] {\n\tconst titleText = target\n\t\t? `${styledHeader(title, \"borderAccent\")} ${theme.fg(\"text\", target)}`\n\t\t: styledHeader(title, \"borderAccent\");\n\tconst left = `${theme.fg(\"borderAccent\", TRANSCRIPT_TOOL_MARKER)} ${titleText}`;\n\tconst statusText = opts.hidden ? `${opts.status} · output hidden · ctrl+o expand` : opts.status;\n\tconst right = theme.fg(statusColorForTone(opts.tone), statusText);\n\treturn [padLine(alignRight(left, right, width), width)];\n}\n\nexport function renderPlainToolMessage(\n\tbodyLines: string[],\n\twidth: number,\n\topts: { title: string; target?: string; meta?: string; tone: StatusTone },\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst indent = TRANSCRIPT_CARD_INDENT;\n\tconst prefix = indentSpaces(indent);\n\tconst innerWidth = Math.max(1, outerWidth - indent);\n\n\tconst titleText = opts.target\n\t\t? `${styledHeader(opts.title, \"borderAccent\")} ${theme.fg(\"text\", opts.target)}`\n\t\t: styledHeader(opts.title, \"borderAccent\");\n\tconst left = `${theme.fg(\"borderAccent\", TRANSCRIPT_TOOL_MARKER)} ${titleText}`;\n\tconst right = opts.meta ? theme.fg(statusColorForTone(opts.tone), opts.meta) : \"\";\n\tconst header = padLine(alignRight(left, right, outerWidth), outerWidth);\n\n\tconst hasImage = bodyLines.some((line) => isImageLine(line));\n\tconst bodySource = hasImage ? bodyLines : collapseBlankLines(bodyLines);\n\n\tconst paintBody = (line: string): string => {\n\t\tif (isImageLine(line)) {\n\t\t\treturn prefix + \" \" + line;\n\t\t}\n\t\tif (hasImage && isBlankRenderLine(line)) {\n\t\t\treturn padLine(prefix + padRight(\"\", innerWidth), outerWidth);\n\t\t}\n\t\treturn padLine(truncateToWidth(line, outerWidth, \"\"), outerWidth);\n\t};\n\n\treturn [header, ...bodySource.map(paintBody), \"\"];\n}\n\n/** @deprecated Prefer renderCompactToolStrip (Variant A). */\nexport function renderToolLineCard(\n\ttitle: string,\n\ttarget: string | undefined,\n\twidth: number,\n\topts: { status: string; tone: StatusTone; hidden?: boolean; titlePrefix?: string; bg?: ThemeBg; indent?: number },\n): string[] {\n\treturn renderCompactToolStrip(title, target, width, {\n\t\tstatus: opts.status,\n\t\ttone: opts.tone,\n\t\thidden: opts.hidden,\n\t});\n}\n\nexport function renderCommandCard(\n\tcommand: string,\n\twidth: number,\n\topts: { status: string; tone: StatusTone; progress?: string; indent?: number },\n): string[] {\n\tconst left = `${theme.fg(\"accent\", \"$\")} ${theme.fg(\"text\", command)}`;\n\tconst statusText = opts.progress\n\t\t? `${opts.progress} ${opts.status}`\n\t\t: `${opts.status} · output hidden · ctrl+o expand`;\n\tconst statusColor = opts.tone === \"error\" ? \"error\" : opts.tone === \"running\" ? \"accent\" : \"success\";\n\tconst right = theme.fg(statusColor, statusText);\n\treturn [padLine(alignRight(left, right, width), width)];\n}\n\nexport function renderProgressBar(done: number, total: number, width: number, tone: StatusTone = \"success\"): string {\n\tconst clampedWidth = Math.max(0, width);\n\tconst pct = total > 0 ? Math.max(0, Math.min(1, done / total)) : 0;\n\tconst filled = Math.round(pct * clampedWidth);\n\treturn (\n\t\ttheme.fg(toneColor(tone), \"█\".repeat(filled)) +\n\t\ttheme.fg(\"dim\", \"░\".repeat(clampedWidth - filled))\n\t);\n}\n\nexport type StepDotMode = \"position\" | \"completed\";\n\nconst STEP_DOT_MAX = 12;\n\n/**\n * Discrete step indicator — ● for reached steps, ○ for pending.\n * `position`: done is the active step index (1-based, includes current).\n * `completed`: done is the count of fully finished steps.\n */\nexport function renderStepDots(\n\tdone: number,\n\ttotal: number,\n\topts: { maxDots?: number; mode?: StepDotMode } = {},\n): string {\n\tif (total <= 0) return \"\";\n\n\tconst maxDots = opts.maxDots ?? STEP_DOT_MAX;\n\tconst mode = opts.mode ?? \"position\";\n\tconst complete = done >= total;\n\n\tlet displayTotal = total;\n\tlet displayDone = Math.max(0, Math.min(done, total));\n\tlet overflowSuffix = \"\";\n\n\tif (total > maxDots) {\n\t\tdisplayTotal = maxDots;\n\t\tdisplayDone = Math.max(0, Math.min(displayTotal, Math.round((done / total) * displayTotal)));\n\t\toverflowSuffix = theme.fg(\"dim\", `+${total - maxDots}`);\n\t}\n\n\tlet dots = \"\";\n\tfor (let i = 0; i < displayTotal; i++) {\n\t\tconst reached = i < displayDone;\n\t\tif (reached) {\n\t\t\tconst isCurrent = !complete && mode === \"position\" && i === displayDone - 1;\n\t\t\tconst color: ThemeColor = complete ? \"success\" : isCurrent ? \"accent\" : \"text\";\n\t\t\tdots += theme.fg(color, \"●\");\n\t\t} else {\n\t\t\tdots += theme.fg(\"dim\", \"○\");\n\t\t}\n\t}\n\treturn dots + overflowSuffix;\n}\n\n/** Label + step dots + numeric count, e.g. `tasks ●●●○○ 3/5`. */\nexport function formatStepProgress(\n\tlabel: string,\n\tdone: number,\n\ttotal: number,\n\topts: { maxDots?: number; mode?: StepDotMode; countColor?: ThemeColor } = {},\n): string {\n\tconst dots = renderStepDots(done, total, opts);\n\tconst countColor = opts.countColor ?? \"dim\";\n\treturn `${theme.fg(\"dim\", label)} ${dots}${theme.fg(countColor, ` ${done}/${total}`)}`;\n}\n\nexport function renderFooterStrip(leftSegments: string[], right: string, width: number): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst innerWidth = Math.max(1, outerWidth - 2);\n\tconst sep = theme.fg(\"dim\", \" │ \");\n\tconst rightStyled = theme.fg(\"dim\", right);\n\tconst rightWidth = visibleWidth(rightStyled);\n\tconst leftBudget = right ? Math.max(1, innerWidth - rightWidth - 3) : innerWidth;\n\tconst left = truncateToWidth(leftSegments.filter(Boolean).join(sep), leftBudget, \"\");\n\tconst content = rightAlign(left, rightStyled, innerWidth);\n\treturn roundedPanel([content], outerWidth);\n}\n\nconst footerSegmentSep = () => theme.fg(\"dim\", \" │ \");\n\n/**\n * Full-width footer: fixed segments plus one flex segment (typically context + bar).\n * The flex segment receives all remaining horizontal space.\n */\nexport function layoutFullWidthFooter(\n\tsegments: string[],\n\twidth: number,\n\tflexAt: number,\n\tflexRender: (segmentBudget: number) => string,\n): string {\n\tconst sep = footerSegmentSep();\n\tconst sepWidth = visibleWidth(sep);\n\tconst slotCount = segments.length + 1;\n\tconst separators = Math.max(0, slotCount - 1) * sepWidth;\n\n\tlet fixedWidth = 0;\n\tfor (const segment of segments) {\n\t\tfixedWidth += visibleWidth(segment);\n\t}\n\n\tconst flexBudget = Math.max(12, width - fixedWidth - separators);\n\tconst flexSegment = flexRender(flexBudget);\n\n\tconst parts = [...segments.slice(0, flexAt), flexSegment, ...segments.slice(flexAt)];\n\tconst line = parts.join(sep);\n\treturn truncateToWidth(line, width, \"…\");\n}\n\nexport function renderFullWidthFooterStrip(\n\tsegments: string[],\n\twidth: number,\n\tflex?: { at: number; render: (segmentBudget: number) => string },\n): string[] {\n\tconst outerWidth = Math.max(20, width);\n\tconst innerWidth = Math.max(1, outerWidth - 2);\n\tconst content = flex\n\t\t? layoutFullWidthFooter(segments, innerWidth, flex.at, flex.render)\n\t\t: truncateToWidth(segments.filter(Boolean).join(footerSegmentSep()), innerWidth, \"…\");\n\treturn roundedPanel([content], outerWidth);\n}\n\n/** Single-line footer — no box, ` · ` separators. */\nexport function layoutMinimalFooter(\n\tsegments: string[],\n\twidth: number,\n\tflex?: { at: number; render: (segmentBudget: number) => string },\n): string {\n\tconst sep = theme.fg(\"dim\", \" · \");\n\tconst sepWidth = visibleWidth(sep);\n\tif (flex) {\n\t\tconst slotCount = segments.length + 1;\n\t\tconst separators = Math.max(0, slotCount - 1) * sepWidth;\n\t\tlet fixedWidth = 0;\n\t\tfor (const segment of segments) {\n\t\t\tfixedWidth += visibleWidth(segment);\n\t\t}\n\t\tconst flexBudget = Math.max(8, width - fixedWidth - separators);\n\t\tconst flexSegment = flex.render(flexBudget);\n\t\tconst parts = [...segments.slice(0, flex.at), flexSegment, ...segments.slice(flex.at)];\n\t\treturn truncateToWidth(parts.join(sep), width, \"…\");\n\t}\n\treturn truncateToWidth(segments.filter(Boolean).join(sep), width, \"…\");\n}\n\n/**\n * Full-width minimal footer: left + center (flex) flush left, stats flush right.\n */\nexport function layoutFullWidthMinimalFooter(\n\tleftSegments: string[],\n\trightSegments: string[],\n\twidth: number,\n\tflexRender: (segmentBudget: number) => string,\n): string {\n\tconst sep = theme.fg(\"dim\", \" · \");\n\tconst left = leftSegments.filter(Boolean).join(sep);\n\tconst right = rightSegments.filter(Boolean).join(sep);\n\tconst leftWidth = left ? visibleWidth(left) : 0;\n\tconst rightWidth = right ? visibleWidth(right) : 0;\n\tconst sepWidth = visibleWidth(sep);\n\n\tif (!right) {\n\t\tconst flexBudget = Math.max(8, width - leftWidth - (left ? sepWidth : 0));\n\t\tconst center = flexRender(flexBudget);\n\t\tconst line = [left, center].filter(Boolean).join(sep);\n\t\treturn truncateToWidth(line, width, \"…\");\n\t}\n\n\tconst flexBudget = Math.max(8, width - leftWidth - rightWidth - sepWidth - 1);\n\tconst center = flexRender(flexBudget);\n\tconst leftBlock = center ? (left ? `${left}${sep}${center}` : center) : left;\n\treturn alignRight(leftBlock, right, width);\n}\n\n/** Single-line footer output — no rounded panel. */\nexport function renderMinimalFooterLine(line: string, width: number): string[] {\n\tconst outerWidth = Math.max(20, width);\n\treturn [padRight(truncateToWidth(line, outerWidth, \"…\"), outerWidth)];\n}\n"]}
@@ -1,17 +1,17 @@
1
1
  import { Container, type MarkdownTheme } from "@gsd/pi-tui";
2
2
  import { type TimestampFormat } from "./timestamp.js";
3
3
  /**
4
- * Component that renders a user message against the left edge of the chat transcript.
4
+ * Component that renders a user message as a plain speaker line + unboxed body.
5
5
  */
6
6
  export declare class UserMessageComponent extends Container {
7
7
  private timestamp;
8
8
  private timestampFormat;
9
- private continuesToAssistant;
10
9
  private renderCache;
11
10
  private renderVersion;
12
11
  constructor(text: string, markdownTheme?: MarkdownTheme, timestamp?: number, timestampFormat?: TimestampFormat);
13
12
  invalidate(): void;
14
- setContinuesToAssistant(value: boolean): void;
13
+ /** @deprecated Plain transcript has no connected rails. */
14
+ setContinuesToAssistant(_value: boolean): void;
15
15
  render(width: number): string[];
16
16
  private clearRenderCache;
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"user-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/user-message.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAY,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAYvE;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IAClD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,aAAa,CAAK;gBAEd,IAAI,EAAE,MAAM,EAAE,aAAa,GAAE,aAAkC,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,eAAe,GAAE,eAAiC;IAO1I,UAAU,IAAI,IAAI;IAK3B,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAMpC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAgCxC,OAAO,CAAC,gBAAgB;CAIxB"}
1
+ {"version":3,"file":"user-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/user-message.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAY,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAYvE;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IAClD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,aAAa,CAAK;gBAEd,IAAI,EAAE,MAAM,EAAE,aAAa,GAAE,aAAkC,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,eAAe,GAAE,eAAiC;IAO1I,UAAU,IAAI,IAAI;IAK3B,2DAA2D;IAC3D,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAErC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAqCxC,OAAO,CAAC,gBAAgB;CAIxB"}
@@ -1,10 +1,10 @@
1
1
  // Project/App: gsd-pi
2
- // File Purpose: Left-edge user message rail renderer for interactive chat transcripts.
2
+ // File Purpose: Left-edge user message renderer for interactive chat transcripts (corner-framed dialog).
3
3
  import { Container, Markdown } from "@gsd/pi-tui";
4
4
  import { getMarkdownTheme } from "@gsd/pi-coding-agent/theme/theme.js";
5
5
  import { RenderCache } from "./render-cache.js";
6
6
  import { formatTimestamp } from "./timestamp.js";
7
- import { renderUserRail, TRANSCRIPT_CARD_INDENT } from "./transcript-design.js";
7
+ import { renderPlainSpeakerMessage } from "./transcript-design.js";
8
8
  const OSC133_ZONE_START = "\x1b]133;A\x07";
9
9
  const OSC133_ZONE_END = "\x1b]133;B\x07";
10
10
  function shouldEmitOsc133Zones() {
@@ -15,12 +15,11 @@ function shouldEmitOsc133Zones() {
15
15
  return process.env.TERM_PROGRAM === "iTerm.app";
16
16
  }
17
17
  /**
18
- * Component that renders a user message against the left edge of the chat transcript.
18
+ * Component that renders a user message as a plain speaker line + unboxed body.
19
19
  */
20
20
  export class UserMessageComponent extends Container {
21
21
  constructor(text, markdownTheme = getMarkdownTheme(), timestamp, timestampFormat = "date-time-iso") {
22
22
  super();
23
- this.continuesToAssistant = false;
24
23
  this.renderCache = new RenderCache();
25
24
  this.renderVersion = 0;
26
25
  this.timestamp = timestamp;
@@ -31,38 +30,39 @@ export class UserMessageComponent extends Container {
31
30
  super.invalidate();
32
31
  this.clearRenderCache();
33
32
  }
34
- setContinuesToAssistant(value) {
35
- if (this.continuesToAssistant === value)
36
- return;
37
- this.continuesToAssistant = value;
38
- this.clearRenderCache();
39
- }
33
+ /** @deprecated Plain transcript has no connected rails. */
34
+ setContinuesToAssistant(_value) { }
40
35
  render(width) {
41
36
  const emitOsc133Zones = shouldEmitOsc133Zones();
42
- const cacheKey = `${width}:${this.renderVersion}:${emitOsc133Zones ? 1 : 0}:${this.continuesToAssistant ? 1 : 0}`;
37
+ const cacheKey = `${width}:${this.renderVersion}:${emitOsc133Zones ? 1 : 0}`;
43
38
  const cached = this.renderCache.get(cacheKey);
44
39
  if (cached)
45
40
  return cached;
46
41
  const frameWidth = Math.max(20, width);
47
- const contentWidth = Math.max(1, frameWidth - TRANSCRIPT_CARD_INDENT - 3);
48
- const lines = super.render(contentWidth);
42
+ const lines = super.render(frameWidth);
49
43
  const meta = this.timestamp !== undefined
50
44
  ? formatTimestamp(this.timestamp, this.timestampFormat)
51
45
  : undefined;
52
- const framed = renderUserRail(lines, frameWidth, {
53
- label: "You",
46
+ const framed = renderPlainSpeakerMessage(lines, frameWidth, {
47
+ label: "YOU",
54
48
  meta,
55
- continuesToAssistant: this.continuesToAssistant,
49
+ tone: "user",
50
+ trailingBlank: false,
56
51
  });
57
52
  if (framed.length === 0) {
58
53
  return framed;
59
54
  }
60
- const out = framed;
61
55
  if (!emitOsc133Zones) {
62
- return this.renderCache.set(cacheKey, out);
56
+ return this.renderCache.set(cacheKey, framed);
63
57
  }
58
+ const out = [...framed];
64
59
  const firstFrameLine = 0;
65
- const lastFrameLine = out.length - 1;
60
+ // Skip trailing blank lines so the end-of-command marker lands on the
61
+ // last content line, not on the spacer appended by renderPlainSpeakerMessage.
62
+ let lastFrameLine = out.length - 1;
63
+ while (lastFrameLine > firstFrameLine && out[lastFrameLine] === "") {
64
+ lastFrameLine--;
65
+ }
66
66
  out[firstFrameLine] = OSC133_ZONE_START + out[firstFrameLine];
67
67
  out[lastFrameLine] = out[lastFrameLine] + OSC133_ZONE_END;
68
68
  return this.renderCache.set(cacheKey, out);
@@ -1 +1 @@
1
- {"version":3,"file":"user-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/user-message.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Left-edge user message rail renderer for interactive chat transcripts.\n\nimport { Container, Markdown, type MarkdownTheme } from \"@gsd/pi-tui\";\nimport { getMarkdownTheme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { RenderCache } from \"./render-cache.js\";\nimport { formatTimestamp, type TimestampFormat } from \"./timestamp.js\";\nimport { renderUserRail, TRANSCRIPT_CARD_INDENT } from \"./transcript-design.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\n\nfunction shouldEmitOsc133Zones(): boolean {\n\tif (process.env.GSD_DISABLE_OSC133_ZONES === \"1\") return false;\n\tif (process.env.GSD_ENABLE_OSC133_ZONES === \"1\") return true;\n\treturn process.env.TERM_PROGRAM === \"iTerm.app\";\n}\n\n/**\n * Component that renders a user message against the left edge of the chat transcript.\n */\nexport class UserMessageComponent extends Container {\n\tprivate timestamp: number | undefined;\n\tprivate timestampFormat: TimestampFormat;\n\tprivate continuesToAssistant = false;\n\tprivate renderCache = new RenderCache();\n\tprivate renderVersion = 0;\n\n\tconstructor(text: string, markdownTheme: MarkdownTheme = getMarkdownTheme(), timestamp?: number, timestampFormat: TimestampFormat = \"date-time-iso\") {\n\t\tsuper();\n\t\tthis.timestamp = timestamp;\n\t\tthis.timestampFormat = timestampFormat;\n\t\tthis.addChild(new Markdown(text, 0, 0, markdownTheme));\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.clearRenderCache();\n\t}\n\n\tsetContinuesToAssistant(value: boolean): void {\n\t\tif (this.continuesToAssistant === value) return;\n\t\tthis.continuesToAssistant = value;\n\t\tthis.clearRenderCache();\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst emitOsc133Zones = shouldEmitOsc133Zones();\n\t\tconst cacheKey = `${width}:${this.renderVersion}:${emitOsc133Zones ? 1 : 0}:${this.continuesToAssistant ? 1 : 0}`;\n\t\tconst cached = this.renderCache.get(cacheKey);\n\t\tif (cached) return cached;\n\n\t\tconst frameWidth = Math.max(20, width);\n\t\tconst contentWidth = Math.max(1, frameWidth - TRANSCRIPT_CARD_INDENT - 3);\n\t\tconst lines = super.render(contentWidth);\n\t\tconst meta =\n\t\t\tthis.timestamp !== undefined\n\t\t\t\t? formatTimestamp(this.timestamp, this.timestampFormat)\n\t\t\t\t: undefined;\n\t\tconst framed = renderUserRail(lines, frameWidth, {\n\t\t\tlabel: \"You\",\n\t\t\tmeta,\n\t\t\tcontinuesToAssistant: this.continuesToAssistant,\n\t\t});\n\t\tif (framed.length === 0) {\n\t\t\treturn framed;\n\t\t}\n\t\tconst out = framed;\n\t\tif (!emitOsc133Zones) {\n\t\t\treturn this.renderCache.set(cacheKey, out);\n\t\t}\n\t\tconst firstFrameLine = 0;\n\t\tconst lastFrameLine = out.length - 1;\n\t\tout[firstFrameLine] = OSC133_ZONE_START + out[firstFrameLine];\n\t\tout[lastFrameLine] = out[lastFrameLine] + OSC133_ZONE_END;\n\t\treturn this.renderCache.set(cacheKey, out);\n\t}\n\n\tprivate clearRenderCache(): void {\n\t\tthis.renderVersion++;\n\t\tthis.renderCache.clear();\n\t}\n}\n"]}
1
+ {"version":3,"file":"user-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/user-message.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,yGAAyG;AAEzG,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAsB,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAwB,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,MAAM,iBAAiB,GAAG,gBAAgB,CAAC;AAC3C,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEzC,SAAS,qBAAqB;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,WAAW,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAMlD,YAAY,IAAY,EAAE,gBAA+B,gBAAgB,EAAE,EAAE,SAAkB,EAAE,kBAAmC,eAAe;QAClJ,KAAK,EAAE,CAAC;QAJD,gBAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QAChC,kBAAa,GAAG,CAAC,CAAC;QAIzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;IACxD,CAAC;IAEQ,UAAU;QAClB,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IACzB,CAAC;IAED,2DAA2D;IAC3D,uBAAuB,CAAC,MAAe,IAAS,CAAC;IAExC,MAAM,CAAC,KAAa;QAC5B,MAAM,eAAe,GAAG,qBAAqB,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,IAAI,CAAC,aAAa,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,IAAI,GACT,IAAI,CAAC,SAAS,KAAK,SAAS;YAC3B,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC;YACvD,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,MAAM,GAAG,yBAAyB,CAAC,KAAK,EAAE,UAAU,EAAE;YAC3D,KAAK,EAAE,KAAK;YACZ,IAAI;YACJ,IAAI,EAAE,MAAM;YACZ,aAAa,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC;QACf,CAAC;QACD,IAAI,CAAC,eAAe,EAAE,CAAC;YACtB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;QACxB,MAAM,cAAc,GAAG,CAAC,CAAC;QACzB,sEAAsE;QACtE,8EAA8E;QAC9E,IAAI,aAAa,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QACnC,OAAO,aAAa,GAAG,cAAc,IAAI,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,EAAE,CAAC;YACpE,aAAa,EAAE,CAAC;QACjB,CAAC;QACD,GAAG,CAAC,cAAc,CAAC,GAAG,iBAAiB,GAAG,GAAG,CAAC,cAAc,CAAC,CAAC;QAC9D,GAAG,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,aAAa,CAAC,GAAG,eAAe,CAAC;QAC1D,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IAEO,gBAAgB;QACvB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;CACD","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Left-edge user message renderer for interactive chat transcripts (corner-framed dialog).\n\nimport { Container, Markdown, type MarkdownTheme } from \"@gsd/pi-tui\";\nimport { getMarkdownTheme } from \"@gsd/pi-coding-agent/theme/theme.js\";\nimport { RenderCache } from \"./render-cache.js\";\nimport { formatTimestamp, type TimestampFormat } from \"./timestamp.js\";\nimport { renderPlainSpeakerMessage } from \"./transcript-design.js\";\n\nconst OSC133_ZONE_START = \"\\x1b]133;A\\x07\";\nconst OSC133_ZONE_END = \"\\x1b]133;B\\x07\";\n\nfunction shouldEmitOsc133Zones(): boolean {\n\tif (process.env.GSD_DISABLE_OSC133_ZONES === \"1\") return false;\n\tif (process.env.GSD_ENABLE_OSC133_ZONES === \"1\") return true;\n\treturn process.env.TERM_PROGRAM === \"iTerm.app\";\n}\n\n/**\n * Component that renders a user message as a plain speaker line + unboxed body.\n */\nexport class UserMessageComponent extends Container {\n\tprivate timestamp: number | undefined;\n\tprivate timestampFormat: TimestampFormat;\n\tprivate renderCache = new RenderCache();\n\tprivate renderVersion = 0;\n\n\tconstructor(text: string, markdownTheme: MarkdownTheme = getMarkdownTheme(), timestamp?: number, timestampFormat: TimestampFormat = \"date-time-iso\") {\n\t\tsuper();\n\t\tthis.timestamp = timestamp;\n\t\tthis.timestampFormat = timestampFormat;\n\t\tthis.addChild(new Markdown(text, 0, 0, markdownTheme));\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.clearRenderCache();\n\t}\n\n\t/** @deprecated Plain transcript has no connected rails. */\n\tsetContinuesToAssistant(_value: boolean): void {}\n\n\toverride render(width: number): string[] {\n\t\tconst emitOsc133Zones = shouldEmitOsc133Zones();\n\t\tconst cacheKey = `${width}:${this.renderVersion}:${emitOsc133Zones ? 1 : 0}`;\n\t\tconst cached = this.renderCache.get(cacheKey);\n\t\tif (cached) return cached;\n\n\t\tconst frameWidth = Math.max(20, width);\n\t\tconst lines = super.render(frameWidth);\n\t\tconst meta =\n\t\t\tthis.timestamp !== undefined\n\t\t\t\t? formatTimestamp(this.timestamp, this.timestampFormat)\n\t\t\t\t: undefined;\n\t\tconst framed = renderPlainSpeakerMessage(lines, frameWidth, {\n\t\t\tlabel: \"YOU\",\n\t\t\tmeta,\n\t\t\ttone: \"user\",\n\t\t\ttrailingBlank: false,\n\t\t});\n\t\tif (framed.length === 0) {\n\t\t\treturn framed;\n\t\t}\n\t\tif (!emitOsc133Zones) {\n\t\t\treturn this.renderCache.set(cacheKey, framed);\n\t\t}\n\t\tconst out = [...framed];\n\t\tconst firstFrameLine = 0;\n\t\t// Skip trailing blank lines so the end-of-command marker lands on the\n\t\t// last content line, not on the spacer appended by renderPlainSpeakerMessage.\n\t\tlet lastFrameLine = out.length - 1;\n\t\twhile (lastFrameLine > firstFrameLine && out[lastFrameLine] === \"\") {\n\t\t\tlastFrameLine--;\n\t\t}\n\t\tout[firstFrameLine] = OSC133_ZONE_START + out[firstFrameLine];\n\t\tout[lastFrameLine] = out[lastFrameLine] + OSC133_ZONE_END;\n\t\treturn this.renderCache.set(cacheKey, out);\n\t}\n\n\tprivate clearRenderCache(): void {\n\t\tthis.renderVersion++;\n\t\tthis.renderCache.clear();\n\t}\n}\n"]}
@@ -1,4 +1,7 @@
1
1
  import type { InteractiveModeEvent, InteractiveModeStateHost } from "../interactive-mode-state.js";
2
+ /** Compact activity pulse used when extensions suppress the default working loader. */
3
+ export declare function startActivityIndicator(host: InteractiveModeStateHost, message?: string): void;
4
+ export declare function stopActivityIndicator(host: InteractiveModeStateHost): void;
2
5
  /** True when assistant prose is handing off to the user (question or explicit invite). */
3
6
  export declare function textInvitesUserReply(text: string): boolean;
4
7
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"chat-controller.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/controllers/chat-controller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAuJnG,0FAA0F;AAC1F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1D;AA2CD;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAYzF;AAiFD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC5C,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACrD,IAAI,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC,MAAM,GAAG,SAAS,CAkBpB;AA0HD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ/D;AA6CD,wBAAgB,4BAA4B,CAC3C,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,GACvB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB/C;AAED,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAExE;AAgJD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,wBAAwB,GAAG;IACvE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,4BAA4B,EAAE,MAAM,GAAG,CAAC;IACxC,gBAAgB,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACxD,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;IACpD,2BAA2B,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,CAAC;IACvD,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,oBAAoB,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,4BAA4B,EAAE,MAAM,IAAI,CAAC;IACzC,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,wBAAwB,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CAChD,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyzB7C"}
1
+ {"version":3,"file":"chat-controller.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/controllers/chat-controller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAiInG,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,wBAAwB,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAc7F;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,wBAAwB,GAAG,IAAI,CAO1E;AAyBD,0FAA0F;AAC1F,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAK1D;AA2CD;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAYzF;AAiFD;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC5C,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACrD,IAAI,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAAE,GACpC,MAAM,GAAG,SAAS,CAkBpB;AA0HD,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQ/D;AA6CD,wBAAgB,4BAA4B,CAC3C,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,GACvB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB/C;AAED,wBAAgB,sBAAsB,CAAC,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAExE;AAgJD,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,wBAAwB,GAAG;IACvE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,4BAA4B,EAAE,MAAM,GAAG,CAAC;IACxC,gBAAgB,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACxD,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC;IACpD,2BAA2B,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG,CAAC;IACvD,sBAAsB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,oBAAoB,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,4BAA4B,EAAE,MAAM,IAAI,CAAC;IACzC,mBAAmB,EAAE,MAAM,IAAI,CAAC;IAChC,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,wBAAwB,EAAE;QAAE,KAAK,EAAE,MAAM,IAAI,CAAA;KAAE,CAAC;CAChD,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgzB7C"}
@@ -3,7 +3,7 @@
3
3
  import { Loader, Markdown, Spacer, Text } from "@gsd/pi-tui";
4
4
  import { theme } from "@gsd/pi-coding-agent/theme/theme.js";
5
5
  import { AssistantMessageComponent } from "../components/assistant-message.js";
6
- import { chatTurnFollowsUser, reconcileChatTurnConnections } from "../components/chat-turn-connect.js";
6
+ import { reconcileChatTurnConnections } from "../components/chat-turn-connect.js";
7
7
  import { ToolExecutionComponent, ToolPhaseSummaryComponent, } from "../components/tool-execution.js";
8
8
  import { DynamicBorder } from "../components/dynamic-border.js";
9
9
  import { appKey } from "../components/keybinding-hints.js";
@@ -62,6 +62,7 @@ function startLoadingAnimation(host) {
62
62
  if (host.pendingWorkingMessage === null) {
63
63
  host.loadingAnimation = undefined;
64
64
  host.statusContainer.clear();
65
+ startActivityIndicator(host);
65
66
  return;
66
67
  }
67
68
  host.loadingAnimation = new Loader(host.ui, (spinner) => theme.fg("accent", spinner), (text) => theme.fg("muted", text), host.defaultWorkingMessage);
@@ -73,6 +74,25 @@ function startLoadingAnimation(host) {
73
74
  host.pendingWorkingMessage = undefined;
74
75
  }
75
76
  }
77
+ /** Compact activity pulse used when extensions suppress the default working loader. */
78
+ export function startActivityIndicator(host, message) {
79
+ stopActivityIndicator(host);
80
+ const phase = message?.trim() ||
81
+ host.gsdProgressState?.phase ||
82
+ host.defaultWorkingMessage;
83
+ host.activityLoader = new Loader(host.ui, (spinner) => theme.fg("accent", spinner), (text) => theme.fg("muted", text), phase);
84
+ host.statusContainer.addChild(host.activityLoader);
85
+ host.ui.requestRender();
86
+ }
87
+ export function stopActivityIndicator(host) {
88
+ if (!host.activityLoader)
89
+ return;
90
+ host.activityLoader.stop();
91
+ host.activityLoader = undefined;
92
+ if (!host.loadingAnimation && !host.autoCompactionLoader && !host.retryLoader) {
93
+ host.statusContainer.clear();
94
+ }
95
+ }
76
96
  function markTuiLatency(host, phase, data) {
77
97
  host.session?.markTurnLatency?.(phase, data);
78
98
  }
@@ -589,6 +609,7 @@ export async function handleAgentEvent(host, event) {
589
609
  if (host.loadingAnimation) {
590
610
  host.loadingAnimation.stop();
591
611
  }
612
+ stopActivityIndicator(host);
592
613
  host.statusContainer.clear();
593
614
  startLoadingAnimation(host);
594
615
  markTuiLatency(host, "tui.loader_visible");
@@ -807,10 +828,7 @@ export async function handleAgentEvent(host, event) {
807
828
  if (shouldSuppressRedundantHandoffText(host.session.messages, segmentText, orphanedSegments, renderedSegments)) {
808
829
  continue;
809
830
  }
810
- const connectedToUser = renderedSegments.filter((s) => s.kind === "text-run").length === 0 &&
811
- orphanedSegments.filter((s) => s.kind === "text-run").length === 0 &&
812
- chatTurnFollowsUser(host.chatContainer.children);
813
- const comp = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), timestampFormat, { startIndex: seg.startIndex, endIndex: seg.endIndex }, connectedToUser);
831
+ const comp = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), timestampFormat, { startIndex: seg.startIndex, endIndex: seg.endIndex });
814
832
  host.chatContainer.addChild(comp);
815
833
  markFirstVisibleAssistantOutput(host, seg.contentType, {
816
834
  contentIndex: seg.startIndex,
@@ -988,9 +1006,7 @@ export async function handleAgentEvent(host, event) {
988
1006
  }
989
1007
  continue;
990
1008
  }
991
- const connectedToUser = renderedSegments.filter((s) => s.kind === "text-run").length === 0 &&
992
- chatTurnFollowsUser(host.chatContainer.children);
993
- const comp = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), timestampFormat, { startIndex: seg.startIndex, endIndex: seg.endIndex }, connectedToUser);
1009
+ const comp = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), timestampFormat, { startIndex: seg.startIndex, endIndex: seg.endIndex });
994
1010
  comp.updateContent(host.streamingMessage);
995
1011
  const segmentText = getTextFromContentBlocks(finalBlocks, seg.startIndex, seg.endIndex);
996
1012
  if (shouldSuppressRedundantHandoffText(host.session.messages, segmentText, orphanedSegments, renderedSegments)) {
@@ -1014,8 +1030,7 @@ export async function handleAgentEvent(host, event) {
1014
1030
  reconcileChatTurnConnections(host.chatContainer.children);
1015
1031
  }
1016
1032
  if (!host.streamingComponent && shouldRenderAssistant && !suppressRedundantHandoff) {
1017
- const connectedToUser = chatTurnFollowsUser(host.chatContainer.children);
1018
- host.streamingComponent = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), timestampFormat, undefined, connectedToUser);
1033
+ host.streamingComponent = new AssistantMessageComponent(undefined, host.hideThinkingBlock, host.getMarkdownThemeWithSettings(), timestampFormat, undefined);
1019
1034
  host.chatContainer.addChild(host.streamingComponent);
1020
1035
  markFirstVisibleAssistantOutput(host, "message_end_only");
1021
1036
  reconcileChatTurnConnections(host.chatContainer.children);
@@ -1095,6 +1110,7 @@ export async function handleAgentEvent(host, event) {
1095
1110
  host.loadingAnimation = undefined;
1096
1111
  host.statusContainer.clear();
1097
1112
  }
1113
+ stopActivityIndicator(host);
1098
1114
  if (host.streamingComponent && host.streamingMessage) {
1099
1115
  host.streamingComponent.setShowMetadata(true);
1100
1116
  host.streamingComponent.updateContent(host.streamingMessage);