gsd-pi 2.33.1 → 2.34.0-dev.0150ae9

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 (1048) hide show
  1. package/dist/bundled-resource-path.d.ts +8 -0
  2. package/dist/bundled-resource-path.js +14 -0
  3. package/dist/cli.js +16 -0
  4. package/dist/headless-query.js +6 -6
  5. package/dist/resource-loader.d.ts +2 -0
  6. package/dist/resource-loader.js +39 -4
  7. package/dist/resources/extensions/ask-user-questions.js +217 -0
  8. package/dist/resources/extensions/async-jobs/async-bash-tool.js +180 -0
  9. package/dist/resources/extensions/async-jobs/await-tool.js +90 -0
  10. package/dist/resources/extensions/async-jobs/cancel-job-tool.js +28 -0
  11. package/dist/resources/extensions/async-jobs/index.js +119 -0
  12. package/dist/resources/extensions/async-jobs/job-manager.js +159 -0
  13. package/dist/resources/extensions/aws-auth/index.js +138 -0
  14. package/dist/resources/extensions/bg-shell/bg-shell-command.js +182 -0
  15. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.js +343 -0
  16. package/dist/resources/extensions/bg-shell/bg-shell-tool.js +831 -0
  17. package/dist/resources/extensions/bg-shell/index.js +41 -0
  18. package/dist/resources/extensions/bg-shell/interaction.js +160 -0
  19. package/dist/resources/extensions/bg-shell/output-formatter.js +245 -0
  20. package/dist/resources/extensions/bg-shell/overlay.js +378 -0
  21. package/dist/resources/extensions/bg-shell/process-manager.js +413 -0
  22. package/dist/resources/extensions/bg-shell/readiness-detector.js +109 -0
  23. package/dist/resources/extensions/bg-shell/types.js +96 -0
  24. package/dist/resources/extensions/bg-shell/utilities.js +50 -0
  25. package/dist/resources/extensions/browser-tools/capture.js +179 -0
  26. package/dist/resources/extensions/browser-tools/core.js +899 -0
  27. package/dist/resources/extensions/browser-tools/{evaluate-helpers.ts → evaluate-helpers.js} +0 -1
  28. package/dist/resources/extensions/browser-tools/index.js +123 -0
  29. package/dist/resources/extensions/browser-tools/lifecycle.js +222 -0
  30. package/dist/resources/extensions/browser-tools/refs.js +254 -0
  31. package/dist/resources/extensions/browser-tools/settle.js +173 -0
  32. package/dist/resources/extensions/browser-tools/state.js +126 -0
  33. package/dist/resources/extensions/browser-tools/tools/action-cache.js +179 -0
  34. package/dist/resources/extensions/browser-tools/tools/assertions.js +320 -0
  35. package/dist/resources/extensions/browser-tools/tools/codegen.js +242 -0
  36. package/dist/resources/extensions/browser-tools/tools/device.js +162 -0
  37. package/dist/resources/extensions/browser-tools/tools/extract.js +191 -0
  38. package/dist/resources/extensions/browser-tools/tools/forms.js +710 -0
  39. package/dist/resources/extensions/browser-tools/tools/injection-detect.js +178 -0
  40. package/dist/resources/extensions/browser-tools/tools/inspection.js +426 -0
  41. package/dist/resources/extensions/browser-tools/tools/intent.js +556 -0
  42. package/dist/resources/extensions/browser-tools/tools/interaction.js +776 -0
  43. package/dist/resources/extensions/browser-tools/tools/navigation.js +208 -0
  44. package/dist/resources/extensions/browser-tools/tools/network-mock.js +194 -0
  45. package/dist/resources/extensions/browser-tools/tools/pages.js +280 -0
  46. package/dist/resources/extensions/browser-tools/tools/pdf.js +74 -0
  47. package/dist/resources/extensions/browser-tools/tools/refs.js +485 -0
  48. package/dist/resources/extensions/browser-tools/tools/screenshot.js +87 -0
  49. package/dist/resources/extensions/browser-tools/tools/session.js +375 -0
  50. package/dist/resources/extensions/browser-tools/tools/state-persistence.js +180 -0
  51. package/dist/resources/extensions/browser-tools/tools/visual-diff.js +174 -0
  52. package/dist/resources/extensions/browser-tools/tools/wait.js +201 -0
  53. package/dist/resources/extensions/browser-tools/tools/zoom.js +90 -0
  54. package/dist/resources/extensions/browser-tools/utils.js +490 -0
  55. package/dist/resources/extensions/context7/index.js +337 -0
  56. package/dist/resources/extensions/get-secrets-from-user.js +492 -0
  57. package/dist/resources/extensions/google-search/index.js +373 -0
  58. package/dist/resources/extensions/gsd/activity-log.js +146 -0
  59. package/dist/resources/extensions/gsd/atomic-write.js +38 -0
  60. package/dist/resources/extensions/gsd/auto/session.js +182 -0
  61. package/dist/resources/extensions/gsd/auto-budget.js +30 -0
  62. package/dist/resources/extensions/gsd/auto-dashboard.js +429 -0
  63. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +185 -0
  64. package/dist/resources/extensions/gsd/auto-dispatch.js +353 -0
  65. package/dist/resources/extensions/gsd/auto-loop.js +956 -0
  66. package/dist/resources/extensions/gsd/auto-model-selection.js +133 -0
  67. package/dist/resources/extensions/gsd/auto-observability.js +56 -0
  68. package/dist/resources/extensions/gsd/auto-post-unit.js +385 -0
  69. package/dist/resources/extensions/gsd/auto-prompts.js +1153 -0
  70. package/dist/resources/extensions/gsd/auto-recovery.js +512 -0
  71. package/dist/resources/extensions/gsd/auto-start.js +414 -0
  72. package/dist/resources/extensions/gsd/auto-supervisor.js +47 -0
  73. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +183 -0
  74. package/dist/resources/extensions/gsd/auto-timers.js +180 -0
  75. package/dist/resources/extensions/gsd/auto-tool-tracking.js +50 -0
  76. package/dist/resources/extensions/gsd/auto-unit-closeout.js +30 -0
  77. package/dist/resources/extensions/gsd/auto-verification.js +171 -0
  78. package/dist/resources/extensions/gsd/auto-worktree-sync.js +167 -0
  79. package/dist/resources/extensions/gsd/auto-worktree.js +830 -0
  80. package/dist/resources/extensions/gsd/auto.js +765 -0
  81. package/dist/resources/extensions/gsd/{cache.ts → cache.js} +5 -7
  82. package/dist/resources/extensions/gsd/captures.js +354 -0
  83. package/dist/resources/extensions/gsd/claude-import.js +540 -0
  84. package/dist/resources/extensions/gsd/collision-diagnostics.js +226 -0
  85. package/dist/resources/extensions/gsd/commands-bootstrap.js +223 -0
  86. package/dist/resources/extensions/gsd/commands-config.js +89 -0
  87. package/dist/resources/extensions/gsd/commands-extensions.js +259 -0
  88. package/dist/resources/extensions/gsd/commands-handlers.js +310 -0
  89. package/dist/resources/extensions/gsd/commands-inspect.js +70 -0
  90. package/dist/resources/extensions/gsd/commands-logs.js +468 -0
  91. package/dist/resources/extensions/gsd/commands-maintenance.js +185 -0
  92. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +660 -0
  93. package/dist/resources/extensions/gsd/commands-workflow-templates.js +408 -0
  94. package/dist/resources/extensions/gsd/commands.js +1024 -0
  95. package/dist/resources/extensions/gsd/complexity-classifier.js +257 -0
  96. package/dist/resources/extensions/gsd/{constants.ts → constants.js} +0 -6
  97. package/dist/resources/extensions/gsd/context-budget.js +187 -0
  98. package/dist/resources/extensions/gsd/context-store.js +165 -0
  99. package/dist/resources/extensions/gsd/crash-recovery.js +110 -0
  100. package/dist/resources/extensions/gsd/dashboard-overlay.js +562 -0
  101. package/dist/resources/extensions/gsd/db-writer.js +298 -0
  102. package/dist/resources/extensions/gsd/debug-logger.js +161 -0
  103. package/dist/resources/extensions/gsd/detection.js +373 -0
  104. package/dist/resources/extensions/gsd/diff-context.js +168 -0
  105. package/dist/resources/extensions/gsd/dispatch-guard.js +75 -0
  106. package/dist/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  107. package/dist/resources/extensions/gsd/doctor-checks.js +562 -0
  108. package/dist/resources/extensions/gsd/doctor-environment.js +429 -0
  109. package/dist/resources/extensions/gsd/doctor-format.js +71 -0
  110. package/dist/resources/extensions/gsd/doctor-proactive.js +239 -0
  111. package/dist/resources/extensions/gsd/doctor-providers.js +292 -0
  112. package/dist/resources/extensions/gsd/doctor-types.js +12 -0
  113. package/dist/resources/extensions/gsd/doctor.js +672 -0
  114. package/dist/resources/extensions/gsd/error-utils.js +6 -0
  115. package/dist/resources/extensions/gsd/{errors.ts → errors.js} +6 -11
  116. package/dist/resources/extensions/gsd/exit-command.js +11 -0
  117. package/dist/resources/extensions/gsd/{export-html.ts → export-html.js} +482 -614
  118. package/dist/resources/extensions/gsd/export.js +268 -0
  119. package/dist/resources/extensions/gsd/file-watcher.js +76 -0
  120. package/dist/resources/extensions/gsd/files.js +937 -0
  121. package/dist/resources/extensions/gsd/forensics.js +511 -0
  122. package/dist/resources/extensions/gsd/{git-constants.ts → git-constants.js} +4 -5
  123. package/dist/resources/extensions/gsd/git-self-heal.js +113 -0
  124. package/dist/resources/extensions/gsd/git-service.js +460 -0
  125. package/dist/resources/extensions/gsd/{gitignore.ts → gitignore.js} +98 -125
  126. package/dist/resources/extensions/gsd/gsd-db.js +735 -0
  127. package/dist/resources/extensions/gsd/guided-flow-queue.js +366 -0
  128. package/dist/resources/extensions/gsd/guided-flow.js +1158 -0
  129. package/dist/resources/extensions/gsd/health-widget.js +141 -0
  130. package/dist/resources/extensions/gsd/history.js +118 -0
  131. package/dist/resources/extensions/gsd/index.js +1114 -0
  132. package/dist/resources/extensions/gsd/init-wizard.js +479 -0
  133. package/dist/resources/extensions/gsd/json-persistence.js +62 -0
  134. package/dist/resources/extensions/gsd/{jsonl-utils.ts → jsonl-utils.js} +10 -7
  135. package/dist/resources/extensions/gsd/key-manager.js +829 -0
  136. package/dist/resources/extensions/gsd/marketplace-discovery.js +356 -0
  137. package/dist/resources/extensions/gsd/md-importer.js +440 -0
  138. package/dist/resources/extensions/gsd/memory-extractor.js +295 -0
  139. package/dist/resources/extensions/gsd/memory-store.js +351 -0
  140. package/dist/resources/extensions/gsd/metrics.js +377 -0
  141. package/dist/resources/extensions/gsd/migrate/command.js +157 -0
  142. package/dist/resources/extensions/gsd/migrate/index.js +7 -0
  143. package/dist/resources/extensions/gsd/migrate/parser.js +268 -0
  144. package/dist/resources/extensions/gsd/migrate/parsers.js +477 -0
  145. package/dist/resources/extensions/gsd/migrate/preview.js +47 -0
  146. package/dist/resources/extensions/gsd/migrate/transformer.js +278 -0
  147. package/dist/resources/extensions/gsd/migrate/types.js +4 -0
  148. package/dist/resources/extensions/gsd/migrate/validator.js +41 -0
  149. package/dist/resources/extensions/gsd/migrate/writer.js +477 -0
  150. package/dist/resources/extensions/gsd/migrate-external.js +130 -0
  151. package/dist/resources/extensions/gsd/milestone-actions.js +111 -0
  152. package/dist/resources/extensions/gsd/{milestone-ids.ts → milestone-ids.js} +50 -63
  153. package/dist/resources/extensions/gsd/model-cost-table.js +48 -0
  154. package/dist/resources/extensions/gsd/model-router.js +187 -0
  155. package/dist/resources/extensions/gsd/namespaced-registry.js +322 -0
  156. package/dist/resources/extensions/gsd/namespaced-resolver.js +176 -0
  157. package/dist/resources/extensions/gsd/native-git-bridge.js +842 -0
  158. package/dist/resources/extensions/gsd/native-parser-bridge.js +156 -0
  159. package/dist/resources/extensions/gsd/notifications.js +58 -0
  160. package/dist/resources/extensions/gsd/observability-validator.js +398 -0
  161. package/dist/resources/extensions/gsd/parallel-eligibility.js +182 -0
  162. package/dist/resources/extensions/gsd/parallel-merge.js +121 -0
  163. package/dist/resources/extensions/gsd/parallel-orchestrator.js +687 -0
  164. package/dist/resources/extensions/gsd/paths.js +414 -0
  165. package/dist/resources/extensions/gsd/plugin-importer.js +254 -0
  166. package/dist/resources/extensions/gsd/post-unit-hooks.js +433 -0
  167. package/dist/resources/extensions/gsd/preferences-models.js +294 -0
  168. package/dist/resources/extensions/gsd/preferences-skills.js +154 -0
  169. package/dist/resources/extensions/gsd/preferences-types.js +73 -0
  170. package/dist/resources/extensions/gsd/preferences-validation.js +607 -0
  171. package/dist/resources/extensions/gsd/preferences.js +325 -0
  172. package/dist/resources/extensions/gsd/progress-score.js +102 -0
  173. package/dist/resources/extensions/gsd/prompt-cache-optimizer.js +150 -0
  174. package/dist/resources/extensions/gsd/prompt-compressor.js +393 -0
  175. package/dist/resources/extensions/gsd/prompt-loader.js +119 -0
  176. package/dist/resources/extensions/gsd/prompt-ordering.js +170 -0
  177. package/dist/resources/extensions/gsd/provider-error-pause.js +60 -0
  178. package/dist/resources/extensions/gsd/queue-order.js +178 -0
  179. package/dist/resources/extensions/gsd/queue-reorder-ui.js +234 -0
  180. package/dist/resources/extensions/gsd/quick.js +206 -0
  181. package/dist/resources/extensions/gsd/repo-identity.js +187 -0
  182. package/dist/resources/extensions/gsd/{reports.ts → reports.js} +146 -241
  183. package/dist/resources/extensions/gsd/{resource-version.ts → resource-version.js} +50 -53
  184. package/dist/resources/extensions/gsd/roadmap-slices.js +130 -0
  185. package/dist/resources/extensions/gsd/routing-history.js +210 -0
  186. package/dist/resources/extensions/gsd/safe-fs.js +52 -0
  187. package/dist/resources/extensions/gsd/semantic-chunker.js +254 -0
  188. package/dist/resources/extensions/gsd/session-forensics.js +427 -0
  189. package/dist/resources/extensions/gsd/session-lock.js +397 -0
  190. package/dist/resources/extensions/gsd/session-status-io.js +134 -0
  191. package/dist/resources/extensions/gsd/skill-discovery.js +121 -0
  192. package/dist/resources/extensions/gsd/skill-health.js +324 -0
  193. package/dist/resources/extensions/gsd/{skill-telemetry.ts → skill-telemetry.js} +58 -74
  194. package/dist/resources/extensions/gsd/state.js +653 -0
  195. package/dist/resources/extensions/gsd/structured-data-formatter.js +97 -0
  196. package/dist/resources/extensions/gsd/summary-distiller.js +212 -0
  197. package/dist/resources/extensions/gsd/templates/preferences.md +1 -0
  198. package/dist/resources/extensions/gsd/token-counter.js +54 -0
  199. package/dist/resources/extensions/gsd/triage-resolution.js +217 -0
  200. package/dist/resources/extensions/gsd/triage-ui.js +125 -0
  201. package/dist/resources/extensions/gsd/types.js +4 -0
  202. package/dist/resources/extensions/gsd/undo.js +205 -0
  203. package/dist/resources/extensions/gsd/unit-id.js +7 -0
  204. package/dist/resources/extensions/gsd/unit-runtime.js +131 -0
  205. package/dist/resources/extensions/gsd/validate-directory.js +143 -0
  206. package/dist/resources/extensions/gsd/verification-evidence.js +122 -0
  207. package/dist/resources/extensions/gsd/verification-gate.js +514 -0
  208. package/dist/resources/extensions/gsd/visualizer-data.js +612 -0
  209. package/dist/resources/extensions/gsd/visualizer-overlay.js +501 -0
  210. package/dist/resources/extensions/gsd/visualizer-views.js +893 -0
  211. package/dist/resources/extensions/gsd/workflow-templates.js +188 -0
  212. package/dist/resources/extensions/gsd/workspace-index.js +139 -0
  213. package/dist/resources/extensions/gsd/worktree-command-bootstrap.js +40 -0
  214. package/dist/resources/extensions/gsd/worktree-command.js +682 -0
  215. package/dist/resources/extensions/gsd/worktree-manager.js +358 -0
  216. package/dist/resources/extensions/gsd/worktree-resolver.js +344 -0
  217. package/dist/resources/extensions/gsd/worktree.js +199 -0
  218. package/dist/resources/extensions/mac-tools/index.js +768 -0
  219. package/dist/resources/extensions/mcp-client/index.js +364 -0
  220. package/dist/resources/extensions/package.json +3 -0
  221. package/dist/resources/extensions/remote-questions/config.js +70 -0
  222. package/dist/resources/extensions/remote-questions/discord-adapter.js +134 -0
  223. package/dist/resources/extensions/remote-questions/format.js +234 -0
  224. package/dist/resources/extensions/remote-questions/http-client.js +43 -0
  225. package/dist/resources/extensions/remote-questions/manager.js +156 -0
  226. package/dist/resources/extensions/remote-questions/{mod.ts → mod.js} +1 -10
  227. package/dist/resources/extensions/remote-questions/notify.js +89 -0
  228. package/dist/resources/extensions/remote-questions/remote-command.js +453 -0
  229. package/dist/resources/extensions/remote-questions/slack-adapter.js +123 -0
  230. package/dist/resources/extensions/remote-questions/status.js +25 -0
  231. package/dist/resources/extensions/remote-questions/store.js +70 -0
  232. package/dist/resources/extensions/remote-questions/telegram-adapter.js +123 -0
  233. package/dist/resources/extensions/remote-questions/types.js +5 -0
  234. package/dist/resources/extensions/search-the-web/cache.js +74 -0
  235. package/dist/resources/extensions/search-the-web/command-search-provider.js +79 -0
  236. package/dist/resources/extensions/search-the-web/format.js +161 -0
  237. package/dist/resources/extensions/search-the-web/http.js +178 -0
  238. package/dist/resources/extensions/search-the-web/index.js +41 -0
  239. package/dist/resources/extensions/search-the-web/native-search.js +166 -0
  240. package/dist/resources/extensions/search-the-web/provider.js +143 -0
  241. package/dist/resources/extensions/search-the-web/tavily.js +82 -0
  242. package/dist/resources/extensions/search-the-web/tool-fetch-page.js +452 -0
  243. package/dist/resources/extensions/search-the-web/tool-llm-context.js +455 -0
  244. package/dist/resources/extensions/search-the-web/tool-search.js +482 -0
  245. package/dist/resources/extensions/search-the-web/url-utils.js +121 -0
  246. package/dist/resources/extensions/shared/confirm-ui.js +96 -0
  247. package/dist/resources/extensions/shared/{format-utils.ts → format-utils.js} +85 -91
  248. package/dist/resources/extensions/shared/frontmatter.js +109 -0
  249. package/dist/resources/extensions/shared/interview-ui.js +569 -0
  250. package/dist/resources/extensions/shared/{mod.ts → mod.js} +2 -24
  251. package/dist/resources/extensions/shared/next-action-ui.js +168 -0
  252. package/dist/resources/extensions/shared/{path-display.ts → path-display.js} +2 -3
  253. package/dist/resources/extensions/shared/sanitize.js +17 -0
  254. package/dist/resources/extensions/shared/terminal.js +21 -0
  255. package/dist/resources/extensions/shared/ui.js +245 -0
  256. package/dist/resources/extensions/shared/wizard-ui.js +478 -0
  257. package/dist/resources/extensions/slash-commands/audit.js +72 -0
  258. package/dist/resources/extensions/slash-commands/clear.js +8 -0
  259. package/dist/resources/extensions/slash-commands/create-extension.js +264 -0
  260. package/dist/resources/extensions/slash-commands/create-slash-command.js +208 -0
  261. package/dist/resources/extensions/slash-commands/index.js +10 -0
  262. package/dist/resources/extensions/subagent/agents.js +103 -0
  263. package/dist/resources/extensions/subagent/index.js +905 -0
  264. package/dist/resources/extensions/subagent/isolation.js +384 -0
  265. package/dist/resources/extensions/subagent/worker-registry.js +73 -0
  266. package/dist/resources/extensions/ttsr/index.js +144 -0
  267. package/dist/resources/extensions/ttsr/rule-loader.js +70 -0
  268. package/dist/resources/extensions/ttsr/ttsr-manager.js +380 -0
  269. package/dist/resources/extensions/universal-config/discovery.js +94 -0
  270. package/dist/resources/extensions/universal-config/format.js +178 -0
  271. package/dist/resources/extensions/universal-config/index.js +99 -0
  272. package/dist/resources/extensions/universal-config/scanners.js +574 -0
  273. package/dist/resources/extensions/universal-config/tools.js +57 -0
  274. package/dist/resources/extensions/universal-config/types.js +8 -0
  275. package/dist/resources/extensions/voice/index.js +247 -0
  276. package/dist/startup-timings.d.ts +2 -0
  277. package/dist/startup-timings.js +22 -0
  278. package/dist/tool-bootstrap.js +59 -11
  279. package/dist/worktree-cli.js +7 -7
  280. package/package.json +1 -1
  281. package/packages/native/dist/native.d.ts +0 -2
  282. package/packages/native/dist/native.js +0 -2
  283. package/packages/native/src/native.ts +0 -3
  284. package/packages/pi-agent-core/dist/proxy.d.ts +1 -25
  285. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  286. package/packages/pi-agent-core/dist/proxy.js +1 -1
  287. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  288. package/packages/pi-agent-core/src/proxy.ts +1 -1
  289. package/packages/pi-ai/dist/api-registry.d.ts +0 -2
  290. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  291. package/packages/pi-ai/dist/api-registry.js +0 -10
  292. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  293. package/packages/pi-ai/dist/providers/anthropic.d.ts +0 -8
  294. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  295. package/packages/pi-ai/dist/providers/anthropic.js +1 -1
  296. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  297. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts +0 -1
  298. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
  299. package/packages/pi-ai/dist/providers/github-copilot-headers.js +1 -1
  300. package/packages/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
  301. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts +1 -43
  302. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  303. package/packages/pi-ai/dist/providers/google-gemini-cli.js +2 -2
  304. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  305. package/packages/pi-ai/dist/providers/google-shared.d.ts +0 -4
  306. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  307. package/packages/pi-ai/dist/providers/google-shared.js +1 -1
  308. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  309. package/packages/pi-ai/dist/providers/register-builtins.d.ts +0 -1
  310. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/providers/register-builtins.js +1 -1
  312. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  313. package/packages/pi-ai/dist/utils/event-stream.d.ts +0 -2
  314. package/packages/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  315. package/packages/pi-ai/dist/utils/event-stream.js +0 -4
  316. package/packages/pi-ai/dist/utils/event-stream.js.map +1 -1
  317. package/packages/pi-ai/dist/utils/overflow.d.ts +0 -4
  318. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  319. package/packages/pi-ai/dist/utils/overflow.js +0 -6
  320. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  321. package/packages/pi-ai/dist/utils/validation.d.ts +0 -8
  322. package/packages/pi-ai/dist/utils/validation.d.ts.map +1 -1
  323. package/packages/pi-ai/dist/utils/validation.js +0 -14
  324. package/packages/pi-ai/dist/utils/validation.js.map +1 -1
  325. package/packages/pi-ai/src/api-registry.ts +0 -12
  326. package/packages/pi-ai/src/providers/anthropic.ts +1 -1
  327. package/packages/pi-ai/src/providers/github-copilot-headers.ts +1 -1
  328. package/packages/pi-ai/src/providers/google-gemini-cli.ts +2 -2
  329. package/packages/pi-ai/src/providers/google-shared.ts +1 -1
  330. package/packages/pi-ai/src/providers/register-builtins.ts +1 -1
  331. package/packages/pi-ai/src/utils/event-stream.ts +0 -5
  332. package/packages/pi-ai/src/utils/overflow.ts +1 -8
  333. package/packages/pi-ai/src/utils/validation.ts +0 -15
  334. package/packages/pi-coding-agent/dist/config.d.ts +0 -9
  335. package/packages/pi-coding-agent/dist/config.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/config.js +4 -8
  337. package/packages/pi-coding-agent/dist/config.js.map +1 -1
  338. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  339. package/packages/pi-coding-agent/dist/core/agent-session.js +9 -0
  340. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  341. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts +0 -4
  342. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  343. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js +1 -1
  344. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js.map +1 -1
  345. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  346. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
  348. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +1 -0
  350. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/extensions/loader.js +31 -4
  352. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +0 -5
  354. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/core/extensions/runner.js +0 -13
  356. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/core/keybindings.d.ts +0 -8
  358. package/packages/pi-coding-agent/dist/core/keybindings.d.ts.map +1 -1
  359. package/packages/pi-coding-agent/dist/core/keybindings.js +2 -2
  360. package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
  361. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +0 -17
  362. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/lsp/client.js +3 -62
  364. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +0 -2
  366. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  367. package/packages/pi-coding-agent/dist/core/lsp/config.js +0 -7
  368. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts +0 -5
  370. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/lsp/edits.js +1 -1
  372. package/packages/pi-coding-agent/dist/core/lsp/edits.js.map +1 -1
  373. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts +0 -1
  374. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +1 -1
  376. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  377. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts +1 -6
  378. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/lsp/utils.js +1 -28
  380. package/packages/pi-coding-agent/dist/core/lsp/utils.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/messages.d.ts +0 -8
  382. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/messages.js +5 -5
  384. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -3
  386. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/model-registry.js +1 -3
  388. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts +1 -26
  390. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  391. package/packages/pi-coding-agent/dist/core/model-resolver.js +3 -59
  392. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  393. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts +0 -17
  394. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/core/prompt-templates.js +2 -2
  396. package/packages/pi-coding-agent/dist/core/prompt-templates.js.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +0 -4
  398. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/session-manager.js +2 -4
  400. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  401. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +0 -12
  402. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  403. package/packages/pi-coding-agent/dist/core/settings-manager.js +2 -2
  404. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  405. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  406. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  407. package/packages/pi-coding-agent/dist/index.js +1 -1
  408. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  409. package/packages/pi-coding-agent/dist/migrations.d.ts +0 -16
  410. package/packages/pi-coding-agent/dist/migrations.d.ts.map +1 -1
  411. package/packages/pi-coding-agent/dist/migrations.js +2 -2
  412. package/packages/pi-coding-agent/dist/migrations.js.map +1 -1
  413. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts +0 -2
  414. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js +2 -2
  416. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  417. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -24
  418. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  419. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +50 -512
  420. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  421. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +71 -0
  422. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -0
  423. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +514 -0
  424. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -0
  425. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +65 -4
  426. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  427. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +6 -23
  428. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  429. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +12 -0
  430. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  431. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +175 -0
  432. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -0
  433. package/packages/pi-coding-agent/dist/utils/changelog.d.ts +0 -4
  434. package/packages/pi-coding-agent/dist/utils/changelog.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/utils/changelog.js +1 -1
  436. package/packages/pi-coding-agent/dist/utils/changelog.js.map +1 -1
  437. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts +0 -1
  438. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts.map +1 -1
  439. package/packages/pi-coding-agent/dist/utils/clipboard-image.js +1 -1
  440. package/packages/pi-coding-agent/dist/utils/clipboard-image.js.map +1 -1
  441. package/packages/pi-coding-agent/dist/utils/photon.d.ts +0 -19
  442. package/packages/pi-coding-agent/dist/utils/photon.d.ts.map +1 -1
  443. package/packages/pi-coding-agent/dist/utils/photon.js +1 -120
  444. package/packages/pi-coding-agent/dist/utils/photon.js.map +1 -1
  445. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts +0 -1
  446. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts.map +1 -1
  447. package/packages/pi-coding-agent/dist/utils/tools-manager.js +1 -1
  448. package/packages/pi-coding-agent/dist/utils/tools-manager.js.map +1 -1
  449. package/packages/pi-coding-agent/package.json +1 -1
  450. package/packages/pi-coding-agent/src/config.ts +5 -10
  451. package/packages/pi-coding-agent/src/core/agent-session.ts +9 -0
  452. package/packages/pi-coding-agent/src/core/export-html/ansi-to-html.ts +1 -1
  453. package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -0
  454. package/packages/pi-coding-agent/src/core/extensions/loader.ts +35 -4
  455. package/packages/pi-coding-agent/src/core/extensions/runner.ts +0 -13
  456. package/packages/pi-coding-agent/src/core/keybindings.ts +2 -2
  457. package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -73
  458. package/packages/pi-coding-agent/src/core/lsp/config.ts +0 -11
  459. package/packages/pi-coding-agent/src/core/lsp/edits.ts +1 -1
  460. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +1 -1
  461. package/packages/pi-coding-agent/src/core/lsp/utils.ts +1 -33
  462. package/packages/pi-coding-agent/src/core/messages.ts +5 -5
  463. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -2
  464. package/packages/pi-coding-agent/src/core/model-resolver.ts +3 -77
  465. package/packages/pi-coding-agent/src/core/prompt-templates.ts +2 -2
  466. package/packages/pi-coding-agent/src/core/session-manager.ts +2 -4
  467. package/packages/pi-coding-agent/src/core/settings-manager.ts +2 -2
  468. package/packages/pi-coding-agent/src/index.ts +1 -0
  469. package/packages/pi-coding-agent/src/migrations.ts +2 -2
  470. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector-search.ts +2 -2
  471. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -561
  472. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +653 -0
  473. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +7 -26
  474. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +196 -0
  475. package/packages/pi-coding-agent/src/utils/changelog.ts +1 -1
  476. package/packages/pi-coding-agent/src/utils/clipboard-image.ts +1 -1
  477. package/packages/pi-coding-agent/src/utils/photon.ts +0 -137
  478. package/packages/pi-coding-agent/src/utils/tools-manager.ts +1 -1
  479. package/packages/pi-tui/dist/components/editor.d.ts +0 -10
  480. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  481. package/packages/pi-tui/dist/components/editor.js +1 -1
  482. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  483. package/packages/pi-tui/dist/overlay-layout.d.ts +55 -0
  484. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -0
  485. package/packages/pi-tui/dist/overlay-layout.js +288 -0
  486. package/packages/pi-tui/dist/overlay-layout.js.map +1 -0
  487. package/packages/pi-tui/dist/tui.d.ts +0 -22
  488. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  489. package/packages/pi-tui/dist/tui.js +6 -272
  490. package/packages/pi-tui/dist/tui.js.map +1 -1
  491. package/packages/pi-tui/dist/utils.d.ts +0 -7
  492. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  493. package/packages/pi-tui/dist/utils.js +0 -44
  494. package/packages/pi-tui/dist/utils.js.map +1 -1
  495. package/packages/pi-tui/src/components/editor.ts +1 -1
  496. package/packages/pi-tui/src/overlay-layout.ts +372 -0
  497. package/packages/pi-tui/src/tui.ts +11 -312
  498. package/packages/pi-tui/src/utils.ts +0 -43
  499. package/pkg/dist/core/export-html/ansi-to-html.d.ts +0 -4
  500. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  501. package/pkg/dist/core/export-html/ansi-to-html.js +1 -1
  502. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -1
  503. package/pkg/dist/modes/interactive/theme/theme.d.ts +65 -4
  504. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  505. package/pkg/dist/modes/interactive/theme/theme.js +6 -23
  506. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  507. package/pkg/dist/modes/interactive/theme/themes.d.ts +12 -0
  508. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  509. package/pkg/dist/modes/interactive/theme/themes.js +175 -0
  510. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -0
  511. package/pkg/package.json +1 -1
  512. package/src/resources/extensions/bg-shell/index.ts +41 -46
  513. package/src/resources/extensions/browser-tools/index.ts +156 -67
  514. package/src/resources/extensions/gsd/auto/session.ts +47 -30
  515. package/src/resources/extensions/gsd/auto-dashboard.ts +28 -131
  516. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +6 -1
  517. package/src/resources/extensions/gsd/auto-dispatch.ts +135 -91
  518. package/src/resources/extensions/gsd/auto-loop.ts +1665 -0
  519. package/src/resources/extensions/gsd/auto-observability.ts +4 -2
  520. package/src/resources/extensions/gsd/auto-post-unit.ts +85 -228
  521. package/src/resources/extensions/gsd/auto-prompts.ts +138 -109
  522. package/src/resources/extensions/gsd/auto-recovery.ts +124 -118
  523. package/src/resources/extensions/gsd/auto-start.ts +440 -354
  524. package/src/resources/extensions/gsd/auto-supervisor.ts +5 -12
  525. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +8 -8
  526. package/src/resources/extensions/gsd/auto-timers.ts +3 -4
  527. package/src/resources/extensions/gsd/auto-verification.ts +76 -72
  528. package/src/resources/extensions/gsd/auto-worktree-sync.ts +204 -0
  529. package/src/resources/extensions/gsd/auto-worktree.ts +453 -133
  530. package/src/resources/extensions/gsd/auto.ts +516 -1189
  531. package/src/resources/extensions/gsd/captures.ts +10 -4
  532. package/src/resources/extensions/gsd/commands-bootstrap.ts +252 -0
  533. package/src/resources/extensions/gsd/commands.ts +39 -31
  534. package/src/resources/extensions/gsd/dispatch-guard.ts +13 -9
  535. package/src/resources/extensions/gsd/docs/preferences-reference.md +25 -18
  536. package/src/resources/extensions/gsd/doctor-checks.ts +3 -4
  537. package/src/resources/extensions/gsd/git-service.ts +32 -12
  538. package/src/resources/extensions/gsd/gitignore.ts +4 -2
  539. package/src/resources/extensions/gsd/gsd-db.ts +375 -180
  540. package/src/resources/extensions/gsd/guided-flow.ts +22 -11
  541. package/src/resources/extensions/gsd/index.ts +76 -163
  542. package/src/resources/extensions/gsd/post-unit-hooks.ts +13 -13
  543. package/src/resources/extensions/gsd/progress-score.ts +65 -200
  544. package/src/resources/extensions/gsd/quick.ts +121 -76
  545. package/src/resources/extensions/gsd/repo-identity.ts +56 -22
  546. package/src/resources/extensions/gsd/session-lock.ts +17 -0
  547. package/src/resources/extensions/gsd/templates/preferences.md +1 -0
  548. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +32 -59
  549. package/src/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +75 -27
  550. package/src/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +1 -1
  551. package/src/resources/extensions/gsd/tests/auto-lock-creation.test.ts +37 -0
  552. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1458 -0
  553. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +8 -162
  554. package/src/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +2 -108
  555. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +1 -3
  556. package/src/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -3
  557. package/src/resources/extensions/gsd/tests/auto-worktree.test.ts +58 -0
  558. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -55
  559. package/src/resources/extensions/gsd/tests/git-service.test.ts +16 -7
  560. package/src/resources/extensions/gsd/tests/headless-query.test.ts +22 -0
  561. package/src/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +8 -11
  562. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +4 -6
  563. package/src/resources/extensions/gsd/tests/quick-branch-lifecycle.test.ts +281 -0
  564. package/src/resources/extensions/gsd/tests/repo-identity-worktree.test.ts +71 -0
  565. package/src/resources/extensions/gsd/tests/run-uat.test.ts +3 -3
  566. package/src/resources/extensions/gsd/tests/session-lock-regression.test.ts +64 -0
  567. package/src/resources/extensions/gsd/tests/sidecar-queue.test.ts +181 -0
  568. package/src/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -3
  569. package/src/resources/extensions/gsd/tests/token-profile.test.ts +6 -6
  570. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +6 -6
  571. package/src/resources/extensions/gsd/tests/undo.test.ts +6 -0
  572. package/src/resources/extensions/gsd/tests/verification-evidence.test.ts +24 -26
  573. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +7 -136
  574. package/src/resources/extensions/gsd/tests/worktree-db-integration.test.ts +205 -0
  575. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +442 -0
  576. package/src/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -3
  577. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +705 -0
  578. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +57 -106
  579. package/src/resources/extensions/gsd/tests/worktree.test.ts +5 -1
  580. package/src/resources/extensions/gsd/tests/write-gate.test.ts +43 -132
  581. package/src/resources/extensions/gsd/types.ts +90 -77
  582. package/src/resources/extensions/gsd/undo.ts +42 -46
  583. package/src/resources/extensions/gsd/unit-runtime.ts +14 -18
  584. package/src/resources/extensions/gsd/verification-evidence.ts +0 -2
  585. package/src/resources/extensions/gsd/verification-gate.ts +4 -16
  586. package/src/resources/extensions/gsd/worktree-command-bootstrap.ts +46 -0
  587. package/src/resources/extensions/gsd/worktree-command.ts +29 -11
  588. package/src/resources/extensions/gsd/worktree-manager.ts +2 -3
  589. package/src/resources/extensions/gsd/worktree-resolver.ts +485 -0
  590. package/src/resources/extensions/gsd/worktree.ts +7 -44
  591. package/src/resources/extensions/mcp-client/index.ts +2 -1
  592. package/src/resources/extensions/package.json +3 -0
  593. package/src/resources/extensions/search-the-web/command-search-provider.ts +1 -1
  594. package/src/resources/extensions/search-the-web/index.ts +35 -52
  595. package/src/resources/extensions/search-the-web/tavily.ts +1 -1
  596. package/dist/resources/extensions/ask-user-questions.ts +0 -290
  597. package/dist/resources/extensions/async-jobs/async-bash-tool.ts +0 -212
  598. package/dist/resources/extensions/async-jobs/await-tool.ts +0 -103
  599. package/dist/resources/extensions/async-jobs/cancel-job-tool.ts +0 -35
  600. package/dist/resources/extensions/async-jobs/index.ts +0 -141
  601. package/dist/resources/extensions/async-jobs/job-manager.ts +0 -211
  602. package/dist/resources/extensions/aws-auth/index.ts +0 -144
  603. package/dist/resources/extensions/bg-shell/bg-shell-command.ts +0 -219
  604. package/dist/resources/extensions/bg-shell/bg-shell-lifecycle.ts +0 -400
  605. package/dist/resources/extensions/bg-shell/bg-shell-tool.ts +0 -985
  606. package/dist/resources/extensions/bg-shell/index.ts +0 -59
  607. package/dist/resources/extensions/bg-shell/interaction.ts +0 -198
  608. package/dist/resources/extensions/bg-shell/output-formatter.ts +0 -279
  609. package/dist/resources/extensions/bg-shell/overlay.ts +0 -437
  610. package/dist/resources/extensions/bg-shell/process-manager.ts +0 -464
  611. package/dist/resources/extensions/bg-shell/readiness-detector.ts +0 -126
  612. package/dist/resources/extensions/bg-shell/types.ts +0 -303
  613. package/dist/resources/extensions/bg-shell/utilities.ts +0 -57
  614. package/dist/resources/extensions/browser-tools/capture.ts +0 -199
  615. package/dist/resources/extensions/browser-tools/core.ts +0 -1196
  616. package/dist/resources/extensions/browser-tools/index.ts +0 -71
  617. package/dist/resources/extensions/browser-tools/lifecycle.ts +0 -270
  618. package/dist/resources/extensions/browser-tools/refs.ts +0 -264
  619. package/dist/resources/extensions/browser-tools/settle.ts +0 -197
  620. package/dist/resources/extensions/browser-tools/state.ts +0 -408
  621. package/dist/resources/extensions/browser-tools/tools/action-cache.ts +0 -216
  622. package/dist/resources/extensions/browser-tools/tools/assertions.ts +0 -342
  623. package/dist/resources/extensions/browser-tools/tools/codegen.ts +0 -274
  624. package/dist/resources/extensions/browser-tools/tools/device.ts +0 -183
  625. package/dist/resources/extensions/browser-tools/tools/extract.ts +0 -229
  626. package/dist/resources/extensions/browser-tools/tools/forms.ts +0 -801
  627. package/dist/resources/extensions/browser-tools/tools/injection-detect.ts +0 -221
  628. package/dist/resources/extensions/browser-tools/tools/inspection.ts +0 -492
  629. package/dist/resources/extensions/browser-tools/tools/intent.ts +0 -614
  630. package/dist/resources/extensions/browser-tools/tools/interaction.ts +0 -865
  631. package/dist/resources/extensions/browser-tools/tools/navigation.ts +0 -232
  632. package/dist/resources/extensions/browser-tools/tools/network-mock.ts +0 -244
  633. package/dist/resources/extensions/browser-tools/tools/pages.ts +0 -303
  634. package/dist/resources/extensions/browser-tools/tools/pdf.ts +0 -92
  635. package/dist/resources/extensions/browser-tools/tools/refs.ts +0 -541
  636. package/dist/resources/extensions/browser-tools/tools/screenshot.ts +0 -101
  637. package/dist/resources/extensions/browser-tools/tools/session.ts +0 -400
  638. package/dist/resources/extensions/browser-tools/tools/state-persistence.ts +0 -202
  639. package/dist/resources/extensions/browser-tools/tools/visual-diff.ts +0 -209
  640. package/dist/resources/extensions/browser-tools/tools/wait.ts +0 -247
  641. package/dist/resources/extensions/browser-tools/tools/zoom.ts +0 -104
  642. package/dist/resources/extensions/browser-tools/utils.ts +0 -660
  643. package/dist/resources/extensions/context7/index.ts +0 -428
  644. package/dist/resources/extensions/get-secrets-from-user.ts +0 -607
  645. package/dist/resources/extensions/google-search/index.ts +0 -466
  646. package/dist/resources/extensions/gsd/activity-log.ts +0 -162
  647. package/dist/resources/extensions/gsd/atomic-write.ts +0 -35
  648. package/dist/resources/extensions/gsd/auto/session.ts +0 -236
  649. package/dist/resources/extensions/gsd/auto-budget.ts +0 -32
  650. package/dist/resources/extensions/gsd/auto-constants.ts +0 -6
  651. package/dist/resources/extensions/gsd/auto-dashboard.ts +0 -626
  652. package/dist/resources/extensions/gsd/auto-direct-dispatch.ts +0 -224
  653. package/dist/resources/extensions/gsd/auto-dispatch.ts +0 -409
  654. package/dist/resources/extensions/gsd/auto-idempotency.ts +0 -151
  655. package/dist/resources/extensions/gsd/auto-model-selection.ts +0 -179
  656. package/dist/resources/extensions/gsd/auto-observability.ts +0 -72
  657. package/dist/resources/extensions/gsd/auto-post-unit.ts +0 -618
  658. package/dist/resources/extensions/gsd/auto-prompts.ts +0 -1273
  659. package/dist/resources/extensions/gsd/auto-recovery.ts +0 -578
  660. package/dist/resources/extensions/gsd/auto-start.ts +0 -483
  661. package/dist/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  662. package/dist/resources/extensions/gsd/auto-supervisor.ts +0 -61
  663. package/dist/resources/extensions/gsd/auto-timeout-recovery.ts +0 -263
  664. package/dist/resources/extensions/gsd/auto-timers.ts +0 -224
  665. package/dist/resources/extensions/gsd/auto-tool-tracking.ts +0 -54
  666. package/dist/resources/extensions/gsd/auto-unit-closeout.ts +0 -48
  667. package/dist/resources/extensions/gsd/auto-verification.ts +0 -229
  668. package/dist/resources/extensions/gsd/auto-worktree.ts +0 -658
  669. package/dist/resources/extensions/gsd/auto.ts +0 -1834
  670. package/dist/resources/extensions/gsd/captures.ts +0 -427
  671. package/dist/resources/extensions/gsd/claude-import.ts +0 -656
  672. package/dist/resources/extensions/gsd/collision-diagnostics.ts +0 -332
  673. package/dist/resources/extensions/gsd/commands-config.ts +0 -102
  674. package/dist/resources/extensions/gsd/commands-extensions.ts +0 -328
  675. package/dist/resources/extensions/gsd/commands-handlers.ts +0 -395
  676. package/dist/resources/extensions/gsd/commands-inspect.ts +0 -91
  677. package/dist/resources/extensions/gsd/commands-logs.ts +0 -536
  678. package/dist/resources/extensions/gsd/commands-maintenance.ts +0 -206
  679. package/dist/resources/extensions/gsd/commands-prefs-wizard.ts +0 -780
  680. package/dist/resources/extensions/gsd/commands-workflow-templates.ts +0 -543
  681. package/dist/resources/extensions/gsd/commands.ts +0 -1149
  682. package/dist/resources/extensions/gsd/complexity-classifier.ts +0 -320
  683. package/dist/resources/extensions/gsd/context-budget.ts +0 -266
  684. package/dist/resources/extensions/gsd/context-store.ts +0 -195
  685. package/dist/resources/extensions/gsd/crash-recovery.ts +0 -121
  686. package/dist/resources/extensions/gsd/dashboard-overlay.ts +0 -681
  687. package/dist/resources/extensions/gsd/db-writer.ts +0 -360
  688. package/dist/resources/extensions/gsd/debug-logger.ts +0 -178
  689. package/dist/resources/extensions/gsd/detection.ts +0 -470
  690. package/dist/resources/extensions/gsd/diff-context.ts +0 -214
  691. package/dist/resources/extensions/gsd/dispatch-guard.ts +0 -81
  692. package/dist/resources/extensions/gsd/doctor-checks.ts +0 -612
  693. package/dist/resources/extensions/gsd/doctor-environment.ts +0 -497
  694. package/dist/resources/extensions/gsd/doctor-format.ts +0 -78
  695. package/dist/resources/extensions/gsd/doctor-proactive.ts +0 -292
  696. package/dist/resources/extensions/gsd/doctor-providers.ts +0 -343
  697. package/dist/resources/extensions/gsd/doctor-types.ts +0 -87
  698. package/dist/resources/extensions/gsd/doctor.ts +0 -722
  699. package/dist/resources/extensions/gsd/error-utils.ts +0 -6
  700. package/dist/resources/extensions/gsd/exit-command.ts +0 -18
  701. package/dist/resources/extensions/gsd/export.ts +0 -317
  702. package/dist/resources/extensions/gsd/file-watcher.ts +0 -97
  703. package/dist/resources/extensions/gsd/files.ts +0 -1058
  704. package/dist/resources/extensions/gsd/forensics.ts +0 -629
  705. package/dist/resources/extensions/gsd/git-self-heal.ts +0 -127
  706. package/dist/resources/extensions/gsd/git-service.ts +0 -580
  707. package/dist/resources/extensions/gsd/gsd-db.ts +0 -685
  708. package/dist/resources/extensions/gsd/guided-flow-queue.ts +0 -440
  709. package/dist/resources/extensions/gsd/guided-flow.ts +0 -1303
  710. package/dist/resources/extensions/gsd/health-widget.ts +0 -167
  711. package/dist/resources/extensions/gsd/history.ts +0 -143
  712. package/dist/resources/extensions/gsd/index.ts +0 -1390
  713. package/dist/resources/extensions/gsd/init-wizard.ts +0 -587
  714. package/dist/resources/extensions/gsd/json-persistence.ts +0 -67
  715. package/dist/resources/extensions/gsd/key-manager.ts +0 -996
  716. package/dist/resources/extensions/gsd/marketplace-discovery.ts +0 -508
  717. package/dist/resources/extensions/gsd/md-importer.ts +0 -527
  718. package/dist/resources/extensions/gsd/mechanical-completion.ts +0 -430
  719. package/dist/resources/extensions/gsd/memory-extractor.ts +0 -352
  720. package/dist/resources/extensions/gsd/memory-store.ts +0 -441
  721. package/dist/resources/extensions/gsd/metrics.ts +0 -532
  722. package/dist/resources/extensions/gsd/migrate/command.ts +0 -219
  723. package/dist/resources/extensions/gsd/migrate/index.ts +0 -42
  724. package/dist/resources/extensions/gsd/migrate/parser.ts +0 -323
  725. package/dist/resources/extensions/gsd/migrate/parsers.ts +0 -539
  726. package/dist/resources/extensions/gsd/migrate/preview.ts +0 -48
  727. package/dist/resources/extensions/gsd/migrate/transformer.ts +0 -346
  728. package/dist/resources/extensions/gsd/migrate/types.ts +0 -370
  729. package/dist/resources/extensions/gsd/migrate/validator.ts +0 -55
  730. package/dist/resources/extensions/gsd/migrate/writer.ts +0 -579
  731. package/dist/resources/extensions/gsd/migrate-external.ts +0 -140
  732. package/dist/resources/extensions/gsd/milestone-actions.ts +0 -126
  733. package/dist/resources/extensions/gsd/model-cost-table.ts +0 -65
  734. package/dist/resources/extensions/gsd/model-router.ts +0 -256
  735. package/dist/resources/extensions/gsd/namespaced-registry.ts +0 -467
  736. package/dist/resources/extensions/gsd/namespaced-resolver.ts +0 -307
  737. package/dist/resources/extensions/gsd/native-git-bridge.ts +0 -1041
  738. package/dist/resources/extensions/gsd/native-parser-bridge.ts +0 -267
  739. package/dist/resources/extensions/gsd/notifications.ts +0 -87
  740. package/dist/resources/extensions/gsd/observability-validator.ts +0 -429
  741. package/dist/resources/extensions/gsd/parallel-eligibility.ts +0 -233
  742. package/dist/resources/extensions/gsd/parallel-merge.ts +0 -157
  743. package/dist/resources/extensions/gsd/parallel-orchestrator.ts +0 -826
  744. package/dist/resources/extensions/gsd/paths.ts +0 -449
  745. package/dist/resources/extensions/gsd/plugin-importer.ts +0 -411
  746. package/dist/resources/extensions/gsd/post-unit-hooks.ts +0 -520
  747. package/dist/resources/extensions/gsd/preferences-models.ts +0 -329
  748. package/dist/resources/extensions/gsd/preferences-skills.ts +0 -169
  749. package/dist/resources/extensions/gsd/preferences-types.ts +0 -229
  750. package/dist/resources/extensions/gsd/preferences-validation.ts +0 -590
  751. package/dist/resources/extensions/gsd/preferences.ts +0 -416
  752. package/dist/resources/extensions/gsd/progress-score.ts +0 -273
  753. package/dist/resources/extensions/gsd/prompt-cache-optimizer.ts +0 -213
  754. package/dist/resources/extensions/gsd/prompt-compressor.ts +0 -508
  755. package/dist/resources/extensions/gsd/prompt-loader.ts +0 -130
  756. package/dist/resources/extensions/gsd/prompt-ordering.ts +0 -200
  757. package/dist/resources/extensions/gsd/provider-error-pause.ts +0 -88
  758. package/dist/resources/extensions/gsd/queue-order.ts +0 -230
  759. package/dist/resources/extensions/gsd/queue-reorder-ui.ts +0 -276
  760. package/dist/resources/extensions/gsd/quick.ts +0 -212
  761. package/dist/resources/extensions/gsd/repo-identity.ts +0 -169
  762. package/dist/resources/extensions/gsd/roadmap-slices.ts +0 -149
  763. package/dist/resources/extensions/gsd/routing-history.ts +0 -286
  764. package/dist/resources/extensions/gsd/safe-fs.ts +0 -47
  765. package/dist/resources/extensions/gsd/semantic-chunker.ts +0 -336
  766. package/dist/resources/extensions/gsd/session-forensics.ts +0 -537
  767. package/dist/resources/extensions/gsd/session-lock.ts +0 -426
  768. package/dist/resources/extensions/gsd/session-status-io.ts +0 -179
  769. package/dist/resources/extensions/gsd/skill-discovery.ts +0 -139
  770. package/dist/resources/extensions/gsd/skill-health.ts +0 -417
  771. package/dist/resources/extensions/gsd/state.ts +0 -727
  772. package/dist/resources/extensions/gsd/structured-data-formatter.ts +0 -144
  773. package/dist/resources/extensions/gsd/summary-distiller.ts +0 -258
  774. package/dist/resources/extensions/gsd/tests/activity-log.test.ts +0 -213
  775. package/dist/resources/extensions/gsd/tests/agent-end-retry.test.ts +0 -107
  776. package/dist/resources/extensions/gsd/tests/all-milestones-complete-merge.test.ts +0 -200
  777. package/dist/resources/extensions/gsd/tests/auto-budget-alerts.test.ts +0 -50
  778. package/dist/resources/extensions/gsd/tests/auto-dashboard.test.ts +0 -166
  779. package/dist/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
  780. package/dist/resources/extensions/gsd/tests/auto-lock-creation.test.ts +0 -186
  781. package/dist/resources/extensions/gsd/tests/auto-preflight.test.ts +0 -40
  782. package/dist/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -640
  783. package/dist/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  784. package/dist/resources/extensions/gsd/tests/auto-secrets-gate.test.ts +0 -302
  785. package/dist/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +0 -257
  786. package/dist/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  787. package/dist/resources/extensions/gsd/tests/auto-worktree-milestone-merge.test.ts +0 -340
  788. package/dist/resources/extensions/gsd/tests/auto-worktree.test.ts +0 -167
  789. package/dist/resources/extensions/gsd/tests/budget-prediction.test.ts +0 -220
  790. package/dist/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -317
  791. package/dist/resources/extensions/gsd/tests/captures.test.ts +0 -438
  792. package/dist/resources/extensions/gsd/tests/claude-import-tui.test.ts +0 -351
  793. package/dist/resources/extensions/gsd/tests/collect-from-manifest.test.ts +0 -469
  794. package/dist/resources/extensions/gsd/tests/collision-diagnostics.test.ts +0 -705
  795. package/dist/resources/extensions/gsd/tests/commands-logs.test.ts +0 -241
  796. package/dist/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -209
  797. package/dist/resources/extensions/gsd/tests/complexity-classifier.test.ts +0 -181
  798. package/dist/resources/extensions/gsd/tests/context-budget.test.ts +0 -352
  799. package/dist/resources/extensions/gsd/tests/context-compression.test.ts +0 -193
  800. package/dist/resources/extensions/gsd/tests/context-store.test.ts +0 -462
  801. package/dist/resources/extensions/gsd/tests/continue-here.test.ts +0 -285
  802. package/dist/resources/extensions/gsd/tests/cost-projection.test.ts +0 -134
  803. package/dist/resources/extensions/gsd/tests/crash-recovery.test.ts +0 -134
  804. package/dist/resources/extensions/gsd/tests/dashboard-budget.test.ts +0 -346
  805. package/dist/resources/extensions/gsd/tests/db-writer.test.ts +0 -602
  806. package/dist/resources/extensions/gsd/tests/debug-logger.test.ts +0 -185
  807. package/dist/resources/extensions/gsd/tests/derive-state-db.test.ts +0 -405
  808. package/dist/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -421
  809. package/dist/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -308
  810. package/dist/resources/extensions/gsd/tests/derive-state.test.ts +0 -788
  811. package/dist/resources/extensions/gsd/tests/detection.test.ts +0 -398
  812. package/dist/resources/extensions/gsd/tests/diff-context.test.ts +0 -136
  813. package/dist/resources/extensions/gsd/tests/discuss-prompt.test.ts +0 -15
  814. package/dist/resources/extensions/gsd/tests/dispatch-guard.test.ts +0 -128
  815. package/dist/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +0 -132
  816. package/dist/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  817. package/dist/resources/extensions/gsd/tests/doctor-environment.test.ts +0 -314
  818. package/dist/resources/extensions/gsd/tests/doctor-fixlevel.test.ts +0 -245
  819. package/dist/resources/extensions/gsd/tests/doctor-git.test.ts +0 -344
  820. package/dist/resources/extensions/gsd/tests/doctor-proactive.test.ts +0 -278
  821. package/dist/resources/extensions/gsd/tests/doctor-providers.test.ts +0 -298
  822. package/dist/resources/extensions/gsd/tests/doctor-runtime.test.ts +0 -302
  823. package/dist/resources/extensions/gsd/tests/doctor.test.ts +0 -652
  824. package/dist/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -169
  825. package/dist/resources/extensions/gsd/tests/exit-command.test.ts +0 -50
  826. package/dist/resources/extensions/gsd/tests/export-html-all.test.ts +0 -105
  827. package/dist/resources/extensions/gsd/tests/export-html-enhancements.test.ts +0 -378
  828. package/dist/resources/extensions/gsd/tests/extension-selector-separator.test.ts +0 -144
  829. package/dist/resources/extensions/gsd/tests/feature-branch-lifecycle-integration.test.ts +0 -424
  830. package/dist/resources/extensions/gsd/tests/git-self-heal.test.ts +0 -131
  831. package/dist/resources/extensions/gsd/tests/git-service.test.ts +0 -1172
  832. package/dist/resources/extensions/gsd/tests/gsd-db.test.ts +0 -353
  833. package/dist/resources/extensions/gsd/tests/gsd-inspect.test.ts +0 -125
  834. package/dist/resources/extensions/gsd/tests/gsd-tools.test.ts +0 -326
  835. package/dist/resources/extensions/gsd/tests/headless-answers.test.ts +0 -340
  836. package/dist/resources/extensions/gsd/tests/headless-query.test.ts +0 -162
  837. package/dist/resources/extensions/gsd/tests/idle-recovery.test.ts +0 -485
  838. package/dist/resources/extensions/gsd/tests/in-flight-tool-tracking.test.ts +0 -32
  839. package/dist/resources/extensions/gsd/tests/init-wizard.test.ts +0 -197
  840. package/dist/resources/extensions/gsd/tests/integration/headless-command.ts +0 -534
  841. package/dist/resources/extensions/gsd/tests/integration-edge.test.ts +0 -228
  842. package/dist/resources/extensions/gsd/tests/integration-lifecycle.test.ts +0 -277
  843. package/dist/resources/extensions/gsd/tests/integration-mixed-milestones.test.ts +0 -523
  844. package/dist/resources/extensions/gsd/tests/key-manager.test.ts +0 -414
  845. package/dist/resources/extensions/gsd/tests/knowledge.test.ts +0 -161
  846. package/dist/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
  847. package/dist/resources/extensions/gsd/tests/manifest-status.test.ts +0 -283
  848. package/dist/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +0 -91
  849. package/dist/resources/extensions/gsd/tests/md-importer.test.ts +0 -410
  850. package/dist/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  851. package/dist/resources/extensions/gsd/tests/memory-extractor.test.ts +0 -180
  852. package/dist/resources/extensions/gsd/tests/memory-leak-guards.test.ts +0 -91
  853. package/dist/resources/extensions/gsd/tests/memory-store.test.ts +0 -345
  854. package/dist/resources/extensions/gsd/tests/metrics.test.ts +0 -253
  855. package/dist/resources/extensions/gsd/tests/migrate-command.test.ts +0 -369
  856. package/dist/resources/extensions/gsd/tests/migrate-parser.test.ts +0 -757
  857. package/dist/resources/extensions/gsd/tests/migrate-transformer.test.ts +0 -635
  858. package/dist/resources/extensions/gsd/tests/migrate-validator-parsers.test.ts +0 -414
  859. package/dist/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -303
  860. package/dist/resources/extensions/gsd/tests/migrate-writer.test.ts +0 -398
  861. package/dist/resources/extensions/gsd/tests/milestone-transition-worktree.test.ts +0 -147
  862. package/dist/resources/extensions/gsd/tests/model-cost-table.test.ts +0 -69
  863. package/dist/resources/extensions/gsd/tests/model-isolation.test.ts +0 -157
  864. package/dist/resources/extensions/gsd/tests/model-router.test.ts +0 -167
  865. package/dist/resources/extensions/gsd/tests/must-have-parser.test.ts +0 -291
  866. package/dist/resources/extensions/gsd/tests/namespaced-registry.test.ts +0 -1027
  867. package/dist/resources/extensions/gsd/tests/namespaced-resolver.test.ts +0 -671
  868. package/dist/resources/extensions/gsd/tests/native-has-changes-cache.test.ts +0 -61
  869. package/dist/resources/extensions/gsd/tests/next-milestone-id.test.ts +0 -23
  870. package/dist/resources/extensions/gsd/tests/none-mode-gates.test.ts +0 -114
  871. package/dist/resources/extensions/gsd/tests/notifications.test.ts +0 -67
  872. package/dist/resources/extensions/gsd/tests/overrides.test.ts +0 -131
  873. package/dist/resources/extensions/gsd/tests/parallel-budget-atomicity.test.ts +0 -331
  874. package/dist/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +0 -298
  875. package/dist/resources/extensions/gsd/tests/parallel-merge.test.ts +0 -468
  876. package/dist/resources/extensions/gsd/tests/parallel-orchestration.test.ts +0 -685
  877. package/dist/resources/extensions/gsd/tests/parallel-worker-monitoring.test.ts +0 -171
  878. package/dist/resources/extensions/gsd/tests/parallel-workers-multi-milestone-e2e.test.ts +0 -354
  879. package/dist/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -276
  880. package/dist/resources/extensions/gsd/tests/park-milestone.test.ts +0 -401
  881. package/dist/resources/extensions/gsd/tests/parsers.test.ts +0 -1704
  882. package/dist/resources/extensions/gsd/tests/plan-milestone.test.ts +0 -133
  883. package/dist/resources/extensions/gsd/tests/plan-quality-validator.test.ts +0 -363
  884. package/dist/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +0 -42
  885. package/dist/resources/extensions/gsd/tests/plugin-importer-live.test.ts +0 -481
  886. package/dist/resources/extensions/gsd/tests/plugin-importer.test.ts +0 -1383
  887. package/dist/resources/extensions/gsd/tests/post-unit-hooks.test.ts +0 -337
  888. package/dist/resources/extensions/gsd/tests/preferences.test.ts +0 -276
  889. package/dist/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  890. package/dist/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +0 -464
  891. package/dist/resources/extensions/gsd/tests/prompt-cache-optimizer.test.ts +0 -314
  892. package/dist/resources/extensions/gsd/tests/prompt-compressor.test.ts +0 -529
  893. package/dist/resources/extensions/gsd/tests/prompt-db.test.ts +0 -385
  894. package/dist/resources/extensions/gsd/tests/prompt-ordering.test.ts +0 -296
  895. package/dist/resources/extensions/gsd/tests/provider-errors.test.ts +0 -338
  896. package/dist/resources/extensions/gsd/tests/queue-draft-detection.test.ts +0 -126
  897. package/dist/resources/extensions/gsd/tests/queue-order.test.ts +0 -204
  898. package/dist/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +0 -282
  899. package/dist/resources/extensions/gsd/tests/reassess-detection.test.ts +0 -154
  900. package/dist/resources/extensions/gsd/tests/reassess-prompt.test.ts +0 -145
  901. package/dist/resources/extensions/gsd/tests/regex-hardening.test.ts +0 -281
  902. package/dist/resources/extensions/gsd/tests/remote-questions.test.ts +0 -642
  903. package/dist/resources/extensions/gsd/tests/remote-status.test.ts +0 -99
  904. package/dist/resources/extensions/gsd/tests/replan-slice.test.ts +0 -538
  905. package/dist/resources/extensions/gsd/tests/requirements.test.ts +0 -106
  906. package/dist/resources/extensions/gsd/tests/roadmap-parse-regression.test.ts +0 -358
  907. package/dist/resources/extensions/gsd/tests/roadmap-slices.test.ts +0 -66
  908. package/dist/resources/extensions/gsd/tests/routing-history.test.ts +0 -240
  909. package/dist/resources/extensions/gsd/tests/run-uat.test.ts +0 -416
  910. package/dist/resources/extensions/gsd/tests/secure-env-collect.test.ts +0 -185
  911. package/dist/resources/extensions/gsd/tests/semantic-chunker.test.ts +0 -426
  912. package/dist/resources/extensions/gsd/tests/session-lock-regression.test.ts +0 -216
  913. package/dist/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
  914. package/dist/resources/extensions/gsd/tests/skill-lifecycle.test.ts +0 -126
  915. package/dist/resources/extensions/gsd/tests/smart-entry-draft.test.ts +0 -123
  916. package/dist/resources/extensions/gsd/tests/stale-worktree-cwd.test.ts +0 -142
  917. package/dist/resources/extensions/gsd/tests/stop-auto-remote.test.ts +0 -156
  918. package/dist/resources/extensions/gsd/tests/structured-data-formatter.test.ts +0 -365
  919. package/dist/resources/extensions/gsd/tests/summary-distiller.test.ts +0 -323
  920. package/dist/resources/extensions/gsd/tests/test-helpers.ts +0 -61
  921. package/dist/resources/extensions/gsd/tests/token-counter.test.ts +0 -129
  922. package/dist/resources/extensions/gsd/tests/token-optimization-benchmark.test.ts +0 -1272
  923. package/dist/resources/extensions/gsd/tests/token-optimization-prefs.test.ts +0 -164
  924. package/dist/resources/extensions/gsd/tests/token-profile.test.ts +0 -268
  925. package/dist/resources/extensions/gsd/tests/token-savings.test.ts +0 -366
  926. package/dist/resources/extensions/gsd/tests/triage-dispatch.test.ts +0 -340
  927. package/dist/resources/extensions/gsd/tests/triage-resolution.test.ts +0 -416
  928. package/dist/resources/extensions/gsd/tests/undo.test.ts +0 -136
  929. package/dist/resources/extensions/gsd/tests/unique-milestone-ids.test.ts +0 -219
  930. package/dist/resources/extensions/gsd/tests/unit-runtime.test.ts +0 -258
  931. package/dist/resources/extensions/gsd/tests/update-command.test.ts +0 -67
  932. package/dist/resources/extensions/gsd/tests/validate-directory.test.ts +0 -222
  933. package/dist/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -375
  934. package/dist/resources/extensions/gsd/tests/verification-evidence.test.ts +0 -745
  935. package/dist/resources/extensions/gsd/tests/verification-gate.test.ts +0 -1208
  936. package/dist/resources/extensions/gsd/tests/visualizer-critical-path.test.ts +0 -145
  937. package/dist/resources/extensions/gsd/tests/visualizer-data.test.ts +0 -446
  938. package/dist/resources/extensions/gsd/tests/visualizer-overlay.test.ts +0 -237
  939. package/dist/resources/extensions/gsd/tests/visualizer-views.test.ts +0 -718
  940. package/dist/resources/extensions/gsd/tests/worker-registry.test.ts +0 -148
  941. package/dist/resources/extensions/gsd/tests/workflow-templates.test.ts +0 -173
  942. package/dist/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
  943. package/dist/resources/extensions/gsd/tests/worktree-bugfix.test.ts +0 -120
  944. package/dist/resources/extensions/gsd/tests/worktree-e2e.test.ts +0 -244
  945. package/dist/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -207
  946. package/dist/resources/extensions/gsd/tests/worktree-manager.test.ts +0 -141
  947. package/dist/resources/extensions/gsd/tests/worktree-post-create-hook.test.ts +0 -165
  948. package/dist/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +0 -206
  949. package/dist/resources/extensions/gsd/tests/worktree.test.ts +0 -171
  950. package/dist/resources/extensions/gsd/tests/write-gate.test.ts +0 -211
  951. package/dist/resources/extensions/gsd/token-counter.ts +0 -65
  952. package/dist/resources/extensions/gsd/triage-resolution.ts +0 -284
  953. package/dist/resources/extensions/gsd/triage-ui.ts +0 -175
  954. package/dist/resources/extensions/gsd/types.ts +0 -425
  955. package/dist/resources/extensions/gsd/undo.ts +0 -223
  956. package/dist/resources/extensions/gsd/unit-id.ts +0 -14
  957. package/dist/resources/extensions/gsd/unit-runtime.ts +0 -192
  958. package/dist/resources/extensions/gsd/validate-directory.ts +0 -164
  959. package/dist/resources/extensions/gsd/verification-evidence.ts +0 -188
  960. package/dist/resources/extensions/gsd/verification-gate.ts +0 -643
  961. package/dist/resources/extensions/gsd/visualizer-data.ts +0 -866
  962. package/dist/resources/extensions/gsd/visualizer-overlay.ts +0 -566
  963. package/dist/resources/extensions/gsd/visualizer-views.ts +0 -1171
  964. package/dist/resources/extensions/gsd/workflow-templates.ts +0 -241
  965. package/dist/resources/extensions/gsd/workspace-index.ts +0 -217
  966. package/dist/resources/extensions/gsd/worktree-command.ts +0 -807
  967. package/dist/resources/extensions/gsd/worktree-manager.ts +0 -449
  968. package/dist/resources/extensions/gsd/worktree.ts +0 -257
  969. package/dist/resources/extensions/mac-tools/index.ts +0 -852
  970. package/dist/resources/extensions/mcp-client/index.ts +0 -459
  971. package/dist/resources/extensions/remote-questions/config.ts +0 -83
  972. package/dist/resources/extensions/remote-questions/discord-adapter.ts +0 -148
  973. package/dist/resources/extensions/remote-questions/format.ts +0 -315
  974. package/dist/resources/extensions/remote-questions/http-client.ts +0 -76
  975. package/dist/resources/extensions/remote-questions/manager.ts +0 -184
  976. package/dist/resources/extensions/remote-questions/notify.ts +0 -90
  977. package/dist/resources/extensions/remote-questions/remote-command.ts +0 -457
  978. package/dist/resources/extensions/remote-questions/slack-adapter.ts +0 -141
  979. package/dist/resources/extensions/remote-questions/status.ts +0 -31
  980. package/dist/resources/extensions/remote-questions/store.ts +0 -81
  981. package/dist/resources/extensions/remote-questions/telegram-adapter.ts +0 -149
  982. package/dist/resources/extensions/remote-questions/types.ts +0 -102
  983. package/dist/resources/extensions/search-the-web/cache.ts +0 -78
  984. package/dist/resources/extensions/search-the-web/command-search-provider.ts +0 -101
  985. package/dist/resources/extensions/search-the-web/format.ts +0 -258
  986. package/dist/resources/extensions/search-the-web/http.ts +0 -238
  987. package/dist/resources/extensions/search-the-web/index.ts +0 -65
  988. package/dist/resources/extensions/search-the-web/native-search.ts +0 -193
  989. package/dist/resources/extensions/search-the-web/provider.ts +0 -148
  990. package/dist/resources/extensions/search-the-web/tavily.ts +0 -116
  991. package/dist/resources/extensions/search-the-web/tool-fetch-page.ts +0 -589
  992. package/dist/resources/extensions/search-the-web/tool-llm-context.ts +0 -608
  993. package/dist/resources/extensions/search-the-web/tool-search.ts +0 -649
  994. package/dist/resources/extensions/search-the-web/url-utils.ts +0 -125
  995. package/dist/resources/extensions/shared/confirm-ui.ts +0 -126
  996. package/dist/resources/extensions/shared/frontmatter.ts +0 -117
  997. package/dist/resources/extensions/shared/interview-ui.ts +0 -613
  998. package/dist/resources/extensions/shared/next-action-ui.ts +0 -212
  999. package/dist/resources/extensions/shared/sanitize.ts +0 -19
  1000. package/dist/resources/extensions/shared/terminal.ts +0 -23
  1001. package/dist/resources/extensions/shared/tests/format-utils.test.ts +0 -153
  1002. package/dist/resources/extensions/shared/ui.ts +0 -400
  1003. package/dist/resources/extensions/shared/wizard-ui.ts +0 -551
  1004. package/dist/resources/extensions/slash-commands/audit.ts +0 -88
  1005. package/dist/resources/extensions/slash-commands/clear.ts +0 -10
  1006. package/dist/resources/extensions/slash-commands/create-extension.ts +0 -297
  1007. package/dist/resources/extensions/slash-commands/create-slash-command.ts +0 -234
  1008. package/dist/resources/extensions/slash-commands/index.ts +0 -12
  1009. package/dist/resources/extensions/subagent/agents.ts +0 -126
  1010. package/dist/resources/extensions/subagent/index.ts +0 -1121
  1011. package/dist/resources/extensions/subagent/isolation.ts +0 -501
  1012. package/dist/resources/extensions/subagent/worker-registry.ts +0 -99
  1013. package/dist/resources/extensions/ttsr/index.ts +0 -168
  1014. package/dist/resources/extensions/ttsr/rule-loader.ts +0 -74
  1015. package/dist/resources/extensions/ttsr/ttsr-manager.ts +0 -456
  1016. package/dist/resources/extensions/universal-config/discovery.ts +0 -104
  1017. package/dist/resources/extensions/universal-config/format.ts +0 -191
  1018. package/dist/resources/extensions/universal-config/index.ts +0 -120
  1019. package/dist/resources/extensions/universal-config/scanners.ts +0 -642
  1020. package/dist/resources/extensions/universal-config/tests/discovery.test.ts +0 -119
  1021. package/dist/resources/extensions/universal-config/tests/format.test.ts +0 -127
  1022. package/dist/resources/extensions/universal-config/tests/scanners.test.ts +0 -456
  1023. package/dist/resources/extensions/universal-config/tools.ts +0 -60
  1024. package/dist/resources/extensions/universal-config/types.ts +0 -135
  1025. package/dist/resources/extensions/voice/index.ts +0 -272
  1026. package/dist/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +0 -51
  1027. package/dist/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +0 -143
  1028. package/packages/pi-coding-agent/dist/modes/interactive/theme/dark.json +0 -85
  1029. package/packages/pi-coding-agent/dist/modes/interactive/theme/light.json +0 -84
  1030. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.json +0 -335
  1031. package/packages/pi-coding-agent/src/modes/interactive/theme/dark.json +0 -85
  1032. package/packages/pi-coding-agent/src/modes/interactive/theme/light.json +0 -84
  1033. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.json +0 -335
  1034. package/pkg/dist/modes/interactive/theme/dark.json +0 -85
  1035. package/pkg/dist/modes/interactive/theme/light.json +0 -84
  1036. package/pkg/dist/modes/interactive/theme/theme-schema.json +0 -335
  1037. package/src/resources/extensions/gsd/auto-constants.ts +0 -6
  1038. package/src/resources/extensions/gsd/auto-idempotency.ts +0 -151
  1039. package/src/resources/extensions/gsd/auto-stuck-detection.ts +0 -221
  1040. package/src/resources/extensions/gsd/mechanical-completion.ts +0 -430
  1041. package/src/resources/extensions/gsd/tests/auto-dispatch-loop.test.ts +0 -691
  1042. package/src/resources/extensions/gsd/tests/auto-reentrancy-guard.test.ts +0 -127
  1043. package/src/resources/extensions/gsd/tests/auto-skip-loop.test.ts +0 -123
  1044. package/src/resources/extensions/gsd/tests/dispatch-stall-guard.test.ts +0 -126
  1045. package/src/resources/extensions/gsd/tests/loop-regression.test.ts +0 -877
  1046. package/src/resources/extensions/gsd/tests/mechanical-completion.test.ts +0 -356
  1047. package/src/resources/extensions/gsd/tests/progress-score.test.ts +0 -206
  1048. package/src/resources/extensions/gsd/tests/session-lock.test.ts +0 -434
@@ -19,56 +19,31 @@
19
19
  *
20
20
  * Design: Linear-inspired — restrained palette, geometric status, no emoji.
21
21
  */
22
-
23
- import type {
24
- VisualizerData,
25
- VisualizerMilestone,
26
- VisualizerSlice,
27
- } from './visualizer-data.js';
28
22
  import { formatDateShort, formatDuration } from '../shared/format-utils.js';
29
23
  import { formatCost, formatTokenCount } from './metrics.js';
30
- import type { UnitMetrics } from './metrics.js';
31
-
32
- // ─── Public API ────────────────────────────────────────────────────────────────
33
-
34
- export interface HtmlReportOptions {
35
- projectName: string;
36
- projectPath: string;
37
- gsdVersion: string;
38
- milestoneId?: string;
39
- indexRelPath?: string;
40
- }
41
-
42
- export function generateHtmlReport(
43
- data: VisualizerData,
44
- opts: HtmlReportOptions,
45
- ): string {
46
- const generated = new Date().toISOString();
47
-
48
- const sections = [
49
- buildSummarySection(data, opts, generated),
50
- buildBlockersSection(data),
51
- buildProgressSection(data),
52
- buildTimelineSection(data),
53
- buildDepGraphSection(data),
54
- buildMetricsSection(data),
55
- buildHealthSection(data),
56
- buildChangelogSection(data),
57
- buildKnowledgeSection(data),
58
- buildCapturesSection(data),
59
- buildStatsSection(data),
60
- buildDiscussionSection(data),
61
- ];
62
-
63
- const milestoneTag = opts.milestoneId
64
- ? ` <span class="sep">/</span> <span class="mono accent">${esc(opts.milestoneId)}</span>`
65
- : '';
66
-
67
- const backLink = opts.indexRelPath
68
- ? `<a class="back-link" href="${esc(opts.indexRelPath)}">All Reports</a>`
69
- : '';
70
-
71
- return `<!DOCTYPE html>
24
+ export function generateHtmlReport(data, opts) {
25
+ const generated = new Date().toISOString();
26
+ const sections = [
27
+ buildSummarySection(data, opts, generated),
28
+ buildBlockersSection(data),
29
+ buildProgressSection(data),
30
+ buildTimelineSection(data),
31
+ buildDepGraphSection(data),
32
+ buildMetricsSection(data),
33
+ buildHealthSection(data),
34
+ buildChangelogSection(data),
35
+ buildKnowledgeSection(data),
36
+ buildCapturesSection(data),
37
+ buildStatsSection(data),
38
+ buildDiscussionSection(data),
39
+ ];
40
+ const milestoneTag = opts.milestoneId
41
+ ? ` <span class="sep">/</span> <span class="mono accent">${esc(opts.milestoneId)}</span>`
42
+ : '';
43
+ const backLink = opts.indexRelPath
44
+ ? `<a class="back-link" href="${esc(opts.indexRelPath)}">All Reports</a>`
45
+ : '';
46
+ return `<!DOCTYPE html>
72
47
  <html lang="en">
73
48
  <head>
74
49
  <meta charset="UTF-8">
@@ -126,61 +101,51 @@ ${sections.join('\n')}
126
101
  </body>
127
102
  </html>`;
128
103
  }
129
-
130
104
  // ─── Section: Summary ─────────────────────────────────────────────────────────
131
-
132
- function buildSummarySection(
133
- data: VisualizerData,
134
- opts: HtmlReportOptions,
135
- _generated: string,
136
- ): string {
137
- const t = data.totals;
138
- const totalSlices = data.milestones.reduce((s, m) => s + m.slices.length, 0);
139
- const doneSlices = data.milestones.reduce((s, m) => s + m.slices.filter(sl => sl.done).length, 0);
140
- const doneMilestones = data.milestones.filter(m => m.status === 'complete').length;
141
- const activeMilestone = data.milestones.find(m => m.status === 'active');
142
- const pct = totalSlices > 0 ? Math.round((doneSlices / totalSlices) * 100) : 0;
143
-
144
- const act = data.agentActivity;
145
- const kv = [
146
- kvi('Milestones', `${doneMilestones}/${data.milestones.length}`),
147
- kvi('Slices', `${doneSlices}/${totalSlices}`),
148
- kvi('Phase', data.phase),
149
- t ? kvi('Cost', formatCost(t.cost)) : '',
150
- t ? kvi('Tokens', formatTokenCount(t.tokens.total)) : '',
151
- t ? kvi('Duration', formatDuration(t.duration)) : '',
152
- t ? kvi('Tool calls', String(t.toolCalls)) : '',
153
- t ? kvi('Units', String(t.units)) : '',
154
- data.remainingSliceCount > 0 ? kvi('Remaining', String(data.remainingSliceCount)) : '',
155
- act ? kvi('Rate', `${act.completionRate.toFixed(1)}/hr`) : '',
156
- t && doneSlices > 0 ? kvi('Cost/slice', formatCost(t.cost / doneSlices)) : '',
157
- t && t.toolCalls > 0 ? kvi('Tokens/tool', formatTokenCount(t.tokens.total / t.toolCalls)) : '',
158
- t && (t.tokens.input + t.tokens.cacheRead) > 0
159
- ? kvi('Cache hit', ((t.tokens.cacheRead / (t.tokens.input + t.tokens.cacheRead)) * 100).toFixed(1) + '%')
160
- : '',
161
- opts.milestoneId ? kvi('Scope', opts.milestoneId) : '',
162
- ].filter(Boolean).join('');
163
-
164
- const activeInfo = activeMilestone ? (() => {
165
- const active = activeMilestone.slices.find(s => s.active);
166
- if (!active) return '';
167
- return `<div class="active-info">
105
+ function buildSummarySection(data, opts, _generated) {
106
+ const t = data.totals;
107
+ const totalSlices = data.milestones.reduce((s, m) => s + m.slices.length, 0);
108
+ const doneSlices = data.milestones.reduce((s, m) => s + m.slices.filter(sl => sl.done).length, 0);
109
+ const doneMilestones = data.milestones.filter(m => m.status === 'complete').length;
110
+ const activeMilestone = data.milestones.find(m => m.status === 'active');
111
+ const pct = totalSlices > 0 ? Math.round((doneSlices / totalSlices) * 100) : 0;
112
+ const act = data.agentActivity;
113
+ const kv = [
114
+ kvi('Milestones', `${doneMilestones}/${data.milestones.length}`),
115
+ kvi('Slices', `${doneSlices}/${totalSlices}`),
116
+ kvi('Phase', data.phase),
117
+ t ? kvi('Cost', formatCost(t.cost)) : '',
118
+ t ? kvi('Tokens', formatTokenCount(t.tokens.total)) : '',
119
+ t ? kvi('Duration', formatDuration(t.duration)) : '',
120
+ t ? kvi('Tool calls', String(t.toolCalls)) : '',
121
+ t ? kvi('Units', String(t.units)) : '',
122
+ data.remainingSliceCount > 0 ? kvi('Remaining', String(data.remainingSliceCount)) : '',
123
+ act ? kvi('Rate', `${act.completionRate.toFixed(1)}/hr`) : '',
124
+ t && doneSlices > 0 ? kvi('Cost/slice', formatCost(t.cost / doneSlices)) : '',
125
+ t && t.toolCalls > 0 ? kvi('Tokens/tool', formatTokenCount(t.tokens.total / t.toolCalls)) : '',
126
+ t && (t.tokens.input + t.tokens.cacheRead) > 0
127
+ ? kvi('Cache hit', ((t.tokens.cacheRead / (t.tokens.input + t.tokens.cacheRead)) * 100).toFixed(1) + '%')
128
+ : '',
129
+ opts.milestoneId ? kvi('Scope', opts.milestoneId) : '',
130
+ ].filter(Boolean).join('');
131
+ const activeInfo = activeMilestone ? (() => {
132
+ const active = activeMilestone.slices.find(s => s.active);
133
+ if (!active)
134
+ return '';
135
+ return `<div class="active-info">
168
136
  Executing <span class="mono">${esc(activeMilestone.id)}/${esc(active.id)}</span> — ${esc(active.title)}
169
137
  </div>`;
170
- })() : '';
171
-
172
- const activityHtml = act?.active ? `
138
+ })() : '';
139
+ const activityHtml = act?.active ? `
173
140
  <div class="activity-line">
174
141
  <span class="dot dot-active"></span>
175
142
  <span class="mono">${esc(act.currentUnit?.type ?? '')}</span>
176
143
  <span class="mono muted">${esc(act.currentUnit?.id ?? '')}</span>
177
144
  <span class="muted">${formatDuration(act.elapsed)} elapsed</span>
178
145
  </div>` : '';
179
-
180
- const execSummary = buildExecutiveSummary(data, opts);
181
- const etaLine = buildEtaLine(data);
182
-
183
- return section('summary', 'Summary', `
146
+ const execSummary = buildExecutiveSummary(data, opts);
147
+ const etaLine = buildEtaLine(data);
148
+ return section('summary', 'Summary', `
184
149
  ${execSummary}
185
150
  <div class="kv-grid">${kv}</div>
186
151
  <div class="progress-wrap">
@@ -192,134 +157,104 @@ function buildSummarySection(
192
157
  ${etaLine}
193
158
  `);
194
159
  }
195
-
196
- function buildExecutiveSummary(data: VisualizerData, opts: HtmlReportOptions): string {
197
- const totalSlices = data.milestones.reduce((s, m) => s + m.slices.length, 0);
198
- const doneSlices = data.milestones.reduce((s, m) => s + m.slices.filter(sl => sl.done).length, 0);
199
- const pct = totalSlices > 0 ? Math.round((doneSlices / totalSlices) * 100) : 0;
200
- const spent = data.totals?.cost ?? 0;
201
- const activeMilestone = data.milestones.find(m => m.status === 'active');
202
- const activeSlice = activeMilestone?.slices.find(s => s.active);
203
- const currentExec = activeMilestone && activeSlice
204
- ? ` Currently executing ${esc(activeMilestone.id)}/${esc(activeSlice.id)}.`
205
- : '';
206
- const budgetCtx = data.health.budgetCeiling
207
- ? ` Budget: ${formatCost(spent)} of ${formatCost(data.health.budgetCeiling)} ceiling (${((spent / data.health.budgetCeiling) * 100).toFixed(0)}% used).`
208
- : '';
209
- return `<p class="exec-summary">${esc(opts.projectName)} is ${pct}% complete across ${data.milestones.length} milestones. ${formatCost(spent)} spent.${currentExec}${budgetCtx}</p>`;
160
+ function buildExecutiveSummary(data, opts) {
161
+ const totalSlices = data.milestones.reduce((s, m) => s + m.slices.length, 0);
162
+ const doneSlices = data.milestones.reduce((s, m) => s + m.slices.filter(sl => sl.done).length, 0);
163
+ const pct = totalSlices > 0 ? Math.round((doneSlices / totalSlices) * 100) : 0;
164
+ const spent = data.totals?.cost ?? 0;
165
+ const activeMilestone = data.milestones.find(m => m.status === 'active');
166
+ const activeSlice = activeMilestone?.slices.find(s => s.active);
167
+ const currentExec = activeMilestone && activeSlice
168
+ ? ` Currently executing ${esc(activeMilestone.id)}/${esc(activeSlice.id)}.`
169
+ : '';
170
+ const budgetCtx = data.health.budgetCeiling
171
+ ? ` Budget: ${formatCost(spent)} of ${formatCost(data.health.budgetCeiling)} ceiling (${((spent / data.health.budgetCeiling) * 100).toFixed(0)}% used).`
172
+ : '';
173
+ return `<p class="exec-summary">${esc(opts.projectName)} is ${pct}% complete across ${data.milestones.length} milestones. ${formatCost(spent)} spent.${currentExec}${budgetCtx}</p>`;
210
174
  }
211
-
212
- function buildEtaLine(data: VisualizerData): string {
213
- const act = data.agentActivity;
214
- if (!act || act.completionRate <= 0 || data.remainingSliceCount <= 0) return '';
215
- const hoursRemaining = data.remainingSliceCount / act.completionRate;
216
- const formatted = formatDuration(hoursRemaining * 3_600_000);
217
- return `<div class="eta-line">ETA: ~${formatted} remaining (${data.remainingSliceCount} slices at ${act.completionRate.toFixed(1)}/hr)</div>`;
175
+ function buildEtaLine(data) {
176
+ const act = data.agentActivity;
177
+ if (!act || act.completionRate <= 0 || data.remainingSliceCount <= 0)
178
+ return '';
179
+ const hoursRemaining = data.remainingSliceCount / act.completionRate;
180
+ const formatted = formatDuration(hoursRemaining * 3_600_000);
181
+ return `<div class="eta-line">ETA: ~${formatted} remaining (${data.remainingSliceCount} slices at ${act.completionRate.toFixed(1)}/hr)</div>`;
218
182
  }
219
-
220
183
  // ─── Section: Blockers ────────────────────────────────────────────────────────
221
-
222
- function buildBlockersSection(data: VisualizerData): string {
223
- const blockers = data.sliceVerifications.filter(v => v.blockerDiscovered === true);
224
- const highRisk: { msId: string; slId: string }[] = [];
225
- for (const ms of data.milestones) {
226
- for (const sl of ms.slices) {
227
- if (!sl.done && sl.risk?.toLowerCase() === 'high') {
228
- highRisk.push({ msId: ms.id, slId: sl.id });
229
- }
184
+ function buildBlockersSection(data) {
185
+ const blockers = data.sliceVerifications.filter(v => v.blockerDiscovered === true);
186
+ const highRisk = [];
187
+ for (const ms of data.milestones) {
188
+ for (const sl of ms.slices) {
189
+ if (!sl.done && sl.risk?.toLowerCase() === 'high') {
190
+ highRisk.push({ msId: ms.id, slId: sl.id });
191
+ }
192
+ }
230
193
  }
231
- }
232
-
233
- if (blockers.length === 0 && highRisk.length === 0) {
234
- return section('blockers', 'Blockers', '<p class="empty">No blockers or high-risk items found.</p>');
235
- }
236
-
237
- const blockerCards = blockers.map(v => `
194
+ if (blockers.length === 0 && highRisk.length === 0) {
195
+ return section('blockers', 'Blockers', '<p class="empty">No blockers or high-risk items found.</p>');
196
+ }
197
+ const blockerCards = blockers.map(v => `
238
198
  <div class="blocker-card">
239
199
  <div class="blocker-id">${esc(v.milestoneId)}/${esc(v.sliceId)}</div>
240
200
  <div class="blocker-text">${esc(v.verificationResult ?? 'Blocker discovered')}</div>
241
201
  </div>`).join('');
242
-
243
- const riskCards = highRisk
244
- .filter(hr => !blockers.some(b => b.milestoneId === hr.msId && b.sliceId === hr.slId))
245
- .map(hr => `
202
+ const riskCards = highRisk
203
+ .filter(hr => !blockers.some(b => b.milestoneId === hr.msId && b.sliceId === hr.slId))
204
+ .map(hr => `
246
205
  <div class="blocker-card">
247
206
  <div class="blocker-id">${esc(hr.msId)}/${esc(hr.slId)}</div>
248
207
  <div class="blocker-text">High risk — incomplete</div>
249
208
  </div>`).join('');
250
-
251
- return section('blockers', 'Blockers', `${blockerCards}${riskCards}`);
209
+ return section('blockers', 'Blockers', `${blockerCards}${riskCards}`);
252
210
  }
253
-
254
211
  // ─── Section: Health ──────────────────────────────────────────────────────────
255
-
256
- function buildHealthSection(data: VisualizerData): string {
257
- const h = data.health;
258
- const t = data.totals;
259
-
260
- const rows: string[] = [];
261
- rows.push(hRow('Token profile', h.tokenProfile));
262
- if (h.budgetCeiling !== undefined) {
263
- const spent = t?.cost ?? 0;
264
- const pct = (spent / h.budgetCeiling) * 100;
265
- const status = pct > 90 ? 'warn' : pct > 75 ? 'caution' : 'ok';
266
- rows.push(hRow(
267
- 'Budget ceiling',
268
- `${formatCost(h.budgetCeiling)} (${formatCost(spent)} spent, ${pct.toFixed(0)}% used)`,
269
- status,
270
- ));
271
- }
272
- rows.push(hRow(
273
- 'Truncation rate',
274
- `${h.truncationRate.toFixed(1)}% per unit (${t?.totalTruncationSections ?? 0} total)`,
275
- h.truncationRate > 20 ? 'warn' : h.truncationRate > 10 ? 'caution' : 'ok',
276
- ));
277
- rows.push(hRow(
278
- 'Continue-here rate',
279
- `${h.continueHereRate.toFixed(1)}% per unit (${t?.continueHereFiredCount ?? 0} total)`,
280
- h.continueHereRate > 15 ? 'warn' : h.continueHereRate > 8 ? 'caution' : 'ok',
281
- ));
282
- if (h.tierSavingsLine) rows.push(hRow('Routing savings', h.tierSavingsLine));
283
- rows.push(hRow('Tool calls', String(h.toolCalls)));
284
- rows.push(hRow('Messages', `${h.assistantMessages} assistant / ${h.userMessages} user`));
285
-
286
- const tierRows = h.tierBreakdown.length > 0 ? `
212
+ function buildHealthSection(data) {
213
+ const h = data.health;
214
+ const t = data.totals;
215
+ const rows = [];
216
+ rows.push(hRow('Token profile', h.tokenProfile));
217
+ if (h.budgetCeiling !== undefined) {
218
+ const spent = t?.cost ?? 0;
219
+ const pct = (spent / h.budgetCeiling) * 100;
220
+ const status = pct > 90 ? 'warn' : pct > 75 ? 'caution' : 'ok';
221
+ rows.push(hRow('Budget ceiling', `${formatCost(h.budgetCeiling)} (${formatCost(spent)} spent, ${pct.toFixed(0)}% used)`, status));
222
+ }
223
+ rows.push(hRow('Truncation rate', `${h.truncationRate.toFixed(1)}% per unit (${t?.totalTruncationSections ?? 0} total)`, h.truncationRate > 20 ? 'warn' : h.truncationRate > 10 ? 'caution' : 'ok'));
224
+ rows.push(hRow('Continue-here rate', `${h.continueHereRate.toFixed(1)}% per unit (${t?.continueHereFiredCount ?? 0} total)`, h.continueHereRate > 15 ? 'warn' : h.continueHereRate > 8 ? 'caution' : 'ok'));
225
+ if (h.tierSavingsLine)
226
+ rows.push(hRow('Routing savings', h.tierSavingsLine));
227
+ rows.push(hRow('Tool calls', String(h.toolCalls)));
228
+ rows.push(hRow('Messages', `${h.assistantMessages} assistant / ${h.userMessages} user`));
229
+ const tierRows = h.tierBreakdown.length > 0 ? `
287
230
  <h3>Tier breakdown</h3>
288
231
  <table class="tbl">
289
232
  <thead><tr><th>Tier</th><th>Units</th><th>Cost</th><th>Tokens</th></tr></thead>
290
233
  <tbody>
291
- ${h.tierBreakdown.map(tb =>
292
- `<tr><td class="mono">${esc(tb.tier)}</td>
234
+ ${h.tierBreakdown.map(tb => `<tr><td class="mono">${esc(tb.tier)}</td>
293
235
  <td>${tb.units}</td><td>${formatCost(tb.cost)}</td>
294
- <td>${formatTokenCount(tb.tokens.total)}</td></tr>`
295
- ).join('')}
236
+ <td>${formatTokenCount(tb.tokens.total)}</td></tr>`).join('')}
296
237
  </tbody>
297
238
  </table>` : '';
298
-
299
- return section('health', 'Health', `
239
+ return section('health', 'Health', `
300
240
  <table class="tbl tbl-kv"><tbody>${rows.join('')}</tbody></table>
301
241
  ${tierRows}
302
242
  `);
303
243
  }
304
-
305
244
  // ─── Section: Progress ────────────────────────────────────────────────────────
306
-
307
- function buildProgressSection(data: VisualizerData): string {
308
- if (data.milestones.length === 0) {
309
- return section('progress', 'Progress', '<p class="empty">No milestones found.</p>');
310
- }
311
-
312
- const critMS = new Set(data.criticalPath.milestonePath);
313
- const critSL = new Set(data.criticalPath.slicePath);
314
-
315
- const msHtml = data.milestones.map(ms => {
316
- const doneCount = ms.slices.filter(s => s.done).length;
317
- const onCrit = critMS.has(ms.id);
318
- const sliceHtml = ms.slices.length > 0
319
- ? ms.slices.map(sl => buildSliceRow(sl, critSL, data)).join('')
320
- : '<p class="empty indent">No slices in roadmap yet.</p>';
321
-
322
- return `
245
+ function buildProgressSection(data) {
246
+ if (data.milestones.length === 0) {
247
+ return section('progress', 'Progress', '<p class="empty">No milestones found.</p>');
248
+ }
249
+ const critMS = new Set(data.criticalPath.milestonePath);
250
+ const critSL = new Set(data.criticalPath.slicePath);
251
+ const msHtml = data.milestones.map(ms => {
252
+ const doneCount = ms.slices.filter(s => s.done).length;
253
+ const onCrit = critMS.has(ms.id);
254
+ const sliceHtml = ms.slices.length > 0
255
+ ? ms.slices.map(sl => buildSliceRow(sl, critSL, data)).join('')
256
+ : '<p class="empty indent">No slices in roadmap yet.</p>';
257
+ return `
323
258
  <details class="ms-block" ${ms.status !== 'pending' && ms.status !== 'parked' ? 'open' : ''}>
324
259
  <summary class="ms-summary ms-${ms.status}">
325
260
  <span class="dot dot-${ms.status}"></span>
@@ -331,18 +266,15 @@ function buildProgressSection(data: VisualizerData): string {
331
266
  </summary>
332
267
  <div class="ms-body">${sliceHtml}</div>
333
268
  </details>`;
334
- }).join('');
335
-
336
- return section('progress', 'Progress', msHtml);
269
+ }).join('');
270
+ return section('progress', 'Progress', msHtml);
337
271
  }
338
-
339
- function buildSliceRow(sl: VisualizerSlice, critSL: Set<string>, data: VisualizerData): string {
340
- const onCrit = critSL.has(sl.id);
341
- const ver = data.sliceVerifications.find(v => v.sliceId === sl.id);
342
- const slack = data.criticalPath.sliceSlack.get(sl.id);
343
- const status = sl.done ? 'complete' : sl.active ? 'active' : 'pending';
344
-
345
- const taskHtml = sl.tasks.length > 0 ? `
272
+ function buildSliceRow(sl, critSL, data) {
273
+ const onCrit = critSL.has(sl.id);
274
+ const ver = data.sliceVerifications.find(v => v.sliceId === sl.id);
275
+ const slack = data.criticalPath.sliceSlack.get(sl.id);
276
+ const status = sl.done ? 'complete' : sl.active ? 'active' : 'pending';
277
+ const taskHtml = sl.tasks.length > 0 ? `
346
278
  <ul class="task-list">
347
279
  ${sl.tasks.map(t => `
348
280
  <li class="task-row">
@@ -352,27 +284,22 @@ function buildSliceRow(sl: VisualizerSlice, critSL: Set<string>, data: Visualize
352
284
  ${t.estimate ? `<span class="muted">${esc(t.estimate)}</span>` : ''}
353
285
  </li>`).join('')}
354
286
  </ul>` : '';
355
-
356
- const tags = [
357
- ...(ver?.provides ?? []).map(p => `<span class="tag">provides: ${esc(p)}</span>`),
358
- ...(ver?.requires ?? []).map(r => `<span class="tag">requires: ${esc(r.provides)}</span>`),
359
- ].join('');
360
-
361
- const keyDecisions = ver?.keyDecisions?.length
362
- ? `<div class="detail-block"><span class="detail-label">Decisions</span><ul>${ver.keyDecisions.map(d => `<li>${esc(d)}</li>`).join('')}</ul></div>`
363
- : '';
364
-
365
- const patterns = ver?.patternsEstablished?.length
366
- ? `<div class="detail-block"><span class="detail-label">Patterns</span><ul>${ver.patternsEstablished.map(p => `<li>${esc(p)}</li>`).join('')}</ul></div>`
367
- : '';
368
-
369
- const verifBadge = ver?.verificationResult
370
- ? `<div class="verif ${ver.blockerDiscovered ? 'verif-blocker' : ''}">
287
+ const tags = [
288
+ ...(ver?.provides ?? []).map(p => `<span class="tag">provides: ${esc(p)}</span>`),
289
+ ...(ver?.requires ?? []).map(r => `<span class="tag">requires: ${esc(r.provides)}</span>`),
290
+ ].join('');
291
+ const keyDecisions = ver?.keyDecisions?.length
292
+ ? `<div class="detail-block"><span class="detail-label">Decisions</span><ul>${ver.keyDecisions.map(d => `<li>${esc(d)}</li>`).join('')}</ul></div>`
293
+ : '';
294
+ const patterns = ver?.patternsEstablished?.length
295
+ ? `<div class="detail-block"><span class="detail-label">Patterns</span><ul>${ver.patternsEstablished.map(p => `<li>${esc(p)}</li>`).join('')}</ul></div>`
296
+ : '';
297
+ const verifBadge = ver?.verificationResult
298
+ ? `<div class="verif ${ver.blockerDiscovered ? 'verif-blocker' : ''}">
371
299
  ${ver.blockerDiscovered ? 'Blocker: ' : ''}${esc(ver.verificationResult)}
372
300
  </div>`
373
- : '';
374
-
375
- return `
301
+ : '';
302
+ return `
376
303
  <details class="sl-block">
377
304
  <summary class="sl-summary ${onCrit ? 'sl-crit' : ''}">
378
305
  <span class="dot dot-${status} dot-sm"></span>
@@ -392,112 +319,113 @@ function buildSliceRow(sl: VisualizerSlice, critSL: Set<string>, data: Visualize
392
319
  </div>
393
320
  </details>`;
394
321
  }
395
-
396
322
  // ─── Section: Dependency Graph ────────────────────────────────────────────────
397
-
398
- function buildDepGraphSection(data: VisualizerData): string {
399
- const hasSlices = data.milestones.some(ms => ms.slices.length > 0);
400
- if (!hasSlices) return section('depgraph', 'Dependencies', '<p class="empty">No slices to graph.</p>');
401
-
402
- const hasDeps = data.milestones.some(ms => ms.slices.some(s => s.depends.length > 0));
403
- if (!hasDeps) return section('depgraph', 'Dependencies', '<p class="empty">No dependencies defined.</p>');
404
-
405
- const svgs = data.milestones
406
- .filter(ms => ms.slices.length > 0)
407
- .map(ms => buildMilestoneDepSVG(ms, data))
408
- .filter(Boolean)
409
- .join('');
410
-
411
- return section('depgraph', 'Dependencies', svgs);
323
+ function buildDepGraphSection(data) {
324
+ const hasSlices = data.milestones.some(ms => ms.slices.length > 0);
325
+ if (!hasSlices)
326
+ return section('depgraph', 'Dependencies', '<p class="empty">No slices to graph.</p>');
327
+ const hasDeps = data.milestones.some(ms => ms.slices.some(s => s.depends.length > 0));
328
+ if (!hasDeps)
329
+ return section('depgraph', 'Dependencies', '<p class="empty">No dependencies defined.</p>');
330
+ const svgs = data.milestones
331
+ .filter(ms => ms.slices.length > 0)
332
+ .map(ms => buildMilestoneDepSVG(ms, data))
333
+ .filter(Boolean)
334
+ .join('');
335
+ return section('depgraph', 'Dependencies', svgs);
412
336
  }
413
-
414
- function buildMilestoneDepSVG(ms: VisualizerMilestone, data: VisualizerData): string {
415
- const slices = ms.slices;
416
- if (slices.length === 0) return '';
417
-
418
- const critSL = new Set(data.criticalPath.slicePath);
419
- const slMap = new Map(slices.map(s => [s.id, s]));
420
-
421
- const layerMap = new Map<string, number>();
422
- const inDeg = new Map<string, number>();
423
- for (const s of slices) inDeg.set(s.id, 0);
424
- for (const s of slices) {
425
- for (const dep of s.depends) {
426
- if (slMap.has(dep)) inDeg.set(s.id, (inDeg.get(s.id) ?? 0) + 1);
427
- }
428
- }
429
-
430
- const visited = new Set<string>();
431
- const q: string[] = [];
432
- for (const [id, d] of inDeg) {
433
- if (d === 0) { q.push(id); visited.add(id); layerMap.set(id, 0); }
434
- }
435
-
436
- while (q.length > 0) {
437
- const node = q.shift()!;
337
+ function buildMilestoneDepSVG(ms, data) {
338
+ const slices = ms.slices;
339
+ if (slices.length === 0)
340
+ return '';
341
+ const critSL = new Set(data.criticalPath.slicePath);
342
+ const slMap = new Map(slices.map(s => [s.id, s]));
343
+ const layerMap = new Map();
344
+ const inDeg = new Map();
345
+ for (const s of slices)
346
+ inDeg.set(s.id, 0);
438
347
  for (const s of slices) {
439
- if (!s.depends.includes(node)) continue;
440
- const newDeg = (inDeg.get(s.id) ?? 1) - 1;
441
- inDeg.set(s.id, newDeg);
442
- layerMap.set(s.id, Math.max(layerMap.get(s.id) ?? 0, (layerMap.get(node) ?? 0) + 1));
443
- if (newDeg === 0 && !visited.has(s.id)) { visited.add(s.id); q.push(s.id); }
348
+ for (const dep of s.depends) {
349
+ if (slMap.has(dep))
350
+ inDeg.set(s.id, (inDeg.get(s.id) ?? 0) + 1);
351
+ }
444
352
  }
445
- }
446
- for (const s of slices) if (!layerMap.has(s.id)) layerMap.set(s.id, 0);
447
-
448
- const maxLayer = Math.max(...[...layerMap.values()]);
449
- const byLayer = new Map<number, string[]>();
450
- for (const [id, layer] of layerMap) {
451
- const arr = byLayer.get(layer) ?? [];
452
- arr.push(id);
453
- byLayer.set(layer, arr);
454
- }
455
-
456
- const NW = 130, NH = 40, CGAP = 56, RGAP = 14, PAD = 20;
457
- let maxRows = 0;
458
- for (let c = 0; c <= maxLayer; c++) maxRows = Math.max(maxRows, (byLayer.get(c) ?? []).length);
459
- const totalH = PAD * 2 + maxRows * NH + Math.max(0, maxRows - 1) * RGAP;
460
- const totalW = PAD * 2 + (maxLayer + 1) * NW + maxLayer * CGAP;
461
-
462
- const pos = new Map<string, { x: number; y: number }>();
463
- for (let col = 0; col <= maxLayer; col++) {
464
- const ids = byLayer.get(col) ?? [];
465
- const colH = ids.length * NH + Math.max(0, ids.length - 1) * RGAP;
466
- const startY = (totalH - colH) / 2;
467
- ids.forEach((id, i) => pos.set(id, { x: PAD + col * (NW + CGAP), y: startY + i * (NH + RGAP) }));
468
- }
469
-
470
- const edges = slices.flatMap(sl => sl.depends.flatMap(dep => {
471
- if (!pos.has(dep) || !pos.has(sl.id)) return [];
472
- const f = pos.get(dep)!, t = pos.get(sl.id)!;
473
- const x1 = f.x + NW, y1 = f.y + NH / 2;
474
- const x2 = t.x, y2 = t.y + NH / 2;
475
- const mx = (x1 + x2) / 2;
476
- const crit = critSL.has(sl.id) && critSL.has(dep);
477
- return [`<path d="M${x1},${y1} C${mx},${y1} ${mx},${y2} ${x2},${y2}" class="edge${crit ? ' edge-crit' : ''}" marker-end="url(#arr${crit ? '-crit' : ''})"/>`];
478
- }));
479
-
480
- const nodes = slices.map(sl => {
481
- const p = pos.get(sl.id);
482
- if (!p) return '';
483
- const crit = critSL.has(sl.id);
484
- const sc = sl.done ? 'n-done' : sl.active ? 'n-active' : 'n-pending';
485
- return `<g class="node ${sc}${crit ? ' n-crit' : ''}" transform="translate(${p.x},${p.y})">
353
+ const visited = new Set();
354
+ const q = [];
355
+ for (const [id, d] of inDeg) {
356
+ if (d === 0) {
357
+ q.push(id);
358
+ visited.add(id);
359
+ layerMap.set(id, 0);
360
+ }
361
+ }
362
+ while (q.length > 0) {
363
+ const node = q.shift();
364
+ for (const s of slices) {
365
+ if (!s.depends.includes(node))
366
+ continue;
367
+ const newDeg = (inDeg.get(s.id) ?? 1) - 1;
368
+ inDeg.set(s.id, newDeg);
369
+ layerMap.set(s.id, Math.max(layerMap.get(s.id) ?? 0, (layerMap.get(node) ?? 0) + 1));
370
+ if (newDeg === 0 && !visited.has(s.id)) {
371
+ visited.add(s.id);
372
+ q.push(s.id);
373
+ }
374
+ }
375
+ }
376
+ for (const s of slices)
377
+ if (!layerMap.has(s.id))
378
+ layerMap.set(s.id, 0);
379
+ const maxLayer = Math.max(...[...layerMap.values()]);
380
+ const byLayer = new Map();
381
+ for (const [id, layer] of layerMap) {
382
+ const arr = byLayer.get(layer) ?? [];
383
+ arr.push(id);
384
+ byLayer.set(layer, arr);
385
+ }
386
+ const NW = 130, NH = 40, CGAP = 56, RGAP = 14, PAD = 20;
387
+ let maxRows = 0;
388
+ for (let c = 0; c <= maxLayer; c++)
389
+ maxRows = Math.max(maxRows, (byLayer.get(c) ?? []).length);
390
+ const totalH = PAD * 2 + maxRows * NH + Math.max(0, maxRows - 1) * RGAP;
391
+ const totalW = PAD * 2 + (maxLayer + 1) * NW + maxLayer * CGAP;
392
+ const pos = new Map();
393
+ for (let col = 0; col <= maxLayer; col++) {
394
+ const ids = byLayer.get(col) ?? [];
395
+ const colH = ids.length * NH + Math.max(0, ids.length - 1) * RGAP;
396
+ const startY = (totalH - colH) / 2;
397
+ ids.forEach((id, i) => pos.set(id, { x: PAD + col * (NW + CGAP), y: startY + i * (NH + RGAP) }));
398
+ }
399
+ const edges = slices.flatMap(sl => sl.depends.flatMap(dep => {
400
+ if (!pos.has(dep) || !pos.has(sl.id))
401
+ return [];
402
+ const f = pos.get(dep), t = pos.get(sl.id);
403
+ const x1 = f.x + NW, y1 = f.y + NH / 2;
404
+ const x2 = t.x, y2 = t.y + NH / 2;
405
+ const mx = (x1 + x2) / 2;
406
+ const crit = critSL.has(sl.id) && critSL.has(dep);
407
+ return [`<path d="M${x1},${y1} C${mx},${y1} ${mx},${y2} ${x2},${y2}" class="edge${crit ? ' edge-crit' : ''}" marker-end="url(#arr${crit ? '-crit' : ''})"/>`];
408
+ }));
409
+ const nodes = slices.map(sl => {
410
+ const p = pos.get(sl.id);
411
+ if (!p)
412
+ return '';
413
+ const crit = critSL.has(sl.id);
414
+ const sc = sl.done ? 'n-done' : sl.active ? 'n-active' : 'n-pending';
415
+ return `<g class="node ${sc}${crit ? ' n-crit' : ''}" transform="translate(${p.x},${p.y})">
486
416
  <rect width="${NW}" height="${NH}" rx="4"/>
487
- <text x="${NW/2}" y="16" class="n-id">${esc(truncStr(sl.id, 18))}</text>
488
- <text x="${NW/2}" y="30" class="n-title">${esc(truncStr(sl.title, 18))}</text>
417
+ <text x="${NW / 2}" y="16" class="n-id">${esc(truncStr(sl.id, 18))}</text>
418
+ <text x="${NW / 2}" y="30" class="n-title">${esc(truncStr(sl.title, 18))}</text>
489
419
  <title>${esc(sl.id)}: ${esc(sl.title)}</title>
490
420
  </g>`;
491
- });
492
-
493
- const legend = `<div class="dep-legend">
421
+ });
422
+ const legend = `<div class="dep-legend">
494
423
  <span><span class="dot dot-complete dot-sm"></span> done</span>
495
424
  <span><span class="dot dot-active dot-sm"></span> active</span>
496
425
  <span><span class="dot dot-pending dot-sm"></span> pending</span>
497
426
  <span><span class="dot dot-parked dot-sm"></span> parked</span>
498
427
  </div>`;
499
-
500
- return `
428
+ return `
501
429
  <div class="dep-block">
502
430
  <h3>${esc(ms.id)}: ${esc(ms.title)}</h3>
503
431
  ${legend}
@@ -517,59 +445,52 @@ function buildMilestoneDepSVG(ms: VisualizerMilestone, data: VisualizerData): st
517
445
  </div>
518
446
  </div>`;
519
447
  }
520
-
521
448
  // ─── Section: Metrics ─────────────────────────────────────────────────────────
522
-
523
- function buildMetricsSection(data: VisualizerData): string {
524
- if (!data.totals) return section('metrics', 'Metrics', '<p class="empty">No metrics data yet.</p>');
525
- const t = data.totals;
526
-
527
- const grid = [
528
- kvi('Total cost', formatCost(t.cost)),
529
- kvi('Total tokens', formatTokenCount(t.tokens.total)),
530
- kvi('Input', formatTokenCount(t.tokens.input)),
531
- kvi('Output', formatTokenCount(t.tokens.output)),
532
- kvi('Cache read', formatTokenCount(t.tokens.cacheRead)),
533
- kvi('Cache write', formatTokenCount(t.tokens.cacheWrite)),
534
- kvi('Duration', formatDuration(t.duration)),
535
- kvi('Units', String(t.units)),
536
- kvi('Tool calls', String(t.toolCalls)),
537
- kvi('Truncations', String(t.totalTruncationSections)),
538
- ].join('');
539
-
540
- const tokenBreakdown = buildTokenBreakdown(t.tokens);
541
-
542
- const phaseRow = data.byPhase.length > 0 ? `
449
+ function buildMetricsSection(data) {
450
+ if (!data.totals)
451
+ return section('metrics', 'Metrics', '<p class="empty">No metrics data yet.</p>');
452
+ const t = data.totals;
453
+ const grid = [
454
+ kvi('Total cost', formatCost(t.cost)),
455
+ kvi('Total tokens', formatTokenCount(t.tokens.total)),
456
+ kvi('Input', formatTokenCount(t.tokens.input)),
457
+ kvi('Output', formatTokenCount(t.tokens.output)),
458
+ kvi('Cache read', formatTokenCount(t.tokens.cacheRead)),
459
+ kvi('Cache write', formatTokenCount(t.tokens.cacheWrite)),
460
+ kvi('Duration', formatDuration(t.duration)),
461
+ kvi('Units', String(t.units)),
462
+ kvi('Tool calls', String(t.toolCalls)),
463
+ kvi('Truncations', String(t.totalTruncationSections)),
464
+ ].join('');
465
+ const tokenBreakdown = buildTokenBreakdown(t.tokens);
466
+ const phaseRow = data.byPhase.length > 0 ? `
543
467
  <div class="chart-row">
544
468
  ${buildBarChart('Cost by phase', data.byPhase.map(p => ({
545
469
  label: p.phase, value: p.cost, display: formatCost(p.cost), sub: `${p.units} units`,
546
- })))}
470
+ })))}
547
471
  ${buildBarChart('Tokens by phase', data.byPhase.map(p => ({
548
472
  label: p.phase, value: p.tokens.total, display: formatTokenCount(p.tokens.total), sub: formatCost(p.cost),
549
- })))}
473
+ })))}
550
474
  </div>` : '';
551
-
552
- const sliceModelRow = (data.bySlice.length > 0 || data.byModel.length > 0) ? `
475
+ const sliceModelRow = (data.bySlice.length > 0 || data.byModel.length > 0) ? `
553
476
  <div class="chart-row">
554
477
  ${data.bySlice.length > 0 ? buildBarChart('Cost by slice', data.bySlice.map(s => ({
555
478
  label: s.sliceId, value: s.cost, display: formatCost(s.cost),
556
479
  sub: `${s.units} units`,
557
- }))) : ''}
480
+ }))) : ''}
558
481
  ${data.byModel.length > 0 ? buildBarChart('Cost by model', data.byModel.map(m => ({
559
482
  label: shortModel(m.model), value: m.cost, display: formatCost(m.cost),
560
483
  sub: `${m.units} units`,
561
- }))) : ''}
484
+ }))) : ''}
562
485
  ${data.bySlice.length > 0 ? buildBarChart('Duration by slice', data.bySlice.map(s => ({
563
486
  label: s.sliceId, value: s.duration, display: formatDuration(s.duration),
564
487
  sub: formatCost(s.cost),
565
- }))) : ''}
488
+ }))) : ''}
566
489
  </div>` : '';
567
-
568
- const costOverTime = buildCostOverTimeChart(data.units);
569
- const budgetBurndown = buildBudgetBurndown(data);
570
- const gantt = buildSliceGantt(data);
571
-
572
- return section('metrics', 'Metrics', `
490
+ const costOverTime = buildCostOverTimeChart(data.units);
491
+ const budgetBurndown = buildBudgetBurndown(data);
492
+ const gantt = buildSliceGantt(data);
493
+ return section('metrics', 'Metrics', `
573
494
  <div class="kv-grid">${grid}</div>
574
495
  ${budgetBurndown}
575
496
  ${tokenBreakdown}
@@ -579,42 +500,37 @@ function buildMetricsSection(data: VisualizerData): string {
579
500
  ${gantt}
580
501
  `);
581
502
  }
582
-
583
- function buildCostOverTimeChart(units: UnitMetrics[]): string {
584
- if (units.length < 2) return '';
585
- const sorted = [...units].sort((a, b) => a.startedAt - b.startedAt);
586
- const cumulative: number[] = [];
587
- let running = 0;
588
- for (const u of sorted) {
589
- running += u.cost;
590
- cumulative.push(running);
591
- }
592
-
593
- const padL = 50, padR = 30, padT = 20, padB = 30;
594
- const w = 600, h = 200;
595
- const plotW = w - padL - padR;
596
- const plotH = h - padT - padB;
597
- const maxCost = cumulative[cumulative.length - 1] || 1;
598
- const n = cumulative.length;
599
-
600
- const points = cumulative.map((c, i) => {
601
- const x = padL + (i / (n - 1)) * plotW;
602
- const y = padT + plotH - (c / maxCost) * plotH;
603
- return { x, y };
604
- });
605
-
606
- const linePath = points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' ');
607
- const areaPath = `${linePath} L${points[points.length - 1].x.toFixed(1)},${(padT + plotH).toFixed(1)} L${points[0].x.toFixed(1)},${(padT + plotH).toFixed(1)} Z`;
608
-
609
- const gridLines: string[] = [];
610
- for (let i = 0; i <= 4; i++) {
611
- const y = padT + (plotH / 4) * i;
612
- const val = formatCost(maxCost * (1 - i / 4));
613
- gridLines.push(`<line x1="${padL}" y1="${y}" x2="${w - padR}" y2="${y}" class="cost-grid"/>`);
614
- gridLines.push(`<text x="${padL - 4}" y="${y + 3}" class="cost-axis" text-anchor="end">${val}</text>`);
615
- }
616
-
617
- return `
503
+ function buildCostOverTimeChart(units) {
504
+ if (units.length < 2)
505
+ return '';
506
+ const sorted = [...units].sort((a, b) => a.startedAt - b.startedAt);
507
+ const cumulative = [];
508
+ let running = 0;
509
+ for (const u of sorted) {
510
+ running += u.cost;
511
+ cumulative.push(running);
512
+ }
513
+ const padL = 50, padR = 30, padT = 20, padB = 30;
514
+ const w = 600, h = 200;
515
+ const plotW = w - padL - padR;
516
+ const plotH = h - padT - padB;
517
+ const maxCost = cumulative[cumulative.length - 1] || 1;
518
+ const n = cumulative.length;
519
+ const points = cumulative.map((c, i) => {
520
+ const x = padL + (i / (n - 1)) * plotW;
521
+ const y = padT + plotH - (c / maxCost) * plotH;
522
+ return { x, y };
523
+ });
524
+ const linePath = points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' ');
525
+ const areaPath = `${linePath} L${points[points.length - 1].x.toFixed(1)},${(padT + plotH).toFixed(1)} L${points[0].x.toFixed(1)},${(padT + plotH).toFixed(1)} Z`;
526
+ const gridLines = [];
527
+ for (let i = 0; i <= 4; i++) {
528
+ const y = padT + (plotH / 4) * i;
529
+ const val = formatCost(maxCost * (1 - i / 4));
530
+ gridLines.push(`<line x1="${padL}" y1="${y}" x2="${w - padR}" y2="${y}" class="cost-grid"/>`);
531
+ gridLines.push(`<text x="${padL - 4}" y="${y + 3}" class="cost-axis" text-anchor="end">${val}</text>`);
532
+ }
533
+ return `
618
534
  <div class="token-block">
619
535
  <h3>Cost over time</h3>
620
536
  <svg class="cost-svg" viewBox="0 0 ${w} ${h}" width="${w}" height="${h}">
@@ -626,30 +542,27 @@ function buildCostOverTimeChart(units: UnitMetrics[]): string {
626
542
  </svg>
627
543
  </div>`;
628
544
  }
629
-
630
- function buildBudgetBurndown(data: VisualizerData): string {
631
- if (!data.health.budgetCeiling) return '';
632
- const ceiling = data.health.budgetCeiling;
633
- const spent = data.totals?.cost ?? 0;
634
- const totalSlices = data.milestones.reduce((s, m) => s + m.slices.length, 0);
635
- const doneSlices = data.milestones.reduce((s, m) => s + m.slices.filter(sl => sl.done).length, 0);
636
- const avgCostPerSlice = doneSlices > 0 ? spent / doneSlices : 0;
637
- const projected = avgCostPerSlice > 0 ? avgCostPerSlice * data.remainingSliceCount + spent : spent;
638
- const maxVal = Math.max(ceiling, projected, spent);
639
-
640
- const spentPct = (spent / maxVal) * 100;
641
- const projectedRemPct = Math.max(0, ((projected - spent) / maxVal) * 100);
642
- const overshoot = projected > ceiling ? ((projected - ceiling) / maxVal) * 100 : 0;
643
- const projectedClean = projectedRemPct - overshoot;
644
-
645
- const legend = [
646
- `<span><span class="burndown-dot" style="background:var(--accent)"></span> Spent: ${formatCost(spent)}</span>`,
647
- `<span><span class="burndown-dot" style="background:var(--caution)"></span> Projected remaining: ${formatCost(Math.max(0, projected - spent))}</span>`,
648
- `<span><span class="burndown-dot" style="background:var(--border-2)"></span> Ceiling: ${formatCost(ceiling)}</span>`,
649
- overshoot > 0 ? `<span><span class="burndown-dot" style="background:var(--warn)"></span> Overshoot: ${formatCost(projected - ceiling)}</span>` : '',
650
- ].filter(Boolean).join('');
651
-
652
- return `
545
+ function buildBudgetBurndown(data) {
546
+ if (!data.health.budgetCeiling)
547
+ return '';
548
+ const ceiling = data.health.budgetCeiling;
549
+ const spent = data.totals?.cost ?? 0;
550
+ const totalSlices = data.milestones.reduce((s, m) => s + m.slices.length, 0);
551
+ const doneSlices = data.milestones.reduce((s, m) => s + m.slices.filter(sl => sl.done).length, 0);
552
+ const avgCostPerSlice = doneSlices > 0 ? spent / doneSlices : 0;
553
+ const projected = avgCostPerSlice > 0 ? avgCostPerSlice * data.remainingSliceCount + spent : spent;
554
+ const maxVal = Math.max(ceiling, projected, spent);
555
+ const spentPct = (spent / maxVal) * 100;
556
+ const projectedRemPct = Math.max(0, ((projected - spent) / maxVal) * 100);
557
+ const overshoot = projected > ceiling ? ((projected - ceiling) / maxVal) * 100 : 0;
558
+ const projectedClean = projectedRemPct - overshoot;
559
+ const legend = [
560
+ `<span><span class="burndown-dot" style="background:var(--accent)"></span> Spent: ${formatCost(spent)}</span>`,
561
+ `<span><span class="burndown-dot" style="background:var(--caution)"></span> Projected remaining: ${formatCost(Math.max(0, projected - spent))}</span>`,
562
+ `<span><span class="burndown-dot" style="background:var(--border-2)"></span> Ceiling: ${formatCost(ceiling)}</span>`,
563
+ overshoot > 0 ? `<span><span class="burndown-dot" style="background:var(--warn)"></span> Overshoot: ${formatCost(projected - ceiling)}</span>` : '',
564
+ ].filter(Boolean).join('');
565
+ return `
653
566
  <div class="burndown-wrap">
654
567
  <h3>Budget burndown</h3>
655
568
  <div class="burndown-bar">
@@ -660,61 +573,56 @@ function buildBudgetBurndown(data: VisualizerData): string {
660
573
  <div class="burndown-legend">${legend}</div>
661
574
  </div>`;
662
575
  }
663
-
664
- function buildSliceGantt(data: VisualizerData): string {
665
- const sliceTimings = new Map<string, { min: number; max: number }>();
666
- for (const u of data.units) {
667
- const parts = u.id.split('/');
668
- const sliceKey = parts.length >= 2 ? `${parts[0]}/${parts[1]}` : u.id;
669
- if (u.startedAt <= 0) continue;
670
- const existing = sliceTimings.get(sliceKey);
671
- const end = u.finishedAt > 0 ? u.finishedAt : Date.now();
672
- if (existing) {
673
- existing.min = Math.min(existing.min, u.startedAt);
674
- existing.max = Math.max(existing.max, end);
675
- } else {
676
- sliceTimings.set(sliceKey, { min: u.startedAt, max: end });
576
+ function buildSliceGantt(data) {
577
+ const sliceTimings = new Map();
578
+ for (const u of data.units) {
579
+ const parts = u.id.split('/');
580
+ const sliceKey = parts.length >= 2 ? `${parts[0]}/${parts[1]}` : u.id;
581
+ if (u.startedAt <= 0)
582
+ continue;
583
+ const existing = sliceTimings.get(sliceKey);
584
+ const end = u.finishedAt > 0 ? u.finishedAt : Date.now();
585
+ if (existing) {
586
+ existing.min = Math.min(existing.min, u.startedAt);
587
+ existing.max = Math.max(existing.max, end);
588
+ }
589
+ else {
590
+ sliceTimings.set(sliceKey, { min: u.startedAt, max: end });
591
+ }
677
592
  }
678
- }
679
-
680
- if (sliceTimings.size < 2) return '';
681
-
682
- const sliceEntries = [...sliceTimings.entries()].sort((a, b) => a[1].min - b[1].min);
683
- const globalMin = Math.min(...sliceEntries.map(e => e[1].min));
684
- const globalMax = Math.max(...sliceEntries.map(e => e[1].max));
685
- const range = globalMax - globalMin || 1;
686
-
687
- const sliceCount = sliceEntries.length;
688
- const barH = 18, rowH = 30, padL = 140, padR = 20, padT = 30, padB = 30;
689
- const plotW = 700 - padL - padR;
690
- const svgH = sliceCount * rowH + padT + padB;
691
-
692
- // Build a lookup of slice status
693
- const sliceStatusMap = new Map<string, string>();
694
- for (const ms of data.milestones) {
695
- for (const sl of ms.slices) {
696
- const key = `${ms.id}/${sl.id}`;
697
- sliceStatusMap.set(key, sl.done ? 'done' : sl.active ? 'active' : 'pending');
593
+ if (sliceTimings.size < 2)
594
+ return '';
595
+ const sliceEntries = [...sliceTimings.entries()].sort((a, b) => a[1].min - b[1].min);
596
+ const globalMin = Math.min(...sliceEntries.map(e => e[1].min));
597
+ const globalMax = Math.max(...sliceEntries.map(e => e[1].max));
598
+ const range = globalMax - globalMin || 1;
599
+ const sliceCount = sliceEntries.length;
600
+ const barH = 18, rowH = 30, padL = 140, padR = 20, padT = 30, padB = 30;
601
+ const plotW = 700 - padL - padR;
602
+ const svgH = sliceCount * rowH + padT + padB;
603
+ // Build a lookup of slice status
604
+ const sliceStatusMap = new Map();
605
+ for (const ms of data.milestones) {
606
+ for (const sl of ms.slices) {
607
+ const key = `${ms.id}/${sl.id}`;
608
+ sliceStatusMap.set(key, sl.done ? 'done' : sl.active ? 'active' : 'pending');
609
+ }
698
610
  }
699
- }
700
-
701
- const bars = sliceEntries.map(([sliceId, timing], i) => {
702
- const x = padL + ((timing.min - globalMin) / range) * plotW;
703
- const w = Math.max(2, ((timing.max - timing.min) / range) * plotW);
704
- const y = padT + i * rowH + (rowH - barH) / 2;
705
- const status = sliceStatusMap.get(sliceId) ?? 'pending';
706
- return `<text x="${padL - 6}" y="${y + barH / 2 + 4}" class="gantt-label" text-anchor="end">${esc(truncStr(sliceId, 18))}</text>
611
+ const bars = sliceEntries.map(([sliceId, timing], i) => {
612
+ const x = padL + ((timing.min - globalMin) / range) * plotW;
613
+ const w = Math.max(2, ((timing.max - timing.min) / range) * plotW);
614
+ const y = padT + i * rowH + (rowH - barH) / 2;
615
+ const status = sliceStatusMap.get(sliceId) ?? 'pending';
616
+ return `<text x="${padL - 6}" y="${y + barH / 2 + 4}" class="gantt-label" text-anchor="end">${esc(truncStr(sliceId, 18))}</text>
707
617
  <rect x="${x.toFixed(1)}" y="${y.toFixed(1)}" width="${w.toFixed(1)}" height="${barH}" rx="2" class="gantt-bar-${status}"><title>${esc(sliceId)}: ${formatDuration(timing.max - timing.min)}</title></rect>`;
708
- }).join('\n');
709
-
710
- // Time axis labels
711
- const axisLabels = [0, 0.25, 0.5, 0.75, 1].map(frac => {
712
- const t = globalMin + frac * range;
713
- const x = padL + frac * plotW;
714
- return `<text x="${x.toFixed(1)}" y="${svgH - 8}" class="gantt-axis" text-anchor="middle">${formatDateShort(new Date(t).toISOString())}</text>`;
715
- }).join('');
716
-
717
- return `
618
+ }).join('\n');
619
+ // Time axis labels
620
+ const axisLabels = [0, 0.25, 0.5, 0.75, 1].map(frac => {
621
+ const t = globalMin + frac * range;
622
+ const x = padL + frac * plotW;
623
+ return `<text x="${x.toFixed(1)}" y="${svgH - 8}" class="gantt-axis" text-anchor="middle">${formatDateShort(new Date(t).toISOString())}</text>`;
624
+ }).join('');
625
+ return `
718
626
  <div class="gantt-wrap">
719
627
  <h3>Slice timeline</h3>
720
628
  <svg class="gantt-svg" viewBox="0 0 700 ${svgH}" width="700" height="${svgH}">
@@ -723,69 +631,60 @@ function buildSliceGantt(data: VisualizerData): string {
723
631
  </svg>
724
632
  </div>`;
725
633
  }
726
-
727
- function buildTokenBreakdown(tokens: { input: number; output: number; cacheRead: number; cacheWrite: number; total: number }): string {
728
- if (tokens.total === 0) return '';
729
- const segs = [
730
- { label: 'Input', value: tokens.input, cls: 'seg-1' },
731
- { label: 'Output', value: tokens.output, cls: 'seg-2' },
732
- { label: 'Cache read', value: tokens.cacheRead, cls: 'seg-3' },
733
- { label: 'Cache write', value: tokens.cacheWrite, cls: 'seg-4' },
734
- ].filter(s => s.value > 0);
735
-
736
- const bars = segs.map(s => {
737
- const pct = (s.value / tokens.total) * 100;
738
- return `<div class="tseg ${s.cls}" style="width:${pct.toFixed(2)}%" title="${s.label}: ${formatTokenCount(s.value)} (${pct.toFixed(1)}%)"></div>`;
739
- }).join('');
740
-
741
- const legend = segs.map(s => {
742
- const pct = ((s.value / tokens.total) * 100).toFixed(1);
743
- return `<span class="leg-item"><span class="leg-dot ${s.cls}"></span>${s.label}: ${formatTokenCount(s.value)} (${pct}%)</span>`;
744
- }).join('');
745
-
746
- return `
634
+ function buildTokenBreakdown(tokens) {
635
+ if (tokens.total === 0)
636
+ return '';
637
+ const segs = [
638
+ { label: 'Input', value: tokens.input, cls: 'seg-1' },
639
+ { label: 'Output', value: tokens.output, cls: 'seg-2' },
640
+ { label: 'Cache read', value: tokens.cacheRead, cls: 'seg-3' },
641
+ { label: 'Cache write', value: tokens.cacheWrite, cls: 'seg-4' },
642
+ ].filter(s => s.value > 0);
643
+ const bars = segs.map(s => {
644
+ const pct = (s.value / tokens.total) * 100;
645
+ return `<div class="tseg ${s.cls}" style="width:${pct.toFixed(2)}%" title="${s.label}: ${formatTokenCount(s.value)} (${pct.toFixed(1)}%)"></div>`;
646
+ }).join('');
647
+ const legend = segs.map(s => {
648
+ const pct = ((s.value / tokens.total) * 100).toFixed(1);
649
+ return `<span class="leg-item"><span class="leg-dot ${s.cls}"></span>${s.label}: ${formatTokenCount(s.value)} (${pct}%)</span>`;
650
+ }).join('');
651
+ return `
747
652
  <div class="token-block">
748
653
  <h3>Token breakdown</h3>
749
654
  <div class="token-bar">${bars}</div>
750
655
  <div class="token-legend">${legend}</div>
751
656
  </div>`;
752
657
  }
753
-
754
- interface BarEntry { label: string; value: number; display: string; sub?: string; color?: number }
755
-
756
658
  const CHART_COLORS = 6;
757
-
758
- function buildBarChart(title: string, entries: BarEntry[]): string {
759
- if (entries.length === 0) return '';
760
- const max = Math.max(...entries.map(e => e.value), 1);
761
- const rows = entries.map((e, i) => {
762
- const pct = (e.value / max) * 100;
763
- const ci = e.color ?? i;
764
- return `
659
+ function buildBarChart(title, entries) {
660
+ if (entries.length === 0)
661
+ return '';
662
+ const max = Math.max(...entries.map(e => e.value), 1);
663
+ const rows = entries.map((e, i) => {
664
+ const pct = (e.value / max) * 100;
665
+ const ci = e.color ?? i;
666
+ return `
765
667
  <div class="bar-row">
766
668
  <div class="bar-lbl">${esc(truncStr(e.label, 22))}</div>
767
669
  <div class="bar-track"><div class="bar-fill bar-c${ci % CHART_COLORS}" style="width:${pct.toFixed(1)}%"></div></div>
768
670
  <div class="bar-val">${esc(e.display)}</div>
769
671
  </div>
770
672
  ${e.sub ? `<div class="bar-sub">${esc(e.sub)}</div>` : ''}`;
771
- }).join('');
772
- return `<div class="chart-block"><h3>${esc(title)}</h3>${rows}</div>`;
673
+ }).join('');
674
+ return `<div class="chart-block"><h3>${esc(title)}</h3>${rows}</div>`;
773
675
  }
774
-
775
676
  // ─── Section: Timeline ────────────────────────────────────────────────────────
776
-
777
- function buildTimelineSection(data: VisualizerData): string {
778
- if (data.units.length === 0) return section('timeline', 'Timeline', '<p class="empty">No units executed yet.</p>');
779
-
780
- const sorted = [...data.units].sort((a, b) => a.startedAt - b.startedAt);
781
- const maxCost = Math.max(...sorted.map(u => u.cost), 0.01);
782
-
783
- const rows = sorted.map((u, i) => {
784
- const dur = u.finishedAt > 0 ? formatDuration(u.finishedAt - u.startedAt) : 'running';
785
- // Cost heatmap: subtle red background for expensive rows
786
- const intensity = Math.min(u.cost / maxCost, 1);
787
- const heatStyle = intensity > 0.15 ? ` style="background:rgba(239,68,68,${(intensity * 0.15).toFixed(3)})"` : '';
788
- return `
677
+ function buildTimelineSection(data) {
678
+ if (data.units.length === 0)
679
+ return section('timeline', 'Timeline', '<p class="empty">No units executed yet.</p>');
680
+ const sorted = [...data.units].sort((a, b) => a.startedAt - b.startedAt);
681
+ const maxCost = Math.max(...sorted.map(u => u.cost), 0.01);
682
+ const rows = sorted.map((u, i) => {
683
+ const dur = u.finishedAt > 0 ? formatDuration(u.finishedAt - u.startedAt) : 'running';
684
+ // Cost heatmap: subtle red background for expensive rows
685
+ const intensity = Math.min(u.cost / maxCost, 1);
686
+ const heatStyle = intensity > 0.15 ? ` style="background:rgba(239,68,68,${(intensity * 0.15).toFixed(3)})"` : '';
687
+ return `
789
688
  <tr${heatStyle}>
790
689
  <td class="muted">${i + 1}</td>
791
690
  <td class="mono">${esc(u.type)}</td>
@@ -801,9 +700,8 @@ function buildTimelineSection(data: VisualizerData): string {
801
700
  <td class="num">${(u.truncationSections ?? 0) > 0 ? u.truncationSections : ''}</td>
802
701
  <td>${u.continueHereFired ? 'yes' : ''}</td>
803
702
  </tr>`;
804
- }).join('');
805
-
806
- return section('timeline', 'Timeline', `
703
+ }).join('');
704
+ return section('timeline', 'Timeline', `
807
705
  <div class="table-scroll">
808
706
  <table class="tbl">
809
707
  <thead><tr>
@@ -815,28 +713,24 @@ function buildTimelineSection(data: VisualizerData): string {
815
713
  </table>
816
714
  </div>`);
817
715
  }
818
-
819
716
  // ─── Section: Changelog ───────────────────────────────────────────────────────
820
-
821
- function buildChangelogSection(data: VisualizerData): string {
822
- if (data.changelog.entries.length === 0) return section('changelog', 'Changelog', '<p class="empty">No completed slices yet.</p>');
823
-
824
- const entries = data.changelog.entries.map(e => {
825
- const filesHtml = e.filesModified.length > 0 ? `
717
+ function buildChangelogSection(data) {
718
+ if (data.changelog.entries.length === 0)
719
+ return section('changelog', 'Changelog', '<p class="empty">No completed slices yet.</p>');
720
+ const entries = data.changelog.entries.map(e => {
721
+ const filesHtml = e.filesModified.length > 0 ? `
826
722
  <details class="files-detail">
827
723
  <summary class="muted">${e.filesModified.length} file${e.filesModified.length !== 1 ? 's' : ''} modified</summary>
828
724
  <ul class="file-list">
829
725
  ${e.filesModified.map(f => `<li><code>${esc(f.path)}</code>${f.description ? ` — ${esc(f.description)}` : ''}</li>`).join('')}
830
726
  </ul>
831
727
  </details>` : '';
832
-
833
- const ver = data.sliceVerifications.find(v => v.sliceId === e.sliceId);
834
- const decisionsHtml = ver?.keyDecisions?.length ? `
728
+ const ver = data.sliceVerifications.find(v => v.sliceId === e.sliceId);
729
+ const decisionsHtml = ver?.keyDecisions?.length ? `
835
730
  <div class="detail-block"><span class="detail-label">Decisions</span>
836
731
  <ul>${ver.keyDecisions.map(d => `<li>${esc(d)}</li>`).join('')}</ul>
837
732
  </div>` : '';
838
-
839
- return `
733
+ return `
840
734
  <div class="cl-entry">
841
735
  <div class="cl-header">
842
736
  <span class="mono muted">${esc(e.milestoneId)}/${esc(e.sliceId)}</span>
@@ -847,54 +741,46 @@ function buildChangelogSection(data: VisualizerData): string {
847
741
  ${decisionsHtml}
848
742
  ${filesHtml}
849
743
  </div>`;
850
- }).join('');
851
-
852
- return section('changelog', `Changelog <span class="count">${data.changelog.entries.length}</span>`, entries);
744
+ }).join('');
745
+ return section('changelog', `Changelog <span class="count">${data.changelog.entries.length}</span>`, entries);
853
746
  }
854
-
855
747
  // ─── Section: Knowledge ───────────────────────────────────────────────────────
856
-
857
- function buildKnowledgeSection(data: VisualizerData): string {
858
- const k = data.knowledge;
859
- if (!k.exists) return section('knowledge', 'Knowledge', '<p class="empty">No KNOWLEDGE.md found.</p>');
860
- const total = k.rules.length + k.patterns.length + k.lessons.length;
861
- if (total === 0) return section('knowledge', 'Knowledge', '<p class="empty">KNOWLEDGE.md exists but no entries parsed.</p>');
862
-
863
- const rulesHtml = k.rules.length > 0 ? `
748
+ function buildKnowledgeSection(data) {
749
+ const k = data.knowledge;
750
+ if (!k.exists)
751
+ return section('knowledge', 'Knowledge', '<p class="empty">No KNOWLEDGE.md found.</p>');
752
+ const total = k.rules.length + k.patterns.length + k.lessons.length;
753
+ if (total === 0)
754
+ return section('knowledge', 'Knowledge', '<p class="empty">KNOWLEDGE.md exists but no entries parsed.</p>');
755
+ const rulesHtml = k.rules.length > 0 ? `
864
756
  <h3>Rules <span class="count">${k.rules.length}</span></h3>
865
757
  <table class="tbl">
866
758
  <thead><tr><th>ID</th><th>Scope</th><th>Rule</th></tr></thead>
867
759
  <tbody>${k.rules.map(r => `<tr><td class="mono">${esc(r.id)}</td><td>${esc(r.scope)}</td><td>${esc(r.content)}</td></tr>`).join('')}</tbody>
868
760
  </table>` : '';
869
-
870
- const patternsHtml = k.patterns.length > 0 ? `
761
+ const patternsHtml = k.patterns.length > 0 ? `
871
762
  <h3>Patterns <span class="count">${k.patterns.length}</span></h3>
872
763
  <table class="tbl">
873
764
  <thead><tr><th>ID</th><th>Pattern</th></tr></thead>
874
765
  <tbody>${k.patterns.map(p => `<tr><td class="mono">${esc(p.id)}</td><td>${esc(p.content)}</td></tr>`).join('')}</tbody>
875
766
  </table>` : '';
876
-
877
- const lessonsHtml = k.lessons.length > 0 ? `
767
+ const lessonsHtml = k.lessons.length > 0 ? `
878
768
  <h3>Lessons <span class="count">${k.lessons.length}</span></h3>
879
769
  <table class="tbl">
880
770
  <thead><tr><th>ID</th><th>Lesson</th></tr></thead>
881
771
  <tbody>${k.lessons.map(l => `<tr><td class="mono">${esc(l.id)}</td><td>${esc(l.content)}</td></tr>`).join('')}</tbody>
882
772
  </table>` : '';
883
-
884
- return section('knowledge', `Knowledge <span class="count">${total}</span>`, `${rulesHtml}${patternsHtml}${lessonsHtml}`);
773
+ return section('knowledge', `Knowledge <span class="count">${total}</span>`, `${rulesHtml}${patternsHtml}${lessonsHtml}`);
885
774
  }
886
-
887
775
  // ─── Section: Captures ────────────────────────────────────────────────────────
888
-
889
- function buildCapturesSection(data: VisualizerData): string {
890
- const c = data.captures;
891
- if (c.totalCount === 0) return section('captures', 'Captures', '<p class="empty">No captures recorded.</p>');
892
-
893
- const badge = c.pendingCount > 0
894
- ? `<span class="count count-warn">${c.pendingCount} pending</span>`
895
- : `<span class="count">all triaged</span>`;
896
-
897
- const rows = c.entries.map(e => `
776
+ function buildCapturesSection(data) {
777
+ const c = data.captures;
778
+ if (c.totalCount === 0)
779
+ return section('captures', 'Captures', '<p class="empty">No captures recorded.</p>');
780
+ const badge = c.pendingCount > 0
781
+ ? `<span class="count count-warn">${c.pendingCount} pending</span>`
782
+ : `<span class="count">all triaged</span>`;
783
+ const rows = c.entries.map(e => `
898
784
  <tr>
899
785
  <td class="muted">${formatDateShort(new Date(e.timestamp).toISOString())}</td>
900
786
  <td class="mono">${esc(e.status)}</td>
@@ -905,8 +791,7 @@ function buildCapturesSection(data: VisualizerData): string {
905
791
  <td class="muted">${e.resolvedAt ? formatDateShort(e.resolvedAt) : ''}</td>
906
792
  <td>${e.executed !== undefined ? (e.executed ? 'yes' : 'no') : ''}</td>
907
793
  </tr>`).join('');
908
-
909
- return section('captures', `Captures ${badge}`, `
794
+ return section('captures', `Captures ${badge}`, `
910
795
  <div class="table-scroll">
911
796
  <table class="tbl">
912
797
  <thead><tr><th>Captured</th><th>Status</th><th>Class</th><th>Resolution</th><th>Text</th><th>Rationale</th><th>Resolved</th><th>Executed</th></tr></thead>
@@ -914,25 +799,21 @@ function buildCapturesSection(data: VisualizerData): string {
914
799
  </table>
915
800
  </div>`);
916
801
  }
917
-
918
802
  // ─── Section: Stats ───────────────────────────────────────────────────────────
919
-
920
- function buildStatsSection(data: VisualizerData): string {
921
- const s = data.stats;
922
-
923
- const missingHtml = s.missingCount > 0 ? `
803
+ function buildStatsSection(data) {
804
+ const s = data.stats;
805
+ const missingHtml = s.missingCount > 0 ? `
924
806
  <h3>Missing changelogs <span class="count">${s.missingCount}</span></h3>
925
807
  <table class="tbl">
926
808
  <thead><tr><th>Milestone</th><th>Slice</th><th>Title</th></tr></thead>
927
809
  <tbody>
928
810
  ${s.missingSlices.map(sl => `<tr><td class="mono">${esc(sl.milestoneId)}</td><td class="mono">${esc(sl.sliceId)}</td><td>${esc(sl.title)}</td></tr>`).join('')}
929
811
  ${s.missingCount > s.missingSlices.length
930
- ? `<tr><td colspan="3" class="muted">and ${s.missingCount - s.missingSlices.length} more</td></tr>`
931
- : ''}
812
+ ? `<tr><td colspan="3" class="muted">and ${s.missingCount - s.missingSlices.length} more</td></tr>`
813
+ : ''}
932
814
  </tbody>
933
815
  </table>` : '';
934
-
935
- const updatedHtml = s.updatedCount > 0 ? `
816
+ const updatedHtml = s.updatedCount > 0 ? `
936
817
  <h3>Recently completed <span class="count">${s.updatedCount}</span></h3>
937
818
  <table class="tbl">
938
819
  <thead><tr><th>Milestone</th><th>Slice</th><th>Title</th><th>Completed</th></tr></thead>
@@ -940,20 +821,16 @@ function buildStatsSection(data: VisualizerData): string {
940
821
  <tr><td class="mono">${esc(sl.milestoneId)}</td><td class="mono">${esc(sl.sliceId)}</td><td>${esc(sl.title)}</td><td class="muted">${sl.completedAt ? formatDateShort(sl.completedAt) : ''}</td></tr>`).join('')}
941
822
  </tbody>
942
823
  </table>` : '';
943
-
944
- if (!missingHtml && !updatedHtml) {
945
- return section('stats', 'Artifacts', '<p class="empty">All artifacts accounted for.</p>');
946
- }
947
-
948
- return section('stats', 'Artifacts', `${missingHtml}${updatedHtml}`);
824
+ if (!missingHtml && !updatedHtml) {
825
+ return section('stats', 'Artifacts', '<p class="empty">All artifacts accounted for.</p>');
826
+ }
827
+ return section('stats', 'Artifacts', `${missingHtml}${updatedHtml}`);
949
828
  }
950
-
951
829
  // ─── Section: Discussion ──────────────────────────────────────────────────────
952
-
953
- function buildDiscussionSection(data: VisualizerData): string {
954
- if (data.discussion.length === 0) return section('discussion', 'Planning', '<p class="empty">No milestones.</p>');
955
-
956
- const rows = data.discussion.map(d => `
830
+ function buildDiscussionSection(data) {
831
+ if (data.discussion.length === 0)
832
+ return section('discussion', 'Planning', '<p class="empty">No milestones.</p>');
833
+ const rows = data.discussion.map(d => `
957
834
  <tr>
958
835
  <td class="mono">${esc(d.milestoneId)}</td>
959
836
  <td>${esc(d.title)}</td>
@@ -962,48 +839,41 @@ function buildDiscussionSection(data: VisualizerData): string {
962
839
  <td>${d.hasDraft ? 'draft' : ''}</td>
963
840
  <td class="muted">${d.lastUpdated ? formatDateShort(d.lastUpdated) : ''}</td>
964
841
  </tr>`).join('');
965
-
966
- return section('discussion', 'Planning', `
842
+ return section('discussion', 'Planning', `
967
843
  <table class="tbl">
968
844
  <thead><tr><th>ID</th><th>Milestone</th><th>State</th><th>Context</th><th>Draft</th><th>Updated</th></tr></thead>
969
845
  <tbody>${rows}</tbody>
970
846
  </table>`);
971
847
  }
972
-
973
848
  // ─── Primitives ────────────────────────────────────────────────────────────────
974
-
975
- function section(id: string, title: string, body: string): string {
976
- return `\n<section id="${id}">\n <h2>${title}</h2>\n ${body}\n</section>`;
849
+ function section(id, title, body) {
850
+ return `\n<section id="${id}">\n <h2>${title}</h2>\n ${body}\n</section>`;
977
851
  }
978
-
979
- function kvi(label: string, value: string): string {
980
- return `<div class="kv"><span class="kv-val">${esc(value)}</span><span class="kv-lbl">${esc(label)}</span></div>`;
852
+ function kvi(label, value) {
853
+ return `<div class="kv"><span class="kv-val">${esc(value)}</span><span class="kv-lbl">${esc(label)}</span></div>`;
981
854
  }
982
-
983
- function hRow(label: string, value: string, status?: 'ok' | 'caution' | 'warn'): string {
984
- const cls = status ? ` class="h-${status}"` : '';
985
- return `<tr${cls}><td>${esc(label)}</td><td>${esc(value)}</td></tr>`;
855
+ function hRow(label, value, status) {
856
+ const cls = status ? ` class="h-${status}"` : '';
857
+ return `<tr${cls}><td>${esc(label)}</td><td>${esc(value)}</td></tr>`;
986
858
  }
987
-
988
- function shortModel(m: string) { return m.replace(/^claude-/, '').replace(/^anthropic\//, ''); }
989
- function truncStr(s: string, n: number) { return s.length > n ? s.slice(0, n - 1) + '\u2026' : s; }
990
-
991
- function formatDateLong(iso: string): string {
992
- try {
993
- const d = new Date(iso);
994
- return d.toLocaleString('en-US', { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit', timeZoneName: 'short' });
995
- } catch { return iso; }
859
+ function shortModel(m) { return m.replace(/^claude-/, '').replace(/^anthropic\//, ''); }
860
+ function truncStr(s, n) { return s.length > n ? s.slice(0, n - 1) + '\u2026' : s; }
861
+ function formatDateLong(iso) {
862
+ try {
863
+ const d = new Date(iso);
864
+ return d.toLocaleString('en-US', { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit', timeZoneName: 'short' });
865
+ }
866
+ catch {
867
+ return iso;
868
+ }
996
869
  }
997
-
998
-
999
- function esc(s: string | undefined | null): string {
1000
- if (s == null) return '';
1001
- return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
870
+ function esc(s) {
871
+ if (s == null)
872
+ return '';
873
+ return String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
1002
874
  }
1003
-
1004
875
  // ─── CSS ───────────────────────────────────────────────────────────────────────
1005
876
  // Linear-inspired: restrained palette, one accent, no emoji, no gradients.
1006
-
1007
877
  const CSS = `
1008
878
  *,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
1009
879
  :root{
@@ -1276,9 +1146,7 @@ footer{border-top:1px solid var(--border-1);padding:20px 32px;margin-top:40px}
1276
1146
  .table-scroll{overflow:visible}
1277
1147
  }
1278
1148
  `;
1279
-
1280
1149
  // ─── JS ────────────────────────────────────────────────────────────────────────
1281
-
1282
1150
  const JS = `
1283
1151
  (function(){
1284
1152
  const sections=document.querySelectorAll('section[id]');