@opengsd/gsd-pi 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1343) hide show
  1. package/README.md +51 -3
  2. package/dist/claude-cli-check.js +1 -1
  3. package/dist/cli-policy.d.ts +1 -1
  4. package/dist/cli-policy.js +2 -2
  5. package/dist/cli.js +4 -3
  6. package/dist/extension-sort.js +1 -1
  7. package/dist/extension-validator.js +1 -1
  8. package/dist/help-text.js +8 -0
  9. package/dist/loader-entrypoint.js +1 -1
  10. package/dist/loader.js +0 -0
  11. package/dist/resource-loader.js +22 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +2 -2
  14. package/dist/resources/extensions/github-sync/templates.js +1 -1
  15. package/dist/resources/extensions/gsd/auto/contracts.js +1 -1
  16. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +1 -1
  17. package/dist/resources/extensions/gsd/auto/lease-conflict-notice.js +1 -1
  18. package/dist/resources/extensions/gsd/auto/loop.js +2 -2
  19. package/dist/resources/extensions/gsd/auto/orchestrator.js +1 -1
  20. package/dist/resources/extensions/gsd/auto/phases.js +9 -3
  21. package/dist/resources/extensions/gsd/auto/run-unit.js +110 -44
  22. package/dist/resources/extensions/gsd/auto/schedule-wakeup.js +18 -0
  23. package/dist/resources/extensions/gsd/auto/session.js +1 -1
  24. package/dist/resources/extensions/gsd/auto/unit-runner-events.js +1 -1
  25. package/dist/resources/extensions/gsd/auto/verification-retry-policy.js +1 -1
  26. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +1 -1
  27. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +1 -1
  28. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +1 -1
  29. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +1 -1
  30. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +1 -1
  31. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +1 -1
  33. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +1 -1
  34. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +1 -1
  35. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +1 -1
  36. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +1 -1
  37. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +1 -1
  38. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +1 -1
  39. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +1 -1
  40. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +1 -1
  41. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +1 -1
  42. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +1 -1
  43. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  44. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +1 -1
  45. package/dist/resources/extensions/gsd/auto-artifact-paths.js +1 -1
  46. package/dist/resources/extensions/gsd/auto-budget.js +1 -1
  47. package/dist/resources/extensions/gsd/auto-dashboard.js +1 -1
  48. package/dist/resources/extensions/gsd/auto-dispatch.js +1 -1
  49. package/dist/resources/extensions/gsd/auto-post-unit.js +1 -1
  50. package/dist/resources/extensions/gsd/auto-prompts.js +2 -2
  51. package/dist/resources/extensions/gsd/auto-recovery.js +1 -1
  52. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  53. package/dist/resources/extensions/gsd/auto-status-message.js +1 -1
  54. package/dist/resources/extensions/gsd/auto-timers.js +11 -3
  55. package/dist/resources/extensions/gsd/auto-unit-closeout.js +1 -1
  56. package/dist/resources/extensions/gsd/auto-verification.js +1 -1
  57. package/dist/resources/extensions/gsd/auto-worktree-repair.js +1 -1
  58. package/dist/resources/extensions/gsd/auto-worktree.js +1 -1
  59. package/dist/resources/extensions/gsd/auto.js +33 -4
  60. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +5 -9
  61. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +1 -1
  62. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +1 -1
  63. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  64. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +1 -1
  65. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +2 -2
  66. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  67. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +3 -1
  68. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +3 -1
  69. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +1 -1
  70. package/dist/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.js +69 -0
  71. package/dist/resources/extensions/gsd/bootstrap/system-context.js +1 -1
  72. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +1 -1
  73. package/dist/resources/extensions/gsd/browser-evidence.js +1 -1
  74. package/dist/resources/extensions/gsd/closeout-recovery.js +1 -1
  75. package/dist/resources/extensions/gsd/commands/catalog.js +2 -1
  76. package/dist/resources/extensions/gsd/commands/dispatcher.js +1 -1
  77. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -0
  78. package/dist/resources/extensions/gsd/commands/handlers/notifications-handler.js +1 -1
  79. package/dist/resources/extensions/gsd/commands/handlers/ops.js +1 -1
  80. package/dist/resources/extensions/gsd/commands-bootstrap.js +1 -0
  81. package/dist/resources/extensions/gsd/commands-closeout.js +1 -1
  82. package/dist/resources/extensions/gsd/commands-ship.js +1 -1
  83. package/dist/resources/extensions/gsd/commands-verdict.js +1 -1
  84. package/dist/resources/extensions/gsd/commands-workflow-templates.js +1 -1
  85. package/dist/resources/extensions/gsd/commands-worktree.js +1 -1
  86. package/dist/resources/extensions/gsd/component-loader.js +1 -1
  87. package/dist/resources/extensions/gsd/db/auto-workers.js +1 -1
  88. package/dist/resources/extensions/gsd/db/command-queue.js +1 -1
  89. package/dist/resources/extensions/gsd/db/milestone-leases.js +20 -6
  90. package/dist/resources/extensions/gsd/db/runtime-kv.js +1 -1
  91. package/dist/resources/extensions/gsd/db/unit-dispatches.js +1 -1
  92. package/dist/resources/extensions/gsd/db-adapter.js +1 -1
  93. package/dist/resources/extensions/gsd/db-base-schema.js +1 -1
  94. package/dist/resources/extensions/gsd/db-connection-cache.js +1 -1
  95. package/dist/resources/extensions/gsd/db-coordination-schema.js +1 -1
  96. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +1 -1
  97. package/dist/resources/extensions/gsd/db-gate-rows.js +1 -1
  98. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +1 -1
  99. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +1 -1
  100. package/dist/resources/extensions/gsd/db-migration-backup.js +1 -1
  101. package/dist/resources/extensions/gsd/db-migration-steps.js +1 -1
  102. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +1 -1
  103. package/dist/resources/extensions/gsd/db-open-state.js +1 -1
  104. package/dist/resources/extensions/gsd/db-provider.js +1 -1
  105. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +1 -1
  106. package/dist/resources/extensions/gsd/db-schema-metadata.js +1 -1
  107. package/dist/resources/extensions/gsd/db-task-slice-rows.js +1 -1
  108. package/dist/resources/extensions/gsd/db-transaction.js +1 -1
  109. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +1 -1
  110. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +1 -1
  111. package/dist/resources/extensions/gsd/doctor-git-checks.js +1 -1
  112. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -1
  113. package/dist/resources/extensions/gsd/ecosystem/loader.js +1 -1
  114. package/dist/resources/extensions/gsd/escalation.js +1 -1
  115. package/dist/resources/extensions/gsd/fresh-run-ui.js +1 -1
  116. package/dist/resources/extensions/gsd/git-conflict-state.js +1 -1
  117. package/dist/resources/extensions/gsd/git-service.js +1 -1
  118. package/dist/resources/extensions/gsd/gsd-command-home.js +1 -1
  119. package/dist/resources/extensions/gsd/gsd-db.js +1 -1
  120. package/dist/resources/extensions/gsd/guided-unit-context.js +1 -1
  121. package/dist/resources/extensions/gsd/health-widget.js +1 -1
  122. package/dist/resources/extensions/gsd/knowledge-backfill.js +1 -1
  123. package/dist/resources/extensions/gsd/knowledge-capture.js +1 -1
  124. package/dist/resources/extensions/gsd/knowledge-parser.js +1 -1
  125. package/dist/resources/extensions/gsd/knowledge-projection.js +1 -1
  126. package/dist/resources/extensions/gsd/legacy-telemetry.js +1 -3
  127. package/dist/resources/extensions/gsd/markdown-renderer.js +1 -1
  128. package/dist/resources/extensions/gsd/md-importer.js +2 -2
  129. package/dist/resources/extensions/gsd/memory-backfill.js +1 -1
  130. package/dist/resources/extensions/gsd/memory-consolidation-scanner.js +1 -1
  131. package/dist/resources/extensions/gsd/metrics.js +1 -1
  132. package/dist/resources/extensions/gsd/migrate/audit.js +4 -2
  133. package/dist/resources/extensions/gsd/migrate/command.js +27 -5
  134. package/dist/resources/extensions/gsd/migrate/parser.js +57 -11
  135. package/dist/resources/extensions/gsd/migrate/parsers.js +16 -0
  136. package/dist/resources/extensions/gsd/migrate/preview.js +1 -0
  137. package/dist/resources/extensions/gsd/migrate/safety.js +1 -1
  138. package/dist/resources/extensions/gsd/migrate/transformer.js +79 -6
  139. package/dist/resources/extensions/gsd/migrate/validator.js +22 -1
  140. package/dist/resources/extensions/gsd/migrate/writer.js +1 -1
  141. package/dist/resources/extensions/gsd/milestone-scope-classifier.js +1 -1
  142. package/dist/resources/extensions/gsd/model-router.js +1 -1
  143. package/dist/resources/extensions/gsd/notification-overlay.js +1 -1
  144. package/dist/resources/extensions/gsd/orphan-stash-audit.js +1 -1
  145. package/dist/resources/extensions/gsd/parallel-monitor-overlay.js +1 -1
  146. package/dist/resources/extensions/gsd/paths.js +1 -1
  147. package/dist/resources/extensions/gsd/pending-auto-start.js +1 -1
  148. package/dist/resources/extensions/gsd/planning-depth.js +1 -1
  149. package/dist/resources/extensions/gsd/post-execution-checks.js +1 -1
  150. package/dist/resources/extensions/gsd/pr-evidence.js +1 -1
  151. package/dist/resources/extensions/gsd/pre-execution-checks.js +1 -1
  152. package/dist/resources/extensions/gsd/process-task-path.js +1 -1
  153. package/dist/resources/extensions/gsd/prompts/review-migration.md +2 -2
  154. package/dist/resources/extensions/gsd/provider-switch-observer.js +1 -1
  155. package/dist/resources/extensions/gsd/recovery-classification.js +1 -1
  156. package/dist/resources/extensions/gsd/repository-registry.js +1 -1
  157. package/dist/resources/extensions/gsd/root-write-leak-guard.js +1 -1
  158. package/dist/resources/extensions/gsd/schemas/parsers.js +1 -1
  159. package/dist/resources/extensions/gsd/schemas/validate.js +1 -1
  160. package/dist/resources/extensions/gsd/skill-manifest.js +1 -1
  161. package/dist/resources/extensions/gsd/slice-cadence.js +1 -1
  162. package/dist/resources/extensions/gsd/smart-entry-routing.js +1 -1
  163. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +1 -1
  164. package/dist/resources/extensions/gsd/state-reconciliation/drift/merge-state.js +1 -1
  165. package/dist/resources/extensions/gsd/state-reconciliation/drift/project-md.js +1 -1
  166. package/dist/resources/extensions/gsd/state-reconciliation/drift/roadmap.js +1 -1
  167. package/dist/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.js +1 -1
  168. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-render.js +1 -1
  169. package/dist/resources/extensions/gsd/state-reconciliation/drift/stale-worker.js +1 -1
  170. package/dist/resources/extensions/gsd/state-reconciliation/errors.js +1 -1
  171. package/dist/resources/extensions/gsd/state-reconciliation/index.js +1 -1
  172. package/dist/resources/extensions/gsd/state-reconciliation/registry.js +1 -1
  173. package/dist/resources/extensions/gsd/state-reconciliation/spawn-gate.js +1 -1
  174. package/dist/resources/extensions/gsd/state-reconciliation/types.js +1 -1
  175. package/dist/resources/extensions/gsd/state-reconciliation.js +1 -1
  176. package/dist/resources/extensions/gsd/state.js +9 -18
  177. package/dist/resources/extensions/gsd/tool-contract.js +1 -1
  178. package/dist/resources/extensions/gsd/tools/complete-milestone.js +2 -2
  179. package/dist/resources/extensions/gsd/tools/complete-slice.js +8 -2
  180. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  181. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +1 -1
  182. package/dist/resources/extensions/gsd/tools/exec-tool.js +1 -1
  183. package/dist/resources/extensions/gsd/tools/plan-milestone.js +1 -1
  184. package/dist/resources/extensions/gsd/tools/validate-milestone.js +1 -1
  185. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  186. package/dist/resources/extensions/gsd/tui/render-kit.js +1 -1
  187. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  188. package/dist/resources/extensions/gsd/unit-context-manifest.js +1 -1
  189. package/dist/resources/extensions/gsd/unmerged-milestone-guard.js +1 -1
  190. package/dist/resources/extensions/gsd/uok/audit.js +1 -1
  191. package/dist/resources/extensions/gsd/uok/contracts.js +1 -1
  192. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +1 -1
  193. package/dist/resources/extensions/gsd/uok/loop-adapter.js +1 -1
  194. package/dist/resources/extensions/gsd/uok/plan-v2.js +1 -1
  195. package/dist/resources/extensions/gsd/uok/timeline.js +1 -1
  196. package/dist/resources/extensions/gsd/validation-block-guard.js +1 -1
  197. package/dist/resources/extensions/gsd/verification-gate.js +28 -12
  198. package/dist/resources/extensions/gsd/verification-verdict.js +9 -1
  199. package/dist/resources/extensions/gsd/watch/header-renderer.js +1 -1
  200. package/dist/resources/extensions/gsd/watch/splash-palette.js +1 -1
  201. package/dist/resources/extensions/gsd/workflow-manifest.js +1 -1
  202. package/dist/resources/extensions/gsd/workflow-projections.js +1 -1
  203. package/dist/resources/extensions/gsd/workflow-protocol.js +1 -1
  204. package/dist/resources/extensions/gsd/workflow-templates.js +1 -1
  205. package/dist/resources/extensions/gsd/working-output-messages.js +1 -1
  206. package/dist/resources/extensions/gsd/workspace.js +1 -1
  207. package/dist/resources/extensions/gsd/worktree-lifecycle.js +1 -1
  208. package/dist/resources/extensions/gsd/worktree-manager.js +1 -1
  209. package/dist/resources/extensions/gsd/worktree-safety.js +1 -1
  210. package/dist/resources/extensions/gsd/worktree-state-projection.js +1 -1
  211. package/dist/resources/extensions/mcp-client/manager.js +1 -1
  212. package/dist/resources/extensions/ollama/index.js +1 -1
  213. package/dist/resources/extensions/ollama/model-capabilities.js +1 -1
  214. package/dist/resources/extensions/ollama/ndjson-stream.js +1 -1
  215. package/dist/resources/extensions/ollama/ollama-chat-provider.js +1 -1
  216. package/dist/resources/extensions/ollama/ollama-client.js +1 -1
  217. package/dist/resources/extensions/ollama/ollama-commands.js +1 -1
  218. package/dist/resources/extensions/ollama/ollama-discovery.js +1 -1
  219. package/dist/resources/extensions/ollama/ollama-tool.js +1 -1
  220. package/dist/resources/extensions/ollama/thinking-parser.js +1 -1
  221. package/dist/resources/extensions/ollama/types.js +1 -1
  222. package/dist/resources/extensions/shared/cmux-events.js +1 -1
  223. package/dist/resources/extensions/shared/gsd-phase-state.js +1 -1
  224. package/dist/resources/extensions/shared/interview-ui.js +1 -1
  225. package/dist/resources/extensions/subagent/launch.js +1 -1
  226. package/dist/resources/extensions/subagent/run-store.js +1 -1
  227. package/dist/resources/extensions/visual-brief/artifact-policy.js +1 -1
  228. package/dist/resources/extensions/visual-brief/index.js +1 -1
  229. package/dist/resources/extensions/visual-brief/page-contract.js +1 -1
  230. package/dist/resources/extensions/visual-brief/prompts.js +1 -1
  231. package/dist/resources/skills/api-design/SKILL.md +1 -1
  232. package/dist/resources/skills/create-gsd-extension/SKILL.md +1 -1
  233. package/dist/resources/skills/create-mcp-server/SKILL.md +1 -1
  234. package/dist/resources/skills/dependency-upgrade/SKILL.md +1 -1
  235. package/dist/resources/skills/observability/SKILL.md +4 -4
  236. package/dist/resources/skills/security-review/SKILL.md +1 -1
  237. package/dist/tsconfig.extensions.tsbuildinfo +1 -0
  238. package/dist/update-check.d.ts +5 -2
  239. package/dist/update-check.js +10 -7
  240. package/dist/update-cmd.d.ts +6 -1
  241. package/dist/update-cmd.js +4 -1
  242. package/dist/web/standalone/.next/BUILD_ID +1 -1
  243. package/dist/web/standalone/.next/app-path-routes-manifest.json +8 -8
  244. package/dist/web/standalone/.next/build-manifest.json +3 -3
  245. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  246. package/dist/web/standalone/.next/required-server-files.json +4 -4
  247. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  248. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  249. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  250. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  251. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  252. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  253. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  254. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  255. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  256. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  257. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  258. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  259. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  260. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  261. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  262. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  263. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  264. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  265. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  266. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  267. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  269. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  270. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  272. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  273. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  274. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  275. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  276. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  277. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  278. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  279. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  280. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  281. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  282. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  283. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  284. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  285. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  286. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  287. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  288. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  289. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  290. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  291. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  292. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  293. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  294. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  295. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  296. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  297. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  298. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  299. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  300. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  301. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  302. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  303. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  304. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  305. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js +1 -1
  306. package/dist/web/standalone/.next/server/app/api/mcp-connections/route_client-reference-manifest.js +1 -1
  307. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  308. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  309. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  310. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  311. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  312. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  313. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  314. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  315. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  316. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  317. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  318. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  319. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  320. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  321. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  322. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  323. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  324. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  325. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  326. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  327. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  328. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  329. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  330. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  331. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  332. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  333. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  334. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  335. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  336. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  337. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  338. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  339. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +1 -1
  340. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  341. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  342. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  343. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  344. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  345. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  346. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  347. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  348. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  349. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  350. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  351. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  352. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  353. package/dist/web/standalone/.next/server/app/index.html +1 -1
  354. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  355. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  356. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  357. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  358. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  359. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  360. package/dist/web/standalone/.next/server/app/page.js +2 -2
  361. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  362. package/dist/web/standalone/.next/server/app-paths-manifest.json +8 -8
  363. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  364. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  365. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  366. package/dist/web/standalone/.next/server/middleware.js +2 -2
  367. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  368. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  369. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  370. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-a662c55787b78a48.js → page-0fa92deaf6721345.js} +1 -1
  371. package/dist/web/standalone/.next/static/chunks/app/layout-68f32aa90495be18.js +1 -0
  372. package/dist/web/standalone/.next/static/chunks/app/page-4dbb4d03b2d85d57.js +1 -0
  373. package/dist/web/standalone/.next/static/chunks/{main-app-da6af500e9c35ea7.js → main-app-c3abead5a8518a30.js} +1 -1
  374. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-de2636d5a7f60b61.js +1 -0
  375. package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64/lib/libvips-cpp.8.17.3.dylib → sharp-libvips-linux-x64/lib/libvips-cpp.so.8.17.3} +0 -0
  376. package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64 → sharp-libvips-linux-x64}/package.json +11 -5
  377. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/index.js +1 -0
  378. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/lib/libvips-cpp.so.8.17.3 +0 -0
  379. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/package.json +42 -0
  380. package/dist/web/standalone/node_modules/@img/sharp-libvips-linuxmusl-x64/versions.json +30 -0
  381. package/dist/web/standalone/node_modules/@img/sharp-linux-x64/lib/sharp-linux-x64.node +0 -0
  382. package/dist/web/standalone/node_modules/@img/{sharp-darwin-arm64 → sharp-linux-x64}/package.json +13 -7
  383. package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/LICENSE +191 -0
  384. package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/lib/sharp-linuxmusl-x64.node +0 -0
  385. package/dist/web/standalone/node_modules/@img/sharp-linuxmusl-x64/package.json +46 -0
  386. package/dist/web/standalone/node_modules/node-pty/build/Makefile +369 -0
  387. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  388. package/dist/web/standalone/node_modules/node-pty/build/binding.Makefile +6 -0
  389. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +168 -0
  390. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.Makefile +6 -0
  391. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +106 -0
  392. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +110 -0
  393. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +106 -0
  394. package/dist/web/standalone/server.js +1 -1
  395. package/dist/welcome-screen.js +1 -1
  396. package/package.json +11 -7
  397. package/packages/contracts/dist/index.js +1 -1
  398. package/packages/contracts/dist/index.js.map +1 -1
  399. package/packages/contracts/dist/rpc.js +1 -1
  400. package/packages/contracts/dist/rpc.js.map +1 -1
  401. package/packages/contracts/dist/rpc.test.js +1 -1
  402. package/packages/contracts/dist/rpc.test.js.map +1 -1
  403. package/packages/contracts/dist/workflow.js +1 -1
  404. package/packages/contracts/dist/workflow.js.map +1 -1
  405. package/packages/contracts/package.json +1 -1
  406. package/packages/contracts/src/index.ts +1 -1
  407. package/packages/contracts/src/rpc.test.ts +1 -1
  408. package/packages/contracts/src/rpc.ts +1 -1
  409. package/packages/contracts/src/workflow.ts +1 -1
  410. package/packages/daemon/package.json +3 -3
  411. package/packages/mcp-server/dist/workflow-tools.js +1 -1
  412. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  413. package/packages/mcp-server/package.json +3 -3
  414. package/packages/mcp-server/src/import-candidates.test.ts +1 -1
  415. package/packages/mcp-server/src/workflow-tools-parity.test.ts +1 -1
  416. package/packages/mcp-server/src/workflow-tools.test.ts +1 -1
  417. package/packages/mcp-server/src/workflow-tools.ts +1 -1
  418. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  419. package/packages/native/dist/grep/index.js +35 -1
  420. package/packages/native/dist/index.d.ts +1 -0
  421. package/packages/native/dist/index.js +4 -1
  422. package/packages/native/dist/native.d.ts +2 -0
  423. package/packages/native/dist/native.js +38 -25
  424. package/packages/native/dist/text/index.js +118 -6
  425. package/packages/native/dist/xxhash/index.d.ts +1 -2
  426. package/packages/native/dist/xxhash/index.js +7 -7
  427. package/packages/native/package.json +1 -1
  428. package/packages/native/src/__tests__/function-fallback.test.mjs +37 -0
  429. package/packages/native/src/__tests__/text-fallback.test.mjs +44 -0
  430. package/packages/native/src/grep/index.ts +38 -1
  431. package/packages/native/src/index.ts +2 -0
  432. package/packages/native/src/native.ts +37 -22
  433. package/packages/native/src/text/index.ts +145 -32
  434. package/packages/native/src/xxhash/index.ts +6 -9
  435. package/packages/native/tsconfig.tsbuildinfo +1 -1
  436. package/packages/pi-agent-core/dist/token-audit.js +1 -1
  437. package/packages/pi-agent-core/dist/token-audit.js.map +1 -1
  438. package/packages/pi-agent-core/package.json +1 -1
  439. package/packages/pi-agent-core/src/token-audit.test.ts +1 -1
  440. package/packages/pi-agent-core/src/token-audit.ts +1 -1
  441. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  442. package/packages/pi-ai/dist/models/fake-model.d.ts +1 -1
  443. package/packages/pi-ai/dist/models/fake-model.js +1 -1
  444. package/packages/pi-ai/dist/models/fake-model.js.map +1 -1
  445. package/packages/pi-ai/dist/providers/api-family.js +1 -1
  446. package/packages/pi-ai/dist/providers/api-family.js.map +1 -1
  447. package/packages/pi-ai/dist/providers/api-family.test.js +1 -1
  448. package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -1
  449. package/packages/pi-ai/dist/providers/fake.d.ts +1 -1
  450. package/packages/pi-ai/dist/providers/fake.js +1 -1
  451. package/packages/pi-ai/dist/providers/fake.js.map +1 -1
  452. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js +1 -1
  453. package/packages/pi-ai/dist/providers/google-gemini-cli.test.js.map +1 -1
  454. package/packages/pi-ai/dist/providers/provider-capabilities.js +1 -1
  455. package/packages/pi-ai/dist/providers/provider-capabilities.js.map +1 -1
  456. package/packages/pi-ai/dist/providers/provider-capabilities.test.js +1 -1
  457. package/packages/pi-ai/dist/providers/provider-capabilities.test.js.map +1 -1
  458. package/packages/pi-ai/dist/providers/transform-messages-report.test.js +1 -1
  459. package/packages/pi-ai/dist/providers/transform-messages-report.test.js.map +1 -1
  460. package/packages/pi-ai/dist/types.js.map +1 -1
  461. package/packages/pi-ai/package.json +1 -1
  462. package/packages/pi-ai/src/models/fake-model.ts +1 -1
  463. package/packages/pi-ai/src/providers/api-family.test.ts +1 -1
  464. package/packages/pi-ai/src/providers/api-family.ts +1 -1
  465. package/packages/pi-ai/src/providers/fake.ts +1 -1
  466. package/packages/pi-ai/src/providers/google-gemini-cli.test.ts +1 -1
  467. package/packages/pi-ai/src/providers/provider-capabilities.test.ts +1 -1
  468. package/packages/pi-ai/src/providers/provider-capabilities.ts +1 -1
  469. package/packages/pi-ai/src/providers/transform-messages-report.test.ts +1 -1
  470. package/packages/pi-ai/src/types.ts +1 -1
  471. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  472. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +1 -1
  473. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  474. package/packages/pi-coding-agent/dist/core/agent-session.js +1 -1
  475. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  476. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +1 -1
  477. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  478. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +1 -1
  479. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -1
  480. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +1 -1
  481. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -1
  482. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +1 -1
  483. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -1
  484. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +1 -1
  485. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -1
  486. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js +1 -1
  487. package/packages/pi-coding-agent/dist/core/extensions/provider-registration.test.js.map +1 -1
  488. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js +1 -1
  489. package/packages/pi-coding-agent/dist/core/lsp/lsp-legacy-alias.test.js.map +1 -1
  490. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts.map +1 -1
  491. package/packages/pi-coding-agent/dist/core/model-discovery.js +5 -1
  492. package/packages/pi-coding-agent/dist/core/model-discovery.js.map +1 -1
  493. package/packages/pi-coding-agent/dist/core/model-discovery.test.js +21 -0
  494. package/packages/pi-coding-agent/dist/core/model-discovery.test.js.map +1 -1
  495. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +1 -1
  496. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -1
  497. package/packages/pi-coding-agent/dist/core/sdk.js +1 -1
  498. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  499. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +1 -1
  500. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  501. package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.js +1 -1
  502. package/packages/pi-coding-agent/dist/core/tools/tool-compatibility-registry.js.map +1 -1
  503. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +1 -1
  504. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -1
  505. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +1 -1
  506. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -1
  507. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js +1 -1
  508. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/assistant-message-design.test.js.map +1 -1
  509. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +1 -1
  510. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  511. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/collapsible-message.test.js +1 -1
  512. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/collapsible-message.test.js.map +1 -1
  513. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +1 -1
  514. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  515. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js +1 -1
  516. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/timestamp.test.js.map +1 -1
  517. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +2 -2
  518. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  519. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js +1 -1
  520. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/user-message-design.test.js.map +1 -1
  521. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +1 -1
  522. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  523. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +1 -1
  524. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -1
  525. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.js +1 -1
  526. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.js.map +1 -1
  527. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.test.js +1 -1
  528. package/packages/pi-coding-agent/dist/modes/interactive/components/animated-component.test.js.map +1 -1
  529. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +1 -1
  530. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  531. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  532. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +1 -1
  533. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  534. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.test.js +1 -1
  535. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.test.js.map +1 -1
  536. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  537. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  538. package/packages/pi-coding-agent/dist/modes/interactive/components/collapsible-message.js +1 -1
  539. package/packages/pi-coding-agent/dist/modes/interactive/components/collapsible-message.js.map +1 -1
  540. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  541. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  542. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +1 -1
  543. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  544. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +1 -1
  545. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  546. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-editor.js +1 -1
  547. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-editor.js.map +1 -1
  548. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  549. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  550. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +1 -1
  551. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  552. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.test.js +1 -1
  553. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.test.js.map +1 -1
  554. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +1 -1
  555. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  556. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +1 -1
  557. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  558. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +1 -1
  559. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  560. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +1 -1
  561. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  562. package/packages/pi-coding-agent/dist/modes/interactive/components/interactive-key-handling.test.js +1 -1
  563. package/packages/pi-coding-agent/dist/modes/interactive/components/interactive-key-handling.test.js.map +1 -1
  564. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +1 -1
  565. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  566. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +1 -1
  567. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  568. package/packages/pi-coding-agent/dist/modes/interactive/components/render-cache.js +1 -1
  569. package/packages/pi-coding-agent/dist/modes/interactive/components/render-cache.js.map +1 -1
  570. package/packages/pi-coding-agent/dist/modes/interactive/components/selector-footers.test.js +1 -1
  571. package/packages/pi-coding-agent/dist/modes/interactive/components/selector-footers.test.js.map +1 -1
  572. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +1 -1
  573. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  574. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.js +1 -1
  575. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.js.map +1 -1
  576. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.test.js +1 -1
  577. package/packages/pi-coding-agent/dist/modes/interactive/components/theme-selector.test.js.map +1 -1
  578. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js +1 -1
  579. package/packages/pi-coding-agent/dist/modes/interactive/components/timestamp.js.map +1 -1
  580. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +2 -2
  581. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  582. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -1
  583. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  584. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js +1 -1
  585. package/packages/pi-coding-agent/dist/modes/interactive/components/transcript-design.js.map +1 -1
  586. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js +1 -1
  587. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js.map +1 -1
  588. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js +1 -1
  589. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js.map +1 -1
  590. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +1 -1
  591. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  592. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.test.js +1 -1
  593. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.test.js.map +1 -1
  594. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js +1 -1
  595. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message.js.map +1 -1
  596. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +1 -1
  597. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  598. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -1
  599. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  600. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-lifecycle.test.js +1 -1
  601. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-lifecycle.test.js.map +1 -1
  602. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js +1 -1
  603. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-ordering.test.js.map +1 -1
  604. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +2 -2
  605. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  606. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +1 -1
  607. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -1
  608. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js +1 -1
  609. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -1
  610. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  611. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  612. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +1 -1
  613. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -1
  614. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +1 -1
  615. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  616. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js +1 -1
  617. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js.map +1 -1
  618. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.js +1 -1
  619. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.js.map +1 -1
  620. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.test.js +1 -1
  621. package/packages/pi-coding-agent/dist/modes/interactive/utils/tool-call-summary.test.js.map +1 -1
  622. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +1 -1
  623. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  624. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js +1 -1
  625. package/packages/pi-coding-agent/dist/tests/system-prompt-file-safety.test.js.map +1 -1
  626. package/packages/pi-coding-agent/package.json +2 -2
  627. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +1 -1
  628. package/packages/pi-coding-agent/src/core/agent-session.ts +1 -1
  629. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +1 -1
  630. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +1 -1
  631. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +1 -1
  632. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +1 -1
  633. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +1 -1
  634. package/packages/pi-coding-agent/src/core/extensions/provider-registration.test.ts +1 -1
  635. package/packages/pi-coding-agent/src/core/lsp/lsp-legacy-alias.test.ts +1 -1
  636. package/packages/pi-coding-agent/src/core/model-discovery.test.ts +22 -0
  637. package/packages/pi-coding-agent/src/core/model-discovery.ts +6 -1
  638. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +1 -1
  639. package/packages/pi-coding-agent/src/core/sdk.ts +1 -1
  640. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +1 -1
  641. package/packages/pi-coding-agent/src/core/tools/tool-compatibility-registry.ts +1 -1
  642. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +1 -1
  643. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +1 -1
  644. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/assistant-message-design.test.ts +1 -1
  645. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +1 -1
  646. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/collapsible-message.test.ts +1 -1
  647. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +1 -1
  648. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/timestamp.test.ts +1 -1
  649. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +2 -2
  650. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/user-message-design.test.ts +1 -1
  651. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +1 -1
  652. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +1 -1
  653. package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.test.ts +1 -1
  654. package/packages/pi-coding-agent/src/modes/interactive/components/animated-component.ts +1 -1
  655. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +1 -1
  656. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -1
  657. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.test.ts +1 -1
  658. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +1 -1
  659. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  660. package/packages/pi-coding-agent/src/modes/interactive/components/collapsible-message.ts +1 -1
  661. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  662. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +1 -1
  663. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +1 -1
  664. package/packages/pi-coding-agent/src/modes/interactive/components/custom-editor.ts +1 -1
  665. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  666. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.test.ts +1 -1
  667. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +1 -1
  668. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +1 -1
  669. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -1
  670. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +1 -1
  671. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +1 -1
  672. package/packages/pi-coding-agent/src/modes/interactive/components/interactive-key-handling.test.ts +1 -1
  673. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +1 -1
  674. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +1 -1
  675. package/packages/pi-coding-agent/src/modes/interactive/components/render-cache.ts +1 -1
  676. package/packages/pi-coding-agent/src/modes/interactive/components/selector-footers.test.ts +1 -1
  677. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +1 -1
  678. package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.test.ts +1 -1
  679. package/packages/pi-coding-agent/src/modes/interactive/components/theme-selector.ts +1 -1
  680. package/packages/pi-coding-agent/src/modes/interactive/components/timestamp.ts +1 -1
  681. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +2 -2
  682. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -1
  683. package/packages/pi-coding-agent/src/modes/interactive/components/transcript-design.ts +1 -1
  684. package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +1 -1
  685. package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +1 -1
  686. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.test.ts +1 -1
  687. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +1 -1
  688. package/packages/pi-coding-agent/src/modes/interactive/components/user-message.ts +1 -1
  689. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +1 -1
  690. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -1
  691. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-lifecycle.test.ts +1 -1
  692. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-ordering.test.ts +1 -1
  693. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +2 -2
  694. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +1 -1
  695. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-highlight.test.ts +1 -1
  696. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  697. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +1 -1
  698. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +1 -1
  699. package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +1 -1
  700. package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.test.ts +1 -1
  701. package/packages/pi-coding-agent/src/modes/interactive/utils/tool-call-summary.ts +1 -1
  702. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +1 -1
  703. package/packages/pi-coding-agent/src/tests/system-prompt-file-safety.test.ts +1 -1
  704. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  705. package/packages/pi-tui/dist/__tests__/keys.test.js +1 -1
  706. package/packages/pi-tui/dist/__tests__/keys.test.js.map +1 -1
  707. package/packages/pi-tui/dist/__tests__/style.test.js +1 -1
  708. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -1
  709. package/packages/pi-tui/dist/__tests__/tui.test.js +1 -1
  710. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  711. package/packages/pi-tui/dist/__tests__/utils.test.js +5 -2
  712. package/packages/pi-tui/dist/__tests__/utils.test.js.map +1 -1
  713. package/packages/pi-tui/dist/components/__tests__/box.test.js +1 -1
  714. package/packages/pi-tui/dist/components/__tests__/box.test.js.map +1 -1
  715. package/packages/pi-tui/dist/components/__tests__/editor.test.js +1 -1
  716. package/packages/pi-tui/dist/components/__tests__/editor.test.js.map +1 -1
  717. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js +1 -1
  718. package/packages/pi-tui/dist/components/__tests__/truncated-text.test.js.map +1 -1
  719. package/packages/pi-tui/dist/components/box.js +1 -1
  720. package/packages/pi-tui/dist/components/box.js.map +1 -1
  721. package/packages/pi-tui/dist/components/editor.js +1 -1
  722. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  723. package/packages/pi-tui/dist/components/input.js +1 -1
  724. package/packages/pi-tui/dist/components/input.js.map +1 -1
  725. package/packages/pi-tui/dist/components/truncated-text.js +1 -1
  726. package/packages/pi-tui/dist/components/truncated-text.js.map +1 -1
  727. package/packages/pi-tui/dist/index.js +1 -1
  728. package/packages/pi-tui/dist/index.js.map +1 -1
  729. package/packages/pi-tui/dist/keys.js +1 -1
  730. package/packages/pi-tui/dist/keys.js.map +1 -1
  731. package/packages/pi-tui/dist/overlay-layout.js +1 -1
  732. package/packages/pi-tui/dist/overlay-layout.js.map +1 -1
  733. package/packages/pi-tui/dist/style.js +1 -1
  734. package/packages/pi-tui/dist/style.js.map +1 -1
  735. package/packages/pi-tui/dist/tui.js +1 -1
  736. package/packages/pi-tui/dist/tui.js.map +1 -1
  737. package/packages/pi-tui/dist/utils.d.ts +3 -1
  738. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  739. package/packages/pi-tui/dist/utils.js +46 -2
  740. package/packages/pi-tui/dist/utils.js.map +1 -1
  741. package/packages/pi-tui/package.json +1 -1
  742. package/packages/pi-tui/src/__tests__/keys.test.ts +1 -1
  743. package/packages/pi-tui/src/__tests__/style.test.ts +1 -1
  744. package/packages/pi-tui/src/__tests__/tui.test.ts +1 -1
  745. package/packages/pi-tui/src/__tests__/utils.test.ts +6 -2
  746. package/packages/pi-tui/src/components/__tests__/box.test.ts +1 -1
  747. package/packages/pi-tui/src/components/__tests__/editor.test.ts +1 -1
  748. package/packages/pi-tui/src/components/__tests__/truncated-text.test.ts +1 -1
  749. package/packages/pi-tui/src/components/box.ts +1 -1
  750. package/packages/pi-tui/src/components/editor.ts +1 -1
  751. package/packages/pi-tui/src/components/input.ts +1 -1
  752. package/packages/pi-tui/src/components/truncated-text.ts +1 -1
  753. package/packages/pi-tui/src/index.ts +1 -1
  754. package/packages/pi-tui/src/keys.ts +1 -1
  755. package/packages/pi-tui/src/overlay-layout.ts +1 -1
  756. package/packages/pi-tui/src/style.ts +1 -1
  757. package/packages/pi-tui/src/tui.ts +1 -1
  758. package/packages/pi-tui/src/utils.ts +47 -2
  759. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  760. package/packages/rpc-client/dist/rpc-types.js +1 -1
  761. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  762. package/packages/rpc-client/package.json +2 -2
  763. package/packages/rpc-client/src/rpc-types.ts +1 -1
  764. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  765. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js +1 -1
  766. package/pkg/dist/modes/interactive/theme/theme-highlight.test.js.map +1 -1
  767. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  768. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  769. package/pkg/package.json +1 -1
  770. package/scripts/install.js +36 -3
  771. package/scripts/lib/workspace-manifest.cjs +1 -1
  772. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +2 -2
  773. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +5 -5
  774. package/src/resources/extensions/github-sync/templates.ts +1 -1
  775. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +1 -1
  776. package/src/resources/extensions/github-sync/tests/templates.test.ts +1 -1
  777. package/src/resources/extensions/google-search/index.ts +1 -1
  778. package/src/resources/extensions/gsd/auto/contracts.ts +1 -1
  779. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +1 -1
  780. package/src/resources/extensions/gsd/auto/lease-conflict-notice.ts +1 -1
  781. package/src/resources/extensions/gsd/auto/loop-deps.ts +11 -0
  782. package/src/resources/extensions/gsd/auto/loop.ts +2 -2
  783. package/src/resources/extensions/gsd/auto/orchestrator.ts +1 -1
  784. package/src/resources/extensions/gsd/auto/phases.ts +14 -3
  785. package/src/resources/extensions/gsd/auto/run-unit.ts +117 -45
  786. package/src/resources/extensions/gsd/auto/schedule-wakeup.ts +40 -0
  787. package/src/resources/extensions/gsd/auto/session.ts +1 -1
  788. package/src/resources/extensions/gsd/auto/unit-runner-events.ts +1 -1
  789. package/src/resources/extensions/gsd/auto/verification-retry-policy.ts +1 -1
  790. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +1 -1
  791. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +1 -1
  792. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +1 -1
  793. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +1 -1
  794. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +1 -1
  795. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +1 -1
  796. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +1 -1
  797. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +1 -1
  798. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +1 -1
  799. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +1 -1
  800. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +1 -1
  801. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +1 -1
  802. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +1 -1
  803. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +1 -1
  804. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +1 -1
  805. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +1 -1
  806. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +1 -1
  807. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  808. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +1 -1
  809. package/src/resources/extensions/gsd/auto-artifact-paths.ts +1 -1
  810. package/src/resources/extensions/gsd/auto-budget.ts +1 -1
  811. package/src/resources/extensions/gsd/auto-dashboard.ts +1 -1
  812. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -1
  813. package/src/resources/extensions/gsd/auto-post-unit.ts +1 -1
  814. package/src/resources/extensions/gsd/auto-prompts.ts +2 -2
  815. package/src/resources/extensions/gsd/auto-recovery.ts +1 -1
  816. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  817. package/src/resources/extensions/gsd/auto-status-message.ts +1 -1
  818. package/src/resources/extensions/gsd/auto-timers.ts +13 -4
  819. package/src/resources/extensions/gsd/auto-unit-closeout.ts +1 -1
  820. package/src/resources/extensions/gsd/auto-verification.ts +1 -1
  821. package/src/resources/extensions/gsd/auto-worktree-repair.ts +1 -1
  822. package/src/resources/extensions/gsd/auto-worktree.ts +1 -1
  823. package/src/resources/extensions/gsd/auto.ts +36 -4
  824. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +5 -9
  825. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +1 -1
  826. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +1 -1
  827. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  828. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +1 -1
  829. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +2 -2
  830. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  831. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +3 -1
  832. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +4 -1
  833. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +1 -1
  834. package/src/resources/extensions/gsd/bootstrap/schedule-wakeup-tool.ts +81 -0
  835. package/src/resources/extensions/gsd/bootstrap/system-context.ts +1 -1
  836. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-basepath.test.ts +1 -1
  837. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +1 -1
  838. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +1 -1
  839. package/src/resources/extensions/gsd/browser-evidence.ts +1 -1
  840. package/src/resources/extensions/gsd/closeout-recovery.ts +1 -1
  841. package/src/resources/extensions/gsd/commands/catalog.ts +2 -1
  842. package/src/resources/extensions/gsd/commands/dispatcher.ts +1 -1
  843. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -0
  844. package/src/resources/extensions/gsd/commands/handlers/notifications-handler.ts +1 -1
  845. package/src/resources/extensions/gsd/commands/handlers/ops.ts +2 -2
  846. package/src/resources/extensions/gsd/commands-bootstrap.ts +1 -0
  847. package/src/resources/extensions/gsd/commands-closeout.ts +1 -1
  848. package/src/resources/extensions/gsd/commands-ship.ts +1 -1
  849. package/src/resources/extensions/gsd/commands-verdict.ts +1 -1
  850. package/src/resources/extensions/gsd/commands-workflow-templates.ts +1 -1
  851. package/src/resources/extensions/gsd/commands-worktree.ts +1 -1
  852. package/src/resources/extensions/gsd/component-loader.ts +1 -1
  853. package/src/resources/extensions/gsd/db/auto-workers.ts +1 -1
  854. package/src/resources/extensions/gsd/db/command-queue.ts +1 -1
  855. package/src/resources/extensions/gsd/db/milestone-leases.ts +20 -6
  856. package/src/resources/extensions/gsd/db/runtime-kv.ts +1 -1
  857. package/src/resources/extensions/gsd/db/unit-dispatches.ts +1 -1
  858. package/src/resources/extensions/gsd/db-adapter.ts +1 -1
  859. package/src/resources/extensions/gsd/db-base-schema.ts +1 -1
  860. package/src/resources/extensions/gsd/db-connection-cache.ts +1 -1
  861. package/src/resources/extensions/gsd/db-coordination-schema.ts +1 -1
  862. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +1 -1
  863. package/src/resources/extensions/gsd/db-gate-rows.ts +1 -1
  864. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +1 -1
  865. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +1 -1
  866. package/src/resources/extensions/gsd/db-migration-backup.ts +1 -1
  867. package/src/resources/extensions/gsd/db-migration-steps.ts +1 -1
  868. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +1 -1
  869. package/src/resources/extensions/gsd/db-open-state.ts +1 -1
  870. package/src/resources/extensions/gsd/db-provider.ts +1 -1
  871. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +1 -1
  872. package/src/resources/extensions/gsd/db-schema-metadata.ts +1 -1
  873. package/src/resources/extensions/gsd/db-task-slice-rows.ts +1 -1
  874. package/src/resources/extensions/gsd/db-transaction.ts +1 -1
  875. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +1 -1
  876. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +1 -1
  877. package/src/resources/extensions/gsd/doctor-git-checks.ts +1 -1
  878. package/src/resources/extensions/gsd/doctor-types.ts +1 -1
  879. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +1 -1
  880. package/src/resources/extensions/gsd/ecosystem/loader.ts +1 -1
  881. package/src/resources/extensions/gsd/escalation.ts +1 -1
  882. package/src/resources/extensions/gsd/fresh-run-ui.ts +1 -1
  883. package/src/resources/extensions/gsd/git-conflict-state.ts +1 -1
  884. package/src/resources/extensions/gsd/git-service.ts +1 -1
  885. package/src/resources/extensions/gsd/gsd-command-home.ts +1 -1
  886. package/src/resources/extensions/gsd/gsd-db.ts +1 -1
  887. package/src/resources/extensions/gsd/guided-unit-context.ts +1 -1
  888. package/src/resources/extensions/gsd/health-widget.ts +1 -1
  889. package/src/resources/extensions/gsd/knowledge-backfill.ts +1 -1
  890. package/src/resources/extensions/gsd/knowledge-capture.ts +1 -1
  891. package/src/resources/extensions/gsd/knowledge-parser.ts +1 -1
  892. package/src/resources/extensions/gsd/knowledge-projection.ts +1 -1
  893. package/src/resources/extensions/gsd/legacy-telemetry.ts +1 -4
  894. package/src/resources/extensions/gsd/markdown-renderer.ts +1 -1
  895. package/src/resources/extensions/gsd/md-importer.ts +2 -2
  896. package/src/resources/extensions/gsd/memory-backfill.ts +1 -1
  897. package/src/resources/extensions/gsd/memory-consolidation-scanner.ts +1 -1
  898. package/src/resources/extensions/gsd/metrics.ts +1 -1
  899. package/src/resources/extensions/gsd/migrate/audit.ts +8 -2
  900. package/src/resources/extensions/gsd/migrate/command.ts +31 -5
  901. package/src/resources/extensions/gsd/migrate/index.ts +1 -1
  902. package/src/resources/extensions/gsd/migrate/parser.ts +63 -10
  903. package/src/resources/extensions/gsd/migrate/parsers.ts +17 -0
  904. package/src/resources/extensions/gsd/migrate/preview.ts +1 -0
  905. package/src/resources/extensions/gsd/migrate/safety.ts +1 -1
  906. package/src/resources/extensions/gsd/migrate/transformer.ts +81 -6
  907. package/src/resources/extensions/gsd/migrate/types.ts +29 -1
  908. package/src/resources/extensions/gsd/migrate/validator.ts +25 -1
  909. package/src/resources/extensions/gsd/migrate/writer.ts +6 -1
  910. package/src/resources/extensions/gsd/milestone-scope-classifier.ts +1 -1
  911. package/src/resources/extensions/gsd/model-router.ts +1 -1
  912. package/src/resources/extensions/gsd/notification-overlay.ts +1 -1
  913. package/src/resources/extensions/gsd/orphan-stash-audit.ts +1 -1
  914. package/src/resources/extensions/gsd/parallel-monitor-overlay.ts +1 -1
  915. package/src/resources/extensions/gsd/paths.ts +1 -1
  916. package/src/resources/extensions/gsd/pending-auto-start.ts +1 -1
  917. package/src/resources/extensions/gsd/planning-depth.ts +1 -1
  918. package/src/resources/extensions/gsd/post-execution-checks.ts +1 -1
  919. package/src/resources/extensions/gsd/pr-evidence.ts +1 -1
  920. package/src/resources/extensions/gsd/pre-execution-checks.ts +1 -1
  921. package/src/resources/extensions/gsd/process-task-path.ts +1 -1
  922. package/src/resources/extensions/gsd/prompts/review-migration.md +2 -2
  923. package/src/resources/extensions/gsd/provider-switch-observer.ts +1 -1
  924. package/src/resources/extensions/gsd/recovery-classification.ts +1 -1
  925. package/src/resources/extensions/gsd/repository-registry.ts +1 -1
  926. package/src/resources/extensions/gsd/root-write-leak-guard.ts +1 -1
  927. package/src/resources/extensions/gsd/schemas/parsers.ts +1 -1
  928. package/src/resources/extensions/gsd/schemas/validate.ts +1 -1
  929. package/src/resources/extensions/gsd/skill-manifest.ts +1 -1
  930. package/src/resources/extensions/gsd/slice-cadence.ts +1 -1
  931. package/src/resources/extensions/gsd/smart-entry-routing.ts +1 -1
  932. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +1 -1
  933. package/src/resources/extensions/gsd/state-reconciliation/drift/merge-state.ts +1 -1
  934. package/src/resources/extensions/gsd/state-reconciliation/drift/project-md.ts +1 -1
  935. package/src/resources/extensions/gsd/state-reconciliation/drift/roadmap.ts +1 -1
  936. package/src/resources/extensions/gsd/state-reconciliation/drift/sketch-flag.ts +1 -1
  937. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-render.ts +1 -1
  938. package/src/resources/extensions/gsd/state-reconciliation/drift/stale-worker.ts +1 -1
  939. package/src/resources/extensions/gsd/state-reconciliation/errors.ts +1 -1
  940. package/src/resources/extensions/gsd/state-reconciliation/index.ts +1 -1
  941. package/src/resources/extensions/gsd/state-reconciliation/registry.ts +1 -1
  942. package/src/resources/extensions/gsd/state-reconciliation/spawn-gate.ts +1 -1
  943. package/src/resources/extensions/gsd/state-reconciliation/types.ts +1 -1
  944. package/src/resources/extensions/gsd/state-reconciliation.ts +1 -1
  945. package/src/resources/extensions/gsd/state.ts +9 -17
  946. package/src/resources/extensions/gsd/tests/artifact-validators.test.ts +1 -1
  947. package/src/resources/extensions/gsd/tests/auto-deterministic-error-classification-4973.test.ts +1 -1
  948. package/src/resources/extensions/gsd/tests/auto-discuss-milestone-deadlock-4973.test.ts +1 -1
  949. package/src/resources/extensions/gsd/tests/auto-loop-no-copy-artifacts.test.ts +1 -1
  950. package/src/resources/extensions/gsd/tests/auto-loop-symlink-worktree.test.ts +1 -1
  951. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +65 -6
  952. package/src/resources/extensions/gsd/tests/auto-model-selection-tool-poisoning.test.ts +4 -4
  953. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +1 -1
  954. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +75 -1
  955. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +1 -1
  956. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +22 -2
  957. package/src/resources/extensions/gsd/tests/auto-post-unit-step-message.test.ts +1 -1
  958. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +1 -1
  959. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +1 -52
  960. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +1 -1
  961. package/src/resources/extensions/gsd/tests/auto-session-scope.test.ts +1 -1
  962. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +1 -1
  963. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +1 -1
  964. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +1 -1
  965. package/src/resources/extensions/gsd/tests/auto-start-validation-block.test.ts +1 -1
  966. package/src/resources/extensions/gsd/tests/auto-status-message.test.ts +1 -1
  967. package/src/resources/extensions/gsd/tests/auto-stop-notification.test.ts +1 -1
  968. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +1 -1
  969. package/src/resources/extensions/gsd/tests/auto-workers.test.ts +1 -1
  970. package/src/resources/extensions/gsd/tests/auto-worktree-registry.test.ts +1 -1
  971. package/src/resources/extensions/gsd/tests/auto-worktree-repair.test.ts +1 -1
  972. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +1 -1
  973. package/src/resources/extensions/gsd/tests/brief-command.test.ts +1 -1
  974. package/src/resources/extensions/gsd/tests/browser-tools-compatibility-declarations.test.ts +1 -1
  975. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +1 -1
  976. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +1 -1
  977. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +1 -1
  978. package/src/resources/extensions/gsd/tests/closeout-git-deferral.test.ts +1 -1
  979. package/src/resources/extensions/gsd/tests/closeout-recovery.test.ts +1 -1
  980. package/src/resources/extensions/gsd/tests/cmux.test.ts +1 -1
  981. package/src/resources/extensions/gsd/tests/command-queue.test.ts +1 -1
  982. package/src/resources/extensions/gsd/tests/commands-dispatcher-unmerged-milestone.test.ts +1 -1
  983. package/src/resources/extensions/gsd/tests/commands-dispatcher-validation-block.test.ts +1 -1
  984. package/src/resources/extensions/gsd/tests/commands-extensions-version-compare.test.ts +1 -1
  985. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +1 -1
  986. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +3 -3
  987. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +1 -1
  988. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +1 -1
  989. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +27 -0
  990. package/src/resources/extensions/gsd/tests/component-loader.test.ts +1 -1
  991. package/src/resources/extensions/gsd/tests/context-store.test.ts +1 -1
  992. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +1 -1
  993. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +1 -1
  994. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -1
  995. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +1 -1
  996. package/src/resources/extensions/gsd/tests/db-authority-regression.test.ts +1 -1
  997. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +1 -1
  998. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +1 -1
  999. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +1 -1
  1000. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +1 -1
  1001. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +1 -1
  1002. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +1 -1
  1003. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +1 -1
  1004. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +1 -1
  1005. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +1 -1
  1006. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +1 -1
  1007. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +1 -1
  1008. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +1 -1
  1009. package/src/resources/extensions/gsd/tests/db-provider.test.ts +1 -1
  1010. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +1 -1
  1011. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +1 -1
  1012. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +1 -1
  1013. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +1 -1
  1014. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +1 -1
  1015. package/src/resources/extensions/gsd/tests/db-writer-path-containment.test.ts +1 -1
  1016. package/src/resources/extensions/gsd/tests/db-writer-root-artifact.test.ts +1 -1
  1017. package/src/resources/extensions/gsd/tests/db-writer-scope.test.ts +1 -1
  1018. package/src/resources/extensions/gsd/tests/deep-mode-integration.test.ts +1 -1
  1019. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +1 -1
  1020. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +4 -30
  1021. package/src/resources/extensions/gsd/tests/detect-stuck-respects-retry.test.ts +1 -1
  1022. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +1 -1
  1023. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +1 -1
  1024. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +1 -1
  1025. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +1 -1
  1026. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +1 -1
  1027. package/src/resources/extensions/gsd/tests/doctor-empty-worktree.test.ts +1 -1
  1028. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +1 -1
  1029. package/src/resources/extensions/gsd/tests/evidence-cross-ref.test.ts +1 -1
  1030. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +1 -1
  1031. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +1 -1
  1032. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +1 -1
  1033. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +1 -1
  1034. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +1 -1
  1035. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +1 -1
  1036. package/src/resources/extensions/gsd/tests/fresh-run-ui.test.ts +1 -1
  1037. package/src/resources/extensions/gsd/tests/gate-1b-orphan-discrimination.test.ts +1 -1
  1038. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound-corrections.test.ts +1 -1
  1039. package/src/resources/extensions/gsd/tests/gate-1b-recovery-bound.test.ts +1 -1
  1040. package/src/resources/extensions/gsd/tests/git-checkpoint.test.ts +1 -1
  1041. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +1 -1
  1042. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +1 -1
  1043. package/src/resources/extensions/gsd/tests/gsd-db-failed-open-restore.test.ts +1 -1
  1044. package/src/resources/extensions/gsd/tests/gsd-db-workspace-scope.test.ts +1 -1
  1045. package/src/resources/extensions/gsd/tests/gsd-root-canonical.test.ts +1 -1
  1046. package/src/resources/extensions/gsd/tests/gsd-root-home-guard.test.ts +1 -1
  1047. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +1 -1
  1048. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +1 -1
  1049. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +1 -1
  1050. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +1 -1
  1051. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +1 -1
  1052. package/src/resources/extensions/gsd/tests/guided-tool-contract.test.ts +1 -1
  1053. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +1 -1
  1054. package/src/resources/extensions/gsd/tests/header-renderer.test.ts +2 -2
  1055. package/src/resources/extensions/gsd/tests/health-widget.test.ts +1 -1
  1056. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +1 -1
  1057. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +0 -52
  1058. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +1 -1
  1059. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +1 -1
  1060. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +1 -1
  1061. package/src/resources/extensions/gsd/tests/integration/headless-command.ts +1 -1
  1062. package/src/resources/extensions/gsd/tests/integration/merge-cwd-restore.test.ts +1 -1
  1063. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  1064. package/src/resources/extensions/gsd/tests/integration/state-machine-edge-cases.test.ts +1 -23
  1065. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +0 -28
  1066. package/src/resources/extensions/gsd/tests/integration/workspace-collapse-integration.test.ts +1 -1
  1067. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +1 -1
  1068. package/src/resources/extensions/gsd/tests/lease-conflict-notice.test.ts +1 -1
  1069. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +1 -1
  1070. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +2 -32
  1071. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +1 -1
  1072. package/src/resources/extensions/gsd/tests/marketplace-test-fixtures.ts +3 -3
  1073. package/src/resources/extensions/gsd/tests/md-importer.test.ts +23 -0
  1074. package/src/resources/extensions/gsd/tests/memory-consolidation-scanner.test.ts +1 -1
  1075. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +1 -1
  1076. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +1 -1
  1077. package/src/resources/extensions/gsd/tests/metrics-atomic-merge.test.ts +1 -1
  1078. package/src/resources/extensions/gsd/tests/metrics-lock-hardening.test.ts +1 -1
  1079. package/src/resources/extensions/gsd/tests/metrics-lock-not-acquired.test.ts +1 -1
  1080. package/src/resources/extensions/gsd/tests/metrics-lock-retry-sleep.test.ts +5 -3
  1081. package/src/resources/extensions/gsd/tests/metrics-milestone-scope.test.ts +1 -1
  1082. package/src/resources/extensions/gsd/tests/metrics-prune-cache-invalidation.test.ts +1 -1
  1083. package/src/resources/extensions/gsd/tests/metrics-scope.test.ts +1 -1
  1084. package/src/resources/extensions/gsd/tests/migrate-parser.test.ts +74 -0
  1085. package/src/resources/extensions/gsd/tests/migrate-safety-audit.test.ts +20 -2
  1086. package/src/resources/extensions/gsd/tests/migrate-transformer.test.ts +61 -2
  1087. package/src/resources/extensions/gsd/tests/milestone-leases.test.ts +26 -2
  1088. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  1089. package/src/resources/extensions/gsd/tests/milestone-scope-classifier.test.ts +1 -1
  1090. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +1 -1
  1091. package/src/resources/extensions/gsd/tests/model-router.test.ts +1 -1
  1092. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +1 -1
  1093. package/src/resources/extensions/gsd/tests/notifications-handler.test.ts +1 -1
  1094. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +1 -1
  1095. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +1 -1
  1096. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +1 -1
  1097. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +1 -1
  1098. package/src/resources/extensions/gsd/tests/parallel-milestone-isolation.test.ts +2 -2
  1099. package/src/resources/extensions/gsd/tests/parallel-monitor-overlay.test.ts +1 -1
  1100. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +1 -1
  1101. package/src/resources/extensions/gsd/tests/park-milestone.test.ts +1 -158
  1102. package/src/resources/extensions/gsd/tests/path-cache-decoupled.test.ts +1 -1
  1103. package/src/resources/extensions/gsd/tests/path-normalization-unified.test.ts +1 -1
  1104. package/src/resources/extensions/gsd/tests/paths-cache.test.ts +1 -1
  1105. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +1 -1
  1106. package/src/resources/extensions/gsd/tests/pending-autostart-scope.test.ts +1 -1
  1107. package/src/resources/extensions/gsd/tests/pipeline-variant-dispatch.test.ts +1 -1
  1108. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +1 -1
  1109. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +1 -1
  1110. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +1 -1
  1111. package/src/resources/extensions/gsd/tests/planning-depth-setter.test.ts +1 -1
  1112. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +1 -1
  1113. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +1 -1
  1114. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +1 -1
  1115. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +1 -1
  1116. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +2 -2
  1117. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +1 -1
  1118. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +1 -1
  1119. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +1 -1
  1120. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +1 -1
  1121. package/src/resources/extensions/gsd/tests/provider-switch-observer.test.ts +1 -1
  1122. package/src/resources/extensions/gsd/tests/quality-gates.test.ts +1 -1
  1123. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +1 -1
  1124. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +1 -1
  1125. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +1 -1
  1126. package/src/resources/extensions/gsd/tests/repository-registry.test.ts +1 -1
  1127. package/src/resources/extensions/gsd/tests/research-milestone-composer.test.ts +1 -1
  1128. package/src/resources/extensions/gsd/tests/resolve-ts.mjs +0 -4
  1129. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +1 -1
  1130. package/src/resources/extensions/gsd/tests/resume-missing-worktree-warning.test.ts +1 -1
  1131. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +1 -1
  1132. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +1 -1
  1133. package/src/resources/extensions/gsd/tests/runtime-kv.test.ts +1 -1
  1134. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +1 -1
  1135. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +1 -1
  1136. package/src/resources/extensions/gsd/tests/session-lock-multipath.test.ts +2 -2
  1137. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +1 -1
  1138. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +27 -10
  1139. package/src/resources/extensions/gsd/tests/skill-manifest.test.ts +1 -1
  1140. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +1 -1
  1141. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +5 -1
  1142. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +5 -1
  1143. package/src/resources/extensions/gsd/tests/smart-entry-routing.test.ts +1 -1
  1144. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +1 -1
  1145. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +1 -1
  1146. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -3
  1147. package/src/resources/extensions/gsd/tests/state-reconciliation-drift.test.ts +1 -1
  1148. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +1 -1
  1149. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  1150. package/src/resources/extensions/gsd/tests/stuck-state-via-db.test.ts +1 -1
  1151. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +1 -1
  1152. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +1 -1
  1153. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +1 -1
  1154. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +1 -1
  1155. package/src/resources/extensions/gsd/tests/teardown-failure-clears-registry.test.ts +1 -1
  1156. package/src/resources/extensions/gsd/tests/token-profile.test.ts +1 -1
  1157. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +1 -1
  1158. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +1 -1
  1159. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +1 -1
  1160. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +1 -1
  1161. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +1 -1
  1162. package/src/resources/extensions/gsd/tests/tui-render-kit.test.ts +1 -1
  1163. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +3 -3
  1164. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +1 -1
  1165. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +1 -1
  1166. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +1 -1
  1167. package/src/resources/extensions/gsd/tests/unmerged-milestone-guard.test.ts +1 -1
  1168. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +1 -1
  1169. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +1 -1
  1170. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +1 -1
  1171. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +1 -1
  1172. package/src/resources/extensions/gsd/tests/update-command.test.ts +62 -0
  1173. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +1 -1
  1174. package/src/resources/extensions/gsd/tests/validate-milestone-prompt-verification-classes.test.ts +1 -1
  1175. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +1 -1
  1176. package/src/resources/extensions/gsd/tests/validation-block-guard.test.ts +1 -1
  1177. package/src/resources/extensions/gsd/tests/validator-scope-parity.test.ts +1 -1
  1178. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +16 -7
  1179. package/src/resources/extensions/gsd/tests/verification-retry-policy.test.ts +1 -1
  1180. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +12 -1
  1181. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +1 -1
  1182. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +1 -1
  1183. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +1 -1
  1184. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +1 -1
  1185. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +1 -1
  1186. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +1 -1
  1187. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +1 -1
  1188. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +1 -1
  1189. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +1 -1
  1190. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +1 -1
  1191. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +1 -1
  1192. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +1 -1
  1193. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +1 -1
  1194. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +1 -1
  1195. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +1 -1
  1196. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +1 -1
  1197. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +1 -1
  1198. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +1 -1
  1199. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +1 -1
  1200. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +1 -1
  1201. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +1 -1
  1202. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +1 -1
  1203. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +1 -1
  1204. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +1 -1
  1205. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +1 -1
  1206. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +1 -1
  1207. package/src/resources/extensions/gsd/tests/workspace.test.ts +1 -1
  1208. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +2 -2
  1209. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +1 -1
  1210. package/src/resources/extensions/gsd/tests/worktree-lifecycle.test.ts +2 -2
  1211. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +1 -1
  1212. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  1213. package/src/resources/extensions/gsd/tests/worktree-projection-writers.test.ts +1 -1
  1214. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +1 -1
  1215. package/src/resources/extensions/gsd/tests/worktree-state-projection.test.ts +1 -1
  1216. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +1 -1
  1217. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +1 -1
  1218. package/src/resources/extensions/gsd/tests/write-gate-predicates.test.ts +1 -1
  1219. package/src/resources/extensions/gsd/tests/write-gate.test.ts +1 -1
  1220. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +1 -1
  1221. package/src/resources/extensions/gsd/tool-contract.ts +1 -1
  1222. package/src/resources/extensions/gsd/tools/complete-milestone.ts +2 -2
  1223. package/src/resources/extensions/gsd/tools/complete-slice.ts +12 -1
  1224. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  1225. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +1 -1
  1226. package/src/resources/extensions/gsd/tools/exec-tool.ts +1 -1
  1227. package/src/resources/extensions/gsd/tools/plan-milestone.ts +1 -1
  1228. package/src/resources/extensions/gsd/tools/validate-milestone.ts +1 -1
  1229. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  1230. package/src/resources/extensions/gsd/tui/render-kit.ts +1 -1
  1231. package/src/resources/extensions/gsd/types.ts +1 -1
  1232. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  1233. package/src/resources/extensions/gsd/unit-context-manifest.ts +1 -1
  1234. package/src/resources/extensions/gsd/unmerged-milestone-guard.ts +1 -1
  1235. package/src/resources/extensions/gsd/uok/audit.ts +1 -1
  1236. package/src/resources/extensions/gsd/uok/contracts.ts +1 -1
  1237. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +1 -1
  1238. package/src/resources/extensions/gsd/uok/kernel.ts +1 -1
  1239. package/src/resources/extensions/gsd/uok/loop-adapter.ts +1 -1
  1240. package/src/resources/extensions/gsd/uok/plan-v2.ts +1 -1
  1241. package/src/resources/extensions/gsd/uok/timeline.ts +1 -1
  1242. package/src/resources/extensions/gsd/validation-block-guard.ts +1 -1
  1243. package/src/resources/extensions/gsd/verification-gate.ts +28 -12
  1244. package/src/resources/extensions/gsd/verification-verdict.ts +10 -1
  1245. package/src/resources/extensions/gsd/watch/header-renderer.ts +1 -1
  1246. package/src/resources/extensions/gsd/watch/splash-palette.ts +1 -1
  1247. package/src/resources/extensions/gsd/workflow-manifest.ts +1 -1
  1248. package/src/resources/extensions/gsd/workflow-projections.ts +1 -1
  1249. package/src/resources/extensions/gsd/workflow-protocol.ts +1 -1
  1250. package/src/resources/extensions/gsd/workflow-templates.ts +1 -1
  1251. package/src/resources/extensions/gsd/working-output-messages.ts +1 -1
  1252. package/src/resources/extensions/gsd/workspace.ts +1 -1
  1253. package/src/resources/extensions/gsd/worktree-lifecycle.ts +1 -1
  1254. package/src/resources/extensions/gsd/worktree-manager.ts +1 -1
  1255. package/src/resources/extensions/gsd/worktree-safety.ts +1 -1
  1256. package/src/resources/extensions/gsd/worktree-state-projection.ts +1 -1
  1257. package/src/resources/extensions/mcp-client/manager.ts +1 -1
  1258. package/src/resources/extensions/mcp-client/tests/manager.test.ts +1 -1
  1259. package/src/resources/extensions/ollama/index.ts +1 -1
  1260. package/src/resources/extensions/ollama/model-capabilities.ts +1 -1
  1261. package/src/resources/extensions/ollama/ndjson-stream.ts +1 -1
  1262. package/src/resources/extensions/ollama/ollama-chat-provider.ts +1 -1
  1263. package/src/resources/extensions/ollama/ollama-client.ts +1 -1
  1264. package/src/resources/extensions/ollama/ollama-commands.ts +1 -1
  1265. package/src/resources/extensions/ollama/ollama-discovery.ts +1 -1
  1266. package/src/resources/extensions/ollama/ollama-tool.ts +1 -1
  1267. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +1 -1
  1268. package/src/resources/extensions/ollama/tests/ollama-chat-provider-stream.test.ts +1 -1
  1269. package/src/resources/extensions/ollama/tests/ollama-client-timeout-env.test.ts +1 -1
  1270. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +1 -1
  1271. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +1 -1
  1272. package/src/resources/extensions/ollama/thinking-parser.ts +1 -1
  1273. package/src/resources/extensions/ollama/types.ts +1 -1
  1274. package/src/resources/extensions/shared/cmux-events.ts +1 -1
  1275. package/src/resources/extensions/shared/gsd-phase-state.ts +1 -1
  1276. package/src/resources/extensions/shared/interview-ui.ts +1 -1
  1277. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +1 -1
  1278. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +1 -1
  1279. package/src/resources/extensions/shared/tests/next-action-ui-hasui.test.ts +1 -1
  1280. package/src/resources/extensions/subagent/launch.ts +1 -1
  1281. package/src/resources/extensions/subagent/run-store.ts +1 -1
  1282. package/src/resources/extensions/subagent/tests/launch.test.ts +1 -1
  1283. package/src/resources/extensions/subagent/tests/run-store.test.ts +1 -1
  1284. package/src/resources/extensions/visual-brief/artifact-policy.ts +1 -1
  1285. package/src/resources/extensions/visual-brief/index.ts +1 -1
  1286. package/src/resources/extensions/visual-brief/page-contract.ts +1 -1
  1287. package/src/resources/extensions/visual-brief/prompts.ts +1 -1
  1288. package/src/resources/extensions/visual-brief/tests/visual-brief.test.ts +1 -1
  1289. package/src/resources/skills/api-design/SKILL.md +1 -1
  1290. package/src/resources/skills/create-gsd-extension/SKILL.md +1 -1
  1291. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +1 -1
  1292. package/src/resources/skills/create-mcp-server/SKILL.md +1 -1
  1293. package/src/resources/skills/dependency-upgrade/SKILL.md +1 -1
  1294. package/src/resources/skills/observability/SKILL.md +4 -4
  1295. package/src/resources/skills/security-review/SKILL.md +1 -1
  1296. package/dist/web/standalone/.next/static/chunks/app/layout-82017658b76e2494.js +0 -1
  1297. package/dist/web/standalone/.next/static/chunks/app/page-d660442e70026068.js +0 -1
  1298. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-1065c9a10c4c2187.js +0 -1
  1299. package/dist/web/standalone/node_modules/@img/sharp-darwin-arm64/lib/sharp-darwin-arm64.node +0 -0
  1300. package/src/resources/extensions/gsd/tests/auto-start-needs-discussion.test.ts +0 -175
  1301. package/src/resources/extensions/gsd/tests/cache-staleness-regression.test.ts +0 -290
  1302. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +0 -743
  1303. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +0 -138
  1304. package/src/resources/extensions/gsd/tests/derive-state-crossval.test.ts +0 -514
  1305. package/src/resources/extensions/gsd/tests/derive-state-deps.test.ts +0 -641
  1306. package/src/resources/extensions/gsd/tests/derive-state-draft.test.ts +0 -313
  1307. package/src/resources/extensions/gsd/tests/derive-state.test.ts +0 -1049
  1308. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +0 -170
  1309. package/src/resources/extensions/gsd/tests/dispatch-uat-last-completed.test.ts +0 -206
  1310. package/src/resources/extensions/gsd/tests/draft-promotion.test.ts +0 -149
  1311. package/src/resources/extensions/gsd/tests/headless-query.test.ts +0 -184
  1312. package/src/resources/extensions/gsd/tests/integration/auto-preflight.test.ts +0 -38
  1313. package/src/resources/extensions/gsd/tests/integration/doctor-delimiter-fix.test.ts +0 -83
  1314. package/src/resources/extensions/gsd/tests/integration/doctor-enhancements.test.ts +0 -243
  1315. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +0 -243
  1316. package/src/resources/extensions/gsd/tests/integration/doctor-fixlevel.test.ts +0 -263
  1317. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +0 -90
  1318. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +0 -954
  1319. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +0 -431
  1320. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +0 -549
  1321. package/src/resources/extensions/gsd/tests/integration/doctor.test.ts +0 -612
  1322. package/src/resources/extensions/gsd/tests/integration/integration-mixed-milestones.test.ts +0 -539
  1323. package/src/resources/extensions/gsd/tests/integration/migrate-command.test.ts +0 -405
  1324. package/src/resources/extensions/gsd/tests/integration/queue-reorder-e2e.test.ts +0 -335
  1325. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +0 -248
  1326. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +0 -347
  1327. package/src/resources/extensions/gsd/tests/park-edge-cases.test.ts +0 -253
  1328. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +0 -567
  1329. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +0 -252
  1330. package/src/resources/extensions/gsd/tests/replan-slice.test.ts +0 -609
  1331. package/src/resources/extensions/gsd/tests/requirements.test.ts +0 -110
  1332. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +0 -348
  1333. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +0 -257
  1334. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +0 -1645
  1335. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +0 -766
  1336. package/src/resources/extensions/gsd/tests/workspace-index.test.ts +0 -38
  1337. package/src/resources/extensions/gsd/tests/worktree-integration.test.ts +0 -216
  1338. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +0 -242
  1339. /package/dist/web/standalone/.next/static/{YA9EfdcYixDXzFk6uCrQ2 → xbY3PcWtH3LhCQlgKH75u}/_buildManifest.js +0 -0
  1340. /package/dist/web/standalone/.next/static/{YA9EfdcYixDXzFk6uCrQ2 → xbY3PcWtH3LhCQlgKH75u}/_ssgManifest.js +0 -0
  1341. /package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64 → sharp-libvips-linux-x64}/lib/index.js +0 -0
  1342. /package/dist/web/standalone/node_modules/@img/{sharp-libvips-darwin-arm64 → sharp-libvips-linux-x64}/versions.json +0 -0
  1343. /package/dist/web/standalone/node_modules/@img/{sharp-darwin-arm64 → sharp-linux-x64}/LICENSE +0 -0
@@ -1,5 +1,5 @@
1
1
  /**
2
- * GSD-2 fake model — paired with the fake LLM provider for e2e tests.
2
+ * gsd-pi fake model — paired with the fake LLM provider for e2e tests.
3
3
  *
4
4
  * Only registered when `GSD_FAKE_LLM_TRANSCRIPT` env var is set, via the
5
5
  * conditional branch in models/index.ts. The model is invisible to normal
@@ -1,5 +1,5 @@
1
1
  /**
2
- * GSD-2 fake model — paired with the fake LLM provider for e2e tests.
2
+ * gsd-pi fake model — paired with the fake LLM provider for e2e tests.
3
3
  *
4
4
  * Only registered when `GSD_FAKE_LLM_TRANSCRIPT` env var is set, via the
5
5
  * conditional branch in models/index.ts. The model is invisible to normal
@@ -1 +1 @@
1
- {"version":3,"file":"fake-model.js","sourceRoot":"","sources":["../../src/models/fake-model.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAG,UAAmB,CAAC;AACjD,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAyB,CAAC;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAkB;IACxC,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,uBAAuB;IAC7B,GAAG,EAAE,MAAM;IACX,QAAQ,EAAE,aAAa;IACvB,OAAO,EAAE,2BAA2B;IACpC,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,CAAC,MAAM,CAAC;IACf,IAAI,EAAE;QACL,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;KACb;IACD,aAAa,EAAE,OAAO;IACtB,SAAS,EAAE,KAAK;CAChB,CAAC","sourcesContent":["/**\n * GSD-2 fake model — paired with the fake LLM provider for e2e tests.\n *\n * Only registered when `GSD_FAKE_LLM_TRANSCRIPT` env var is set, via the\n * conditional branch in models/index.ts. The model is invisible to normal\n * users; it shows up in `--list-models` only inside e2e test subprocesses.\n */\n\nimport type { Model } from \"../types.js\";\n\nexport const FAKE_PROVIDER = \"gsd-fake\" as const;\nexport const FAKE_MODEL_ID = \"gsd-fake-model\" as const;\n\nexport const FAKE_MODEL: Model<\"fake\"> = {\n\tid: FAKE_MODEL_ID,\n\tname: \"GSD Fake (e2e replay)\",\n\tapi: \"fake\",\n\tprovider: FAKE_PROVIDER,\n\tbaseUrl: \"https://fake.gsd.local/v1\",\n\treasoning: false,\n\tinput: [\"text\"],\n\tcost: {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t},\n\tcontextWindow: 200_000,\n\tmaxTokens: 8_192,\n};\n"]}
1
+ {"version":3,"file":"fake-model.js","sourceRoot":"","sources":["../../src/models/fake-model.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,CAAC,MAAM,aAAa,GAAG,UAAmB,CAAC;AACjD,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAyB,CAAC;AAEvD,MAAM,CAAC,MAAM,UAAU,GAAkB;IACxC,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,uBAAuB;IAC7B,GAAG,EAAE,MAAM;IACX,QAAQ,EAAE,aAAa;IACvB,OAAO,EAAE,2BAA2B;IACpC,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,CAAC,MAAM,CAAC;IACf,IAAI,EAAE;QACL,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC;QACZ,UAAU,EAAE,CAAC;KACb;IACD,aAAa,EAAE,OAAO;IACtB,SAAS,EAAE,KAAK;CAChB,CAAC","sourcesContent":["/**\n * gsd-pi fake model — paired with the fake LLM provider for e2e tests.\n *\n * Only registered when `GSD_FAKE_LLM_TRANSCRIPT` env var is set, via the\n * conditional branch in models/index.ts. The model is invisible to normal\n * users; it shows up in `--list-models` only inside e2e test subprocesses.\n */\n\nimport type { Model } from \"../types.js\";\n\nexport const FAKE_PROVIDER = \"gsd-fake\" as const;\nexport const FAKE_MODEL_ID = \"gsd-fake-model\" as const;\n\nexport const FAKE_MODEL: Model<\"fake\"> = {\n\tid: FAKE_MODEL_ID,\n\tname: \"GSD Fake (e2e replay)\",\n\tapi: \"fake\",\n\tprovider: FAKE_PROVIDER,\n\tbaseUrl: \"https://fake.gsd.local/v1\",\n\treasoning: false,\n\tinput: [\"text\"],\n\tcost: {\n\t\tinput: 0,\n\t\toutput: 0,\n\t\tcacheRead: 0,\n\t\tcacheWrite: 0,\n\t},\n\tcontextWindow: 200_000,\n\tmaxTokens: 8_192,\n};\n"]}
@@ -1,4 +1,4 @@
1
- // gsd-2 / pi-ai: API-shape family predicates
1
+ // gsd-pi / pi-ai: API-shape family predicates
2
2
  //
3
3
  // Rule (see docs/dev/ADR-012-provider-id-vs-api-shape.md):
4
4
  // Gate API-shape-dependent behavior (tool schemas, request payload shape,
@@ -1 +1 @@
1
- {"version":3,"file":"api-family.js","sourceRoot":"","sources":["../../src/providers/api-family.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,2DAA2D;AAC3D,4EAA4E;AAC5E,iEAAiE;AACjE,0EAA0E;AAC1E,kEAAkE;AAClE,0EAA0E;AAC1E,eAAe;AAKf;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC;IACvB,OAAO,GAAG,KAAK,oBAAoB,IAAI,GAAG,KAAK,kBAAkB,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC;IACvB,OAAO,CACL,GAAG,KAAK,oBAAoB;QAC5B,GAAG,KAAK,kBAAkB;QAC1B,GAAG,KAAK,wBAAwB;QAChC,GAAG,KAAK,wBAAwB,CACjC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC;IACvB,OAAO,CACL,GAAG,KAAK,sBAAsB;QAC9B,GAAG,KAAK,mBAAmB;QAC3B,GAAG,KAAK,eAAe,CACxB,CAAC;AACJ,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,EAAE,GAAG,KAAK,yBAAyB,CAAC;AAClD,CAAC","sourcesContent":["// gsd-2 / pi-ai: API-shape family predicates\n//\n// Rule (see docs/dev/ADR-012-provider-id-vs-api-shape.md):\n// Gate API-shape-dependent behavior (tool schemas, request payload shape,\n// streaming format) on `model.api`, never on `model.provider`.\n// `provider` is a credential/transport identifier that varies by vendor\n// routing (e.g. `anthropic`, `claude-code`, `anthropic-vertex`,\n// `amazon-bedrock`, `vercel-ai-gateway`) even when the wire protocol is\n// identical.\n\n/** Minimal shape — any object with an optional `api` string works. */\ntype HasApi = { api?: string } | null | undefined;\n\n/**\n * True for any transport that speaks the Anthropic Messages wire protocol:\n * direct Anthropic, Claude Code OAuth, Anthropic-on-Vertex, Vercel AI Gateway\n * Anthropic routes, etc.\n *\n * Excludes Bedrock-hosted Claude — Bedrock Converse uses a different tool\n * schema and is matched by `isBedrockApi` instead.\n */\nexport function isAnthropicApi(model: HasApi): boolean {\n const api = model?.api;\n return api === \"anthropic-messages\" || api === \"anthropic-vertex\";\n}\n\n/**\n * True for any transport that speaks an OpenAI-shaped wire protocol:\n * Chat Completions, Responses, Azure-hosted Responses, Codex-hosted Responses.\n */\nexport function isOpenAIApi(model: HasApi): boolean {\n const api = model?.api;\n return (\n api === \"openai-completions\" ||\n api === \"openai-responses\" ||\n api === \"azure-openai-responses\" ||\n api === \"openai-codex-responses\"\n );\n}\n\n/**\n * True for any transport that speaks a Google Gemini wire protocol:\n * Generative AI REST, Gemini CLI, Vertex AI.\n */\nexport function isGeminiApi(model: HasApi): boolean {\n const api = model?.api;\n return (\n api === \"google-generative-ai\" ||\n api === \"google-gemini-cli\" ||\n api === \"google-vertex\"\n );\n}\n\n/** True for AWS Bedrock Converse transports. */\nexport function isBedrockApi(model: HasApi): boolean {\n return model?.api === \"bedrock-converse-stream\";\n}\n"]}
1
+ {"version":3,"file":"api-family.js","sourceRoot":"","sources":["../../src/providers/api-family.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,EAAE;AACF,2DAA2D;AAC3D,4EAA4E;AAC5E,iEAAiE;AACjE,0EAA0E;AAC1E,kEAAkE;AAClE,0EAA0E;AAC1E,eAAe;AAKf;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC;IACvB,OAAO,GAAG,KAAK,oBAAoB,IAAI,GAAG,KAAK,kBAAkB,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC;IACvB,OAAO,CACL,GAAG,KAAK,oBAAoB;QAC5B,GAAG,KAAK,kBAAkB;QAC1B,GAAG,KAAK,wBAAwB;QAChC,GAAG,KAAK,wBAAwB,CACjC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,MAAM,GAAG,GAAG,KAAK,EAAE,GAAG,CAAC;IACvB,OAAO,CACL,GAAG,KAAK,sBAAsB;QAC9B,GAAG,KAAK,mBAAmB;QAC3B,GAAG,KAAK,eAAe,CACxB,CAAC;AACJ,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,KAAK,EAAE,GAAG,KAAK,yBAAyB,CAAC;AAClD,CAAC","sourcesContent":["// gsd-pi / pi-ai: API-shape family predicates\n//\n// Rule (see docs/dev/ADR-012-provider-id-vs-api-shape.md):\n// Gate API-shape-dependent behavior (tool schemas, request payload shape,\n// streaming format) on `model.api`, never on `model.provider`.\n// `provider` is a credential/transport identifier that varies by vendor\n// routing (e.g. `anthropic`, `claude-code`, `anthropic-vertex`,\n// `amazon-bedrock`, `vercel-ai-gateway`) even when the wire protocol is\n// identical.\n\n/** Minimal shape — any object with an optional `api` string works. */\ntype HasApi = { api?: string } | null | undefined;\n\n/**\n * True for any transport that speaks the Anthropic Messages wire protocol:\n * direct Anthropic, Claude Code OAuth, Anthropic-on-Vertex, Vercel AI Gateway\n * Anthropic routes, etc.\n *\n * Excludes Bedrock-hosted Claude — Bedrock Converse uses a different tool\n * schema and is matched by `isBedrockApi` instead.\n */\nexport function isAnthropicApi(model: HasApi): boolean {\n const api = model?.api;\n return api === \"anthropic-messages\" || api === \"anthropic-vertex\";\n}\n\n/**\n * True for any transport that speaks an OpenAI-shaped wire protocol:\n * Chat Completions, Responses, Azure-hosted Responses, Codex-hosted Responses.\n */\nexport function isOpenAIApi(model: HasApi): boolean {\n const api = model?.api;\n return (\n api === \"openai-completions\" ||\n api === \"openai-responses\" ||\n api === \"azure-openai-responses\" ||\n api === \"openai-codex-responses\"\n );\n}\n\n/**\n * True for any transport that speaks a Google Gemini wire protocol:\n * Generative AI REST, Gemini CLI, Vertex AI.\n */\nexport function isGeminiApi(model: HasApi): boolean {\n const api = model?.api;\n return (\n api === \"google-generative-ai\" ||\n api === \"google-gemini-cli\" ||\n api === \"google-vertex\"\n );\n}\n\n/** True for AWS Bedrock Converse transports. */\nexport function isBedrockApi(model: HasApi): boolean {\n return model?.api === \"bedrock-converse-stream\";\n}\n"]}
@@ -1,4 +1,4 @@
1
- // gsd-2 / pi-ai: api-family predicate tests
1
+ // gsd-pi / pi-ai: api-family predicate tests
2
2
  import { describe, test } from "node:test";
3
3
  import assert from "node:assert/strict";
4
4
  import { isAnthropicApi, isBedrockApi, isGeminiApi, isOpenAIApi, } from "./api-family.js";
@@ -1 +1 @@
1
- {"version":3,"file":"api-family.test.js","sourceRoot":"","sources":["../../src/providers/api-family.test.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EACL,cAAc,EACd,YAAY,EACZ,WAAW,EACX,WAAW,GACZ,MAAM,iBAAiB,CAAC;AAEzB,gFAAgF;AAChF,2EAA2E;AAC3E,4EAA4E;AAC5E,uCAAuC;AACvC,MAAM,mBAAmB,GAAG;IAC1B,oBAAoB;IACpB,kBAAkB;IAClB,oBAAoB;IACpB,kBAAkB;IAClB,wBAAwB;IACxB,wBAAwB;IACxB,sBAAsB;IACtB,mBAAmB;IACnB,eAAe;IACf,yBAAyB;IACzB,uBAAuB;CACf,CAAC;AAEX,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,oBAAoB,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,kBAAkB,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACpE,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,oBAAoB,IAAI,CAAC,KAAK,kBAAkB,CAC9D,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,KAAK,MAAM,GAAG,IAAI;YAChB,oBAAoB;YACpB,kBAAkB;YAClB,wBAAwB;YACxB,wBAAwB;SACzB,EAAE,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,KAAK,oBAAoB;YAC1B,CAAC,KAAK,kBAAkB;YACxB,CAAC,KAAK,wBAAwB;YAC9B,CAAC,KAAK,wBAAwB,CACjC,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAC1C,KAAK,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,mBAAmB,EAAE,eAAe,CAAC,EAAE,CAAC;YACjF,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;QACzD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACpD,MAAM,SAAS,GAAG,mBAAmB,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,KAAK,sBAAsB;YAC5B,CAAC,KAAK,mBAAmB;YACzB,CAAC,KAAK,eAAe,CACxB,CAAC;QACF,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,yBAAyB,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACrE,KAAK,MAAM,GAAG,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,yBAAyB,CAAC,EAAE,CAAC;YACrF,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,IAAI,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAClF,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG;gBACd,cAAc,CAAC,EAAE,GAAG,EAAE,CAAC;gBACvB,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC;gBACpB,WAAW,CAAC,EAAE,GAAG,EAAE,CAAC;gBACpB,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC;aACtB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;YACzB,MAAM,QAAQ,GAAG,GAAG,KAAK,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,KAAK,CACV,OAAO,EACP,QAAQ,EACR,OAAO,GAAG,YAAY,OAAO,uBAAuB,QAAQ,GAAG,CAChE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["// gsd-2 / pi-ai: api-family predicate tests\nimport { describe, test } from \"node:test\";\nimport assert from \"node:assert/strict\";\n\nimport {\n isAnthropicApi,\n isBedrockApi,\n isGeminiApi,\n isOpenAIApi,\n} from \"./api-family.js\";\n\n// Every api value registered via registerApiProvider() in register-builtins.ts.\n// Keep in sync with that file — the expectations below assert every api is\n// classified by exactly one family (except mistral, which is its own family\n// and belongs to none of the helpers).\nconst ALL_REGISTERED_APIS = [\n \"anthropic-messages\",\n \"anthropic-vertex\",\n \"openai-completions\",\n \"openai-responses\",\n \"azure-openai-responses\",\n \"openai-codex-responses\",\n \"google-generative-ai\",\n \"google-gemini-cli\",\n \"google-vertex\",\n \"bedrock-converse-stream\",\n \"mistral-conversations\",\n] as const;\n\ndescribe(\"isAnthropicApi\", () => {\n test(\"matches anthropic-messages and anthropic-vertex\", () => {\n assert.equal(isAnthropicApi({ api: \"anthropic-messages\" }), true);\n assert.equal(isAnthropicApi({ api: \"anthropic-vertex\" }), true);\n });\n\n test(\"excludes bedrock-converse-stream (different tool schema)\", () => {\n assert.equal(isAnthropicApi({ api: \"bedrock-converse-stream\" }), false);\n });\n\n test(\"excludes every non-Anthropic registered api\", () => {\n const nonAnthropic = ALL_REGISTERED_APIS.filter(\n (a) => a !== \"anthropic-messages\" && a !== \"anthropic-vertex\",\n );\n for (const api of nonAnthropic) {\n assert.equal(isAnthropicApi({ api }), false, `api=${api}`);\n }\n });\n\n test(\"tolerates null/undefined/missing api\", () => {\n assert.equal(isAnthropicApi(null), false);\n assert.equal(isAnthropicApi(undefined), false);\n assert.equal(isAnthropicApi({}), false);\n assert.equal(isAnthropicApi({ api: \"\" }), false);\n });\n});\n\ndescribe(\"isOpenAIApi\", () => {\n test(\"matches all OpenAI-shaped apis\", () => {\n for (const api of [\n \"openai-completions\",\n \"openai-responses\",\n \"azure-openai-responses\",\n \"openai-codex-responses\",\n ]) {\n assert.equal(isOpenAIApi({ api }), true, `api=${api}`);\n }\n });\n\n test(\"excludes every non-OpenAI registered api\", () => {\n const nonOpenAI = ALL_REGISTERED_APIS.filter(\n (a) =>\n a !== \"openai-completions\" &&\n a !== \"openai-responses\" &&\n a !== \"azure-openai-responses\" &&\n a !== \"openai-codex-responses\",\n );\n for (const api of nonOpenAI) {\n assert.equal(isOpenAIApi({ api }), false, `api=${api}`);\n }\n });\n});\n\ndescribe(\"isGeminiApi\", () => {\n test(\"matches all Gemini-shaped apis\", () => {\n for (const api of [\"google-generative-ai\", \"google-gemini-cli\", \"google-vertex\"]) {\n assert.equal(isGeminiApi({ api }), true, `api=${api}`);\n }\n });\n\n test(\"excludes every non-Gemini registered api\", () => {\n const nonGemini = ALL_REGISTERED_APIS.filter(\n (a) =>\n a !== \"google-generative-ai\" &&\n a !== \"google-gemini-cli\" &&\n a !== \"google-vertex\",\n );\n for (const api of nonGemini) {\n assert.equal(isGeminiApi({ api }), false, `api=${api}`);\n }\n });\n});\n\ndescribe(\"isBedrockApi\", () => {\n test(\"matches only bedrock-converse-stream\", () => {\n assert.equal(isBedrockApi({ api: \"bedrock-converse-stream\" }), true);\n for (const api of ALL_REGISTERED_APIS.filter((a) => a !== \"bedrock-converse-stream\")) {\n assert.equal(isBedrockApi({ api }), false, `api=${api}`);\n }\n });\n});\n\ndescribe(\"api-family exclusivity\", () => {\n test(\"every registered api belongs to exactly one family (or mistral = none)\", () => {\n for (const api of ALL_REGISTERED_APIS) {\n const matches = [\n isAnthropicApi({ api }),\n isOpenAIApi({ api }),\n isGeminiApi({ api }),\n isBedrockApi({ api }),\n ].filter(Boolean).length;\n const expected = api === \"mistral-conversations\" ? 0 : 1;\n assert.equal(\n matches,\n expected,\n `api=${api} matched ${matches} families (expected ${expected})`,\n );\n }\n });\n});\n"]}
1
+ {"version":3,"file":"api-family.test.js","sourceRoot":"","sources":["../../src/providers/api-family.test.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi / pi-ai: api-family predicate tests\nimport { describe, test } from \"node:test\";\nimport assert from \"node:assert/strict\";\n\nimport {\n isAnthropicApi,\n isBedrockApi,\n isGeminiApi,\n isOpenAIApi,\n} from \"./api-family.js\";\n\n// Every api value registered via registerApiProvider() in register-builtins.ts.\n// Keep in sync with that file — the expectations below assert every api is\n// classified by exactly one family (except mistral, which is its own family\n// and belongs to none of the helpers).\nconst ALL_REGISTERED_APIS = [\n \"anthropic-messages\",\n \"anthropic-vertex\",\n \"openai-completions\",\n \"openai-responses\",\n \"azure-openai-responses\",\n \"openai-codex-responses\",\n \"google-generative-ai\",\n \"google-gemini-cli\",\n \"google-vertex\",\n \"bedrock-converse-stream\",\n \"mistral-conversations\",\n] as const;\n\ndescribe(\"isAnthropicApi\", () => {\n test(\"matches anthropic-messages and anthropic-vertex\", () => {\n assert.equal(isAnthropicApi({ api: \"anthropic-messages\" }), true);\n assert.equal(isAnthropicApi({ api: \"anthropic-vertex\" }), true);\n });\n\n test(\"excludes bedrock-converse-stream (different tool schema)\", () => {\n assert.equal(isAnthropicApi({ api: \"bedrock-converse-stream\" }), false);\n });\n\n test(\"excludes every non-Anthropic registered api\", () => {\n const nonAnthropic = ALL_REGISTERED_APIS.filter(\n (a) => a !== \"anthropic-messages\" && a !== \"anthropic-vertex\",\n );\n for (const api of nonAnthropic) {\n assert.equal(isAnthropicApi({ api }), false, `api=${api}`);\n }\n });\n\n test(\"tolerates null/undefined/missing api\", () => {\n assert.equal(isAnthropicApi(null), false);\n assert.equal(isAnthropicApi(undefined), false);\n assert.equal(isAnthropicApi({}), false);\n assert.equal(isAnthropicApi({ api: \"\" }), false);\n });\n});\n\ndescribe(\"isOpenAIApi\", () => {\n test(\"matches all OpenAI-shaped apis\", () => {\n for (const api of [\n \"openai-completions\",\n \"openai-responses\",\n \"azure-openai-responses\",\n \"openai-codex-responses\",\n ]) {\n assert.equal(isOpenAIApi({ api }), true, `api=${api}`);\n }\n });\n\n test(\"excludes every non-OpenAI registered api\", () => {\n const nonOpenAI = ALL_REGISTERED_APIS.filter(\n (a) =>\n a !== \"openai-completions\" &&\n a !== \"openai-responses\" &&\n a !== \"azure-openai-responses\" &&\n a !== \"openai-codex-responses\",\n );\n for (const api of nonOpenAI) {\n assert.equal(isOpenAIApi({ api }), false, `api=${api}`);\n }\n });\n});\n\ndescribe(\"isGeminiApi\", () => {\n test(\"matches all Gemini-shaped apis\", () => {\n for (const api of [\"google-generative-ai\", \"google-gemini-cli\", \"google-vertex\"]) {\n assert.equal(isGeminiApi({ api }), true, `api=${api}`);\n }\n });\n\n test(\"excludes every non-Gemini registered api\", () => {\n const nonGemini = ALL_REGISTERED_APIS.filter(\n (a) =>\n a !== \"google-generative-ai\" &&\n a !== \"google-gemini-cli\" &&\n a !== \"google-vertex\",\n );\n for (const api of nonGemini) {\n assert.equal(isGeminiApi({ api }), false, `api=${api}`);\n }\n });\n});\n\ndescribe(\"isBedrockApi\", () => {\n test(\"matches only bedrock-converse-stream\", () => {\n assert.equal(isBedrockApi({ api: \"bedrock-converse-stream\" }), true);\n for (const api of ALL_REGISTERED_APIS.filter((a) => a !== \"bedrock-converse-stream\")) {\n assert.equal(isBedrockApi({ api }), false, `api=${api}`);\n }\n });\n});\n\ndescribe(\"api-family exclusivity\", () => {\n test(\"every registered api belongs to exactly one family (or mistral = none)\", () => {\n for (const api of ALL_REGISTERED_APIS) {\n const matches = [\n isAnthropicApi({ api }),\n isOpenAIApi({ api }),\n isGeminiApi({ api }),\n isBedrockApi({ api }),\n ].filter(Boolean).length;\n const expected = api === \"mistral-conversations\" ? 0 : 1;\n assert.equal(\n matches,\n expected,\n `api=${api} matched ${matches} families (expected ${expected})`,\n );\n }\n });\n});\n"]}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * GSD-2 fake LLM provider — deterministic JSONL replay for e2e tests.
2
+ * gsd-pi fake LLM provider — deterministic JSONL replay for e2e tests.
3
3
  *
4
4
  * Activated only when `GSD_FAKE_LLM_TRANSCRIPT` env var is set. Reads a
5
5
  * JSONL transcript file (one turn per line) and replays scripted responses
@@ -1,5 +1,5 @@
1
1
  /**
2
- * GSD-2 fake LLM provider — deterministic JSONL replay for e2e tests.
2
+ * gsd-pi fake LLM provider — deterministic JSONL replay for e2e tests.
3
3
  *
4
4
  * Activated only when `GSD_FAKE_LLM_TRANSCRIPT` env var is set. Reads a
5
5
  * JSONL transcript file (one turn per line) and replays scripted responses
@@ -1 +1 @@
1
- {"version":3,"file":"fake.js","sourceRoot":"","sources":["../../src/providers/fake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAWvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAEvE,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAe,CAAC;AA4BxC,SAAS,eAAe,CAAC,IAAY;IACpC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACjE,MAAM,KAAK,GAAqB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QACzC,IAAI,CAAC;YACJ,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACd,wCAAwC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAM,GAAa,CAAC,OAAO,aAAa,IAAI,EAAE,CACxG,CAAC;QACH,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,GAAY;IACpC,KAAK,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,QAAQ,CAAC,CAAc;IAC/B,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,OAAO,CAAC;IACpD,OAAO,CAAC,CAAC,OAAO;SACd,MAAM,CAAC,CAAC,CAAC,EAAuC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;SACrE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAClB,IAAI,CAAC,IAAI,CAAC,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,KAA6B,EAAE,GAAY,EAAE,IAAoB;IAC3F,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IACtB,IAAI,CAAC,CAAC;QAAE,OAAO;IACf,MAAM,IAAI,GAAG,CAAC,GAAW,EAAS,EAAE;QACnC,6DAA6D;QAC7D,MAAM,MAAM,GAAG;YACd,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM;YACjC,YAAY,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;YACzF,SAAS,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE;SAC9C,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,CAAC,IAAI,0BAA0B,GAAG,eAAe,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClH,CAAC,CAAC;IAEF,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;QACvD,IAAI,CAAC,oBAAoB,CAAC,CAAC,OAAO,SAAS,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC;QAC5E,IAAI,CAAC,yBAAyB,CAAC,CAAC,YAAY,SAAS,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,qCAAqC,CAAC,CAAC,YAAY,+BAA+B,CAAC,CAAC;QACpG,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,qCAAqC,CAAC,CAAC,YAAY,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3F,CAAC;IACF,CAAC;IACD,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;QACnC,KAAK,MAAM,MAAM,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,qCAAqC,MAAM,GAAG,CAAC,CAAC;QACjF,CAAC;IACF,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3D,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,IAAI,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;IACF,CAAC;IACD,IAAI,CAAC,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACjF,IAAI,CAAC,iDAAiD,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC;QAC9E,CAAC;IACF,CAAC;AACF,CAAC;AAED,SAAS,qBAAqB,CAC7B,KAA6B,EAC7B,IAAc;IAEd,MAAM,OAAO,GAAgC,EAAE,CAAC;IAChD,IAAI,UAAU,GAAmC,MAAM,CAAC;IAExD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAChD,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC;IACxC,CAAC;SAAM,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACrC,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM,EAAE,GAAa;gBACpB,IAAI,EAAE,UAAU;gBAChB,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,aAAa,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE;gBAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,SAAS,EAAE,IAAI,CAAC,KAAK;aACrB,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QACD,UAAU,GAAG,SAAS,CAAC;IACxB,CAAC;IAED,OAAO;QACN,IAAI,EAAE,WAAW;QACjB,OAAO;QACP,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,KAAK,EAAE,KAAK,CAAC,EAAE;QACf,KAAK,EAAE;YACN,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,SAAS,EAAE,CAAC;YACZ,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;SACpE;QACD,UAAU;QACV,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACrB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAgC;IAClE,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxD,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,SAAS,QAAQ;QAChB,IAAI,MAAM,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CACd,8BAA8B,MAAM,GAAG,CAAC,kCAAkC,UAAU,CAAC,MAAM,+BAA+B,IAAI,CAAC,cAAc,GAAG,CAChJ,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,UAAU,CAAC,KAA6B,EAAE,GAAY;QAC9D,MAAM,MAAM,GAAG,IAAI,2BAA2B,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QAExB,yEAAyE;QACzE,uEAAuE;QACvE,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAEpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QAEvB,cAAc,CAAC,KAAK,IAAI,EAAE;YACzB,IAAI,CAAC;gBACJ,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAC/B,MAAM,QAAQ,GAAqB;wBAClC,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,EAAE;wBACX,GAAG,EAAE,KAAK,CAAC,GAAG;wBACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,KAAK,EAAE,KAAK,CAAC,EAAE;wBACf,KAAK,EAAE;4BACN,KAAK,EAAE,CAAC;4BACR,MAAM,EAAE,CAAC;4BACT,SAAS,EAAE,CAAC;4BACZ,UAAU,EAAE,CAAC;4BACb,WAAW,EAAE,CAAC;4BACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;yBACpE;wBACD,UAAU,EAAE,OAAO;wBACnB,YAAY,EAAE,IAAI,CAAC,OAAO,IAAI,qBAAqB;wBACnD,YAAY,EAAE,IAAI,CAAC,YAAY;wBAC/B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACrB,CAAC;oBACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACjE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACrB,OAAO;gBACR,CAAC;gBAED,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;oBAC/B,kEAAkE;oBAClE,uDAAuD;oBACvD,MAAM,QAAQ,GAAqB;wBAClC,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,EAAE;wBACX,GAAG,EAAE,KAAK,CAAC,GAAG;wBACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,KAAK,EAAE,KAAK,CAAC,EAAE;wBACf,KAAK,EAAE;4BACN,KAAK,EAAE,CAAC;4BACR,MAAM,EAAE,CAAC;4BACT,SAAS,EAAE,CAAC;4BACZ,UAAU,EAAE,CAAC;4BACb,WAAW,EAAE,CAAC;4BACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;yBACpE;wBACD,UAAU,EAAE,OAAO;wBACnB,YAAY,EAAE,IAAI,CAAC,OAAO,IAAI,oBAAoB;wBAClD,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACrB,CAAC;oBACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACjE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACrB,OAAO;gBACR,CAAC;gBAED,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC;oBACrC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;oBAC/C,wEAAwE;oBACxE,MAAM,QAAQ,GAAqB;wBAClC,IAAI,EAAE,WAAW;wBACjB,OAAO,EAAE,EAAE;wBACX,GAAG,EAAE,KAAK,CAAC,GAAG;wBACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,KAAK,EAAE,KAAK,CAAC,EAAE;wBACf,KAAK,EAAE;4BACN,KAAK,EAAE,CAAC;4BACR,MAAM,EAAE,CAAC;4BACT,SAAS,EAAE,CAAC;4BACZ,UAAU,EAAE,CAAC;4BACb,WAAW,EAAE,CAAC;4BACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;yBACpE;wBACD,UAAU,EAAE,OAAO;wBACnB,YAAY,EAAE,SAAS;wBACvB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;qBACrB,CAAC;oBACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACjE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBACrB,OAAO;gBACR,CAAC;gBAED,MAAM,OAAO,GAAG,qBAAqB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBACnD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBAErE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;oBACvE,MAAM,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,YAAY;wBAClB,YAAY,EAAE,CAAC;wBACf,KAAK,EAAE,IAAI,CAAC,IAAI;wBAChB,OAAO,EAAE,OAAO;qBAChB,CAAC,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC;wBACX,IAAI,EAAE,UAAU;wBAChB,YAAY,EAAE,CAAC;wBACf,OAAO,EAAE,IAAI,CAAC,IAAI;wBAClB,OAAO,EAAE,OAAO;qBAChB,CAAC,CAAC;gBACJ,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACrC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;wBAChD,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;4BAAE,SAAS;wBACpC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,YAAY,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;wBAC3E,MAAM,CAAC,IAAI,CAAC;4BACX,IAAI,EAAE,cAAc;4BACpB,YAAY,EAAE,CAAC;4BACf,QAAQ,EAAE,CAAC;4BACX,OAAO,EAAE,OAAO;yBAChB,CAAC,CAAC;oBACJ,CAAC;gBACF,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,OAAO,CAAC,UAAyD;oBACzE,OAAO;iBACP,CAAC,CAAC;gBACH,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACrB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,MAAM,QAAQ,GAAqB;oBAClC,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,EAAE;oBACX,GAAG,EAAE,KAAK,CAAC,GAAG;oBACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,KAAK,EAAE,KAAK,CAAC,EAAE;oBACf,KAAK,EAAE;wBACN,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,CAAC;wBACT,SAAS,EAAE,CAAC;wBACZ,UAAU,EAAE,CAAC;wBACb,WAAW,EAAE,CAAC;wBACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;qBACpE;oBACD,UAAU,EAAE,OAAO;oBACnB,YAAY,EAAG,GAAa,CAAC,OAAO;oBACpC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACrB,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACjE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACtB,CAAC;QACF,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IACf,CAAC;IAED,OAAO;QACN,GAAG,EAAE,QAAQ;QACb,MAAM,EAAE,CAAC,CAAC,KAA6B,EAAE,GAAY,EAAE,KAAqB,EAAE,EAAE,CAC/E,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAA2C;QAClE,YAAY,EAAE,CAAC,CAAC,KAA6B,EAAE,GAAY,EAAE,KAA2B,EAAE,EAAE,CAC3F,UAAU,CAAC,KAAK,EAAE,GAAG,CAAC,CAAiD;KACxE,CAAC;AACH,CAAC","sourcesContent":["/**\n * GSD-2 fake LLM provider — deterministic JSONL replay for e2e tests.\n *\n * Activated only when `GSD_FAKE_LLM_TRANSCRIPT` env var is set. Reads a\n * JSONL transcript file (one turn per line) and replays scripted responses\n * sequentially. Each turn carries structural assertions about the incoming\n * request — if the request shape drifts, the provider fails loudly so tests\n * surface it instead of silently consuming wrong inputs.\n *\n * IMPORTANT: env var must be set BEFORE pi-ai is imported. Tests achieve\n * this by setting it on the subprocess they spawn. In-process tests cannot\n * mix fake and real providers in the same Node process.\n *\n * Transcript format (JSONL, one turn per line):\n * {\n * \"turn\": 1,\n * \"expect\": {\n * \"modelId\": \"gsd-fake-model\",\n * \"messageCount\": 2, // optional, exact match\n * \"lastUserText\": \"do X\", // optional, substring match\n * \"systemContains\": [\"...\"], // optional, all must be present\n * \"toolNames\": [\"read_file\"], // optional, exact set\n * \"hasToolResultFor\": \"read_file\" // optional, last message is a toolResult for this name\n * },\n * \"emit\": { \"kind\": \"text\", \"text\": \"...\", \"stopReason\": \"stop\" }\n * | { \"kind\": \"tool_use\", \"calls\": [...], \"stopReason\": \"toolUse\" }\n * | { \"kind\": \"error_429\", \"message\": \"rate limited\", \"retryAfterMs\": 1000 }\n * | { \"kind\": \"malformed\" }\n * | { \"kind\": \"timeout\", \"delayMs\": 60000 }\n * }\n */\n\nimport { readFileSync } from \"node:fs\";\nimport type { ApiProvider } from \"../api-registry.js\";\nimport type {\n\tAssistantMessage,\n\tContext,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamOptions,\n\tToolCall,\n\tUserMessage,\n} from \"../types.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\n\nexport const FAKE_API = \"fake\" as const;\n\ninterface ExpectFields {\n\tmodelId?: string;\n\tmessageCount?: number;\n\tlastUserText?: string;\n\tsystemContains?: string[];\n\ttoolNames?: string[];\n\thasToolResultFor?: string;\n}\n\ntype EmitSpec =\n\t| { kind: \"text\"; text: string; stopReason?: \"stop\" | \"length\" }\n\t| {\n\t\t\tkind: \"tool_use\";\n\t\t\tcalls: { id?: string; name: string; input: Record<string, unknown> }[];\n\t\t\tstopReason?: \"toolUse\";\n\t }\n\t| { kind: \"error_429\"; message?: string; retryAfterMs?: number }\n\t| { kind: \"malformed\"; message?: string }\n\t| { kind: \"timeout\"; delayMs?: number };\n\ninterface TranscriptTurn {\n\tturn: number;\n\texpect?: ExpectFields;\n\temit: EmitSpec;\n}\n\nfunction parseTranscript(path: string): TranscriptTurn[] {\n\tconst raw = readFileSync(path, \"utf8\");\n\tconst lines = raw.split(\"\\n\").filter((l) => l.trim().length > 0);\n\tconst turns: TranscriptTurn[] = [];\n\tfor (const [i, line] of lines.entries()) {\n\t\ttry {\n\t\t\tturns.push(JSON.parse(line));\n\t\t} catch (err) {\n\t\t\tthrow new Error(\n\t\t\t\t`fake-llm: failed to parse transcript ${path} line ${i + 1}: ${(err as Error).message}\\n line: ${line}`,\n\t\t\t);\n\t\t}\n\t}\n\treturn turns;\n}\n\nfunction lastUserMessage(ctx: Context): UserMessage | undefined {\n\tfor (let i = ctx.messages.length - 1; i >= 0; i--) {\n\t\tconst m = ctx.messages[i];\n\t\tif (m.role === \"user\") return m;\n\t}\n\treturn undefined;\n}\n\nfunction userText(m: UserMessage): string {\n\tif (typeof m.content === \"string\") return m.content;\n\treturn m.content\n\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t.map((c) => c.text)\n\t\t.join(\"\\n\");\n}\n\nfunction checkExpectations(model: Model<typeof FAKE_API>, ctx: Context, turn: TranscriptTurn): void {\n\tconst e = turn.expect;\n\tif (!e) return;\n\tconst fail = (msg: string): never => {\n\t\t// Surface mismatch with enough context to debug, then throw.\n\t\tconst detail = {\n\t\t\tturn: turn.turn,\n\t\t\tmodelId: model.id,\n\t\t\tmessageCount: ctx.messages.length,\n\t\t\tlastUserText: lastUserMessage(ctx) ? userText(lastUserMessage(ctx)!).slice(0, 200) : null,\n\t\t\ttoolNames: ctx.tools?.map((t) => t.name) ?? [],\n\t\t};\n\t\tthrow new Error(`fake-llm: turn ${turn.turn} expectation mismatch: ${msg}\\n actual: ${JSON.stringify(detail)}`);\n\t};\n\n\tif (e.modelId !== undefined && model.id !== e.modelId) {\n\t\tfail(`expected modelId=${e.modelId}, got ${model.id}`);\n\t}\n\tif (e.messageCount !== undefined && ctx.messages.length !== e.messageCount) {\n\t\tfail(`expected messageCount=${e.messageCount}, got ${ctx.messages.length}`);\n\t}\n\tif (e.lastUserText !== undefined) {\n\t\tconst last = lastUserMessage(ctx);\n\t\tif (!last) fail(`expected lastUserText to contain \"${e.lastUserText}\", but no user messages found`);\n\t\tconst text = userText(last!);\n\t\tif (!text.includes(e.lastUserText)) {\n\t\t\tfail(`expected lastUserText to contain \"${e.lastUserText}\", got \"${text.slice(0, 200)}\"`);\n\t\t}\n\t}\n\tif (e.systemContains && e.systemContains.length > 0) {\n\t\tconst sys = ctx.systemPrompt ?? \"\";\n\t\tfor (const needle of e.systemContains) {\n\t\t\tif (!sys.includes(needle)) fail(`expected systemPrompt to contain \"${needle}\"`);\n\t\t}\n\t}\n\tif (e.toolNames) {\n\t\tconst actual = (ctx.tools ?? []).map((t) => t.name).sort();\n\t\tconst expected = [...e.toolNames].sort();\n\t\tif (actual.length !== expected.length || actual.some((n, i) => n !== expected[i])) {\n\t\t\tfail(`expected toolNames=${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);\n\t\t}\n\t}\n\tif (e.hasToolResultFor !== undefined) {\n\t\tconst last = ctx.messages[ctx.messages.length - 1];\n\t\tif (!last || last.role !== \"toolResult\" || last.toolName !== e.hasToolResultFor) {\n\t\t\tfail(`expected last message to be a toolResult for \"${e.hasToolResultFor}\"`);\n\t\t}\n\t}\n}\n\nfunction buildAssistantMessage(\n\tmodel: Model<typeof FAKE_API>,\n\temit: EmitSpec,\n): AssistantMessage {\n\tconst content: AssistantMessage[\"content\"] = [];\n\tlet stopReason: AssistantMessage[\"stopReason\"] = \"stop\";\n\n\tif (emit.kind === \"text\") {\n\t\tcontent.push({ type: \"text\", text: emit.text });\n\t\tstopReason = emit.stopReason ?? \"stop\";\n\t} else if (emit.kind === \"tool_use\") {\n\t\tfor (const [i, call] of emit.calls.entries()) {\n\t\t\tconst tc: ToolCall = {\n\t\t\t\ttype: \"toolCall\",\n\t\t\t\tid: call.id ?? `fake-tool-${Date.now()}-${i}`,\n\t\t\t\tname: call.name,\n\t\t\t\targuments: call.input,\n\t\t\t};\n\t\t\tcontent.push(tc);\n\t\t}\n\t\tstopReason = \"toolUse\";\n\t}\n\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent,\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t\tstopReason,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\n/**\n * Create a fake provider bound to a transcript file. Each call to stream()\n * advances the turn cursor by one. Caller is responsible for ensuring the\n * transcript has enough turns.\n */\nexport function createFakeProvider(opts: { transcriptPath: string }): ApiProvider<typeof FAKE_API> {\n\tconst transcript = parseTranscript(opts.transcriptPath);\n\tlet cursor = 0;\n\n\tfunction nextTurn(): TranscriptTurn {\n\t\tif (cursor >= transcript.length) {\n\t\t\tthrow new Error(\n\t\t\t\t`fake-llm: provider invoked ${cursor + 1} times but transcript only has ${transcript.length} turns. Add another turn to ${opts.transcriptPath}.`,\n\t\t\t);\n\t\t}\n\t\treturn transcript[cursor++];\n\t}\n\n\tfunction streamTurn(model: Model<typeof FAKE_API>, ctx: Context): AssistantMessageEventStream {\n\t\tconst stream = new AssistantMessageEventStream();\n\t\tconst turn = nextTurn();\n\n\t\t// Synchronously validate expectations BEFORE doing any async work — this\n\t\t// way drift mismatches are reported with the request that caused them.\n\t\tcheckExpectations(model, ctx, turn);\n\n\t\tconst emit = turn.emit;\n\n\t\tqueueMicrotask(async () => {\n\t\t\ttry {\n\t\t\t\tif (emit.kind === \"error_429\") {\n\t\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\tapi: model.api,\n\t\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: emit.message ?? \"rate_limit_exceeded\",\n\t\t\t\t\t\tretryAfterMs: emit.retryAfterMs,\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\t\tstream.end(errorMsg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (emit.kind === \"malformed\") {\n\t\t\t\t\t// Simulate a provider that emits a corrupted/incomplete response.\n\t\t\t\t\t// The agent loop converts this to stopReason: \"error\".\n\t\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\tapi: model.api,\n\t\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: emit.message ?? \"malformed_response\",\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\t\tstream.end(errorMsg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (emit.kind === \"timeout\") {\n\t\t\t\t\tconst delay = emit.delayMs ?? 60_000;\n\t\t\t\t\tawait new Promise((r) => setTimeout(r, delay));\n\t\t\t\t\t// If the caller hasn't already aborted, emit a synthetic timeout error.\n\t\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\tapi: model.api,\n\t\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: \"timeout\",\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\t\tstream.end(errorMsg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst message = buildAssistantMessage(model, emit);\n\t\t\t\tstream.push({ type: \"start\", partial: { ...message, content: [] } });\n\n\t\t\t\tif (emit.kind === \"text\") {\n\t\t\t\t\tstream.push({ type: \"text_start\", contentIndex: 0, partial: message });\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"text_delta\",\n\t\t\t\t\t\tcontentIndex: 0,\n\t\t\t\t\t\tdelta: emit.text,\n\t\t\t\t\t\tpartial: message,\n\t\t\t\t\t});\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"text_end\",\n\t\t\t\t\t\tcontentIndex: 0,\n\t\t\t\t\t\tcontent: emit.text,\n\t\t\t\t\t\tpartial: message,\n\t\t\t\t\t});\n\t\t\t\t} else if (emit.kind === \"tool_use\") {\n\t\t\t\t\tfor (const [i, c] of message.content.entries()) {\n\t\t\t\t\t\tif (c.type !== \"toolCall\") continue;\n\t\t\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: i, partial: message });\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\t\tcontentIndex: i,\n\t\t\t\t\t\t\ttoolCall: c,\n\t\t\t\t\t\t\tpartial: message,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"done\",\n\t\t\t\t\treason: message.stopReason as \"stop\" | \"length\" | \"toolUse\" | \"pauseTurn\",\n\t\t\t\t\tmessage,\n\t\t\t\t});\n\t\t\t\tstream.end(message);\n\t\t\t} catch (err) {\n\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\tcontent: [],\n\t\t\t\t\tapi: model.api,\n\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\tmodel: model.id,\n\t\t\t\t\tusage: {\n\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t},\n\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\terrorMessage: (err as Error).message,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\tstream.end(errorMsg);\n\t\t\t}\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\treturn {\n\t\tapi: FAKE_API,\n\t\tstream: ((model: Model<typeof FAKE_API>, ctx: Context, _opts?: StreamOptions) =>\n\t\t\tstreamTurn(model, ctx)) as ApiProvider<typeof FAKE_API>[\"stream\"],\n\t\tstreamSimple: ((model: Model<typeof FAKE_API>, ctx: Context, _opts?: SimpleStreamOptions) =>\n\t\t\tstreamTurn(model, ctx)) as ApiProvider<typeof FAKE_API>[\"streamSimple\"],\n\t};\n}\n"]}
1
+ {"version":3,"file":"fake.js","sourceRoot":"","sources":["../../src/providers/fake.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * gsd-pi fake LLM provider — deterministic JSONL replay for e2e tests.\n *\n * Activated only when `GSD_FAKE_LLM_TRANSCRIPT` env var is set. Reads a\n * JSONL transcript file (one turn per line) and replays scripted responses\n * sequentially. Each turn carries structural assertions about the incoming\n * request — if the request shape drifts, the provider fails loudly so tests\n * surface it instead of silently consuming wrong inputs.\n *\n * IMPORTANT: env var must be set BEFORE pi-ai is imported. Tests achieve\n * this by setting it on the subprocess they spawn. In-process tests cannot\n * mix fake and real providers in the same Node process.\n *\n * Transcript format (JSONL, one turn per line):\n * {\n * \"turn\": 1,\n * \"expect\": {\n * \"modelId\": \"gsd-fake-model\",\n * \"messageCount\": 2, // optional, exact match\n * \"lastUserText\": \"do X\", // optional, substring match\n * \"systemContains\": [\"...\"], // optional, all must be present\n * \"toolNames\": [\"read_file\"], // optional, exact set\n * \"hasToolResultFor\": \"read_file\" // optional, last message is a toolResult for this name\n * },\n * \"emit\": { \"kind\": \"text\", \"text\": \"...\", \"stopReason\": \"stop\" }\n * | { \"kind\": \"tool_use\", \"calls\": [...], \"stopReason\": \"toolUse\" }\n * | { \"kind\": \"error_429\", \"message\": \"rate limited\", \"retryAfterMs\": 1000 }\n * | { \"kind\": \"malformed\" }\n * | { \"kind\": \"timeout\", \"delayMs\": 60000 }\n * }\n */\n\nimport { readFileSync } from \"node:fs\";\nimport type { ApiProvider } from \"../api-registry.js\";\nimport type {\n\tAssistantMessage,\n\tContext,\n\tModel,\n\tSimpleStreamOptions,\n\tStreamOptions,\n\tToolCall,\n\tUserMessage,\n} from \"../types.js\";\nimport { AssistantMessageEventStream } from \"../utils/event-stream.js\";\n\nexport const FAKE_API = \"fake\" as const;\n\ninterface ExpectFields {\n\tmodelId?: string;\n\tmessageCount?: number;\n\tlastUserText?: string;\n\tsystemContains?: string[];\n\ttoolNames?: string[];\n\thasToolResultFor?: string;\n}\n\ntype EmitSpec =\n\t| { kind: \"text\"; text: string; stopReason?: \"stop\" | \"length\" }\n\t| {\n\t\t\tkind: \"tool_use\";\n\t\t\tcalls: { id?: string; name: string; input: Record<string, unknown> }[];\n\t\t\tstopReason?: \"toolUse\";\n\t }\n\t| { kind: \"error_429\"; message?: string; retryAfterMs?: number }\n\t| { kind: \"malformed\"; message?: string }\n\t| { kind: \"timeout\"; delayMs?: number };\n\ninterface TranscriptTurn {\n\tturn: number;\n\texpect?: ExpectFields;\n\temit: EmitSpec;\n}\n\nfunction parseTranscript(path: string): TranscriptTurn[] {\n\tconst raw = readFileSync(path, \"utf8\");\n\tconst lines = raw.split(\"\\n\").filter((l) => l.trim().length > 0);\n\tconst turns: TranscriptTurn[] = [];\n\tfor (const [i, line] of lines.entries()) {\n\t\ttry {\n\t\t\tturns.push(JSON.parse(line));\n\t\t} catch (err) {\n\t\t\tthrow new Error(\n\t\t\t\t`fake-llm: failed to parse transcript ${path} line ${i + 1}: ${(err as Error).message}\\n line: ${line}`,\n\t\t\t);\n\t\t}\n\t}\n\treturn turns;\n}\n\nfunction lastUserMessage(ctx: Context): UserMessage | undefined {\n\tfor (let i = ctx.messages.length - 1; i >= 0; i--) {\n\t\tconst m = ctx.messages[i];\n\t\tif (m.role === \"user\") return m;\n\t}\n\treturn undefined;\n}\n\nfunction userText(m: UserMessage): string {\n\tif (typeof m.content === \"string\") return m.content;\n\treturn m.content\n\t\t.filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n\t\t.map((c) => c.text)\n\t\t.join(\"\\n\");\n}\n\nfunction checkExpectations(model: Model<typeof FAKE_API>, ctx: Context, turn: TranscriptTurn): void {\n\tconst e = turn.expect;\n\tif (!e) return;\n\tconst fail = (msg: string): never => {\n\t\t// Surface mismatch with enough context to debug, then throw.\n\t\tconst detail = {\n\t\t\tturn: turn.turn,\n\t\t\tmodelId: model.id,\n\t\t\tmessageCount: ctx.messages.length,\n\t\t\tlastUserText: lastUserMessage(ctx) ? userText(lastUserMessage(ctx)!).slice(0, 200) : null,\n\t\t\ttoolNames: ctx.tools?.map((t) => t.name) ?? [],\n\t\t};\n\t\tthrow new Error(`fake-llm: turn ${turn.turn} expectation mismatch: ${msg}\\n actual: ${JSON.stringify(detail)}`);\n\t};\n\n\tif (e.modelId !== undefined && model.id !== e.modelId) {\n\t\tfail(`expected modelId=${e.modelId}, got ${model.id}`);\n\t}\n\tif (e.messageCount !== undefined && ctx.messages.length !== e.messageCount) {\n\t\tfail(`expected messageCount=${e.messageCount}, got ${ctx.messages.length}`);\n\t}\n\tif (e.lastUserText !== undefined) {\n\t\tconst last = lastUserMessage(ctx);\n\t\tif (!last) fail(`expected lastUserText to contain \"${e.lastUserText}\", but no user messages found`);\n\t\tconst text = userText(last!);\n\t\tif (!text.includes(e.lastUserText)) {\n\t\t\tfail(`expected lastUserText to contain \"${e.lastUserText}\", got \"${text.slice(0, 200)}\"`);\n\t\t}\n\t}\n\tif (e.systemContains && e.systemContains.length > 0) {\n\t\tconst sys = ctx.systemPrompt ?? \"\";\n\t\tfor (const needle of e.systemContains) {\n\t\t\tif (!sys.includes(needle)) fail(`expected systemPrompt to contain \"${needle}\"`);\n\t\t}\n\t}\n\tif (e.toolNames) {\n\t\tconst actual = (ctx.tools ?? []).map((t) => t.name).sort();\n\t\tconst expected = [...e.toolNames].sort();\n\t\tif (actual.length !== expected.length || actual.some((n, i) => n !== expected[i])) {\n\t\t\tfail(`expected toolNames=${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);\n\t\t}\n\t}\n\tif (e.hasToolResultFor !== undefined) {\n\t\tconst last = ctx.messages[ctx.messages.length - 1];\n\t\tif (!last || last.role !== \"toolResult\" || last.toolName !== e.hasToolResultFor) {\n\t\t\tfail(`expected last message to be a toolResult for \"${e.hasToolResultFor}\"`);\n\t\t}\n\t}\n}\n\nfunction buildAssistantMessage(\n\tmodel: Model<typeof FAKE_API>,\n\temit: EmitSpec,\n): AssistantMessage {\n\tconst content: AssistantMessage[\"content\"] = [];\n\tlet stopReason: AssistantMessage[\"stopReason\"] = \"stop\";\n\n\tif (emit.kind === \"text\") {\n\t\tcontent.push({ type: \"text\", text: emit.text });\n\t\tstopReason = emit.stopReason ?? \"stop\";\n\t} else if (emit.kind === \"tool_use\") {\n\t\tfor (const [i, call] of emit.calls.entries()) {\n\t\t\tconst tc: ToolCall = {\n\t\t\t\ttype: \"toolCall\",\n\t\t\t\tid: call.id ?? `fake-tool-${Date.now()}-${i}`,\n\t\t\t\tname: call.name,\n\t\t\t\targuments: call.input,\n\t\t\t};\n\t\t\tcontent.push(tc);\n\t\t}\n\t\tstopReason = \"toolUse\";\n\t}\n\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent,\n\t\tapi: model.api,\n\t\tprovider: model.provider,\n\t\tmodel: model.id,\n\t\tusage: {\n\t\t\tinput: 0,\n\t\t\toutput: 0,\n\t\t\tcacheRead: 0,\n\t\t\tcacheWrite: 0,\n\t\t\ttotalTokens: 0,\n\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t},\n\t\tstopReason,\n\t\ttimestamp: Date.now(),\n\t};\n}\n\n/**\n * Create a fake provider bound to a transcript file. Each call to stream()\n * advances the turn cursor by one. Caller is responsible for ensuring the\n * transcript has enough turns.\n */\nexport function createFakeProvider(opts: { transcriptPath: string }): ApiProvider<typeof FAKE_API> {\n\tconst transcript = parseTranscript(opts.transcriptPath);\n\tlet cursor = 0;\n\n\tfunction nextTurn(): TranscriptTurn {\n\t\tif (cursor >= transcript.length) {\n\t\t\tthrow new Error(\n\t\t\t\t`fake-llm: provider invoked ${cursor + 1} times but transcript only has ${transcript.length} turns. Add another turn to ${opts.transcriptPath}.`,\n\t\t\t);\n\t\t}\n\t\treturn transcript[cursor++];\n\t}\n\n\tfunction streamTurn(model: Model<typeof FAKE_API>, ctx: Context): AssistantMessageEventStream {\n\t\tconst stream = new AssistantMessageEventStream();\n\t\tconst turn = nextTurn();\n\n\t\t// Synchronously validate expectations BEFORE doing any async work — this\n\t\t// way drift mismatches are reported with the request that caused them.\n\t\tcheckExpectations(model, ctx, turn);\n\n\t\tconst emit = turn.emit;\n\n\t\tqueueMicrotask(async () => {\n\t\t\ttry {\n\t\t\t\tif (emit.kind === \"error_429\") {\n\t\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\tapi: model.api,\n\t\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: emit.message ?? \"rate_limit_exceeded\",\n\t\t\t\t\t\tretryAfterMs: emit.retryAfterMs,\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\t\tstream.end(errorMsg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (emit.kind === \"malformed\") {\n\t\t\t\t\t// Simulate a provider that emits a corrupted/incomplete response.\n\t\t\t\t\t// The agent loop converts this to stopReason: \"error\".\n\t\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\tapi: model.api,\n\t\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: emit.message ?? \"malformed_response\",\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\t\tstream.end(errorMsg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (emit.kind === \"timeout\") {\n\t\t\t\t\tconst delay = emit.delayMs ?? 60_000;\n\t\t\t\t\tawait new Promise((r) => setTimeout(r, delay));\n\t\t\t\t\t// If the caller hasn't already aborted, emit a synthetic timeout error.\n\t\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\t\tcontent: [],\n\t\t\t\t\t\tapi: model.api,\n\t\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\t\tmodel: model.id,\n\t\t\t\t\t\tusage: {\n\t\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\t\terrorMessage: \"timeout\",\n\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t};\n\t\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\t\tstream.end(errorMsg);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst message = buildAssistantMessage(model, emit);\n\t\t\t\tstream.push({ type: \"start\", partial: { ...message, content: [] } });\n\n\t\t\t\tif (emit.kind === \"text\") {\n\t\t\t\t\tstream.push({ type: \"text_start\", contentIndex: 0, partial: message });\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"text_delta\",\n\t\t\t\t\t\tcontentIndex: 0,\n\t\t\t\t\t\tdelta: emit.text,\n\t\t\t\t\t\tpartial: message,\n\t\t\t\t\t});\n\t\t\t\t\tstream.push({\n\t\t\t\t\t\ttype: \"text_end\",\n\t\t\t\t\t\tcontentIndex: 0,\n\t\t\t\t\t\tcontent: emit.text,\n\t\t\t\t\t\tpartial: message,\n\t\t\t\t\t});\n\t\t\t\t} else if (emit.kind === \"tool_use\") {\n\t\t\t\t\tfor (const [i, c] of message.content.entries()) {\n\t\t\t\t\t\tif (c.type !== \"toolCall\") continue;\n\t\t\t\t\t\tstream.push({ type: \"toolcall_start\", contentIndex: i, partial: message });\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"toolcall_end\",\n\t\t\t\t\t\t\tcontentIndex: i,\n\t\t\t\t\t\t\ttoolCall: c,\n\t\t\t\t\t\t\tpartial: message,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tstream.push({\n\t\t\t\t\ttype: \"done\",\n\t\t\t\t\treason: message.stopReason as \"stop\" | \"length\" | \"toolUse\" | \"pauseTurn\",\n\t\t\t\t\tmessage,\n\t\t\t\t});\n\t\t\t\tstream.end(message);\n\t\t\t} catch (err) {\n\t\t\t\tconst errorMsg: AssistantMessage = {\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\tcontent: [],\n\t\t\t\t\tapi: model.api,\n\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\tmodel: model.id,\n\t\t\t\t\tusage: {\n\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t},\n\t\t\t\t\tstopReason: \"error\",\n\t\t\t\t\terrorMessage: (err as Error).message,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t};\n\t\t\t\tstream.push({ type: \"error\", reason: \"error\", error: errorMsg });\n\t\t\t\tstream.end(errorMsg);\n\t\t\t}\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\treturn {\n\t\tapi: FAKE_API,\n\t\tstream: ((model: Model<typeof FAKE_API>, ctx: Context, _opts?: StreamOptions) =>\n\t\t\tstreamTurn(model, ctx)) as ApiProvider<typeof FAKE_API>[\"stream\"],\n\t\tstreamSimple: ((model: Model<typeof FAKE_API>, ctx: Context, _opts?: SimpleStreamOptions) =>\n\t\t\tstreamTurn(model, ctx)) as ApiProvider<typeof FAKE_API>[\"streamSimple\"],\n\t};\n}\n"]}
@@ -1,4 +1,4 @@
1
- // Project/App: GSD-2
1
+ // Project/App: gsd-pi
2
2
  // File Purpose: Tests Google Gemini CLI compatible provider behavior.
3
3
  import test from "node:test";
4
4
  import assert from "node:assert/strict";
@@ -1 +1 @@
1
- {"version":3,"file":"google-gemini-cli.test.js","sourceRoot":"","sources":["../../src/providers/google-gemini-cli.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: GSD-2\n// File Purpose: Tests Google Gemini CLI compatible provider behavior.\n\nimport test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport type { Context, Model } from \"../types.js\";\nimport { streamGoogleGeminiCli } from \"./google-gemini-cli.js\";\n\nfunction antigravityModel(id = \"gemini-3-pro-preview\"): Model<\"google-gemini-cli\"> {\n\treturn {\n\t\tid,\n\t\tname: id,\n\t\tapi: \"google-gemini-cli\",\n\t\tprovider: \"google-antigravity\",\n\t\tbaseUrl: \"https://antigravity.example.test\",\n\t\treasoning: true,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 200000,\n\t\tmaxTokens: 32000,\n\t};\n}\n\ntest(\"Antigravity requests use the supported default User-Agent version\", async (t) => {\n\tconst originalFetch = globalThis.fetch;\n\tconst originalVersion = process.env.PI_AI_ANTIGRAVITY_VERSION;\n\tlet headers: Headers | undefined;\n\n\tt.after(() => {\n\t\tglobalThis.fetch = originalFetch;\n\t\tif (originalVersion === undefined) {\n\t\t\tdelete process.env.PI_AI_ANTIGRAVITY_VERSION;\n\t\t} else {\n\t\t\tprocess.env.PI_AI_ANTIGRAVITY_VERSION = originalVersion;\n\t\t}\n\t});\n\n\tdelete process.env.PI_AI_ANTIGRAVITY_VERSION;\n\tglobalThis.fetch = async (_input: string | URL | Request, init?: RequestInit) => {\n\t\theaders = new Headers(init?.headers);\n\t\treturn new Response(\n\t\t\t`data: ${JSON.stringify({\n\t\t\t\tresponse: {\n\t\t\t\t\tcandidates: [{ content: { parts: [{ text: \"ok\" }] }, finishReason: \"STOP\" }],\n\t\t\t\t},\n\t\t\t})}\\n\\n`,\n\t\t\t{ headers: { \"Content-Type\": \"text/event-stream\" } },\n\t\t);\n\t};\n\n\tconst context: Context = {\n\t\tmessages: [{ role: \"user\", content: \"hello\", timestamp: Date.now() }],\n\t};\n\tconst stream = streamGoogleGeminiCli(antigravityModel(), context, {\n\t\tapiKey: JSON.stringify({ token: \"access-token\", projectId: \"test-project\" }),\n\t});\n\tconst result = await stream.result();\n\n\tassert.equal(result.stopReason, \"stop\");\n\tassert.equal(headers?.get(\"User-Agent\"), \"antigravity/1.23.0 darwin/arm64\");\n});\n\ntest(\"antigravity 404 names Antigravity instead of Cloud Code Assist (#4606)\", async (t) => {\n\tconst originalFetch = globalThis.fetch;\n\tconst originalSetTimeout = globalThis.setTimeout;\n\n\tt.after(() => {\n\t\tglobalThis.fetch = originalFetch;\n\t\tglobalThis.setTimeout = originalSetTimeout;\n\t});\n\n\tglobalThis.fetch = async () =>\n\t\tnew Response(JSON.stringify({ error: { message: \"model not found\" } }), { status: 404 });\n\tglobalThis.setTimeout = ((callback: (...args: unknown[]) => void, _ms?: number, ...args: unknown[]) => {\n\t\tqueueMicrotask(() => callback(...args));\n\t\treturn 0;\n\t}) as unknown as typeof setTimeout;\n\n\tconst context: Context = {\n\t\tmessages: [{ role: \"user\", content: \"hello\", timestamp: Date.now() }],\n\t};\n\tconst stream = streamGoogleGeminiCli(antigravityModel(\"removed-antigravity-model\"), context, {\n\t\tapiKey: JSON.stringify({ token: \"token\", projectId: \"project\" }),\n\t});\n\tconst result = await stream.result();\n\n\tassert.equal(result.stopReason, \"error\");\n\tassert.match(result.errorMessage ?? \"\", /Antigravity API error \\(404\\)/);\n\tassert.doesNotMatch(result.errorMessage ?? \"\", /Cloud Code Assist API error/);\n});\n"]}
1
+ {"version":3,"file":"google-gemini-cli.test.js","sourceRoot":"","sources":["../../src/providers/google-gemini-cli.test.ts"],"names":[],"mappings":"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","sourcesContent":["// Project/App: gsd-pi\n// File Purpose: Tests Google Gemini CLI compatible provider behavior.\n\nimport test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport type { Context, Model } from \"../types.js\";\nimport { streamGoogleGeminiCli } from \"./google-gemini-cli.js\";\n\nfunction antigravityModel(id = \"gemini-3-pro-preview\"): Model<\"google-gemini-cli\"> {\n\treturn {\n\t\tid,\n\t\tname: id,\n\t\tapi: \"google-gemini-cli\",\n\t\tprovider: \"google-antigravity\",\n\t\tbaseUrl: \"https://antigravity.example.test\",\n\t\treasoning: true,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 200000,\n\t\tmaxTokens: 32000,\n\t};\n}\n\ntest(\"Antigravity requests use the supported default User-Agent version\", async (t) => {\n\tconst originalFetch = globalThis.fetch;\n\tconst originalVersion = process.env.PI_AI_ANTIGRAVITY_VERSION;\n\tlet headers: Headers | undefined;\n\n\tt.after(() => {\n\t\tglobalThis.fetch = originalFetch;\n\t\tif (originalVersion === undefined) {\n\t\t\tdelete process.env.PI_AI_ANTIGRAVITY_VERSION;\n\t\t} else {\n\t\t\tprocess.env.PI_AI_ANTIGRAVITY_VERSION = originalVersion;\n\t\t}\n\t});\n\n\tdelete process.env.PI_AI_ANTIGRAVITY_VERSION;\n\tglobalThis.fetch = async (_input: string | URL | Request, init?: RequestInit) => {\n\t\theaders = new Headers(init?.headers);\n\t\treturn new Response(\n\t\t\t`data: ${JSON.stringify({\n\t\t\t\tresponse: {\n\t\t\t\t\tcandidates: [{ content: { parts: [{ text: \"ok\" }] }, finishReason: \"STOP\" }],\n\t\t\t\t},\n\t\t\t})}\\n\\n`,\n\t\t\t{ headers: { \"Content-Type\": \"text/event-stream\" } },\n\t\t);\n\t};\n\n\tconst context: Context = {\n\t\tmessages: [{ role: \"user\", content: \"hello\", timestamp: Date.now() }],\n\t};\n\tconst stream = streamGoogleGeminiCli(antigravityModel(), context, {\n\t\tapiKey: JSON.stringify({ token: \"access-token\", projectId: \"test-project\" }),\n\t});\n\tconst result = await stream.result();\n\n\tassert.equal(result.stopReason, \"stop\");\n\tassert.equal(headers?.get(\"User-Agent\"), \"antigravity/1.23.0 darwin/arm64\");\n});\n\ntest(\"antigravity 404 names Antigravity instead of Cloud Code Assist (#4606)\", async (t) => {\n\tconst originalFetch = globalThis.fetch;\n\tconst originalSetTimeout = globalThis.setTimeout;\n\n\tt.after(() => {\n\t\tglobalThis.fetch = originalFetch;\n\t\tglobalThis.setTimeout = originalSetTimeout;\n\t});\n\n\tglobalThis.fetch = async () =>\n\t\tnew Response(JSON.stringify({ error: { message: \"model not found\" } }), { status: 404 });\n\tglobalThis.setTimeout = ((callback: (...args: unknown[]) => void, _ms?: number, ...args: unknown[]) => {\n\t\tqueueMicrotask(() => callback(...args));\n\t\treturn 0;\n\t}) as unknown as typeof setTimeout;\n\n\tconst context: Context = {\n\t\tmessages: [{ role: \"user\", content: \"hello\", timestamp: Date.now() }],\n\t};\n\tconst stream = streamGoogleGeminiCli(antigravityModel(\"removed-antigravity-model\"), context, {\n\t\tapiKey: JSON.stringify({ token: \"token\", projectId: \"project\" }),\n\t});\n\tconst result = await stream.result();\n\n\tassert.equal(result.stopReason, \"error\");\n\tassert.match(result.errorMessage ?? \"\", /Antigravity API error \\(404\\)/);\n\tassert.doesNotMatch(result.errorMessage ?? \"\", /Cloud Code Assist API error/);\n});\n"]}
@@ -1,4 +1,4 @@
1
- // GSD-2 — Provider Capabilities Registry (ADR-005 Phase 1)
1
+ // gsd-pi — Provider Capabilities Registry (ADR-005 Phase 1)
2
2
  // Declarative registry of what each API provider supports, consolidating
3
3
  // scattered knowledge from *-shared.ts files into a queryable data structure.
4
4
  // ─── Registry ───────────────────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"provider-capabilities.js","sourceRoot":"","sources":["../../src/providers/provider-capabilities.ts"],"names":[],"mappings":"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","sourcesContent":["// GSD-2 — Provider Capabilities Registry (ADR-005 Phase 1)\n// Declarative registry of what each API provider supports, consolidating\n// scattered knowledge from *-shared.ts files into a queryable data structure.\n\nimport type { Api } from \"../types.js\";\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\n/**\n * Declarative capability profile for an API provider.\n * Used by the model router to filter incompatible models and by the tool\n * system to adjust tool sets per provider.\n */\nexport interface ProviderCapabilities {\n /** Whether models from this provider support tool/function calling */\n toolCalling: boolean;\n /** Maximum number of tools the provider handles well (0 = unlimited) */\n maxTools: number;\n /** Whether tool results can contain images */\n imageToolResults: boolean;\n /** Whether the provider supports structured JSON output */\n structuredOutput: boolean;\n /** Tool call ID format constraints */\n toolCallIdFormat: {\n maxLength: number;\n allowedChars: RegExp;\n };\n /** Whether thinking/reasoning blocks are preserved cross-turn */\n thinkingPersistence: \"full\" | \"text-only\" | \"none\";\n /** Schema features NOT supported (tools using these get filtered) */\n unsupportedSchemaFeatures: string[];\n}\n\n// ─── Registry ───────────────────────────────────────────────────────────────\n\n/**\n * Built-in provider capability profiles.\n *\n * Sources (consolidated from scattered *-shared.ts files):\n * - anthropic-shared.ts: normalizeToolCallId (64-char, [a-zA-Z0-9_-])\n * - openai-responses-shared.ts: ID normalization (64-char, fc_ prefix), image-in-tool-result workaround\n * - google-shared.ts: sanitizeSchemaForGoogle (patternProperties, const), requiresToolCallId\n * - mistral.ts: MISTRAL_TOOL_CALL_ID_LENGTH = 9\n * - amazon-bedrock.ts: normalizeToolCallId (64-char, [a-zA-Z0-9_-])\n */\nexport const PROVIDER_CAPABILITIES: Record<string, ProviderCapabilities> = {\n \"anthropic-messages\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"full\",\n unsupportedSchemaFeatures: [],\n },\n \"anthropic-vertex\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"full\",\n unsupportedSchemaFeatures: [],\n },\n \"openai-responses\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false, // images sent as separate user message, not in tool result\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"azure-openai-responses\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"openai-codex-responses\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"openai-completions\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"google-generative-ai\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [\"patternProperties\", \"const\"],\n },\n \"google-gemini-cli\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [\"patternProperties\", \"const\"],\n },\n \"google-vertex\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [\"patternProperties\", \"const\"],\n },\n \"mistral-conversations\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 9, allowedChars: /^[a-zA-Z0-9]+$/ },\n thinkingPersistence: \"none\",\n unsupportedSchemaFeatures: [],\n },\n \"bedrock-converse-stream\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true, // Bedrock supports image content blocks in tool results\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"ollama-chat\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: false,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"none\",\n unsupportedSchemaFeatures: [],\n },\n};\n\n// ─── Default (permissive) profile for unknown providers ─────────────────────\n\nconst DEFAULT_CAPABILITIES: ProviderCapabilities = {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n};\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\n/**\n * Get capabilities for a provider API. Returns a permissive default for\n * unknown providers (preserving existing behavior per ADR-005 principle 5).\n */\nexport function getProviderCapabilities(api: string): ProviderCapabilities {\n return PROVIDER_CAPABILITIES[api] ?? DEFAULT_CAPABILITIES;\n}\n\n/**\n * Check if a provider supports all required schema features.\n * Returns the list of unsupported features (empty if all supported).\n */\nexport function getUnsupportedFeatures(api: string, requiredFeatures: string[]): string[] {\n const caps = getProviderCapabilities(api);\n return requiredFeatures.filter(f => caps.unsupportedSchemaFeatures.includes(f));\n}\n\n/**\n * Deep-merge user-provided capability overrides with built-in defaults.\n * Partial overrides merge with the built-in profile for the given API.\n */\nexport function mergeCapabilityOverrides(\n api: string,\n overrides: Partial<Omit<ProviderCapabilities, \"toolCallIdFormat\">> & {\n toolCallIdFormat?: Partial<ProviderCapabilities[\"toolCallIdFormat\"]>;\n },\n): ProviderCapabilities {\n const base = getProviderCapabilities(api);\n return {\n ...base,\n ...overrides,\n toolCallIdFormat: overrides.toolCallIdFormat\n ? { ...base.toolCallIdFormat, ...overrides.toolCallIdFormat }\n : base.toolCallIdFormat,\n };\n}\n\n/**\n * Get all registered API names in the capability registry.\n * Used by lint rules to verify all providers in register-builtins.ts\n * have corresponding capability entries.\n */\nexport function getRegisteredApis(): string[] {\n return Object.keys(PROVIDER_CAPABILITIES);\n}\n"]}
1
+ {"version":3,"file":"provider-capabilities.js","sourceRoot":"","sources":["../../src/providers/provider-capabilities.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi — Provider Capabilities Registry (ADR-005 Phase 1)\n// Declarative registry of what each API provider supports, consolidating\n// scattered knowledge from *-shared.ts files into a queryable data structure.\n\nimport type { Api } from \"../types.js\";\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\n/**\n * Declarative capability profile for an API provider.\n * Used by the model router to filter incompatible models and by the tool\n * system to adjust tool sets per provider.\n */\nexport interface ProviderCapabilities {\n /** Whether models from this provider support tool/function calling */\n toolCalling: boolean;\n /** Maximum number of tools the provider handles well (0 = unlimited) */\n maxTools: number;\n /** Whether tool results can contain images */\n imageToolResults: boolean;\n /** Whether the provider supports structured JSON output */\n structuredOutput: boolean;\n /** Tool call ID format constraints */\n toolCallIdFormat: {\n maxLength: number;\n allowedChars: RegExp;\n };\n /** Whether thinking/reasoning blocks are preserved cross-turn */\n thinkingPersistence: \"full\" | \"text-only\" | \"none\";\n /** Schema features NOT supported (tools using these get filtered) */\n unsupportedSchemaFeatures: string[];\n}\n\n// ─── Registry ───────────────────────────────────────────────────────────────\n\n/**\n * Built-in provider capability profiles.\n *\n * Sources (consolidated from scattered *-shared.ts files):\n * - anthropic-shared.ts: normalizeToolCallId (64-char, [a-zA-Z0-9_-])\n * - openai-responses-shared.ts: ID normalization (64-char, fc_ prefix), image-in-tool-result workaround\n * - google-shared.ts: sanitizeSchemaForGoogle (patternProperties, const), requiresToolCallId\n * - mistral.ts: MISTRAL_TOOL_CALL_ID_LENGTH = 9\n * - amazon-bedrock.ts: normalizeToolCallId (64-char, [a-zA-Z0-9_-])\n */\nexport const PROVIDER_CAPABILITIES: Record<string, ProviderCapabilities> = {\n \"anthropic-messages\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"full\",\n unsupportedSchemaFeatures: [],\n },\n \"anthropic-vertex\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"full\",\n unsupportedSchemaFeatures: [],\n },\n \"openai-responses\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false, // images sent as separate user message, not in tool result\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"azure-openai-responses\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"openai-codex-responses\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"openai-completions\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"google-generative-ai\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [\"patternProperties\", \"const\"],\n },\n \"google-gemini-cli\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [\"patternProperties\", \"const\"],\n },\n \"google-vertex\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [\"patternProperties\", \"const\"],\n },\n \"mistral-conversations\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 9, allowedChars: /^[a-zA-Z0-9]+$/ },\n thinkingPersistence: \"none\",\n unsupportedSchemaFeatures: [],\n },\n \"bedrock-converse-stream\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true, // Bedrock supports image content blocks in tool results\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n },\n \"ollama-chat\": {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: false,\n structuredOutput: false,\n toolCallIdFormat: { maxLength: 64, allowedChars: /^[a-zA-Z0-9_-]+$/ },\n thinkingPersistence: \"none\",\n unsupportedSchemaFeatures: [],\n },\n};\n\n// ─── Default (permissive) profile for unknown providers ─────────────────────\n\nconst DEFAULT_CAPABILITIES: ProviderCapabilities = {\n toolCalling: true,\n maxTools: 0,\n imageToolResults: true,\n structuredOutput: true,\n toolCallIdFormat: { maxLength: 512, allowedChars: /^.+$/ },\n thinkingPersistence: \"text-only\",\n unsupportedSchemaFeatures: [],\n};\n\n// ─── Public API ─────────────────────────────────────────────────────────────\n\n/**\n * Get capabilities for a provider API. Returns a permissive default for\n * unknown providers (preserving existing behavior per ADR-005 principle 5).\n */\nexport function getProviderCapabilities(api: string): ProviderCapabilities {\n return PROVIDER_CAPABILITIES[api] ?? DEFAULT_CAPABILITIES;\n}\n\n/**\n * Check if a provider supports all required schema features.\n * Returns the list of unsupported features (empty if all supported).\n */\nexport function getUnsupportedFeatures(api: string, requiredFeatures: string[]): string[] {\n const caps = getProviderCapabilities(api);\n return requiredFeatures.filter(f => caps.unsupportedSchemaFeatures.includes(f));\n}\n\n/**\n * Deep-merge user-provided capability overrides with built-in defaults.\n * Partial overrides merge with the built-in profile for the given API.\n */\nexport function mergeCapabilityOverrides(\n api: string,\n overrides: Partial<Omit<ProviderCapabilities, \"toolCallIdFormat\">> & {\n toolCallIdFormat?: Partial<ProviderCapabilities[\"toolCallIdFormat\"]>;\n },\n): ProviderCapabilities {\n const base = getProviderCapabilities(api);\n return {\n ...base,\n ...overrides,\n toolCallIdFormat: overrides.toolCallIdFormat\n ? { ...base.toolCallIdFormat, ...overrides.toolCallIdFormat }\n : base.toolCallIdFormat,\n };\n}\n\n/**\n * Get all registered API names in the capability registry.\n * Used by lint rules to verify all providers in register-builtins.ts\n * have corresponding capability entries.\n */\nexport function getRegisteredApis(): string[] {\n return Object.keys(PROVIDER_CAPABILITIES);\n}\n"]}
@@ -1,4 +1,4 @@
1
- // GSD-2 — Provider Capabilities Registry Tests (ADR-005 Phase 1)
1
+ // gsd-pi — Provider Capabilities Registry Tests (ADR-005 Phase 1)
2
2
  import { describe, test } from "node:test";
3
3
  import assert from "node:assert/strict";
4
4
  import { PROVIDER_CAPABILITIES, getProviderCapabilities, getUnsupportedFeatures, mergeCapabilityOverrides, getRegisteredApis, } from "./provider-capabilities.js";
@@ -1 +1 @@
1
- {"version":3,"file":"provider-capabilities.test.js","sourceRoot":"","sources":["../../src/providers/provider-capabilities.test.ts"],"names":[],"mappings":"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","sourcesContent":["// GSD-2 — Provider Capabilities Registry Tests (ADR-005 Phase 1)\nimport { describe, test } from \"node:test\";\nimport assert from \"node:assert/strict\";\n\nimport {\n PROVIDER_CAPABILITIES,\n getProviderCapabilities,\n getUnsupportedFeatures,\n mergeCapabilityOverrides,\n getRegisteredApis,\n} from \"./provider-capabilities.js\";\n\n// ─── Registry Completeness ──────────────────────────────────────────────────\n\ndescribe(\"PROVIDER_CAPABILITIES registry\", () => {\n const EXPECTED_APIS = [\n \"anthropic-messages\",\n \"anthropic-vertex\",\n \"openai-responses\",\n \"azure-openai-responses\",\n \"openai-codex-responses\",\n \"openai-completions\",\n \"google-generative-ai\",\n \"google-gemini-cli\",\n \"google-vertex\",\n \"mistral-conversations\",\n \"bedrock-converse-stream\",\n \"ollama-chat\",\n ];\n\n test(\"covers all expected API providers\", () => {\n for (const api of EXPECTED_APIS) {\n assert.ok(\n PROVIDER_CAPABILITIES[api],\n `Missing capability entry for API: ${api}`,\n );\n }\n });\n\n test(\"getRegisteredApis returns all entries\", () => {\n const registered = getRegisteredApis();\n for (const api of EXPECTED_APIS) {\n assert.ok(registered.includes(api), `getRegisteredApis missing: ${api}`);\n }\n });\n\n test(\"all entries have required fields\", () => {\n for (const [api, caps] of Object.entries(PROVIDER_CAPABILITIES)) {\n assert.equal(typeof caps.toolCalling, \"boolean\", `${api}.toolCalling`);\n assert.equal(typeof caps.maxTools, \"number\", `${api}.maxTools`);\n assert.equal(typeof caps.imageToolResults, \"boolean\", `${api}.imageToolResults`);\n assert.equal(typeof caps.structuredOutput, \"boolean\", `${api}.structuredOutput`);\n assert.ok(caps.toolCallIdFormat, `${api}.toolCallIdFormat`);\n assert.equal(typeof caps.toolCallIdFormat.maxLength, \"number\", `${api}.toolCallIdFormat.maxLength`);\n assert.ok(caps.toolCallIdFormat.allowedChars instanceof RegExp, `${api}.toolCallIdFormat.allowedChars`);\n assert.ok(\n [\"full\", \"text-only\", \"none\"].includes(caps.thinkingPersistence),\n `${api}.thinkingPersistence is \"${caps.thinkingPersistence}\"`,\n );\n assert.ok(Array.isArray(caps.unsupportedSchemaFeatures), `${api}.unsupportedSchemaFeatures`);\n }\n });\n});\n\n// ─── Provider-specific Values ───────────────────────────────────────────────\n\ndescribe(\"provider-specific capabilities\", () => {\n test(\"Anthropic supports full thinking persistence\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"anthropic-messages\"].thinkingPersistence, \"full\");\n });\n\n test(\"Anthropic supports image tool results\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"anthropic-messages\"].imageToolResults, true);\n });\n\n test(\"Anthropic tool call ID is 64 chars max\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"anthropic-messages\"].toolCallIdFormat.maxLength, 64);\n });\n\n test(\"Mistral tool call ID is 9 chars max\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"mistral-conversations\"].toolCallIdFormat.maxLength, 9);\n });\n\n test(\"Mistral has no thinking persistence\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"mistral-conversations\"].thinkingPersistence, \"none\");\n });\n\n test(\"Google does not support patternProperties\", () => {\n assert.ok(\n PROVIDER_CAPABILITIES[\"google-generative-ai\"].unsupportedSchemaFeatures.includes(\"patternProperties\"),\n );\n });\n\n test(\"Google does not support const\", () => {\n assert.ok(\n PROVIDER_CAPABILITIES[\"google-generative-ai\"].unsupportedSchemaFeatures.includes(\"const\"),\n );\n });\n\n test(\"OpenAI Responses does not support image tool results\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"openai-responses\"].imageToolResults, false);\n });\n\n test(\"OpenAI Responses has text-only thinking persistence\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"openai-responses\"].thinkingPersistence, \"text-only\");\n });\n});\n\n// ─── getProviderCapabilities ────────────────────────────────────────────────\n\ndescribe(\"getProviderCapabilities\", () => {\n test(\"returns known provider capabilities\", () => {\n const caps = getProviderCapabilities(\"anthropic-messages\");\n assert.equal(caps.toolCalling, true);\n assert.equal(caps.thinkingPersistence, \"full\");\n });\n\n test(\"returns permissive defaults for unknown providers\", () => {\n const caps = getProviderCapabilities(\"unknown-provider-xyz\");\n assert.equal(caps.toolCalling, true);\n assert.equal(caps.imageToolResults, true);\n assert.deepEqual(caps.unsupportedSchemaFeatures, []);\n });\n});\n\n// ─── getUnsupportedFeatures ─────────────────────────────────────────────────\n\ndescribe(\"getUnsupportedFeatures\", () => {\n test(\"returns unsupported features for Google\", () => {\n const unsupported = getUnsupportedFeatures(\"google-generative-ai\", [\"patternProperties\", \"const\"]);\n assert.deepEqual(unsupported, [\"patternProperties\", \"const\"]);\n });\n\n test(\"returns empty for Anthropic with any features\", () => {\n const unsupported = getUnsupportedFeatures(\"anthropic-messages\", [\"patternProperties\", \"const\"]);\n assert.deepEqual(unsupported, []);\n });\n\n test(\"returns empty for unknown provider\", () => {\n const unsupported = getUnsupportedFeatures(\"unknown-xyz\", [\"patternProperties\"]);\n assert.deepEqual(unsupported, []);\n });\n});\n\n// ─── mergeCapabilityOverrides ───────────────────────────────────────────────\n\ndescribe(\"mergeCapabilityOverrides\", () => {\n test(\"overrides individual fields\", () => {\n const merged = mergeCapabilityOverrides(\"openai-responses\", {\n imageToolResults: true,\n });\n assert.equal(merged.imageToolResults, true);\n // Non-overridden fields preserved\n assert.equal(merged.toolCalling, true);\n assert.equal(merged.thinkingPersistence, \"text-only\");\n });\n\n test(\"deep-merges toolCallIdFormat\", () => {\n const merged = mergeCapabilityOverrides(\"anthropic-messages\", {\n toolCallIdFormat: { maxLength: 128 },\n });\n assert.equal(merged.toolCallIdFormat.maxLength, 128);\n // allowedChars preserved from base\n assert.ok(merged.toolCallIdFormat.allowedChars instanceof RegExp);\n });\n\n test(\"uses permissive defaults for unknown provider\", () => {\n const merged = mergeCapabilityOverrides(\"unknown-xyz\", {\n imageToolResults: false,\n });\n assert.equal(merged.imageToolResults, false);\n assert.equal(merged.toolCalling, true); // from default\n });\n});\n"]}
1
+ {"version":3,"file":"provider-capabilities.test.js","sourceRoot":"","sources":["../../src/providers/provider-capabilities.test.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi — Provider Capabilities Registry Tests (ADR-005 Phase 1)\nimport { describe, test } from \"node:test\";\nimport assert from \"node:assert/strict\";\n\nimport {\n PROVIDER_CAPABILITIES,\n getProviderCapabilities,\n getUnsupportedFeatures,\n mergeCapabilityOverrides,\n getRegisteredApis,\n} from \"./provider-capabilities.js\";\n\n// ─── Registry Completeness ──────────────────────────────────────────────────\n\ndescribe(\"PROVIDER_CAPABILITIES registry\", () => {\n const EXPECTED_APIS = [\n \"anthropic-messages\",\n \"anthropic-vertex\",\n \"openai-responses\",\n \"azure-openai-responses\",\n \"openai-codex-responses\",\n \"openai-completions\",\n \"google-generative-ai\",\n \"google-gemini-cli\",\n \"google-vertex\",\n \"mistral-conversations\",\n \"bedrock-converse-stream\",\n \"ollama-chat\",\n ];\n\n test(\"covers all expected API providers\", () => {\n for (const api of EXPECTED_APIS) {\n assert.ok(\n PROVIDER_CAPABILITIES[api],\n `Missing capability entry for API: ${api}`,\n );\n }\n });\n\n test(\"getRegisteredApis returns all entries\", () => {\n const registered = getRegisteredApis();\n for (const api of EXPECTED_APIS) {\n assert.ok(registered.includes(api), `getRegisteredApis missing: ${api}`);\n }\n });\n\n test(\"all entries have required fields\", () => {\n for (const [api, caps] of Object.entries(PROVIDER_CAPABILITIES)) {\n assert.equal(typeof caps.toolCalling, \"boolean\", `${api}.toolCalling`);\n assert.equal(typeof caps.maxTools, \"number\", `${api}.maxTools`);\n assert.equal(typeof caps.imageToolResults, \"boolean\", `${api}.imageToolResults`);\n assert.equal(typeof caps.structuredOutput, \"boolean\", `${api}.structuredOutput`);\n assert.ok(caps.toolCallIdFormat, `${api}.toolCallIdFormat`);\n assert.equal(typeof caps.toolCallIdFormat.maxLength, \"number\", `${api}.toolCallIdFormat.maxLength`);\n assert.ok(caps.toolCallIdFormat.allowedChars instanceof RegExp, `${api}.toolCallIdFormat.allowedChars`);\n assert.ok(\n [\"full\", \"text-only\", \"none\"].includes(caps.thinkingPersistence),\n `${api}.thinkingPersistence is \"${caps.thinkingPersistence}\"`,\n );\n assert.ok(Array.isArray(caps.unsupportedSchemaFeatures), `${api}.unsupportedSchemaFeatures`);\n }\n });\n});\n\n// ─── Provider-specific Values ───────────────────────────────────────────────\n\ndescribe(\"provider-specific capabilities\", () => {\n test(\"Anthropic supports full thinking persistence\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"anthropic-messages\"].thinkingPersistence, \"full\");\n });\n\n test(\"Anthropic supports image tool results\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"anthropic-messages\"].imageToolResults, true);\n });\n\n test(\"Anthropic tool call ID is 64 chars max\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"anthropic-messages\"].toolCallIdFormat.maxLength, 64);\n });\n\n test(\"Mistral tool call ID is 9 chars max\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"mistral-conversations\"].toolCallIdFormat.maxLength, 9);\n });\n\n test(\"Mistral has no thinking persistence\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"mistral-conversations\"].thinkingPersistence, \"none\");\n });\n\n test(\"Google does not support patternProperties\", () => {\n assert.ok(\n PROVIDER_CAPABILITIES[\"google-generative-ai\"].unsupportedSchemaFeatures.includes(\"patternProperties\"),\n );\n });\n\n test(\"Google does not support const\", () => {\n assert.ok(\n PROVIDER_CAPABILITIES[\"google-generative-ai\"].unsupportedSchemaFeatures.includes(\"const\"),\n );\n });\n\n test(\"OpenAI Responses does not support image tool results\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"openai-responses\"].imageToolResults, false);\n });\n\n test(\"OpenAI Responses has text-only thinking persistence\", () => {\n assert.equal(PROVIDER_CAPABILITIES[\"openai-responses\"].thinkingPersistence, \"text-only\");\n });\n});\n\n// ─── getProviderCapabilities ────────────────────────────────────────────────\n\ndescribe(\"getProviderCapabilities\", () => {\n test(\"returns known provider capabilities\", () => {\n const caps = getProviderCapabilities(\"anthropic-messages\");\n assert.equal(caps.toolCalling, true);\n assert.equal(caps.thinkingPersistence, \"full\");\n });\n\n test(\"returns permissive defaults for unknown providers\", () => {\n const caps = getProviderCapabilities(\"unknown-provider-xyz\");\n assert.equal(caps.toolCalling, true);\n assert.equal(caps.imageToolResults, true);\n assert.deepEqual(caps.unsupportedSchemaFeatures, []);\n });\n});\n\n// ─── getUnsupportedFeatures ─────────────────────────────────────────────────\n\ndescribe(\"getUnsupportedFeatures\", () => {\n test(\"returns unsupported features for Google\", () => {\n const unsupported = getUnsupportedFeatures(\"google-generative-ai\", [\"patternProperties\", \"const\"]);\n assert.deepEqual(unsupported, [\"patternProperties\", \"const\"]);\n });\n\n test(\"returns empty for Anthropic with any features\", () => {\n const unsupported = getUnsupportedFeatures(\"anthropic-messages\", [\"patternProperties\", \"const\"]);\n assert.deepEqual(unsupported, []);\n });\n\n test(\"returns empty for unknown provider\", () => {\n const unsupported = getUnsupportedFeatures(\"unknown-xyz\", [\"patternProperties\"]);\n assert.deepEqual(unsupported, []);\n });\n});\n\n// ─── mergeCapabilityOverrides ───────────────────────────────────────────────\n\ndescribe(\"mergeCapabilityOverrides\", () => {\n test(\"overrides individual fields\", () => {\n const merged = mergeCapabilityOverrides(\"openai-responses\", {\n imageToolResults: true,\n });\n assert.equal(merged.imageToolResults, true);\n // Non-overridden fields preserved\n assert.equal(merged.toolCalling, true);\n assert.equal(merged.thinkingPersistence, \"text-only\");\n });\n\n test(\"deep-merges toolCallIdFormat\", () => {\n const merged = mergeCapabilityOverrides(\"anthropic-messages\", {\n toolCallIdFormat: { maxLength: 128 },\n });\n assert.equal(merged.toolCallIdFormat.maxLength, 128);\n // allowedChars preserved from base\n assert.ok(merged.toolCallIdFormat.allowedChars instanceof RegExp);\n });\n\n test(\"uses permissive defaults for unknown provider\", () => {\n const merged = mergeCapabilityOverrides(\"unknown-xyz\", {\n imageToolResults: false,\n });\n assert.equal(merged.imageToolResults, false);\n assert.equal(merged.toolCalling, true); // from default\n });\n});\n"]}
@@ -1,4 +1,4 @@
1
- // GSD-2 — ProviderSwitchReport Tests (ADR-005 Phase 3)
1
+ // gsd-pi — ProviderSwitchReport Tests (ADR-005 Phase 3)
2
2
  import { describe, test } from "node:test";
3
3
  import assert from "node:assert/strict";
4
4
  import { transformMessages, createEmptyReport, hasTransformations } from "./transform-messages.js";
@@ -1 +1 @@
1
- {"version":3,"file":"transform-messages-report.test.js","sourceRoot":"","sources":["../../src/providers/transform-messages-report.test.ts"],"names":[],"mappings":"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","sourcesContent":["// GSD-2 — ProviderSwitchReport Tests (ADR-005 Phase 3)\nimport { describe, test } from \"node:test\";\nimport assert from \"node:assert/strict\";\n\nimport { transformMessages, createEmptyReport, hasTransformations } from \"./transform-messages.js\";\nimport type { ProviderSwitchReport } from \"./transform-messages.js\";\nimport type { Message, Model, AssistantMessage, ToolCall } from \"../types.js\";\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction makeModel(overrides: Partial<Model<any>> = {}): Model<any> {\n return {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n api: \"anthropic-messages\",\n provider: \"anthropic\",\n baseUrl: \"\",\n reasoning: false,\n input: [\"text\", \"image\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: 200000,\n maxTokens: 8192,\n ...overrides,\n } as Model<any>;\n}\n\nfunction makeAssistantMsg(overrides: Partial<AssistantMessage> = {}): AssistantMessage {\n return {\n role: \"assistant\",\n content: [],\n api: \"anthropic-messages\",\n provider: \"anthropic\",\n model: \"claude-sonnet-4-6\",\n usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },\n stopReason: \"stop\",\n timestamp: Date.now(),\n ...overrides,\n };\n}\n\n// ─── createEmptyReport / hasTransformations ─────────────────────────────────\n\ndescribe(\"createEmptyReport\", () => {\n test(\"creates report with zero counters\", () => {\n const report = createEmptyReport(\"anthropic-messages\", \"openai-responses\");\n assert.equal(report.fromApi, \"anthropic-messages\");\n assert.equal(report.toApi, \"openai-responses\");\n assert.equal(report.thinkingBlocksDropped, 0);\n assert.equal(report.thinkingBlocksDowngraded, 0);\n assert.equal(report.toolCallIdsRemapped, 0);\n assert.equal(report.syntheticToolResultsInserted, 0);\n assert.equal(report.thoughtSignaturesDropped, 0);\n });\n});\n\ndescribe(\"hasTransformations\", () => {\n test(\"returns false for empty report\", () => {\n const report = createEmptyReport(\"a\", \"b\");\n assert.equal(hasTransformations(report), false);\n });\n\n test(\"returns true when any counter is non-zero\", () => {\n const report = createEmptyReport(\"a\", \"b\");\n report.thinkingBlocksDropped = 1;\n assert.equal(hasTransformations(report), true);\n });\n});\n\n// ─── Report Tracking in transformMessages ───────────────────────────────────\n\ndescribe(\"transformMessages with report tracking\", () => {\n test(\"tracks thinking blocks dropped for redacted cross-model\", () => {\n const model = makeModel({ id: \"gpt-5\", api: \"openai-responses\", provider: \"openai\" });\n const messages: Message[] = [\n makeAssistantMsg({\n content: [\n { type: \"thinking\", thinking: \"\", redacted: true },\n { type: \"text\", text: \"Hello\" },\n ],\n }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"openai-responses\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thinkingBlocksDropped, 1);\n });\n\n test(\"tracks thinking blocks downgraded to plain text\", () => {\n const model = makeModel({ id: \"gpt-5\", api: \"openai-responses\", provider: \"openai\" });\n const messages: Message[] = [\n makeAssistantMsg({\n content: [\n { type: \"thinking\", thinking: \"Let me think about this...\" },\n { type: \"text\", text: \"Here is my answer\" },\n ],\n }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"openai-responses\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thinkingBlocksDowngraded, 1);\n });\n\n test(\"tracks tool call IDs remapped\", () => {\n const model = makeModel({ id: \"claude-sonnet-4-6\", api: \"anthropic-messages\", provider: \"anthropic\" });\n const toolCall: ToolCall = {\n type: \"toolCall\",\n id: \"original-long-id-that-needs-normalization|with-special-chars\",\n name: \"bash\",\n arguments: { command: \"ls\" },\n };\n const messages: Message[] = [\n makeAssistantMsg({\n provider: \"openai\",\n api: \"openai-responses\",\n model: \"gpt-5\",\n content: [toolCall],\n }),\n ];\n const normalizer = (id: string) => id.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n const report = createEmptyReport(\"openai-responses\", \"anthropic-messages\");\n transformMessages(messages, model, normalizer, report);\n assert.equal(report.toolCallIdsRemapped, 1);\n });\n\n test(\"tracks thought signatures dropped\", () => {\n const model = makeModel({ id: \"claude-sonnet-4-6\", api: \"anthropic-messages\", provider: \"anthropic\" });\n const toolCall: ToolCall = {\n type: \"toolCall\",\n id: \"tc_001\",\n name: \"bash\",\n arguments: { command: \"ls\" },\n thoughtSignature: \"some-opaque-signature\",\n };\n const messages: Message[] = [\n makeAssistantMsg({\n provider: \"google\",\n api: \"google-generative-ai\",\n model: \"gemini-2.5-pro\",\n content: [toolCall],\n }),\n ];\n const report = createEmptyReport(\"google-generative-ai\", \"anthropic-messages\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thoughtSignaturesDropped, 1);\n });\n\n test(\"tracks synthetic tool results inserted\", () => {\n const model = makeModel();\n const toolCall: ToolCall = {\n type: \"toolCall\",\n id: \"tc_orphan\",\n name: \"bash\",\n arguments: { command: \"ls\" },\n };\n // Assistant message with tool call followed by another assistant (no tool result)\n const messages: Message[] = [\n makeAssistantMsg({ content: [toolCall, { type: \"text\", text: \"Using bash\" }] }),\n makeAssistantMsg({ content: [{ type: \"text\", text: \"Next message\" }] }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"anthropic-messages\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.syntheticToolResultsInserted, 1);\n });\n\n test(\"does not count transformations for same-model messages\", () => {\n const model = makeModel();\n const messages: Message[] = [\n makeAssistantMsg({\n content: [\n { type: \"thinking\", thinking: \"Let me think...\" },\n { type: \"text\", text: \"Answer\" },\n ],\n }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"anthropic-messages\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thinkingBlocksDowngraded, 0);\n assert.equal(report.thinkingBlocksDropped, 0);\n });\n\n test(\"works without report parameter (backward compatible)\", () => {\n const model = makeModel();\n const messages: Message[] = [\n makeAssistantMsg({ content: [{ type: \"text\", text: \"Hello\" }] }),\n ];\n // Should not throw\n const result = transformMessages(messages, model);\n assert.ok(Array.isArray(result));\n });\n});\n"]}
1
+ {"version":3,"file":"transform-messages-report.test.js","sourceRoot":"","sources":["../../src/providers/transform-messages-report.test.ts"],"names":[],"mappings":"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","sourcesContent":["// gsd-pi — ProviderSwitchReport Tests (ADR-005 Phase 3)\nimport { describe, test } from \"node:test\";\nimport assert from \"node:assert/strict\";\n\nimport { transformMessages, createEmptyReport, hasTransformations } from \"./transform-messages.js\";\nimport type { ProviderSwitchReport } from \"./transform-messages.js\";\nimport type { Message, Model, AssistantMessage, ToolCall } from \"../types.js\";\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction makeModel(overrides: Partial<Model<any>> = {}): Model<any> {\n return {\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n api: \"anthropic-messages\",\n provider: \"anthropic\",\n baseUrl: \"\",\n reasoning: false,\n input: [\"text\", \"image\"],\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n contextWindow: 200000,\n maxTokens: 8192,\n ...overrides,\n } as Model<any>;\n}\n\nfunction makeAssistantMsg(overrides: Partial<AssistantMessage> = {}): AssistantMessage {\n return {\n role: \"assistant\",\n content: [],\n api: \"anthropic-messages\",\n provider: \"anthropic\",\n model: \"claude-sonnet-4-6\",\n usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } },\n stopReason: \"stop\",\n timestamp: Date.now(),\n ...overrides,\n };\n}\n\n// ─── createEmptyReport / hasTransformations ─────────────────────────────────\n\ndescribe(\"createEmptyReport\", () => {\n test(\"creates report with zero counters\", () => {\n const report = createEmptyReport(\"anthropic-messages\", \"openai-responses\");\n assert.equal(report.fromApi, \"anthropic-messages\");\n assert.equal(report.toApi, \"openai-responses\");\n assert.equal(report.thinkingBlocksDropped, 0);\n assert.equal(report.thinkingBlocksDowngraded, 0);\n assert.equal(report.toolCallIdsRemapped, 0);\n assert.equal(report.syntheticToolResultsInserted, 0);\n assert.equal(report.thoughtSignaturesDropped, 0);\n });\n});\n\ndescribe(\"hasTransformations\", () => {\n test(\"returns false for empty report\", () => {\n const report = createEmptyReport(\"a\", \"b\");\n assert.equal(hasTransformations(report), false);\n });\n\n test(\"returns true when any counter is non-zero\", () => {\n const report = createEmptyReport(\"a\", \"b\");\n report.thinkingBlocksDropped = 1;\n assert.equal(hasTransformations(report), true);\n });\n});\n\n// ─── Report Tracking in transformMessages ───────────────────────────────────\n\ndescribe(\"transformMessages with report tracking\", () => {\n test(\"tracks thinking blocks dropped for redacted cross-model\", () => {\n const model = makeModel({ id: \"gpt-5\", api: \"openai-responses\", provider: \"openai\" });\n const messages: Message[] = [\n makeAssistantMsg({\n content: [\n { type: \"thinking\", thinking: \"\", redacted: true },\n { type: \"text\", text: \"Hello\" },\n ],\n }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"openai-responses\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thinkingBlocksDropped, 1);\n });\n\n test(\"tracks thinking blocks downgraded to plain text\", () => {\n const model = makeModel({ id: \"gpt-5\", api: \"openai-responses\", provider: \"openai\" });\n const messages: Message[] = [\n makeAssistantMsg({\n content: [\n { type: \"thinking\", thinking: \"Let me think about this...\" },\n { type: \"text\", text: \"Here is my answer\" },\n ],\n }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"openai-responses\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thinkingBlocksDowngraded, 1);\n });\n\n test(\"tracks tool call IDs remapped\", () => {\n const model = makeModel({ id: \"claude-sonnet-4-6\", api: \"anthropic-messages\", provider: \"anthropic\" });\n const toolCall: ToolCall = {\n type: \"toolCall\",\n id: \"original-long-id-that-needs-normalization|with-special-chars\",\n name: \"bash\",\n arguments: { command: \"ls\" },\n };\n const messages: Message[] = [\n makeAssistantMsg({\n provider: \"openai\",\n api: \"openai-responses\",\n model: \"gpt-5\",\n content: [toolCall],\n }),\n ];\n const normalizer = (id: string) => id.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n const report = createEmptyReport(\"openai-responses\", \"anthropic-messages\");\n transformMessages(messages, model, normalizer, report);\n assert.equal(report.toolCallIdsRemapped, 1);\n });\n\n test(\"tracks thought signatures dropped\", () => {\n const model = makeModel({ id: \"claude-sonnet-4-6\", api: \"anthropic-messages\", provider: \"anthropic\" });\n const toolCall: ToolCall = {\n type: \"toolCall\",\n id: \"tc_001\",\n name: \"bash\",\n arguments: { command: \"ls\" },\n thoughtSignature: \"some-opaque-signature\",\n };\n const messages: Message[] = [\n makeAssistantMsg({\n provider: \"google\",\n api: \"google-generative-ai\",\n model: \"gemini-2.5-pro\",\n content: [toolCall],\n }),\n ];\n const report = createEmptyReport(\"google-generative-ai\", \"anthropic-messages\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thoughtSignaturesDropped, 1);\n });\n\n test(\"tracks synthetic tool results inserted\", () => {\n const model = makeModel();\n const toolCall: ToolCall = {\n type: \"toolCall\",\n id: \"tc_orphan\",\n name: \"bash\",\n arguments: { command: \"ls\" },\n };\n // Assistant message with tool call followed by another assistant (no tool result)\n const messages: Message[] = [\n makeAssistantMsg({ content: [toolCall, { type: \"text\", text: \"Using bash\" }] }),\n makeAssistantMsg({ content: [{ type: \"text\", text: \"Next message\" }] }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"anthropic-messages\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.syntheticToolResultsInserted, 1);\n });\n\n test(\"does not count transformations for same-model messages\", () => {\n const model = makeModel();\n const messages: Message[] = [\n makeAssistantMsg({\n content: [\n { type: \"thinking\", thinking: \"Let me think...\" },\n { type: \"text\", text: \"Answer\" },\n ],\n }),\n ];\n const report = createEmptyReport(\"anthropic-messages\", \"anthropic-messages\");\n transformMessages(messages, model, undefined, report);\n assert.equal(report.thinkingBlocksDowngraded, 0);\n assert.equal(report.thinkingBlocksDropped, 0);\n });\n\n test(\"works without report parameter (backward compatible)\", () => {\n const model = makeModel();\n const messages: Message[] = [\n makeAssistantMsg({ content: [{ type: \"text\", text: \"Hello\" }] }),\n ];\n // Should not throw\n const result = transformMessages(messages, model);\n assert.ok(Array.isArray(result));\n });\n});\n"]}