@opengsd/gsd-pi 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1343) hide show
  1. package/README.md +51 -3
  2. package/dist/claude-cli-check.js +1 -1
  3. package/dist/cli-policy.d.ts +1 -1
  4. package/dist/cli-policy.js +2 -2
  5. package/dist/cli.js +4 -3
  6. package/dist/extension-sort.js +1 -1
  7. package/dist/extension-validator.js +1 -1
  8. package/dist/help-text.js +8 -0
  9. package/dist/loader-entrypoint.js +1 -1
  10. package/dist/loader.js +0 -0
  11. package/dist/resource-loader.js +22 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +2 -2
  14. package/dist/resources/extensions/github-sync/templates.js +1 -1
  15. package/dist/resources/extensions/gsd/auto/contracts.js +1 -1
  16. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +1 -1
  17. package/dist/resources/extensions/gsd/auto/lease-conflict-notice.js +1 -1
  18. package/dist/resources/extensions/gsd/auto/loop.js +2 -2
  19. package/dist/resources/extensions/gsd/auto/orchestrator.js +1 -1
  20. package/dist/resources/extensions/gsd/auto/phases.js +9 -3
  21. package/dist/resources/extensions/gsd/auto/run-unit.js +110 -44
  22. package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +18 -0
  23. package/dist/resources/extensions/gsd/auto/session.js +1 -1
  24. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +1 -1
  25. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  26. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +1 -1
  27. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +1 -1
  28. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +1 -1
  29. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +1 -1
  30. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +1 -1
  31. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +1 -1
  33. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +1 -1
  34. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +1 -1
  35. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +1 -1
  36. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +1 -1
  37. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +1 -1
  38. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +1 -1
  39. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +1 -1
  40. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +1 -1
  41. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +1 -1
  42. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +1 -1
  43. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  44. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +1 -1
  45. package/dist/resources/extensions/gsd/auto-artifact-paths.js +1 -1
  46. package/dist/resources/extensions/gsd/auto-budget.js +1 -1
  47. package/dist/resources/extensions/gsd/auto-dashboard.js +1 -1
  48. package/dist/resources/extensions/gsd/auto-dispatch.js +1 -1
  49. package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
  50. package/dist/resources/extensions/gsd/auto-prompts.js +2 -2
  51. package/dist/resources/extensions/gsd/auto-recovery.js +1 -1
  52. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  53. package/dist/resources/extensions/gsd/auto-status-message.js +1 -1
  54. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  55. package/dist/resources/extensions/gsd/auto-unit-closeout.js +1 -1
  56. package/dist/resources/extensions/gsd/auto-verification.js +1 -1
  57. package/dist/resources/extensions/gsd/auto-worktree-repair.js +1 -1
  58. package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
  59. package/dist/resources/extensions/gsd/auto.js +33 -4
  60. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +5 -9
  61. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +1 -1
  62. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
  63. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  64. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +1 -1
  65. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +2 -2
  66. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  67. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -1
  68. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +3 -1
  69. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +1 -1
  70. package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +69 -0
  71. package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
  72. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  73. package/dist/resources/extensions/gsd/browser-evidence.js +1 -1
  74. package/dist/resources/extensions/gsd/closeout-recovery.js +1 -1
  75. package/dist/resources/extensions/gsd/commands/catalog.js +2 -1
  76. package/dist/resources/extensions/gsd/commands/dispatcher.js +1 -1
  77. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
  78. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +1 -1
  79. package/dist/resources/extensions/gsd/commands/handlers/ops.js +1 -1
  80. package/dist/resources/extensions/gsd/commands-bootstrap.js +1 -0
  81. package/dist/resources/extensions/gsd/commands-closeout.js +1 -1
  82. package/dist/resources/extensions/gsd/commands-ship.js +1 -1
  83. package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
  84. package/dist/resources/extensions/gsd/commands-workflow-templates.js +1 -1
  85. package/dist/resources/extensions/gsd/commands-worktree.js +1 -1
  86. package/dist/resources/extensions/gsd/component-loader.js +1 -1
  87. package/dist/resources/extensions/gsd/db/auto-workers.js +1 -1
  88. package/dist/resources/extensions/gsd/db/command-queue.js +1 -1
  89. package/dist/resources/extensions/gsd/db/milestone-leases.js +20 -6
  90. package/dist/resources/extensions/gsd/db/runtime-kv.js +1 -1
  91. package/dist/resources/extensions/gsd/db/unit-dispatches.js +1 -1
  92. package/dist/resources/extensions/gsd/db-adapter.js +1 -1
  93. package/dist/resources/extensions/gsd/db-base-schema.js +1 -1
  94. package/dist/resources/extensions/gsd/db-connection-cache.js +1 -1
  95. package/dist/resources/extensions/gsd/db-coordination-schema.js +1 -1
  96. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +1 -1
  97. package/dist/resources/extensions/gsd/db-gate-rows.js +1 -1
  98. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +1 -1
  99. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +1 -1
  100. package/dist/resources/extensions/gsd/db-migration-backup.js +1 -1
  101. package/dist/resources/extensions/gsd/db-migration-steps.js +1 -1
  102. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +1 -1
  103. package/dist/resources/extensions/gsd/db-open-state.js +1 -1
  104. package/dist/resources/extensions/gsd/db-provider.js +1 -1
  105. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +1 -1
  106. package/dist/resources/extensions/gsd/db-schema-metadata.js +1 -1
  107. package/dist/resources/extensions/gsd/db-task-slice-rows.js +1 -1
  108. package/dist/resources/extensions/gsd/db-transaction.js +1 -1
  109. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +1 -1
  110. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +1 -1
  111. package/dist/resources/extensions/gsd/doctor-git-checks.js +1 -1
  112. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -1
  113. package/dist/resources/extensions/gsd/ecosystem/loader.js +1 -1
  114. package/dist/resources/extensions/gsd/escalation.js +1 -1
  115. package/dist/resources/extensions/gsd/fresh-run-ui.js +1 -1
  116. package/dist/resources/extensions/gsd/git-conflict-state.js +1 -1
  117. package/dist/resources/extensions/gsd/git-service.js +1 -1
  118. package/dist/resources/extensions/gsd/gsd-command-home.js +1 -1
  119. package/dist/resources/extensions/gsd/gsd-db.js +1 -1
  120. package/dist/resources/extensions/gsd/guided-unit-context.js +1 -1
  121. package/dist/resources/extensions/gsd/health-widget.js +1 -1
  122. package/dist/resources/extensions/gsd/knowledge-backfill.js +1 -1
  123. package/dist/resources/extensions/gsd/knowledge-capture.js +1 -1
  124. package/dist/resources/extensions/gsd/knowledge-parser.js +1 -1
  125. package/dist/resources/extensions/gsd/knowledge-projection.js +1 -1
  126. package/dist/resources/extensions/gsd/legacy-telemetry.js +1 -3
  127. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  128. package/dist/resources/extensions/gsd/md-importer.js +2 -2
  129. package/dist/resources/extensions/gsd/memory-backfill.js +1 -1
  130. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  131. package/dist/resources/extensions/gsd/metrics.js +1 -1
  132. package/dist/resources/extensions/gsd/migrate/audit.js +4 -2
  133. package/dist/resources/extensions/gsd/migrate/command.js +27 -5
  134. package/dist/resources/extensions/gsd/migrate/parser.js +57 -11
  135. package/dist/resources/extensions/gsd/migrate/parsers.js +16 -0
  136. package/dist/resources/extensions/gsd/migrate/preview.js +1 -0
  137. package/dist/resources/extensions/gsd/migrate/safety.js +1 -1
  138. package/dist/resources/extensions/gsd/migrate/transformer.js +79 -6
  139. package/dist/resources/extensions/gsd/migrate/validator.js +22 -1
  140. package/dist/resources/extensions/gsd/migrate/writer.js +1 -1
  141. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +1 -1
  142. package/dist/resources/extensions/gsd/model-router.js +1 -1
  143. package/dist/resources/extensions/gsd/notification-overlay.js +1 -1
  144. package/dist/resources/extensions/gsd/orphan-stash-audit.js +1 -1
  145. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +1 -1
  146. package/dist/resources/extensions/gsd/paths.js +1 -1
  147. package/dist/resources/extensions/gsd/pending-auto-start.js +1 -1
  148. package/dist/resources/extensions/gsd/planning-depth.js +1 -1
  149. package/dist/resources/extensions/gsd/post-execution-checks.js +1 -1
  150. package/dist/resources/extensions/gsd/pr-evidence.js +1 -1
  151. package/dist/resources/extensions/gsd/pre-execution-checks.js +1 -1
  152. package/dist/resources/extensions/gsd/process-task-path.js +1 -1
  153. package/dist/resources/extensions/gsd/prompts/review-migration.md +2 -2
  154. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  155. package/dist/resources/extensions/gsd/recovery-classification.js +1 -1
  156. package/dist/resources/extensions/gsd/repository-registry.js +1 -1
  157. package/dist/resources/extensions/gsd/root-write-leak-guard.js +1 -1
  158. package/dist/resources/extensions/gsd/schemas/parsers.js +1 -1
  159. package/dist/resources/extensions/gsd/schemas/validate.js +1 -1
  160. package/dist/resources/extensions/gsd/skill-manifest.js +1 -1
  161. package/dist/resources/extensions/gsd/slice-cadence.js +1 -1
  162. package/dist/resources/extensions/gsd/smart-entry-routing.js +1 -1
  163. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +1 -1
  164. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +1 -1
  165. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
  166. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +1 -1
  167. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +1 -1
  168. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +1 -1
  169. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +1 -1
  170. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +1 -1
  171. package/dist/resources/extensions/gsd/state-reconciliation/index.js +1 -1
  172. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +1 -1
  173. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +1 -1
  174. package/dist/resources/extensions/gsd/state-reconciliation/types.js +1 -1
  175. package/dist/resources/extensions/gsd/state-reconciliation.js +1 -1
  176. package/dist/resources/extensions/gsd/state.js +9 -18
  177. package/dist/resources/extensions/gsd/tool-contract.js +1 -1
  178. package/dist/resources/extensions/gsd/tools/complete-milestone.js +2 -2
  179. package/dist/resources/extensions/gsd/tools/complete-slice.js +8 -2
  180. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  181. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +1 -1
  182. package/dist/resources/extensions/gsd/tools/exec-tool.js +1 -1
  183. package/dist/resources/extensions/gsd/tools/plan-milestone.js +1 -1
  184. package/dist/resources/extensions/gsd/tools/validate-milestone.js +1 -1
  185. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  186. package/dist/resources/extensions/gsd/tui/render-kit.js +1 -1
  187. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  188. package/dist/resources/extensions/gsd/unit-context-manifest.js +1 -1
  189. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
  190. package/dist/resources/extensions/gsd/uok/audit.js +1 -1
  191. package/dist/resources/extensions/gsd/uok/contracts.js +1 -1
  192. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +1 -1
  193. package/dist/resources/extensions/gsd/uok/loop-adapter.js +1 -1
  194. package/dist/resources/extensions/gsd/uok/plan-v2.js +1 -1
  195. package/dist/resources/extensions/gsd/uok/timeline.js +1 -1
  196. package/dist/resources/extensions/gsd/validation-block-guard.js +1 -1
  197. package/dist/resources/extensions/gsd/verification-gate.js +28 -12
  198. package/dist/resources/extensions/gsd/verification-verdict.js +9 -1
  199. package/dist/resources/extensions/gsd/watch/header-renderer.js +1 -1
  200. package/dist/resources/extensions/gsd/watch/splash-palette.js +1 -1
  201. package/dist/resources/extensions/gsd/workflow-manifest.js +1 -1
  202. package/dist/resources/extensions/gsd/workflow-projections.js +1 -1
  203. package/dist/resources/extensions/gsd/workflow-protocol.js +1 -1
  204. package/dist/resources/extensions/gsd/workflow-templates.js +1 -1
  205. package/dist/resources/extensions/gsd/working-output-messages.js +1 -1
  206. package/dist/resources/extensions/gsd/workspace.js +1 -1
  207. package/dist/resources/extensions/gsd/worktree-lifecycle.js +1 -1
  208. package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
  209. package/dist/resources/extensions/gsd/worktree-safety.js +1 -1
  210. package/dist/resources/extensions/gsd/worktree-state-projection.js +1 -1
  211. package/dist/resources/extensions/mcp-client/manager.js +1 -1
  212. package/dist/resources/extensions/ollama/index.js +1 -1
  213. package/dist/resources/extensions/ollama/model-capabilities.js +1 -1
  214. package/dist/resources/extensions/ollama/ndjson-stream.js +1 -1
  215. package/dist/resources/extensions/ollama/ollama-chat-provider.js +1 -1
  216. package/dist/resources/extensions/ollama/ollama-client.js +1 -1
  217. package/dist/resources/extensions/ollama/ollama-commands.js +1 -1
  218. package/dist/resources/extensions/ollama/ollama-discovery.js +1 -1
  219. package/dist/resources/extensions/ollama/ollama-tool.js +1 -1
  220. package/dist/resources/extensions/ollama/thinking-parser.js +1 -1
  221. package/dist/resources/extensions/ollama/types.js +1 -1
  222. package/dist/resources/extensions/shared/cmux-events.js +1 -1
  223. package/dist/resources/extensions/shared/gsd-phase-state.js +1 -1
  224. package/dist/resources/extensions/shared/interview-ui.js +1 -1
  225. package/dist/resources/extensions/subagent/launch.js +1 -1
  226. package/dist/resources/extensions/subagent/run-store.js +1 -1
  227. package/dist/resources/extensions/visual-brief/artifact-policy.js +1 -1
  228. package/dist/resources/extensions/visual-brief/index.js +1 -1
  229. package/dist/resources/extensions/visual-brief/page-contract.js +1 -1
  230. package/dist/resources/extensions/visual-brief/prompts.js +1 -1
  231. package/dist/resources/skills/api-design/SKILL.md +1 -1
  232. package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
  233. package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
  234. package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
  235. package/dist/resources/skills/observability/SKILL.md +4 -4
  236. package/dist/resources/skills/security-review/SKILL.md +1 -1
  237. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  238. package/dist/update-check.d.ts +5 -2
  239. package/dist/update-check.js +10 -7
  240. package/dist/update-cmd.d.ts +6 -1
  241. package/dist/update-cmd.js +4 -1
  242. package/dist/web/standalone/.next/BUILD_ID +1 -1
  243. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  244. package/dist/web/standalone/.next/build-manifest.json +3 -3
  245. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  246. package/dist/web/standalone/.next/required-server-files.json +4 -4
  247. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  248. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  250. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  251. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  252. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  253. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  254. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  255. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  256. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  257. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  258. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  259. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  260. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  261. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  262. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  263. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  264. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  265. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  266. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  267. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  269. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  270. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  272. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  273. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  274. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  275. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  276. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  277. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  278. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  279. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  280. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  281. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  282. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  283. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  284. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  285. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  286. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  287. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  288. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  289. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  290. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  291. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  292. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  293. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  294. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  295. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  296. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  297. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  298. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  299. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  300. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  301. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  302. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  303. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  304. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  305. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  306. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  307. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  308. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  309. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  310. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  311. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  312. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  313. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  314. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  315. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  316. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  317. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  318. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  319. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  320. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  321. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  322. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  323. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  324. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  325. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  326. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  327. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  328. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  329. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  330. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  331. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  332. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  333. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  334. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  335. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  336. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  337. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  338. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  339. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  340. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  341. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  342. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  343. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  344. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  345. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  346. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  347. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  348. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  349. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  350. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  351. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  352. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  353. package/dist/web/standalone/.next/server/app/index.html +1 -1
  354. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  355. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  356. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  357. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  358. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  359. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  360. package/dist/web/standalone/.next/server/app/page.js +2 -2
  361. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  362. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  363. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  364. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  365. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  366. package/dist/web/standalone/.next/server/middleware.js +2 -2
  367. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  368. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  369. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  370. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-a662c55787b78a48.js → page-0fa92deaf6721345.js} +1 -1
  371. package/dist/web/standalone/.next/static/chunks/app/layout-68f32aa90495be18.js +1 -0
  372. package/dist/web/standalone/.next/static/chunks/app/page-4dbb4d03b2d85d57.js +1 -0
  373. package/dist/web/standalone/.next/static/chunks/{main-app-da6af500e9c35ea7.js → main-app-c3abead5a8518a30.js} +1 -1
  374. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-de2636d5a7f60b61.js +1 -0
  375. package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64/lib/libvips-cpp.8.17.3.dylib → sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3} +0 -0
  376. package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64 → sharp-libvips-linux-x64}/package.json +11 -5
  377. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +1 -0
  378. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  379. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +42 -0
  380. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +30 -0
  381. package/dist/web/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
  382. package/dist/web/standalone/node_modules/@img/{sharp-darwin-arm64 → sharp-linux-x64}/package.json +13 -7
  383. package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/LICENSE +191 -0
  384. package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
  385. package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +46 -0
  386. package/dist/web/standalone/node_modules/node-pty/build/Makefile +369 -0
  387. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  388. package/dist/web/standalone/node_modules/node-pty/build/binding.Makefile +6 -0
  389. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +168 -0
  390. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.Makefile +6 -0
  391. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +106 -0
  392. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +110 -0
  393. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +106 -0
  394. package/dist/web/standalone/server.js +1 -1
  395. package/dist/welcome-screen.js +1 -1
  396. package/package.json +11 -7
  397. package/packages/contracts/dist/index.js +1 -1
  398. package/packages/contracts/dist/index.js.map +1 -1
  399. package/packages/contracts/dist/rpc.js +1 -1
  400. package/packages/contracts/dist/rpc.js.map +1 -1
  401. package/packages/contracts/dist/rpc.test.js +1 -1
  402. package/packages/contracts/dist/rpc.test.js.map +1 -1
  403. package/packages/contracts/dist/workflow.js +1 -1
  404. package/packages/contracts/dist/workflow.js.map +1 -1
  405. package/packages/contracts/package.json +1 -1
  406. package/packages/contracts/src/index.ts +1 -1
  407. package/packages/contracts/src/rpc.test.ts +1 -1
  408. package/packages/contracts/src/rpc.ts +1 -1
  409. package/packages/contracts/src/workflow.ts +1 -1
  410. package/packages/daemon/package.json +3 -3
  411. package/packages/mcp-server/dist/workflow-tools.js +1 -1
  412. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  413. package/packages/mcp-server/package.json +3 -3
  414. package/packages/mcp-server/src/import-candidates.test.ts +1 -1
  415. package/packages/mcp-server/src/workflow-tools-parity.test.ts +1 -1
  416. package/packages/mcp-server/src/workflow-tools.test.ts +1 -1
  417. package/packages/mcp-server/src/workflow-tools.ts +1 -1
  418. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  419. package/packages/native/dist/grep/index.js +35 -1
  420. package/packages/native/dist/index.d.ts +1 -0
  421. package/packages/native/dist/index.js +4 -1
  422. package/packages/native/dist/native.d.ts +2 -0
  423. package/packages/native/dist/native.js +38 -25
  424. package/packages/native/dist/text/index.js +118 -6
  425. package/packages/native/dist/xxhash/index.d.ts +1 -2
  426. package/packages/native/dist/xxhash/index.js +7 -7
  427. package/packages/native/package.json +1 -1
  428. package/packages/native/src/__tests__/function-fallback.test.mjs +37 -0
  429. package/packages/native/src/__tests__/text-fallback.test.mjs +44 -0
  430. package/packages/native/src/grep/index.ts +38 -1
  431. package/packages/native/src/index.ts +2 -0
  432. package/packages/native/src/native.ts +37 -22
  433. package/packages/native/src/text/index.ts +145 -32
  434. package/packages/native/src/xxhash/index.ts +6 -9
  435. package/packages/native/tsconfig.tsbuildinfo +1 -1
  436. package/packages/pi-agent-core/dist/token-audit.js +1 -1
  437. package/packages/pi-agent-core/dist/token-audit.js.map +1 -1
  438. package/packages/pi-agent-core/package.json +1 -1
  439. package/packages/pi-agent-core/src/token-audit.test.ts +1 -1
  440. package/packages/pi-agent-core/src/token-audit.ts +1 -1
  441. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  442. package/packages/pi-ai/dist/models/fake-model.d.ts +1 -1
  443. package/packages/pi-ai/dist/models/fake-model.js +1 -1
  444. package/packages/pi-ai/dist/models/fake-model.js.map +1 -1
  445. package/packages/pi-ai/dist/providers/api-family.js +1 -1
  446. package/packages/pi-ai/dist/providers/api-family.js.map +1 -1
  447. package/packages/pi-ai/dist/providers/api-family.test.js +1 -1
  448. package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -1
  449. package/packages/pi-ai/dist/providers/fake.d.ts +1 -1
  450. package/packages/pi-ai/dist/providers/fake.js +1 -1
  451. package/packages/pi-ai/dist/providers/fake.js.map +1 -1
  452. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +1 -1
  453. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -1
  454. package/packages/pi-ai/dist/providers/provider-capabilities.js +1 -1
  455. package/packages/pi-ai/dist/providers/provider-capabilities.js.map +1 -1
  456. package/packages/pi-ai/dist/providers/provider-capabilities.test.js +1 -1
  457. package/packages/pi-ai/dist/providers/provider-capabilities.test.js.map +1 -1
  458. package/packages/pi-ai/dist/providers/transform-messages-report.test.js +1 -1
  459. package/packages/pi-ai/dist/providers/transform-messages-report.test.js.map +1 -1
  460. package/packages/pi-ai/dist/types.js.map +1 -1
  461. package/packages/pi-ai/package.json +1 -1
  462. package/packages/pi-ai/src/models/fake-model.ts +1 -1
  463. package/packages/pi-ai/src/providers/api-family.test.ts +1 -1
  464. package/packages/pi-ai/src/providers/api-family.ts +1 -1
  465. package/packages/pi-ai/src/providers/fake.ts +1 -1
  466. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +1 -1
  467. package/packages/pi-ai/src/providers/provider-capabilities.test.ts +1 -1
  468. package/packages/pi-ai/src/providers/provider-capabilities.ts +1 -1
  469. package/packages/pi-ai/src/providers/transform-messages-report.test.ts +1 -1
  470. package/packages/pi-ai/src/types.ts +1 -1
  471. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  472. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +1 -1
  473. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  474. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  475. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  476. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +1 -1
  477. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  478. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +1 -1
  479. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -1
  480. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +1 -1
  481. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -1
  482. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +1 -1
  483. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -1
  484. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +1 -1
  485. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -1
  486. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js +1 -1
  487. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js.map +1 -1
  488. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +1 -1
  489. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +1 -1
  490. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts.map +1 -1
  491. package/packages/pi-coding-agent/dist/core/model-discovery.js +5 -1
  492. package/packages/pi-coding-agent/dist/core/model-discovery.js.map +1 -1
  493. package/packages/pi-coding-agent/dist/core/model-discovery.test.js +21 -0
  494. package/packages/pi-coding-agent/dist/core/model-discovery.test.js.map +1 -1
  495. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +1 -1
  496. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -1
  497. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  498. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  499. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +1 -1
  500. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  501. package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.js +1 -1
  502. package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.js.map +1 -1
  503. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +1 -1
  504. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -1
  505. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +1 -1
  506. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -1
  507. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +1 -1
  508. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -1
  509. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +1 -1
  510. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  511. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/collapsible-message.test.js +1 -1
  512. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/collapsible-message.test.js.map +1 -1
  513. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +1 -1
  514. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  515. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +1 -1
  516. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -1
  517. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +2 -2
  518. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  519. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +1 -1
  520. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -1
  521. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +1 -1
  522. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  523. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +1 -1
  524. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  525. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.js +1 -1
  526. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.js.map +1 -1
  527. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.test.js +1 -1
  528. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.test.js.map +1 -1
  529. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +1 -1
  530. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  531. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  532. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +1 -1
  533. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  534. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.test.js +1 -1
  535. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.test.js.map +1 -1
  536. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  537. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  538. package/packages/pi-coding-agent/dist/modes/interactive/components/collapsible-message.js +1 -1
  539. package/packages/pi-coding-agent/dist/modes/interactive/components/collapsible-message.js.map +1 -1
  540. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  541. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  542. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +1 -1
  543. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  544. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +1 -1
  545. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  546. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-editor.js +1 -1
  547. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-editor.js.map +1 -1
  548. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  549. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  550. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +1 -1
  551. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  552. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.test.js +1 -1
  553. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.test.js.map +1 -1
  554. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +1 -1
  555. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  556. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +1 -1
  557. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  558. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +1 -1
  559. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  560. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +1 -1
  561. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  562. package/packages/pi-coding-agent/dist/modes/interactive/components/interactive-key-handling.test.js +1 -1
  563. package/packages/pi-coding-agent/dist/modes/interactive/components/interactive-key-handling.test.js.map +1 -1
  564. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +1 -1
  565. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  566. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +1 -1
  567. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  568. package/packages/pi-coding-agent/dist/modes/interactive/components/render-cache.js +1 -1
  569. package/packages/pi-coding-agent/dist/modes/interactive/components/render-cache.js.map +1 -1
  570. package/packages/pi-coding-agent/dist/modes/interactive/components/selector-footers.test.js +1 -1
  571. package/packages/pi-coding-agent/dist/modes/interactive/components/selector-footers.test.js.map +1 -1
  572. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  573. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  574. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.js +1 -1
  575. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.js.map +1 -1
  576. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.test.js +1 -1
  577. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.test.js.map +1 -1
  578. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +1 -1
  579. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -1
  580. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +2 -2
  581. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  582. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  583. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  584. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +1 -1
  585. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -1
  586. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js +1 -1
  587. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js.map +1 -1
  588. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js +1 -1
  589. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js.map +1 -1
  590. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +1 -1
  591. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  592. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.test.js +1 -1
  593. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.test.js.map +1 -1
  594. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +1 -1
  595. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  596. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +1 -1
  597. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  598. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -1
  599. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  600. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-lifecycle.test.js +1 -1
  601. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-lifecycle.test.js.map +1 -1
  602. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +1 -1
  603. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  604. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +2 -2
  605. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  606. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +1 -1
  607. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -1
  608. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +1 -1
  609. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -1
  610. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  611. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  612. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +1 -1
  613. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -1
  614. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +1 -1
  615. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  616. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js +1 -1
  617. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js.map +1 -1
  618. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.js +1 -1
  619. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.js.map +1 -1
  620. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.test.js +1 -1
  621. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.test.js.map +1 -1
  622. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +1 -1
  623. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  624. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +1 -1
  625. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -1
  626. package/packages/pi-coding-agent/package.json +2 -2
  627. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +1 -1
  628. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  629. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +1 -1
  630. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +1 -1
  631. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +1 -1
  632. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +1 -1
  633. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +1 -1
  634. package/packages/pi-coding-agent/src/core/extensions/provider-registration.test.ts +1 -1
  635. package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +1 -1
  636. package/packages/pi-coding-agent/src/core/model-discovery.test.ts +22 -0
  637. package/packages/pi-coding-agent/src/core/model-discovery.ts +6 -1
  638. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +1 -1
  639. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  640. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +1 -1
  641. package/packages/pi-coding-agent/src/core/tools/tool-compatibility-registry.ts +1 -1
  642. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +1 -1
  643. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +1 -1
  644. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +1 -1
  645. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +1 -1
  646. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/collapsible-message.test.ts +1 -1
  647. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +1 -1
  648. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +1 -1
  649. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +2 -2
  650. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +1 -1
  651. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +1 -1
  652. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +1 -1
  653. package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.test.ts +1 -1
  654. package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.ts +1 -1
  655. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +1 -1
  656. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -1
  657. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.test.ts +1 -1
  658. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +1 -1
  659. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  660. package/packages/pi-coding-agent/src/modes/interactive/components/collapsible-message.ts +1 -1
  661. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  662. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +1 -1
  663. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +1 -1
  664. package/packages/pi-coding-agent/src/modes/interactive/components/custom-editor.ts +1 -1
  665. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  666. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.test.ts +1 -1
  667. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +1 -1
  668. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +1 -1
  669. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -1
  670. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +1 -1
  671. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +1 -1
  672. package/packages/pi-coding-agent/src/modes/interactive/components/interactive-key-handling.test.ts +1 -1
  673. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +1 -1
  674. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +1 -1
  675. package/packages/pi-coding-agent/src/modes/interactive/components/render-cache.ts +1 -1
  676. package/packages/pi-coding-agent/src/modes/interactive/components/selector-footers.test.ts +1 -1
  677. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +1 -1
  678. package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.test.ts +1 -1
  679. package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.ts +1 -1
  680. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +1 -1
  681. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +2 -2
  682. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  683. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +1 -1
  684. package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +1 -1
  685. package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +1 -1
  686. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.test.ts +1 -1
  687. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +1 -1
  688. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +1 -1
  689. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +1 -1
  690. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -1
  691. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-lifecycle.test.ts +1 -1
  692. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +1 -1
  693. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +2 -2
  694. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +1 -1
  695. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +1 -1
  696. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  697. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +1 -1
  698. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +1 -1
  699. package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +1 -1
  700. package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.test.ts +1 -1
  701. package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.ts +1 -1
  702. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +1 -1
  703. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +1 -1
  704. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  705. package/packages/pi-tui/dist/__tests__/keys.test.js +1 -1
  706. package/packages/pi-tui/dist/__tests__/keys.test.js.map +1 -1
  707. package/packages/pi-tui/dist/__tests__/style.test.js +1 -1
  708. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -1
  709. package/packages/pi-tui/dist/__tests__/tui.test.js +1 -1
  710. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  711. package/packages/pi-tui/dist/__tests__/utils.test.js +5 -2
  712. package/packages/pi-tui/dist/__tests__/utils.test.js.map +1 -1
  713. package/packages/pi-tui/dist/components/__tests__/box.test.js +1 -1
  714. package/packages/pi-tui/dist/components/__tests__/box.test.js.map +1 -1
  715. package/packages/pi-tui/dist/components/__tests__/editor.test.js +1 -1
  716. package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -1
  717. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js +1 -1
  718. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js.map +1 -1
  719. package/packages/pi-tui/dist/components/box.js +1 -1
  720. package/packages/pi-tui/dist/components/box.js.map +1 -1
  721. package/packages/pi-tui/dist/components/editor.js +1 -1
  722. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  723. package/packages/pi-tui/dist/components/input.js +1 -1
  724. package/packages/pi-tui/dist/components/input.js.map +1 -1
  725. package/packages/pi-tui/dist/components/truncated-text.js +1 -1
  726. package/packages/pi-tui/dist/components/truncated-text.js.map +1 -1
  727. package/packages/pi-tui/dist/index.js +1 -1
  728. package/packages/pi-tui/dist/index.js.map +1 -1
  729. package/packages/pi-tui/dist/keys.js +1 -1
  730. package/packages/pi-tui/dist/keys.js.map +1 -1
  731. package/packages/pi-tui/dist/overlay-layout.js +1 -1
  732. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  733. package/packages/pi-tui/dist/style.js +1 -1
  734. package/packages/pi-tui/dist/style.js.map +1 -1
  735. package/packages/pi-tui/dist/tui.js +1 -1
  736. package/packages/pi-tui/dist/tui.js.map +1 -1
  737. package/packages/pi-tui/dist/utils.d.ts +3 -1
  738. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  739. package/packages/pi-tui/dist/utils.js +46 -2
  740. package/packages/pi-tui/dist/utils.js.map +1 -1
  741. package/packages/pi-tui/package.json +1 -1
  742. package/packages/pi-tui/src/__tests__/keys.test.ts +1 -1
  743. package/packages/pi-tui/src/__tests__/style.test.ts +1 -1
  744. package/packages/pi-tui/src/__tests__/tui.test.ts +1 -1
  745. package/packages/pi-tui/src/__tests__/utils.test.ts +6 -2
  746. package/packages/pi-tui/src/components/__tests__/box.test.ts +1 -1
  747. package/packages/pi-tui/src/components/__tests__/editor.test.ts +1 -1
  748. package/packages/pi-tui/src/components/__tests__/truncated-text.test.ts +1 -1
  749. package/packages/pi-tui/src/components/box.ts +1 -1
  750. package/packages/pi-tui/src/components/editor.ts +1 -1
  751. package/packages/pi-tui/src/components/input.ts +1 -1
  752. package/packages/pi-tui/src/components/truncated-text.ts +1 -1
  753. package/packages/pi-tui/src/index.ts +1 -1
  754. package/packages/pi-tui/src/keys.ts +1 -1
  755. package/packages/pi-tui/src/overlay-layout.ts +1 -1
  756. package/packages/pi-tui/src/style.ts +1 -1
  757. package/packages/pi-tui/src/tui.ts +1 -1
  758. package/packages/pi-tui/src/utils.ts +47 -2
  759. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  760. package/packages/rpc-client/dist/rpc-types.js +1 -1
  761. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  762. package/packages/rpc-client/package.json +2 -2
  763. package/packages/rpc-client/src/rpc-types.ts +1 -1
  764. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  765. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +1 -1
  766. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -1
  767. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  768. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  769. package/pkg/package.json +1 -1
  770. package/scripts/install.js +36 -3
  771. package/scripts/lib/workspace-manifest.cjs +1 -1
  772. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +2 -2
  773. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +5 -5
  774. package/src/resources/extensions/github-sync/templates.ts +1 -1
  775. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +1 -1
  776. package/src/resources/extensions/github-sync/tests/templates.test.ts +1 -1
  777. package/src/resources/extensions/google-search/index.ts +1 -1
  778. package/src/resources/extensions/gsd/auto/contracts.ts +1 -1
  779. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +1 -1
  780. package/src/resources/extensions/gsd/auto/lease-conflict-notice.ts +1 -1
  781. package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -0
  782. package/src/resources/extensions/gsd/auto/loop.ts +2 -2
  783. package/src/resources/extensions/gsd/auto/orchestrator.ts +1 -1
  784. package/src/resources/extensions/gsd/auto/phases.ts +14 -3
  785. package/src/resources/extensions/gsd/auto/run-unit.ts +117 -45
  786. package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +40 -0
  787. package/src/resources/extensions/gsd/auto/session.ts +1 -1
  788. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +1 -1
  789. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +1 -1
  790. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +1 -1
  791. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +1 -1
  792. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +1 -1
  793. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +1 -1
  794. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +1 -1
  795. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +1 -1
  796. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +1 -1
  797. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +1 -1
  798. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +1 -1
  799. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +1 -1
  800. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +1 -1
  801. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +1 -1
  802. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +1 -1
  803. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +1 -1
  804. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +1 -1
  805. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +1 -1
  806. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +1 -1
  807. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  808. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +1 -1
  809. package/src/resources/extensions/gsd/auto-artifact-paths.ts +1 -1
  810. package/src/resources/extensions/gsd/auto-budget.ts +1 -1
  811. package/src/resources/extensions/gsd/auto-dashboard.ts +1 -1
  812. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -1
  813. package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
  814. package/src/resources/extensions/gsd/auto-prompts.ts +2 -2
  815. package/src/resources/extensions/gsd/auto-recovery.ts +1 -1
  816. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  817. package/src/resources/extensions/gsd/auto-status-message.ts +1 -1
  818. package/src/resources/extensions/gsd/auto-timers.ts +13 -4
  819. package/src/resources/extensions/gsd/auto-unit-closeout.ts +1 -1
  820. package/src/resources/extensions/gsd/auto-verification.ts +1 -1
  821. package/src/resources/extensions/gsd/auto-worktree-repair.ts +1 -1
  822. package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
  823. package/src/resources/extensions/gsd/auto.ts +36 -4
  824. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +5 -9
  825. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +1 -1
  826. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
  827. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  828. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +1 -1
  829. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +2 -2
  830. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  831. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +3 -1
  832. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +4 -1
  833. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +1 -1
  834. package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +81 -0
  835. package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
  836. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +1 -1
  837. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +1 -1
  838. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  839. package/src/resources/extensions/gsd/browser-evidence.ts +1 -1
  840. package/src/resources/extensions/gsd/closeout-recovery.ts +1 -1
  841. package/src/resources/extensions/gsd/commands/catalog.ts +2 -1
  842. package/src/resources/extensions/gsd/commands/dispatcher.ts +1 -1
  843. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
  844. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +1 -1
  845. package/src/resources/extensions/gsd/commands/handlers/ops.ts +2 -2
  846. package/src/resources/extensions/gsd/commands-bootstrap.ts +1 -0
  847. package/src/resources/extensions/gsd/commands-closeout.ts +1 -1
  848. package/src/resources/extensions/gsd/commands-ship.ts +1 -1
  849. package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
  850. package/src/resources/extensions/gsd/commands-workflow-templates.ts +1 -1
  851. package/src/resources/extensions/gsd/commands-worktree.ts +1 -1
  852. package/src/resources/extensions/gsd/component-loader.ts +1 -1
  853. package/src/resources/extensions/gsd/db/auto-workers.ts +1 -1
  854. package/src/resources/extensions/gsd/db/command-queue.ts +1 -1
  855. package/src/resources/extensions/gsd/db/milestone-leases.ts +20 -6
  856. package/src/resources/extensions/gsd/db/runtime-kv.ts +1 -1
  857. package/src/resources/extensions/gsd/db/unit-dispatches.ts +1 -1
  858. package/src/resources/extensions/gsd/db-adapter.ts +1 -1
  859. package/src/resources/extensions/gsd/db-base-schema.ts +1 -1
  860. package/src/resources/extensions/gsd/db-connection-cache.ts +1 -1
  861. package/src/resources/extensions/gsd/db-coordination-schema.ts +1 -1
  862. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +1 -1
  863. package/src/resources/extensions/gsd/db-gate-rows.ts +1 -1
  864. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +1 -1
  865. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +1 -1
  866. package/src/resources/extensions/gsd/db-migration-backup.ts +1 -1
  867. package/src/resources/extensions/gsd/db-migration-steps.ts +1 -1
  868. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +1 -1
  869. package/src/resources/extensions/gsd/db-open-state.ts +1 -1
  870. package/src/resources/extensions/gsd/db-provider.ts +1 -1
  871. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +1 -1
  872. package/src/resources/extensions/gsd/db-schema-metadata.ts +1 -1
  873. package/src/resources/extensions/gsd/db-task-slice-rows.ts +1 -1
  874. package/src/resources/extensions/gsd/db-transaction.ts +1 -1
  875. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +1 -1
  876. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +1 -1
  877. package/src/resources/extensions/gsd/doctor-git-checks.ts +1 -1
  878. package/src/resources/extensions/gsd/doctor-types.ts +1 -1
  879. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +1 -1
  880. package/src/resources/extensions/gsd/ecosystem/loader.ts +1 -1
  881. package/src/resources/extensions/gsd/escalation.ts +1 -1
  882. package/src/resources/extensions/gsd/fresh-run-ui.ts +1 -1
  883. package/src/resources/extensions/gsd/git-conflict-state.ts +1 -1
  884. package/src/resources/extensions/gsd/git-service.ts +1 -1
  885. package/src/resources/extensions/gsd/gsd-command-home.ts +1 -1
  886. package/src/resources/extensions/gsd/gsd-db.ts +1 -1
  887. package/src/resources/extensions/gsd/guided-unit-context.ts +1 -1
  888. package/src/resources/extensions/gsd/health-widget.ts +1 -1
  889. package/src/resources/extensions/gsd/knowledge-backfill.ts +1 -1
  890. package/src/resources/extensions/gsd/knowledge-capture.ts +1 -1
  891. package/src/resources/extensions/gsd/knowledge-parser.ts +1 -1
  892. package/src/resources/extensions/gsd/knowledge-projection.ts +1 -1
  893. package/src/resources/extensions/gsd/legacy-telemetry.ts +1 -4
  894. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  895. package/src/resources/extensions/gsd/md-importer.ts +2 -2
  896. package/src/resources/extensions/gsd/memory-backfill.ts +1 -1
  897. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  898. package/src/resources/extensions/gsd/metrics.ts +1 -1
  899. package/src/resources/extensions/gsd/migrate/audit.ts +8 -2
  900. package/src/resources/extensions/gsd/migrate/command.ts +31 -5
  901. package/src/resources/extensions/gsd/migrate/index.ts +1 -1
  902. package/src/resources/extensions/gsd/migrate/parser.ts +63 -10
  903. package/src/resources/extensions/gsd/migrate/parsers.ts +17 -0
  904. package/src/resources/extensions/gsd/migrate/preview.ts +1 -0
  905. package/src/resources/extensions/gsd/migrate/safety.ts +1 -1
  906. package/src/resources/extensions/gsd/migrate/transformer.ts +81 -6
  907. package/src/resources/extensions/gsd/migrate/types.ts +29 -1
  908. package/src/resources/extensions/gsd/migrate/validator.ts +25 -1
  909. package/src/resources/extensions/gsd/migrate/writer.ts +6 -1
  910. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +1 -1
  911. package/src/resources/extensions/gsd/model-router.ts +1 -1
  912. package/src/resources/extensions/gsd/notification-overlay.ts +1 -1
  913. package/src/resources/extensions/gsd/orphan-stash-audit.ts +1 -1
  914. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +1 -1
  915. package/src/resources/extensions/gsd/paths.ts +1 -1
  916. package/src/resources/extensions/gsd/pending-auto-start.ts +1 -1
  917. package/src/resources/extensions/gsd/planning-depth.ts +1 -1
  918. package/src/resources/extensions/gsd/post-execution-checks.ts +1 -1
  919. package/src/resources/extensions/gsd/pr-evidence.ts +1 -1
  920. package/src/resources/extensions/gsd/pre-execution-checks.ts +1 -1
  921. package/src/resources/extensions/gsd/process-task-path.ts +1 -1
  922. package/src/resources/extensions/gsd/prompts/review-migration.md +2 -2
  923. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  924. package/src/resources/extensions/gsd/recovery-classification.ts +1 -1
  925. package/src/resources/extensions/gsd/repository-registry.ts +1 -1
  926. package/src/resources/extensions/gsd/root-write-leak-guard.ts +1 -1
  927. package/src/resources/extensions/gsd/schemas/parsers.ts +1 -1
  928. package/src/resources/extensions/gsd/schemas/validate.ts +1 -1
  929. package/src/resources/extensions/gsd/skill-manifest.ts +1 -1
  930. package/src/resources/extensions/gsd/slice-cadence.ts +1 -1
  931. package/src/resources/extensions/gsd/smart-entry-routing.ts +1 -1
  932. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +1 -1
  933. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +1 -1
  934. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
  935. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +1 -1
  936. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +1 -1
  937. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +1 -1
  938. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +1 -1
  939. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +1 -1
  940. package/src/resources/extensions/gsd/state-reconciliation/index.ts +1 -1
  941. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +1 -1
  942. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +1 -1
  943. package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -1
  944. package/src/resources/extensions/gsd/state-reconciliation.ts +1 -1
  945. package/src/resources/extensions/gsd/state.ts +9 -17
  946. package/src/resources/extensions/gsd/tests/artifact-validators.test.ts +1 -1
  947. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +1 -1
  948. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +1 -1
  949. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +1 -1
  950. package/src/resources/extensions/gsd/tests/auto-loop-symlink-worktree.test.ts +1 -1
  951. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +65 -6
  952. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +4 -4
  953. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +1 -1
  954. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +75 -1
  955. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +1 -1
  956. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +22 -2
  957. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +1 -1
  958. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +1 -1
  959. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +1 -52
  960. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +1 -1
  961. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +1 -1
  962. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
  963. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -1
  964. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +1 -1
  965. package/src/resources/extensions/gsd/tests/auto-start-validation-block.test.ts +1 -1
  966. package/src/resources/extensions/gsd/tests/auto-status-message.test.ts +1 -1
  967. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +1 -1
  968. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +1 -1
  969. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +1 -1
  970. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +1 -1
  971. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +1 -1
  972. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +1 -1
  973. package/src/resources/extensions/gsd/tests/brief-command.test.ts +1 -1
  974. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +1 -1
  975. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +1 -1
  976. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +1 -1
  977. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +1 -1
  978. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +1 -1
  979. package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +1 -1
  980. package/src/resources/extensions/gsd/tests/cmux.test.ts +1 -1
  981. package/src/resources/extensions/gsd/tests/command-queue.test.ts +1 -1
  982. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +1 -1
  983. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +1 -1
  984. package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +1 -1
  985. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +1 -1
  986. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +3 -3
  987. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +1 -1
  988. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +1 -1
  989. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +27 -0
  990. package/src/resources/extensions/gsd/tests/component-loader.test.ts +1 -1
  991. package/src/resources/extensions/gsd/tests/context-store.test.ts +1 -1
  992. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +1 -1
  993. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +1 -1
  994. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -1
  995. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +1 -1
  996. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
  997. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +1 -1
  998. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +1 -1
  999. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +1 -1
  1000. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +1 -1
  1001. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +1 -1
  1002. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +1 -1
  1003. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +1 -1
  1004. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +1 -1
  1005. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +1 -1
  1006. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +1 -1
  1007. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +1 -1
  1008. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +1 -1
  1009. package/src/resources/extensions/gsd/tests/db-provider.test.ts +1 -1
  1010. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +1 -1
  1011. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +1 -1
  1012. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -1
  1013. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +1 -1
  1014. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +1 -1
  1015. package/src/resources/extensions/gsd/tests/db-writer-path-containment.test.ts +1 -1
  1016. package/src/resources/extensions/gsd/tests/db-writer-root-artifact.test.ts +1 -1
  1017. package/src/resources/extensions/gsd/tests/db-writer-scope.test.ts +1 -1
  1018. package/src/resources/extensions/gsd/tests/deep-mode-integration.test.ts +1 -1
  1019. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +1 -1
  1020. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -30
  1021. package/src/resources/extensions/gsd/tests/detect-stuck-respects-retry.test.ts +1 -1
  1022. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +1 -1
  1023. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +1 -1
  1024. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +1 -1
  1025. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +1 -1
  1026. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +1 -1
  1027. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +1 -1
  1028. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +1 -1
  1029. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +1 -1
  1030. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +1 -1
  1031. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +1 -1
  1032. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -1
  1033. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
  1034. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +1 -1
  1035. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +1 -1
  1036. package/src/resources/extensions/gsd/tests/fresh-run-ui.test.ts +1 -1
  1037. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +1 -1
  1038. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +1 -1
  1039. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +1 -1
  1040. package/src/resources/extensions/gsd/tests/git-checkpoint.test.ts +1 -1
  1041. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +1 -1
  1042. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +1 -1
  1043. package/src/resources/extensions/gsd/tests/gsd-db-failed-open-restore.test.ts +1 -1
  1044. package/src/resources/extensions/gsd/tests/gsd-db-workspace-scope.test.ts +1 -1
  1045. package/src/resources/extensions/gsd/tests/gsd-root-canonical.test.ts +1 -1
  1046. package/src/resources/extensions/gsd/tests/gsd-root-home-guard.test.ts +1 -1
  1047. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +1 -1
  1048. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +1 -1
  1049. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +1 -1
  1050. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +1 -1
  1051. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +1 -1
  1052. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +1 -1
  1053. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +1 -1
  1054. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +2 -2
  1055. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  1056. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +1 -1
  1057. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +0 -52
  1058. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +1 -1
  1059. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +1 -1
  1060. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +1 -1
  1061. package/src/resources/extensions/gsd/tests/integration/headless-command.ts +1 -1
  1062. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
  1063. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  1064. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1 -23
  1065. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -28
  1066. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +1 -1
  1067. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +1 -1
  1068. package/src/resources/extensions/gsd/tests/lease-conflict-notice.test.ts +1 -1
  1069. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +1 -1
  1070. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +2 -32
  1071. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +1 -1
  1072. package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +3 -3
  1073. package/src/resources/extensions/gsd/tests/md-importer.test.ts +23 -0
  1074. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +1 -1
  1075. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +1 -1
  1076. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
  1077. package/src/resources/extensions/gsd/tests/metrics-atomic-merge.test.ts +1 -1
  1078. package/src/resources/extensions/gsd/tests/metrics-lock-hardening.test.ts +1 -1
  1079. package/src/resources/extensions/gsd/tests/metrics-lock-not-acquired.test.ts +1 -1
  1080. package/src/resources/extensions/gsd/tests/metrics-lock-retry-sleep.test.ts +5 -3
  1081. package/src/resources/extensions/gsd/tests/metrics-milestone-scope.test.ts +1 -1
  1082. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +1 -1
  1083. package/src/resources/extensions/gsd/tests/metrics-scope.test.ts +1 -1
  1084. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +74 -0
  1085. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +20 -2
  1086. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +61 -2
  1087. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +26 -2
  1088. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  1089. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +1 -1
  1090. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +1 -1
  1091. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  1092. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +1 -1
  1093. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +1 -1
  1094. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +1 -1
  1095. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +1 -1
  1096. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +1 -1
  1097. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +1 -1
  1098. package/src/resources/extensions/gsd/tests/parallel-milestone-isolation.test.ts +2 -2
  1099. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +1 -1
  1100. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +1 -1
  1101. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +1 -158
  1102. package/src/resources/extensions/gsd/tests/path-cache-decoupled.test.ts +1 -1
  1103. package/src/resources/extensions/gsd/tests/path-normalization-unified.test.ts +1 -1
  1104. package/src/resources/extensions/gsd/tests/paths-cache.test.ts +1 -1
  1105. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +1 -1
  1106. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +1 -1
  1107. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
  1108. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +1 -1
  1109. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -1
  1110. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +1 -1
  1111. package/src/resources/extensions/gsd/tests/planning-depth-setter.test.ts +1 -1
  1112. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +1 -1
  1113. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +1 -1
  1114. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +1 -1
  1115. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +1 -1
  1116. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +2 -2
  1117. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +1 -1
  1118. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +1 -1
  1119. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +1 -1
  1120. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +1 -1
  1121. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +1 -1
  1122. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +1 -1
  1123. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +1 -1
  1124. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +1 -1
  1125. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +1 -1
  1126. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +1 -1
  1127. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +1 -1
  1128. package/src/resources/extensions/gsd/tests/resolve-ts.mjs +0 -4
  1129. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +1 -1
  1130. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +1 -1
  1131. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +1 -1
  1132. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -1
  1133. package/src/resources/extensions/gsd/tests/runtime-kv.test.ts +1 -1
  1134. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +1 -1
  1135. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +1 -1
  1136. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +2 -2
  1137. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +1 -1
  1138. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +27 -10
  1139. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +1 -1
  1140. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +1 -1
  1141. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +5 -1
  1142. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +5 -1
  1143. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +1 -1
  1144. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +1 -1
  1145. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +1 -1
  1146. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -3
  1147. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +1 -1
  1148. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +1 -1
  1149. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  1150. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +1 -1
  1151. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +1 -1
  1152. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +1 -1
  1153. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +1 -1
  1154. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +1 -1
  1155. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +1 -1
  1156. package/src/resources/extensions/gsd/tests/token-profile.test.ts +1 -1
  1157. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +1 -1
  1158. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +1 -1
  1159. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -1
  1160. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +1 -1
  1161. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +1 -1
  1162. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +1 -1
  1163. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +3 -3
  1164. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -1
  1165. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +1 -1
  1166. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +1 -1
  1167. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +1 -1
  1168. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +1 -1
  1169. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +1 -1
  1170. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +1 -1
  1171. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +1 -1
  1172. package/src/resources/extensions/gsd/tests/update-command.test.ts +62 -0
  1173. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +1 -1
  1174. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +1 -1
  1175. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -1
  1176. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +1 -1
  1177. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +1 -1
  1178. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +16 -7
  1179. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +1 -1
  1180. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +12 -1
  1181. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +1 -1
  1182. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +1 -1
  1183. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +1 -1
  1184. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +1 -1
  1185. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +1 -1
  1186. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +1 -1
  1187. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +1 -1
  1188. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +1 -1
  1189. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +1 -1
  1190. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +1 -1
  1191. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +1 -1
  1192. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +1 -1
  1193. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +1 -1
  1194. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +1 -1
  1195. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +1 -1
  1196. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +1 -1
  1197. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +1 -1
  1198. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +1 -1
  1199. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +1 -1
  1200. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +1 -1
  1201. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +1 -1
  1202. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +1 -1
  1203. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +1 -1
  1204. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +1 -1
  1205. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +1 -1
  1206. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +1 -1
  1207. package/src/resources/extensions/gsd/tests/workspace.test.ts +1 -1
  1208. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +2 -2
  1209. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
  1210. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
  1211. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
  1212. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  1213. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  1214. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +1 -1
  1215. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +1 -1
  1216. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +1 -1
  1217. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +1 -1
  1218. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +1 -1
  1219. package/src/resources/extensions/gsd/tests/write-gate.test.ts +1 -1
  1220. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +1 -1
  1221. package/src/resources/extensions/gsd/tool-contract.ts +1 -1
  1222. package/src/resources/extensions/gsd/tools/complete-milestone.ts +2 -2
  1223. package/src/resources/extensions/gsd/tools/complete-slice.ts +12 -1
  1224. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  1225. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +1 -1
  1226. package/src/resources/extensions/gsd/tools/exec-tool.ts +1 -1
  1227. package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -1
  1228. package/src/resources/extensions/gsd/tools/validate-milestone.ts +1 -1
  1229. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  1230. package/src/resources/extensions/gsd/tui/render-kit.ts +1 -1
  1231. package/src/resources/extensions/gsd/types.ts +1 -1
  1232. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  1233. package/src/resources/extensions/gsd/unit-context-manifest.ts +1 -1
  1234. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
  1235. package/src/resources/extensions/gsd/uok/audit.ts +1 -1
  1236. package/src/resources/extensions/gsd/uok/contracts.ts +1 -1
  1237. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +1 -1
  1238. package/src/resources/extensions/gsd/uok/kernel.ts +1 -1
  1239. package/src/resources/extensions/gsd/uok/loop-adapter.ts +1 -1
  1240. package/src/resources/extensions/gsd/uok/plan-v2.ts +1 -1
  1241. package/src/resources/extensions/gsd/uok/timeline.ts +1 -1
  1242. package/src/resources/extensions/gsd/validation-block-guard.ts +1 -1
  1243. package/src/resources/extensions/gsd/verification-gate.ts +28 -12
  1244. package/src/resources/extensions/gsd/verification-verdict.ts +10 -1
  1245. package/src/resources/extensions/gsd/watch/header-renderer.ts +1 -1
  1246. package/src/resources/extensions/gsd/watch/splash-palette.ts +1 -1
  1247. package/src/resources/extensions/gsd/workflow-manifest.ts +1 -1
  1248. package/src/resources/extensions/gsd/workflow-projections.ts +1 -1
  1249. package/src/resources/extensions/gsd/workflow-protocol.ts +1 -1
  1250. package/src/resources/extensions/gsd/workflow-templates.ts +1 -1
  1251. package/src/resources/extensions/gsd/working-output-messages.ts +1 -1
  1252. package/src/resources/extensions/gsd/workspace.ts +1 -1
  1253. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1 -1
  1254. package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
  1255. package/src/resources/extensions/gsd/worktree-safety.ts +1 -1
  1256. package/src/resources/extensions/gsd/worktree-state-projection.ts +1 -1
  1257. package/src/resources/extensions/mcp-client/manager.ts +1 -1
  1258. package/src/resources/extensions/mcp-client/tests/manager.test.ts +1 -1
  1259. package/src/resources/extensions/ollama/index.ts +1 -1
  1260. package/src/resources/extensions/ollama/model-capabilities.ts +1 -1
  1261. package/src/resources/extensions/ollama/ndjson-stream.ts +1 -1
  1262. package/src/resources/extensions/ollama/ollama-chat-provider.ts +1 -1
  1263. package/src/resources/extensions/ollama/ollama-client.ts +1 -1
  1264. package/src/resources/extensions/ollama/ollama-commands.ts +1 -1
  1265. package/src/resources/extensions/ollama/ollama-discovery.ts +1 -1
  1266. package/src/resources/extensions/ollama/ollama-tool.ts +1 -1
  1267. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +1 -1
  1268. package/src/resources/extensions/ollama/tests/ollama-chat-provider-stream.test.ts +1 -1
  1269. package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +1 -1
  1270. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +1 -1
  1271. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +1 -1
  1272. package/src/resources/extensions/ollama/thinking-parser.ts +1 -1
  1273. package/src/resources/extensions/ollama/types.ts +1 -1
  1274. package/src/resources/extensions/shared/cmux-events.ts +1 -1
  1275. package/src/resources/extensions/shared/gsd-phase-state.ts +1 -1
  1276. package/src/resources/extensions/shared/interview-ui.ts +1 -1
  1277. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +1 -1
  1278. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +1 -1
  1279. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +1 -1
  1280. package/src/resources/extensions/subagent/launch.ts +1 -1
  1281. package/src/resources/extensions/subagent/run-store.ts +1 -1
  1282. package/src/resources/extensions/subagent/tests/launch.test.ts +1 -1
  1283. package/src/resources/extensions/subagent/tests/run-store.test.ts +1 -1
  1284. package/src/resources/extensions/visual-brief/artifact-policy.ts +1 -1
  1285. package/src/resources/extensions/visual-brief/index.ts +1 -1
  1286. package/src/resources/extensions/visual-brief/page-contract.ts +1 -1
  1287. package/src/resources/extensions/visual-brief/prompts.ts +1 -1
  1288. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +1 -1
  1289. package/src/resources/skills/api-design/SKILL.md +1 -1
  1290. package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
  1291. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +1 -1
  1292. package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
  1293. package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
  1294. package/src/resources/skills/observability/SKILL.md +4 -4
  1295. package/src/resources/skills/security-review/SKILL.md +1 -1
  1296. package/dist/web/standalone/.next/static/chunks/app/layout-82017658b76e2494.js +0 -1
  1297. package/dist/web/standalone/.next/static/chunks/app/page-d660442e70026068.js +0 -1
  1298. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1065c9a10c4c2187.js +0 -1
  1299. package/dist/web/standalone/node_modules/@img/sharp-darwin-arm64/lib/sharp-darwin-arm64.node +0 -0
  1300. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +0 -175
  1301. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -290
  1302. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -743
  1303. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +0 -138
  1304. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +0 -514
  1305. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -641
  1306. package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -313
  1307. package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -1049
  1308. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -170
  1309. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +0 -206
  1310. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -149
  1311. package/src/resources/extensions/gsd/tests/headless-query.test.ts +0 -184
  1312. package/src/resources/extensions/gsd/tests/integration/auto-preflight.test.ts +0 -38
  1313. package/src/resources/extensions/gsd/tests/integration/doctor-delimiter-fix.test.ts +0 -83
  1314. package/src/resources/extensions/gsd/tests/integration/doctor-enhancements.test.ts +0 -243
  1315. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
  1316. package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +0 -263
  1317. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +0 -90
  1318. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +0 -954
  1319. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +0 -431
  1320. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +0 -549
  1321. package/src/resources/extensions/gsd/tests/integration/doctor.test.ts +0 -612
  1322. package/src/resources/extensions/gsd/tests/integration/integration-mixed-milestones.test.ts +0 -539
  1323. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +0 -405
  1324. package/src/resources/extensions/gsd/tests/integration/queue-reorder-e2e.test.ts +0 -335
  1325. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +0 -248
  1326. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -347
  1327. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -253
  1328. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +0 -567
  1329. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +0 -252
  1330. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +0 -609
  1331. package/src/resources/extensions/gsd/tests/requirements.test.ts +0 -110
  1332. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +0 -348
  1333. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
  1334. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1645
  1335. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -766
  1336. package/src/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
  1337. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -216
  1338. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +0 -242
  1339. /package/dist/web/standalone/.next/static/{YA9EfdcYixDXzFk6uCrQ2 → xbY3PcWtH3LhCQlgKH75u}/_buildManifest.js +0 -0
  1340. /package/dist/web/standalone/.next/static/{YA9EfdcYixDXzFk6uCrQ2 → xbY3PcWtH3LhCQlgKH75u}/_ssgManifest.js +0 -0
  1341. /package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64 → sharp-libvips-linux-x64}/lib/index.js +0 -0
  1342. /package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64 → sharp-libvips-linux-x64}/versions.json +0 -0
  1343. /package/dist/web/standalone/node_modules/@img/{sharp-darwin-arm64 → sharp-linux-x64}/LICENSE +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"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","sourcesContent":["// GSD2 - Terminal style primitives for framed TUI surfaces\n\nimport { truncateToWidth, visibleWidth } from \"./utils.js\";\n\nexport type TerminalBorderStyle = \"none\" | \"rule\" | \"single\" | \"rounded\" | \"heavy\" | \"minimal\" | \"open\";\nexport type TerminalDensity = \"compact\" | \"comfortable\" | \"dashboard\";\nexport type TerminalTone = \"default\" | \"muted\" | \"running\" | \"success\" | \"error\" | \"current\";\n\nexport interface TerminalStyleSpec {\n\twidth?: number;\n\tpaddingX?: number;\n\tpaddingY?: number;\n\tborder?: TerminalBorderStyle;\n\tdensity?: TerminalDensity;\n\ttone?: TerminalTone;\n\tborderColor?: (text: string) => string;\n\tforeground?: (text: string) => string;\n\ttoneColor?: (tone: TerminalTone, text: string) => string;\n\ttitle?: string;\n\ttitleRight?: string;\n\ttitleColor?: (text: string) => string;\n\ttitleRightColor?: (text: string) => string;\n\tbodyGutter?: string;\n\t/** \"open\" border only: render the closing rule. Defaults to true. */\n\tbottomRule?: boolean;\n}\n\ntype BorderChars = {\n\ttopLeft: string;\n\ttopRight: string;\n\tbottomLeft: string;\n\tbottomRight: string;\n\thorizontal: string;\n\tvertical: string;\n};\n\nconst BORDER_CHARS: Record<Exclude<TerminalBorderStyle, \"none\" | \"rule\" | \"minimal\" | \"open\">, BorderChars> = {\n\tsingle: {\n\t\ttopLeft: \"┌\",\n\t\ttopRight: \"┐\",\n\t\tbottomLeft: \"└\",\n\t\tbottomRight: \"┘\",\n\t\thorizontal: \"─\",\n\t\tvertical: \"│\",\n\t},\n\trounded: {\n\t\ttopLeft: \"╭\",\n\t\ttopRight: \"╮\",\n\t\tbottomLeft: \"╰\",\n\t\tbottomRight: \"╯\",\n\t\thorizontal: \"─\",\n\t\tvertical: \"│\",\n\t},\n\theavy: {\n\t\ttopLeft: \"┏\",\n\t\ttopRight: \"┓\",\n\t\tbottomLeft: \"┗\",\n\t\tbottomRight: \"┛\",\n\t\thorizontal: \"━\",\n\t\tvertical: \"┃\",\n\t},\n};\n\nconst DENSITY_PADDING: Record<TerminalDensity, { x: number; y: number }> = {\n\tcompact: { x: 0, y: 0 },\n\tcomfortable: { x: 1, y: 0 },\n\tdashboard: { x: 1, y: 1 },\n};\n\nfunction padVisible(line: string, width: number): string {\n\treturn line + \" \".repeat(Math.max(0, width - visibleWidth(line)));\n}\n\nfunction color(fn: ((text: string) => string) | undefined, text: string): string {\n\treturn fn ? fn(text) : text;\n}\n\nfunction fitVisible(line: string, width: number): string {\n\tconst clipped = visibleWidth(line) > width ? truncateToWidth(line, width, \"\") : line;\n\treturn padVisible(clipped, width);\n}\n\nfunction normalizeWidth(spec: TerminalStyleSpec, width?: number): number {\n\treturn Math.max(1, Math.floor(width ?? spec.width ?? 80));\n}\n\nexport class TerminalStyle {\n\tprivate readonly spec: TerminalStyleSpec;\n\n\tconstructor(spec: TerminalStyleSpec = {}) {\n\t\tthis.spec = { ...spec };\n\t}\n\n\twidth(width: number): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, width });\n\t}\n\n\tpadding(x: number, y = x): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, paddingX: x, paddingY: y });\n\t}\n\n\tpaddingX(paddingX: number): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, paddingX });\n\t}\n\n\tpaddingY(paddingY: number): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, paddingY });\n\t}\n\n\tborder(border: TerminalBorderStyle): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, border });\n\t}\n\n\tdensity(density: TerminalDensity): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, density });\n\t}\n\n\ttone(tone: TerminalTone, toneColor?: (tone: TerminalTone, text: string) => string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, tone, toneColor });\n\t}\n\n\tborderColor(borderColor: (text: string) => string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, borderColor });\n\t}\n\n\tforeground(foreground: (text: string) => string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, foreground });\n\t}\n\n\ttoneColor(toneColor: (tone: TerminalTone, text: string) => string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, toneColor });\n\t}\n\n\ttitle(title: string, titleColor?: (text: string) => string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, title, titleColor });\n\t}\n\n\ttitleRight(titleRight: string, titleRightColor?: (text: string) => string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, titleRight, titleRightColor });\n\t}\n\n\trightTitle(titleRight: string, titleRightColor?: (text: string) => string): TerminalStyle {\n\t\treturn this.titleRight(titleRight, titleRightColor);\n\t}\n\n\tbodyGutter(bodyGutter: string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, bodyGutter });\n\t}\n\n\t/** \"open\" border only: when false, omit the closing rule line. */\n\tbottomRule(bottomRule: boolean): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, bottomRule });\n\t}\n\n\trender(contentLines: string[], width?: number): string[] {\n\t\tconst outerWidth = normalizeWidth(this.spec, width);\n\t\tconst border = this.spec.border ?? \"none\";\n\t\tconst densityPadding = DENSITY_PADDING[this.spec.density ?? \"compact\"];\n\t\tconst paddingX = Math.max(0, Math.floor(this.spec.paddingX ?? densityPadding.x));\n\t\tconst paddingY = Math.max(0, Math.floor(this.spec.paddingY ?? densityPadding.y));\n\t\tconst gutter = this.spec.bodyGutter ?? \"\";\n\t\tconst gutterWidth = visibleWidth(gutter);\n\t\t// \"open\" surfaces have no vertical border column — body lines are\n\t\t// emitted as pure content so terminal selection copies clean text.\n\t\tconst borderColumns = border === \"none\" || border === \"open\" ? 0 : 2;\n\t\tconst innerWidth = Math.max(1, outerWidth - borderColumns - paddingX * 2 - gutterWidth);\n\t\tconst emptyPaddedLine = \" \".repeat(paddingX * 2 + innerWidth);\n\t\tconst sourceLines = contentLines.length > 0 ? contentLines : [\"\"];\n\t\tconst paddedBody = [\n\t\t\t...Array.from({ length: paddingY }, () => emptyPaddedLine),\n\t\t\t...sourceLines.map((line) => {\n\t\t\t\tconst clipped = truncateToWidth(line, innerWidth, \"\");\n\t\t\t\tconst styled = color(this.spec.foreground, clipped);\n\t\t\t\treturn `${gutter}${\" \".repeat(paddingX)}${padVisible(styled, innerWidth)}${\" \".repeat(paddingX)}`;\n\t\t\t}),\n\t\t\t...Array.from({ length: paddingY }, () => emptyPaddedLine),\n\t\t];\n\t\tconst borderColorFn = this.spec.borderColor ?? (this.spec.toneColor ? (value: string) => this.spec.toneColor?.(this.spec.tone ?? \"default\", value) ?? value : undefined);\n\t\tconst borderColor = (text: string) => color(borderColorFn, text);\n\n\t\tif (border === \"none\") {\n\t\t\treturn paddedBody.map((line) => padVisible(line, outerWidth));\n\t\t}\n\n\t\tif (border === \"rule\") {\n\t\t\treturn [\n\t\t\t\tborderColor(\"─\".repeat(outerWidth)),\n\t\t\t\t...this.renderTitleRows(outerWidth),\n\t\t\t\t...paddedBody.map((line) => `${borderColor(\"│ \")}${truncateToWidth(line, Math.max(1, outerWidth - 2), \"\")}`),\n\t\t\t];\n\t\t}\n\n\t\tif (border === \"minimal\") {\n\t\t\tconst contentWidth = Math.max(1, outerWidth - 2);\n\t\t\treturn [\n\t\t\t\t...this.renderTitleRows(contentWidth).map((line) => `${borderColor(\"│ \")}${padVisible(line, contentWidth)}`),\n\t\t\t\t...paddedBody.map((line) => `${borderColor(\"│ \")}${padVisible(line, contentWidth)}`),\n\t\t\t];\n\t\t}\n\n\t\tif (border === \"open\") {\n\t\t\t// Copy-clean content surface (ADR-019): a titled top rule and\n\t\t\t// body lines emitted verbatim with no border column or prefix, so\n\t\t\t// selecting a body line copies only its content. The closing rule\n\t\t\t// is optional — conversation turns omit it and rely on the next\n\t\t\t// turn's top rule for separation.\n\t\t\tconst openLines = [\n\t\t\t\tthis.renderOpenTopRule(outerWidth, borderColor),\n\t\t\t\t...paddedBody.map((line) => padVisible(line, outerWidth)),\n\t\t\t];\n\t\t\tif (this.spec.bottomRule !== false) {\n\t\t\t\topenLines.push(borderColor(\"─\".repeat(Math.max(1, outerWidth))));\n\t\t\t}\n\t\t\treturn openLines;\n\t\t}\n\n\t\tconst chars = BORDER_CHARS[border];\n\t\tconst horizontalWidth = Math.max(0, outerWidth - 2);\n\t\tconst top = borderColor(\n\t\t\t`${chars.topLeft}${chars.horizontal.repeat(horizontalWidth)}${chars.topRight}`,\n\t\t);\n\t\tconst bottom = borderColor(\n\t\t\t`${chars.bottomLeft}${chars.horizontal.repeat(horizontalWidth)}${chars.bottomRight}`,\n\t\t);\n\t\tconst contentWidth = Math.max(1, outerWidth - 2);\n\t\treturn [\n\t\t\ttop,\n\t\t\t...this.renderTitleRows(contentWidth).map((line) =>\n\t\t\t\t`${borderColor(chars.vertical)}${padVisible(line, contentWidth)}${borderColor(chars.vertical)}`,\n\t\t\t),\n\t\t\t...paddedBody.map((line) =>\n\t\t\t\t`${borderColor(chars.vertical)}${padVisible(line, contentWidth)}${borderColor(chars.vertical)}`,\n\t\t\t),\n\t\t\tbottom,\n\t\t];\n\t}\n\n\t/**\n\t * Build the titled top rule for an \"open\" surface, e.g.\n\t * `─── bash · success ─────────── 1.2s ───`. The whole line is rule\n\t * characters plus the (optional) titles — no content, so it is safe for\n\t * a user to include in a copy selection.\n\t */\n\tprivate renderOpenTopRule(width: number, borderColor: (text: string) => string): string {\n\t\tconst w = Math.max(1, width);\n\t\tconst left = this.spec.title ?? \"\";\n\t\tconst right = this.spec.titleRight ?? \"\";\n\t\tif (!left && !right) return borderColor(\"─\".repeat(w));\n\n\t\tif (left && right) {\n\t\t\tconst titleBudget = Math.max(0, w - 11);\n\t\t\tconst rightReserve = titleBudget > 1 && visibleWidth(right) > 0 ? 1 : 0;\n\t\t\tconst leftBudget = Math.min(visibleWidth(left), Math.max(0, titleBudget - rightReserve));\n\t\t\tconst rightBudget = Math.max(0, titleBudget - leftBudget);\n\t\t\tconst clippedLeft = truncateToWidth(left, leftBudget, \"\");\n\t\t\tconst clippedRight = truncateToWidth(right, rightBudget, \"\");\n\t\t\tconst fixed = 4 + visibleWidth(clippedLeft) + 2 + visibleWidth(clippedRight) + 4;\n\t\t\tconst fill = Math.max(1, w - fixed);\n\t\t\treturn fitVisible(\n\t\t\t\tborderColor(\"─── \") +\n\t\t\t\tcolor(this.spec.titleColor, clippedLeft) +\n\t\t\t\tborderColor(` ${\"─\".repeat(fill)} `) +\n\t\t\t\tcolor(this.spec.titleRightColor, clippedRight) +\n\t\t\t\tborderColor(\" ───\"),\n\t\t\t\tw,\n\t\t\t);\n\t\t}\n\t\tif (left) {\n\t\t\tconst clippedLeft = truncateToWidth(left, Math.max(0, w - 6), \"\");\n\t\t\tconst fill = Math.max(1, w - 5 - visibleWidth(clippedLeft));\n\t\t\treturn fitVisible(borderColor(\"─── \") + color(this.spec.titleColor, clippedLeft) + borderColor(` ${\"─\".repeat(fill)}`), w);\n\t\t}\n\t\tconst clippedRight = truncateToWidth(right, Math.max(0, w - 6), \"\");\n\t\tconst fill = Math.max(1, w - 5 - visibleWidth(clippedRight));\n\t\treturn fitVisible(borderColor(`${\"─\".repeat(fill)} `) + color(this.spec.titleRightColor, clippedRight) + borderColor(\" ───\"), w);\n\t}\n\n\tprivate renderTitleRows(width: number): string[] {\n\t\tconst leftRaw = this.spec.title ?? \"\";\n\t\tconst rightRaw = this.spec.titleRight ?? \"\";\n\t\tif (!leftRaw && !rightRaw) return [];\n\n\t\tconst leftBudget = rightRaw ? Math.max(1, width - visibleWidth(rightRaw) - 1) : width;\n\t\tconst left = color(this.spec.titleColor, truncateToWidth(leftRaw, leftBudget, \"\"));\n\t\tconst right = color(this.spec.titleRightColor, rightRaw);\n\t\tconst gap = rightRaw\n\t\t\t? Math.max(1, width - visibleWidth(left) - visibleWidth(right))\n\t\t\t: Math.max(0, width - visibleWidth(left));\n\t\treturn [`${left}${\" \".repeat(gap)}${right}`];\n\t}\n}\n\nexport function style(spec: TerminalStyleSpec = {}): TerminalStyle {\n\treturn new TerminalStyle(spec);\n}\n"]}
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi - Terminal style primitives for framed TUI surfaces\n\nimport { truncateToWidth, visibleWidth } from \"./utils.js\";\n\nexport type TerminalBorderStyle = \"none\" | \"rule\" | \"single\" | \"rounded\" | \"heavy\" | \"minimal\" | \"open\";\nexport type TerminalDensity = \"compact\" | \"comfortable\" | \"dashboard\";\nexport type TerminalTone = \"default\" | \"muted\" | \"running\" | \"success\" | \"error\" | \"current\";\n\nexport interface TerminalStyleSpec {\n\twidth?: number;\n\tpaddingX?: number;\n\tpaddingY?: number;\n\tborder?: TerminalBorderStyle;\n\tdensity?: TerminalDensity;\n\ttone?: TerminalTone;\n\tborderColor?: (text: string) => string;\n\tforeground?: (text: string) => string;\n\ttoneColor?: (tone: TerminalTone, text: string) => string;\n\ttitle?: string;\n\ttitleRight?: string;\n\ttitleColor?: (text: string) => string;\n\ttitleRightColor?: (text: string) => string;\n\tbodyGutter?: string;\n\t/** \"open\" border only: render the closing rule. Defaults to true. */\n\tbottomRule?: boolean;\n}\n\ntype BorderChars = {\n\ttopLeft: string;\n\ttopRight: string;\n\tbottomLeft: string;\n\tbottomRight: string;\n\thorizontal: string;\n\tvertical: string;\n};\n\nconst BORDER_CHARS: Record<Exclude<TerminalBorderStyle, \"none\" | \"rule\" | \"minimal\" | \"open\">, BorderChars> = {\n\tsingle: {\n\t\ttopLeft: \"┌\",\n\t\ttopRight: \"┐\",\n\t\tbottomLeft: \"└\",\n\t\tbottomRight: \"┘\",\n\t\thorizontal: \"─\",\n\t\tvertical: \"│\",\n\t},\n\trounded: {\n\t\ttopLeft: \"╭\",\n\t\ttopRight: \"╮\",\n\t\tbottomLeft: \"╰\",\n\t\tbottomRight: \"╯\",\n\t\thorizontal: \"─\",\n\t\tvertical: \"│\",\n\t},\n\theavy: {\n\t\ttopLeft: \"┏\",\n\t\ttopRight: \"┓\",\n\t\tbottomLeft: \"┗\",\n\t\tbottomRight: \"┛\",\n\t\thorizontal: \"━\",\n\t\tvertical: \"┃\",\n\t},\n};\n\nconst DENSITY_PADDING: Record<TerminalDensity, { x: number; y: number }> = {\n\tcompact: { x: 0, y: 0 },\n\tcomfortable: { x: 1, y: 0 },\n\tdashboard: { x: 1, y: 1 },\n};\n\nfunction padVisible(line: string, width: number): string {\n\treturn line + \" \".repeat(Math.max(0, width - visibleWidth(line)));\n}\n\nfunction color(fn: ((text: string) => string) | undefined, text: string): string {\n\treturn fn ? fn(text) : text;\n}\n\nfunction fitVisible(line: string, width: number): string {\n\tconst clipped = visibleWidth(line) > width ? truncateToWidth(line, width, \"\") : line;\n\treturn padVisible(clipped, width);\n}\n\nfunction normalizeWidth(spec: TerminalStyleSpec, width?: number): number {\n\treturn Math.max(1, Math.floor(width ?? spec.width ?? 80));\n}\n\nexport class TerminalStyle {\n\tprivate readonly spec: TerminalStyleSpec;\n\n\tconstructor(spec: TerminalStyleSpec = {}) {\n\t\tthis.spec = { ...spec };\n\t}\n\n\twidth(width: number): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, width });\n\t}\n\n\tpadding(x: number, y = x): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, paddingX: x, paddingY: y });\n\t}\n\n\tpaddingX(paddingX: number): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, paddingX });\n\t}\n\n\tpaddingY(paddingY: number): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, paddingY });\n\t}\n\n\tborder(border: TerminalBorderStyle): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, border });\n\t}\n\n\tdensity(density: TerminalDensity): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, density });\n\t}\n\n\ttone(tone: TerminalTone, toneColor?: (tone: TerminalTone, text: string) => string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, tone, toneColor });\n\t}\n\n\tborderColor(borderColor: (text: string) => string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, borderColor });\n\t}\n\n\tforeground(foreground: (text: string) => string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, foreground });\n\t}\n\n\ttoneColor(toneColor: (tone: TerminalTone, text: string) => string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, toneColor });\n\t}\n\n\ttitle(title: string, titleColor?: (text: string) => string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, title, titleColor });\n\t}\n\n\ttitleRight(titleRight: string, titleRightColor?: (text: string) => string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, titleRight, titleRightColor });\n\t}\n\n\trightTitle(titleRight: string, titleRightColor?: (text: string) => string): TerminalStyle {\n\t\treturn this.titleRight(titleRight, titleRightColor);\n\t}\n\n\tbodyGutter(bodyGutter: string): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, bodyGutter });\n\t}\n\n\t/** \"open\" border only: when false, omit the closing rule line. */\n\tbottomRule(bottomRule: boolean): TerminalStyle {\n\t\treturn new TerminalStyle({ ...this.spec, bottomRule });\n\t}\n\n\trender(contentLines: string[], width?: number): string[] {\n\t\tconst outerWidth = normalizeWidth(this.spec, width);\n\t\tconst border = this.spec.border ?? \"none\";\n\t\tconst densityPadding = DENSITY_PADDING[this.spec.density ?? \"compact\"];\n\t\tconst paddingX = Math.max(0, Math.floor(this.spec.paddingX ?? densityPadding.x));\n\t\tconst paddingY = Math.max(0, Math.floor(this.spec.paddingY ?? densityPadding.y));\n\t\tconst gutter = this.spec.bodyGutter ?? \"\";\n\t\tconst gutterWidth = visibleWidth(gutter);\n\t\t// \"open\" surfaces have no vertical border column — body lines are\n\t\t// emitted as pure content so terminal selection copies clean text.\n\t\tconst borderColumns = border === \"none\" || border === \"open\" ? 0 : 2;\n\t\tconst innerWidth = Math.max(1, outerWidth - borderColumns - paddingX * 2 - gutterWidth);\n\t\tconst emptyPaddedLine = \" \".repeat(paddingX * 2 + innerWidth);\n\t\tconst sourceLines = contentLines.length > 0 ? contentLines : [\"\"];\n\t\tconst paddedBody = [\n\t\t\t...Array.from({ length: paddingY }, () => emptyPaddedLine),\n\t\t\t...sourceLines.map((line) => {\n\t\t\t\tconst clipped = truncateToWidth(line, innerWidth, \"\");\n\t\t\t\tconst styled = color(this.spec.foreground, clipped);\n\t\t\t\treturn `${gutter}${\" \".repeat(paddingX)}${padVisible(styled, innerWidth)}${\" \".repeat(paddingX)}`;\n\t\t\t}),\n\t\t\t...Array.from({ length: paddingY }, () => emptyPaddedLine),\n\t\t];\n\t\tconst borderColorFn = this.spec.borderColor ?? (this.spec.toneColor ? (value: string) => this.spec.toneColor?.(this.spec.tone ?? \"default\", value) ?? value : undefined);\n\t\tconst borderColor = (text: string) => color(borderColorFn, text);\n\n\t\tif (border === \"none\") {\n\t\t\treturn paddedBody.map((line) => padVisible(line, outerWidth));\n\t\t}\n\n\t\tif (border === \"rule\") {\n\t\t\treturn [\n\t\t\t\tborderColor(\"─\".repeat(outerWidth)),\n\t\t\t\t...this.renderTitleRows(outerWidth),\n\t\t\t\t...paddedBody.map((line) => `${borderColor(\"│ \")}${truncateToWidth(line, Math.max(1, outerWidth - 2), \"\")}`),\n\t\t\t];\n\t\t}\n\n\t\tif (border === \"minimal\") {\n\t\t\tconst contentWidth = Math.max(1, outerWidth - 2);\n\t\t\treturn [\n\t\t\t\t...this.renderTitleRows(contentWidth).map((line) => `${borderColor(\"│ \")}${padVisible(line, contentWidth)}`),\n\t\t\t\t...paddedBody.map((line) => `${borderColor(\"│ \")}${padVisible(line, contentWidth)}`),\n\t\t\t];\n\t\t}\n\n\t\tif (border === \"open\") {\n\t\t\t// Copy-clean content surface (ADR-019): a titled top rule and\n\t\t\t// body lines emitted verbatim with no border column or prefix, so\n\t\t\t// selecting a body line copies only its content. The closing rule\n\t\t\t// is optional — conversation turns omit it and rely on the next\n\t\t\t// turn's top rule for separation.\n\t\t\tconst openLines = [\n\t\t\t\tthis.renderOpenTopRule(outerWidth, borderColor),\n\t\t\t\t...paddedBody.map((line) => padVisible(line, outerWidth)),\n\t\t\t];\n\t\t\tif (this.spec.bottomRule !== false) {\n\t\t\t\topenLines.push(borderColor(\"─\".repeat(Math.max(1, outerWidth))));\n\t\t\t}\n\t\t\treturn openLines;\n\t\t}\n\n\t\tconst chars = BORDER_CHARS[border];\n\t\tconst horizontalWidth = Math.max(0, outerWidth - 2);\n\t\tconst top = borderColor(\n\t\t\t`${chars.topLeft}${chars.horizontal.repeat(horizontalWidth)}${chars.topRight}`,\n\t\t);\n\t\tconst bottom = borderColor(\n\t\t\t`${chars.bottomLeft}${chars.horizontal.repeat(horizontalWidth)}${chars.bottomRight}`,\n\t\t);\n\t\tconst contentWidth = Math.max(1, outerWidth - 2);\n\t\treturn [\n\t\t\ttop,\n\t\t\t...this.renderTitleRows(contentWidth).map((line) =>\n\t\t\t\t`${borderColor(chars.vertical)}${padVisible(line, contentWidth)}${borderColor(chars.vertical)}`,\n\t\t\t),\n\t\t\t...paddedBody.map((line) =>\n\t\t\t\t`${borderColor(chars.vertical)}${padVisible(line, contentWidth)}${borderColor(chars.vertical)}`,\n\t\t\t),\n\t\t\tbottom,\n\t\t];\n\t}\n\n\t/**\n\t * Build the titled top rule for an \"open\" surface, e.g.\n\t * `─── bash · success ─────────── 1.2s ───`. The whole line is rule\n\t * characters plus the (optional) titles — no content, so it is safe for\n\t * a user to include in a copy selection.\n\t */\n\tprivate renderOpenTopRule(width: number, borderColor: (text: string) => string): string {\n\t\tconst w = Math.max(1, width);\n\t\tconst left = this.spec.title ?? \"\";\n\t\tconst right = this.spec.titleRight ?? \"\";\n\t\tif (!left && !right) return borderColor(\"─\".repeat(w));\n\n\t\tif (left && right) {\n\t\t\tconst titleBudget = Math.max(0, w - 11);\n\t\t\tconst rightReserve = titleBudget > 1 && visibleWidth(right) > 0 ? 1 : 0;\n\t\t\tconst leftBudget = Math.min(visibleWidth(left), Math.max(0, titleBudget - rightReserve));\n\t\t\tconst rightBudget = Math.max(0, titleBudget - leftBudget);\n\t\t\tconst clippedLeft = truncateToWidth(left, leftBudget, \"\");\n\t\t\tconst clippedRight = truncateToWidth(right, rightBudget, \"\");\n\t\t\tconst fixed = 4 + visibleWidth(clippedLeft) + 2 + visibleWidth(clippedRight) + 4;\n\t\t\tconst fill = Math.max(1, w - fixed);\n\t\t\treturn fitVisible(\n\t\t\t\tborderColor(\"─── \") +\n\t\t\t\tcolor(this.spec.titleColor, clippedLeft) +\n\t\t\t\tborderColor(` ${\"─\".repeat(fill)} `) +\n\t\t\t\tcolor(this.spec.titleRightColor, clippedRight) +\n\t\t\t\tborderColor(\" ───\"),\n\t\t\t\tw,\n\t\t\t);\n\t\t}\n\t\tif (left) {\n\t\t\tconst clippedLeft = truncateToWidth(left, Math.max(0, w - 6), \"\");\n\t\t\tconst fill = Math.max(1, w - 5 - visibleWidth(clippedLeft));\n\t\t\treturn fitVisible(borderColor(\"─── \") + color(this.spec.titleColor, clippedLeft) + borderColor(` ${\"─\".repeat(fill)}`), w);\n\t\t}\n\t\tconst clippedRight = truncateToWidth(right, Math.max(0, w - 6), \"\");\n\t\tconst fill = Math.max(1, w - 5 - visibleWidth(clippedRight));\n\t\treturn fitVisible(borderColor(`${\"─\".repeat(fill)} `) + color(this.spec.titleRightColor, clippedRight) + borderColor(\" ───\"), w);\n\t}\n\n\tprivate renderTitleRows(width: number): string[] {\n\t\tconst leftRaw = this.spec.title ?? \"\";\n\t\tconst rightRaw = this.spec.titleRight ?? \"\";\n\t\tif (!leftRaw && !rightRaw) return [];\n\n\t\tconst leftBudget = rightRaw ? Math.max(1, width - visibleWidth(rightRaw) - 1) : width;\n\t\tconst left = color(this.spec.titleColor, truncateToWidth(leftRaw, leftBudget, \"\"));\n\t\tconst right = color(this.spec.titleRightColor, rightRaw);\n\t\tconst gap = rightRaw\n\t\t\t? Math.max(1, width - visibleWidth(left) - visibleWidth(right))\n\t\t\t: Math.max(0, width - visibleWidth(left));\n\t\treturn [`${left}${\" \".repeat(gap)}${right}`];\n\t}\n}\n\nexport function style(spec: TerminalStyleSpec = {}): TerminalStyle {\n\treturn new TerminalStyle(spec);\n}\n"]}
@@ -1,4 +1,4 @@
1
- // GSD-2 + packages/pi-tui/src/tui.ts - Terminal UI renderer with differential rendering.
1
+ // gsd-pi + packages/pi-tui/src/tui.ts - Terminal UI renderer with differential rendering.
2
2
  /**
3
3
  * Minimal TUI implementation with differential rendering
4
4
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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","sourcesContent":["// GSD-2 + packages/pi-tui/src/tui.ts - Terminal UI renderer with differential rendering.\n/**\n * Minimal TUI implementation with differential rendering\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { isKeyRelease, matchesKey } from \"./keys.js\";\nimport {\n\tapplyLineResets,\n\tcompositeOverlays,\n\textractCursorPosition,\n\tisOverlayVisible as isOverlayEntryVisible,\n} from \"./overlay-layout.js\";\nimport type { Terminal } from \"./terminal.js\";\nimport { getCapabilities, isImageLine, setCellDimensions } from \"./terminal-image.js\";\nimport { truncateToWidth, visibleWidth } from \"./utils.js\";\n\n/**\n * Component interface - all components must implement this\n */\nexport interface Component {\n\t/**\n\t * Render the component to lines for the given viewport width\n\t * @param width - Current viewport width\n\t * @returns Array of strings, each representing a line\n\t */\n\trender(width: number): string[];\n\n\t/**\n\t * Optional handler for keyboard input when component has focus\n\t */\n\thandleInput?(data: string): void;\n\n\t/**\n\t * If true, component receives key release events (Kitty protocol).\n\t * Default is false - release events are filtered out.\n\t */\n\twantsKeyRelease?: boolean;\n\n\t/**\n\t * Invalidate any cached rendering state.\n\t * Called when theme changes or when component needs to re-render from scratch.\n\t */\n\tinvalidate(): void;\n}\n\ntype InputListenerResult = { consume?: boolean; data?: string } | undefined;\ntype InputListener = (data: string) => InputListenerResult;\n\n/**\n * Interface for components that can receive focus and display a hardware cursor.\n * When focused, the component should emit CURSOR_MARKER at the cursor position\n * in its render output. TUI will find this marker and position the hardware\n * cursor there for proper IME candidate window positioning.\n */\nexport interface Focusable {\n\t/** Set by TUI when focus changes. Component should emit CURSOR_MARKER when true. */\n\tfocused: boolean;\n}\n\n/** Type guard to check if a component implements Focusable */\nexport function isFocusable(component: Component | null): component is Component & Focusable {\n\treturn component !== null && \"focused\" in component;\n}\n\nfunction getComponentDebugName(component: Component): string {\n\tconst name = component.constructor?.name;\n\treturn name && name !== \"Object\" ? name : \"anonymous component\";\n}\n\nfunction warnOnRenderWidthOverflow(component: Component, lines: string[], width: number): void {\n\tif (process.env.PI_TUI_DEBUG !== \"1\" || width <= 0) return;\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i];\n\t\tif (isImageLine(line)) continue;\n\t\tconst lineWidth = visibleWidth(line);\n\t\tif (lineWidth > width) {\n\t\t\tconsole.warn(\n\t\t\t\t`[pi-tui] ${getComponentDebugName(component)}.render() line ${i + 1} exceeds width ${width} (visible width ${lineWidth})`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nconst DEBUG_RENDER_LOG_LIMIT = 50;\nconst DEBUG_RENDER_LOG_PATTERN = /^render-\\d+-[a-z0-9]+\\.log$/;\n\nexport function pruneDebugRenderLogs(debugDir: string, maxFiles = DEBUG_RENDER_LOG_LIMIT): void {\n\tif (maxFiles < 1) return;\n\tlet entries: { name: string; mtimeMs: number }[];\n\ttry {\n\t\tentries = fs.readdirSync(debugDir, { withFileTypes: true })\n\t\t\t.filter((entry) => entry.isFile() && DEBUG_RENDER_LOG_PATTERN.test(entry.name))\n\t\t\t.map((entry) => {\n\t\t\t\tconst fullPath = path.join(debugDir, entry.name);\n\t\t\t\treturn { name: entry.name, mtimeMs: fs.statSync(fullPath).mtimeMs };\n\t\t\t});\n\t} catch {\n\t\treturn;\n\t}\n\n\tentries.sort((a, b) => b.mtimeMs - a.mtimeMs || b.name.localeCompare(a.name));\n\tfor (const entry of entries.slice(maxFiles)) {\n\t\ttry {\n\t\t\tfs.unlinkSync(path.join(debugDir, entry.name));\n\t\t} catch {\n\t\t\t// Debug log cleanup must never break rendering.\n\t\t}\n\t}\n}\n\n/**\n * Cursor position marker - APC (Application Program Command) sequence.\n * This is a zero-width escape sequence that terminals ignore.\n * Components emit this at the cursor position when focused.\n * TUI finds and strips this marker, then positions the hardware cursor there.\n */\nexport const CURSOR_MARKER = \"\\x1b_pi:c\\x07\";\n\nexport { visibleWidth };\n\n/**\n * Anchor position for overlays\n */\nexport type OverlayAnchor =\n\t| \"center\"\n\t| \"top-left\"\n\t| \"top-right\"\n\t| \"bottom-left\"\n\t| \"bottom-right\"\n\t| \"top-center\"\n\t| \"bottom-center\"\n\t| \"left-center\"\n\t| \"right-center\";\n\n/**\n * Margin configuration for overlays\n */\nexport interface OverlayMargin {\n\ttop?: number;\n\tright?: number;\n\tbottom?: number;\n\tleft?: number;\n}\n\n/** Value that can be absolute (number) or percentage (string like \"50%\") */\nexport type SizeValue = number | `${number}%`;\n\n/**\n * Options for overlay positioning and sizing.\n * Values can be absolute numbers or percentage strings (e.g., \"50%\").\n */\nexport interface OverlayOptions {\n\t// === Sizing ===\n\t/** Width in columns, or percentage of terminal width (e.g., \"50%\") */\n\twidth?: SizeValue;\n\t/** Minimum width in columns */\n\tminWidth?: number;\n\t/** Maximum height in rows, or percentage of terminal height (e.g., \"50%\") */\n\tmaxHeight?: SizeValue;\n\n\t// === Positioning - anchor-based ===\n\t/** Anchor point for positioning (default: 'center') */\n\tanchor?: OverlayAnchor;\n\t/** Horizontal offset from anchor position (positive = right) */\n\toffsetX?: number;\n\t/** Vertical offset from anchor position (positive = down) */\n\toffsetY?: number;\n\n\t// === Positioning - percentage or absolute ===\n\t/** Row position: absolute number, or percentage (e.g., \"25%\" = 25% from top) */\n\trow?: SizeValue;\n\t/** Column position: absolute number, or percentage (e.g., \"50%\" = centered horizontally) */\n\tcol?: SizeValue;\n\n\t// === Margin from terminal edges ===\n\t/** Margin from terminal edges. Number applies to all sides. */\n\tmargin?: OverlayMargin | number;\n\n\t// === Visibility ===\n\t/**\n\t * Control overlay visibility based on terminal dimensions.\n\t * If provided, overlay is only rendered when this returns true.\n\t * Called each render cycle with current terminal dimensions.\n\t */\n\tvisible?: (termWidth: number, termHeight: number) => boolean;\n\t/** If true, don't capture keyboard focus when shown */\n\tnonCapturing?: boolean;\n\t/** If true, dim the background behind the overlay */\n\tbackdrop?: boolean;\n}\n\n/**\n * Handle returned by showOverlay for controlling the overlay\n */\nexport interface OverlayHandle {\n\t/** Permanently remove the overlay (cannot be shown again) */\n\thide(): void;\n\t/** Temporarily hide or show the overlay */\n\tsetHidden(hidden: boolean): void;\n\t/** Check if overlay is temporarily hidden */\n\tisHidden(): boolean;\n\t/** Focus this overlay and bring it to the visual front */\n\tfocus(): void;\n\t/** Release focus to the previous target */\n\tunfocus(): void;\n\t/** Check if this overlay currently has focus */\n\tisFocused(): boolean;\n}\n\n/**\n * Container - a component that contains other components\n */\nexport class Container implements Component {\n\tchildren: Component[] = [];\n\tprivate _prevRender: string[] | null = null;\n\n\taddChild(component: Component): void {\n\t\tthis.children.push(component);\n\t\tthis._prevRender = null;\n\t}\n\n\tremoveChild(component: Component): void {\n\t\tconst index = this.children.indexOf(component);\n\t\tif (index !== -1) {\n\t\t\tconst child = this.children[index];\n\t\t\tthis.children.splice(index, 1);\n\t\t\tif ('dispose' in child && typeof (child as any).dispose === 'function') {\n\t\t\t\t(child as any).dispose();\n\t\t\t}\n\t\t\tthis._prevRender = null;\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tfor (const child of this.children) {\n\t\t\tif ('dispose' in child && typeof (child as any).dispose === 'function') {\n\t\t\t\t(child as any).dispose();\n\t\t\t}\n\t\t}\n\t\tthis.children = [];\n\t\tthis._prevRender = null;\n\t}\n\n\t/**\n\t * Remove all children without calling dispose on them.\n\t * Use when child lifecycle is owned elsewhere and the container is only a\n\t * render mount (e.g. extension widget containers in InteractiveMode, where\n\t * the extensionWidgets* maps own disposal).\n\t */\n\tdetachChildren(): void {\n\t\tthis.children = [];\n\t\tthis._prevRender = null;\n\t}\n\n\tinvalidate(): void {\n\t\tthis._prevRender = null;\n\t\tfor (const child of this.children) {\n\t\t\tchild.invalidate?.();\n\t\t}\n\t}\n\n\trender(width: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tfor (const child of this.children) {\n\t\t\tconst rendered = child.render(width);\n\t\t\tif (!(child instanceof Container)) {\n\t\t\t\twarnOnRenderWidthOverflow(child, rendered, width);\n\t\t\t}\n\t\t\tfor (let i = 0; i < rendered.length; i++) lines.push(rendered[i]);\n\t\t}\n\t\t// Return stable reference if output unchanged — allows doRender()\n\t\t// to skip ALL post-processing (isImageLine, applyLineResets, diffs)\n\t\tconst prev = this._prevRender;\n\t\tif (prev && prev.length === lines.length) {\n\t\t\tlet same = true;\n\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\tif (lines[i] !== prev[i]) { same = false; break; }\n\t\t\t}\n\t\t\tif (same) return prev;\n\t\t}\n\t\tthis._prevRender = lines;\n\t\treturn lines;\n\t}\n}\n\n/**\n * TUI - Main class for managing terminal UI with differential rendering\n */\nexport class TUI extends Container {\n\tpublic terminal: Terminal;\n\tprivate previousLines: string[] = [];\n\tprivate previousWidth = 0;\n\tprivate previousHeight = 0;\n\tprivate focusedComponent: Component | null = null;\n\tprivate inputListeners = new Set<InputListener>();\n\n\t/** Global callback for debug key (Shift+Ctrl+D). Called before input is forwarded to focused component. */\n\tpublic onDebug?: () => void;\n\tprivate renderRequested = false;\n\tprivate cursorRow = 0; // Logical cursor row (end of rendered content)\n\tprivate hardwareCursorRow = 0; // Logical content row of the terminal cursor; physical screen row = hardwareCursorRow - previousViewportTop\n\tprivate inputBuffer = \"\"; // Buffer for parsing terminal responses\n\tprivate cellSizeQueryPending = false;\n\tprivate showHardwareCursor = process.env.PI_HARDWARE_CURSOR === \"1\" || process.env.TERM_PROGRAM === \"WarpTerminal\";\n\tprivate clearOnShrink = process.env.PI_CLEAR_ON_SHRINK === \"1\"; // Clear empty rows when content shrinks (default: off)\n\tprivate _shrinkDebounceActive = false;\n\tprivate maxLinesRendered = 0; // Track terminal's working area (max lines ever rendered)\n\tprivate previousViewportTop = 0; // Track previous viewport top for resize-aware cursor moves\n\tprivate fullRedrawCount = 0;\n\tprivate stopped = false;\n\tprivate readonly useSynchronizedOutput =\n\t\tprocess.platform !== \"win32\" && process.env.PI_DISABLE_SYNC_OUTPUT !== \"1\";\n\tprivate _lastRenderedComponents: string[] | null = null;\n\t// Whether the previous frame composited overlays onto the screen. When true,\n\t// the next frame must redraw even if component output is byte-identical —\n\t// otherwise a dismissed overlay is never erased from the terminal.\n\tprivate _lastFrameHadOverlays = false;\n\n\t// Overlay stack for modal components rendered on top of base content\n\tprivate focusOrderCounter = 0;\n\tprivate overlayStack: {\n\t\tcomponent: Component;\n\t\toptions?: OverlayOptions;\n\t\tpreFocus: Component | null;\n\t\thidden: boolean;\n\t\tfocusOrder: number;\n\t}[] = [];\n\n\tconstructor(terminal: Terminal, showHardwareCursor?: boolean) {\n\t\tsuper();\n\t\tthis.terminal = terminal;\n\t\tif (showHardwareCursor !== undefined) {\n\t\t\tthis.showHardwareCursor = showHardwareCursor;\n\t\t}\n\t}\n\n\tget fullRedraws(): number {\n\t\treturn this.fullRedrawCount;\n\t}\n\n\tgetShowHardwareCursor(): boolean {\n\t\treturn this.showHardwareCursor;\n\t}\n\n\tsetShowHardwareCursor(enabled: boolean): void {\n\t\tif (this.showHardwareCursor === enabled) return;\n\t\tthis.showHardwareCursor = enabled;\n\t\tif (!enabled) {\n\t\t\tthis.terminal.hideCursor();\n\t\t}\n\t\tthis.requestRender();\n\t}\n\n\tgetClearOnShrink(): boolean {\n\t\treturn this.clearOnShrink;\n\t}\n\n\t/**\n\t * Set whether to trigger full re-render when content shrinks.\n\t * When true (default), empty rows are cleared when content shrinks.\n\t * When false, empty rows remain (reduces redraws on slower terminals).\n\t */\n\tsetClearOnShrink(enabled: boolean): void {\n\t\tthis.clearOnShrink = enabled;\n\t}\n\n\tsetFocus(component: Component | null): void {\n\t\t// Clear focused flag on old component\n\t\tif (isFocusable(this.focusedComponent)) {\n\t\t\tthis.focusedComponent.focused = false;\n\t\t}\n\n\t\tthis.focusedComponent = component;\n\n\t\t// Set focused flag on new component\n\t\tif (isFocusable(component)) {\n\t\t\tcomponent.focused = true;\n\t\t}\n\t}\n\n\t/**\n\t * Show an overlay component with configurable positioning and sizing.\n\t * Returns a handle to control the overlay's visibility.\n\t */\n\tshowOverlay(component: Component, options?: OverlayOptions): OverlayHandle {\n\t\tconst entry = {\n\t\t\tcomponent,\n\t\t\toptions,\n\t\t\tpreFocus: this.focusedComponent,\n\t\t\thidden: false,\n\t\t\tfocusOrder: ++this.focusOrderCounter,\n\t\t};\n\t\tthis.overlayStack.push(entry);\n\t\t// Only focus if overlay is actually visible\n\t\tif (!options?.nonCapturing && this.isOverlayVisible(entry)) {\n\t\t\tthis.setFocus(component);\n\t\t}\n\t\tthis.terminal.hideCursor();\n\t\tthis.requestRender();\n\n\t\t// Return handle for controlling this overlay\n\t\treturn {\n\t\t\thide: () => {\n\t\t\t\tconst index = this.overlayStack.indexOf(entry);\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tthis.overlayStack.splice(index, 1);\n\t\t\t\t\t// Restore focus if this overlay had focus\n\t\t\t\t\tif (this.focusedComponent === component) {\n\t\t\t\t\t\tconst topVisible = this.getTopmostVisibleOverlay();\n\t\t\t\t\t\tthis.setFocus(topVisible?.component ?? entry.preFocus);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.overlayStack.length === 0) this.terminal.hideCursor();\n\t\t\t\t\tthis.requestRender();\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetHidden: (hidden: boolean) => {\n\t\t\t\tif (entry.hidden === hidden) return;\n\t\t\t\tentry.hidden = hidden;\n\t\t\t\t// Update focus when hiding/showing\n\t\t\t\tif (hidden) {\n\t\t\t\t\t// If this overlay had focus, move focus to next visible or preFocus\n\t\t\t\t\tif (this.focusedComponent === component) {\n\t\t\t\t\t\tconst topVisible = this.getTopmostVisibleOverlay();\n\t\t\t\t\t\tthis.setFocus(topVisible?.component ?? entry.preFocus);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Restore focus to this overlay when showing (if it's actually visible)\n\t\t\t\t\tif (!options?.nonCapturing && this.isOverlayVisible(entry)) {\n\t\t\t\t\t\tentry.focusOrder = ++this.focusOrderCounter;\n\t\t\t\t\t\tthis.setFocus(component);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.requestRender();\n\t\t\t},\n\t\t\tisHidden: () => entry.hidden,\n\t\t\tfocus: () => {\n\t\t\t\tif (!this.overlayStack.includes(entry) || !this.isOverlayVisible(entry)) return;\n\t\t\t\tif (this.focusedComponent !== component) {\n\t\t\t\t\tthis.setFocus(component);\n\t\t\t\t}\n\t\t\t\tentry.focusOrder = ++this.focusOrderCounter;\n\t\t\t\tthis.requestRender();\n\t\t\t},\n\t\t\tunfocus: () => {\n\t\t\t\tif (this.focusedComponent !== component) return;\n\t\t\t\tconst topVisible = this.getTopmostVisibleOverlay();\n\t\t\t\tthis.setFocus(topVisible && topVisible !== entry ? topVisible.component : entry.preFocus);\n\t\t\t\tthis.requestRender();\n\t\t\t},\n\t\t\tisFocused: () => this.focusedComponent === component,\n\t\t};\n\t}\n\n\t/** Hide the topmost overlay and restore previous focus. */\n\thideOverlay(): void {\n\t\tconst overlay = this.overlayStack.pop();\n\t\tif (!overlay) return;\n\t\tif (this.focusedComponent === overlay.component) {\n\t\t\t// Find topmost visible overlay, or fall back to preFocus\n\t\t\tconst topVisible = this.getTopmostVisibleOverlay();\n\t\t\tthis.setFocus(topVisible?.component ?? overlay.preFocus);\n\t\t}\n\t\tif (this.overlayStack.length === 0) this.terminal.hideCursor();\n\t\tthis.requestRender();\n\t}\n\n\t/** Check if there are any visible overlays */\n\thasOverlay(): boolean {\n\t\treturn this.overlayStack.some((o) => this.isOverlayVisible(o));\n\t}\n\n\t/** Check if an overlay entry is currently visible */\n\tprivate isOverlayVisible(entry: (typeof this.overlayStack)[number]): boolean {\n\t\treturn isOverlayEntryVisible(entry, this.terminal.columns, this.terminal.rows);\n\t}\n\n\t/** Find the topmost visible capturing overlay, if any */\n\tprivate getTopmostVisibleOverlay(): (typeof this.overlayStack)[number] | undefined {\n\t\tfor (let i = this.overlayStack.length - 1; i >= 0; i--) {\n\t\t\tif (this.overlayStack[i].options?.nonCapturing) continue;\n\t\t\tif (this.isOverlayVisible(this.overlayStack[i])) {\n\t\t\t\treturn this.overlayStack[i];\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tfor (const overlay of this.overlayStack) overlay.component.invalidate?.();\n\t}\n\n\tstart(): void {\n\t\tthis.stopped = false;\n\t\t// Non-TTY stdout (pipe) — skip TUI entirely to avoid burning CPU.\n\t\t// RPC bridge processes have piped stdio; rendering ANSI escape codes\n\t\t// to a pipe is pure waste and causes a runaway render loop. (issue #3095)\n\t\tif (!this.terminal.isTTY) {\n\t\t\treturn;\n\t\t}\n\t\tthis.terminal.start(\n\t\t\t(data) => this.handleInput(data),\n\t\t\t() => this.requestRender(),\n\t\t);\n\t\tthis.terminal.hideCursor();\n\t\tthis.queryCellSize();\n\t\tthis.requestRender();\n\t}\n\n\taddInputListener(listener: InputListener): () => void {\n\t\tthis.inputListeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.inputListeners.delete(listener);\n\t\t};\n\t}\n\n\tremoveInputListener(listener: InputListener): void {\n\t\tthis.inputListeners.delete(listener);\n\t}\n\n\tprivate queryCellSize(): void {\n\t\t// Only query if terminal supports images (cell size is only used for image rendering)\n\t\tif (!getCapabilities().images) {\n\t\t\treturn;\n\t\t}\n\t\t// Query terminal for cell size in pixels: CSI 16 t\n\t\t// Response format: CSI 6 ; height ; width t\n\t\tthis.cellSizeQueryPending = true;\n\t\tthis.terminal.write(\"\\x1b[16t\");\n\t}\n\n\tstop(): void {\n\t\tthis.stopped = true;\n\n\t\t// Dispose all overlays to stop any running timers\n\t\tfor (const entry of this.overlayStack) {\n\t\t\tif (\"dispose\" in entry.component && typeof (entry.component as any).dispose === \"function\") {\n\t\t\t\t(entry.component as any).dispose();\n\t\t\t}\n\t\t}\n\t\tthis.overlayStack = [];\n\n\t\t// Move cursor to the end of the content to prevent overwriting/artifacts on exit\n\t\tif (this.previousLines.length > 0) {\n\t\t\tconst targetRow = this.previousLines.length; // Line after the last content\n\t\t\tconst lineDiff = targetRow - this.hardwareCursorRow;\n\t\t\tif (lineDiff > 0) {\n\t\t\t\tthis.terminal.write(`\\x1b[${lineDiff}B`);\n\t\t\t} else if (lineDiff < 0) {\n\t\t\t\tthis.terminal.write(`\\x1b[${-lineDiff}A`);\n\t\t\t}\n\t\t\tthis.terminal.write(\"\\r\\n\");\n\t\t}\n\n\t\tthis.terminal.showCursor();\n\t\tthis.terminal.stop();\n\t}\n\n\trequestRender(force = false): void {\n\t\t// Skip rendering on non-TTY stdout to prevent CPU burn (issue #3095)\n\t\tif (!this.terminal.isTTY) return;\n\t\tif (force) {\n\t\t\tthis.previousLines = [];\n\t\t\tthis.previousWidth = -1; // -1 triggers widthChanged, forcing a full clear\n\t\t\tthis.previousHeight = -1; // -1 triggers heightChanged, forcing a full clear\n\t\t\tthis.cursorRow = 0;\n\t\t\tthis.hardwareCursorRow = 0;\n\t\t\tthis.maxLinesRendered = 0;\n\t\t\tthis.previousViewportTop = 0;\n\t\t}\n\t\tif (this.renderRequested) return;\n\t\tthis.renderRequested = true;\n\t\tprocess.nextTick(() => {\n\t\t\tthis.renderRequested = false;\n\t\t\tthis.doRender();\n\t\t});\n\t}\n\n\tprivate handleInput(data: string): void {\n\t\tif (this.inputListeners.size > 0) {\n\t\t\tlet current = data;\n\t\t\tfor (const listener of this.inputListeners) {\n\t\t\t\tconst result = listener(current);\n\t\t\t\tif (result?.consume) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (result?.data !== undefined) {\n\t\t\t\t\tcurrent = result.data;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (current.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdata = current;\n\t\t}\n\n\t\t// If we're waiting for cell size response, buffer input and parse\n\t\tif (this.cellSizeQueryPending) {\n\t\t\tthis.inputBuffer += data;\n\t\t\tconst filtered = this.parseCellSizeResponse();\n\t\t\tif (filtered.length === 0) return;\n\t\t\tdata = filtered;\n\t\t}\n\n\t\t// Global debug key handler (Shift+Ctrl+D)\n\t\tif (matchesKey(data, \"shift+ctrl+d\") && this.onDebug) {\n\t\t\tthis.onDebug();\n\t\t\treturn;\n\t\t}\n\n\t\t// If focused component is an overlay, verify it's still visible\n\t\t// (visibility can change due to terminal resize or visible() callback)\n\t\tconst focusedOverlay = this.overlayStack.find((o) => o.component === this.focusedComponent);\n\t\tif (focusedOverlay && !this.isOverlayVisible(focusedOverlay)) {\n\t\t\t// Focused overlay is no longer visible, redirect to topmost visible overlay\n\t\t\tconst topVisible = this.getTopmostVisibleOverlay();\n\t\t\tif (topVisible) {\n\t\t\t\tthis.setFocus(topVisible.component);\n\t\t\t} else {\n\t\t\t\t// No visible overlays, restore to preFocus\n\t\t\t\tthis.setFocus(focusedOverlay.preFocus);\n\t\t\t}\n\t\t}\n\n\t\t// Pass input to focused component (including Ctrl+C)\n\t\t// The focused component can decide how to handle Ctrl+C\n\t\tif (this.focusedComponent?.handleInput) {\n\t\t\t// Filter out key release events unless component opts in\n\t\t\tif (isKeyRelease(data) && !this.focusedComponent.wantsKeyRelease) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.focusedComponent.handleInput(data);\n\t\t\tthis.requestRender();\n\t\t}\n\t}\n\n\tprivate parseCellSizeResponse(): string {\n\t\t// Response format: ESC [ 6 ; height ; width t\n\t\t// Match the response pattern\n\t\tconst responsePattern = /\\x1b\\[6;(\\d+);(\\d+)t/;\n\t\tconst match = this.inputBuffer.match(responsePattern);\n\n\t\tif (match) {\n\t\t\tconst heightPx = parseInt(match[1], 10);\n\t\t\tconst widthPx = parseInt(match[2], 10);\n\n\t\t\tif (heightPx > 0 && widthPx > 0) {\n\t\t\t\tsetCellDimensions({ widthPx, heightPx });\n\t\t\t\t// Invalidate all components so images re-render with correct dimensions\n\t\t\t\tthis.invalidate();\n\t\t\t\tthis.requestRender();\n\t\t\t}\n\n\t\t\t// Remove the response from buffer\n\t\t\tthis.inputBuffer = this.inputBuffer.replace(responsePattern, \"\");\n\t\t\tthis.cellSizeQueryPending = false;\n\t\t}\n\n\t\t// Don't hold a bare Escape keypress hostage while waiting for the\n\t\t// optional cell-size response. This is the most common early input race.\n\t\tif (this.inputBuffer === \"\\x1b\") {\n\t\t\tconst result = this.inputBuffer;\n\t\t\tthis.inputBuffer = \"\";\n\t\t\tthis.cellSizeQueryPending = false;\n\t\t\treturn result;\n\t\t}\n\n\t\t// Check if we have a partial cell size response starting (wait for more data)\n\t\t// Patterns that could be incomplete cell size response: \\x1b, \\x1b[, \\x1b[6, \\x1b[6;...(no t yet)\n\t\tconst partialCellSizePattern = /\\x1b(\\[6?;?[\\d;]*)?$/;\n\t\tif (partialCellSizePattern.test(this.inputBuffer)) {\n\t\t\t// Check if it's actually a complete different escape sequence (ends with a letter)\n\t\t\t// Cell size response ends with 't', Kitty keyboard ends with 'u', arrows end with A-D, etc.\n\t\t\tconst lastChar = this.inputBuffer[this.inputBuffer.length - 1];\n\t\t\tif (!/[a-zA-Z~]/.test(lastChar)) {\n\t\t\t\t// Doesn't end with a terminator, might be incomplete - wait for more\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t}\n\n\t\t// No cell size response found, return buffered data as user input\n\t\tconst result = this.inputBuffer;\n\t\tthis.inputBuffer = \"\";\n\t\tthis.cellSizeQueryPending = false; // Give up waiting\n\t\treturn result;\n\t}\n\n\tprivate doRender(): void {\n\t\tif (this.stopped) return;\n\t\tconst width = this.terminal.columns;\n\t\tconst height = this.terminal.rows;\n\t\tconst getViewportTop = (lineCount: number): number => lineCount - height;\n\t\tlet viewportTop = getViewportTop(this.maxLinesRendered);\n\t\tlet prevViewportTop = this.previousViewportTop;\n\t\tlet hardwareCursorRow = this.hardwareCursorRow;\n\t\tconst computeLineDiff = (targetRow: number): number => {\n\t\t\tconst currentScreenRow = hardwareCursorRow - prevViewportTop;\n\t\t\tconst targetScreenRow = targetRow - viewportTop;\n\t\t\treturn targetScreenRow - currentScreenRow;\n\t\t};\n\t\tconst widthChanged = this.previousWidth !== 0 && this.previousWidth !== width;\n\t\tconst heightChanged = this.previousHeight !== 0 && this.previousHeight !== height;\n\n\t\t// Render all components to get new lines\n\t\tlet newLines = this.render(width);\n\n\t\t// Skip ALL post-processing if component output is unchanged.\n\t\t// Container.render() returns the same array reference when stable.\n\t\t// Guard with _lastFrameHadOverlays: if the previous frame drew an\n\t\t// overlay, the screen still shows it, so we must redraw to erase it\n\t\t// even when the base component output is identical.\n\t\tif (\n\t\t\tnewLines === this._lastRenderedComponents &&\n\t\t\tthis.overlayStack.length === 0 &&\n\t\t\t!this._lastFrameHadOverlays &&\n\t\t\t!widthChanged &&\n\t\t\t!heightChanged\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis._lastRenderedComponents = newLines;\n\t\tthis._lastFrameHadOverlays = this.overlayStack.length > 0;\n\n\t\t// Composite overlays into the rendered lines (before differential compare)\n\t\tif (this.overlayStack.length > 0) {\n\t\t\tnewLines = compositeOverlays(newLines, this.overlayStack, width, height, this.maxLinesRendered);\n\t\t}\n\n\t\t// Extract cursor position before applying line resets (marker must be found first)\n\t\tconst cursorPos = extractCursorPosition(newLines, height);\n\n\t\tnewLines = applyLineResets(newLines);\n\n\t\t// Helper to clear scrollback and viewport and render all new lines\n\t\tconst fullRender = (clear: boolean): void => {\n\t\t\tthis.fullRedrawCount += 1;\n\t\t\tlet buffer = this.useSynchronizedOutput ? \"\\x1b[?2026h\" : \"\"; // Begin synchronized output\n\t\t\tconst startRow = Math.max(1, height - Math.max(1, newLines.length) + 1);\n\t\t\tif (clear) {\n\t\t\t\t// Clear viewport (scrollback preserved) and anchor the rendered\n\t\t\t\t// block to the terminal bottom so the editor / belowEditor\n\t\t\t\t// widgets do not jump to row 1 after a chat clear. When the\n\t\t\t\t// block is taller than the viewport, Math.max(1, …) falls back\n\t\t\t\t// to row 1 — same as the prior `\\x1b[H` behavior.\n\t\t\t\tbuffer += `\\x1b[2J\\x1b[${startRow};1H`;\n\t\t\t} else if (startRow > 1) {\n\t\t\t\tbuffer += `\\x1b[${startRow};1H`;\n\t\t\t}\n\t\t\tfor (let i = 0; i < newLines.length; i++) {\n\t\t\t\tif (i > 0) buffer += \"\\r\\n\";\n\t\t\t\tlet line = newLines[i];\n\t\t\t\tif (!isImageLine(line) && visibleWidth(line) > width) {\n\t\t\t\t\tline = truncateToWidth(line, width);\n\t\t\t\t}\n\t\t\t\tbuffer += line;\n\t\t\t}\n\t\t\tif (this.useSynchronizedOutput) buffer += \"\\x1b[?2026l\"; // End synchronized output\n\t\t\tthis.terminal.write(buffer);\n\t\t\tthis.cursorRow = Math.max(0, newLines.length - 1);\n\t\t\tthis.hardwareCursorRow = this.cursorRow;\n\t\t\t// Reset max lines when clearing, otherwise track growth\n\t\t\tif (clear) {\n\t\t\t\tthis.maxLinesRendered = newLines.length;\n\t\t\t} else {\n\t\t\t\tthis.maxLinesRendered = Math.max(this.maxLinesRendered, newLines.length);\n\t\t\t}\n\t\t\tthis.previousViewportTop = getViewportTop(this.maxLinesRendered);\n\t\t\tthis.positionHardwareCursor(cursorPos, newLines.length);\n\t\t\tthis.previousLines = newLines;\n\t\t\tthis.previousWidth = width;\n\t\t\tthis.previousHeight = height;\n\t\t};\n\n\t\tconst debugRedraw = process.env.PI_DEBUG_REDRAW === \"1\";\n\t\tconst logRedraw = (reason: string): void => {\n\t\t\tif (!debugRedraw) return;\n\t\t\tconst logPath = path.join(os.homedir(), \".pi\", \"agent\", \"pi-debug.log\");\n\t\t\tconst msg = `[${new Date().toISOString()}] fullRender: ${reason} (prev=${this.previousLines.length}, new=${newLines.length}, height=${height})\\n`;\n\t\t\tfs.appendFileSync(logPath, msg);\n\t\t};\n\n\t\tconst repaintBottomAnchoredShortBlock = (): void => {\n\t\t\tconst startRow = Math.max(1, height - Math.max(1, newLines.length) + 1);\n\t\t\tlet buffer = this.useSynchronizedOutput ? \"\\x1b[?2026h\" : \"\";\n\t\t\tbuffer += `\\x1b[${startRow};1H`;\n\t\t\tfor (let i = 0; i < newLines.length; i++) {\n\t\t\t\tif (i > 0) buffer += \"\\r\\n\";\n\t\t\t\tbuffer += \"\\x1b[2K\";\n\t\t\t\tlet line = newLines[i];\n\t\t\t\tif (!isImageLine(line) && visibleWidth(line) > width) {\n\t\t\t\t\tline = truncateToWidth(line, width);\n\t\t\t\t}\n\t\t\t\tbuffer += line;\n\t\t\t}\n\t\t\tif (this.useSynchronizedOutput) buffer += \"\\x1b[?2026l\";\n\t\t\tthis.terminal.write(buffer);\n\t\t\tthis.cursorRow = Math.max(0, newLines.length - 1);\n\t\t\tthis.hardwareCursorRow = this.cursorRow;\n\t\t\tthis.maxLinesRendered = Math.max(this.maxLinesRendered, newLines.length);\n\t\t\tthis.previousViewportTop = getViewportTop(this.maxLinesRendered);\n\t\t\tthis.positionHardwareCursor(cursorPos, newLines.length);\n\t\t\tthis.previousLines = newLines;\n\t\t\tthis.previousWidth = width;\n\t\t\tthis.previousHeight = height;\n\t\t};\n\n\t\t// First render - just output everything without clearing (assumes clean screen)\n\t\tif (this.previousLines.length === 0 && !widthChanged && !heightChanged) {\n\t\t\tlogRedraw(\"first render\");\n\t\t\tfullRender(false);\n\t\t\treturn;\n\t\t}\n\n\t\t// Width or height changed - full re-render\n\t\tif (widthChanged || heightChanged) {\n\t\t\tlogRedraw(`terminal size changed (${this.previousWidth}x${this.previousHeight} -> ${width}x${height})`);\n\t\t\tfullRender(true);\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tnewLines.length < this.previousLines.length &&\n\t\t\t(newLines.length <= height || this.previousLines.length <= height)\n\t\t) {\n\t\t\tlogRedraw(`bottom-anchored short block shrunk (${this.previousLines.length} -> ${newLines.length})`);\n\t\t\tfullRender(true);\n\t\t\treturn;\n\t\t}\n\n\t\t// Tall→tall shrink with viewport baseline shift. Both buffers fill the\n\t\t// viewport, but newLines is shorter, so the viewport baseline must move\n\t\t// from (previousLines.length - height) down to (newLines.length - height).\n\t\t// The differential render below would see no diff in the overlapping\n\t\t// indices (content[20..39] is identical between frames) and would leave\n\t\t// the screen showing stale rows from the old viewport.\n\t\t//\n\t\t// Repaint the visible viewport in place without \\x1b[2J — the four-pass\n\t\t// flicker fix exists exactly to avoid that full-screen clear — then reset\n\t\t// maxLinesRendered and previousViewportTop so subsequent diffs anchor\n\t\t// against the new baseline.\n\t\tif (\n\t\t\tthis.previousLines.length > height &&\n\t\t\tnewLines.length > height &&\n\t\t\tnewLines.length < this.previousLines.length &&\n\t\t\tthis.overlayStack.length === 0\n\t\t) {\n\t\t\tlogRedraw(`tall→tall shrink viewport realign (${this.previousLines.length} -> ${newLines.length})`);\n\t\t\tconst newViewportTop = getViewportTop(newLines.length);\n\t\t\tconst currentScreenRow = Math.max(0, hardwareCursorRow - prevViewportTop);\n\t\t\tlet buffer = this.useSynchronizedOutput ? \"\\x1b[?2026h\" : \"\";\n\t\t\tif (currentScreenRow > 0) {\n\t\t\t\tbuffer += `\\x1b[${currentScreenRow}A`;\n\t\t\t}\n\t\t\tbuffer += \"\\r\";\n\t\t\tfor (let i = 0; i < height; i++) {\n\t\t\t\tconst idx = newViewportTop + i;\n\t\t\t\tif (i > 0) buffer += \"\\r\\n\";\n\t\t\t\tbuffer += \"\\x1b[2K\";\n\t\t\t\tlet line = newLines[idx] ?? \"\";\n\t\t\t\tif (!isImageLine(line) && visibleWidth(line) > width) {\n\t\t\t\t\tline = truncateToWidth(line, width);\n\t\t\t\t}\n\t\t\t\tbuffer += line;\n\t\t\t}\n\t\t\tif (this.useSynchronizedOutput) buffer += \"\\x1b[?2026l\";\n\t\t\tthis.terminal.write(buffer);\n\t\t\tthis.cursorRow = newLines.length - 1;\n\t\t\tthis.hardwareCursorRow = newLines.length - 1;\n\t\t\tthis.maxLinesRendered = newLines.length;\n\t\t\tthis.previousViewportTop = newViewportTop;\n\t\t\tthis.positionHardwareCursor(cursorPos, newLines.length);\n\t\t\tthis.previousLines = newLines;\n\t\t\tthis.previousWidth = width;\n\t\t\tthis.previousHeight = height;\n\t\t\tthis._shrinkDebounceActive = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Content shrunk below the working area and no overlays - re-render to clear empty rows\n\t\t// (overlays need the padding, so only do this when no overlays are active)\n\t\t// Configurable via setClearOnShrink() or PI_CLEAR_ON_SHRINK=0 env var\n\t\tif (this.clearOnShrink && newLines.length < this.maxLinesRendered && this.overlayStack.length === 0) {\n\t\t\tif (!this._shrinkDebounceActive) {\n\t\t\t\t// First shrink detection: defer the full redraw by one tick.\n\t\t\t\t// If content grows back immediately (pinned clear → new streaming),\n\t\t\t\t// the full redraw is avoided.\n\t\t\t\tthis._shrinkDebounceActive = true;\n\t\t\t\t// Do NOT update maxLinesRendered here — keep the old value so the\n\t\t\t\t// condition `newLines.length < maxLinesRendered` still triggers on\n\t\t\t\t// the next render if content stays shrunk.\n\t\t\t\tlogRedraw(`clearOnShrink deferred (maxLinesRendered=${this.maxLinesRendered})`);\n\t\t\t\t// Fall through to differential render for this frame\n\t\t\t} else {\n\t\t\t\t// Still shrunk on second render — commit the full redraw\n\t\t\t\tthis._shrinkDebounceActive = false;\n\t\t\t\tlogRedraw(`clearOnShrink committed (maxLinesRendered=${this.maxLinesRendered})`);\n\t\t\t\tfullRender(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tthis._shrinkDebounceActive = false;\n\t\t}\n\n\t\t// Find first and last changed lines\n\t\tlet firstChanged = -1;\n\t\tlet lastChanged = -1;\n\t\tconst maxLines = Math.max(newLines.length, this.previousLines.length);\n\t\tfor (let i = 0; i < maxLines; i++) {\n\t\t\tconst oldLine = i < this.previousLines.length ? this.previousLines[i] : \"\";\n\t\t\tconst newLine = i < newLines.length ? newLines[i] : \"\";\n\n\t\t\tif (oldLine !== newLine) {\n\t\t\t\tif (firstChanged === -1) {\n\t\t\t\t\tfirstChanged = i;\n\t\t\t\t}\n\t\t\t\tlastChanged = i;\n\t\t\t}\n\t\t}\n\t\tconst appendedLines = newLines.length > this.previousLines.length;\n\t\tif (appendedLines) {\n\t\t\tif (firstChanged === -1) {\n\t\t\t\tfirstChanged = this.previousLines.length;\n\t\t\t}\n\t\t\tlastChanged = newLines.length - 1;\n\t\t}\n\t\tlet appendStart = appendedLines && firstChanged === this.previousLines.length && firstChanged > 0;\n\n\t\t// No changes - but still need to update hardware cursor position if it moved\n\t\tif (firstChanged === -1) {\n\t\t\tthis.positionHardwareCursor(cursorPos, newLines.length);\n\t\t\tthis.previousViewportTop = getViewportTop(this.maxLinesRendered);\n\t\t\tthis.previousHeight = height;\n\t\t\treturn;\n\t\t}\n\n\t\tif (appendedLines && this.previousLines.length <= height && newLines.length <= height) {\n\t\t\trepaintBottomAnchoredShortBlock();\n\t\t\treturn;\n\t\t}\n\n\t\t// All changes are in deleted lines (nothing to render, just clear)\n\t\tif (firstChanged >= newLines.length) {\n\t\t\tif (this.previousLines.length > newLines.length) {\n\t\t\t\tlet buffer = this.useSynchronizedOutput ? \"\\x1b[?2026h\" : \"\";\n\t\t\t\t// Move to end of new content (clamp to 0 for empty content)\n\t\t\t\tconst targetRow = Math.max(0, newLines.length - 1);\n\t\t\t\tconst lineDiff = computeLineDiff(targetRow);\n\t\t\t\tif (lineDiff > 0) buffer += `\\x1b[${lineDiff}B`;\n\t\t\t\telse if (lineDiff < 0) buffer += `\\x1b[${-lineDiff}A`;\n\t\t\t\tbuffer += \"\\r\";\n\t\t\t\t// Clear extra lines without scrolling\n\t\t\t\tconst extraLines = this.previousLines.length - newLines.length;\n\t\t\t\tif (extraLines > height) {\n\t\t\t\t\tlogRedraw(`extraLines > height (${extraLines} > ${height})`);\n\t\t\t\t\tfullRender(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (extraLines > 0) {\n\t\t\t\t\tbuffer += \"\\x1b[1B\";\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < extraLines; i++) {\n\t\t\t\t\tbuffer += \"\\r\\x1b[2K\";\n\t\t\t\t\tif (i < extraLines - 1) buffer += \"\\x1b[1B\";\n\t\t\t\t}\n\t\t\t\tif (extraLines > 0) {\n\t\t\t\t\tbuffer += `\\x1b[${extraLines}A`;\n\t\t\t\t}\n\t\t\t\tif (this.useSynchronizedOutput) buffer += \"\\x1b[?2026l\";\n\t\t\t\tthis.terminal.write(buffer);\n\t\t\t\tthis.cursorRow = targetRow;\n\t\t\t\tthis.hardwareCursorRow = targetRow;\n\t\t\t}\n\t\t\tthis.positionHardwareCursor(cursorPos, newLines.length);\n\t\t\tthis.previousLines = newLines;\n\t\t\tthis.previousWidth = width;\n\t\t\tthis.previousHeight = height;\n\t\t\tthis.previousViewportTop = getViewportTop(this.maxLinesRendered);\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if firstChanged is above what was previously visible.\n\t\t// Use previousLines.length (not maxLinesRendered) to avoid false positives after content shrinks.\n\t\tconst previousContentViewportTop = getViewportTop(this.previousLines.length);\n\t\tlet clampedToViewport = false;\n\t\tif (firstChanged < previousContentViewportTop) {\n\t\t\t// First change is above the viewport. Avoid a full screen clear (\\x1b[2J)\n\t\t\t// which causes the bottom panel to flicker. Instead redraw from the actual\n\t\t\t// viewport top down through the bottom of new content so every visible row\n\t\t\t// gets the correct line, even if the viewport shifted (content shrank).\n\t\t\t//\n\t\t\t// Pick the smaller of the two viewport tops so any row currently on screen\n\t\t\t// is covered. Force lastChanged to the end of new content so the render loop\n\t\t\t// repaints the bottom rows that may now hold stale content from the previous\n\t\t\t// frame (the case that caused \"empty screen until next tick\" after the clamp).\n\t\t\tconst newViewportTop = getViewportTop(newLines.length);\n\t\t\tconst clampedFirst = Math.max(0, Math.min(previousContentViewportTop, newViewportTop));\n\t\t\tlogRedraw(\n\t\t\t\t`firstChanged < viewportTop (${firstChanged} < ${previousContentViewportTop}) — repaint from ${clampedFirst}`,\n\t\t\t);\n\t\t\tfirstChanged = clampedFirst;\n\t\t\tlastChanged = Math.max(lastChanged, newLines.length - 1);\n\t\t\tappendStart = false;\n\t\t\tclampedToViewport = true;\n\t\t}\n\n\t\t// Render from first changed line to end\n\t\t// Build buffer with all updates wrapped in synchronized output\n\t\tlet buffer = this.useSynchronizedOutput ? \"\\x1b[?2026h\" : \"\"; // Begin synchronized output\n\t\tconst prevViewportBottom = prevViewportTop + height - 1;\n\t\tconst moveTargetRow = appendStart ? firstChanged - 1 : firstChanged;\n\t\tif (moveTargetRow > prevViewportBottom) {\n\t\t\tconst currentScreenRow = Math.max(0, Math.min(height - 1, hardwareCursorRow - prevViewportTop));\n\t\t\tconst moveToBottom = height - 1 - currentScreenRow;\n\t\t\tif (moveToBottom > 0) {\n\t\t\t\tbuffer += `\\x1b[${moveToBottom}B`;\n\t\t\t}\n\t\t\tconst scroll = moveTargetRow - prevViewportBottom;\n\t\t\tbuffer += \"\\r\\n\".repeat(scroll);\n\t\t\tprevViewportTop += scroll;\n\t\t\tviewportTop += scroll;\n\t\t\thardwareCursorRow = moveTargetRow;\n\t\t}\n\n\t\t// Move cursor to first changed line (use hardwareCursorRow for actual position)\n\t\tconst lineDiff = computeLineDiff(moveTargetRow);\n\t\tif (lineDiff > 0) {\n\t\t\tbuffer += `\\x1b[${lineDiff}B`; // Move down\n\t\t} else if (lineDiff < 0) {\n\t\t\tbuffer += `\\x1b[${-lineDiff}A`; // Move up\n\t\t}\n\n\t\tbuffer += appendStart ? \"\\r\\n\" : \"\\r\"; // Move to column 0\n\n\t\t// Only render changed lines (firstChanged to lastChanged), not all lines to end\n\t\t// This reduces flicker when only a single line changes (e.g., spinner animation)\n\t\tconst renderEnd = Math.min(lastChanged, newLines.length - 1);\n\t\tfor (let i = firstChanged; i <= renderEnd; i++) {\n\t\t\tif (i > firstChanged) buffer += \"\\r\\n\";\n\t\t\tbuffer += \"\\x1b[2K\"; // Clear current line\n\t\t\tlet line = newLines[i];\n\t\t\tconst isImage = isImageLine(line);\n\t\t\tif (!isImage && visibleWidth(line) > width) {\n\t\t\t\tline = truncateToWidth(line, width);\n\t\t\t}\n\t\t\tbuffer += line;\n\t\t}\n\n\t\t// Track where cursor ended up after rendering\n\t\tlet finalCursorRow = renderEnd;\n\n\t\t// If we had more lines before, clear ghost lines — but only when they are\n\t\t// actually visible. For tall buffers (both counts > height) the viewport shifts\n\t\t// up so the differential render already overwrites the old bottom rows; emitting\n\t\t// \\r\\n at screen-bottom would cause spurious terminal scrolling.\n\t\t//\n\t\t// Also skip ghost clearing when the clamp-to-viewport path was taken: that path\n\t\t// renders from clampedFirst through newLines.length-1, filling the entire visible\n\t\t// viewport. There are no ghost lines below renderEnd, and the local `viewportTop`\n\t\t// is based on the stale (larger) maxLinesRendered, so the renderEndScreenRow\n\t\t// check below would compute a negative value and incorrectly fire the cleanup —\n\t\t// which then emits \\r\\n past screen-bottom and scrolls correct lines into\n\t\t// scrollback while filling the viewport with blanks.\n\t\tif (this.previousLines.length > newLines.length && !clampedToViewport) {\n\t\t\tconst renderEndScreenRow = renderEnd - viewportTop;\n\t\t\tconst ghostLinesVisible = renderEndScreenRow < height - 1;\n\t\t\tif (ghostLinesVisible) {\n\t\t\t\t// Move to end of new content first if we stopped before it\n\t\t\t\tif (renderEnd < newLines.length - 1) {\n\t\t\t\t\tconst moveDown = newLines.length - 1 - renderEnd;\n\t\t\t\t\tbuffer += `\\x1b[${moveDown}B`;\n\t\t\t\t\tfinalCursorRow = newLines.length - 1;\n\t\t\t\t}\n\t\t\t\tconst extraLines = this.previousLines.length - newLines.length;\n\t\t\t\tfor (let i = newLines.length; i < this.previousLines.length; i++) {\n\t\t\t\t\tbuffer += \"\\r\\n\\x1b[2K\";\n\t\t\t\t}\n\t\t\t\t// Move cursor back to end of new content\n\t\t\t\tbuffer += `\\x1b[${extraLines}A`;\n\t\t\t}\n\t\t}\n\n\t\tif (this.useSynchronizedOutput) buffer += \"\\x1b[?2026l\"; // End synchronized output\n\n\t\tif (process.env.PI_TUI_DEBUG === \"1\") {\n\t\t\tconst debugDir = path.join(os.tmpdir(), \"tui\");\n\t\t\tfs.mkdirSync(debugDir, { recursive: true });\n\t\t\tconst debugPath = path.join(debugDir, `render-${Date.now()}-${Math.random().toString(36).slice(2)}.log`);\n\t\t\tconst debugData = [\n\t\t\t\t`firstChanged: ${firstChanged}`,\n\t\t\t\t`viewportTop: ${viewportTop}`,\n\t\t\t\t`cursorRow: ${this.cursorRow}`,\n\t\t\t\t`height: ${height}`,\n\t\t\t\t`lineDiff: ${lineDiff}`,\n\t\t\t\t`hardwareCursorRow: ${hardwareCursorRow}`,\n\t\t\t\t`renderEnd: ${renderEnd}`,\n\t\t\t\t`finalCursorRow: ${finalCursorRow}`,\n\t\t\t\t`cursorPos: ${JSON.stringify(cursorPos)}`,\n\t\t\t\t`newLines.length: ${newLines.length}`,\n\t\t\t\t`previousLines.length: ${this.previousLines.length}`,\n\t\t\t\t\"\",\n\t\t\t\t\"=== newLines ===\",\n\t\t\t\tJSON.stringify(newLines, null, 2),\n\t\t\t\t\"\",\n\t\t\t\t\"=== previousLines ===\",\n\t\t\t\tJSON.stringify(this.previousLines, null, 2),\n\t\t\t\t\"\",\n\t\t\t\t\"=== buffer ===\",\n\t\t\t\tJSON.stringify(buffer),\n\t\t\t].join(\"\\n\");\n\t\t\tfs.writeFileSync(debugPath, debugData);\n\t\t\tpruneDebugRenderLogs(debugDir);\n\t\t}\n\n\t\t// Write entire buffer at once\n\t\tthis.terminal.write(buffer);\n\n\t\t// Track cursor position for next render\n\t\t// cursorRow tracks end of content (for viewport calculation)\n\t\t// hardwareCursorRow tracks actual terminal cursor position (for movement)\n\t\tthis.cursorRow = Math.max(0, newLines.length - 1);\n\t\tthis.hardwareCursorRow = finalCursorRow;\n\t\t// Track terminal's working area (grows but doesn't shrink unless cleared).\n\t\t// Exception: when the clamp-to-viewport path repainted shrunk content, the\n\t\t// visible viewport now anchors to newLines.length, so subsequent\n\t\t// computeLineDiff calls need viewportTop = newLines.length - height.\n\t\t// Without this reset, hardwareCursorRow's physical row goes negative.\n\t\tif (clampedToViewport && newLines.length < this.maxLinesRendered) {\n\t\t\tthis.maxLinesRendered = newLines.length;\n\t\t} else {\n\t\t\tthis.maxLinesRendered = Math.max(this.maxLinesRendered, newLines.length);\n\t\t}\n\t\tthis.previousViewportTop = getViewportTop(this.maxLinesRendered);\n\n\t\t// Position hardware cursor for IME\n\t\tthis.positionHardwareCursor(cursorPos, newLines.length);\n\n\t\tthis.previousLines = newLines;\n\t\tthis.previousWidth = width;\n\t\tthis.previousHeight = height;\n\t}\n\n\t/**\n\t * Position the hardware cursor for IME candidate window.\n\t * @param cursorPos The cursor position extracted from rendered output, or null\n\t * @param totalLines Total number of rendered lines\n\t */\n\tprivate positionHardwareCursor(cursorPos: { row: number; col: number } | null, totalLines: number): void {\n\t\tif (!cursorPos || totalLines <= 0) {\n\t\t\tthis.terminal.hideCursor();\n\t\t\treturn;\n\t\t}\n\n\t\t// Clamp cursor position to valid range\n\t\tconst targetRow = Math.max(0, Math.min(cursorPos.row, totalLines - 1));\n\t\tconst targetCol = Math.max(0, cursorPos.col);\n\n\t\t// Move cursor from current position to target\n\t\tconst rowDelta = targetRow - this.hardwareCursorRow;\n\t\tlet buffer = \"\";\n\t\tif (rowDelta > 0) {\n\t\t\tbuffer += `\\x1b[${rowDelta}B`; // Move down\n\t\t} else if (rowDelta < 0) {\n\t\t\tbuffer += `\\x1b[${-rowDelta}A`; // Move up\n\t\t}\n\t\t// Move to absolute column (1-indexed)\n\t\tbuffer += `\\x1b[${targetCol + 1}G`;\n\n\t\tif (buffer) {\n\t\t\tthis.terminal.write(buffer);\n\t\t}\n\n\t\tthis.hardwareCursorRow = targetRow;\n\t\tif (this.showHardwareCursor) {\n\t\t\tthis.terminal.showCursor();\n\t\t} else {\n\t\t\tthis.terminal.hideCursor();\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../src/tui.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi + packages/pi-tui/src/tui.ts - Terminal UI renderer with differential rendering.\n/**\n * Minimal TUI implementation with differential rendering\n */\n\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { isKeyRelease, matchesKey } from \"./keys.js\";\nimport {\n\tapplyLineResets,\n\tcompositeOverlays,\n\textractCursorPosition,\n\tisOverlayVisible as isOverlayEntryVisible,\n} from \"./overlay-layout.js\";\nimport type { Terminal } from \"./terminal.js\";\nimport { getCapabilities, isImageLine, setCellDimensions } from \"./terminal-image.js\";\nimport { truncateToWidth, visibleWidth } from \"./utils.js\";\n\n/**\n * Component interface - all components must implement this\n */\nexport interface Component {\n\t/**\n\t * Render the component to lines for the given viewport width\n\t * @param width - Current viewport width\n\t * @returns Array of strings, each representing a line\n\t */\n\trender(width: number): string[];\n\n\t/**\n\t * Optional handler for keyboard input when component has focus\n\t */\n\thandleInput?(data: string): void;\n\n\t/**\n\t * If true, component receives key release events (Kitty protocol).\n\t * Default is false - release events are filtered out.\n\t */\n\twantsKeyRelease?: boolean;\n\n\t/**\n\t * Invalidate any cached rendering state.\n\t * Called when theme changes or when component needs to re-render from scratch.\n\t */\n\tinvalidate(): void;\n}\n\ntype InputListenerResult = { consume?: boolean; data?: string } | undefined;\ntype InputListener = (data: string) => InputListenerResult;\n\n/**\n * Interface for components that can receive focus and display a hardware cursor.\n * When focused, the component should emit CURSOR_MARKER at the cursor position\n * in its render output. TUI will find this marker and position the hardware\n * cursor there for proper IME candidate window positioning.\n */\nexport interface Focusable {\n\t/** Set by TUI when focus changes. Component should emit CURSOR_MARKER when true. */\n\tfocused: boolean;\n}\n\n/** Type guard to check if a component implements Focusable */\nexport function isFocusable(component: Component | null): component is Component & Focusable {\n\treturn component !== null && \"focused\" in component;\n}\n\nfunction getComponentDebugName(component: Component): string {\n\tconst name = component.constructor?.name;\n\treturn name && name !== \"Object\" ? name : \"anonymous component\";\n}\n\nfunction warnOnRenderWidthOverflow(component: Component, lines: string[], width: number): void {\n\tif (process.env.PI_TUI_DEBUG !== \"1\" || width <= 0) return;\n\tfor (let i = 0; i < lines.length; i++) {\n\t\tconst line = lines[i];\n\t\tif (isImageLine(line)) continue;\n\t\tconst lineWidth = visibleWidth(line);\n\t\tif (lineWidth > width) {\n\t\t\tconsole.warn(\n\t\t\t\t`[pi-tui] ${getComponentDebugName(component)}.render() line ${i + 1} exceeds width ${width} (visible width ${lineWidth})`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nconst DEBUG_RENDER_LOG_LIMIT = 50;\nconst DEBUG_RENDER_LOG_PATTERN = /^render-\\d+-[a-z0-9]+\\.log$/;\n\nexport function pruneDebugRenderLogs(debugDir: string, maxFiles = DEBUG_RENDER_LOG_LIMIT): void {\n\tif (maxFiles < 1) return;\n\tlet entries: { name: string; mtimeMs: number }[];\n\ttry {\n\t\tentries = fs.readdirSync(debugDir, { withFileTypes: true })\n\t\t\t.filter((entry) => entry.isFile() && DEBUG_RENDER_LOG_PATTERN.test(entry.name))\n\t\t\t.map((entry) => {\n\t\t\t\tconst fullPath = path.join(debugDir, entry.name);\n\t\t\t\treturn { name: entry.name, mtimeMs: fs.statSync(fullPath).mtimeMs };\n\t\t\t});\n\t} catch {\n\t\treturn;\n\t}\n\n\tentries.sort((a, b) => b.mtimeMs - a.mtimeMs || b.name.localeCompare(a.name));\n\tfor (const entry of entries.slice(maxFiles)) {\n\t\ttry {\n\t\t\tfs.unlinkSync(path.join(debugDir, entry.name));\n\t\t} catch {\n\t\t\t// Debug log cleanup must never break rendering.\n\t\t}\n\t}\n}\n\n/**\n * Cursor position marker - APC (Application Program Command) sequence.\n * This is a zero-width escape sequence that terminals ignore.\n * Components emit this at the cursor position when focused.\n * TUI finds and strips this marker, then positions the hardware cursor there.\n */\nexport const CURSOR_MARKER = \"\\x1b_pi:c\\x07\";\n\nexport { visibleWidth };\n\n/**\n * Anchor position for overlays\n */\nexport type OverlayAnchor =\n\t| \"center\"\n\t| \"top-left\"\n\t| \"top-right\"\n\t| \"bottom-left\"\n\t| \"bottom-right\"\n\t| \"top-center\"\n\t| \"bottom-center\"\n\t| \"left-center\"\n\t| \"right-center\";\n\n/**\n * Margin configuration for overlays\n */\nexport interface OverlayMargin {\n\ttop?: number;\n\tright?: number;\n\tbottom?: number;\n\tleft?: number;\n}\n\n/** Value that can be absolute (number) or percentage (string like \"50%\") */\nexport type SizeValue = number | `${number}%`;\n\n/**\n * Options for overlay positioning and sizing.\n * Values can be absolute numbers or percentage strings (e.g., \"50%\").\n */\nexport interface OverlayOptions {\n\t// === Sizing ===\n\t/** Width in columns, or percentage of terminal width (e.g., \"50%\") */\n\twidth?: SizeValue;\n\t/** Minimum width in columns */\n\tminWidth?: number;\n\t/** Maximum height in rows, or percentage of terminal height (e.g., \"50%\") */\n\tmaxHeight?: SizeValue;\n\n\t// === Positioning - anchor-based ===\n\t/** Anchor point for positioning (default: 'center') */\n\tanchor?: OverlayAnchor;\n\t/** Horizontal offset from anchor position (positive = right) */\n\toffsetX?: number;\n\t/** Vertical offset from anchor position (positive = down) */\n\toffsetY?: number;\n\n\t// === Positioning - percentage or absolute ===\n\t/** Row position: absolute number, or percentage (e.g., \"25%\" = 25% from top) */\n\trow?: SizeValue;\n\t/** Column position: absolute number, or percentage (e.g., \"50%\" = centered horizontally) */\n\tcol?: SizeValue;\n\n\t// === Margin from terminal edges ===\n\t/** Margin from terminal edges. Number applies to all sides. */\n\tmargin?: OverlayMargin | number;\n\n\t// === Visibility ===\n\t/**\n\t * Control overlay visibility based on terminal dimensions.\n\t * If provided, overlay is only rendered when this returns true.\n\t * Called each render cycle with current terminal dimensions.\n\t */\n\tvisible?: (termWidth: number, termHeight: number) => boolean;\n\t/** If true, don't capture keyboard focus when shown */\n\tnonCapturing?: boolean;\n\t/** If true, dim the background behind the overlay */\n\tbackdrop?: boolean;\n}\n\n/**\n * Handle returned by showOverlay for controlling the overlay\n */\nexport interface OverlayHandle {\n\t/** Permanently remove the overlay (cannot be shown again) */\n\thide(): void;\n\t/** Temporarily hide or show the overlay */\n\tsetHidden(hidden: boolean): void;\n\t/** Check if overlay is temporarily hidden */\n\tisHidden(): boolean;\n\t/** Focus this overlay and bring it to the visual front */\n\tfocus(): void;\n\t/** Release focus to the previous target */\n\tunfocus(): void;\n\t/** Check if this overlay currently has focus */\n\tisFocused(): boolean;\n}\n\n/**\n * Container - a component that contains other components\n */\nexport class Container implements Component {\n\tchildren: Component[] = [];\n\tprivate _prevRender: string[] | null = null;\n\n\taddChild(component: Component): void {\n\t\tthis.children.push(component);\n\t\tthis._prevRender = null;\n\t}\n\n\tremoveChild(component: Component): void {\n\t\tconst index = this.children.indexOf(component);\n\t\tif (index !== -1) {\n\t\t\tconst child = this.children[index];\n\t\t\tthis.children.splice(index, 1);\n\t\t\tif ('dispose' in child && typeof (child as any).dispose === 'function') {\n\t\t\t\t(child as any).dispose();\n\t\t\t}\n\t\t\tthis._prevRender = null;\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tfor (const child of this.children) {\n\t\t\tif ('dispose' in child && typeof (child as any).dispose === 'function') {\n\t\t\t\t(child as any).dispose();\n\t\t\t}\n\t\t}\n\t\tthis.children = [];\n\t\tthis._prevRender = null;\n\t}\n\n\t/**\n\t * Remove all children without calling dispose on them.\n\t * Use when child lifecycle is owned elsewhere and the container is only a\n\t * render mount (e.g. extension widget containers in InteractiveMode, where\n\t * the extensionWidgets* maps own disposal).\n\t */\n\tdetachChildren(): void {\n\t\tthis.children = [];\n\t\tthis._prevRender = null;\n\t}\n\n\tinvalidate(): void {\n\t\tthis._prevRender = null;\n\t\tfor (const child of this.children) {\n\t\t\tchild.invalidate?.();\n\t\t}\n\t}\n\n\trender(width: number): string[] {\n\t\tconst lines: string[] = [];\n\t\tfor (const child of this.children) {\n\t\t\tconst rendered = child.render(width);\n\t\t\tif (!(child instanceof Container)) {\n\t\t\t\twarnOnRenderWidthOverflow(child, rendered, width);\n\t\t\t}\n\t\t\tfor (let i = 0; i < rendered.length; i++) lines.push(rendered[i]);\n\t\t}\n\t\t// Return stable reference if output unchanged — allows doRender()\n\t\t// to skip ALL post-processing (isImageLine, applyLineResets, diffs)\n\t\tconst prev = this._prevRender;\n\t\tif (prev && prev.length === lines.length) {\n\t\t\tlet same = true;\n\t\t\tfor (let i = 0; i < lines.length; i++) {\n\t\t\t\tif (lines[i] !== prev[i]) { same = false; break; }\n\t\t\t}\n\t\t\tif (same) return prev;\n\t\t}\n\t\tthis._prevRender = lines;\n\t\treturn lines;\n\t}\n}\n\n/**\n * TUI - Main class for managing terminal UI with differential rendering\n */\nexport class TUI extends Container {\n\tpublic terminal: Terminal;\n\tprivate previousLines: string[] = [];\n\tprivate previousWidth = 0;\n\tprivate previousHeight = 0;\n\tprivate focusedComponent: Component | null = null;\n\tprivate inputListeners = new Set<InputListener>();\n\n\t/** Global callback for debug key (Shift+Ctrl+D). Called before input is forwarded to focused component. */\n\tpublic onDebug?: () => void;\n\tprivate renderRequested = false;\n\tprivate cursorRow = 0; // Logical cursor row (end of rendered content)\n\tprivate hardwareCursorRow = 0; // Logical content row of the terminal cursor; physical screen row = hardwareCursorRow - previousViewportTop\n\tprivate inputBuffer = \"\"; // Buffer for parsing terminal responses\n\tprivate cellSizeQueryPending = false;\n\tprivate showHardwareCursor = process.env.PI_HARDWARE_CURSOR === \"1\" || process.env.TERM_PROGRAM === \"WarpTerminal\";\n\tprivate clearOnShrink = process.env.PI_CLEAR_ON_SHRINK === \"1\"; // Clear empty rows when content shrinks (default: off)\n\tprivate _shrinkDebounceActive = false;\n\tprivate maxLinesRendered = 0; // Track terminal's working area (max lines ever rendered)\n\tprivate previousViewportTop = 0; // Track previous viewport top for resize-aware cursor moves\n\tprivate fullRedrawCount = 0;\n\tprivate stopped = false;\n\tprivate readonly useSynchronizedOutput =\n\t\tprocess.platform !== \"win32\" && process.env.PI_DISABLE_SYNC_OUTPUT !== \"1\";\n\tprivate _lastRenderedComponents: string[] | null = null;\n\t// Whether the previous frame composited overlays onto the screen. When true,\n\t// the next frame must redraw even if component output is byte-identical —\n\t// otherwise a dismissed overlay is never erased from the terminal.\n\tprivate _lastFrameHadOverlays = false;\n\n\t// Overlay stack for modal components rendered on top of base content\n\tprivate focusOrderCounter = 0;\n\tprivate overlayStack: {\n\t\tcomponent: Component;\n\t\toptions?: OverlayOptions;\n\t\tpreFocus: Component | null;\n\t\thidden: boolean;\n\t\tfocusOrder: number;\n\t}[] = [];\n\n\tconstructor(terminal: Terminal, showHardwareCursor?: boolean) {\n\t\tsuper();\n\t\tthis.terminal = terminal;\n\t\tif (showHardwareCursor !== undefined) {\n\t\t\tthis.showHardwareCursor = showHardwareCursor;\n\t\t}\n\t}\n\n\tget fullRedraws(): number {\n\t\treturn this.fullRedrawCount;\n\t}\n\n\tgetShowHardwareCursor(): boolean {\n\t\treturn this.showHardwareCursor;\n\t}\n\n\tsetShowHardwareCursor(enabled: boolean): void {\n\t\tif (this.showHardwareCursor === enabled) return;\n\t\tthis.showHardwareCursor = enabled;\n\t\tif (!enabled) {\n\t\t\tthis.terminal.hideCursor();\n\t\t}\n\t\tthis.requestRender();\n\t}\n\n\tgetClearOnShrink(): boolean {\n\t\treturn this.clearOnShrink;\n\t}\n\n\t/**\n\t * Set whether to trigger full re-render when content shrinks.\n\t * When true (default), empty rows are cleared when content shrinks.\n\t * When false, empty rows remain (reduces redraws on slower terminals).\n\t */\n\tsetClearOnShrink(enabled: boolean): void {\n\t\tthis.clearOnShrink = enabled;\n\t}\n\n\tsetFocus(component: Component | null): void {\n\t\t// Clear focused flag on old component\n\t\tif (isFocusable(this.focusedComponent)) {\n\t\t\tthis.focusedComponent.focused = false;\n\t\t}\n\n\t\tthis.focusedComponent = component;\n\n\t\t// Set focused flag on new component\n\t\tif (isFocusable(component)) {\n\t\t\tcomponent.focused = true;\n\t\t}\n\t}\n\n\t/**\n\t * Show an overlay component with configurable positioning and sizing.\n\t * Returns a handle to control the overlay's visibility.\n\t */\n\tshowOverlay(component: Component, options?: OverlayOptions): OverlayHandle {\n\t\tconst entry = {\n\t\t\tcomponent,\n\t\t\toptions,\n\t\t\tpreFocus: this.focusedComponent,\n\t\t\thidden: false,\n\t\t\tfocusOrder: ++this.focusOrderCounter,\n\t\t};\n\t\tthis.overlayStack.push(entry);\n\t\t// Only focus if overlay is actually visible\n\t\tif (!options?.nonCapturing && this.isOverlayVisible(entry)) {\n\t\t\tthis.setFocus(component);\n\t\t}\n\t\tthis.terminal.hideCursor();\n\t\tthis.requestRender();\n\n\t\t// Return handle for controlling this overlay\n\t\treturn {\n\t\t\thide: () => {\n\t\t\t\tconst index = this.overlayStack.indexOf(entry);\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tthis.overlayStack.splice(index, 1);\n\t\t\t\t\t// Restore focus if this overlay had focus\n\t\t\t\t\tif (this.focusedComponent === component) {\n\t\t\t\t\t\tconst topVisible = this.getTopmostVisibleOverlay();\n\t\t\t\t\t\tthis.setFocus(topVisible?.component ?? entry.preFocus);\n\t\t\t\t\t}\n\t\t\t\t\tif (this.overlayStack.length === 0) this.terminal.hideCursor();\n\t\t\t\t\tthis.requestRender();\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetHidden: (hidden: boolean) => {\n\t\t\t\tif (entry.hidden === hidden) return;\n\t\t\t\tentry.hidden = hidden;\n\t\t\t\t// Update focus when hiding/showing\n\t\t\t\tif (hidden) {\n\t\t\t\t\t// If this overlay had focus, move focus to next visible or preFocus\n\t\t\t\t\tif (this.focusedComponent === component) {\n\t\t\t\t\t\tconst topVisible = this.getTopmostVisibleOverlay();\n\t\t\t\t\t\tthis.setFocus(topVisible?.component ?? entry.preFocus);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Restore focus to this overlay when showing (if it's actually visible)\n\t\t\t\t\tif (!options?.nonCapturing && this.isOverlayVisible(entry)) {\n\t\t\t\t\t\tentry.focusOrder = ++this.focusOrderCounter;\n\t\t\t\t\t\tthis.setFocus(component);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.requestRender();\n\t\t\t},\n\t\t\tisHidden: () => entry.hidden,\n\t\t\tfocus: () => {\n\t\t\t\tif (!this.overlayStack.includes(entry) || !this.isOverlayVisible(entry)) return;\n\t\t\t\tif (this.focusedComponent !== component) {\n\t\t\t\t\tthis.setFocus(component);\n\t\t\t\t}\n\t\t\t\tentry.focusOrder = ++this.focusOrderCounter;\n\t\t\t\tthis.requestRender();\n\t\t\t},\n\t\t\tunfocus: () => {\n\t\t\t\tif (this.focusedComponent !== component) return;\n\t\t\t\tconst topVisible = this.getTopmostVisibleOverlay();\n\t\t\t\tthis.setFocus(topVisible && topVisible !== entry ? topVisible.component : entry.preFocus);\n\t\t\t\tthis.requestRender();\n\t\t\t},\n\t\t\tisFocused: () => this.focusedComponent === component,\n\t\t};\n\t}\n\n\t/** Hide the topmost overlay and restore previous focus. */\n\thideOverlay(): void {\n\t\tconst overlay = this.overlayStack.pop();\n\t\tif (!overlay) return;\n\t\tif (this.focusedComponent === overlay.component) {\n\t\t\t// Find topmost visible overlay, or fall back to preFocus\n\t\t\tconst topVisible = this.getTopmostVisibleOverlay();\n\t\t\tthis.setFocus(topVisible?.component ?? overlay.preFocus);\n\t\t}\n\t\tif (this.overlayStack.length === 0) this.terminal.hideCursor();\n\t\tthis.requestRender();\n\t}\n\n\t/** Check if there are any visible overlays */\n\thasOverlay(): boolean {\n\t\treturn this.overlayStack.some((o) => this.isOverlayVisible(o));\n\t}\n\n\t/** Check if an overlay entry is currently visible */\n\tprivate isOverlayVisible(entry: (typeof this.overlayStack)[number]): boolean {\n\t\treturn isOverlayEntryVisible(entry, this.terminal.columns, this.terminal.rows);\n\t}\n\n\t/** Find the topmost visible capturing overlay, if any */\n\tprivate getTopmostVisibleOverlay(): (typeof this.overlayStack)[number] | undefined {\n\t\tfor (let i = this.overlayStack.length - 1; i >= 0; i--) {\n\t\t\tif (this.overlayStack[i].options?.nonCapturing) continue;\n\t\t\tif (this.isOverlayVisible(this.overlayStack[i])) {\n\t\t\t\treturn this.overlayStack[i];\n\t\t\t}\n\t\t}\n\t\treturn undefined;\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tfor (const overlay of this.overlayStack) overlay.component.invalidate?.();\n\t}\n\n\tstart(): void {\n\t\tthis.stopped = false;\n\t\t// Non-TTY stdout (pipe) — skip TUI entirely to avoid burning CPU.\n\t\t// RPC bridge processes have piped stdio; rendering ANSI escape codes\n\t\t// to a pipe is pure waste and causes a runaway render loop. (issue #3095)\n\t\tif (!this.terminal.isTTY) {\n\t\t\treturn;\n\t\t}\n\t\tthis.terminal.start(\n\t\t\t(data) => this.handleInput(data),\n\t\t\t() => this.requestRender(),\n\t\t);\n\t\tthis.terminal.hideCursor();\n\t\tthis.queryCellSize();\n\t\tthis.requestRender();\n\t}\n\n\taddInputListener(listener: InputListener): () => void {\n\t\tthis.inputListeners.add(listener);\n\t\treturn () => {\n\t\t\tthis.inputListeners.delete(listener);\n\t\t};\n\t}\n\n\tremoveInputListener(listener: InputListener): void {\n\t\tthis.inputListeners.delete(listener);\n\t}\n\n\tprivate queryCellSize(): void {\n\t\t// Only query if terminal supports images (cell size is only used for image rendering)\n\t\tif (!getCapabilities().images) {\n\t\t\treturn;\n\t\t}\n\t\t// Query terminal for cell size in pixels: CSI 16 t\n\t\t// Response format: CSI 6 ; height ; width t\n\t\tthis.cellSizeQueryPending = true;\n\t\tthis.terminal.write(\"\\x1b[16t\");\n\t}\n\n\tstop(): void {\n\t\tthis.stopped = true;\n\n\t\t// Dispose all overlays to stop any running timers\n\t\tfor (const entry of this.overlayStack) {\n\t\t\tif (\"dispose\" in entry.component && typeof (entry.component as any).dispose === \"function\") {\n\t\t\t\t(entry.component as any).dispose();\n\t\t\t}\n\t\t}\n\t\tthis.overlayStack = [];\n\n\t\t// Move cursor to the end of the content to prevent overwriting/artifacts on exit\n\t\tif (this.previousLines.length > 0) {\n\t\t\tconst targetRow = this.previousLines.length; // Line after the last content\n\t\t\tconst lineDiff = targetRow - this.hardwareCursorRow;\n\t\t\tif (lineDiff > 0) {\n\t\t\t\tthis.terminal.write(`\\x1b[${lineDiff}B`);\n\t\t\t} else if (lineDiff < 0) {\n\t\t\t\tthis.terminal.write(`\\x1b[${-lineDiff}A`);\n\t\t\t}\n\t\t\tthis.terminal.write(\"\\r\\n\");\n\t\t}\n\n\t\tthis.terminal.showCursor();\n\t\tthis.terminal.stop();\n\t}\n\n\trequestRender(force = false): void {\n\t\t// Skip rendering on non-TTY stdout to prevent CPU burn (issue #3095)\n\t\tif (!this.terminal.isTTY) return;\n\t\tif (force) {\n\t\t\tthis.previousLines = [];\n\t\t\tthis.previousWidth = -1; // -1 triggers widthChanged, forcing a full clear\n\t\t\tthis.previousHeight = -1; // -1 triggers heightChanged, forcing a full clear\n\t\t\tthis.cursorRow = 0;\n\t\t\tthis.hardwareCursorRow = 0;\n\t\t\tthis.maxLinesRendered = 0;\n\t\t\tthis.previousViewportTop = 0;\n\t\t}\n\t\tif (this.renderRequested) return;\n\t\tthis.renderRequested = true;\n\t\tprocess.nextTick(() => {\n\t\t\tthis.renderRequested = false;\n\t\t\tthis.doRender();\n\t\t});\n\t}\n\n\tprivate handleInput(data: string): void {\n\t\tif (this.inputListeners.size > 0) {\n\t\t\tlet current = data;\n\t\t\tfor (const listener of this.inputListeners) {\n\t\t\t\tconst result = listener(current);\n\t\t\t\tif (result?.consume) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (result?.data !== undefined) {\n\t\t\t\t\tcurrent = result.data;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (current.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tdata = current;\n\t\t}\n\n\t\t// If we're waiting for cell size response, buffer input and parse\n\t\tif (this.cellSizeQueryPending) {\n\t\t\tthis.inputBuffer += data;\n\t\t\tconst filtered = this.parseCellSizeResponse();\n\t\t\tif (filtered.length === 0) return;\n\t\t\tdata = filtered;\n\t\t}\n\n\t\t// Global debug key handler (Shift+Ctrl+D)\n\t\tif (matchesKey(data, \"shift+ctrl+d\") && this.onDebug) {\n\t\t\tthis.onDebug();\n\t\t\treturn;\n\t\t}\n\n\t\t// If focused component is an overlay, verify it's still visible\n\t\t// (visibility can change due to terminal resize or visible() callback)\n\t\tconst focusedOverlay = this.overlayStack.find((o) => o.component === this.focusedComponent);\n\t\tif (focusedOverlay && !this.isOverlayVisible(focusedOverlay)) {\n\t\t\t// Focused overlay is no longer visible, redirect to topmost visible overlay\n\t\t\tconst topVisible = this.getTopmostVisibleOverlay();\n\t\t\tif (topVisible) {\n\t\t\t\tthis.setFocus(topVisible.component);\n\t\t\t} else {\n\t\t\t\t// No visible overlays, restore to preFocus\n\t\t\t\tthis.setFocus(focusedOverlay.preFocus);\n\t\t\t}\n\t\t}\n\n\t\t// Pass input to focused component (including Ctrl+C)\n\t\t// The focused component can decide how to handle Ctrl+C\n\t\tif (this.focusedComponent?.handleInput) {\n\t\t\t// Filter out key release events unless component opts in\n\t\t\tif (isKeyRelease(data) && !this.focusedComponent.wantsKeyRelease) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.focusedComponent.handleInput(data);\n\t\t\tthis.requestRender();\n\t\t}\n\t}\n\n\tprivate parseCellSizeResponse(): string {\n\t\t// Response format: ESC [ 6 ; height ; width t\n\t\t// Match the response pattern\n\t\tconst responsePattern = /\\x1b\\[6;(\\d+);(\\d+)t/;\n\t\tconst match = this.inputBuffer.match(responsePattern);\n\n\t\tif (match) {\n\t\t\tconst heightPx = parseInt(match[1], 10);\n\t\t\tconst widthPx = parseInt(match[2], 10);\n\n\t\t\tif (heightPx > 0 && widthPx > 0) {\n\t\t\t\tsetCellDimensions({ widthPx, heightPx });\n\t\t\t\t// Invalidate all components so images re-render with correct dimensions\n\t\t\t\tthis.invalidate();\n\t\t\t\tthis.requestRender();\n\t\t\t}\n\n\t\t\t// Remove the response from buffer\n\t\t\tthis.inputBuffer = this.inputBuffer.replace(responsePattern, \"\");\n\t\t\tthis.cellSizeQueryPending = false;\n\t\t}\n\n\t\t// Don't hold a bare Escape keypress hostage while waiting for the\n\t\t// optional cell-size response. This is the most common early input race.\n\t\tif (this.inputBuffer === \"\\x1b\") {\n\t\t\tconst result = this.inputBuffer;\n\t\t\tthis.inputBuffer = \"\";\n\t\t\tthis.cellSizeQueryPending = false;\n\t\t\treturn result;\n\t\t}\n\n\t\t// Check if we have a partial cell size response starting (wait for more data)\n\t\t// Patterns that could be incomplete cell size response: \\x1b, \\x1b[, \\x1b[6, \\x1b[6;...(no t yet)\n\t\tconst partialCellSizePattern = /\\x1b(\\[6?;?[\\d;]*)?$/;\n\t\tif (partialCellSizePattern.test(this.inputBuffer)) {\n\t\t\t// Check if it's actually a complete different escape sequence (ends with a letter)\n\t\t\t// Cell size response ends with 't', Kitty keyboard ends with 'u', arrows end with A-D, etc.\n\t\t\tconst lastChar = this.inputBuffer[this.inputBuffer.length - 1];\n\t\t\tif (!/[a-zA-Z~]/.test(lastChar)) {\n\t\t\t\t// Doesn't end with a terminator, might be incomplete - wait for more\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t}\n\n\t\t// No cell size response found, return buffered data as user input\n\t\tconst result = this.inputBuffer;\n\t\tthis.inputBuffer = \"\";\n\t\tthis.cellSizeQueryPending = false; // Give up waiting\n\t\treturn result;\n\t}\n\n\tprivate doRender(): void {\n\t\tif (this.stopped) return;\n\t\tconst width = this.terminal.columns;\n\t\tconst height = this.terminal.rows;\n\t\tconst getViewportTop = (lineCount: number): number => lineCount - height;\n\t\tlet viewportTop = getViewportTop(this.maxLinesRendered);\n\t\tlet prevViewportTop = this.previousViewportTop;\n\t\tlet hardwareCursorRow = this.hardwareCursorRow;\n\t\tconst computeLineDiff = (targetRow: number): number => {\n\t\t\tconst currentScreenRow = hardwareCursorRow - prevViewportTop;\n\t\t\tconst targetScreenRow = targetRow - viewportTop;\n\t\t\treturn targetScreenRow - currentScreenRow;\n\t\t};\n\t\tconst widthChanged = this.previousWidth !== 0 && this.previousWidth !== width;\n\t\tconst heightChanged = this.previousHeight !== 0 && this.previousHeight !== height;\n\n\t\t// Render all components to get new lines\n\t\tlet newLines = this.render(width);\n\n\t\t// Skip ALL post-processing if component output is unchanged.\n\t\t// Container.render() returns the same array reference when stable.\n\t\t// Guard with _lastFrameHadOverlays: if the previous frame drew an\n\t\t// overlay, the screen still shows it, so we must redraw to erase it\n\t\t// even when the base component output is identical.\n\t\tif (\n\t\t\tnewLines === this._lastRenderedComponents &&\n\t\t\tthis.overlayStack.length === 0 &&\n\t\t\t!this._lastFrameHadOverlays &&\n\t\t\t!widthChanged &&\n\t\t\t!heightChanged\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tthis._lastRenderedComponents = newLines;\n\t\tthis._lastFrameHadOverlays = this.overlayStack.length > 0;\n\n\t\t// Composite overlays into the rendered lines (before differential compare)\n\t\tif (this.overlayStack.length > 0) {\n\t\t\tnewLines = compositeOverlays(newLines, this.overlayStack, width, height, this.maxLinesRendered);\n\t\t}\n\n\t\t// Extract cursor position before applying line resets (marker must be found first)\n\t\tconst cursorPos = extractCursorPosition(newLines, height);\n\n\t\tnewLines = applyLineResets(newLines);\n\n\t\t// Helper to clear scrollback and viewport and render all new lines\n\t\tconst fullRender = (clear: boolean): void => {\n\t\t\tthis.fullRedrawCount += 1;\n\t\t\tlet buffer = this.useSynchronizedOutput ? \"\\x1b[?2026h\" : \"\"; // Begin synchronized output\n\t\t\tconst startRow = Math.max(1, height - Math.max(1, newLines.length) + 1);\n\t\t\tif (clear) {\n\t\t\t\t// Clear viewport (scrollback preserved) and anchor the rendered\n\t\t\t\t// block to the terminal bottom so the editor / belowEditor\n\t\t\t\t// widgets do not jump to row 1 after a chat clear. When the\n\t\t\t\t// block is taller than the viewport, Math.max(1, …) falls back\n\t\t\t\t// to row 1 — same as the prior `\\x1b[H` behavior.\n\t\t\t\tbuffer += `\\x1b[2J\\x1b[${startRow};1H`;\n\t\t\t} else if (startRow > 1) {\n\t\t\t\tbuffer += `\\x1b[${startRow};1H`;\n\t\t\t}\n\t\t\tfor (let i = 0; i < newLines.length; i++) {\n\t\t\t\tif (i > 0) buffer += \"\\r\\n\";\n\t\t\t\tlet line = newLines[i];\n\t\t\t\tif (!isImageLine(line) && visibleWidth(line) > width) {\n\t\t\t\t\tline = truncateToWidth(line, width);\n\t\t\t\t}\n\t\t\t\tbuffer += line;\n\t\t\t}\n\t\t\tif (this.useSynchronizedOutput) buffer += \"\\x1b[?2026l\"; // End synchronized output\n\t\t\tthis.terminal.write(buffer);\n\t\t\tthis.cursorRow = Math.max(0, newLines.length - 1);\n\t\t\tthis.hardwareCursorRow = this.cursorRow;\n\t\t\t// Reset max lines when clearing, otherwise track growth\n\t\t\tif (clear) {\n\t\t\t\tthis.maxLinesRendered = newLines.length;\n\t\t\t} else {\n\t\t\t\tthis.maxLinesRendered = Math.max(this.maxLinesRendered, newLines.length);\n\t\t\t}\n\t\t\tthis.previousViewportTop = getViewportTop(this.maxLinesRendered);\n\t\t\tthis.positionHardwareCursor(cursorPos, newLines.length);\n\t\t\tthis.previousLines = newLines;\n\t\t\tthis.previousWidth = width;\n\t\t\tthis.previousHeight = height;\n\t\t};\n\n\t\tconst debugRedraw = process.env.PI_DEBUG_REDRAW === \"1\";\n\t\tconst logRedraw = (reason: string): void => {\n\t\t\tif (!debugRedraw) return;\n\t\t\tconst logPath = path.join(os.homedir(), \".pi\", \"agent\", \"pi-debug.log\");\n\t\t\tconst msg = `[${new Date().toISOString()}] fullRender: ${reason} (prev=${this.previousLines.length}, new=${newLines.length}, height=${height})\\n`;\n\t\t\tfs.appendFileSync(logPath, msg);\n\t\t};\n\n\t\tconst repaintBottomAnchoredShortBlock = (): void => {\n\t\t\tconst startRow = Math.max(1, height - Math.max(1, newLines.length) + 1);\n\t\t\tlet buffer = this.useSynchronizedOutput ? \"\\x1b[?2026h\" : \"\";\n\t\t\tbuffer += `\\x1b[${startRow};1H`;\n\t\t\tfor (let i = 0; i < newLines.length; i++) {\n\t\t\t\tif (i > 0) buffer += \"\\r\\n\";\n\t\t\t\tbuffer += \"\\x1b[2K\";\n\t\t\t\tlet line = newLines[i];\n\t\t\t\tif (!isImageLine(line) && visibleWidth(line) > width) {\n\t\t\t\t\tline = truncateToWidth(line, width);\n\t\t\t\t}\n\t\t\t\tbuffer += line;\n\t\t\t}\n\t\t\tif (this.useSynchronizedOutput) buffer += \"\\x1b[?2026l\";\n\t\t\tthis.terminal.write(buffer);\n\t\t\tthis.cursorRow = Math.max(0, newLines.length - 1);\n\t\t\tthis.hardwareCursorRow = this.cursorRow;\n\t\t\tthis.maxLinesRendered = Math.max(this.maxLinesRendered, newLines.length);\n\t\t\tthis.previousViewportTop = getViewportTop(this.maxLinesRendered);\n\t\t\tthis.positionHardwareCursor(cursorPos, newLines.length);\n\t\t\tthis.previousLines = newLines;\n\t\t\tthis.previousWidth = width;\n\t\t\tthis.previousHeight = height;\n\t\t};\n\n\t\t// First render - just output everything without clearing (assumes clean screen)\n\t\tif (this.previousLines.length === 0 && !widthChanged && !heightChanged) {\n\t\t\tlogRedraw(\"first render\");\n\t\t\tfullRender(false);\n\t\t\treturn;\n\t\t}\n\n\t\t// Width or height changed - full re-render\n\t\tif (widthChanged || heightChanged) {\n\t\t\tlogRedraw(`terminal size changed (${this.previousWidth}x${this.previousHeight} -> ${width}x${height})`);\n\t\t\tfullRender(true);\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tnewLines.length < this.previousLines.length &&\n\t\t\t(newLines.length <= height || this.previousLines.length <= height)\n\t\t) {\n\t\t\tlogRedraw(`bottom-anchored short block shrunk (${this.previousLines.length} -> ${newLines.length})`);\n\t\t\tfullRender(true);\n\t\t\treturn;\n\t\t}\n\n\t\t// Tall→tall shrink with viewport baseline shift. Both buffers fill the\n\t\t// viewport, but newLines is shorter, so the viewport baseline must move\n\t\t// from (previousLines.length - height) down to (newLines.length - height).\n\t\t// The differential render below would see no diff in the overlapping\n\t\t// indices (content[20..39] is identical between frames) and would leave\n\t\t// the screen showing stale rows from the old viewport.\n\t\t//\n\t\t// Repaint the visible viewport in place without \\x1b[2J — the four-pass\n\t\t// flicker fix exists exactly to avoid that full-screen clear — then reset\n\t\t// maxLinesRendered and previousViewportTop so subsequent diffs anchor\n\t\t// against the new baseline.\n\t\tif (\n\t\t\tthis.previousLines.length > height &&\n\t\t\tnewLines.length > height &&\n\t\t\tnewLines.length < this.previousLines.length &&\n\t\t\tthis.overlayStack.length === 0\n\t\t) {\n\t\t\tlogRedraw(`tall→tall shrink viewport realign (${this.previousLines.length} -> ${newLines.length})`);\n\t\t\tconst newViewportTop = getViewportTop(newLines.length);\n\t\t\tconst currentScreenRow = Math.max(0, hardwareCursorRow - prevViewportTop);\n\t\t\tlet buffer = this.useSynchronizedOutput ? \"\\x1b[?2026h\" : \"\";\n\t\t\tif (currentScreenRow > 0) {\n\t\t\t\tbuffer += `\\x1b[${currentScreenRow}A`;\n\t\t\t}\n\t\t\tbuffer += \"\\r\";\n\t\t\tfor (let i = 0; i < height; i++) {\n\t\t\t\tconst idx = newViewportTop + i;\n\t\t\t\tif (i > 0) buffer += \"\\r\\n\";\n\t\t\t\tbuffer += \"\\x1b[2K\";\n\t\t\t\tlet line = newLines[idx] ?? \"\";\n\t\t\t\tif (!isImageLine(line) && visibleWidth(line) > width) {\n\t\t\t\t\tline = truncateToWidth(line, width);\n\t\t\t\t}\n\t\t\t\tbuffer += line;\n\t\t\t}\n\t\t\tif (this.useSynchronizedOutput) buffer += \"\\x1b[?2026l\";\n\t\t\tthis.terminal.write(buffer);\n\t\t\tthis.cursorRow = newLines.length - 1;\n\t\t\tthis.hardwareCursorRow = newLines.length - 1;\n\t\t\tthis.maxLinesRendered = newLines.length;\n\t\t\tthis.previousViewportTop = newViewportTop;\n\t\t\tthis.positionHardwareCursor(cursorPos, newLines.length);\n\t\t\tthis.previousLines = newLines;\n\t\t\tthis.previousWidth = width;\n\t\t\tthis.previousHeight = height;\n\t\t\tthis._shrinkDebounceActive = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Content shrunk below the working area and no overlays - re-render to clear empty rows\n\t\t// (overlays need the padding, so only do this when no overlays are active)\n\t\t// Configurable via setClearOnShrink() or PI_CLEAR_ON_SHRINK=0 env var\n\t\tif (this.clearOnShrink && newLines.length < this.maxLinesRendered && this.overlayStack.length === 0) {\n\t\t\tif (!this._shrinkDebounceActive) {\n\t\t\t\t// First shrink detection: defer the full redraw by one tick.\n\t\t\t\t// If content grows back immediately (pinned clear → new streaming),\n\t\t\t\t// the full redraw is avoided.\n\t\t\t\tthis._shrinkDebounceActive = true;\n\t\t\t\t// Do NOT update maxLinesRendered here — keep the old value so the\n\t\t\t\t// condition `newLines.length < maxLinesRendered` still triggers on\n\t\t\t\t// the next render if content stays shrunk.\n\t\t\t\tlogRedraw(`clearOnShrink deferred (maxLinesRendered=${this.maxLinesRendered})`);\n\t\t\t\t// Fall through to differential render for this frame\n\t\t\t} else {\n\t\t\t\t// Still shrunk on second render — commit the full redraw\n\t\t\t\tthis._shrinkDebounceActive = false;\n\t\t\t\tlogRedraw(`clearOnShrink committed (maxLinesRendered=${this.maxLinesRendered})`);\n\t\t\t\tfullRender(true);\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tthis._shrinkDebounceActive = false;\n\t\t}\n\n\t\t// Find first and last changed lines\n\t\tlet firstChanged = -1;\n\t\tlet lastChanged = -1;\n\t\tconst maxLines = Math.max(newLines.length, this.previousLines.length);\n\t\tfor (let i = 0; i < maxLines; i++) {\n\t\t\tconst oldLine = i < this.previousLines.length ? this.previousLines[i] : \"\";\n\t\t\tconst newLine = i < newLines.length ? newLines[i] : \"\";\n\n\t\t\tif (oldLine !== newLine) {\n\t\t\t\tif (firstChanged === -1) {\n\t\t\t\t\tfirstChanged = i;\n\t\t\t\t}\n\t\t\t\tlastChanged = i;\n\t\t\t}\n\t\t}\n\t\tconst appendedLines = newLines.length > this.previousLines.length;\n\t\tif (appendedLines) {\n\t\t\tif (firstChanged === -1) {\n\t\t\t\tfirstChanged = this.previousLines.length;\n\t\t\t}\n\t\t\tlastChanged = newLines.length - 1;\n\t\t}\n\t\tlet appendStart = appendedLines && firstChanged === this.previousLines.length && firstChanged > 0;\n\n\t\t// No changes - but still need to update hardware cursor position if it moved\n\t\tif (firstChanged === -1) {\n\t\t\tthis.positionHardwareCursor(cursorPos, newLines.length);\n\t\t\tthis.previousViewportTop = getViewportTop(this.maxLinesRendered);\n\t\t\tthis.previousHeight = height;\n\t\t\treturn;\n\t\t}\n\n\t\tif (appendedLines && this.previousLines.length <= height && newLines.length <= height) {\n\t\t\trepaintBottomAnchoredShortBlock();\n\t\t\treturn;\n\t\t}\n\n\t\t// All changes are in deleted lines (nothing to render, just clear)\n\t\tif (firstChanged >= newLines.length) {\n\t\t\tif (this.previousLines.length > newLines.length) {\n\t\t\t\tlet buffer = this.useSynchronizedOutput ? \"\\x1b[?2026h\" : \"\";\n\t\t\t\t// Move to end of new content (clamp to 0 for empty content)\n\t\t\t\tconst targetRow = Math.max(0, newLines.length - 1);\n\t\t\t\tconst lineDiff = computeLineDiff(targetRow);\n\t\t\t\tif (lineDiff > 0) buffer += `\\x1b[${lineDiff}B`;\n\t\t\t\telse if (lineDiff < 0) buffer += `\\x1b[${-lineDiff}A`;\n\t\t\t\tbuffer += \"\\r\";\n\t\t\t\t// Clear extra lines without scrolling\n\t\t\t\tconst extraLines = this.previousLines.length - newLines.length;\n\t\t\t\tif (extraLines > height) {\n\t\t\t\t\tlogRedraw(`extraLines > height (${extraLines} > ${height})`);\n\t\t\t\t\tfullRender(true);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (extraLines > 0) {\n\t\t\t\t\tbuffer += \"\\x1b[1B\";\n\t\t\t\t}\n\t\t\t\tfor (let i = 0; i < extraLines; i++) {\n\t\t\t\t\tbuffer += \"\\r\\x1b[2K\";\n\t\t\t\t\tif (i < extraLines - 1) buffer += \"\\x1b[1B\";\n\t\t\t\t}\n\t\t\t\tif (extraLines > 0) {\n\t\t\t\t\tbuffer += `\\x1b[${extraLines}A`;\n\t\t\t\t}\n\t\t\t\tif (this.useSynchronizedOutput) buffer += \"\\x1b[?2026l\";\n\t\t\t\tthis.terminal.write(buffer);\n\t\t\t\tthis.cursorRow = targetRow;\n\t\t\t\tthis.hardwareCursorRow = targetRow;\n\t\t\t}\n\t\t\tthis.positionHardwareCursor(cursorPos, newLines.length);\n\t\t\tthis.previousLines = newLines;\n\t\t\tthis.previousWidth = width;\n\t\t\tthis.previousHeight = height;\n\t\t\tthis.previousViewportTop = getViewportTop(this.maxLinesRendered);\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if firstChanged is above what was previously visible.\n\t\t// Use previousLines.length (not maxLinesRendered) to avoid false positives after content shrinks.\n\t\tconst previousContentViewportTop = getViewportTop(this.previousLines.length);\n\t\tlet clampedToViewport = false;\n\t\tif (firstChanged < previousContentViewportTop) {\n\t\t\t// First change is above the viewport. Avoid a full screen clear (\\x1b[2J)\n\t\t\t// which causes the bottom panel to flicker. Instead redraw from the actual\n\t\t\t// viewport top down through the bottom of new content so every visible row\n\t\t\t// gets the correct line, even if the viewport shifted (content shrank).\n\t\t\t//\n\t\t\t// Pick the smaller of the two viewport tops so any row currently on screen\n\t\t\t// is covered. Force lastChanged to the end of new content so the render loop\n\t\t\t// repaints the bottom rows that may now hold stale content from the previous\n\t\t\t// frame (the case that caused \"empty screen until next tick\" after the clamp).\n\t\t\tconst newViewportTop = getViewportTop(newLines.length);\n\t\t\tconst clampedFirst = Math.max(0, Math.min(previousContentViewportTop, newViewportTop));\n\t\t\tlogRedraw(\n\t\t\t\t`firstChanged < viewportTop (${firstChanged} < ${previousContentViewportTop}) — repaint from ${clampedFirst}`,\n\t\t\t);\n\t\t\tfirstChanged = clampedFirst;\n\t\t\tlastChanged = Math.max(lastChanged, newLines.length - 1);\n\t\t\tappendStart = false;\n\t\t\tclampedToViewport = true;\n\t\t}\n\n\t\t// Render from first changed line to end\n\t\t// Build buffer with all updates wrapped in synchronized output\n\t\tlet buffer = this.useSynchronizedOutput ? \"\\x1b[?2026h\" : \"\"; // Begin synchronized output\n\t\tconst prevViewportBottom = prevViewportTop + height - 1;\n\t\tconst moveTargetRow = appendStart ? firstChanged - 1 : firstChanged;\n\t\tif (moveTargetRow > prevViewportBottom) {\n\t\t\tconst currentScreenRow = Math.max(0, Math.min(height - 1, hardwareCursorRow - prevViewportTop));\n\t\t\tconst moveToBottom = height - 1 - currentScreenRow;\n\t\t\tif (moveToBottom > 0) {\n\t\t\t\tbuffer += `\\x1b[${moveToBottom}B`;\n\t\t\t}\n\t\t\tconst scroll = moveTargetRow - prevViewportBottom;\n\t\t\tbuffer += \"\\r\\n\".repeat(scroll);\n\t\t\tprevViewportTop += scroll;\n\t\t\tviewportTop += scroll;\n\t\t\thardwareCursorRow = moveTargetRow;\n\t\t}\n\n\t\t// Move cursor to first changed line (use hardwareCursorRow for actual position)\n\t\tconst lineDiff = computeLineDiff(moveTargetRow);\n\t\tif (lineDiff > 0) {\n\t\t\tbuffer += `\\x1b[${lineDiff}B`; // Move down\n\t\t} else if (lineDiff < 0) {\n\t\t\tbuffer += `\\x1b[${-lineDiff}A`; // Move up\n\t\t}\n\n\t\tbuffer += appendStart ? \"\\r\\n\" : \"\\r\"; // Move to column 0\n\n\t\t// Only render changed lines (firstChanged to lastChanged), not all lines to end\n\t\t// This reduces flicker when only a single line changes (e.g., spinner animation)\n\t\tconst renderEnd = Math.min(lastChanged, newLines.length - 1);\n\t\tfor (let i = firstChanged; i <= renderEnd; i++) {\n\t\t\tif (i > firstChanged) buffer += \"\\r\\n\";\n\t\t\tbuffer += \"\\x1b[2K\"; // Clear current line\n\t\t\tlet line = newLines[i];\n\t\t\tconst isImage = isImageLine(line);\n\t\t\tif (!isImage && visibleWidth(line) > width) {\n\t\t\t\tline = truncateToWidth(line, width);\n\t\t\t}\n\t\t\tbuffer += line;\n\t\t}\n\n\t\t// Track where cursor ended up after rendering\n\t\tlet finalCursorRow = renderEnd;\n\n\t\t// If we had more lines before, clear ghost lines — but only when they are\n\t\t// actually visible. For tall buffers (both counts > height) the viewport shifts\n\t\t// up so the differential render already overwrites the old bottom rows; emitting\n\t\t// \\r\\n at screen-bottom would cause spurious terminal scrolling.\n\t\t//\n\t\t// Also skip ghost clearing when the clamp-to-viewport path was taken: that path\n\t\t// renders from clampedFirst through newLines.length-1, filling the entire visible\n\t\t// viewport. There are no ghost lines below renderEnd, and the local `viewportTop`\n\t\t// is based on the stale (larger) maxLinesRendered, so the renderEndScreenRow\n\t\t// check below would compute a negative value and incorrectly fire the cleanup —\n\t\t// which then emits \\r\\n past screen-bottom and scrolls correct lines into\n\t\t// scrollback while filling the viewport with blanks.\n\t\tif (this.previousLines.length > newLines.length && !clampedToViewport) {\n\t\t\tconst renderEndScreenRow = renderEnd - viewportTop;\n\t\t\tconst ghostLinesVisible = renderEndScreenRow < height - 1;\n\t\t\tif (ghostLinesVisible) {\n\t\t\t\t// Move to end of new content first if we stopped before it\n\t\t\t\tif (renderEnd < newLines.length - 1) {\n\t\t\t\t\tconst moveDown = newLines.length - 1 - renderEnd;\n\t\t\t\t\tbuffer += `\\x1b[${moveDown}B`;\n\t\t\t\t\tfinalCursorRow = newLines.length - 1;\n\t\t\t\t}\n\t\t\t\tconst extraLines = this.previousLines.length - newLines.length;\n\t\t\t\tfor (let i = newLines.length; i < this.previousLines.length; i++) {\n\t\t\t\t\tbuffer += \"\\r\\n\\x1b[2K\";\n\t\t\t\t}\n\t\t\t\t// Move cursor back to end of new content\n\t\t\t\tbuffer += `\\x1b[${extraLines}A`;\n\t\t\t}\n\t\t}\n\n\t\tif (this.useSynchronizedOutput) buffer += \"\\x1b[?2026l\"; // End synchronized output\n\n\t\tif (process.env.PI_TUI_DEBUG === \"1\") {\n\t\t\tconst debugDir = path.join(os.tmpdir(), \"tui\");\n\t\t\tfs.mkdirSync(debugDir, { recursive: true });\n\t\t\tconst debugPath = path.join(debugDir, `render-${Date.now()}-${Math.random().toString(36).slice(2)}.log`);\n\t\t\tconst debugData = [\n\t\t\t\t`firstChanged: ${firstChanged}`,\n\t\t\t\t`viewportTop: ${viewportTop}`,\n\t\t\t\t`cursorRow: ${this.cursorRow}`,\n\t\t\t\t`height: ${height}`,\n\t\t\t\t`lineDiff: ${lineDiff}`,\n\t\t\t\t`hardwareCursorRow: ${hardwareCursorRow}`,\n\t\t\t\t`renderEnd: ${renderEnd}`,\n\t\t\t\t`finalCursorRow: ${finalCursorRow}`,\n\t\t\t\t`cursorPos: ${JSON.stringify(cursorPos)}`,\n\t\t\t\t`newLines.length: ${newLines.length}`,\n\t\t\t\t`previousLines.length: ${this.previousLines.length}`,\n\t\t\t\t\"\",\n\t\t\t\t\"=== newLines ===\",\n\t\t\t\tJSON.stringify(newLines, null, 2),\n\t\t\t\t\"\",\n\t\t\t\t\"=== previousLines ===\",\n\t\t\t\tJSON.stringify(this.previousLines, null, 2),\n\t\t\t\t\"\",\n\t\t\t\t\"=== buffer ===\",\n\t\t\t\tJSON.stringify(buffer),\n\t\t\t].join(\"\\n\");\n\t\t\tfs.writeFileSync(debugPath, debugData);\n\t\t\tpruneDebugRenderLogs(debugDir);\n\t\t}\n\n\t\t// Write entire buffer at once\n\t\tthis.terminal.write(buffer);\n\n\t\t// Track cursor position for next render\n\t\t// cursorRow tracks end of content (for viewport calculation)\n\t\t// hardwareCursorRow tracks actual terminal cursor position (for movement)\n\t\tthis.cursorRow = Math.max(0, newLines.length - 1);\n\t\tthis.hardwareCursorRow = finalCursorRow;\n\t\t// Track terminal's working area (grows but doesn't shrink unless cleared).\n\t\t// Exception: when the clamp-to-viewport path repainted shrunk content, the\n\t\t// visible viewport now anchors to newLines.length, so subsequent\n\t\t// computeLineDiff calls need viewportTop = newLines.length - height.\n\t\t// Without this reset, hardwareCursorRow's physical row goes negative.\n\t\tif (clampedToViewport && newLines.length < this.maxLinesRendered) {\n\t\t\tthis.maxLinesRendered = newLines.length;\n\t\t} else {\n\t\t\tthis.maxLinesRendered = Math.max(this.maxLinesRendered, newLines.length);\n\t\t}\n\t\tthis.previousViewportTop = getViewportTop(this.maxLinesRendered);\n\n\t\t// Position hardware cursor for IME\n\t\tthis.positionHardwareCursor(cursorPos, newLines.length);\n\n\t\tthis.previousLines = newLines;\n\t\tthis.previousWidth = width;\n\t\tthis.previousHeight = height;\n\t}\n\n\t/**\n\t * Position the hardware cursor for IME candidate window.\n\t * @param cursorPos The cursor position extracted from rendered output, or null\n\t * @param totalLines Total number of rendered lines\n\t */\n\tprivate positionHardwareCursor(cursorPos: { row: number; col: number } | null, totalLines: number): void {\n\t\tif (!cursorPos || totalLines <= 0) {\n\t\t\tthis.terminal.hideCursor();\n\t\t\treturn;\n\t\t}\n\n\t\t// Clamp cursor position to valid range\n\t\tconst targetRow = Math.max(0, Math.min(cursorPos.row, totalLines - 1));\n\t\tconst targetCol = Math.max(0, cursorPos.col);\n\n\t\t// Move cursor from current position to target\n\t\tconst rowDelta = targetRow - this.hardwareCursorRow;\n\t\tlet buffer = \"\";\n\t\tif (rowDelta > 0) {\n\t\t\tbuffer += `\\x1b[${rowDelta}B`; // Move down\n\t\t} else if (rowDelta < 0) {\n\t\t\tbuffer += `\\x1b[${-rowDelta}A`; // Move up\n\t\t}\n\t\t// Move to absolute column (1-indexed)\n\t\tbuffer += `\\x1b[${targetCol + 1}G`;\n\n\t\tif (buffer) {\n\t\t\tthis.terminal.write(buffer);\n\t\t}\n\n\t\tthis.hardwareCursorRow = targetRow;\n\t\tif (this.showHardwareCursor) {\n\t\t\tthis.terminal.showCursor();\n\t\t} else {\n\t\t\tthis.terminal.hideCursor();\n\t\t}\n\t}\n}\n"]}
@@ -12,9 +12,11 @@ export declare function isWhitespaceChar(char: string): boolean;
12
12
  export declare function isPunctuationChar(char: string): boolean;
13
13
  /**
14
14
  * Calculate the visible width of a string in terminal columns.
15
- * Delegates to the native Rust implementation.
15
+ * Delegates to the native Rust implementation, with a JS fallback so the TUI
16
+ * render loop remains usable when the native addon is unavailable.
16
17
  */
17
18
  export declare function visibleWidth(str: string): number;
19
+ export declare function jsVisibleWidth(str: string): number;
18
20
  /**
19
21
  * Wrap text with ANSI codes preserved.
20
22
  * Delegates to the native Rust implementation.
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAAC,SAAS,CAE7C;AAID;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAMD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEtE;AAaD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAc,EACxB,GAAG,GAAE,OAAe,GAClB,MAAM,CAER;AAED,sDAAsD;AACtD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,MAAM,CAEpG;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,UAAQ,GACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAEjC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,UAAQ,GACjB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAOzG"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAYA;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAAC,SAAS,CAE7C;AAKD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAMD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMhD;AAiCD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAEtE;AAaD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAc,EACxB,GAAG,GAAE,OAAe,GAClB,MAAM,CAER;AAED,sDAAsD;AACtD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,MAAM,CAEpG;AAED,kFAAkF;AAClF,wBAAgB,cAAc,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,MAAM,UAAQ,GACZ;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAEjC;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,WAAW,UAAQ,GACjB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAE5E;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAOzG"}
@@ -8,6 +8,7 @@ export function getSegmenter() {
8
8
  return segmenter;
9
9
  }
10
10
  const PUNCTUATION_REGEX = /[(){}[\]<>.,;:'"!?+\-=*/\\|&%^$#@~`]/;
11
+ const ANSI_PATTERN = /\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1B\\))/g;
11
12
  /**
12
13
  * Check if a character is whitespace.
13
14
  */
@@ -25,10 +26,53 @@ export function isPunctuationChar(char) {
25
26
  // ---------------------------------------------------------------------------
26
27
  /**
27
28
  * Calculate the visible width of a string in terminal columns.
28
- * Delegates to the native Rust implementation.
29
+ * Delegates to the native Rust implementation, with a JS fallback so the TUI
30
+ * render loop remains usable when the native addon is unavailable.
29
31
  */
30
32
  export function visibleWidth(str) {
31
- return nativeVisibleWidth(str);
33
+ try {
34
+ return nativeVisibleWidth(str);
35
+ }
36
+ catch {
37
+ return jsVisibleWidth(str);
38
+ }
39
+ }
40
+ function tabWidthOrDefault(tabWidth) {
41
+ return Math.min(16, Math.max(1, Math.floor(tabWidth ?? 3)));
42
+ }
43
+ function stripAnsi(text) {
44
+ return text.replace(ANSI_PATTERN, "");
45
+ }
46
+ function graphemeWidth(grapheme) {
47
+ if (grapheme === "\t")
48
+ return tabWidthOrDefault();
49
+ if (grapheme === "\n" || grapheme === "\r")
50
+ return 0;
51
+ const codePoint = grapheme.codePointAt(0) ?? 0;
52
+ if (codePoint === 0)
53
+ return 0;
54
+ if (codePoint < 32 || (codePoint >= 0x7f && codePoint < 0xa0))
55
+ return 0;
56
+ if ((codePoint >= 0x1100 && codePoint <= 0x115f) ||
57
+ (codePoint >= 0x2329 && codePoint <= 0x232a) ||
58
+ (codePoint >= 0x2e80 && codePoint <= 0xa4cf) ||
59
+ (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||
60
+ (codePoint >= 0xf900 && codePoint <= 0xfaff) ||
61
+ (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||
62
+ (codePoint >= 0xfe30 && codePoint <= 0xfe6f) ||
63
+ (codePoint >= 0xff00 && codePoint <= 0xff60) ||
64
+ (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||
65
+ (codePoint >= 0x1f300 && codePoint <= 0x1faff)) {
66
+ return 2;
67
+ }
68
+ return 1;
69
+ }
70
+ export function jsVisibleWidth(str) {
71
+ let width = 0;
72
+ for (const { segment } of segmenter.segment(stripAnsi(str))) {
73
+ width += graphemeWidth(segment);
74
+ }
75
+ return width;
32
76
  }
33
77
  /**
34
78
  * Wrap text with ANSI codes preserved.