@opengsd/gsd-pi 1.0.1-dev.bf2899e → 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 (1224) hide show
  1. package/README.md +2 -2
  2. package/dist/claude-cli-check.js +1 -1
  3. package/dist/extension-sort.js +1 -1
  4. package/dist/extension-validator.js +1 -1
  5. package/dist/loader-entrypoint.js +1 -1
  6. package/dist/resource-loader.js +1 -1
  7. package/dist/resources/.managed-resources-content-hash +1 -1
  8. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +1 -1
  9. package/dist/resources/extensions/github-sync/templates.js +1 -1
  10. package/dist/resources/extensions/gsd/auto/contracts.js +1 -1
  11. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +1 -1
  12. package/dist/resources/extensions/gsd/auto/lease-conflict-notice.js +1 -1
  13. package/dist/resources/extensions/gsd/auto/loop.js +1 -1
  14. package/dist/resources/extensions/gsd/auto/orchestrator.js +1 -1
  15. package/dist/resources/extensions/gsd/auto/phases.js +7 -2
  16. package/dist/resources/extensions/gsd/auto/run-unit.js +1 -1
  17. package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +1 -1
  18. package/dist/resources/extensions/gsd/auto/session.js +1 -1
  19. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +1 -1
  20. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  21. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +1 -1
  22. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +1 -1
  23. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +1 -1
  24. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +1 -1
  25. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +1 -1
  26. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +1 -1
  27. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +1 -1
  28. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +1 -1
  29. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +1 -1
  30. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +1 -1
  31. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +1 -1
  33. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +1 -1
  34. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +1 -1
  35. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +1 -1
  36. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +1 -1
  37. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +1 -1
  38. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  39. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +1 -1
  40. package/dist/resources/extensions/gsd/auto-artifact-paths.js +1 -1
  41. package/dist/resources/extensions/gsd/auto-budget.js +1 -1
  42. package/dist/resources/extensions/gsd/auto-dashboard.js +1 -1
  43. package/dist/resources/extensions/gsd/auto-dispatch.js +1 -1
  44. package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
  45. package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
  46. package/dist/resources/extensions/gsd/auto-recovery.js +1 -1
  47. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  48. package/dist/resources/extensions/gsd/auto-status-message.js +1 -1
  49. package/dist/resources/extensions/gsd/auto-timers.js +1 -1
  50. package/dist/resources/extensions/gsd/auto-unit-closeout.js +1 -1
  51. package/dist/resources/extensions/gsd/auto-verification.js +1 -1
  52. package/dist/resources/extensions/gsd/auto-worktree-repair.js +1 -1
  53. package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
  54. package/dist/resources/extensions/gsd/auto.js +5 -1
  55. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +1 -1
  56. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +1 -1
  57. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
  58. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  59. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +1 -1
  60. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +2 -2
  61. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  62. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  63. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +1 -1
  64. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +1 -1
  65. package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +1 -1
  66. package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
  67. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  68. package/dist/resources/extensions/gsd/browser-evidence.js +1 -1
  69. package/dist/resources/extensions/gsd/closeout-recovery.js +1 -1
  70. package/dist/resources/extensions/gsd/commands/dispatcher.js +1 -1
  71. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +1 -1
  72. package/dist/resources/extensions/gsd/commands-closeout.js +1 -1
  73. package/dist/resources/extensions/gsd/commands-ship.js +1 -1
  74. package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
  75. package/dist/resources/extensions/gsd/commands-workflow-templates.js +1 -1
  76. package/dist/resources/extensions/gsd/commands-worktree.js +1 -1
  77. package/dist/resources/extensions/gsd/component-loader.js +1 -1
  78. package/dist/resources/extensions/gsd/db/auto-workers.js +1 -1
  79. package/dist/resources/extensions/gsd/db/command-queue.js +1 -1
  80. package/dist/resources/extensions/gsd/db/milestone-leases.js +20 -6
  81. package/dist/resources/extensions/gsd/db/runtime-kv.js +1 -1
  82. package/dist/resources/extensions/gsd/db/unit-dispatches.js +1 -1
  83. package/dist/resources/extensions/gsd/db-adapter.js +1 -1
  84. package/dist/resources/extensions/gsd/db-base-schema.js +1 -1
  85. package/dist/resources/extensions/gsd/db-connection-cache.js +1 -1
  86. package/dist/resources/extensions/gsd/db-coordination-schema.js +1 -1
  87. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +1 -1
  88. package/dist/resources/extensions/gsd/db-gate-rows.js +1 -1
  89. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +1 -1
  90. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +1 -1
  91. package/dist/resources/extensions/gsd/db-migration-backup.js +1 -1
  92. package/dist/resources/extensions/gsd/db-migration-steps.js +1 -1
  93. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +1 -1
  94. package/dist/resources/extensions/gsd/db-open-state.js +1 -1
  95. package/dist/resources/extensions/gsd/db-provider.js +1 -1
  96. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +1 -1
  97. package/dist/resources/extensions/gsd/db-schema-metadata.js +1 -1
  98. package/dist/resources/extensions/gsd/db-task-slice-rows.js +1 -1
  99. package/dist/resources/extensions/gsd/db-transaction.js +1 -1
  100. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +1 -1
  101. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +1 -1
  102. package/dist/resources/extensions/gsd/doctor-git-checks.js +1 -1
  103. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -1
  104. package/dist/resources/extensions/gsd/ecosystem/loader.js +1 -1
  105. package/dist/resources/extensions/gsd/escalation.js +1 -1
  106. package/dist/resources/extensions/gsd/fresh-run-ui.js +1 -1
  107. package/dist/resources/extensions/gsd/git-conflict-state.js +1 -1
  108. package/dist/resources/extensions/gsd/git-service.js +1 -1
  109. package/dist/resources/extensions/gsd/gsd-command-home.js +1 -1
  110. package/dist/resources/extensions/gsd/gsd-db.js +1 -1
  111. package/dist/resources/extensions/gsd/guided-unit-context.js +1 -1
  112. package/dist/resources/extensions/gsd/health-widget.js +1 -1
  113. package/dist/resources/extensions/gsd/knowledge-backfill.js +1 -1
  114. package/dist/resources/extensions/gsd/knowledge-capture.js +1 -1
  115. package/dist/resources/extensions/gsd/knowledge-parser.js +1 -1
  116. package/dist/resources/extensions/gsd/knowledge-projection.js +1 -1
  117. package/dist/resources/extensions/gsd/legacy-telemetry.js +1 -1
  118. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  119. package/dist/resources/extensions/gsd/memory-backfill.js +1 -1
  120. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  121. package/dist/resources/extensions/gsd/metrics.js +1 -1
  122. package/dist/resources/extensions/gsd/migrate/audit.js +2 -2
  123. package/dist/resources/extensions/gsd/migrate/command.js +2 -2
  124. package/dist/resources/extensions/gsd/migrate/safety.js +1 -1
  125. package/dist/resources/extensions/gsd/migrate/writer.js +1 -1
  126. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +1 -1
  127. package/dist/resources/extensions/gsd/model-router.js +1 -1
  128. package/dist/resources/extensions/gsd/notification-overlay.js +1 -1
  129. package/dist/resources/extensions/gsd/orphan-stash-audit.js +1 -1
  130. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +1 -1
  131. package/dist/resources/extensions/gsd/paths.js +1 -1
  132. package/dist/resources/extensions/gsd/pending-auto-start.js +1 -1
  133. package/dist/resources/extensions/gsd/planning-depth.js +1 -1
  134. package/dist/resources/extensions/gsd/post-execution-checks.js +1 -1
  135. package/dist/resources/extensions/gsd/pr-evidence.js +1 -1
  136. package/dist/resources/extensions/gsd/pre-execution-checks.js +1 -1
  137. package/dist/resources/extensions/gsd/process-task-path.js +1 -1
  138. package/dist/resources/extensions/gsd/prompts/review-migration.md +2 -2
  139. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  140. package/dist/resources/extensions/gsd/recovery-classification.js +1 -1
  141. package/dist/resources/extensions/gsd/repository-registry.js +1 -1
  142. package/dist/resources/extensions/gsd/root-write-leak-guard.js +1 -1
  143. package/dist/resources/extensions/gsd/schemas/parsers.js +1 -1
  144. package/dist/resources/extensions/gsd/schemas/validate.js +1 -1
  145. package/dist/resources/extensions/gsd/skill-manifest.js +1 -1
  146. package/dist/resources/extensions/gsd/slice-cadence.js +1 -1
  147. package/dist/resources/extensions/gsd/smart-entry-routing.js +1 -1
  148. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +1 -1
  149. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +1 -1
  150. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
  151. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +1 -1
  152. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +1 -1
  153. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +1 -1
  154. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +1 -1
  155. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +1 -1
  156. package/dist/resources/extensions/gsd/state-reconciliation/index.js +1 -1
  157. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +1 -1
  158. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +1 -1
  159. package/dist/resources/extensions/gsd/state-reconciliation/types.js +1 -1
  160. package/dist/resources/extensions/gsd/state-reconciliation.js +1 -1
  161. package/dist/resources/extensions/gsd/state.js +1 -1
  162. package/dist/resources/extensions/gsd/tool-contract.js +1 -1
  163. package/dist/resources/extensions/gsd/tools/complete-milestone.js +2 -2
  164. package/dist/resources/extensions/gsd/tools/complete-slice.js +8 -2
  165. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  166. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +1 -1
  167. package/dist/resources/extensions/gsd/tools/exec-tool.js +1 -1
  168. package/dist/resources/extensions/gsd/tools/plan-milestone.js +1 -1
  169. package/dist/resources/extensions/gsd/tools/validate-milestone.js +1 -1
  170. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  171. package/dist/resources/extensions/gsd/tui/render-kit.js +1 -1
  172. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  173. package/dist/resources/extensions/gsd/unit-context-manifest.js +1 -1
  174. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
  175. package/dist/resources/extensions/gsd/uok/audit.js +1 -1
  176. package/dist/resources/extensions/gsd/uok/contracts.js +1 -1
  177. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +1 -1
  178. package/dist/resources/extensions/gsd/uok/loop-adapter.js +1 -1
  179. package/dist/resources/extensions/gsd/uok/plan-v2.js +1 -1
  180. package/dist/resources/extensions/gsd/uok/timeline.js +1 -1
  181. package/dist/resources/extensions/gsd/validation-block-guard.js +1 -1
  182. package/dist/resources/extensions/gsd/verification-gate.js +2 -2
  183. package/dist/resources/extensions/gsd/verification-verdict.js +1 -1
  184. package/dist/resources/extensions/gsd/watch/header-renderer.js +1 -1
  185. package/dist/resources/extensions/gsd/watch/splash-palette.js +1 -1
  186. package/dist/resources/extensions/gsd/workflow-manifest.js +1 -1
  187. package/dist/resources/extensions/gsd/workflow-projections.js +1 -1
  188. package/dist/resources/extensions/gsd/workflow-protocol.js +1 -1
  189. package/dist/resources/extensions/gsd/workflow-templates.js +1 -1
  190. package/dist/resources/extensions/gsd/working-output-messages.js +1 -1
  191. package/dist/resources/extensions/gsd/workspace.js +1 -1
  192. package/dist/resources/extensions/gsd/worktree-lifecycle.js +1 -1
  193. package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
  194. package/dist/resources/extensions/gsd/worktree-safety.js +1 -1
  195. package/dist/resources/extensions/gsd/worktree-state-projection.js +1 -1
  196. package/dist/resources/extensions/mcp-client/manager.js +1 -1
  197. package/dist/resources/extensions/ollama/index.js +1 -1
  198. package/dist/resources/extensions/ollama/model-capabilities.js +1 -1
  199. package/dist/resources/extensions/ollama/ndjson-stream.js +1 -1
  200. package/dist/resources/extensions/ollama/ollama-chat-provider.js +1 -1
  201. package/dist/resources/extensions/ollama/ollama-client.js +1 -1
  202. package/dist/resources/extensions/ollama/ollama-commands.js +1 -1
  203. package/dist/resources/extensions/ollama/ollama-discovery.js +1 -1
  204. package/dist/resources/extensions/ollama/ollama-tool.js +1 -1
  205. package/dist/resources/extensions/ollama/thinking-parser.js +1 -1
  206. package/dist/resources/extensions/ollama/types.js +1 -1
  207. package/dist/resources/extensions/shared/cmux-events.js +1 -1
  208. package/dist/resources/extensions/shared/gsd-phase-state.js +1 -1
  209. package/dist/resources/extensions/shared/interview-ui.js +1 -1
  210. package/dist/resources/extensions/subagent/launch.js +1 -1
  211. package/dist/resources/extensions/subagent/run-store.js +1 -1
  212. package/dist/resources/extensions/visual-brief/artifact-policy.js +1 -1
  213. package/dist/resources/extensions/visual-brief/index.js +1 -1
  214. package/dist/resources/extensions/visual-brief/page-contract.js +1 -1
  215. package/dist/resources/extensions/visual-brief/prompts.js +1 -1
  216. package/dist/resources/skills/api-design/SKILL.md +1 -1
  217. package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
  218. package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
  219. package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
  220. package/dist/resources/skills/observability/SKILL.md +4 -4
  221. package/dist/resources/skills/security-review/SKILL.md +1 -1
  222. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  223. package/dist/update-cmd.d.ts +6 -1
  224. package/dist/update-cmd.js +4 -1
  225. package/dist/web/standalone/.next/BUILD_ID +1 -1
  226. package/dist/web/standalone/.next/app-path-routes-manifest.json +9 -9
  227. package/dist/web/standalone/.next/build-manifest.json +3 -3
  228. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  229. package/dist/web/standalone/.next/required-server-files.json +3 -3
  230. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  231. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  233. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  234. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  235. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  236. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  237. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  238. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  239. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  240. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  241. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  242. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  243. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  244. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  245. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  246. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  247. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  248. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  249. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  250. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  252. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  257. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  260. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  267. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  269. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  270. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  272. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  273. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  274. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  275. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  276. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  277. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  278. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  279. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  280. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  281. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  282. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  283. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  284. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  285. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  286. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  287. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  288. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  289. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  290. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  291. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  292. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  293. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  294. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  295. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  296. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  297. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  298. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  299. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  300. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  301. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  302. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  303. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  304. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  305. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  306. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  307. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  308. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  309. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  310. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  311. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  312. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  313. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  314. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  315. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  316. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  317. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  318. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  319. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  320. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  321. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  322. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  323. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  324. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  325. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  326. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +3 -3
  327. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  328. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  329. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  330. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  331. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  332. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  333. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  334. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  335. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  336. package/dist/web/standalone/.next/server/app/index.html +1 -1
  337. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  338. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  339. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  340. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  341. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  342. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  343. package/dist/web/standalone/.next/server/app/page.js +2 -2
  344. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  345. package/dist/web/standalone/.next/server/app-paths-manifest.json +9 -9
  346. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  347. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  348. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  349. package/dist/web/standalone/.next/server/middleware.js +3 -3
  350. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  351. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  352. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  353. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-74e2ce73b334a036.js → page-0fa92deaf6721345.js} +1 -1
  354. package/dist/web/standalone/.next/static/chunks/app/layout-68f32aa90495be18.js +1 -0
  355. package/dist/web/standalone/.next/static/chunks/app/page-4dbb4d03b2d85d57.js +1 -0
  356. package/dist/web/standalone/.next/static/chunks/{main-app-cd9a54b04f7d1b0b.js → main-app-c3abead5a8518a30.js} +1 -1
  357. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-de2636d5a7f60b61.js +1 -0
  358. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  359. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  360. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  361. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  362. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  363. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  364. package/dist/web/standalone/server.js +1 -1
  365. package/dist/welcome-screen.js +1 -1
  366. package/package.json +7 -7
  367. package/packages/contracts/dist/index.js +1 -1
  368. package/packages/contracts/dist/index.js.map +1 -1
  369. package/packages/contracts/dist/rpc.js +1 -1
  370. package/packages/contracts/dist/rpc.js.map +1 -1
  371. package/packages/contracts/dist/rpc.test.js +1 -1
  372. package/packages/contracts/dist/rpc.test.js.map +1 -1
  373. package/packages/contracts/dist/workflow.js +1 -1
  374. package/packages/contracts/dist/workflow.js.map +1 -1
  375. package/packages/contracts/package.json +1 -1
  376. package/packages/contracts/src/index.ts +1 -1
  377. package/packages/contracts/src/rpc.test.ts +1 -1
  378. package/packages/contracts/src/rpc.ts +1 -1
  379. package/packages/contracts/src/workflow.ts +1 -1
  380. package/packages/daemon/package.json +3 -3
  381. package/packages/mcp-server/dist/workflow-tools.js +1 -1
  382. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  383. package/packages/mcp-server/package.json +3 -3
  384. package/packages/mcp-server/src/import-candidates.test.ts +1 -1
  385. package/packages/mcp-server/src/workflow-tools-parity.test.ts +1 -1
  386. package/packages/mcp-server/src/workflow-tools.test.ts +1 -1
  387. package/packages/mcp-server/src/workflow-tools.ts +1 -1
  388. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  389. package/packages/native/package.json +1 -1
  390. package/packages/pi-agent-core/dist/token-audit.js +1 -1
  391. package/packages/pi-agent-core/dist/token-audit.js.map +1 -1
  392. package/packages/pi-agent-core/package.json +1 -1
  393. package/packages/pi-agent-core/src/token-audit.test.ts +1 -1
  394. package/packages/pi-agent-core/src/token-audit.ts +1 -1
  395. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  396. package/packages/pi-ai/dist/models/fake-model.d.ts +1 -1
  397. package/packages/pi-ai/dist/models/fake-model.js +1 -1
  398. package/packages/pi-ai/dist/models/fake-model.js.map +1 -1
  399. package/packages/pi-ai/dist/providers/api-family.js +1 -1
  400. package/packages/pi-ai/dist/providers/api-family.js.map +1 -1
  401. package/packages/pi-ai/dist/providers/api-family.test.js +1 -1
  402. package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -1
  403. package/packages/pi-ai/dist/providers/fake.d.ts +1 -1
  404. package/packages/pi-ai/dist/providers/fake.js +1 -1
  405. package/packages/pi-ai/dist/providers/fake.js.map +1 -1
  406. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +1 -1
  407. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -1
  408. package/packages/pi-ai/dist/providers/provider-capabilities.js +1 -1
  409. package/packages/pi-ai/dist/providers/provider-capabilities.js.map +1 -1
  410. package/packages/pi-ai/dist/providers/provider-capabilities.test.js +1 -1
  411. package/packages/pi-ai/dist/providers/provider-capabilities.test.js.map +1 -1
  412. package/packages/pi-ai/dist/providers/transform-messages-report.test.js +1 -1
  413. package/packages/pi-ai/dist/providers/transform-messages-report.test.js.map +1 -1
  414. package/packages/pi-ai/dist/types.js.map +1 -1
  415. package/packages/pi-ai/package.json +1 -1
  416. package/packages/pi-ai/src/models/fake-model.ts +1 -1
  417. package/packages/pi-ai/src/providers/api-family.test.ts +1 -1
  418. package/packages/pi-ai/src/providers/api-family.ts +1 -1
  419. package/packages/pi-ai/src/providers/fake.ts +1 -1
  420. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +1 -1
  421. package/packages/pi-ai/src/providers/provider-capabilities.test.ts +1 -1
  422. package/packages/pi-ai/src/providers/provider-capabilities.ts +1 -1
  423. package/packages/pi-ai/src/providers/transform-messages-report.test.ts +1 -1
  424. package/packages/pi-ai/src/types.ts +1 -1
  425. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  426. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +1 -1
  427. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  428. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  429. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  430. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +1 -1
  431. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  432. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +1 -1
  433. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -1
  434. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +1 -1
  435. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -1
  436. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +1 -1
  437. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -1
  438. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +1 -1
  439. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -1
  440. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js +1 -1
  441. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js.map +1 -1
  442. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +1 -1
  443. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +1 -1
  444. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +1 -1
  445. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -1
  446. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  447. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  448. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +1 -1
  449. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  450. package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.js +1 -1
  451. package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.js.map +1 -1
  452. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +1 -1
  453. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -1
  454. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +1 -1
  455. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -1
  456. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +1 -1
  457. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -1
  458. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +1 -1
  459. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  460. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/collapsible-message.test.js +1 -1
  461. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/collapsible-message.test.js.map +1 -1
  462. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +1 -1
  463. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  464. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +1 -1
  465. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -1
  466. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +2 -2
  467. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +1 -1
  469. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -1
  470. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +1 -1
  471. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  472. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +1 -1
  473. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  474. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.js +1 -1
  475. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.js.map +1 -1
  476. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.test.js +1 -1
  477. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.test.js.map +1 -1
  478. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +1 -1
  479. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  480. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  481. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +1 -1
  482. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  483. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.test.js +1 -1
  484. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.test.js.map +1 -1
  485. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  486. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  487. package/packages/pi-coding-agent/dist/modes/interactive/components/collapsible-message.js +1 -1
  488. package/packages/pi-coding-agent/dist/modes/interactive/components/collapsible-message.js.map +1 -1
  489. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  490. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  491. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +1 -1
  492. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  493. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +1 -1
  494. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  495. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-editor.js +1 -1
  496. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-editor.js.map +1 -1
  497. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  498. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  499. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +1 -1
  500. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  501. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.test.js +1 -1
  502. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.test.js.map +1 -1
  503. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +1 -1
  504. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  505. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +1 -1
  506. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  507. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +1 -1
  508. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  509. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +1 -1
  510. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  511. package/packages/pi-coding-agent/dist/modes/interactive/components/interactive-key-handling.test.js +1 -1
  512. package/packages/pi-coding-agent/dist/modes/interactive/components/interactive-key-handling.test.js.map +1 -1
  513. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +1 -1
  514. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  515. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +1 -1
  516. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  517. package/packages/pi-coding-agent/dist/modes/interactive/components/render-cache.js +1 -1
  518. package/packages/pi-coding-agent/dist/modes/interactive/components/render-cache.js.map +1 -1
  519. package/packages/pi-coding-agent/dist/modes/interactive/components/selector-footers.test.js +1 -1
  520. package/packages/pi-coding-agent/dist/modes/interactive/components/selector-footers.test.js.map +1 -1
  521. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  522. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  523. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.js +1 -1
  524. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.js.map +1 -1
  525. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.test.js +1 -1
  526. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.test.js.map +1 -1
  527. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +1 -1
  528. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -1
  529. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +2 -2
  530. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  531. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  532. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  533. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +1 -1
  534. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -1
  535. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js +1 -1
  536. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js.map +1 -1
  537. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js +1 -1
  538. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js.map +1 -1
  539. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +1 -1
  540. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  541. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.test.js +1 -1
  542. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.test.js.map +1 -1
  543. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +1 -1
  544. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  545. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +1 -1
  546. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  547. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -1
  548. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  549. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-lifecycle.test.js +1 -1
  550. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-lifecycle.test.js.map +1 -1
  551. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +1 -1
  552. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  553. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +2 -2
  554. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  555. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +1 -1
  556. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -1
  557. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +1 -1
  558. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -1
  559. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  560. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  561. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +1 -1
  562. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -1
  563. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +1 -1
  564. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  565. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js +1 -1
  566. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js.map +1 -1
  567. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.js +1 -1
  568. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.js.map +1 -1
  569. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.test.js +1 -1
  570. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.test.js.map +1 -1
  571. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +1 -1
  572. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  573. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +1 -1
  574. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -1
  575. package/packages/pi-coding-agent/package.json +2 -2
  576. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +1 -1
  577. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  578. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +1 -1
  579. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +1 -1
  580. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +1 -1
  581. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +1 -1
  582. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +1 -1
  583. package/packages/pi-coding-agent/src/core/extensions/provider-registration.test.ts +1 -1
  584. package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +1 -1
  585. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +1 -1
  586. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  587. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +1 -1
  588. package/packages/pi-coding-agent/src/core/tools/tool-compatibility-registry.ts +1 -1
  589. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +1 -1
  590. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +1 -1
  591. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +1 -1
  592. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +1 -1
  593. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/collapsible-message.test.ts +1 -1
  594. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +1 -1
  595. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +1 -1
  596. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +2 -2
  597. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +1 -1
  598. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +1 -1
  599. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +1 -1
  600. package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.test.ts +1 -1
  601. package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.ts +1 -1
  602. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +1 -1
  603. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -1
  604. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.test.ts +1 -1
  605. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +1 -1
  606. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  607. package/packages/pi-coding-agent/src/modes/interactive/components/collapsible-message.ts +1 -1
  608. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  609. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +1 -1
  610. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +1 -1
  611. package/packages/pi-coding-agent/src/modes/interactive/components/custom-editor.ts +1 -1
  612. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  613. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.test.ts +1 -1
  614. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +1 -1
  615. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +1 -1
  616. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -1
  617. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +1 -1
  618. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +1 -1
  619. package/packages/pi-coding-agent/src/modes/interactive/components/interactive-key-handling.test.ts +1 -1
  620. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +1 -1
  621. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +1 -1
  622. package/packages/pi-coding-agent/src/modes/interactive/components/render-cache.ts +1 -1
  623. package/packages/pi-coding-agent/src/modes/interactive/components/selector-footers.test.ts +1 -1
  624. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +1 -1
  625. package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.test.ts +1 -1
  626. package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.ts +1 -1
  627. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +1 -1
  628. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +2 -2
  629. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  630. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +1 -1
  631. package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +1 -1
  632. package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +1 -1
  633. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.test.ts +1 -1
  634. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +1 -1
  635. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +1 -1
  636. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +1 -1
  637. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -1
  638. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-lifecycle.test.ts +1 -1
  639. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +1 -1
  640. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +2 -2
  641. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +1 -1
  642. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +1 -1
  643. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  644. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +1 -1
  645. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +1 -1
  646. package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +1 -1
  647. package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.test.ts +1 -1
  648. package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.ts +1 -1
  649. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +1 -1
  650. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +1 -1
  651. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  652. package/packages/pi-tui/dist/__tests__/keys.test.js +1 -1
  653. package/packages/pi-tui/dist/__tests__/keys.test.js.map +1 -1
  654. package/packages/pi-tui/dist/__tests__/style.test.js +1 -1
  655. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -1
  656. package/packages/pi-tui/dist/__tests__/tui.test.js +1 -1
  657. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  658. package/packages/pi-tui/dist/__tests__/utils.test.js +5 -2
  659. package/packages/pi-tui/dist/__tests__/utils.test.js.map +1 -1
  660. package/packages/pi-tui/dist/components/__tests__/box.test.js +1 -1
  661. package/packages/pi-tui/dist/components/__tests__/box.test.js.map +1 -1
  662. package/packages/pi-tui/dist/components/__tests__/editor.test.js +1 -1
  663. package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -1
  664. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js +1 -1
  665. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js.map +1 -1
  666. package/packages/pi-tui/dist/components/box.js +1 -1
  667. package/packages/pi-tui/dist/components/box.js.map +1 -1
  668. package/packages/pi-tui/dist/components/editor.js +1 -1
  669. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  670. package/packages/pi-tui/dist/components/input.js +1 -1
  671. package/packages/pi-tui/dist/components/input.js.map +1 -1
  672. package/packages/pi-tui/dist/components/truncated-text.js +1 -1
  673. package/packages/pi-tui/dist/components/truncated-text.js.map +1 -1
  674. package/packages/pi-tui/dist/index.js +1 -1
  675. package/packages/pi-tui/dist/index.js.map +1 -1
  676. package/packages/pi-tui/dist/keys.js +1 -1
  677. package/packages/pi-tui/dist/keys.js.map +1 -1
  678. package/packages/pi-tui/dist/overlay-layout.js +1 -1
  679. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  680. package/packages/pi-tui/dist/style.js +1 -1
  681. package/packages/pi-tui/dist/style.js.map +1 -1
  682. package/packages/pi-tui/dist/tui.js +1 -1
  683. package/packages/pi-tui/dist/tui.js.map +1 -1
  684. package/packages/pi-tui/dist/utils.d.ts +3 -1
  685. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  686. package/packages/pi-tui/dist/utils.js +46 -2
  687. package/packages/pi-tui/dist/utils.js.map +1 -1
  688. package/packages/pi-tui/package.json +1 -1
  689. package/packages/pi-tui/src/__tests__/keys.test.ts +1 -1
  690. package/packages/pi-tui/src/__tests__/style.test.ts +1 -1
  691. package/packages/pi-tui/src/__tests__/tui.test.ts +1 -1
  692. package/packages/pi-tui/src/__tests__/utils.test.ts +6 -2
  693. package/packages/pi-tui/src/components/__tests__/box.test.ts +1 -1
  694. package/packages/pi-tui/src/components/__tests__/editor.test.ts +1 -1
  695. package/packages/pi-tui/src/components/__tests__/truncated-text.test.ts +1 -1
  696. package/packages/pi-tui/src/components/box.ts +1 -1
  697. package/packages/pi-tui/src/components/editor.ts +1 -1
  698. package/packages/pi-tui/src/components/input.ts +1 -1
  699. package/packages/pi-tui/src/components/truncated-text.ts +1 -1
  700. package/packages/pi-tui/src/index.ts +1 -1
  701. package/packages/pi-tui/src/keys.ts +1 -1
  702. package/packages/pi-tui/src/overlay-layout.ts +1 -1
  703. package/packages/pi-tui/src/style.ts +1 -1
  704. package/packages/pi-tui/src/tui.ts +1 -1
  705. package/packages/pi-tui/src/utils.ts +47 -2
  706. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  707. package/packages/rpc-client/dist/rpc-types.js +1 -1
  708. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  709. package/packages/rpc-client/package.json +2 -2
  710. package/packages/rpc-client/src/rpc-types.ts +1 -1
  711. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  712. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +1 -1
  713. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -1
  714. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  715. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  716. package/pkg/package.json +1 -1
  717. package/scripts/install.js +36 -3
  718. package/scripts/lib/workspace-manifest.cjs +1 -1
  719. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +1 -1
  720. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +4 -4
  721. package/src/resources/extensions/github-sync/templates.ts +1 -1
  722. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +1 -1
  723. package/src/resources/extensions/github-sync/tests/templates.test.ts +1 -1
  724. package/src/resources/extensions/google-search/index.ts +1 -1
  725. package/src/resources/extensions/gsd/auto/contracts.ts +1 -1
  726. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +1 -1
  727. package/src/resources/extensions/gsd/auto/lease-conflict-notice.ts +1 -1
  728. package/src/resources/extensions/gsd/auto/loop.ts +1 -1
  729. package/src/resources/extensions/gsd/auto/orchestrator.ts +1 -1
  730. package/src/resources/extensions/gsd/auto/phases.ts +12 -2
  731. package/src/resources/extensions/gsd/auto/run-unit.ts +1 -1
  732. package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +1 -1
  733. package/src/resources/extensions/gsd/auto/session.ts +1 -1
  734. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +1 -1
  735. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +1 -1
  736. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +1 -1
  737. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +1 -1
  738. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +1 -1
  739. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +1 -1
  740. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +1 -1
  741. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +1 -1
  742. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +1 -1
  743. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +1 -1
  744. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +1 -1
  745. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +1 -1
  746. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +1 -1
  747. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +1 -1
  748. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +1 -1
  749. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +1 -1
  750. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +1 -1
  751. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +1 -1
  752. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +1 -1
  753. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  754. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +1 -1
  755. package/src/resources/extensions/gsd/auto-artifact-paths.ts +1 -1
  756. package/src/resources/extensions/gsd/auto-budget.ts +1 -1
  757. package/src/resources/extensions/gsd/auto-dashboard.ts +1 -1
  758. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -1
  759. package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
  760. package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
  761. package/src/resources/extensions/gsd/auto-recovery.ts +1 -1
  762. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  763. package/src/resources/extensions/gsd/auto-status-message.ts +1 -1
  764. package/src/resources/extensions/gsd/auto-timers.ts +1 -1
  765. package/src/resources/extensions/gsd/auto-unit-closeout.ts +1 -1
  766. package/src/resources/extensions/gsd/auto-verification.ts +1 -1
  767. package/src/resources/extensions/gsd/auto-worktree-repair.ts +1 -1
  768. package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
  769. package/src/resources/extensions/gsd/auto.ts +5 -1
  770. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +1 -1
  771. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +1 -1
  772. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
  773. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  774. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +1 -1
  775. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +2 -2
  776. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  777. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  778. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +1 -1
  779. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +1 -1
  780. package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +1 -1
  781. package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
  782. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +1 -1
  783. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +1 -1
  784. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  785. package/src/resources/extensions/gsd/browser-evidence.ts +1 -1
  786. package/src/resources/extensions/gsd/closeout-recovery.ts +1 -1
  787. package/src/resources/extensions/gsd/commands/dispatcher.ts +1 -1
  788. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +1 -1
  789. package/src/resources/extensions/gsd/commands/handlers/ops.ts +1 -1
  790. package/src/resources/extensions/gsd/commands-closeout.ts +1 -1
  791. package/src/resources/extensions/gsd/commands-ship.ts +1 -1
  792. package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
  793. package/src/resources/extensions/gsd/commands-workflow-templates.ts +1 -1
  794. package/src/resources/extensions/gsd/commands-worktree.ts +1 -1
  795. package/src/resources/extensions/gsd/component-loader.ts +1 -1
  796. package/src/resources/extensions/gsd/db/auto-workers.ts +1 -1
  797. package/src/resources/extensions/gsd/db/command-queue.ts +1 -1
  798. package/src/resources/extensions/gsd/db/milestone-leases.ts +20 -6
  799. package/src/resources/extensions/gsd/db/runtime-kv.ts +1 -1
  800. package/src/resources/extensions/gsd/db/unit-dispatches.ts +1 -1
  801. package/src/resources/extensions/gsd/db-adapter.ts +1 -1
  802. package/src/resources/extensions/gsd/db-base-schema.ts +1 -1
  803. package/src/resources/extensions/gsd/db-connection-cache.ts +1 -1
  804. package/src/resources/extensions/gsd/db-coordination-schema.ts +1 -1
  805. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +1 -1
  806. package/src/resources/extensions/gsd/db-gate-rows.ts +1 -1
  807. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +1 -1
  808. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +1 -1
  809. package/src/resources/extensions/gsd/db-migration-backup.ts +1 -1
  810. package/src/resources/extensions/gsd/db-migration-steps.ts +1 -1
  811. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +1 -1
  812. package/src/resources/extensions/gsd/db-open-state.ts +1 -1
  813. package/src/resources/extensions/gsd/db-provider.ts +1 -1
  814. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +1 -1
  815. package/src/resources/extensions/gsd/db-schema-metadata.ts +1 -1
  816. package/src/resources/extensions/gsd/db-task-slice-rows.ts +1 -1
  817. package/src/resources/extensions/gsd/db-transaction.ts +1 -1
  818. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +1 -1
  819. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +1 -1
  820. package/src/resources/extensions/gsd/doctor-git-checks.ts +1 -1
  821. package/src/resources/extensions/gsd/doctor-types.ts +1 -1
  822. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +1 -1
  823. package/src/resources/extensions/gsd/ecosystem/loader.ts +1 -1
  824. package/src/resources/extensions/gsd/escalation.ts +1 -1
  825. package/src/resources/extensions/gsd/fresh-run-ui.ts +1 -1
  826. package/src/resources/extensions/gsd/git-conflict-state.ts +1 -1
  827. package/src/resources/extensions/gsd/git-service.ts +1 -1
  828. package/src/resources/extensions/gsd/gsd-command-home.ts +1 -1
  829. package/src/resources/extensions/gsd/gsd-db.ts +1 -1
  830. package/src/resources/extensions/gsd/guided-unit-context.ts +1 -1
  831. package/src/resources/extensions/gsd/health-widget.ts +1 -1
  832. package/src/resources/extensions/gsd/knowledge-backfill.ts +1 -1
  833. package/src/resources/extensions/gsd/knowledge-capture.ts +1 -1
  834. package/src/resources/extensions/gsd/knowledge-parser.ts +1 -1
  835. package/src/resources/extensions/gsd/knowledge-projection.ts +1 -1
  836. package/src/resources/extensions/gsd/legacy-telemetry.ts +1 -1
  837. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  838. package/src/resources/extensions/gsd/memory-backfill.ts +1 -1
  839. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  840. package/src/resources/extensions/gsd/metrics.ts +1 -1
  841. package/src/resources/extensions/gsd/migrate/audit.ts +2 -2
  842. package/src/resources/extensions/gsd/migrate/command.ts +2 -2
  843. package/src/resources/extensions/gsd/migrate/index.ts +1 -1
  844. package/src/resources/extensions/gsd/migrate/safety.ts +1 -1
  845. package/src/resources/extensions/gsd/migrate/types.ts +1 -1
  846. package/src/resources/extensions/gsd/migrate/writer.ts +1 -1
  847. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +1 -1
  848. package/src/resources/extensions/gsd/model-router.ts +1 -1
  849. package/src/resources/extensions/gsd/notification-overlay.ts +1 -1
  850. package/src/resources/extensions/gsd/orphan-stash-audit.ts +1 -1
  851. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +1 -1
  852. package/src/resources/extensions/gsd/paths.ts +1 -1
  853. package/src/resources/extensions/gsd/pending-auto-start.ts +1 -1
  854. package/src/resources/extensions/gsd/planning-depth.ts +1 -1
  855. package/src/resources/extensions/gsd/post-execution-checks.ts +1 -1
  856. package/src/resources/extensions/gsd/pr-evidence.ts +1 -1
  857. package/src/resources/extensions/gsd/pre-execution-checks.ts +1 -1
  858. package/src/resources/extensions/gsd/process-task-path.ts +1 -1
  859. package/src/resources/extensions/gsd/prompts/review-migration.md +2 -2
  860. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  861. package/src/resources/extensions/gsd/recovery-classification.ts +1 -1
  862. package/src/resources/extensions/gsd/repository-registry.ts +1 -1
  863. package/src/resources/extensions/gsd/root-write-leak-guard.ts +1 -1
  864. package/src/resources/extensions/gsd/schemas/parsers.ts +1 -1
  865. package/src/resources/extensions/gsd/schemas/validate.ts +1 -1
  866. package/src/resources/extensions/gsd/skill-manifest.ts +1 -1
  867. package/src/resources/extensions/gsd/slice-cadence.ts +1 -1
  868. package/src/resources/extensions/gsd/smart-entry-routing.ts +1 -1
  869. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +1 -1
  870. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +1 -1
  871. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
  872. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +1 -1
  873. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +1 -1
  874. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +1 -1
  875. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +1 -1
  876. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +1 -1
  877. package/src/resources/extensions/gsd/state-reconciliation/index.ts +1 -1
  878. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +1 -1
  879. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +1 -1
  880. package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -1
  881. package/src/resources/extensions/gsd/state-reconciliation.ts +1 -1
  882. package/src/resources/extensions/gsd/state.ts +1 -1
  883. package/src/resources/extensions/gsd/tests/artifact-validators.test.ts +1 -1
  884. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +1 -1
  885. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +1 -1
  886. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +1 -1
  887. package/src/resources/extensions/gsd/tests/auto-loop-symlink-worktree.test.ts +1 -1
  888. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1 -1
  889. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +1 -1
  890. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +1 -1
  891. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +22 -2
  892. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +1 -1
  893. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +1 -1
  894. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +1 -1
  895. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +1 -1
  896. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +1 -1
  897. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
  898. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -1
  899. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +1 -1
  900. package/src/resources/extensions/gsd/tests/auto-start-validation-block.test.ts +1 -1
  901. package/src/resources/extensions/gsd/tests/auto-status-message.test.ts +1 -1
  902. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +1 -1
  903. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +1 -1
  904. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +1 -1
  905. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +1 -1
  906. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +1 -1
  907. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +1 -1
  908. package/src/resources/extensions/gsd/tests/brief-command.test.ts +1 -1
  909. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +1 -1
  910. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +1 -1
  911. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +1 -1
  912. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +1 -1
  913. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +1 -1
  914. package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +1 -1
  915. package/src/resources/extensions/gsd/tests/cmux.test.ts +1 -1
  916. package/src/resources/extensions/gsd/tests/command-queue.test.ts +1 -1
  917. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +1 -1
  918. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +1 -1
  919. package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +1 -1
  920. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +1 -1
  921. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +1 -1
  922. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +1 -1
  923. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +1 -1
  924. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +27 -0
  925. package/src/resources/extensions/gsd/tests/component-loader.test.ts +1 -1
  926. package/src/resources/extensions/gsd/tests/context-store.test.ts +1 -1
  927. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +1 -1
  928. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +1 -1
  929. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -1
  930. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +1 -1
  931. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
  932. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +1 -1
  933. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +1 -1
  934. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +1 -1
  935. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +1 -1
  936. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +1 -1
  937. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +1 -1
  938. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +1 -1
  939. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +1 -1
  940. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +1 -1
  941. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +1 -1
  942. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +1 -1
  943. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +1 -1
  944. package/src/resources/extensions/gsd/tests/db-provider.test.ts +1 -1
  945. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +1 -1
  946. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +1 -1
  947. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -1
  948. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +1 -1
  949. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +1 -1
  950. package/src/resources/extensions/gsd/tests/db-writer-path-containment.test.ts +1 -1
  951. package/src/resources/extensions/gsd/tests/db-writer-root-artifact.test.ts +1 -1
  952. package/src/resources/extensions/gsd/tests/db-writer-scope.test.ts +1 -1
  953. package/src/resources/extensions/gsd/tests/deep-mode-integration.test.ts +1 -1
  954. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +1 -1
  955. package/src/resources/extensions/gsd/tests/detect-stuck-respects-retry.test.ts +1 -1
  956. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +1 -1
  957. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +1 -1
  958. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +1 -1
  959. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +1 -1
  960. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +1 -1
  961. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +1 -1
  962. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +1 -1
  963. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +1 -1
  964. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +1 -1
  965. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +1 -1
  966. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -1
  967. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
  968. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +1 -1
  969. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +1 -1
  970. package/src/resources/extensions/gsd/tests/fresh-run-ui.test.ts +1 -1
  971. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +1 -1
  972. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +1 -1
  973. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +1 -1
  974. package/src/resources/extensions/gsd/tests/git-checkpoint.test.ts +1 -1
  975. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +1 -1
  976. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +1 -1
  977. package/src/resources/extensions/gsd/tests/gsd-db-failed-open-restore.test.ts +1 -1
  978. package/src/resources/extensions/gsd/tests/gsd-db-workspace-scope.test.ts +1 -1
  979. package/src/resources/extensions/gsd/tests/gsd-root-canonical.test.ts +1 -1
  980. package/src/resources/extensions/gsd/tests/gsd-root-home-guard.test.ts +1 -1
  981. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +1 -1
  982. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +1 -1
  983. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +1 -1
  984. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +1 -1
  985. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +1 -1
  986. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +1 -1
  987. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +1 -1
  988. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +2 -2
  989. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  990. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +1 -1
  991. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +1 -1
  992. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +1 -1
  993. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +1 -1
  994. package/src/resources/extensions/gsd/tests/integration/headless-command.ts +1 -1
  995. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
  996. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  997. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +1 -1
  998. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +1 -1
  999. package/src/resources/extensions/gsd/tests/lease-conflict-notice.test.ts +1 -1
  1000. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +1 -1
  1001. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +1 -1
  1002. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +1 -1
  1003. package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +3 -3
  1004. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +1 -1
  1005. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +1 -1
  1006. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
  1007. package/src/resources/extensions/gsd/tests/metrics-atomic-merge.test.ts +1 -1
  1008. package/src/resources/extensions/gsd/tests/metrics-lock-hardening.test.ts +1 -1
  1009. package/src/resources/extensions/gsd/tests/metrics-lock-not-acquired.test.ts +1 -1
  1010. package/src/resources/extensions/gsd/tests/metrics-lock-retry-sleep.test.ts +1 -1
  1011. package/src/resources/extensions/gsd/tests/metrics-milestone-scope.test.ts +1 -1
  1012. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +1 -1
  1013. package/src/resources/extensions/gsd/tests/metrics-scope.test.ts +1 -1
  1014. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +1 -1
  1015. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +26 -2
  1016. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  1017. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +1 -1
  1018. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +1 -1
  1019. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  1020. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +1 -1
  1021. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +1 -1
  1022. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +1 -1
  1023. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +1 -1
  1024. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +1 -1
  1025. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +1 -1
  1026. package/src/resources/extensions/gsd/tests/parallel-milestone-isolation.test.ts +2 -2
  1027. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +1 -1
  1028. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +1 -1
  1029. package/src/resources/extensions/gsd/tests/path-cache-decoupled.test.ts +1 -1
  1030. package/src/resources/extensions/gsd/tests/path-normalization-unified.test.ts +1 -1
  1031. package/src/resources/extensions/gsd/tests/paths-cache.test.ts +1 -1
  1032. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +1 -1
  1033. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +1 -1
  1034. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
  1035. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +1 -1
  1036. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -1
  1037. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +1 -1
  1038. package/src/resources/extensions/gsd/tests/planning-depth-setter.test.ts +1 -1
  1039. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +1 -1
  1040. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +1 -1
  1041. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +1 -1
  1042. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +1 -1
  1043. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +1 -1
  1044. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +1 -1
  1045. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +1 -1
  1046. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +1 -1
  1047. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +1 -1
  1048. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +1 -1
  1049. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +1 -1
  1050. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +1 -1
  1051. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +1 -1
  1052. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +1 -1
  1053. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +1 -1
  1054. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +1 -1
  1055. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +1 -1
  1056. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +1 -1
  1057. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +1 -1
  1058. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -1
  1059. package/src/resources/extensions/gsd/tests/runtime-kv.test.ts +1 -1
  1060. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +1 -1
  1061. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +1 -1
  1062. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +2 -2
  1063. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +1 -1
  1064. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +1 -1
  1065. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +1 -1
  1066. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +1 -1
  1067. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +1 -1
  1068. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +1 -1
  1069. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +1 -1
  1070. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +1 -1
  1071. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +1 -1
  1072. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -3
  1073. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +1 -1
  1074. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +1 -1
  1075. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  1076. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +1 -1
  1077. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +1 -1
  1078. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +1 -1
  1079. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +1 -1
  1080. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +1 -1
  1081. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +1 -1
  1082. package/src/resources/extensions/gsd/tests/token-profile.test.ts +1 -1
  1083. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +1 -1
  1084. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +1 -1
  1085. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -1
  1086. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +1 -1
  1087. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +1 -1
  1088. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +1 -1
  1089. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +3 -3
  1090. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -1
  1091. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +1 -1
  1092. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +1 -1
  1093. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +1 -1
  1094. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +1 -1
  1095. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +1 -1
  1096. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +1 -1
  1097. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +1 -1
  1098. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +1 -1
  1099. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +1 -1
  1100. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -1
  1101. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +1 -1
  1102. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +1 -1
  1103. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +13 -4
  1104. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +1 -1
  1105. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +1 -1
  1106. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +1 -1
  1107. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +1 -1
  1108. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +1 -1
  1109. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +1 -1
  1110. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +1 -1
  1111. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +1 -1
  1112. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +1 -1
  1113. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +1 -1
  1114. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +1 -1
  1115. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +1 -1
  1116. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +1 -1
  1117. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +1 -1
  1118. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +1 -1
  1119. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +1 -1
  1120. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +1 -1
  1121. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +1 -1
  1122. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +1 -1
  1123. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +1 -1
  1124. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +1 -1
  1125. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +1 -1
  1126. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +1 -1
  1127. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +1 -1
  1128. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +1 -1
  1129. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +1 -1
  1130. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +1 -1
  1131. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +1 -1
  1132. package/src/resources/extensions/gsd/tests/workspace.test.ts +1 -1
  1133. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +2 -2
  1134. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
  1135. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
  1136. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
  1137. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  1138. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  1139. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +1 -1
  1140. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +1 -1
  1141. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +1 -1
  1142. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +1 -1
  1143. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +1 -1
  1144. package/src/resources/extensions/gsd/tests/write-gate.test.ts +1 -1
  1145. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +1 -1
  1146. package/src/resources/extensions/gsd/tool-contract.ts +1 -1
  1147. package/src/resources/extensions/gsd/tools/complete-milestone.ts +2 -2
  1148. package/src/resources/extensions/gsd/tools/complete-slice.ts +12 -1
  1149. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  1150. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +1 -1
  1151. package/src/resources/extensions/gsd/tools/exec-tool.ts +1 -1
  1152. package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -1
  1153. package/src/resources/extensions/gsd/tools/validate-milestone.ts +1 -1
  1154. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  1155. package/src/resources/extensions/gsd/tui/render-kit.ts +1 -1
  1156. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  1157. package/src/resources/extensions/gsd/unit-context-manifest.ts +1 -1
  1158. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
  1159. package/src/resources/extensions/gsd/uok/audit.ts +1 -1
  1160. package/src/resources/extensions/gsd/uok/contracts.ts +1 -1
  1161. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +1 -1
  1162. package/src/resources/extensions/gsd/uok/kernel.ts +1 -1
  1163. package/src/resources/extensions/gsd/uok/loop-adapter.ts +1 -1
  1164. package/src/resources/extensions/gsd/uok/plan-v2.ts +1 -1
  1165. package/src/resources/extensions/gsd/uok/timeline.ts +1 -1
  1166. package/src/resources/extensions/gsd/validation-block-guard.ts +1 -1
  1167. package/src/resources/extensions/gsd/verification-gate.ts +2 -2
  1168. package/src/resources/extensions/gsd/verification-verdict.ts +1 -1
  1169. package/src/resources/extensions/gsd/watch/header-renderer.ts +1 -1
  1170. package/src/resources/extensions/gsd/watch/splash-palette.ts +1 -1
  1171. package/src/resources/extensions/gsd/workflow-manifest.ts +1 -1
  1172. package/src/resources/extensions/gsd/workflow-projections.ts +1 -1
  1173. package/src/resources/extensions/gsd/workflow-protocol.ts +1 -1
  1174. package/src/resources/extensions/gsd/workflow-templates.ts +1 -1
  1175. package/src/resources/extensions/gsd/working-output-messages.ts +1 -1
  1176. package/src/resources/extensions/gsd/workspace.ts +1 -1
  1177. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1 -1
  1178. package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
  1179. package/src/resources/extensions/gsd/worktree-safety.ts +1 -1
  1180. package/src/resources/extensions/gsd/worktree-state-projection.ts +1 -1
  1181. package/src/resources/extensions/mcp-client/manager.ts +1 -1
  1182. package/src/resources/extensions/mcp-client/tests/manager.test.ts +1 -1
  1183. package/src/resources/extensions/ollama/index.ts +1 -1
  1184. package/src/resources/extensions/ollama/model-capabilities.ts +1 -1
  1185. package/src/resources/extensions/ollama/ndjson-stream.ts +1 -1
  1186. package/src/resources/extensions/ollama/ollama-chat-provider.ts +1 -1
  1187. package/src/resources/extensions/ollama/ollama-client.ts +1 -1
  1188. package/src/resources/extensions/ollama/ollama-commands.ts +1 -1
  1189. package/src/resources/extensions/ollama/ollama-discovery.ts +1 -1
  1190. package/src/resources/extensions/ollama/ollama-tool.ts +1 -1
  1191. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +1 -1
  1192. package/src/resources/extensions/ollama/tests/ollama-chat-provider-stream.test.ts +1 -1
  1193. package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +1 -1
  1194. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +1 -1
  1195. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +1 -1
  1196. package/src/resources/extensions/ollama/thinking-parser.ts +1 -1
  1197. package/src/resources/extensions/ollama/types.ts +1 -1
  1198. package/src/resources/extensions/shared/cmux-events.ts +1 -1
  1199. package/src/resources/extensions/shared/gsd-phase-state.ts +1 -1
  1200. package/src/resources/extensions/shared/interview-ui.ts +1 -1
  1201. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +1 -1
  1202. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +1 -1
  1203. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +1 -1
  1204. package/src/resources/extensions/subagent/launch.ts +1 -1
  1205. package/src/resources/extensions/subagent/run-store.ts +1 -1
  1206. package/src/resources/extensions/subagent/tests/launch.test.ts +1 -1
  1207. package/src/resources/extensions/subagent/tests/run-store.test.ts +1 -1
  1208. package/src/resources/extensions/visual-brief/artifact-policy.ts +1 -1
  1209. package/src/resources/extensions/visual-brief/index.ts +1 -1
  1210. package/src/resources/extensions/visual-brief/page-contract.ts +1 -1
  1211. package/src/resources/extensions/visual-brief/prompts.ts +1 -1
  1212. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +1 -1
  1213. package/src/resources/skills/api-design/SKILL.md +1 -1
  1214. package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
  1215. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +1 -1
  1216. package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
  1217. package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
  1218. package/src/resources/skills/observability/SKILL.md +4 -4
  1219. package/src/resources/skills/security-review/SKILL.md +1 -1
  1220. package/dist/web/standalone/.next/static/chunks/app/layout-9059d39aaac392ff.js +0 -1
  1221. package/dist/web/standalone/.next/static/chunks/app/page-abc53c69ef415841.js +0 -1
  1222. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-81274155375a5684.js +0 -1
  1223. /package/dist/web/standalone/.next/static/{n91TJEOuW1d9f_wM2uuhO → xbY3PcWtH3LhCQlgKH75u}/_buildManifest.js +0 -0
  1224. /package/dist/web/standalone/.next/static/{n91TJEOuW1d9f_wM2uuhO → xbY3PcWtH3LhCQlgKH75u}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"extension-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/extension-selector.ts"],"names":[],"mappings":"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","sourcesContent":["// GSD-2 + packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts - Extension option selector.\n/**\n * Generic selector component for extensions.\n * Displays a list of string options with keyboard navigation.\n * Options starting with SEPARATOR_PREFIX are rendered as non-selectable group headers.\n */\n\nimport { Container, getEditorKeybindings, matchesKey, Spacer, Text, type TUI } from \"@gsd/pi-tui\";\nimport { theme } from \"../theme/theme.js\";\nimport { CountdownTimer } from \"./countdown-timer.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { selectorFooter } from \"./keybinding-hints.js\";\n\n/** Prefix that marks an option as a non-selectable group header. */\nexport const SEPARATOR_PREFIX = \"───\";\n\nexport interface ExtensionSelectorOptions {\n\ttui?: TUI;\n\ttimeout?: number;\n}\n\nexport class ExtensionSelectorComponent extends Container {\n\tprivate options: string[];\n\tprivate selectedIndex = 0;\n\tprivate listContainer: Container;\n\tprivate onSelectCallback: (option: string) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate titleText: Text;\n\tprivate baseTitle: string;\n\tprivate countdown: CountdownTimer | undefined;\n\n\tconstructor(\n\t\ttitle: string,\n\t\toptions: string[],\n\t\tonSelect: (option: string) => void,\n\t\tonCancel: () => void,\n\t\topts?: ExtensionSelectorOptions,\n\t) {\n\t\tsuper();\n\n\t\tthis.options = options;\n\t\tthis.onSelectCallback = onSelect;\n\t\tthis.onCancelCallback = onCancel;\n\t\tthis.baseTitle = title;\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.titleText = new Text(theme.fg(\"accent\", title), 1, 0);\n\t\tthis.addChild(this.titleText);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tif (opts?.timeout && opts.timeout > 0 && opts.tui) {\n\t\t\tthis.countdown = new CountdownTimer(\n\t\t\t\topts.timeout,\n\t\t\t\topts.tui,\n\t\t\t\t(s) => this.titleText.setText(theme.fg(\"accent\", `${this.baseTitle} (${s}s)`)),\n\t\t\t\t() => this.onCancelCallback(),\n\t\t\t);\n\t\t}\n\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\tselectorFooter(),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Start on the first selectable (non-separator) item\n\t\tthis.selectedIndex = this.nextSelectable(0, 1);\n\t\tthis.updateList();\n\t}\n\n\tprivate isSeparator(index: number): boolean {\n\t\treturn this.options[index]?.startsWith(SEPARATOR_PREFIX) ?? false;\n\t}\n\n\t/**\n\t * Find the next selectable index starting from `from` in the given direction.\n\t * Returns `from` clamped to bounds if nothing selectable is found.\n\t */\n\tprivate nextSelectable(from: number, direction: 1 | -1): number {\n\t\tlet idx = from;\n\t\twhile (idx >= 0 && idx < this.options.length && this.isSeparator(idx)) {\n\t\t\tidx += direction;\n\t\t}\n\t\tif (idx < 0 || idx >= this.options.length) {\n\t\t\treturn Math.max(0, Math.min(from, this.options.length - 1));\n\t\t}\n\t\t// If all items are separators, idx may still point to one — fall back to original index\n\t\tif (this.isSeparator(idx)) {\n\t\t\treturn Math.max(0, Math.min(from, this.options.length - 1));\n\t\t}\n\t\treturn idx;\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\t\tfor (let i = 0; i < this.options.length; i++) {\n\t\t\tconst option = this.options[i];\n\t\t\tif (this.isSeparator(i)) {\n\t\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"borderAccent\", ` ${option}`), 1, 0));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst text = isSelected\n\t\t\t\t? theme.fg(\"accent\", \"→ \") + theme.fg(\"accent\", option)\n\t\t\t\t: ` ${theme.fg(\"text\", option)}`;\n\t\t\tthis.listContainer.addChild(new Text(text, 1, 0));\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getEditorKeybindings();\n\t\tif (kb.matches(keyData, \"selectUp\") || matchesKey(keyData, \"k\")) {\n\t\t\tlet next = this.selectedIndex - 1;\n\t\t\tif (next < 0) next = this.options.length - 1;\n\t\t\tnext = this.nextSelectable(next, -1);\n\t\t\tif (this.isSeparator(next)) {\n\t\t\t\tnext = this.nextSelectable(this.options.length - 1, -1);\n\t\t\t}\n\t\t\tthis.selectedIndex = next;\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"selectDown\") || matchesKey(keyData, \"j\")) {\n\t\t\tlet next = this.selectedIndex + 1;\n\t\t\tif (next >= this.options.length) next = 0;\n\t\t\tnext = this.nextSelectable(next, 1);\n\t\t\tif (this.isSeparator(next)) {\n\t\t\t\tnext = this.nextSelectable(0, 1);\n\t\t\t}\n\t\t\tthis.selectedIndex = next;\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"selectConfirm\")) {\n\t\t\tconst selected = this.options[this.selectedIndex];\n\t\t\tif (selected && !this.isSeparator(this.selectedIndex)) {\n\t\t\t\tthis.onSelectCallback(selected);\n\t\t\t}\n\t\t} else if (kb.matches(keyData, \"selectCancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.countdown?.dispose();\n\t}\n}\n"]}
1
+ {"version":3,"file":"extension-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/extension-selector.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi + packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts - Extension option selector.\n/**\n * Generic selector component for extensions.\n * Displays a list of string options with keyboard navigation.\n * Options starting with SEPARATOR_PREFIX are rendered as non-selectable group headers.\n */\n\nimport { Container, getEditorKeybindings, matchesKey, Spacer, Text, type TUI } from \"@gsd/pi-tui\";\nimport { theme } from \"../theme/theme.js\";\nimport { CountdownTimer } from \"./countdown-timer.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { selectorFooter } from \"./keybinding-hints.js\";\n\n/** Prefix that marks an option as a non-selectable group header. */\nexport const SEPARATOR_PREFIX = \"───\";\n\nexport interface ExtensionSelectorOptions {\n\ttui?: TUI;\n\ttimeout?: number;\n}\n\nexport class ExtensionSelectorComponent extends Container {\n\tprivate options: string[];\n\tprivate selectedIndex = 0;\n\tprivate listContainer: Container;\n\tprivate onSelectCallback: (option: string) => void;\n\tprivate onCancelCallback: () => void;\n\tprivate titleText: Text;\n\tprivate baseTitle: string;\n\tprivate countdown: CountdownTimer | undefined;\n\n\tconstructor(\n\t\ttitle: string,\n\t\toptions: string[],\n\t\tonSelect: (option: string) => void,\n\t\tonCancel: () => void,\n\t\topts?: ExtensionSelectorOptions,\n\t) {\n\t\tsuper();\n\n\t\tthis.options = options;\n\t\tthis.onSelectCallback = onSelect;\n\t\tthis.onCancelCallback = onCancel;\n\t\tthis.baseTitle = title;\n\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\tthis.titleText = new Text(theme.fg(\"accent\", title), 1, 0);\n\t\tthis.addChild(this.titleText);\n\t\tthis.addChild(new Spacer(1));\n\n\t\tif (opts?.timeout && opts.timeout > 0 && opts.tui) {\n\t\t\tthis.countdown = new CountdownTimer(\n\t\t\t\topts.timeout,\n\t\t\t\topts.tui,\n\t\t\t\t(s) => this.titleText.setText(theme.fg(\"accent\", `${this.baseTitle} (${s}s)`)),\n\t\t\t\t() => this.onCancelCallback(),\n\t\t\t);\n\t\t}\n\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(\n\t\t\tnew Text(\n\t\t\t\tselectorFooter(),\n\t\t\t\t1,\n\t\t\t\t0,\n\t\t\t),\n\t\t);\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Start on the first selectable (non-separator) item\n\t\tthis.selectedIndex = this.nextSelectable(0, 1);\n\t\tthis.updateList();\n\t}\n\n\tprivate isSeparator(index: number): boolean {\n\t\treturn this.options[index]?.startsWith(SEPARATOR_PREFIX) ?? false;\n\t}\n\n\t/**\n\t * Find the next selectable index starting from `from` in the given direction.\n\t * Returns `from` clamped to bounds if nothing selectable is found.\n\t */\n\tprivate nextSelectable(from: number, direction: 1 | -1): number {\n\t\tlet idx = from;\n\t\twhile (idx >= 0 && idx < this.options.length && this.isSeparator(idx)) {\n\t\t\tidx += direction;\n\t\t}\n\t\tif (idx < 0 || idx >= this.options.length) {\n\t\t\treturn Math.max(0, Math.min(from, this.options.length - 1));\n\t\t}\n\t\t// If all items are separators, idx may still point to one — fall back to original index\n\t\tif (this.isSeparator(idx)) {\n\t\t\treturn Math.max(0, Math.min(from, this.options.length - 1));\n\t\t}\n\t\treturn idx;\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\t\tfor (let i = 0; i < this.options.length; i++) {\n\t\t\tconst option = this.options[i];\n\t\t\tif (this.isSeparator(i)) {\n\t\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"borderAccent\", ` ${option}`), 1, 0));\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst isSelected = i === this.selectedIndex;\n\t\t\tconst text = isSelected\n\t\t\t\t? theme.fg(\"accent\", \"→ \") + theme.fg(\"accent\", option)\n\t\t\t\t: ` ${theme.fg(\"text\", option)}`;\n\t\t\tthis.listContainer.addChild(new Text(text, 1, 0));\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getEditorKeybindings();\n\t\tif (kb.matches(keyData, \"selectUp\") || matchesKey(keyData, \"k\")) {\n\t\t\tlet next = this.selectedIndex - 1;\n\t\t\tif (next < 0) next = this.options.length - 1;\n\t\t\tnext = this.nextSelectable(next, -1);\n\t\t\tif (this.isSeparator(next)) {\n\t\t\t\tnext = this.nextSelectable(this.options.length - 1, -1);\n\t\t\t}\n\t\t\tthis.selectedIndex = next;\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"selectDown\") || matchesKey(keyData, \"j\")) {\n\t\t\tlet next = this.selectedIndex + 1;\n\t\t\tif (next >= this.options.length) next = 0;\n\t\t\tnext = this.nextSelectable(next, 1);\n\t\t\tif (this.isSeparator(next)) {\n\t\t\t\tnext = this.nextSelectable(0, 1);\n\t\t\t}\n\t\t\tthis.selectedIndex = next;\n\t\t\tthis.updateList();\n\t\t} else if (kb.matches(keyData, \"selectConfirm\")) {\n\t\t\tconst selected = this.options[this.selectedIndex];\n\t\t\tif (selected && !this.isSeparator(this.selectedIndex)) {\n\t\t\t\tthis.onSelectCallback(selected);\n\t\t\t}\n\t\t} else if (kb.matches(keyData, \"selectCancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n\n\tdispose(): void {\n\t\tthis.countdown?.dispose();\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- // Project/App: GSD-2
1
+ // Project/App: gsd-pi
2
2
  // File Purpose: Interactive terminal footer renderer for workspace, model, usage, context, and extension status.
3
3
  import { truncateToWidth, visibleWidth } from "@gsd/pi-tui";
4
4
  import { theme } from "../theme/theme.js";
@@ -1 +1 @@
1
- {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: GSD-2\n// File Purpose: Interactive terminal footer renderer for workspace, model, usage, context, and extension status.\n\nimport { type Component, truncateToWidth, visibleWidth } from \"@gsd/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.js\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { providerAuthBadge, providerDisplayName } from \"./model-selector.js\";\nimport { renderFooterStrip } from \"./transcript-design.js\";\n\n/**\n * Sanitize text for display in a single-line status.\n * Removes newlines, tabs, carriage returns, and other control characters.\n */\nfunction sanitizeStatusText(text: string): string {\n\t// Replace newlines, tabs, carriage returns with space, then collapse multiple spaces\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\nfunction truncateFooterPath(text: string, width: number): string {\n\tif (visibleWidth(text) <= width) return text;\n\tconst tailMatch = text.match(/( \\([^)]+\\)(?: • .*)?)$/);\n\tif (!tailMatch) return truncateToWidth(text, width, \"...\");\n\tconst tail = tailMatch[1];\n\tconst tailWidth = visibleWidth(tail);\n\tif (tailWidth >= width - 4) return truncateToWidth(text, width, \"...\");\n\tconst head = text.slice(0, -tail.length);\n\treturn `${truncateToWidth(head, width - tailWidth, \"...\")}${tail}`;\n}\n\n/**\n * Format token counts (similar to web-ui)\n */\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\n/**\n * Format a cost value for compact display.\n * Uses fewer decimal places for larger amounts.\n * @internal Exported for testing only.\n */\nexport function formatPromptCost(cost: number): string {\n\tif (cost < 0.001) return `$${cost.toFixed(4)}`;\n\tif (cost < 0.01) return `$${cost.toFixed(3)}`;\n\tif (cost < 1) return `$${cost.toFixed(3)}`;\n\treturn `$${cost.toFixed(2)}`;\n}\n\n/**\n * Footer component that shows pwd, token stats, and context usage.\n * Computes token/context stats from session, gets git branch and extension statuses from provider.\n */\nexport class FooterComponent implements Component {\n\tprivate autoCompactEnabled = true;\n\n\tconstructor(\n\t\tprivate session: AgentSession,\n\t\tprivate footerData: ReadonlyFooterDataProvider,\n\t) {}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.autoCompactEnabled = enabled;\n\t}\n\n\t/**\n\t * No-op: git branch caching now handled by provider.\n\t * Kept for compatibility with existing call sites in interactive-mode.\n\t */\n\tinvalidate(): void {\n\t\t// No-op: git branch is cached/invalidated by provider\n\t}\n\n\t/**\n\t * Clean up resources.\n\t * Git watcher cleanup now handled by provider.\n\t */\n\tdispose(): void {\n\t\t// Git watcher cleanup handled by provider\n\t}\n\n\trender(width: number): string[] {\n\t\tconst state = this.session.state;\n\n\t\tconst usageTotals = this.session.sessionManager.getUsageTotals();\n\t\tconst totalInput = usageTotals.input;\n\t\tconst totalOutput = usageTotals.output;\n\t\tconst totalCacheRead = usageTotals.cacheRead;\n\t\tconst totalCacheWrite = usageTotals.cacheWrite;\n\t\tconst totalCost = usageTotals.cost;\n\n\t\t// Use activeInferenceModel during streaming to show the model actually\n\t\t// being used, not the configured model which may have been switched mid-turn.\n\t\tconst displayModel = state.activeInferenceModel ?? state.model;\n\n\t\t// Calculate context usage from session (handles compaction correctly).\n\t\t// After compaction, tokens are unknown until the next LLM response.\n\t\tconst contextUsage = this.session.getContextUsage();\n\t\tconst contextWindow = contextUsage?.contextWindow ?? displayModel?.contextWindow ?? 0;\n\t\tconst contextPercentValue = contextUsage?.percent ?? 0;\n\t\tconst contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(1) : \"?\";\n\n\t\t// Replace home directory with ~\n\t\tlet pwd = process.cwd();\n\t\tconst home = process.env.HOME || process.env.USERPROFILE;\n\t\tif (home && pwd.startsWith(home)) {\n\t\t\tpwd = `~${pwd.slice(home.length)}`;\n\t\t}\n\n\t\t// Add git branch if available\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tpwd = `${pwd} (${branch})`;\n\t\t}\n\n\t\t// Add session name if set\n\t\tconst sessionName = this.session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tpwd = `${pwd} • ${sessionName}`;\n\t\t}\n\n\t\t// Build stats line as separate groups joined by a dim middle-dot separator\n\t\tconst sep = ` ${theme.fg(\"dim\", \"\\u00B7\")} `;\n\n\t\t// Group 1: total tokens.\n\t\tconst tokenGroup: string[] = [];\n\t\tconst totalTokens = totalInput + totalOutput + totalCacheRead + totalCacheWrite;\n\t\tif (totalTokens > 0) tokenGroup.push(formatTokens(totalTokens));\n\n\t\t// Group 2: cache efficiency — cacheRead / all input-side tokens.\n\t\t// Collapses the old cr/cw pair into a single \"how much was served\n\t\t// from cache\" signal. cr/cw breakdown moved to `/stats`.\n\t\tconst cacheGroup: string[] = [];\n\t\tconst inputSide = totalInput + totalCacheRead + totalCacheWrite;\n\t\tif (totalCacheRead > 0 && inputSide > 0) {\n\t\t\tconst cachedPct = Math.round((totalCacheRead / inputSide) * 100);\n\t\t\tcacheGroup.push(`${cachedPct}% cached`);\n\t\t}\n\n\t\t// Group 3: cost\n\t\tconst costGroup: string[] = [];\n\t\tconst usingSubscription = displayModel ? this.session.modelRegistry.isUsingOAuth(displayModel) : false;\n\t\tif (totalCost || usingSubscription) {\n\t\t\tconst costStr = `$${totalCost.toFixed(3)}${usingSubscription ? \" (sub)\" : \"\"}`;\n\t\t\tcostGroup.push(costStr);\n\t\t}\n\n\t\t// Per-prompt cost annotation (opt-in via show_token_cost preference, #1515)\n\t\tif (process.env.GSD_SHOW_TOKEN_COST === \"1\") {\n\t\t\tconst lastTurnCost = this.session.getLastTurnCost();\n\t\t\tif (lastTurnCost > 0) {\n\t\t\t\tcostGroup.push(`(last: ${formatPromptCost(lastTurnCost)})`);\n\t\t\t}\n\t\t}\n\n\t\t// Group 4: context bar + percentage (mirrors /gsd auto dashboard style).\n\t\t// Bar colors track the same thresholds as the percent text.\n\t\tconst autoIndicator = this.autoCompactEnabled ? \" (auto)\" : \"\";\n\t\tconst barColor: \"error\" | \"warning\" | \"success\" =\n\t\t\tcontextPercentValue > 90 ? \"error\" : contextPercentValue > 70 ? \"warning\" : \"success\";\n\t\tconst BAR_WIDTH = 8;\n\t\tconst filled = contextUsage?.percent !== null\n\t\t\t? Math.max(0, Math.min(BAR_WIDTH, Math.round((contextPercentValue / 100) * BAR_WIDTH)))\n\t\t\t: 0;\n\t\tconst bar =\n\t\t\ttheme.fg(barColor, \"█\".repeat(filled)) +\n\t\t\ttheme.fg(\"dim\", \"░\".repeat(Math.max(0, BAR_WIDTH - filled)));\n\t\tconst pctText = contextPercent === \"?\" ? \"?\" : `${contextPercent}%`;\n\t\tconst suffix = `/${formatTokens(contextWindow)}${autoIndicator}`;\n\t\tconst colorizedPct =\n\t\t\tcontextPercentValue > 90\n\t\t\t\t? theme.fg(\"error\", pctText)\n\t\t\t\t: contextPercentValue > 70\n\t\t\t\t\t? theme.fg(\"warning\", pctText)\n\t\t\t\t\t: pctText;\n\t\tconst contextPercentStr = `${bar} ${colorizedPct}${suffix}`;\n\n\t\t// Assemble groups: items within a group are space-separated,\n\t\t// groups are separated by a dim middle-dot\n\t\tconst groups: string[] = [];\n\t\tif (tokenGroup.length > 0) groups.push(tokenGroup.join(\" \"));\n\t\tif (cacheGroup.length > 0) groups.push(cacheGroup.join(\" \"));\n\t\tif (costGroup.length > 0) groups.push(costGroup.join(\" \"));\n\t\tgroups.push(contextPercentStr);\n\n\t\tlet statsLeft = groups.join(sep);\n\n\t\t// Add model name on the right side, plus thinking level if model supports it\n\t\tconst modelName = displayModel?.id || \"no-model\";\n\n\t\tlet statsLeftWidth = visibleWidth(statsLeft);\n\n\t\t// If statsLeft is too wide, truncate it\n\t\tif (statsLeftWidth > width) {\n\t\t\tstatsLeft = truncateToWidth(statsLeft, width, \"...\");\n\t\t\tstatsLeftWidth = visibleWidth(statsLeft);\n\t\t}\n\n\t\t// Calculate available space for padding (minimum 2 spaces between stats and model)\n\t\tconst minPadding = 2;\n\n\t\t// Add thinking level indicator if model supports reasoning\n\t\tlet rightSideWithoutProvider = modelName;\n\t\tif (displayModel?.reasoning) {\n\t\t\tconst thinkingLevel = state.thinkingLevel || \"off\";\n\t\t\trightSideWithoutProvider =\n\t\t\t\tthinkingLevel === \"off\" ? `${modelName} • thinking off` : `${modelName} • ${thinkingLevel}`;\n\t\t}\n\n\t\t// Prepend the provider in parentheses if there are multiple providers and there's enough room.\n\t\t// Include the auth mode so users can tell at a glance whether the active model is\n\t\t// API-key-backed, OAuth-backed, or delegated to a third-party CLI.\n\t\tlet rightSide = rightSideWithoutProvider;\n\t\tif (this.footerData.getAvailableProviderCount() > 1 && displayModel) {\n\t\t\tconst authMode = this.session.modelRegistry.getProviderAuthMode(displayModel.provider);\n\t\t\tconst authLabel = providerAuthBadge(authMode);\n\t\t\tconst providerLabel = providerDisplayName(displayModel.provider);\n\t\t\tconst parenthetical = authLabel ? `${providerLabel} · ${authLabel}` : providerLabel;\n\t\t\trightSide = `(${parenthetical}) ${rightSideWithoutProvider}`;\n\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t// Too wide: drop the auth suffix first, then fall back to no parenthetical.\n\t\t\t\trightSide = `(${providerLabel}) ${rightSideWithoutProvider}`;\n\t\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t\trightSide = rightSideWithoutProvider;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Extension statuses right-aligned on the pwd line (sorted by key).\n\t\t// Keeps the footer compact by avoiding a dedicated row when the content\n\t\t// fits alongside pwd. Falls back to pwd-only if the combined line would\n\t\t// exceed width.\n\t\tconst extensionStatuses = this.footerData.getExtensionStatuses();\n\t\tconst extStatusText =\n\t\t\textensionStatuses.size > 0\n\t\t\t\t? Array.from(extensionStatuses.entries())\n\t\t\t\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t\t\t\t.map(([, text]) => sanitizeStatusText(text))\n\t\t\t\t\t\t.join(\" \")\n\t\t\t\t: \"\";\n\n\t\tconst footerRight = [rightSide, extStatusText].filter(Boolean).join(\" \");\n\t\tconst gsdSegment = theme.fg(\"accent\", \"● GSD\");\n\t\tconst dimStatsLeft = theme.fg(\"dim\", statsLeft);\n\t\tconst innerWidth = Math.max(1, width - 2);\n\t\tconst rightWidth = visibleWidth(footerRight);\n\t\tconst leftBudget = footerRight ? Math.max(1, innerWidth - rightWidth - 3) : innerWidth;\n\t\tconst sepWidth = visibleWidth(\" │ \");\n\t\tconst pwdBudget = Math.max(1, leftBudget - visibleWidth(gsdSegment) - visibleWidth(dimStatsLeft) - sepWidth * 2);\n\t\tconst pwdSegment = theme.fg(\"dim\", truncateFooterPath(pwd, pwdBudget));\n\n\t\tconst leftSegments = [\n\t\t\tgsdSegment,\n\t\t\tpwdSegment,\n\t\t\tdimStatsLeft,\n\t\t];\n\t\treturn renderFooterStrip(leftSegments, footerRight, width);\n\t}\n}\n"]}
1
+ {"version":3,"file":"footer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/footer.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,iHAAiH;AAEjH,OAAO,EAAkB,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D;;;GAGG;AACH,SAAS,kBAAkB,CAAC,IAAY;IACvC,qFAAqF;IACrF,OAAO,IAAI;SACT,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC;SACzB,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,IAAI,EAAE,CAAC;AACV,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,KAAa;IACtD,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACxD,IAAI,CAAC,SAAS;QAAE,OAAO,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,SAAS,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,KAAK,GAAG,SAAS,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,CAAC;AACpE,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,KAAa;IAClC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1C,IAAI,KAAK,GAAG,KAAK;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,IAAI,KAAK,GAAG,OAAO;QAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3D,IAAI,KAAK,GAAG,QAAQ;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAChE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC5C,IAAI,IAAI,GAAG,KAAK;QAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/C,IAAI,IAAI,GAAG,IAAI;QAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,eAAe;IAG3B,YACS,OAAqB,EACrB,UAAsC;QADtC,YAAO,GAAP,OAAO,CAAc;QACrB,eAAU,GAAV,UAAU,CAA4B;QAJvC,uBAAkB,GAAG,IAAI,CAAC;IAK/B,CAAC;IAEJ,qBAAqB,CAAC,OAAgB;QACrC,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC;IACnC,CAAC;IAED;;;OAGG;IACH,UAAU;QACT,sDAAsD;IACvD,CAAC;IAED;;;OAGG;IACH,OAAO;QACN,0CAA0C;IAC3C,CAAC;IAED,MAAM,CAAC,KAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QAEjC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QACjE,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC;QACrC,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC;QACvC,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,CAAC;QAC7C,MAAM,eAAe,GAAG,WAAW,CAAC,UAAU,CAAC;QAC/C,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC;QAEnC,uEAAuE;QACvE,8EAA8E;QAC9E,MAAM,YAAY,GAAG,KAAK,CAAC,oBAAoB,IAAI,KAAK,CAAC,KAAK,CAAC;QAE/D,uEAAuE;QACvE,oEAAoE;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QACpD,MAAM,aAAa,GAAG,YAAY,EAAE,aAAa,IAAI,YAAY,EAAE,aAAa,IAAI,CAAC,CAAC;QACtF,MAAM,mBAAmB,GAAG,YAAY,EAAE,OAAO,IAAI,CAAC,CAAC;QACvD,MAAM,cAAc,GAAG,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAE7F,gCAAgC;QAChC,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;QACzD,IAAI,IAAI,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,CAAC;QAED,8BAA8B;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QAC9C,IAAI,MAAM,EAAE,CAAC;YACZ,GAAG,GAAG,GAAG,GAAG,KAAK,MAAM,GAAG,CAAC;QAC5B,CAAC;QAED,0BAA0B;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;QACjE,IAAI,WAAW,EAAE,CAAC;YACjB,GAAG,GAAG,GAAG,GAAG,MAAM,WAAW,EAAE,CAAC;QACjC,CAAC;QAED,2EAA2E;QAC3E,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC;QAE7C,yBAAyB;QACzB,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,cAAc,GAAG,eAAe,CAAC;QAChF,IAAI,WAAW,GAAG,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;QAEhE,iEAAiE;QACjE,kEAAkE;QAClE,yDAAyD;QACzD,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,SAAS,GAAG,UAAU,GAAG,cAAc,GAAG,eAAe,CAAC;QAChE,IAAI,cAAc,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;YACjE,UAAU,CAAC,IAAI,CAAC,GAAG,SAAS,UAAU,CAAC,CAAC;QACzC,CAAC;QAED,gBAAgB;QAChB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,iBAAiB,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACvG,IAAI,SAAS,IAAI,iBAAiB,EAAE,CAAC;YACpC,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC/E,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,4EAA4E;QAC5E,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,KAAK,GAAG,EAAE,CAAC;YAC7C,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YACpD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACtB,SAAS,CAAC,IAAI,CAAC,UAAU,gBAAgB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAC7D,CAAC;QACF,CAAC;QAED,yEAAyE;QACzE,4DAA4D;QAC5D,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,QAAQ,GACb,mBAAmB,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,MAAM,SAAS,GAAG,CAAC,CAAC;QACpB,MAAM,MAAM,GAAG,YAAY,EAAE,OAAO,KAAK,IAAI;YAC5C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,mBAAmB,GAAG,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;YACvF,CAAC,CAAC,CAAC,CAAC;QACL,MAAM,GAAG,GACR,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,cAAc,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,cAAc,GAAG,CAAC;QACpE,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC,GAAG,aAAa,EAAE,CAAC;QACjE,MAAM,YAAY,GACjB,mBAAmB,GAAG,EAAE;YACvB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;YAC5B,CAAC,CAAC,mBAAmB,GAAG,EAAE;gBACzB,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC;gBAC9B,CAAC,CAAC,OAAO,CAAC;QACb,MAAM,iBAAiB,GAAG,GAAG,GAAG,IAAI,YAAY,GAAG,MAAM,EAAE,CAAC;QAE5D,6DAA6D;QAC7D,2CAA2C;QAC3C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE/B,IAAI,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjC,6EAA6E;QAC7E,MAAM,SAAS,GAAG,YAAY,EAAE,EAAE,IAAI,UAAU,CAAC;QAEjD,IAAI,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAE7C,wCAAwC;QACxC,IAAI,cAAc,GAAG,KAAK,EAAE,CAAC;YAC5B,SAAS,GAAG,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACrD,cAAc,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QAED,mFAAmF;QACnF,MAAM,UAAU,GAAG,CAAC,CAAC;QAErB,2DAA2D;QAC3D,IAAI,wBAAwB,GAAG,SAAS,CAAC;QACzC,IAAI,YAAY,EAAE,SAAS,EAAE,CAAC;YAC7B,MAAM,aAAa,GAAG,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC;YACnD,wBAAwB;gBACvB,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,MAAM,aAAa,EAAE,CAAC;QAC9F,CAAC;QAED,+FAA+F;QAC/F,kFAAkF;QAClF,mEAAmE;QACnE,IAAI,SAAS,GAAG,wBAAwB,CAAC;QACzC,IAAI,IAAI,CAAC,UAAU,CAAC,yBAAyB,EAAE,GAAG,CAAC,IAAI,YAAY,EAAE,CAAC;YACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACvF,MAAM,SAAS,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,mBAAmB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACjE,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,aAAa,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;YACpF,SAAS,GAAG,IAAI,aAAa,KAAK,wBAAwB,EAAE,CAAC;YAC7D,IAAI,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,KAAK,EAAE,CAAC;gBACnE,4EAA4E;gBAC5E,SAAS,GAAG,IAAI,aAAa,KAAK,wBAAwB,EAAE,CAAC;gBAC7D,IAAI,cAAc,GAAG,UAAU,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,KAAK,EAAE,CAAC;oBACnE,SAAS,GAAG,wBAAwB,CAAC;gBACtC,CAAC;YACF,CAAC;QACF,CAAC;QAED,oEAAoE;QACpE,wEAAwE;QACxE,wEAAwE;QACxE,gBAAgB;QAChB,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC;QACjE,MAAM,aAAa,GAClB,iBAAiB,CAAC,IAAI,GAAG,CAAC;YACzB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;iBACtC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;iBACtC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;iBAC3C,IAAI,CAAC,GAAG,CAAC;YACZ,CAAC,CAAC,EAAE,CAAC;QAEP,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzE,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC1C,MAAM,UAAU,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAC7C,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACvF,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,GAAG,YAAY,CAAC,YAAY,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;QACjH,MAAM,UAAU,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC;QAEvE,MAAM,YAAY,GAAG;YACpB,UAAU;YACV,UAAU;YACV,YAAY;SACZ,CAAC;QACF,OAAO,iBAAiB,CAAC,YAAY,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC;CACD","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Interactive terminal footer renderer for workspace, model, usage, context, and extension status.\n\nimport { type Component, truncateToWidth, visibleWidth } from \"@gsd/pi-tui\";\nimport type { AgentSession } from \"../../../core/agent-session.js\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { providerAuthBadge, providerDisplayName } from \"./model-selector.js\";\nimport { renderFooterStrip } from \"./transcript-design.js\";\n\n/**\n * Sanitize text for display in a single-line status.\n * Removes newlines, tabs, carriage returns, and other control characters.\n */\nfunction sanitizeStatusText(text: string): string {\n\t// Replace newlines, tabs, carriage returns with space, then collapse multiple spaces\n\treturn text\n\t\t.replace(/[\\r\\n\\t]/g, \" \")\n\t\t.replace(/ +/g, \" \")\n\t\t.trim();\n}\n\nfunction truncateFooterPath(text: string, width: number): string {\n\tif (visibleWidth(text) <= width) return text;\n\tconst tailMatch = text.match(/( \\([^)]+\\)(?: • .*)?)$/);\n\tif (!tailMatch) return truncateToWidth(text, width, \"...\");\n\tconst tail = tailMatch[1];\n\tconst tailWidth = visibleWidth(tail);\n\tif (tailWidth >= width - 4) return truncateToWidth(text, width, \"...\");\n\tconst head = text.slice(0, -tail.length);\n\treturn `${truncateToWidth(head, width - tailWidth, \"...\")}${tail}`;\n}\n\n/**\n * Format token counts (similar to web-ui)\n */\nfunction formatTokens(count: number): string {\n\tif (count < 1000) return count.toString();\n\tif (count < 10000) return `${(count / 1000).toFixed(1)}k`;\n\tif (count < 1000000) return `${Math.round(count / 1000)}k`;\n\tif (count < 10000000) return `${(count / 1000000).toFixed(1)}M`;\n\treturn `${Math.round(count / 1000000)}M`;\n}\n\n/**\n * Format a cost value for compact display.\n * Uses fewer decimal places for larger amounts.\n * @internal Exported for testing only.\n */\nexport function formatPromptCost(cost: number): string {\n\tif (cost < 0.001) return `$${cost.toFixed(4)}`;\n\tif (cost < 0.01) return `$${cost.toFixed(3)}`;\n\tif (cost < 1) return `$${cost.toFixed(3)}`;\n\treturn `$${cost.toFixed(2)}`;\n}\n\n/**\n * Footer component that shows pwd, token stats, and context usage.\n * Computes token/context stats from session, gets git branch and extension statuses from provider.\n */\nexport class FooterComponent implements Component {\n\tprivate autoCompactEnabled = true;\n\n\tconstructor(\n\t\tprivate session: AgentSession,\n\t\tprivate footerData: ReadonlyFooterDataProvider,\n\t) {}\n\n\tsetAutoCompactEnabled(enabled: boolean): void {\n\t\tthis.autoCompactEnabled = enabled;\n\t}\n\n\t/**\n\t * No-op: git branch caching now handled by provider.\n\t * Kept for compatibility with existing call sites in interactive-mode.\n\t */\n\tinvalidate(): void {\n\t\t// No-op: git branch is cached/invalidated by provider\n\t}\n\n\t/**\n\t * Clean up resources.\n\t * Git watcher cleanup now handled by provider.\n\t */\n\tdispose(): void {\n\t\t// Git watcher cleanup handled by provider\n\t}\n\n\trender(width: number): string[] {\n\t\tconst state = this.session.state;\n\n\t\tconst usageTotals = this.session.sessionManager.getUsageTotals();\n\t\tconst totalInput = usageTotals.input;\n\t\tconst totalOutput = usageTotals.output;\n\t\tconst totalCacheRead = usageTotals.cacheRead;\n\t\tconst totalCacheWrite = usageTotals.cacheWrite;\n\t\tconst totalCost = usageTotals.cost;\n\n\t\t// Use activeInferenceModel during streaming to show the model actually\n\t\t// being used, not the configured model which may have been switched mid-turn.\n\t\tconst displayModel = state.activeInferenceModel ?? state.model;\n\n\t\t// Calculate context usage from session (handles compaction correctly).\n\t\t// After compaction, tokens are unknown until the next LLM response.\n\t\tconst contextUsage = this.session.getContextUsage();\n\t\tconst contextWindow = contextUsage?.contextWindow ?? displayModel?.contextWindow ?? 0;\n\t\tconst contextPercentValue = contextUsage?.percent ?? 0;\n\t\tconst contextPercent = contextUsage?.percent !== null ? contextPercentValue.toFixed(1) : \"?\";\n\n\t\t// Replace home directory with ~\n\t\tlet pwd = process.cwd();\n\t\tconst home = process.env.HOME || process.env.USERPROFILE;\n\t\tif (home && pwd.startsWith(home)) {\n\t\t\tpwd = `~${pwd.slice(home.length)}`;\n\t\t}\n\n\t\t// Add git branch if available\n\t\tconst branch = this.footerData.getGitBranch();\n\t\tif (branch) {\n\t\t\tpwd = `${pwd} (${branch})`;\n\t\t}\n\n\t\t// Add session name if set\n\t\tconst sessionName = this.session.sessionManager.getSessionName();\n\t\tif (sessionName) {\n\t\t\tpwd = `${pwd} • ${sessionName}`;\n\t\t}\n\n\t\t// Build stats line as separate groups joined by a dim middle-dot separator\n\t\tconst sep = ` ${theme.fg(\"dim\", \"\\u00B7\")} `;\n\n\t\t// Group 1: total tokens.\n\t\tconst tokenGroup: string[] = [];\n\t\tconst totalTokens = totalInput + totalOutput + totalCacheRead + totalCacheWrite;\n\t\tif (totalTokens > 0) tokenGroup.push(formatTokens(totalTokens));\n\n\t\t// Group 2: cache efficiency — cacheRead / all input-side tokens.\n\t\t// Collapses the old cr/cw pair into a single \"how much was served\n\t\t// from cache\" signal. cr/cw breakdown moved to `/stats`.\n\t\tconst cacheGroup: string[] = [];\n\t\tconst inputSide = totalInput + totalCacheRead + totalCacheWrite;\n\t\tif (totalCacheRead > 0 && inputSide > 0) {\n\t\t\tconst cachedPct = Math.round((totalCacheRead / inputSide) * 100);\n\t\t\tcacheGroup.push(`${cachedPct}% cached`);\n\t\t}\n\n\t\t// Group 3: cost\n\t\tconst costGroup: string[] = [];\n\t\tconst usingSubscription = displayModel ? this.session.modelRegistry.isUsingOAuth(displayModel) : false;\n\t\tif (totalCost || usingSubscription) {\n\t\t\tconst costStr = `$${totalCost.toFixed(3)}${usingSubscription ? \" (sub)\" : \"\"}`;\n\t\t\tcostGroup.push(costStr);\n\t\t}\n\n\t\t// Per-prompt cost annotation (opt-in via show_token_cost preference, #1515)\n\t\tif (process.env.GSD_SHOW_TOKEN_COST === \"1\") {\n\t\t\tconst lastTurnCost = this.session.getLastTurnCost();\n\t\t\tif (lastTurnCost > 0) {\n\t\t\t\tcostGroup.push(`(last: ${formatPromptCost(lastTurnCost)})`);\n\t\t\t}\n\t\t}\n\n\t\t// Group 4: context bar + percentage (mirrors /gsd auto dashboard style).\n\t\t// Bar colors track the same thresholds as the percent text.\n\t\tconst autoIndicator = this.autoCompactEnabled ? \" (auto)\" : \"\";\n\t\tconst barColor: \"error\" | \"warning\" | \"success\" =\n\t\t\tcontextPercentValue > 90 ? \"error\" : contextPercentValue > 70 ? \"warning\" : \"success\";\n\t\tconst BAR_WIDTH = 8;\n\t\tconst filled = contextUsage?.percent !== null\n\t\t\t? Math.max(0, Math.min(BAR_WIDTH, Math.round((contextPercentValue / 100) * BAR_WIDTH)))\n\t\t\t: 0;\n\t\tconst bar =\n\t\t\ttheme.fg(barColor, \"█\".repeat(filled)) +\n\t\t\ttheme.fg(\"dim\", \"░\".repeat(Math.max(0, BAR_WIDTH - filled)));\n\t\tconst pctText = contextPercent === \"?\" ? \"?\" : `${contextPercent}%`;\n\t\tconst suffix = `/${formatTokens(contextWindow)}${autoIndicator}`;\n\t\tconst colorizedPct =\n\t\t\tcontextPercentValue > 90\n\t\t\t\t? theme.fg(\"error\", pctText)\n\t\t\t\t: contextPercentValue > 70\n\t\t\t\t\t? theme.fg(\"warning\", pctText)\n\t\t\t\t\t: pctText;\n\t\tconst contextPercentStr = `${bar} ${colorizedPct}${suffix}`;\n\n\t\t// Assemble groups: items within a group are space-separated,\n\t\t// groups are separated by a dim middle-dot\n\t\tconst groups: string[] = [];\n\t\tif (tokenGroup.length > 0) groups.push(tokenGroup.join(\" \"));\n\t\tif (cacheGroup.length > 0) groups.push(cacheGroup.join(\" \"));\n\t\tif (costGroup.length > 0) groups.push(costGroup.join(\" \"));\n\t\tgroups.push(contextPercentStr);\n\n\t\tlet statsLeft = groups.join(sep);\n\n\t\t// Add model name on the right side, plus thinking level if model supports it\n\t\tconst modelName = displayModel?.id || \"no-model\";\n\n\t\tlet statsLeftWidth = visibleWidth(statsLeft);\n\n\t\t// If statsLeft is too wide, truncate it\n\t\tif (statsLeftWidth > width) {\n\t\t\tstatsLeft = truncateToWidth(statsLeft, width, \"...\");\n\t\t\tstatsLeftWidth = visibleWidth(statsLeft);\n\t\t}\n\n\t\t// Calculate available space for padding (minimum 2 spaces between stats and model)\n\t\tconst minPadding = 2;\n\n\t\t// Add thinking level indicator if model supports reasoning\n\t\tlet rightSideWithoutProvider = modelName;\n\t\tif (displayModel?.reasoning) {\n\t\t\tconst thinkingLevel = state.thinkingLevel || \"off\";\n\t\t\trightSideWithoutProvider =\n\t\t\t\tthinkingLevel === \"off\" ? `${modelName} • thinking off` : `${modelName} • ${thinkingLevel}`;\n\t\t}\n\n\t\t// Prepend the provider in parentheses if there are multiple providers and there's enough room.\n\t\t// Include the auth mode so users can tell at a glance whether the active model is\n\t\t// API-key-backed, OAuth-backed, or delegated to a third-party CLI.\n\t\tlet rightSide = rightSideWithoutProvider;\n\t\tif (this.footerData.getAvailableProviderCount() > 1 && displayModel) {\n\t\t\tconst authMode = this.session.modelRegistry.getProviderAuthMode(displayModel.provider);\n\t\t\tconst authLabel = providerAuthBadge(authMode);\n\t\t\tconst providerLabel = providerDisplayName(displayModel.provider);\n\t\t\tconst parenthetical = authLabel ? `${providerLabel} · ${authLabel}` : providerLabel;\n\t\t\trightSide = `(${parenthetical}) ${rightSideWithoutProvider}`;\n\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t// Too wide: drop the auth suffix first, then fall back to no parenthetical.\n\t\t\t\trightSide = `(${providerLabel}) ${rightSideWithoutProvider}`;\n\t\t\t\tif (statsLeftWidth + minPadding + visibleWidth(rightSide) > width) {\n\t\t\t\t\trightSide = rightSideWithoutProvider;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Extension statuses right-aligned on the pwd line (sorted by key).\n\t\t// Keeps the footer compact by avoiding a dedicated row when the content\n\t\t// fits alongside pwd. Falls back to pwd-only if the combined line would\n\t\t// exceed width.\n\t\tconst extensionStatuses = this.footerData.getExtensionStatuses();\n\t\tconst extStatusText =\n\t\t\textensionStatuses.size > 0\n\t\t\t\t? Array.from(extensionStatuses.entries())\n\t\t\t\t\t\t.sort(([a], [b]) => a.localeCompare(b))\n\t\t\t\t\t\t.map(([, text]) => sanitizeStatusText(text))\n\t\t\t\t\t\t.join(\" \")\n\t\t\t\t: \"\";\n\n\t\tconst footerRight = [rightSide, extStatusText].filter(Boolean).join(\" \");\n\t\tconst gsdSegment = theme.fg(\"accent\", \"● GSD\");\n\t\tconst dimStatsLeft = theme.fg(\"dim\", statsLeft);\n\t\tconst innerWidth = Math.max(1, width - 2);\n\t\tconst rightWidth = visibleWidth(footerRight);\n\t\tconst leftBudget = footerRight ? Math.max(1, innerWidth - rightWidth - 3) : innerWidth;\n\t\tconst sepWidth = visibleWidth(\" │ \");\n\t\tconst pwdBudget = Math.max(1, leftBudget - visibleWidth(gsdSegment) - visibleWidth(dimStatsLeft) - sepWidth * 2);\n\t\tconst pwdSegment = theme.fg(\"dim\", truncateFooterPath(pwd, pwdBudget));\n\n\t\tconst leftSegments = [\n\t\t\tgsdSegment,\n\t\t\tpwdSegment,\n\t\t\tdimStatsLeft,\n\t\t];\n\t\treturn renderFooterStrip(leftSegments, footerRight, width);\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- // GSD-2 + packages/pi-coding-agent/src/modes/interactive/components/interactive-key-handling.test.ts - Interactive component key handling regressions.
1
+ // gsd-pi + packages/pi-coding-agent/src/modes/interactive/components/interactive-key-handling.test.ts - Interactive component key handling regressions.
2
2
  import assert from "node:assert/strict";
3
3
  import { afterEach, beforeEach, describe, it } from "node:test";
4
4
  import { EditorKeybindingsManager, setEditorKeybindings, setKittyProtocolActive, TUI, } from "@gsd/pi-tui";
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-key-handling.test.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/interactive-key-handling.test.ts"],"names":[],"mappings":"AAAA,uJAAuJ;AAEvJ,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EACN,wBAAwB,EACxB,oBAAoB,EACpB,sBAAsB,EACtB,GAAG,GAGH,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,SAAS,YAAY;IACpB,OAAO;QACN,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,EAAE;QACX,IAAI,EAAE,EAAE;QACR,mBAAmB,EAAE,KAAK;QAC1B,KAAK,KAAI,CAAC;QACV,IAAI,KAAI,CAAC;QACT,UAAU,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QAC1B,KAAK,KAAI,CAAC;QACV,MAAM,KAAI,CAAC;QACX,UAAU,KAAI,CAAC;QACf,UAAU,KAAI,CAAC;QACf,SAAS,KAAI,CAAC;QACd,eAAe,KAAI,CAAC;QACpB,WAAW,KAAI,CAAC;QAChB,QAAQ,KAAI,CAAC;KACb,CAAC;AACH,CAAC;AAED,MAAM,WAAW,GAAgB;IAChC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;IAC3B,UAAU,EAAE;QACX,cAAc,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;QAC9B,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;QAC5B,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;QAC3B,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;QAC1B,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;KACvB;CACD,CAAC;AAEF,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IACnD,UAAU,CAAC,GAAG,EAAE;QACf,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACzB,oBAAoB,CAAC,IAAI,wBAAwB,EAAE,CAAC,CAAC;QACrD,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACd,oBAAoB,CAAC,IAAI,wBAAwB,EAAE,CAAC,CAAC;QACrD,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAChF,oBAAoB,CAAC,IAAI,wBAAwB,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAChF,IAAI,SAA6B,CAAC;QAClC,MAAM,KAAK,GAAG,IAAI,uBAAuB,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YACvE,SAAS,GAAG,KAAK,CAAC;QACnB,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEb,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACvB,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAExB,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAEnC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE1B,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QACnF,oBAAoB,CAAC,IAAI,wBAAwB,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAChF,IAAI,QAA4B,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE;YACrF,QAAQ,GAAG,MAAM,CAAC;QACnB,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEb,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAE3B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAElC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAE7B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACrF,IAAI,QAA4B,CAAC;QACjC,MAAM,QAAQ,GAAG,IAAI,0BAA0B,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE;YAC9F,QAAQ,GAAG,MAAM,CAAC;QACnB,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEb,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC1B,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAE3B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC3F,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC,EAAE,WAAW,EAAE,kBAAkB,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrG,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;YAChC,QAAQ,GAAG,IAAI,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAE7B,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["// GSD-2 + packages/pi-coding-agent/src/modes/interactive/components/interactive-key-handling.test.ts - Interactive component key handling regressions.\n\nimport assert from \"node:assert/strict\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\nimport {\n\tEditorKeybindingsManager,\n\tsetEditorKeybindings,\n\tsetKittyProtocolActive,\n\tTUI,\n\ttype EditorTheme,\n\ttype Terminal,\n} from \"@gsd/pi-tui\";\nimport { KeybindingsManager } from \"../../../core/keybindings.js\";\nimport { initTheme } from \"../theme/theme.js\";\nimport { CustomEditor } from \"./custom-editor.js\";\nimport { ExtensionInputComponent } from \"./extension-input.js\";\nimport { ExtensionSelectorComponent } from \"./extension-selector.js\";\n\nfunction makeTerminal(): Terminal {\n\treturn {\n\t\tisTTY: true,\n\t\tcolumns: 80,\n\t\trows: 24,\n\t\tkittyProtocolActive: false,\n\t\tstart() {},\n\t\tstop() {},\n\t\tdrainInput: async () => {},\n\t\twrite() {},\n\t\tmoveBy() {},\n\t\thideCursor() {},\n\t\tshowCursor() {},\n\t\tclearLine() {},\n\t\tclearFromCursor() {},\n\t\tclearScreen() {},\n\t\tsetTitle() {},\n\t};\n}\n\nconst editorTheme: EditorTheme = {\n\tborderColor: (text) => text,\n\tselectList: {\n\t\tselectedPrefix: (text) => text,\n\t\tselectedText: (text) => text,\n\t\tdescription: (text) => text,\n\t\tscrollInfo: (text) => text,\n\t\tnoMatch: (text) => text,\n\t},\n};\n\ndescribe(\"interactive component key handling\", () => {\n\tbeforeEach(() => {\n\t\tinitTheme(\"dark\", false);\n\t\tsetEditorKeybindings(new EditorKeybindingsManager());\n\t\tsetKittyProtocolActive(false);\n\t});\n\n\tafterEach(() => {\n\t\tsetEditorKeybindings(new EditorKeybindingsManager());\n\t\tsetKittyProtocolActive(false);\n\t});\n\n\tit(\"extension input follows a remapped confirm key instead of raw newline\", () => {\n\t\tsetEditorKeybindings(new EditorKeybindingsManager({ selectConfirm: \"ctrl+s\" }));\n\t\tlet submitted: string | undefined;\n\t\tconst input = new ExtensionInputComponent(\"Title\", undefined, (value) => {\n\t\t\tsubmitted = value;\n\t\t}, () => {});\n\n\t\tinput.handleInput(\"o\");\n\t\tinput.handleInput(\"k\");\n\t\tinput.handleInput(\"\\n\");\n\n\t\tassert.equal(submitted, undefined);\n\n\t\tinput.handleInput(\"\\x13\");\n\n\t\tassert.equal(submitted, \"ok\");\n\t});\n\n\tit(\"extension selector follows a remapped confirm key instead of raw newline\", () => {\n\t\tsetEditorKeybindings(new EditorKeybindingsManager({ selectConfirm: \"ctrl+s\" }));\n\t\tlet selected: string | undefined;\n\t\tconst selector = new ExtensionSelectorComponent(\"Pick\", [\"alpha\", \"beta\"], (option) => {\n\t\t\tselected = option;\n\t\t}, () => {});\n\n\t\tselector.handleInput(\"\\n\");\n\n\t\tassert.equal(selected, undefined);\n\n\t\tselector.handleInput(\"\\x13\");\n\n\t\tassert.equal(selected, \"alpha\");\n\t});\n\n\tit(\"extension selector keeps vi-style navigation through semantic key matching\", () => {\n\t\tlet selected: string | undefined;\n\t\tconst selector = new ExtensionSelectorComponent(\"Pick\", [\"alpha\", \"beta\", \"gamma\"], (option) => {\n\t\t\tselected = option;\n\t\t}, () => {});\n\n\t\tselector.handleInput(\"j\");\n\t\tselector.handleInput(\"j\");\n\t\tselector.handleInput(\"k\");\n\t\tselector.handleInput(\"\\r\");\n\n\t\tassert.equal(selected, \"beta\");\n\t});\n\n\tit(\"custom editor treats the legacy alt-enter sequence as newline outside kitty mode\", () => {\n\t\tconst editor = new CustomEditor(new TUI(makeTerminal()), editorTheme, KeybindingsManager.inMemory());\n\t\tlet followUp = false;\n\t\teditor.onAction(\"followUp\", () => {\n\t\t\tfollowUp = true;\n\t\t});\n\n\t\teditor.handleInput(\"\\x1b\\r\");\n\n\t\tassert.equal(followUp, false);\n\t\tassert.equal(editor.getText(), \"\\n\");\n\t});\n});\n"]}
1
+ {"version":3,"file":"interactive-key-handling.test.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/interactive-key-handling.test.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi + packages/pi-coding-agent/src/modes/interactive/components/interactive-key-handling.test.ts - Interactive component key handling regressions.\n\nimport assert from \"node:assert/strict\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\nimport {\n\tEditorKeybindingsManager,\n\tsetEditorKeybindings,\n\tsetKittyProtocolActive,\n\tTUI,\n\ttype EditorTheme,\n\ttype Terminal,\n} from \"@gsd/pi-tui\";\nimport { KeybindingsManager } from \"../../../core/keybindings.js\";\nimport { initTheme } from \"../theme/theme.js\";\nimport { CustomEditor } from \"./custom-editor.js\";\nimport { ExtensionInputComponent } from \"./extension-input.js\";\nimport { ExtensionSelectorComponent } from \"./extension-selector.js\";\n\nfunction makeTerminal(): Terminal {\n\treturn {\n\t\tisTTY: true,\n\t\tcolumns: 80,\n\t\trows: 24,\n\t\tkittyProtocolActive: false,\n\t\tstart() {},\n\t\tstop() {},\n\t\tdrainInput: async () => {},\n\t\twrite() {},\n\t\tmoveBy() {},\n\t\thideCursor() {},\n\t\tshowCursor() {},\n\t\tclearLine() {},\n\t\tclearFromCursor() {},\n\t\tclearScreen() {},\n\t\tsetTitle() {},\n\t};\n}\n\nconst editorTheme: EditorTheme = {\n\tborderColor: (text) => text,\n\tselectList: {\n\t\tselectedPrefix: (text) => text,\n\t\tselectedText: (text) => text,\n\t\tdescription: (text) => text,\n\t\tscrollInfo: (text) => text,\n\t\tnoMatch: (text) => text,\n\t},\n};\n\ndescribe(\"interactive component key handling\", () => {\n\tbeforeEach(() => {\n\t\tinitTheme(\"dark\", false);\n\t\tsetEditorKeybindings(new EditorKeybindingsManager());\n\t\tsetKittyProtocolActive(false);\n\t});\n\n\tafterEach(() => {\n\t\tsetEditorKeybindings(new EditorKeybindingsManager());\n\t\tsetKittyProtocolActive(false);\n\t});\n\n\tit(\"extension input follows a remapped confirm key instead of raw newline\", () => {\n\t\tsetEditorKeybindings(new EditorKeybindingsManager({ selectConfirm: \"ctrl+s\" }));\n\t\tlet submitted: string | undefined;\n\t\tconst input = new ExtensionInputComponent(\"Title\", undefined, (value) => {\n\t\t\tsubmitted = value;\n\t\t}, () => {});\n\n\t\tinput.handleInput(\"o\");\n\t\tinput.handleInput(\"k\");\n\t\tinput.handleInput(\"\\n\");\n\n\t\tassert.equal(submitted, undefined);\n\n\t\tinput.handleInput(\"\\x13\");\n\n\t\tassert.equal(submitted, \"ok\");\n\t});\n\n\tit(\"extension selector follows a remapped confirm key instead of raw newline\", () => {\n\t\tsetEditorKeybindings(new EditorKeybindingsManager({ selectConfirm: \"ctrl+s\" }));\n\t\tlet selected: string | undefined;\n\t\tconst selector = new ExtensionSelectorComponent(\"Pick\", [\"alpha\", \"beta\"], (option) => {\n\t\t\tselected = option;\n\t\t}, () => {});\n\n\t\tselector.handleInput(\"\\n\");\n\n\t\tassert.equal(selected, undefined);\n\n\t\tselector.handleInput(\"\\x13\");\n\n\t\tassert.equal(selected, \"alpha\");\n\t});\n\n\tit(\"extension selector keeps vi-style navigation through semantic key matching\", () => {\n\t\tlet selected: string | undefined;\n\t\tconst selector = new ExtensionSelectorComponent(\"Pick\", [\"alpha\", \"beta\", \"gamma\"], (option) => {\n\t\t\tselected = option;\n\t\t}, () => {});\n\n\t\tselector.handleInput(\"j\");\n\t\tselector.handleInput(\"j\");\n\t\tselector.handleInput(\"k\");\n\t\tselector.handleInput(\"\\r\");\n\n\t\tassert.equal(selected, \"beta\");\n\t});\n\n\tit(\"custom editor treats the legacy alt-enter sequence as newline outside kitty mode\", () => {\n\t\tconst editor = new CustomEditor(new TUI(makeTerminal()), editorTheme, KeybindingsManager.inMemory());\n\t\tlet followUp = false;\n\t\teditor.onAction(\"followUp\", () => {\n\t\t\tfollowUp = true;\n\t\t});\n\n\t\teditor.handleInput(\"\\x1b\\r\");\n\n\t\tassert.equal(followUp, false);\n\t\tassert.equal(editor.getText(), \"\\n\");\n\t});\n});\n"]}
@@ -1,4 +1,4 @@
1
- // Project/App: GSD-2
1
+ // Project/App: gsd-pi
2
2
  // File Purpose: OAuth provider selector for login and logout actions.
3
3
  import { getOAuthProviders } from "@gsd/pi-ai/oauth";
4
4
  import { Container, getEditorKeybindings, Spacer, TruncatedText } from "@gsd/pi-tui";
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/oauth-selector.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: GSD-2\n// File Purpose: OAuth provider selector for login and logout actions.\n\nimport type { OAuthProviderInterface } from \"@gsd/pi-ai\";\nimport { getOAuthProviders } from \"@gsd/pi-ai/oauth\";\nimport { Container, getEditorKeybindings, Spacer, TruncatedText } from \"@gsd/pi-tui\";\nimport type { AuthStorage } from \"../../../core/auth-storage.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { selectorFooter } from \"./keybinding-hints.js\";\nimport { renderCursor } from \"./tree-render-utils.js\";\n\n/**\n * Component that renders an OAuth provider selector\n */\nexport class OAuthSelectorComponent extends Container {\n\tprivate listContainer: Container;\n\tprivate allProviders: OAuthProviderInterface[] = [];\n\tprivate selectedIndex: number = 0;\n\tprivate mode: \"login\" | \"logout\";\n\tprivate authStorage: AuthStorage;\n\tprivate onSelectCallback: (providerId: string) => void;\n\tprivate onCancelCallback: () => void;\n\n\tconstructor(\n\t\tmode: \"login\" | \"logout\",\n\t\tauthStorage: AuthStorage,\n\t\tonSelect: (providerId: string) => void,\n\t\tonCancel: () => void,\n\t) {\n\t\tsuper();\n\n\t\tthis.mode = mode;\n\t\tthis.authStorage = authStorage;\n\t\tthis.onSelectCallback = onSelect;\n\t\tthis.onCancelCallback = onCancel;\n\n\t\t// Load all OAuth providers\n\t\tthis.loadProviders();\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add title\n\t\tconst title = mode === \"login\" ? \"Select provider to login:\" : \"Select provider to logout:\";\n\t\tthis.addChild(new TruncatedText(theme.bold(title)));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create list container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new TruncatedText(selectorFooter(), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Initial render\n\t\tthis.updateList();\n\t}\n\n\tprivate loadProviders(): void {\n\t\tthis.allProviders = getOAuthProviders();\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tfor (let i = 0; i < this.allProviders.length; i++) {\n\t\t\tconst provider = this.allProviders[i];\n\t\t\tif (!provider) continue;\n\n\t\t\tconst isSelected = i === this.selectedIndex;\n\n\t\t\t// Check if user is logged in for this provider\n\t\t\tconst credentials = this.authStorage.get(provider.id);\n\t\t\tconst isLoggedIn = credentials?.type === \"oauth\";\n\t\t\tconst statusIndicator = isLoggedIn ? theme.fg(\"success\", \" ✓ logged in\") : \"\";\n\n\t\t\tlet line = \"\";\n\t\t\tif (isSelected) {\n\t\t\t\tconst text = theme.fg(\"accent\", provider.name);\n\t\t\t\tline = renderCursor(true) + text + statusIndicator;\n\t\t\t} else {\n\t\t\t\tconst text = renderCursor(false) + provider.name;\n\t\t\t\tline = text + statusIndicator;\n\t\t\t}\n\n\t\t\tthis.listContainer.addChild(new TruncatedText(line, 0, 0));\n\t\t}\n\n\t\t// Show \"no providers\" if empty\n\t\tif (this.allProviders.length === 0) {\n\t\t\tconst message =\n\t\t\t\tthis.mode === \"login\" ? \"No OAuth providers available\" : \"No OAuth providers logged in. Use /login first.\";\n\t\t\tthis.listContainer.addChild(new TruncatedText(theme.fg(\"muted\", ` ${message}`), 0, 0));\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getEditorKeybindings();\n\t\t// Up arrow (wrap)\n\t\tif (kb.matches(keyData, \"selectUp\")) {\n\t\t\tthis.selectedIndex = this.selectedIndex === 0 ? this.allProviders.length - 1 : this.selectedIndex - 1;\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Down arrow (wrap)\n\t\telse if (kb.matches(keyData, \"selectDown\")) {\n\t\t\tthis.selectedIndex = this.selectedIndex === this.allProviders.length - 1 ? 0 : this.selectedIndex + 1;\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Enter\n\t\telse if (kb.matches(keyData, \"selectConfirm\")) {\n\t\t\tconst selectedProvider = this.allProviders[this.selectedIndex];\n\t\t\tif (selectedProvider) {\n\t\t\t\tthis.onSelectCallback(selectedProvider.id);\n\t\t\t}\n\t\t}\n\t\t// Escape or Ctrl+C\n\t\telse if (kb.matches(keyData, \"selectCancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"oauth-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/oauth-selector.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: OAuth provider selector for login and logout actions.\n\nimport type { OAuthProviderInterface } from \"@gsd/pi-ai\";\nimport { getOAuthProviders } from \"@gsd/pi-ai/oauth\";\nimport { Container, getEditorKeybindings, Spacer, TruncatedText } from \"@gsd/pi-tui\";\nimport type { AuthStorage } from \"../../../core/auth-storage.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { selectorFooter } from \"./keybinding-hints.js\";\nimport { renderCursor } from \"./tree-render-utils.js\";\n\n/**\n * Component that renders an OAuth provider selector\n */\nexport class OAuthSelectorComponent extends Container {\n\tprivate listContainer: Container;\n\tprivate allProviders: OAuthProviderInterface[] = [];\n\tprivate selectedIndex: number = 0;\n\tprivate mode: \"login\" | \"logout\";\n\tprivate authStorage: AuthStorage;\n\tprivate onSelectCallback: (providerId: string) => void;\n\tprivate onCancelCallback: () => void;\n\n\tconstructor(\n\t\tmode: \"login\" | \"logout\",\n\t\tauthStorage: AuthStorage,\n\t\tonSelect: (providerId: string) => void,\n\t\tonCancel: () => void,\n\t) {\n\t\tsuper();\n\n\t\tthis.mode = mode;\n\t\tthis.authStorage = authStorage;\n\t\tthis.onSelectCallback = onSelect;\n\t\tthis.onCancelCallback = onCancel;\n\n\t\t// Load all OAuth providers\n\t\tthis.loadProviders();\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add title\n\t\tconst title = mode === \"login\" ? \"Select provider to login:\" : \"Select provider to logout:\";\n\t\tthis.addChild(new TruncatedText(theme.bold(title)));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Create list container\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(new TruncatedText(selectorFooter(), 1, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Initial render\n\t\tthis.updateList();\n\t}\n\n\tprivate loadProviders(): void {\n\t\tthis.allProviders = getOAuthProviders();\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tfor (let i = 0; i < this.allProviders.length; i++) {\n\t\t\tconst provider = this.allProviders[i];\n\t\t\tif (!provider) continue;\n\n\t\t\tconst isSelected = i === this.selectedIndex;\n\n\t\t\t// Check if user is logged in for this provider\n\t\t\tconst credentials = this.authStorage.get(provider.id);\n\t\t\tconst isLoggedIn = credentials?.type === \"oauth\";\n\t\t\tconst statusIndicator = isLoggedIn ? theme.fg(\"success\", \" ✓ logged in\") : \"\";\n\n\t\t\tlet line = \"\";\n\t\t\tif (isSelected) {\n\t\t\t\tconst text = theme.fg(\"accent\", provider.name);\n\t\t\t\tline = renderCursor(true) + text + statusIndicator;\n\t\t\t} else {\n\t\t\t\tconst text = renderCursor(false) + provider.name;\n\t\t\t\tline = text + statusIndicator;\n\t\t\t}\n\n\t\t\tthis.listContainer.addChild(new TruncatedText(line, 0, 0));\n\t\t}\n\n\t\t// Show \"no providers\" if empty\n\t\tif (this.allProviders.length === 0) {\n\t\t\tconst message =\n\t\t\t\tthis.mode === \"login\" ? \"No OAuth providers available\" : \"No OAuth providers logged in. Use /login first.\";\n\t\t\tthis.listContainer.addChild(new TruncatedText(theme.fg(\"muted\", ` ${message}`), 0, 0));\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getEditorKeybindings();\n\t\t// Up arrow (wrap)\n\t\tif (kb.matches(keyData, \"selectUp\")) {\n\t\t\tthis.selectedIndex = this.selectedIndex === 0 ? this.allProviders.length - 1 : this.selectedIndex - 1;\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Down arrow (wrap)\n\t\telse if (kb.matches(keyData, \"selectDown\")) {\n\t\t\tthis.selectedIndex = this.selectedIndex === this.allProviders.length - 1 ? 0 : this.selectedIndex + 1;\n\t\t\tthis.updateList();\n\t\t}\n\t\t// Enter\n\t\telse if (kb.matches(keyData, \"selectConfirm\")) {\n\t\t\tconst selectedProvider = this.allProviders[this.selectedIndex];\n\t\t\tif (selectedProvider) {\n\t\t\t\tthis.onSelectCallback(selectedProvider.id);\n\t\t\t}\n\t\t}\n\t\t// Escape or Ctrl+C\n\t\telse if (kb.matches(keyData, \"selectCancel\")) {\n\t\t\tthis.onCancelCallback();\n\t\t}\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- // GSD-2 + packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts - Provider management selector.
1
+ // gsd-pi + packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts - Provider management selector.
2
2
  /**
3
3
  * TUI component for managing provider configurations.
4
4
  * Shows providers with auth status, discovery support, and model counts.
@@ -1 +1 @@
1
- {"version":3,"file":"provider-manager.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/provider-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// GSD-2 + packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts - Provider management selector.\n/**\n * TUI component for managing provider configurations.\n * Shows providers with auth status, discovery support, and model counts.\n */\n\nimport {\n\tContainer,\n\ttype Focusable,\n\tgetEditorKeybindings,\n\tKey,\n\tmatchesKey,\n\tSpacer,\n\tText,\n\ttype TUI,\n} from \"@gsd/pi-tui\";\nimport type { AuthStorage } from \"../../../core/auth-storage.js\";\nimport { getDiscoverableProviders, getDiscoveryAdapter } from \"../../../core/model-discovery.js\";\nimport { providerDisplayName } from \"./model-selector.js\";\nimport type { ModelRegistry } from \"../../../core/model-registry.js\";\nimport { ModelsJsonWriter } from \"../../../core/models-json-writer.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { rawKeyHint } from \"./keybinding-hints.js\";\n\ninterface ProviderInfo {\n\tname: string;\n\thasAuth: boolean;\n\tsupportsDiscovery: boolean;\n\tmodelCount: number;\n}\n\nexport class ProviderManagerComponent extends Container implements Focusable {\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t}\n\n\tprivate providers: ProviderInfo[] = [];\n\tprivate selectedIndex = 0;\n\tprivate listContainer: Container;\n\tprivate tui: TUI;\n\tprivate authStorage: AuthStorage;\n\tprivate modelRegistry: ModelRegistry;\n\tprivate modelsJsonWriter: ModelsJsonWriter;\n\tprivate onDone: () => void;\n\tprivate onDiscover: (provider: string) => void;\n\tprivate onSetupAuth: (provider: string) => void;\n\tprivate confirmingRemove = false;\n\tprivate hintsContainer: Container;\n\n\tconstructor(\n\t\ttui: TUI,\n\t\tauthStorage: AuthStorage,\n\t\tmodelRegistry: ModelRegistry,\n\t\tonDone: () => void,\n\t\tonDiscover: (provider: string) => void,\n\t\tonSetupAuth?: (provider: string) => void,\n\t) {\n\t\tsuper();\n\n\t\tthis.tui = tui;\n\t\tthis.authStorage = authStorage;\n\t\tthis.modelRegistry = modelRegistry;\n\t\tthis.modelsJsonWriter = new ModelsJsonWriter(this.modelRegistry.modelsJsonPath);\n\t\tthis.onDone = onDone;\n\t\tthis.onDiscover = onDiscover;\n\t\tthis.onSetupAuth = onSetupAuth ?? (() => {});\n\n\t\t// Header\n\t\tthis.addChild(new Text(theme.fg(\"accent\", \"Provider Manager\"), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Hints\n\t\tthis.hintsContainer = new Container();\n\t\tthis.addChild(this.hintsContainer);\n\t\tthis.updateHints();\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// List\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\tthis.loadProviders();\n\t\tthis.updateList();\n\t}\n\n\tprivate loadProviders(): void {\n\t\tconst discoverableSet = new Set(getDiscoverableProviders());\n\t\tconst allModels = this.modelRegistry.getAll();\n\n\t\t// Group models by provider\n\t\tconst providerModelCounts = new Map<string, number>();\n\t\tfor (const model of allModels) {\n\t\t\tproviderModelCounts.set(model.provider, (providerModelCounts.get(model.provider) ?? 0) + 1);\n\t\t}\n\n\t\t// Build provider list from all known providers\n\t\tconst providerNames = new Set([\n\t\t\t...providerModelCounts.keys(),\n\t\t\t...discoverableSet,\n\t\t]);\n\n\t\tthis.providers = Array.from(providerNames)\n\t\t\t.sort()\n\t\t\t.map((name) => {\n\t\t\t\tconst providerApis = new Set(\n\t\t\t\t\tallModels\n\t\t\t\t\t\t.filter((m) => m.provider === name)\n\t\t\t\t\t\t.map((m) => m.api)\n\t\t\t\t\t\t.filter((api): api is string => typeof api === \"string\" && api.length > 0),\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\thasAuth: this.authStorage.hasAuth(name),\n\t\t\t\t\tsupportsDiscovery:\n\t\t\t\t\t\tdiscoverableSet.has(name) || getDiscoveryAdapter(name, providerApis).supportsDiscovery,\n\t\t\t\t\tmodelCount: providerModelCounts.get(name) ?? 0,\n\t\t\t\t};\n\t\t\t});\n\t\tthis.clampSelectedIndex();\n\t}\n\n\tprivate clampSelectedIndex(): void {\n\t\tif (this.providers.length === 0) {\n\t\t\tthis.selectedIndex = 0;\n\t\t\treturn;\n\t\t}\n\t\tthis.selectedIndex = Math.min(this.selectedIndex, this.providers.length - 1);\n\t}\n\n\tprivate updateHints(): void {\n\t\tthis.hintsContainer.clear();\n\t\tif (this.confirmingRemove) {\n\t\t\tconst hints = [\n\t\t\t\trawKeyHint(\"r\", \"confirm removal\"),\n\t\t\t\trawKeyHint(\"esc\", \"cancel\"),\n\t\t\t].join(\" \");\n\t\t\tthis.hintsContainer.addChild(new Text(hints, 0, 0));\n\t\t} else {\n\t\t\tconst hints = [\n\t\t\t\trawKeyHint(\"enter\", \"setup auth\"),\n\t\t\t\trawKeyHint(\"d\", \"discover\"),\n\t\t\t\trawKeyHint(\"r\", \"remove auth\"),\n\t\t\t\trawKeyHint(\"esc\", \"close\"),\n\t\t\t].join(\" \");\n\t\t\tthis.hintsContainer.addChild(new Text(hints, 0, 0));\n\t\t}\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tfor (let i = 0; i < this.providers.length; i++) {\n\t\t\tconst p = this.providers[i];\n\t\t\tconst isSelected = i === this.selectedIndex;\n\n\t\t\tconst authBadge = p.hasAuth ? theme.fg(\"success\", \"[auth]\") : theme.fg(\"muted\", \"[no auth]\");\n\t\t\tconst discoveryBadge = p.supportsDiscovery ? theme.fg(\"accent\", \"[discovery]\") : \"\";\n\t\t\tconst countBadge = theme.fg(\"muted\", `(${p.modelCount} models)`);\n\n\t\t\tconst prefix = isSelected ? theme.fg(\"accent\", \"> \") : \" \";\n\t\t\tconst nameText = isSelected ? theme.fg(\"accent\", providerDisplayName(p.name)) : providerDisplayName(p.name);\n\n\t\t\tconst parts = [prefix, nameText, \" \", authBadge];\n\t\t\tif (discoveryBadge) parts.push(\" \", discoveryBadge);\n\t\t\tparts.push(\" \", countBadge);\n\n\t\t\tthis.listContainer.addChild(new Text(parts.join(\"\"), 0, 0));\n\t\t}\n\n\t\tif (this.providers.length === 0) {\n\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"muted\", \" No providers configured\"), 0, 0));\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getEditorKeybindings();\n\n\t\tif (kb.matches(keyData, \"selectUp\")) {\n\t\t\tif (this.providers.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === 0 ? this.providers.length - 1 : this.selectedIndex - 1;\n\t\t\tthis.updateList();\n\t\t\tthis.tui.requestRender();\n\t\t} else if (kb.matches(keyData, \"selectDown\")) {\n\t\t\tif (this.providers.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === this.providers.length - 1 ? 0 : this.selectedIndex + 1;\n\t\t\tthis.updateList();\n\t\t\tthis.tui.requestRender();\n\t\t} else if (kb.matches(keyData, \"selectCancel\")) {\n\t\t\tif (this.confirmingRemove) {\n\t\t\t\tthis.confirmingRemove = false;\n\t\t\t\tthis.updateHints();\n\t\t\t\tthis.tui.requestRender();\n\t\t\t} else {\n\t\t\t\tthis.onDone();\n\t\t\t}\n\t\t} else if (matchesKey(keyData, \"d\") || matchesKey(keyData, Key.shift(\"d\"))) {\n\t\t\tconst provider = this.providers[this.selectedIndex];\n\t\t\tif (provider?.supportsDiscovery) {\n\t\t\t\tthis.onDiscover(provider.name);\n\t\t\t}\n\t\t} else if (matchesKey(keyData, \"r\") || matchesKey(keyData, Key.shift(\"r\"))) {\n\t\t\tconst provider = this.providers[this.selectedIndex];\n\t\t\tif (provider?.hasAuth) {\n\t\t\t\tif (this.confirmingRemove) {\n\t\t\t\t\tthis.confirmingRemove = false;\n\t\t\t\t\tthis.authStorage.remove(provider.name);\n\t\t\t\t\tthis.modelsJsonWriter.removeProvider(provider.name);\n\t\t\t\t\tthis.modelRegistry.refresh();\n\t\t\t\t\tthis.loadProviders();\n\t\t\t\t\tthis.updateHints();\n\t\t\t\t\tthis.updateList();\n\t\t\t\t\tthis.tui.requestRender();\n\t\t\t\t} else {\n\t\t\t\t\tthis.confirmingRemove = true;\n\t\t\t\t\tthis.updateHints();\n\t\t\t\t\tthis.tui.requestRender();\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (kb.matches(keyData, \"selectConfirm\")) {\n\t\t\t// Enter key → initiate auth setup for the selected provider (#3579)\n\t\t\tconst provider = this.providers[this.selectedIndex];\n\t\t\tif (provider) {\n\t\t\t\tthis.onSetupAuth(provider.name);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"provider-manager.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/provider-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi + packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts - Provider management selector.\n/**\n * TUI component for managing provider configurations.\n * Shows providers with auth status, discovery support, and model counts.\n */\n\nimport {\n\tContainer,\n\ttype Focusable,\n\tgetEditorKeybindings,\n\tKey,\n\tmatchesKey,\n\tSpacer,\n\tText,\n\ttype TUI,\n} from \"@gsd/pi-tui\";\nimport type { AuthStorage } from \"../../../core/auth-storage.js\";\nimport { getDiscoverableProviders, getDiscoveryAdapter } from \"../../../core/model-discovery.js\";\nimport { providerDisplayName } from \"./model-selector.js\";\nimport type { ModelRegistry } from \"../../../core/model-registry.js\";\nimport { ModelsJsonWriter } from \"../../../core/models-json-writer.js\";\nimport { theme } from \"../theme/theme.js\";\nimport { rawKeyHint } from \"./keybinding-hints.js\";\n\ninterface ProviderInfo {\n\tname: string;\n\thasAuth: boolean;\n\tsupportsDiscovery: boolean;\n\tmodelCount: number;\n}\n\nexport class ProviderManagerComponent extends Container implements Focusable {\n\tprivate _focused = false;\n\tget focused(): boolean {\n\t\treturn this._focused;\n\t}\n\tset focused(value: boolean) {\n\t\tthis._focused = value;\n\t}\n\n\tprivate providers: ProviderInfo[] = [];\n\tprivate selectedIndex = 0;\n\tprivate listContainer: Container;\n\tprivate tui: TUI;\n\tprivate authStorage: AuthStorage;\n\tprivate modelRegistry: ModelRegistry;\n\tprivate modelsJsonWriter: ModelsJsonWriter;\n\tprivate onDone: () => void;\n\tprivate onDiscover: (provider: string) => void;\n\tprivate onSetupAuth: (provider: string) => void;\n\tprivate confirmingRemove = false;\n\tprivate hintsContainer: Container;\n\n\tconstructor(\n\t\ttui: TUI,\n\t\tauthStorage: AuthStorage,\n\t\tmodelRegistry: ModelRegistry,\n\t\tonDone: () => void,\n\t\tonDiscover: (provider: string) => void,\n\t\tonSetupAuth?: (provider: string) => void,\n\t) {\n\t\tsuper();\n\n\t\tthis.tui = tui;\n\t\tthis.authStorage = authStorage;\n\t\tthis.modelRegistry = modelRegistry;\n\t\tthis.modelsJsonWriter = new ModelsJsonWriter(this.modelRegistry.modelsJsonPath);\n\t\tthis.onDone = onDone;\n\t\tthis.onDiscover = onDiscover;\n\t\tthis.onSetupAuth = onSetupAuth ?? (() => {});\n\n\t\t// Header\n\t\tthis.addChild(new Text(theme.fg(\"accent\", \"Provider Manager\"), 0, 0));\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// Hints\n\t\tthis.hintsContainer = new Container();\n\t\tthis.addChild(this.hintsContainer);\n\t\tthis.updateHints();\n\t\tthis.addChild(new Spacer(1));\n\n\t\t// List\n\t\tthis.listContainer = new Container();\n\t\tthis.addChild(this.listContainer);\n\n\t\tthis.loadProviders();\n\t\tthis.updateList();\n\t}\n\n\tprivate loadProviders(): void {\n\t\tconst discoverableSet = new Set(getDiscoverableProviders());\n\t\tconst allModels = this.modelRegistry.getAll();\n\n\t\t// Group models by provider\n\t\tconst providerModelCounts = new Map<string, number>();\n\t\tfor (const model of allModels) {\n\t\t\tproviderModelCounts.set(model.provider, (providerModelCounts.get(model.provider) ?? 0) + 1);\n\t\t}\n\n\t\t// Build provider list from all known providers\n\t\tconst providerNames = new Set([\n\t\t\t...providerModelCounts.keys(),\n\t\t\t...discoverableSet,\n\t\t]);\n\n\t\tthis.providers = Array.from(providerNames)\n\t\t\t.sort()\n\t\t\t.map((name) => {\n\t\t\t\tconst providerApis = new Set(\n\t\t\t\t\tallModels\n\t\t\t\t\t\t.filter((m) => m.provider === name)\n\t\t\t\t\t\t.map((m) => m.api)\n\t\t\t\t\t\t.filter((api): api is string => typeof api === \"string\" && api.length > 0),\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\thasAuth: this.authStorage.hasAuth(name),\n\t\t\t\t\tsupportsDiscovery:\n\t\t\t\t\t\tdiscoverableSet.has(name) || getDiscoveryAdapter(name, providerApis).supportsDiscovery,\n\t\t\t\t\tmodelCount: providerModelCounts.get(name) ?? 0,\n\t\t\t\t};\n\t\t\t});\n\t\tthis.clampSelectedIndex();\n\t}\n\n\tprivate clampSelectedIndex(): void {\n\t\tif (this.providers.length === 0) {\n\t\t\tthis.selectedIndex = 0;\n\t\t\treturn;\n\t\t}\n\t\tthis.selectedIndex = Math.min(this.selectedIndex, this.providers.length - 1);\n\t}\n\n\tprivate updateHints(): void {\n\t\tthis.hintsContainer.clear();\n\t\tif (this.confirmingRemove) {\n\t\t\tconst hints = [\n\t\t\t\trawKeyHint(\"r\", \"confirm removal\"),\n\t\t\t\trawKeyHint(\"esc\", \"cancel\"),\n\t\t\t].join(\" \");\n\t\t\tthis.hintsContainer.addChild(new Text(hints, 0, 0));\n\t\t} else {\n\t\t\tconst hints = [\n\t\t\t\trawKeyHint(\"enter\", \"setup auth\"),\n\t\t\t\trawKeyHint(\"d\", \"discover\"),\n\t\t\t\trawKeyHint(\"r\", \"remove auth\"),\n\t\t\t\trawKeyHint(\"esc\", \"close\"),\n\t\t\t].join(\" \");\n\t\t\tthis.hintsContainer.addChild(new Text(hints, 0, 0));\n\t\t}\n\t}\n\n\tprivate updateList(): void {\n\t\tthis.listContainer.clear();\n\n\t\tfor (let i = 0; i < this.providers.length; i++) {\n\t\t\tconst p = this.providers[i];\n\t\t\tconst isSelected = i === this.selectedIndex;\n\n\t\t\tconst authBadge = p.hasAuth ? theme.fg(\"success\", \"[auth]\") : theme.fg(\"muted\", \"[no auth]\");\n\t\t\tconst discoveryBadge = p.supportsDiscovery ? theme.fg(\"accent\", \"[discovery]\") : \"\";\n\t\t\tconst countBadge = theme.fg(\"muted\", `(${p.modelCount} models)`);\n\n\t\t\tconst prefix = isSelected ? theme.fg(\"accent\", \"> \") : \" \";\n\t\t\tconst nameText = isSelected ? theme.fg(\"accent\", providerDisplayName(p.name)) : providerDisplayName(p.name);\n\n\t\t\tconst parts = [prefix, nameText, \" \", authBadge];\n\t\t\tif (discoveryBadge) parts.push(\" \", discoveryBadge);\n\t\t\tparts.push(\" \", countBadge);\n\n\t\t\tthis.listContainer.addChild(new Text(parts.join(\"\"), 0, 0));\n\t\t}\n\n\t\tif (this.providers.length === 0) {\n\t\t\tthis.listContainer.addChild(new Text(theme.fg(\"muted\", \" No providers configured\"), 0, 0));\n\t\t}\n\t}\n\n\thandleInput(keyData: string): void {\n\t\tconst kb = getEditorKeybindings();\n\n\t\tif (kb.matches(keyData, \"selectUp\")) {\n\t\t\tif (this.providers.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === 0 ? this.providers.length - 1 : this.selectedIndex - 1;\n\t\t\tthis.updateList();\n\t\t\tthis.tui.requestRender();\n\t\t} else if (kb.matches(keyData, \"selectDown\")) {\n\t\t\tif (this.providers.length === 0) return;\n\t\t\tthis.selectedIndex = this.selectedIndex === this.providers.length - 1 ? 0 : this.selectedIndex + 1;\n\t\t\tthis.updateList();\n\t\t\tthis.tui.requestRender();\n\t\t} else if (kb.matches(keyData, \"selectCancel\")) {\n\t\t\tif (this.confirmingRemove) {\n\t\t\t\tthis.confirmingRemove = false;\n\t\t\t\tthis.updateHints();\n\t\t\t\tthis.tui.requestRender();\n\t\t\t} else {\n\t\t\t\tthis.onDone();\n\t\t\t}\n\t\t} else if (matchesKey(keyData, \"d\") || matchesKey(keyData, Key.shift(\"d\"))) {\n\t\t\tconst provider = this.providers[this.selectedIndex];\n\t\t\tif (provider?.supportsDiscovery) {\n\t\t\t\tthis.onDiscover(provider.name);\n\t\t\t}\n\t\t} else if (matchesKey(keyData, \"r\") || matchesKey(keyData, Key.shift(\"r\"))) {\n\t\t\tconst provider = this.providers[this.selectedIndex];\n\t\t\tif (provider?.hasAuth) {\n\t\t\t\tif (this.confirmingRemove) {\n\t\t\t\t\tthis.confirmingRemove = false;\n\t\t\t\t\tthis.authStorage.remove(provider.name);\n\t\t\t\t\tthis.modelsJsonWriter.removeProvider(provider.name);\n\t\t\t\t\tthis.modelRegistry.refresh();\n\t\t\t\t\tthis.loadProviders();\n\t\t\t\t\tthis.updateHints();\n\t\t\t\t\tthis.updateList();\n\t\t\t\t\tthis.tui.requestRender();\n\t\t\t\t} else {\n\t\t\t\t\tthis.confirmingRemove = true;\n\t\t\t\t\tthis.updateHints();\n\t\t\t\t\tthis.tui.requestRender();\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (kb.matches(keyData, \"selectConfirm\")) {\n\t\t\t// Enter key → initiate auth setup for the selected provider (#3579)\n\t\t\tconst provider = this.providers[this.selectedIndex];\n\t\t\tif (provider) {\n\t\t\t\tthis.onSetupAuth(provider.name);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- // Project/App: GSD-2
1
+ // Project/App: gsd-pi
2
2
  // File Purpose: Shared render cache helper for interactive TUI components.
3
3
  export class RenderCache {
4
4
  get(key) {
@@ -1 +1 @@
1
- {"version":3,"file":"render-cache.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/render-cache.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,2EAA2E;AAE3E,MAAM,OAAO,WAAW;IAIvB,GAAG,CAAC,GAAW;QACd,OAAO,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAClD,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAe;QAC/B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACxB,CAAC;CACD","sourcesContent":["// Project/App: GSD-2\n// File Purpose: Shared render cache helper for interactive TUI components.\n\nexport class RenderCache {\n\tprivate key?: string;\n\tprivate lines?: string[];\n\n\tget(key: string): string[] | undefined {\n\t\treturn this.key === key ? this.lines : undefined;\n\t}\n\n\tset(key: string, lines: string[]): string[] {\n\t\tthis.key = key;\n\t\tthis.lines = lines;\n\t\treturn lines;\n\t}\n\n\tclear(): void {\n\t\tthis.key = undefined;\n\t\tthis.lines = undefined;\n\t}\n}\n"]}
1
+ {"version":3,"file":"render-cache.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/render-cache.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,2EAA2E;AAE3E,MAAM,OAAO,WAAW;IAIvB,GAAG,CAAC,GAAW;QACd,OAAO,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAClD,CAAC;IAED,GAAG,CAAC,GAAW,EAAE,KAAe;QAC/B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,KAAK,CAAC;IACd,CAAC;IAED,KAAK;QACJ,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;IACxB,CAAC;CACD","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Shared render cache helper for interactive TUI components.\n\nexport class RenderCache {\n\tprivate key?: string;\n\tprivate lines?: string[];\n\n\tget(key: string): string[] | undefined {\n\t\treturn this.key === key ? this.lines : undefined;\n\t}\n\n\tset(key: string, lines: string[]): string[] {\n\t\tthis.key = key;\n\t\tthis.lines = lines;\n\t\treturn lines;\n\t}\n\n\tclear(): void {\n\t\tthis.key = undefined;\n\t\tthis.lines = undefined;\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- // GSD-2 + packages/pi-coding-agent/src/modes/interactive/components/selector-footers.test.ts - Selector footer consistency coverage.
1
+ // gsd-pi + packages/pi-coding-agent/src/modes/interactive/components/selector-footers.test.ts - Selector footer consistency coverage.
2
2
  import assert from "node:assert/strict";
3
3
  import { before, describe, it } from "node:test";
4
4
  import { stripVTControlCharacters } from "node:util";
@@ -1 +1 @@
1
- {"version":3,"file":"selector-footers.test.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/selector-footers.test.ts"],"names":[],"mappings":"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","sourcesContent":["// GSD-2 + packages/pi-coding-agent/src/modes/interactive/components/selector-footers.test.ts - Selector footer consistency coverage.\n\nimport assert from \"node:assert/strict\";\nimport { before, describe, it } from \"node:test\";\nimport type { Component } from \"@gsd/pi-tui\";\nimport { stripVTControlCharacters } from \"node:util\";\nimport { AuthStorage } from \"../../../core/auth-storage.js\";\nimport { initTheme } from \"../theme/theme.js\";\nimport { OAuthSelectorComponent } from \"./oauth-selector.js\";\nimport { ShowImagesSelectorComponent } from \"./show-images-selector.js\";\nimport { ThemeSelectorComponent } from \"./theme-selector.js\";\nimport { ThinkingSelectorComponent } from \"./thinking-selector.js\";\nimport { renderCursor } from \"./tree-render-utils.js\";\nimport { UserMessageSelectorComponent } from \"./user-message-selector.js\";\n\nbefore(() => {\n\tinitTheme(\"dark\", false);\n});\n\nfunction plain(component: Component): string {\n\treturn component.render(80).map((line) => stripVTControlCharacters(line)).join(\"\\n\");\n}\n\nfunction plainLines(component: Component): string[] {\n\treturn component.render(80).map((line) => stripVTControlCharacters(line));\n}\n\nfunction assertSelectorFooter(output: string): void {\n\tassert.match(output, /navigate/);\n\tassert.match(output, /select/);\n\tassert.match(output, /cancel/);\n}\n\ndescribe(\"selector footers\", () => {\n\tit(\"renders the standard selector footer on simple interactive selectors\", () => {\n\t\tconst selectors: Component[] = [\n\t\t\tnew ThemeSelectorComponent(\"dark\", () => {}, () => {}, () => {}),\n\t\t\tnew ThinkingSelectorComponent(\"medium\", [\"off\", \"medium\", \"high\"], () => {}, () => {}),\n\t\t\tnew ShowImagesSelectorComponent(true, () => {}, () => {}),\n\t\t\tnew OAuthSelectorComponent(\"login\", AuthStorage.inMemory(), () => {}, () => {}),\n\t\t\tnew UserMessageSelectorComponent([{ id: \"1\", text: \"hello\" }], () => {}, () => {}),\n\t\t];\n\n\t\tfor (const selector of selectors) {\n\t\t\tassertSelectorFooter(plain(selector));\n\t\t}\n\t});\n\n\tit(\"uses the shared selector cursor on simple row selectors\", () => {\n\t\tconst cursor = stripVTControlCharacters(renderCursor(true));\n\t\tconst selectors: Component[] = [\n\t\t\tnew OAuthSelectorComponent(\"login\", AuthStorage.inMemory(), () => {}, () => {}),\n\t\t\tnew UserMessageSelectorComponent([{ id: \"1\", text: \"hello\" }], () => {}, () => {}),\n\t\t];\n\n\t\tfor (const selector of selectors) {\n\t\t\tassert.ok(\n\t\t\t\tplainLines(selector).some((line) => line.startsWith(cursor)),\n\t\t\t\t`expected selected row to start with ${JSON.stringify(cursor)}`,\n\t\t\t);\n\t\t}\n\t});\n});\n"]}
1
+ {"version":3,"file":"selector-footers.test.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/selector-footers.test.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi + packages/pi-coding-agent/src/modes/interactive/components/selector-footers.test.ts - Selector footer consistency coverage.\n\nimport assert from \"node:assert/strict\";\nimport { before, describe, it } from \"node:test\";\nimport type { Component } from \"@gsd/pi-tui\";\nimport { stripVTControlCharacters } from \"node:util\";\nimport { AuthStorage } from \"../../../core/auth-storage.js\";\nimport { initTheme } from \"../theme/theme.js\";\nimport { OAuthSelectorComponent } from \"./oauth-selector.js\";\nimport { ShowImagesSelectorComponent } from \"./show-images-selector.js\";\nimport { ThemeSelectorComponent } from \"./theme-selector.js\";\nimport { ThinkingSelectorComponent } from \"./thinking-selector.js\";\nimport { renderCursor } from \"./tree-render-utils.js\";\nimport { UserMessageSelectorComponent } from \"./user-message-selector.js\";\n\nbefore(() => {\n\tinitTheme(\"dark\", false);\n});\n\nfunction plain(component: Component): string {\n\treturn component.render(80).map((line) => stripVTControlCharacters(line)).join(\"\\n\");\n}\n\nfunction plainLines(component: Component): string[] {\n\treturn component.render(80).map((line) => stripVTControlCharacters(line));\n}\n\nfunction assertSelectorFooter(output: string): void {\n\tassert.match(output, /navigate/);\n\tassert.match(output, /select/);\n\tassert.match(output, /cancel/);\n}\n\ndescribe(\"selector footers\", () => {\n\tit(\"renders the standard selector footer on simple interactive selectors\", () => {\n\t\tconst selectors: Component[] = [\n\t\t\tnew ThemeSelectorComponent(\"dark\", () => {}, () => {}, () => {}),\n\t\t\tnew ThinkingSelectorComponent(\"medium\", [\"off\", \"medium\", \"high\"], () => {}, () => {}),\n\t\t\tnew ShowImagesSelectorComponent(true, () => {}, () => {}),\n\t\t\tnew OAuthSelectorComponent(\"login\", AuthStorage.inMemory(), () => {}, () => {}),\n\t\t\tnew UserMessageSelectorComponent([{ id: \"1\", text: \"hello\" }], () => {}, () => {}),\n\t\t];\n\n\t\tfor (const selector of selectors) {\n\t\t\tassertSelectorFooter(plain(selector));\n\t\t}\n\t});\n\n\tit(\"uses the shared selector cursor on simple row selectors\", () => {\n\t\tconst cursor = stripVTControlCharacters(renderCursor(true));\n\t\tconst selectors: Component[] = [\n\t\t\tnew OAuthSelectorComponent(\"login\", AuthStorage.inMemory(), () => {}, () => {}),\n\t\t\tnew UserMessageSelectorComponent([{ id: \"1\", text: \"hello\" }], () => {}, () => {}),\n\t\t];\n\n\t\tfor (const selector of selectors) {\n\t\t\tassert.ok(\n\t\t\t\tplainLines(selector).some((line) => line.startsWith(cursor)),\n\t\t\t\t`expected selected row to start with ${JSON.stringify(cursor)}`,\n\t\t\t);\n\t\t}\n\t});\n});\n"]}
@@ -1,4 +1,4 @@
1
- // GSD-2 + packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts - Skill invocation message renderer.
1
+ // gsd-pi + packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts - Skill invocation message renderer.
2
2
  import { Markdown, Text } from "@gsd/pi-tui";
3
3
  import { getMarkdownTheme, theme } from "../theme/theme.js";
4
4
  import { CollapsibleMessageComponent } from "./collapsible-message.js";
@@ -1 +1 @@
1
- {"version":3,"file":"skill-invocation-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/skill-invocation-message.ts"],"names":[],"mappings":"AAAA,qIAAqI;AAErI,OAAO,EAAE,QAAQ,EAAsB,IAAI,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;GAIG;AACH,MAAM,OAAO,+BAAgC,SAAQ,2BAA2B;IAI/E,YAAY,UAA4B,EAAE,gBAA+B,gBAAgB,EAAE;QAC1F,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,cAAc,EAAE,CAAC;IACvB,CAAC;IAES,cAAc;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,CACZ,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE;gBAC/D,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC;aAC5D,CAAC,CACF,CAAC;QACH,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,QAAQ,CACZ,IAAI,IAAI,CACP,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,EAC1D,CAAC,EACD,CAAC,CACD,CACD,CAAC;QACH,CAAC;IACF,CAAC;IAEQ,MAAM,CAAC,KAAa;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE;YACjD,KAAK,EAAE,WAAW,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACxC,IAAI,EAAE,OAAO;YACb,eAAe,EAAE,eAAe;YAChC,aAAa,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;CACD","sourcesContent":["// GSD-2 + packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts - Skill invocation message renderer.\n\nimport { Markdown, type MarkdownTheme, Text } from \"@gsd/pi-tui\";\nimport type { ParsedSkillBlock } from \"../../../core/agent-session.js\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { CollapsibleMessageComponent } from \"./collapsible-message.js\";\nimport { renderChatFrame } from \"./transcript-design.js\";\nimport { editorKey } from \"./keybinding-hints.js\";\n\n/**\n * Renders a skill invocation in the shared chat-frame style (top rule,\n * `• skill - <name>` header, `│ ` body margin) with purple border/label\n * matching compaction so it visually aligns with user/assistant messages.\n */\nexport class SkillInvocationMessageComponent extends CollapsibleMessageComponent {\n\tprivate skillBlock: ParsedSkillBlock;\n\tprivate markdownTheme: MarkdownTheme;\n\n\tconstructor(skillBlock: ParsedSkillBlock, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n\t\tsuper();\n\t\tthis.skillBlock = skillBlock;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.rebuildContent();\n\t}\n\n\tprotected rebuildContent(): void {\n\t\tthis.clear();\n\n\t\tif (this.expanded) {\n\t\t\tthis.addChild(\n\t\t\t\tnew Markdown(this.skillBlock.content, 0, 0, this.markdownTheme, {\n\t\t\t\t\tcolor: (text: string) => theme.fg(\"customMessageText\", text),\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\ttheme.fg(\"dim\", `(${editorKey(\"expandTools\")} to expand)`),\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst cached = this.getCachedRender(width);\n\t\tif (cached) return cached;\n\n\t\tconst frameWidth = Math.max(20, width);\n\t\tconst contentWidth = Math.max(1, frameWidth - 4);\n\t\tconst lines = super.render(contentWidth);\n\t\tconst framed = renderChatFrame(lines, frameWidth, {\n\t\t\tlabel: `skill - ${this.skillBlock.name}`,\n\t\t\ttone: \"skill\",\n\t\t\ttimestampFormat: \"date-time-iso\",\n\t\t\tshowTimestamp: false,\n\t\t});\n\t\treturn this.setCachedRender(width, framed.length > 0 ? [\"\", ...framed] : framed);\n\t}\n}\n"]}
1
+ {"version":3,"file":"skill-invocation-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/skill-invocation-message.ts"],"names":[],"mappings":"AAAA,sIAAsI;AAEtI,OAAO,EAAE,QAAQ,EAAsB,IAAI,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD;;;;GAIG;AACH,MAAM,OAAO,+BAAgC,SAAQ,2BAA2B;IAI/E,YAAY,UAA4B,EAAE,gBAA+B,gBAAgB,EAAE;QAC1F,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,cAAc,EAAE,CAAC;IACvB,CAAC;IAES,cAAc;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;QAEb,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,CACZ,IAAI,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE;gBAC/D,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,mBAAmB,EAAE,IAAI,CAAC;aAC5D,CAAC,CACF,CAAC;QACH,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,QAAQ,CACZ,IAAI,IAAI,CACP,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,SAAS,CAAC,aAAa,CAAC,aAAa,CAAC,EAC1D,CAAC,EACD,CAAC,CACD,CACD,CAAC;QACH,CAAC;IACF,CAAC;IAEQ,MAAM,CAAC,KAAa;QAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QAE1B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE;YACjD,KAAK,EAAE,WAAW,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YACxC,IAAI,EAAE,OAAO;YACb,eAAe,EAAE,eAAe;YAChC,aAAa,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;CACD","sourcesContent":["// gsd-pi + packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts - Skill invocation message renderer.\n\nimport { Markdown, type MarkdownTheme, Text } from \"@gsd/pi-tui\";\nimport type { ParsedSkillBlock } from \"../../../core/agent-session.js\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { CollapsibleMessageComponent } from \"./collapsible-message.js\";\nimport { renderChatFrame } from \"./transcript-design.js\";\nimport { editorKey } from \"./keybinding-hints.js\";\n\n/**\n * Renders a skill invocation in the shared chat-frame style (top rule,\n * `• skill - <name>` header, `│ ` body margin) with purple border/label\n * matching compaction so it visually aligns with user/assistant messages.\n */\nexport class SkillInvocationMessageComponent extends CollapsibleMessageComponent {\n\tprivate skillBlock: ParsedSkillBlock;\n\tprivate markdownTheme: MarkdownTheme;\n\n\tconstructor(skillBlock: ParsedSkillBlock, markdownTheme: MarkdownTheme = getMarkdownTheme()) {\n\t\tsuper();\n\t\tthis.skillBlock = skillBlock;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.rebuildContent();\n\t}\n\n\tprotected rebuildContent(): void {\n\t\tthis.clear();\n\n\t\tif (this.expanded) {\n\t\t\tthis.addChild(\n\t\t\t\tnew Markdown(this.skillBlock.content, 0, 0, this.markdownTheme, {\n\t\t\t\t\tcolor: (text: string) => theme.fg(\"customMessageText\", text),\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\tthis.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\ttheme.fg(\"dim\", `(${editorKey(\"expandTools\")} to expand)`),\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t}\n\n\toverride render(width: number): string[] {\n\t\tconst cached = this.getCachedRender(width);\n\t\tif (cached) return cached;\n\n\t\tconst frameWidth = Math.max(20, width);\n\t\tconst contentWidth = Math.max(1, frameWidth - 4);\n\t\tconst lines = super.render(contentWidth);\n\t\tconst framed = renderChatFrame(lines, frameWidth, {\n\t\t\tlabel: `skill - ${this.skillBlock.name}`,\n\t\t\ttone: \"skill\",\n\t\t\ttimestampFormat: \"date-time-iso\",\n\t\t\tshowTimestamp: false,\n\t\t});\n\t\treturn this.setCachedRender(width, framed.length > 0 ? [\"\", ...framed] : framed);\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- // Project/App: GSD-2
1
+ // Project/App: gsd-pi
2
2
  // File Purpose: Theme selector dialog for interactive TUI theme switching.
3
3
  import { Container, SelectList, Text } from "@gsd/pi-tui";
4
4
  import { getAvailableThemes, getSelectListTheme } from "../theme/theme.js";
@@ -1 +1 @@
1
- {"version":3,"file":"theme-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/theme-selector.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,2EAA2E;AAE3E,OAAO,EAAE,SAAS,EAAmB,UAAU,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,SAAS;IAIpD,YACC,YAAoB,EACpB,QAAqC,EACrC,QAAoB,EACpB,SAAsC;QAEtC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,+CAA+C;QAC/C,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACpC,MAAM,UAAU,GAAiB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtD,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC,CAAC;QAEJ,iBAAiB;QACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QAEnC,kBAAkB;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,UAAU,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAEvE,0BAA0B;QAC1B,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;YACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,EAAE;YAC/B,QAAQ,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,iBAAiB,GAAG,CAAC,IAAI,EAAE,EAAE;YAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhD,oBAAoB;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,aAAa;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;CACD","sourcesContent":["// Project/App: GSD-2\n// File Purpose: Theme selector dialog for interactive TUI theme switching.\n\nimport { Container, type SelectItem, SelectList, Text } from \"@gsd/pi-tui\";\nimport { getAvailableThemes, getSelectListTheme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { selectorFooter } from \"./keybinding-hints.js\";\n\n/**\n * Component that renders a theme selector\n */\nexport class ThemeSelectorComponent extends Container {\n\tprivate selectList: SelectList;\n\tprivate onPreview: (themeName: string) => void;\n\n\tconstructor(\n\t\tcurrentTheme: string,\n\t\tonSelect: (themeName: string) => void,\n\t\tonCancel: () => void,\n\t\tonPreview: (themeName: string) => void,\n\t) {\n\t\tsuper();\n\t\tthis.onPreview = onPreview;\n\n\t\t// Get available themes and create select items\n\t\tconst themes = getAvailableThemes();\n\t\tconst themeItems: SelectItem[] = themes.map((name) => ({\n\t\t\tvalue: name,\n\t\t\tlabel: name,\n\t\t\tdescription: name === currentTheme ? \"(current)\" : undefined,\n\t\t}));\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Create selector\n\t\tthis.selectList = new SelectList(themeItems, 10, getSelectListTheme());\n\n\t\t// Preselect current theme\n\t\tconst currentIndex = themes.indexOf(currentTheme);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = () => {\n\t\t\tonCancel();\n\t\t};\n\n\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\tthis.onPreview(item.value);\n\t\t};\n\n\t\tthis.addChild(this.selectList);\n\t\tthis.addChild(new Text(selectorFooter(), 1, 0));\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSelectList(): SelectList {\n\t\treturn this.selectList;\n\t}\n}\n"]}
1
+ {"version":3,"file":"theme-selector.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/theme-selector.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,2EAA2E;AAE3E,OAAO,EAAE,SAAS,EAAmB,UAAU,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,SAAS;IAIpD,YACC,YAAoB,EACpB,QAAqC,EACrC,QAAoB,EACpB,SAAsC;QAEtC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,+CAA+C;QAC/C,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACpC,MAAM,UAAU,GAAiB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtD,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,IAAI;YACX,WAAW,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC,CAAC;QAEJ,iBAAiB;QACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;QAEnC,kBAAkB;QAClB,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,UAAU,EAAE,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAEvE,0BAA0B;QAC1B,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,YAAY,KAAK,CAAC,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,CAAC,IAAI,EAAE,EAAE;YACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,EAAE;YAC/B,QAAQ,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,iBAAiB,GAAG,CAAC,IAAI,EAAE,EAAE;YAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAEhD,oBAAoB;QACpB,IAAI,CAAC,QAAQ,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,aAAa;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACxB,CAAC;CACD","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Theme selector dialog for interactive TUI theme switching.\n\nimport { Container, type SelectItem, SelectList, Text } from \"@gsd/pi-tui\";\nimport { getAvailableThemes, getSelectListTheme } from \"../theme/theme.js\";\nimport { DynamicBorder } from \"./dynamic-border.js\";\nimport { selectorFooter } from \"./keybinding-hints.js\";\n\n/**\n * Component that renders a theme selector\n */\nexport class ThemeSelectorComponent extends Container {\n\tprivate selectList: SelectList;\n\tprivate onPreview: (themeName: string) => void;\n\n\tconstructor(\n\t\tcurrentTheme: string,\n\t\tonSelect: (themeName: string) => void,\n\t\tonCancel: () => void,\n\t\tonPreview: (themeName: string) => void,\n\t) {\n\t\tsuper();\n\t\tthis.onPreview = onPreview;\n\n\t\t// Get available themes and create select items\n\t\tconst themes = getAvailableThemes();\n\t\tconst themeItems: SelectItem[] = themes.map((name) => ({\n\t\t\tvalue: name,\n\t\t\tlabel: name,\n\t\t\tdescription: name === currentTheme ? \"(current)\" : undefined,\n\t\t}));\n\n\t\t// Add top border\n\t\tthis.addChild(new DynamicBorder());\n\n\t\t// Create selector\n\t\tthis.selectList = new SelectList(themeItems, 10, getSelectListTheme());\n\n\t\t// Preselect current theme\n\t\tconst currentIndex = themes.indexOf(currentTheme);\n\t\tif (currentIndex !== -1) {\n\t\t\tthis.selectList.setSelectedIndex(currentIndex);\n\t\t}\n\n\t\tthis.selectList.onSelect = (item) => {\n\t\t\tonSelect(item.value);\n\t\t};\n\n\t\tthis.selectList.onCancel = () => {\n\t\t\tonCancel();\n\t\t};\n\n\t\tthis.selectList.onSelectionChange = (item) => {\n\t\t\tthis.onPreview(item.value);\n\t\t};\n\n\t\tthis.addChild(this.selectList);\n\t\tthis.addChild(new Text(selectorFooter(), 1, 0));\n\n\t\t// Add bottom border\n\t\tthis.addChild(new DynamicBorder());\n\t}\n\n\tgetSelectList(): SelectList {\n\t\treturn this.selectList;\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- // GSD-2 + packages/pi-coding-agent/src/modes/interactive/components/theme-selector.test.ts - Theme selector live-preview regression coverage.
1
+ // gsd-pi + packages/pi-coding-agent/src/modes/interactive/components/theme-selector.test.ts - Theme selector live-preview regression coverage.
2
2
  import { afterEach, describe, it } from "node:test";
3
3
  import assert from "node:assert/strict";
4
4
  import { initTheme, setTheme } from "../theme/theme.js";
@@ -1 +1 @@
1
- {"version":3,"file":"theme-selector.test.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/theme-selector.test.ts"],"names":[],"mappings":"AAAA,8IAA8I;AAE9I,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEzB,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACvC,SAAS,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QAClF,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9D,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzB,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7D,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,8DAA8D,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["// GSD-2 + packages/pi-coding-agent/src/modes/interactive/components/theme-selector.test.ts - Theme selector live-preview regression coverage.\n\nimport { afterEach, describe, it } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { initTheme, setTheme } from \"../theme/theme.js\";\nimport { ThemeSelectorComponent } from \"./theme-selector.js\";\n\ninitTheme(\"dark\", false);\n\ndescribe(\"ThemeSelectorComponent\", () => {\n\tafterEach(() => {\n\t\tsetTheme(\"dark\", false);\n\t});\n\n\tit(\"renders its SelectList with the active theme after live preview changes\", () => {\n\t\tsetTheme(\"dark\", false);\n\t\tconst selector = new ThemeSelectorComponent(\"dark\", () => {}, () => {}, () => {});\n\t\tconst before = selector.getSelectList().render(80).join(\"\\n\");\n\n\t\tsetTheme(\"light\", false);\n\t\tselector.invalidate();\n\t\tconst after = selector.getSelectList().render(80).join(\"\\n\");\n\n\t\tassert.notEqual(after, before);\n\t\tassert.match(after, /\\x1b\\[/, \"rendered SelectList should still include themed ANSI styling\");\n\t});\n});\n"]}
1
+ {"version":3,"file":"theme-selector.test.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/theme-selector.test.ts"],"names":[],"mappings":"AAAA,+IAA+I;AAE/I,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAEzB,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACvC,SAAS,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QAClF,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACxB,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9D,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzB,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE7D,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,8DAA8D,CAAC,CAAC;IAC/F,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["// gsd-pi + packages/pi-coding-agent/src/modes/interactive/components/theme-selector.test.ts - Theme selector live-preview regression coverage.\n\nimport { afterEach, describe, it } from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { initTheme, setTheme } from \"../theme/theme.js\";\nimport { ThemeSelectorComponent } from \"./theme-selector.js\";\n\ninitTheme(\"dark\", false);\n\ndescribe(\"ThemeSelectorComponent\", () => {\n\tafterEach(() => {\n\t\tsetTheme(\"dark\", false);\n\t});\n\n\tit(\"renders its SelectList with the active theme after live preview changes\", () => {\n\t\tsetTheme(\"dark\", false);\n\t\tconst selector = new ThemeSelectorComponent(\"dark\", () => {}, () => {}, () => {});\n\t\tconst before = selector.getSelectList().render(80).join(\"\\n\");\n\n\t\tsetTheme(\"light\", false);\n\t\tselector.invalidate();\n\t\tconst after = selector.getSelectList().render(80).join(\"\\n\");\n\n\t\tassert.notEqual(after, before);\n\t\tassert.match(after, /\\x1b\\[/, \"rendered SelectList should still include themed ANSI styling\");\n\t});\n});\n"]}
@@ -1,4 +1,4 @@
1
- // Project/App: GSD-2
1
+ // Project/App: gsd-pi
2
2
  // File Purpose: Timestamp formatting helpers for interactive transcript messages.
3
3
  function pad2(n) {
4
4
  return n.toString().padStart(2, "0");
@@ -1 +1 @@
1
- {"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/timestamp.ts"],"names":[],"mappings":"AAAA,qBAAqB;AACrB,kFAAkF;AAYlF,SAAS,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,OAAO,CAAC,CAAO;IACvB,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,OAAO,CAAC,CAAO;IACvB,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,MAAM,CAAC,CAAO;IACtB,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,MAAM,CAAC,CAAO;IACtB,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,MAAM,CAAC,GAAG,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC;IAC3B,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,SAA0B,eAAe;IAC3F,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IAE9B,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,eAAe;YACnB,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,KAAK,cAAc;YAClB,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrC,CAAC;AACF,CAAC","sourcesContent":["// Project/App: GSD-2\n// File Purpose: Timestamp formatting helpers for interactive transcript messages.\n\n/**\n * Timestamp formatting for message display.\n *\n * Supported formats:\n * - \"date-time-iso\": 2025-03-24 10:34 (default)\n * - \"date-time-us\": 03-24-2025 10:34 AM\n */\n\nexport type TimestampFormat = \"date-time-iso\" | \"date-time-us\";\n\nfunction pad2(n: number): string {\n\treturn n.toString().padStart(2, \"0\");\n}\n\nfunction isoDate(d: Date): string {\n\treturn `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\nfunction isoTime(d: Date): string {\n\treturn `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\nfunction usDate(d: Date): string {\n\treturn `${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}-${d.getFullYear()}`;\n}\n\nfunction usTime(d: Date): string {\n\tconst hours = d.getHours();\n\tconst period = hours >= 12 ? \"PM\" : \"AM\";\n\tconst h = hours % 12 || 12;\n\treturn `${h}:${pad2(d.getMinutes())} ${period}`;\n}\n\n/**\n * Format a timestamp for message display using the specified format.\n */\nexport function formatTimestamp(timestamp: number, format: TimestampFormat = \"date-time-iso\"): string {\n\tconst d = new Date(timestamp);\n\n\tswitch (format) {\n\t\tcase \"date-time-iso\":\n\t\t\treturn `${isoDate(d)} ${isoTime(d)}`;\n\t\tcase \"date-time-us\":\n\t\t\treturn `${usDate(d)} ${usTime(d)}`;\n\t}\n}\n"]}
1
+ {"version":3,"file":"timestamp.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/timestamp.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,kFAAkF;AAYlF,SAAS,IAAI,CAAC,CAAS;IACtB,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,OAAO,CAAC,CAAO;IACvB,OAAO,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,OAAO,CAAC,CAAO;IACvB,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,MAAM,CAAC,CAAO;IACtB,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,MAAM,CAAC,CAAO;IACtB,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACzC,MAAM,CAAC,GAAG,KAAK,GAAG,EAAE,IAAI,EAAE,CAAC;IAC3B,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,IAAI,MAAM,EAAE,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,SAA0B,eAAe;IAC3F,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;IAE9B,QAAQ,MAAM,EAAE,CAAC;QAChB,KAAK,eAAe;YACnB,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACtC,KAAK,cAAc;YAClB,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACrC,CAAC;AACF,CAAC","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Timestamp formatting helpers for interactive transcript messages.\n\n/**\n * Timestamp formatting for message display.\n *\n * Supported formats:\n * - \"date-time-iso\": 2025-03-24 10:34 (default)\n * - \"date-time-us\": 03-24-2025 10:34 AM\n */\n\nexport type TimestampFormat = \"date-time-iso\" | \"date-time-us\";\n\nfunction pad2(n: number): string {\n\treturn n.toString().padStart(2, \"0\");\n}\n\nfunction isoDate(d: Date): string {\n\treturn `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}`;\n}\n\nfunction isoTime(d: Date): string {\n\treturn `${pad2(d.getHours())}:${pad2(d.getMinutes())}`;\n}\n\nfunction usDate(d: Date): string {\n\treturn `${pad2(d.getMonth() + 1)}-${pad2(d.getDate())}-${d.getFullYear()}`;\n}\n\nfunction usTime(d: Date): string {\n\tconst hours = d.getHours();\n\tconst period = hours >= 12 ? \"PM\" : \"AM\";\n\tconst h = hours % 12 || 12;\n\treturn `${h}:${pad2(d.getMinutes())} ${period}`;\n}\n\n/**\n * Format a timestamp for message display using the specified format.\n */\nexport function formatTimestamp(timestamp: number, format: TimestampFormat = \"date-time-iso\"): string {\n\tconst d = new Date(timestamp);\n\n\tswitch (format) {\n\t\tcase \"date-time-iso\":\n\t\t\treturn `${isoDate(d)} ${isoTime(d)}`;\n\t\tcase \"date-time-us\":\n\t\t\treturn `${usDate(d)} ${usTime(d)}`;\n\t}\n}\n"]}
@@ -1,6 +1,6 @@
1
- // Project/App: GSD-2
1
+ // Project/App: gsd-pi
2
2
  // File Purpose: Runtime tests for TUI tool cards, success notifications, and blocking errors.
3
- // GSD2 TUI Tests - Runtime coverage for tool-card cleanup and success notification rendering.
3
+ // gsd-pi TUI Tests - Runtime coverage for tool-card cleanup and success notification rendering.
4
4
  // Runtime regression tests for the post-compaction tool-card cleanup and the
5
5
  // green-bordered success-notification rendering. Replaces the source-grep
6
6
  // `src/tests/tui-running-and-success-box.test.ts` that was deleted in #4875