gsd-pi 2.75.0-dev.063e5a3 → 2.75.0-dev.96d4bb599

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 (760) hide show
  1. package/README.md +186 -149
  2. package/dist/claude-cli-check.d.ts +10 -0
  3. package/dist/claude-cli-check.js +13 -3
  4. package/dist/headless-events.d.ts +1 -1
  5. package/dist/headless-events.js +5 -2
  6. package/dist/headless.js +5 -6
  7. package/dist/loader.js +0 -0
  8. package/dist/onboarding.d.ts +20 -1
  9. package/dist/onboarding.js +99 -39
  10. package/dist/resources/extensions/ask-user-questions.js +17 -5
  11. package/dist/resources/extensions/claude-code-cli/models.js +9 -0
  12. package/dist/resources/extensions/claude-code-cli/readiness.js +12 -2
  13. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +76 -4
  14. package/dist/resources/extensions/gsd/auto/detect-stuck.js +9 -0
  15. package/dist/resources/extensions/gsd/auto/loop.js +67 -4
  16. package/dist/resources/extensions/gsd/auto/phases.js +70 -47
  17. package/dist/resources/extensions/gsd/auto/resolve.js +1 -1
  18. package/dist/resources/extensions/gsd/auto/run-unit.js +10 -1
  19. package/dist/resources/extensions/gsd/auto/session.js +5 -0
  20. package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
  21. package/dist/resources/extensions/gsd/auto-dashboard.js +15 -7
  22. package/dist/resources/extensions/gsd/auto-dispatch.js +112 -6
  23. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +11 -3
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +10 -8
  26. package/dist/resources/extensions/gsd/auto-prompts.js +173 -39
  27. package/dist/resources/extensions/gsd/auto-recovery.js +57 -0
  28. package/dist/resources/extensions/gsd/auto-start.js +5 -3
  29. package/dist/resources/extensions/gsd/auto-verification.js +3 -3
  30. package/dist/resources/extensions/gsd/auto-worktree.js +55 -1
  31. package/dist/resources/extensions/gsd/auto.js +57 -25
  32. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
  33. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
  34. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +128 -0
  35. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
  36. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +2 -0
  37. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
  38. package/dist/resources/extensions/gsd/bootstrap/system-context.js +17 -4
  39. package/dist/resources/extensions/gsd/commands/catalog.js +81 -9
  40. package/dist/resources/extensions/gsd/commands/handlers/core.js +64 -24
  41. package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
  42. package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
  43. package/dist/resources/extensions/gsd/commands/handlers/ops.js +21 -0
  44. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +228 -29
  45. package/dist/resources/extensions/gsd/commands-cmux.js +5 -2
  46. package/dist/resources/extensions/gsd/commands-config.js +5 -0
  47. package/dist/resources/extensions/gsd/commands-debug.js +388 -0
  48. package/dist/resources/extensions/gsd/commands-do.js +1 -0
  49. package/dist/resources/extensions/gsd/commands-extract-learnings.js +233 -75
  50. package/dist/resources/extensions/gsd/commands-handlers.js +21 -2
  51. package/dist/resources/extensions/gsd/commands-memory.js +462 -0
  52. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +40 -12
  53. package/dist/resources/extensions/gsd/commands-scan.js +94 -0
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +101 -2
  55. package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
  56. package/dist/resources/extensions/gsd/db-writer.js +1 -0
  57. package/dist/resources/extensions/gsd/debug-session-store.js +238 -0
  58. package/dist/resources/extensions/gsd/definition-loader.js +7 -0
  59. package/dist/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  60. package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
  61. package/dist/resources/extensions/gsd/doctor-git-checks.js +5 -1
  62. package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
  63. package/dist/resources/extensions/gsd/doctor-providers.js +48 -20
  64. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +22 -4
  65. package/dist/resources/extensions/gsd/doctor.js +7 -1
  66. package/dist/resources/extensions/gsd/error-classifier.js +6 -3
  67. package/dist/resources/extensions/gsd/escalation.js +321 -0
  68. package/dist/resources/extensions/gsd/forensics.js +26 -29
  69. package/dist/resources/extensions/gsd/git-service.js +0 -1
  70. package/dist/resources/extensions/gsd/graph.js +26 -2
  71. package/dist/resources/extensions/gsd/gsd-db.js +490 -32
  72. package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
  73. package/dist/resources/extensions/gsd/health-widget.js +7 -4
  74. package/dist/resources/extensions/gsd/init-wizard.js +86 -45
  75. package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
  76. package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
  77. package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
  78. package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
  79. package/dist/resources/extensions/gsd/memory-relations.js +189 -0
  80. package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
  81. package/dist/resources/extensions/gsd/memory-store.js +299 -6
  82. package/dist/resources/extensions/gsd/metrics.js +1 -0
  83. package/dist/resources/extensions/gsd/model-cost-table.js +3 -1
  84. package/dist/resources/extensions/gsd/model-router.js +16 -6
  85. package/dist/resources/extensions/gsd/native-git-bridge.js +137 -5
  86. package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
  87. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  88. package/dist/resources/extensions/gsd/notifications.js +4 -0
  89. package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
  90. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  91. package/dist/resources/extensions/gsd/pre-execution-checks.js +97 -4
  92. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  93. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  94. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  95. package/dist/resources/extensions/gsd/preferences.js +10 -10
  96. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  97. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  98. package/dist/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  99. package/dist/resources/extensions/gsd/prompts/execute-task.md +12 -0
  100. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  101. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  102. package/dist/resources/extensions/gsd/prompts/scan.md +79 -0
  103. package/dist/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  104. package/dist/resources/extensions/gsd/python-resolver.js +70 -0
  105. package/dist/resources/extensions/gsd/run-manager.js +37 -17
  106. package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
  107. package/dist/resources/extensions/gsd/state.js +47 -3
  108. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  109. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  110. package/dist/resources/extensions/gsd/tools/memory-tools.js +306 -0
  111. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  112. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  113. package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
  114. package/dist/resources/extensions/gsd/uok/flags.js +7 -7
  115. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  116. package/dist/resources/extensions/gsd/verification-gate.js +2 -1
  117. package/dist/resources/extensions/gsd/workflow-dispatch.js +64 -0
  118. package/dist/resources/extensions/gsd/workflow-install.js +327 -0
  119. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  120. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -6
  121. package/dist/resources/extensions/gsd/workflow-plugins.js +346 -0
  122. package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
  123. package/dist/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  124. package/dist/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  125. package/dist/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  126. package/dist/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  127. package/dist/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  128. package/dist/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  129. package/dist/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  130. package/dist/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  131. package/dist/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  132. package/dist/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  133. package/dist/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  134. package/dist/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  135. package/dist/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  136. package/dist/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  137. package/dist/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  138. package/dist/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  139. package/dist/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  140. package/dist/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  141. package/dist/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  142. package/dist/resources/extensions/gsd/workflow-templates/release.md +118 -0
  143. package/dist/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  144. package/dist/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  145. package/dist/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  146. package/dist/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  147. package/dist/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  148. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  149. package/dist/resources/extensions/remote-questions/commands.js +380 -0
  150. package/dist/resources/extensions/remote-questions/manager.js +39 -5
  151. package/dist/resources/extensions/remote-questions/telegram-adapter.js +79 -4
  152. package/dist/resources/extensions/shared/interview-ui.js +189 -1
  153. package/dist/resources/extensions/shared/layout-utils.js +17 -0
  154. package/dist/resources/extensions/shared/rtk-shared.js +47 -0
  155. package/dist/resources/extensions/shared/rtk.js +3 -46
  156. package/dist/resources/skills/create-workflow/SKILL.md +33 -6
  157. package/dist/rtk-shared.d.ts +10 -0
  158. package/dist/rtk-shared.js +47 -0
  159. package/dist/rtk.d.ts +2 -6
  160. package/dist/rtk.js +3 -48
  161. package/dist/shared/workspace-types.d.ts +52 -0
  162. package/dist/shared/workspace-types.js +1 -0
  163. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  164. package/dist/update-check.d.ts +10 -0
  165. package/dist/update-check.js +24 -3
  166. package/dist/web/standalone/.next/BUILD_ID +1 -1
  167. package/dist/web/standalone/.next/app-path-routes-manifest.json +5 -5
  168. package/dist/web/standalone/.next/build-manifest.json +3 -3
  169. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  170. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  171. package/dist/web/standalone/.next/required-server-files.json +1 -1
  172. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  174. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  176. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  177. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  178. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  179. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  180. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  183. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  184. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  185. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  186. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  187. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  188. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  189. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  190. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  197. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  212. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  216. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  218. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  223. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  224. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  235. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  240. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  247. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  248. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  249. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  254. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/index.html +1 -1
  256. package/dist/web/standalone/.next/server/app/index.rsc +3 -3
  257. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  258. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  259. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  260. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  261. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  262. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app-paths-manifest.json +5 -5
  264. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  265. package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
  266. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  267. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  268. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  269. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  270. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  271. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  272. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +9 -0
  273. package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
  274. package/dist/web/standalone/.next/static/chunks/app/{page-f1e30ab6bb269149.js → page-5b113fd32bc2a1c3.js} +1 -1
  275. package/dist/web/standalone/.next/static/chunks/{webpack-b868033a5834586d.js → webpack-5fc74f13a25fa1bb.js} +1 -1
  276. package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
  277. package/dist/web/standalone/server.js +1 -1
  278. package/dist/welcome-screen.js +48 -24
  279. package/dist/wizard.js +2 -2
  280. package/dist/worktree-cli.d.ts +6 -5
  281. package/dist/worktree-cli.js +23 -7
  282. package/package.json +3 -3
  283. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  284. package/packages/mcp-server/dist/server.js +12 -10
  285. package/packages/mcp-server/dist/server.js.map +1 -1
  286. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  287. package/packages/mcp-server/dist/session-manager.js +8 -1
  288. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  289. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -0
  290. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  291. package/packages/mcp-server/dist/workflow-tools.js +113 -14
  292. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  293. package/packages/mcp-server/src/mcp-server.test.ts +40 -4
  294. package/packages/mcp-server/src/server.ts +12 -10
  295. package/packages/mcp-server/src/session-manager.ts +10 -3
  296. package/packages/mcp-server/src/workflow-tools.test.ts +91 -1
  297. package/packages/mcp-server/src/workflow-tools.ts +128 -18
  298. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  299. package/packages/native/tsconfig.tsbuildinfo +1 -1
  300. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  301. package/packages/pi-ai/dist/models/capability-patches.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/models/capability-patches.js +3 -2
  303. package/packages/pi-ai/dist/models/capability-patches.js.map +1 -1
  304. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts +68 -0
  305. package/packages/pi-ai/dist/models/generated/amazon-bedrock.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js +68 -0
  307. package/packages/pi-ai/dist/models/generated/amazon-bedrock.js.map +1 -1
  308. package/packages/pi-ai/dist/models/generated/anthropic.d.ts +17 -0
  309. package/packages/pi-ai/dist/models/generated/anthropic.d.ts.map +1 -1
  310. package/packages/pi-ai/dist/models/generated/anthropic.js +17 -0
  311. package/packages/pi-ai/dist/models/generated/anthropic.js.map +1 -1
  312. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts +17 -0
  313. package/packages/pi-ai/dist/models/generated/google-antigravity.d.ts.map +1 -1
  314. package/packages/pi-ai/dist/models/generated/google-antigravity.js +17 -0
  315. package/packages/pi-ai/dist/models/generated/google-antigravity.js.map +1 -1
  316. package/packages/pi-ai/dist/models/generated/groq.d.ts +0 -153
  317. package/packages/pi-ai/dist/models/generated/groq.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/models/generated/groq.js +0 -153
  319. package/packages/pi-ai/dist/models/generated/groq.js.map +1 -1
  320. package/packages/pi-ai/dist/models/generated/index.d.ts +136 -153
  321. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  322. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  323. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  324. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  325. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  326. package/packages/pi-ai/dist/models/generated/openrouter.d.ts +17 -0
  327. package/packages/pi-ai/dist/models/generated/openrouter.d.ts.map +1 -1
  328. package/packages/pi-ai/dist/models/generated/openrouter.js +17 -0
  329. package/packages/pi-ai/dist/models/generated/openrouter.js.map +1 -1
  330. package/packages/pi-ai/dist/models.generated.test.js +17 -0
  331. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  332. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  333. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  334. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -6
  335. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  336. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  337. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  338. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  339. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  340. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  341. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  342. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +20 -1
  343. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  344. package/packages/pi-ai/dist/providers/anthropic-shared.js +32 -2
  345. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  346. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +12 -1
  347. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -1
  348. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  349. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  350. package/packages/pi-ai/dist/providers/anthropic.js +18 -1
  351. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  352. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  353. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  354. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  355. package/packages/pi-ai/package.json +1 -1
  356. package/packages/pi-ai/scripts/generate-models.ts +50 -0
  357. package/packages/pi-ai/src/models/capability-patches.ts +5 -2
  358. package/packages/pi-ai/src/models/generated/amazon-bedrock.ts +68 -0
  359. package/packages/pi-ai/src/models/generated/anthropic.ts +17 -0
  360. package/packages/pi-ai/src/models/generated/google-antigravity.ts +17 -0
  361. package/packages/pi-ai/src/models/generated/groq.ts +0 -153
  362. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  363. package/packages/pi-ai/src/models/generated/openrouter.ts +17 -0
  364. package/packages/pi-ai/src/models.generated.test.ts +17 -0
  365. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  366. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -7
  367. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  368. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +15 -1
  369. package/packages/pi-ai/src/providers/anthropic-shared.ts +36 -3
  370. package/packages/pi-ai/src/providers/anthropic.ts +19 -1
  371. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  372. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  373. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts +2 -0
  374. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.d.ts.map +1 -0
  375. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +38 -0
  376. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -0
  377. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +14 -0
  378. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/auth-storage.js +34 -0
  380. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +74 -0
  382. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  384. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  386. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  388. package/packages/pi-coding-agent/dist/core/sdk.js +32 -0
  389. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  390. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +2 -2
  391. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  392. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  394. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  395. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  396. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  397. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  398. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  399. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  400. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  401. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  402. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  403. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  404. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +77 -0
  405. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  406. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -66
  407. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  408. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +1 -75
  409. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +1 -1
  411. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  412. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +192 -24
  413. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  414. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +56 -0
  415. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +83 -0
  416. package/packages/pi-coding-agent/src/core/auth-storage.ts +35 -0
  417. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  418. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  419. package/packages/pi-coding-agent/src/core/sdk.ts +41 -0
  420. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +2 -2
  421. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  422. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  423. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  424. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +83 -0
  425. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +2 -83
  426. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +208 -27
  427. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  428. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  429. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  430. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +70 -0
  431. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -0
  432. package/pkg/dist/modes/interactive/theme/theme-schema.js +77 -0
  433. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -0
  434. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -66
  435. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  436. package/pkg/dist/modes/interactive/theme/theme.js +1 -75
  437. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  438. package/pkg/dist/modes/interactive/theme/themes.d.ts +1 -1
  439. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  440. package/pkg/dist/modes/interactive/theme/themes.js +192 -24
  441. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  442. package/src/resources/extensions/ask-user-questions.ts +24 -6
  443. package/src/resources/extensions/claude-code-cli/models.ts +9 -0
  444. package/src/resources/extensions/claude-code-cli/readiness.ts +13 -2
  445. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +94 -4
  446. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +84 -0
  447. package/src/resources/extensions/gsd/auto/detect-stuck.ts +10 -0
  448. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  449. package/src/resources/extensions/gsd/auto/loop.ts +109 -3
  450. package/src/resources/extensions/gsd/auto/phases.ts +94 -60
  451. package/src/resources/extensions/gsd/auto/resolve.ts +1 -1
  452. package/src/resources/extensions/gsd/auto/run-unit.ts +11 -1
  453. package/src/resources/extensions/gsd/auto/session.ts +7 -0
  454. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  455. package/src/resources/extensions/gsd/auto-dashboard.ts +21 -4
  456. package/src/resources/extensions/gsd/auto-dispatch.ts +123 -5
  457. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  458. package/src/resources/extensions/gsd/auto-model-selection.ts +14 -3
  459. package/src/resources/extensions/gsd/auto-post-unit.ts +10 -8
  460. package/src/resources/extensions/gsd/auto-prompts.ts +201 -40
  461. package/src/resources/extensions/gsd/auto-recovery.ts +63 -1
  462. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  463. package/src/resources/extensions/gsd/auto-verification.ts +3 -3
  464. package/src/resources/extensions/gsd/auto-worktree.ts +65 -0
  465. package/src/resources/extensions/gsd/auto.ts +61 -28
  466. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
  467. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
  468. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +158 -0
  469. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  470. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +2 -0
  471. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  472. package/src/resources/extensions/gsd/bootstrap/system-context.ts +20 -4
  473. package/src/resources/extensions/gsd/commands/catalog.ts +74 -9
  474. package/src/resources/extensions/gsd/commands/handlers/core.ts +69 -27
  475. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  476. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
  477. package/src/resources/extensions/gsd/commands/handlers/ops.ts +21 -0
  478. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +279 -29
  479. package/src/resources/extensions/gsd/commands-cmux.ts +6 -2
  480. package/src/resources/extensions/gsd/commands-config.ts +10 -0
  481. package/src/resources/extensions/gsd/commands-debug.ts +484 -0
  482. package/src/resources/extensions/gsd/commands-do.ts +1 -0
  483. package/src/resources/extensions/gsd/commands-extract-learnings.ts +295 -76
  484. package/src/resources/extensions/gsd/commands-handlers.ts +19 -2
  485. package/src/resources/extensions/gsd/commands-memory.ts +551 -0
  486. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +49 -12
  487. package/src/resources/extensions/gsd/commands-scan.ts +125 -0
  488. package/src/resources/extensions/gsd/commands-workflow-templates.ts +129 -2
  489. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  490. package/src/resources/extensions/gsd/db-writer.ts +3 -0
  491. package/src/resources/extensions/gsd/debug-session-store.ts +377 -0
  492. package/src/resources/extensions/gsd/definition-loader.ts +7 -0
  493. package/src/resources/extensions/gsd/docs/preferences-reference.md +9 -9
  494. package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
  495. package/src/resources/extensions/gsd/doctor-git-checks.ts +5 -1
  496. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  497. package/src/resources/extensions/gsd/doctor-providers.ts +52 -22
  498. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +23 -4
  499. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  500. package/src/resources/extensions/gsd/doctor.ts +7 -1
  501. package/src/resources/extensions/gsd/error-classifier.ts +6 -3
  502. package/src/resources/extensions/gsd/escalation.ts +367 -0
  503. package/src/resources/extensions/gsd/forensics.ts +25 -29
  504. package/src/resources/extensions/gsd/git-service.ts +0 -1
  505. package/src/resources/extensions/gsd/graph.ts +33 -3
  506. package/src/resources/extensions/gsd/gsd-db.ts +578 -32
  507. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  508. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  509. package/src/resources/extensions/gsd/init-wizard.ts +87 -54
  510. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
  511. package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
  512. package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
  513. package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
  514. package/src/resources/extensions/gsd/memory-relations.ts +240 -0
  515. package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
  516. package/src/resources/extensions/gsd/memory-store.ts +351 -7
  517. package/src/resources/extensions/gsd/metrics.ts +1 -0
  518. package/src/resources/extensions/gsd/model-cost-table.ts +3 -1
  519. package/src/resources/extensions/gsd/model-router.ts +25 -6
  520. package/src/resources/extensions/gsd/native-git-bridge.ts +134 -6
  521. package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
  522. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  523. package/src/resources/extensions/gsd/notifications.ts +6 -0
  524. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  525. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  526. package/src/resources/extensions/gsd/pre-execution-checks.ts +98 -8
  527. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  528. package/src/resources/extensions/gsd/preferences-types.ts +10 -2
  529. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  530. package/src/resources/extensions/gsd/preferences.ts +10 -10
  531. package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  532. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +25 -0
  533. package/src/resources/extensions/gsd/prompts/debug-session-manager.md +80 -0
  534. package/src/resources/extensions/gsd/prompts/execute-task.md +12 -0
  535. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  536. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  537. package/src/resources/extensions/gsd/prompts/scan.md +79 -0
  538. package/src/resources/extensions/gsd/prompts/workflow-oneshot.md +26 -0
  539. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  540. package/src/resources/extensions/gsd/run-manager.ts +53 -19
  541. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  542. package/src/resources/extensions/gsd/state.ts +50 -2
  543. package/src/resources/extensions/gsd/templates/PREFERENCES.md +7 -7
  544. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +1 -34
  545. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  546. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +45 -31
  547. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  548. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +12 -0
  549. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  550. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  551. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  552. package/src/resources/extensions/gsd/tests/autocomplete-regressions-1675.test.ts +39 -0
  553. package/src/resources/extensions/gsd/tests/commands-do.test.ts +48 -0
  554. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +333 -21
  555. package/src/resources/extensions/gsd/tests/commands-scan.test.ts +351 -0
  556. package/src/resources/extensions/gsd/tests/commands-workflow-custom.test.ts +8 -6
  557. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
  558. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  559. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  560. package/src/resources/extensions/gsd/tests/debug-command-handler.test.ts +905 -0
  561. package/src/resources/extensions/gsd/tests/debug-command-lifecycle.integration.test.ts +1229 -0
  562. package/src/resources/extensions/gsd/tests/debug-session-store.test.ts +565 -0
  563. package/src/resources/extensions/gsd/tests/discuss-milestone-structured-questions.test.ts +64 -0
  564. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +67 -0
  565. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +62 -18
  566. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  567. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  568. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +29 -12
  569. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +106 -0
  570. package/src/resources/extensions/gsd/tests/forensics-hook-key-parse.test.ts +74 -0
  571. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +0 -4
  572. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  573. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  574. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
  575. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +39 -0
  576. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  577. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +68 -1
  578. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +109 -11
  579. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +51 -0
  580. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
  581. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  582. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +171 -1
  583. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  584. package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
  585. package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
  586. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
  587. package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
  588. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  589. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
  590. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  591. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  592. package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
  593. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  594. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
  595. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  596. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  597. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  598. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
  599. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  600. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  601. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +275 -6
  602. package/src/resources/extensions/gsd/tests/preferences.test.ts +69 -1
  603. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  604. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
  605. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  606. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +27 -0
  607. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  608. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +1 -1
  609. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +33 -0
  610. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  611. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  612. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +107 -0
  613. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  614. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  615. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
  616. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  617. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  618. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +15 -0
  619. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  620. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  621. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +31 -1
  622. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +166 -0
  623. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
  624. package/src/resources/extensions/gsd/tests/workflow-install.test.ts +113 -0
  625. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +15 -6
  626. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -2
  627. package/src/resources/extensions/gsd/tests/workflow-plugins.test.ts +310 -0
  628. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  629. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +8 -2
  630. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  631. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  632. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  633. package/src/resources/extensions/gsd/tools/memory-tools.ts +380 -0
  634. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  635. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  636. package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
  637. package/src/resources/extensions/gsd/types.ts +62 -0
  638. package/src/resources/extensions/gsd/unit-runtime.ts +1 -0
  639. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  640. package/src/resources/extensions/gsd/uok/flags.ts +7 -7
  641. package/src/resources/extensions/gsd/uok/kernel.ts +16 -4
  642. package/src/resources/extensions/gsd/verification-gate.ts +2 -1
  643. package/src/resources/extensions/gsd/workflow-dispatch.ts +106 -0
  644. package/src/resources/extensions/gsd/workflow-install.ts +423 -0
  645. package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
  646. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  647. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -6
  648. package/src/resources/extensions/gsd/workflow-plugins.ts +403 -0
  649. package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
  650. package/src/resources/extensions/gsd/workflow-templates/accessibility-audit.md +88 -0
  651. package/src/resources/extensions/gsd/workflow-templates/api-breaking-change.md +117 -0
  652. package/src/resources/extensions/gsd/workflow-templates/bugfix.md +1 -0
  653. package/src/resources/extensions/gsd/workflow-templates/changelog-gen.md +82 -0
  654. package/src/resources/extensions/gsd/workflow-templates/ci-bootstrap.md +144 -0
  655. package/src/resources/extensions/gsd/workflow-templates/dead-code.md +81 -0
  656. package/src/resources/extensions/gsd/workflow-templates/dep-upgrade.md +1 -0
  657. package/src/resources/extensions/gsd/workflow-templates/docs-sync.yaml +76 -0
  658. package/src/resources/extensions/gsd/workflow-templates/env-audit.yaml +88 -0
  659. package/src/resources/extensions/gsd/workflow-templates/full-project.md +1 -0
  660. package/src/resources/extensions/gsd/workflow-templates/hotfix.md +1 -0
  661. package/src/resources/extensions/gsd/workflow-templates/issue-triage.md +84 -0
  662. package/src/resources/extensions/gsd/workflow-templates/observability-setup.md +133 -0
  663. package/src/resources/extensions/gsd/workflow-templates/onboarding-check.md +74 -0
  664. package/src/resources/extensions/gsd/workflow-templates/performance-audit.md +125 -0
  665. package/src/resources/extensions/gsd/workflow-templates/pr-review.md +67 -0
  666. package/src/resources/extensions/gsd/workflow-templates/pr-triage.md +83 -0
  667. package/src/resources/extensions/gsd/workflow-templates/refactor.md +1 -0
  668. package/src/resources/extensions/gsd/workflow-templates/registry.json +184 -0
  669. package/src/resources/extensions/gsd/workflow-templates/release.md +118 -0
  670. package/src/resources/extensions/gsd/workflow-templates/rename-symbol.yaml +99 -0
  671. package/src/resources/extensions/gsd/workflow-templates/security-audit.md +1 -0
  672. package/src/resources/extensions/gsd/workflow-templates/small-feature.md +1 -0
  673. package/src/resources/extensions/gsd/workflow-templates/spike.md +1 -0
  674. package/src/resources/extensions/gsd/workflow-templates/test-backfill.yaml +73 -0
  675. package/src/resources/extensions/gsd/workflow-templates.ts +7 -0
  676. package/src/resources/extensions/gsd/workspace-index.ts +9 -4
  677. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  678. package/src/resources/extensions/remote-questions/commands.ts +480 -0
  679. package/src/resources/extensions/remote-questions/manager.ts +49 -4
  680. package/src/resources/extensions/remote-questions/telegram-adapter.ts +86 -4
  681. package/src/resources/extensions/remote-questions/tests/command-polling.test.ts +246 -0
  682. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  683. package/src/resources/extensions/remote-questions/tests/telegram-commands.test.ts +267 -0
  684. package/src/resources/extensions/shared/interview-ui.ts +195 -1
  685. package/src/resources/extensions/shared/layout-utils.ts +26 -0
  686. package/src/resources/extensions/shared/rtk-shared.ts +58 -0
  687. package/src/resources/extensions/shared/rtk.ts +12 -52
  688. package/src/resources/extensions/shared/tests/interview-preview.test.ts +177 -0
  689. package/src/resources/extensions/shared/tests/preview-layout.test.ts +120 -0
  690. package/src/resources/skills/create-workflow/SKILL.md +33 -6
  691. package/dist/web/standalone/.next/static/chunks/2826.dd3dc8bbd3025fa5.js +0 -9
  692. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +0 -1
  693. package/packages/native/dist/ps/types.d.ts +0 -5
  694. package/packages/native/dist/ps/types.js +0 -2
  695. package/packages/native/src/ps/types.ts +0 -5
  696. package/packages/pi-ai/node_modules/@smithy/node-http-handler/LICENSE +0 -201
  697. package/packages/pi-ai/node_modules/@smithy/node-http-handler/README.md +0 -9
  698. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-cjs/index.js +0 -762
  699. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/build-abort-error.js +0 -19
  700. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/constants.js +0 -1
  701. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js +0 -9
  702. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/index.js +0 -3
  703. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js +0 -230
  704. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-manager.js +0 -87
  705. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js +0 -32
  706. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/node-http2-handler.js +0 -169
  707. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/readable.mock.js +0 -21
  708. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/server.mock.js +0 -88
  709. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js +0 -36
  710. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-request-timeout.js +0 -21
  711. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js +0 -22
  712. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js +0 -23
  713. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/collector.js +0 -8
  714. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/index.js +0 -41
  715. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/stream-collector/readable.mock.js +0 -21
  716. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/timing.js +0 -4
  717. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-es/write-request-body.js +0 -63
  718. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/build-abort-error.d.ts +0 -10
  719. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/constants.d.ts +0 -5
  720. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/get-transformed-headers.d.ts +0 -4
  721. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/index.d.ts +0 -3
  722. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http-handler.d.ts +0 -46
  723. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-manager.d.ts +0 -24
  724. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-connection-pool.d.ts +0 -12
  725. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/node-http2-handler.d.ts +0 -63
  726. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/readable.mock.d.ts +0 -13
  727. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/server.mock.d.ts +0 -12
  728. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-connection-timeout.d.ts +0 -2
  729. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-request-timeout.d.ts +0 -6
  730. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-keep-alive.d.ts +0 -6
  731. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/set-socket-timeout.d.ts +0 -2
  732. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/collector.d.ts +0 -5
  733. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/index.d.ts +0 -6
  734. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/stream-collector/readable.mock.d.ts +0 -13
  735. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/timing.d.ts +0 -8
  736. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/build-abort-error.d.ts +0 -10
  737. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/constants.d.ts +0 -5
  738. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/get-transformed-headers.d.ts +0 -4
  739. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/index.d.ts +0 -3
  740. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http-handler.d.ts +0 -46
  741. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-manager.d.ts +0 -24
  742. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-connection-pool.d.ts +0 -12
  743. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/node-http2-handler.d.ts +0 -63
  744. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/readable.mock.d.ts +0 -13
  745. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/server.mock.d.ts +0 -12
  746. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-connection-timeout.d.ts +0 -2
  747. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-request-timeout.d.ts +0 -6
  748. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-keep-alive.d.ts +0 -6
  749. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/set-socket-timeout.d.ts +0 -2
  750. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/collector.d.ts +0 -5
  751. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/index.d.ts +0 -6
  752. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/stream-collector/readable.mock.d.ts +0 -13
  753. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/timing.d.ts +0 -8
  754. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/ts3.4/write-request-body.d.ts +0 -12
  755. package/packages/pi-ai/node_modules/@smithy/node-http-handler/dist-types/write-request-body.d.ts +0 -12
  756. package/packages/pi-ai/node_modules/@smithy/node-http-handler/package.json +0 -68
  757. package/packages/pi-ai/oauth.d.ts +0 -1
  758. package/packages/pi-ai/oauth.js +0 -1
  759. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → o61X3klsB6C0UE0X1x3PA}/_buildManifest.js +0 -0
  760. /package/dist/web/standalone/.next/static/{j7IBD35UgrL2b298GLK3V → o61X3klsB6C0UE0X1x3PA}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"model-registry-auth-mode.test.js","sourceRoot":"","sources":["../../src/core/model-registry-auth-mode.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\";\nimport { describe, it } from \"node:test\";\nimport type { Api, Model, SimpleStreamOptions, Context, AssistantMessageEventStream } from \"@gsd/pi-ai\";\nimport { getApiProvider } from \"@gsd/pi-ai\";\nimport type { AuthStorage } from \"./auth-storage.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\n\nfunction createRegistry(hasAuthFn?: (provider: string) => boolean): ModelRegistry {\n\tconst authStorage = {\n\t\tsetFallbackResolver: () => {},\n\t\tonCredentialChange: () => {},\n\t\tgetOAuthProviders: () => [],\n\t\tget: () => undefined,\n\t\thasAuth: hasAuthFn ?? (() => false),\n\t\tgetApiKey: async () => undefined,\n\t} as unknown as AuthStorage;\n\n\treturn new ModelRegistry(authStorage, undefined);\n}\n\nfunction createProviderModel(id: string, api?: string): NonNullable<Parameters<ModelRegistry[\"registerProvider\"]>[1][\"models\"]>[number] {\n\treturn {\n\t\tid,\n\t\tname: id,\n\t\tapi: (api ?? \"openai-completions\") as Api,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 128000,\n\t\tmaxTokens: 16384,\n\t};\n}\n\nfunction findModel(registry: ModelRegistry, provider: string, id: string): Model<Api> | undefined {\n\treturn registry.getAvailable().find((m) => m.provider === provider && m.id === id);\n}\n\nfunction makeModel(provider: string, id: string, api: string): Model<Api> {\n\treturn {\n\t\tid,\n\t\tname: id,\n\t\tapi: api as Api,\n\t\tprovider,\n\t\tbaseUrl: `${provider}:`,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 128000,\n\t\tmaxTokens: 16384,\n\t};\n}\n\nfunction makeContext(): Context {\n\treturn {\n\t\tsystemPrompt: \"test\",\n\t\tmessages: [{ role: \"user\", content: \"hello\", timestamp: Date.now() }],\n\t};\n}\n\n/** No-op streamSimple for tests that need one to pass validation but don't inspect it. */\nconst noopStreamSimple = (_model: Model<Api>, _context: Context, _options?: SimpleStreamOptions) => {\n\treturn {\n\t\t[Symbol.asyncIterator]() { return { next: async () => ({ value: undefined, done: true as const }) }; },\n\t\tresult: () => Promise.resolve({ role: \"assistant\" as const, content: [], api: \"test\" as Api, provider: \"test\", model: \"test\", usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, stopReason: \"stop\" as const, timestamp: Date.now() }),\n\t\tpush: () => {},\n\t\tend: () => {},\n\t} as unknown as AssistantMessageEventStream;\n};\n\n/** Create a spy streamSimple that captures the options it receives and returns a stub stream. */\nfunction createStreamSpy(): {\n\tstreamSimple: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\tgetCapturedOptions: () => SimpleStreamOptions | undefined;\n} {\n\tlet capturedOptions: SimpleStreamOptions | undefined;\n\tconst streamSimple = (_model: Model<Api>, _context: Context, options?: SimpleStreamOptions) => {\n\t\tcapturedOptions = options;\n\t\t// Return a minimal stub that satisfies AssistantMessageEventStream\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]() { return { next: async () => ({ value: undefined, done: true as const }) }; },\n\t\t\tresult: () => Promise.resolve({ role: \"assistant\" as const, content: [], api: \"test\" as Api, provider: \"test\", model: \"test\", usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, stopReason: \"stop\" as const, timestamp: Date.now() }),\n\t\t\tpush: () => {},\n\t\t\tend: () => {},\n\t\t} as unknown as AssistantMessageEventStream;\n\t};\n\treturn { streamSimple, getCapturedOptions: () => capturedOptions };\n}\n\n// ─── Registration ─────────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — registration\", () => {\n\tit(\"registers externalCli provider with streamSimple and without apiKey/oauth\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.doesNotThrow(() => {\n\t\t\tregistry.registerProvider(\"cli-provider\", {\n\t\t\t\tauthMode: \"externalCli\",\n\t\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"cli-model\")],\n\t\t\t});\n\t\t});\n\t});\n\n\tit(\"registers none provider with streamSimple and without apiKey/oauth\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.doesNotThrow(() => {\n\t\t\tregistry.registerProvider(\"none-provider\", {\n\t\t\t\tauthMode: \"none\",\n\t\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"local-model\")],\n\t\t\t});\n\t\t});\n\t});\n\n\tit(\"rejects apiKey provider without apiKey or oauth — message mentions authMode\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"apikey-provider\", {\n\t\t\t\tauthMode: \"apiKey\",\n\t\t\t\tbaseUrl: \"https://api.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"authMode\"), \"error message must mention authMode\");\n\t\t\tassert.ok(err.message.includes(\"externalCli\"), \"error message must suggest externalCli\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects provider with no authMode and no apiKey/oauth (defaults to apiKey)\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"bare-provider\", {\n\t\t\t\tbaseUrl: \"https://api.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"authMode\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects externalCli provider without streamSimple\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"cli-no-stream\", {\n\t\t\t\tauthMode: \"externalCli\",\n\t\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"streamSimple\"), \"error message must mention streamSimple\");\n\t\t\tassert.ok(err.message.includes(\"externalCli\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects none provider without streamSimple\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"none-no-stream\", {\n\t\t\t\tauthMode: \"none\",\n\t\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"streamSimple\"), \"error message must mention streamSimple\");\n\t\t\tassert.ok(err.message.includes(\"none\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects externalCli provider that also sets apiKey\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"cli-with-key\", {\n\t\t\t\tauthMode: \"externalCli\",\n\t\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tapiKey: \"SHOULD_NOT_EXIST\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"apiKey\"), \"error message must mention apiKey\");\n\t\t\tassert.ok(err.message.includes(\"externalCli\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects none provider that also sets apiKey\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"none-with-key\", {\n\t\t\t\tauthMode: \"none\",\n\t\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tapiKey: \"SHOULD_NOT_EXIST\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"apiKey\"), \"error message must mention apiKey\");\n\t\t\tassert.ok(err.message.includes(\"none\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n});\n\n// ─── getProviderAuthMode ──────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — getProviderAuthMode\", () => {\n\tit(\"returns apiKey for unregistered (built-in) providers\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.equal(registry.getProviderAuthMode(\"anthropic\"), \"apiKey\");\n\t});\n\n\tit(\"returns explicit authMode when set\", () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.getProviderAuthMode(\"cli\"), \"externalCli\");\n\t});\n\n\tit(\"returns none when authMode is none\", () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.getProviderAuthMode(\"local\"), \"none\");\n\t});\n});\n\n// ─── isProviderRequestReady ───────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — isProviderRequestReady\", () => {\n\tit(\"returns true for externalCli without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"cli\"), true);\n\t});\n\n\tit(\"returns true for none without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"local\"), true);\n\t});\n\n\tit(\"returns false for apiKey provider without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tassert.equal(registry.isProviderRequestReady(\"anthropic\"), false);\n\t});\n\n\tit(\"returns true for apiKey provider with stored auth\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tassert.equal(registry.isProviderRequestReady(\"anthropic\"), true);\n\t});\n});\n\n// ─── isReady callback ─────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — isReady callback\", () => {\n\tit(\"calls isReady and returns its result for externalCli provider\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli-down\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tisReady: () => false,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"cli-down\"), false);\n\t});\n\n\tit(\"calls isReady for apiKey provider (overrides hasAuth)\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tregistry.registerProvider(\"strict-provider\", {\n\t\t\tapiKey: \"MY_KEY\",\n\t\t\tbaseUrl: \"https://api.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tisReady: () => false,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"strict-provider\"), false);\n\t});\n\n\tit(\"isReady returning true makes provider available\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"healthy-cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tisReady: () => true,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"healthy-cli\"), true);\n\t});\n\n\tit(\"falls through to default behavior when isReady not provided\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"no-callback\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\t// externalCli without isReady → true (default)\n\t\tassert.equal(registry.isProviderRequestReady(\"no-callback\"), true);\n\t});\n});\n\n// ─── getAvailable ─────────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — getAvailable\", () => {\n\tit(\"includes externalCli models without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"cli-model\")],\n\t\t});\n\t\tassert.ok(findModel(registry, \"cli\", \"cli-model\"));\n\t});\n\n\tit(\"includes none models without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"local-model\")],\n\t\t});\n\t\tassert.ok(findModel(registry, \"local\", \"local-model\"));\n\t});\n\n\tit(\"excludes externalCli models when isReady returns false\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli-down\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tisReady: () => false,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(findModel(registry, \"cli-down\", \"m\"), undefined);\n\t});\n\n\tit(\"excludes apiKey models without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tconst available = registry.getAvailable();\n\t\tassert.equal(available.length, 0);\n\t});\n});\n\n// ─── getApiKey ────────────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — getApiKey\", () => {\n\tit(\"returns undefined for externalCli provider\", async () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tconst model = registry.getAll().find((m) => m.provider === \"cli\")!;\n\t\tassert.equal(await registry.getApiKey(model), undefined);\n\t});\n\n\tit(\"returns undefined for none provider\", async () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tconst model = registry.getAll().find((m) => m.provider === \"local\")!;\n\t\tassert.equal(await registry.getApiKey(model), undefined);\n\t});\n\n\tit(\"delegates to authStorage for apiKey provider\", async () => {\n\t\tconst registry = createRegistry();\n\t\tconst key = await registry.getApiKeyForProvider(\"anthropic\");\n\t\tassert.equal(key, undefined);\n\t});\n});\n\n// ─── streamSimple apiKey stripping ────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — streamSimple apiKey boundary\", () => {\n\tit(\"strips apiKey from options for externalCli provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `ext-cli-strip-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"cli-strip\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"cli-strip\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"should-be-stripped\", maxTokens: 1024 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must not exist in options for externalCli provider\");\n\t\tassert.equal(captured.maxTokens, 1024, \"other options must pass through\");\n\t});\n\n\tit(\"strips apiKey from options for none provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `none-strip-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"none-strip\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"none-strip\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"should-be-stripped\", maxTokens: 2048 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must not exist in options for none provider\");\n\t\tassert.equal(captured.maxTokens, 2048, \"other options must pass through\");\n\t});\n\n\tit(\"preserves apiKey in options for apiKey provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `apikey-preserve-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"apikey-preserve\", {\n\t\t\tapiKey: \"MY_KEY\",\n\t\t\tbaseUrl: \"https://api.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"apikey-preserve\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"sk-real-key\", maxTokens: 4096 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(captured.apiKey, \"sk-real-key\", \"apiKey must be preserved for apiKey provider\");\n\t\tassert.equal(captured.maxTokens, 4096, \"other options must pass through\");\n\t});\n\n\tit(\"handles undefined options for externalCli provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `ext-cli-undef-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"cli-undef\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"cli-undef\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\tundefined,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured !== undefined, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must not exist even when options is undefined\");\n\t});\n\n\tit(\"strips apiKey but preserves signal and other fields for externalCli\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `ext-cli-fields-${Date.now()}`;\n\t\tconst abortController = new AbortController();\n\n\t\tregistry.registerProvider(\"cli-fields\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"cli-fields\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"strip-me\", maxTokens: 8192, signal: abortController.signal, reasoning: \"high\" } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must be stripped\");\n\t\tassert.equal(captured.maxTokens, 8192, \"maxTokens must pass through\");\n\t\tassert.equal(captured.signal, abortController.signal, \"signal must pass through\");\n\t\tassert.equal((captured as Record<string, unknown>).reasoning, \"high\", \"reasoning must pass through\");\n\t});\n});\n\n// ─── Provider-scoped stream routing (#2533) ───────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — provider-scoped stream routing\", () => {\n\tit(\"does not clobber built-in stream handler when custom provider uses same api\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tconst customSpy = createStreamSpy();\n\n\t\t// Register a custom provider with the same API type as a built-in (anthropic-messages).\n\t\t// This simulates the claude-code-cli extension registering with api: \"anthropic-messages\".\n\t\tregistry.registerProvider(\"custom-cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"local://custom\",\n\t\t\tapi: \"anthropic-messages\",\n\t\t\tstreamSimple: customSpy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"custom-model\", \"anthropic-messages\")],\n\t\t});\n\n\t\t// The built-in anthropic-messages provider should still be accessible\n\t\t// when calling streamSimple with a model from the built-in provider.\n\t\tconst provider = getApiProvider(\"anthropic-messages\" as Api);\n\t\tassert.ok(provider, \"anthropic-messages provider must still be registered\");\n\n\t\t// Call with a built-in anthropic model — should NOT hit the custom spy.\n\t\t// The built-in handler will throw (no API key), which proves the routing\n\t\t// correctly delegates to the built-in instead of the custom handler.\n\t\tassert.throws(\n\t\t\t() => provider.streamSimple(\n\t\t\t\tmakeModel(\"anthropic\", \"claude-sonnet-4-6\", \"anthropic-messages\"),\n\t\t\t\tmakeContext(),\n\t\t\t\t{ maxTokens: 4096 } as SimpleStreamOptions,\n\t\t\t),\n\t\t\t(err: Error) => err.message.includes(\"API key\"),\n\t\t\t\"built-in Anthropic handler must be invoked (throws because no API key in tests)\",\n\t\t);\n\n\t\tassert.equal(\n\t\t\tcustomSpy.getCapturedOptions(),\n\t\t\tundefined,\n\t\t\t\"custom provider's streamSimple must NOT be called for anthropic provider models\",\n\t\t);\n\t});\n\n\tit(\"routes to custom provider when model.provider matches\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tconst customSpy = createStreamSpy();\n\n\t\tregistry.registerProvider(\"custom-cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"local://custom\",\n\t\t\tapi: \"anthropic-messages\",\n\t\t\tstreamSimple: customSpy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"custom-model\", \"anthropic-messages\")],\n\t\t});\n\n\t\tconst provider = getApiProvider(\"anthropic-messages\" as Api);\n\t\tassert.ok(provider);\n\n\t\t// Call with the custom provider's model — should hit the custom spy\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"custom-cli\", \"custom-model\", \"anthropic-messages\"),\n\t\t\tmakeContext(),\n\t\t\t{ maxTokens: 2048 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = customSpy.getCapturedOptions();\n\t\tassert.ok(captured, \"custom provider's streamSimple must be called for its own models\");\n\t\tassert.equal(captured.maxTokens, 2048);\n\t});\n});\n"]}
1
+ {"version":3,"file":"model-registry-auth-mode.test.js","sourceRoot":"","sources":["../../src/core/model-registry-auth-mode.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAwB,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,SAAS,cAAc,CAAC,SAAyC;IAChE,MAAM,WAAW,GAAG;QACnB,mBAAmB,EAAE,GAAG,EAAE,GAAE,CAAC;QAC7B,kBAAkB,EAAE,GAAG,EAAE,GAAE,CAAC;QAC5B,iBAAiB,EAAE,GAAG,EAAE,CAAC,EAAE;QAC3B,GAAG,EAAE,GAAG,EAAE,CAAC,SAAS;QACpB,OAAO,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;QACnC,SAAS,EAAE,KAAK,IAAI,EAAE,CAAC,SAAS;KACN,CAAC;IAE5B,OAAO,IAAI,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,sBAAsB,CAAC,OAAwB,EAAE;IACzD,OAAO,IAAI,aAAa,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAU,EAAE,GAAY;IACpD,OAAO;QACN,EAAE;QACF,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,CAAC,GAAG,IAAI,oBAAoB,CAAQ;QACzC,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;QAC1D,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,KAAK;KAChB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,QAAuB,EAAE,QAAgB,EAAE,EAAU;IACvE,OAAO,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,EAAU,EAAE,GAAW;IAC3D,OAAO;QACN,EAAE;QACF,IAAI,EAAE,EAAE;QACR,GAAG,EAAE,GAAU;QACf,QAAQ;QACR,OAAO,EAAE,GAAG,QAAQ,GAAG;QACvB,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE;QAC1D,aAAa,EAAE,MAAM;QACrB,SAAS,EAAE,KAAK;KAChB,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IACnB,OAAO;QACN,YAAY,EAAE,MAAM;QACpB,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;KACrE,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,MAAM,gBAAgB,GAAG,CAAC,MAAkB,EAAE,QAAiB,EAAE,QAA8B,EAAE,EAAE;IAClG,OAAO;QACN,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtG,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAoB,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,MAAe,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QACtU,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;QACd,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;KAC6B,CAAC;AAC7C,CAAC,CAAC;AAEF,iGAAiG;AACjG,SAAS,eAAe;IAIvB,IAAI,eAAgD,CAAC;IACrD,MAAM,YAAY,GAAG,CAAC,MAAkB,EAAE,QAAiB,EAAE,OAA6B,EAAE,EAAE;QAC7F,eAAe,GAAG,OAAO,CAAC;QAC1B,mEAAmE;QACnE,OAAO;YACN,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAa,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACtG,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAoB,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,MAAe,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACtU,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;YACd,GAAG,EAAE,GAAG,EAAE,GAAE,CAAC;SAC6B,CAAC;IAC7C,CAAC,CAAC;IACF,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE,CAAC;AACpE,CAAC;AAED,iFAAiF;AAEjF,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACpF,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAC9B,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE;YACxB,QAAQ,CAAC,gBAAgB,CAAC,cAAc,EAAE;gBACzC,QAAQ,EAAE,aAAa;gBACvB,OAAO,EAAE,mBAAmB;gBAC5B,GAAG,EAAE,oBAAoB;gBACzB,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;aAC1C,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC7E,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAC9B,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE;YACxB,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE;gBAC1C,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,wBAAwB;gBACjC,GAAG,EAAE,oBAAoB;gBACzB,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;aAC5C,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACtF,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YAClB,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,EAAE;gBAC5C,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,mBAAmB;gBAC5B,GAAG,EAAE,oBAAoB;gBACzB,MAAM,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;aACtC,CAAC,CAAC;QACJ,CAAC,EAAE,CAAC,GAAU,EAAE,EAAE;YACjB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,qCAAqC,CAAC,CAAC;YACnF,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,wCAAwC,CAAC,CAAC;YACzF,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACrF,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YAClB,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE;gBAC1C,OAAO,EAAE,mBAAmB;gBAC5B,GAAG,EAAE,oBAAoB;gBACzB,MAAM,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;aACtC,CAAC,CAAC;QACJ,CAAC,EAAE,CAAC,GAAU,EAAE,EAAE;YACjB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,qCAAqC,CAAC,CAAC;YACnF,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC5D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YAClB,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE;gBAC1C,QAAQ,EAAE,aAAa;gBACvB,OAAO,EAAE,mBAAmB;gBAC5B,GAAG,EAAE,oBAAoB;gBACzB,MAAM,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;aACtC,CAAC,CAAC;QACJ,CAAC,EAAE,CAAC,GAAU,EAAE,EAAE;YACjB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,yCAAyC,CAAC,CAAC;YAC3F,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,qCAAqC,CAAC,CAAC;YACtF,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACrD,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YAClB,QAAQ,CAAC,gBAAgB,CAAC,gBAAgB,EAAE;gBAC3C,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,wBAAwB;gBACjC,GAAG,EAAE,oBAAoB;gBACzB,MAAM,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;aACtC,CAAC,CAAC;QACJ,CAAC,EAAE,CAAC,GAAU,EAAE,EAAE;YACjB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,yCAAyC,CAAC,CAAC;YAC3F,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,qCAAqC,CAAC,CAAC;YAC/E,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC7D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YAClB,QAAQ,CAAC,gBAAgB,CAAC,cAAc,EAAE;gBACzC,QAAQ,EAAE,aAAa;gBACvB,OAAO,EAAE,mBAAmB;gBAC5B,GAAG,EAAE,oBAAoB;gBACzB,MAAM,EAAE,kBAAkB;gBAC1B,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;aACtC,CAAC,CAAC;QACJ,CAAC,EAAE,CAAC,GAAU,EAAE,EAAE;YACjB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,mCAAmC,CAAC,CAAC;YAC/E,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,qCAAqC,CAAC,CAAC;YACtF,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE;YAClB,QAAQ,CAAC,gBAAgB,CAAC,eAAe,EAAE;gBAC1C,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,wBAAwB;gBACjC,GAAG,EAAE,oBAAoB;gBACzB,MAAM,EAAE,kBAAkB;gBAC1B,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;aACtC,CAAC,CAAC;QACJ,CAAC,EAAE,CAAC,GAAU,EAAE,EAAE;YACjB,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,mCAAmC,CAAC,CAAC;YAC/E,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,qCAAqC,CAAC,CAAC;YAC/E,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,8CAA8C,EAAE,GAAG,EAAE;IAC7D,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC/D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE;YAChC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,gBAAgB;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE;YAClC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,wBAAwB;YACjC,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,gBAAgB;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAChE,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC3D,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7C,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE;YAChC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,gBAAgB;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7C,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE;YAClC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,wBAAwB;YACjC,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,gBAAgB;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAChE,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC5D,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IAC1D,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACxE,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7C,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE;YACrC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,gBAAgB;YAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK;YACpB,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAChE,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5C,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,EAAE;YAC5C,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,oBAAoB;YACzB,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK;YACpB,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7C,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE;YACxC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,gBAAgB;YAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI;YACnB,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACtE,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7C,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE;YACxC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,gBAAgB;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;SAClC,CAAC,CAAC;QACH,+CAA+C;QAC/C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7C,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE;YAChC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,gBAAgB;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;SAC1C,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACnD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7C,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE;YAClC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,wBAAwB;YACjC,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,gBAAgB;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;SAC5C,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QACjE,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7C,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE;YACrC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,gBAAgB;YAC9B,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK;YACpB,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACrD,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC7E,MAAM,QAAQ,GAAG,sBAAsB,CAAC;YACvC,cAAc,EAAE;gBACf,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,cAAc;gBACtB,OAAO,EAAE,eAAe;gBACxB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM;gBAC5B,SAAS,EAAE,UAAU;aACrB;SACD,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,EAAE,SAAS,CAAC,CAAC;QAC5E,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;QAClE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,eAAe,CAAC,EAAE,SAAS,CAAC,CAAC;QAC9E,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;QACzD,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QACjE,MAAM,QAAQ,GAAG,sBAAsB,CAAC;YACvC,MAAM,EAAE;gBACP,IAAI,EAAE,SAAS;gBACf,GAAG,EAAE,SAAS;aACd;SACD,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IACnD,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,EAAE;YAChC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,gBAAgB;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAE,CAAC;QACnE,MAAM,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACpD,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE;YAClC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,wBAAwB;YACjC,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,gBAAgB;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAE,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,oBAAoB,CAAC,WAAW,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACtE,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC9D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,iBAAiB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAE9C,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE;YACtC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,OAAc;YACnB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAc,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,6CAA6C,CAAC,CAAC;QAEnE,QAAQ,CAAC,YAAY,CACpB,SAAS,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,EACpC,WAAW,EAAE,EACb,EAAE,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,IAAI,EAAyB,CACxE,CAAC;QAEF,MAAM,QAAQ,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,oCAAoC,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,QAAQ,EAAE,KAAK,EAAE,2DAA2D,CAAC,CAAC;QACvG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,iCAAiC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACvD,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,cAAc,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAE3C,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE;YACvC,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,wBAAwB;YACjC,GAAG,EAAE,OAAc;YACnB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAc,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,6CAA6C,CAAC,CAAC;QAEnE,QAAQ,CAAC,YAAY,CACpB,SAAS,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,EACrC,WAAW,EAAE,EACb,EAAE,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,IAAI,EAAyB,CACxE,CAAC;QAEF,MAAM,QAAQ,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,oCAAoC,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,QAAQ,EAAE,KAAK,EAAE,oDAAoD,CAAC,CAAC;QAChG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,iCAAiC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC1D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,mBAAmB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAEhD,QAAQ,CAAC,gBAAgB,CAAC,iBAAiB,EAAE;YAC5C,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,OAAc;YACnB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAc,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,6CAA6C,CAAC,CAAC;QAEnE,QAAQ,CAAC,YAAY,CACpB,SAAS,CAAC,iBAAiB,EAAE,GAAG,EAAE,OAAO,CAAC,EAC1C,WAAW,EAAE,EACb,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAyB,CACjE,CAAC;QAEF,MAAM,QAAQ,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,oCAAoC,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,8CAA8C,CAAC,CAAC;QAC7F,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,iCAAiC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC7D,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,iBAAiB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAE9C,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE;YACtC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,OAAc;YACnB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAc,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,6CAA6C,CAAC,CAAC;QAEnE,QAAQ,CAAC,YAAY,CACpB,SAAS,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,EACpC,WAAW,EAAE,EACb,SAAS,CACT,CAAC;QAEF,MAAM,QAAQ,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,QAAQ,KAAK,SAAS,EAAE,oCAAoC,CAAC,CAAC;QACxE,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,QAAQ,EAAE,KAAK,EAAE,sDAAsD,CAAC,CAAC;IACnG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC9E,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,kBAAkB,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC/C,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;QAE9C,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE;YACvC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,OAAc;YACnB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,MAAM,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;SAC3C,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAc,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,6CAA6C,CAAC,CAAC;QAEnE,QAAQ,CAAC,YAAY,CACpB,SAAS,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,CAAC,EACrC,WAAW,EAAE,EACb,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAyB,CACjH,CAAC;QAEF,MAAM,QAAQ,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;QAC1C,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,oCAAoC,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,QAAQ,EAAE,KAAK,EAAE,yBAAyB,CAAC,CAAC;QACrE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,6BAA6B,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;QAClF,MAAM,CAAC,KAAK,CAAE,QAAoC,CAAC,SAAS,EAAE,MAAM,EAAE,6BAA6B,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,iFAAiF;AAEjF,QAAQ,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACxE,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACtF,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;QAEpC,wFAAwF;QACxF,2FAA2F;QAC3F,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE;YACvC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,gBAAgB;YACzB,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,MAAM,EAAE,CAAC,mBAAmB,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;SACnE,CAAC,CAAC;QAEH,sEAAsE;QACtE,qEAAqE;QACrE,MAAM,QAAQ,GAAG,cAAc,CAAC,oBAA2B,CAAC,CAAC;QAC7D,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,sDAAsD,CAAC,CAAC;QAE5E,wEAAwE;QACxE,yEAAyE;QACzE,qEAAqE;QACrE,MAAM,CAAC,MAAM,CACZ,GAAG,EAAE,CAAC,QAAQ,CAAC,YAAY,CAC1B,SAAS,CAAC,WAAW,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,EACjE,WAAW,EAAE,EACb,EAAE,SAAS,EAAE,IAAI,EAAyB,CAC1C,EACD,CAAC,GAAU,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAC/C,iFAAiF,CACjF,CAAC;QAEF,MAAM,CAAC,KAAK,CACX,SAAS,CAAC,kBAAkB,EAAE,EAC9B,SAAS,EACT,iFAAiF,CACjF,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAChE,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,eAAe,EAAE,CAAC;QAEpC,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE;YACvC,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,gBAAgB;YACzB,GAAG,EAAE,oBAAoB;YACzB,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,MAAM,EAAE,CAAC,mBAAmB,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;SACnE,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,cAAc,CAAC,oBAA2B,CAAC,CAAC;QAC7D,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAEpB,oEAAoE;QACpE,QAAQ,CAAC,YAAY,CACpB,SAAS,CAAC,YAAY,EAAE,cAAc,EAAE,oBAAoB,CAAC,EAC7D,WAAW,EAAE,EACb,EAAE,SAAS,EAAE,IAAI,EAAyB,CAC1C,CAAC;QAEF,MAAM,QAAQ,GAAG,SAAS,CAAC,kBAAkB,EAAE,CAAC;QAChD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,kEAAkE,CAAC,CAAC;QACxF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import assert from \"node:assert/strict\";\nimport { describe, it } from \"node:test\";\nimport type { Api, Model, SimpleStreamOptions, Context, AssistantMessageEventStream } from \"@gsd/pi-ai\";\nimport { getApiProvider } from \"@gsd/pi-ai\";\nimport { AuthStorage, type AuthStorageData } from \"./auth-storage.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\n\nfunction createRegistry(hasAuthFn?: (provider: string) => boolean): ModelRegistry {\n\tconst authStorage = {\n\t\tsetFallbackResolver: () => {},\n\t\tonCredentialChange: () => {},\n\t\tgetOAuthProviders: () => [],\n\t\tget: () => undefined,\n\t\thasAuth: hasAuthFn ?? (() => false),\n\t\tgetApiKey: async () => undefined,\n\t} as unknown as AuthStorage;\n\n\treturn new ModelRegistry(authStorage, undefined);\n}\n\nfunction createInMemoryRegistry(data: AuthStorageData = {}): ModelRegistry {\n\treturn new ModelRegistry(AuthStorage.inMemory(data), undefined);\n}\n\nfunction createProviderModel(id: string, api?: string): NonNullable<Parameters<ModelRegistry[\"registerProvider\"]>[1][\"models\"]>[number] {\n\treturn {\n\t\tid,\n\t\tname: id,\n\t\tapi: (api ?? \"openai-completions\") as Api,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 128000,\n\t\tmaxTokens: 16384,\n\t};\n}\n\nfunction findModel(registry: ModelRegistry, provider: string, id: string): Model<Api> | undefined {\n\treturn registry.getAvailable().find((m) => m.provider === provider && m.id === id);\n}\n\nfunction makeModel(provider: string, id: string, api: string): Model<Api> {\n\treturn {\n\t\tid,\n\t\tname: id,\n\t\tapi: api as Api,\n\t\tprovider,\n\t\tbaseUrl: `${provider}:`,\n\t\treasoning: false,\n\t\tinput: [\"text\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: 128000,\n\t\tmaxTokens: 16384,\n\t};\n}\n\nfunction makeContext(): Context {\n\treturn {\n\t\tsystemPrompt: \"test\",\n\t\tmessages: [{ role: \"user\", content: \"hello\", timestamp: Date.now() }],\n\t};\n}\n\n/** No-op streamSimple for tests that need one to pass validation but don't inspect it. */\nconst noopStreamSimple = (_model: Model<Api>, _context: Context, _options?: SimpleStreamOptions) => {\n\treturn {\n\t\t[Symbol.asyncIterator]() { return { next: async () => ({ value: undefined, done: true as const }) }; },\n\t\tresult: () => Promise.resolve({ role: \"assistant\" as const, content: [], api: \"test\" as Api, provider: \"test\", model: \"test\", usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, stopReason: \"stop\" as const, timestamp: Date.now() }),\n\t\tpush: () => {},\n\t\tend: () => {},\n\t} as unknown as AssistantMessageEventStream;\n};\n\n/** Create a spy streamSimple that captures the options it receives and returns a stub stream. */\nfunction createStreamSpy(): {\n\tstreamSimple: (model: Model<Api>, context: Context, options?: SimpleStreamOptions) => AssistantMessageEventStream;\n\tgetCapturedOptions: () => SimpleStreamOptions | undefined;\n} {\n\tlet capturedOptions: SimpleStreamOptions | undefined;\n\tconst streamSimple = (_model: Model<Api>, _context: Context, options?: SimpleStreamOptions) => {\n\t\tcapturedOptions = options;\n\t\t// Return a minimal stub that satisfies AssistantMessageEventStream\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]() { return { next: async () => ({ value: undefined, done: true as const }) }; },\n\t\t\tresult: () => Promise.resolve({ role: \"assistant\" as const, content: [], api: \"test\" as Api, provider: \"test\", model: \"test\", usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, totalTokens: 0, cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 } }, stopReason: \"stop\" as const, timestamp: Date.now() }),\n\t\t\tpush: () => {},\n\t\t\tend: () => {},\n\t\t} as unknown as AssistantMessageEventStream;\n\t};\n\treturn { streamSimple, getCapturedOptions: () => capturedOptions };\n}\n\n// ─── Registration ─────────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — registration\", () => {\n\tit(\"registers externalCli provider with streamSimple and without apiKey/oauth\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.doesNotThrow(() => {\n\t\t\tregistry.registerProvider(\"cli-provider\", {\n\t\t\t\tauthMode: \"externalCli\",\n\t\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"cli-model\")],\n\t\t\t});\n\t\t});\n\t});\n\n\tit(\"registers none provider with streamSimple and without apiKey/oauth\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.doesNotThrow(() => {\n\t\t\tregistry.registerProvider(\"none-provider\", {\n\t\t\t\tauthMode: \"none\",\n\t\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"local-model\")],\n\t\t\t});\n\t\t});\n\t});\n\n\tit(\"rejects apiKey provider without apiKey or oauth — message mentions authMode\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"apikey-provider\", {\n\t\t\t\tauthMode: \"apiKey\",\n\t\t\t\tbaseUrl: \"https://api.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"authMode\"), \"error message must mention authMode\");\n\t\t\tassert.ok(err.message.includes(\"externalCli\"), \"error message must suggest externalCli\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects provider with no authMode and no apiKey/oauth (defaults to apiKey)\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"bare-provider\", {\n\t\t\t\tbaseUrl: \"https://api.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"authMode\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects externalCli provider without streamSimple\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"cli-no-stream\", {\n\t\t\t\tauthMode: \"externalCli\",\n\t\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"streamSimple\"), \"error message must mention streamSimple\");\n\t\t\tassert.ok(err.message.includes(\"externalCli\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects none provider without streamSimple\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"none-no-stream\", {\n\t\t\t\tauthMode: \"none\",\n\t\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"streamSimple\"), \"error message must mention streamSimple\");\n\t\t\tassert.ok(err.message.includes(\"none\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects externalCli provider that also sets apiKey\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"cli-with-key\", {\n\t\t\t\tauthMode: \"externalCli\",\n\t\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tapiKey: \"SHOULD_NOT_EXIST\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"apiKey\"), \"error message must mention apiKey\");\n\t\t\tassert.ok(err.message.includes(\"externalCli\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n\n\tit(\"rejects none provider that also sets apiKey\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tassert.throws(() => {\n\t\t\tregistry.registerProvider(\"none-with-key\", {\n\t\t\t\tauthMode: \"none\",\n\t\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\t\tapi: \"openai-completions\",\n\t\t\t\tapiKey: \"SHOULD_NOT_EXIST\",\n\t\t\t\tstreamSimple: spy.streamSimple,\n\t\t\t\tmodels: [createProviderModel(\"model\")],\n\t\t\t});\n\t\t}, (err: Error) => {\n\t\t\tassert.ok(err.message.includes(\"apiKey\"), \"error message must mention apiKey\");\n\t\t\tassert.ok(err.message.includes(\"none\"), \"error message must mention authMode\");\n\t\t\treturn true;\n\t\t});\n\t});\n});\n\n// ─── getProviderAuthMode ──────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — getProviderAuthMode\", () => {\n\tit(\"returns apiKey for unregistered (built-in) providers\", () => {\n\t\tconst registry = createRegistry();\n\t\tassert.equal(registry.getProviderAuthMode(\"anthropic\"), \"apiKey\");\n\t});\n\n\tit(\"returns explicit authMode when set\", () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.getProviderAuthMode(\"cli\"), \"externalCli\");\n\t});\n\n\tit(\"returns none when authMode is none\", () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.getProviderAuthMode(\"local\"), \"none\");\n\t});\n});\n\n// ─── isProviderRequestReady ───────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — isProviderRequestReady\", () => {\n\tit(\"returns true for externalCli without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"cli\"), true);\n\t});\n\n\tit(\"returns true for none without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"local\"), true);\n\t});\n\n\tit(\"returns false for apiKey provider without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tassert.equal(registry.isProviderRequestReady(\"anthropic\"), false);\n\t});\n\n\tit(\"returns true for apiKey provider with stored auth\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tassert.equal(registry.isProviderRequestReady(\"anthropic\"), true);\n\t});\n});\n\n// ─── isReady callback ─────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — isReady callback\", () => {\n\tit(\"calls isReady and returns its result for externalCli provider\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli-down\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tisReady: () => false,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"cli-down\"), false);\n\t});\n\n\tit(\"calls isReady for apiKey provider (overrides hasAuth)\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tregistry.registerProvider(\"strict-provider\", {\n\t\t\tapiKey: \"MY_KEY\",\n\t\t\tbaseUrl: \"https://api.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tisReady: () => false,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"strict-provider\"), false);\n\t});\n\n\tit(\"isReady returning true makes provider available\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"healthy-cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tisReady: () => true,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(registry.isProviderRequestReady(\"healthy-cli\"), true);\n\t});\n\n\tit(\"falls through to default behavior when isReady not provided\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"no-callback\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\t// externalCli without isReady → true (default)\n\t\tassert.equal(registry.isProviderRequestReady(\"no-callback\"), true);\n\t});\n});\n\n// ─── getAvailable ─────────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — getAvailable\", () => {\n\tit(\"includes externalCli models without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"cli-model\")],\n\t\t});\n\t\tassert.ok(findModel(registry, \"cli\", \"cli-model\"));\n\t});\n\n\tit(\"includes none models without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"local-model\")],\n\t\t});\n\t\tassert.ok(findModel(registry, \"local\", \"local-model\"));\n\t});\n\n\tit(\"excludes externalCli models when isReady returns false\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tregistry.registerProvider(\"cli-down\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tisReady: () => false,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tassert.equal(findModel(registry, \"cli-down\", \"m\"), undefined);\n\t});\n\n\tit(\"excludes apiKey models without stored auth\", () => {\n\t\tconst registry = createRegistry(() => false);\n\t\tconst available = registry.getAvailable();\n\t\tassert.equal(available.length, 0);\n\t});\n\n\tit(\"prunes Codex models removed from ChatGPT-backed openai-codex OAuth\", () => {\n\t\tconst registry = createInMemoryRegistry({\n\t\t\t\"openai-codex\": {\n\t\t\t\ttype: \"oauth\",\n\t\t\t\taccess: \"oauth-access\",\n\t\t\t\trefresh: \"oauth-refresh\",\n\t\t\t\texpires: Date.now() + 60_000,\n\t\t\t\taccountId: \"acct_123\",\n\t\t\t},\n\t\t});\n\n\t\tassert.equal(registry.find(\"openai-codex\", \"gpt-5.1-codex-max\"), undefined);\n\t\tassert.equal(registry.find(\"openai-codex\", \"gpt-5.1\"), undefined);\n\t\tassert.equal(findModel(registry, \"openai-codex\", \"gpt-5.2-codex\"), undefined);\n\t\tassert.ok(registry.find(\"openai-codex\", \"gpt-5.4\"));\n\t\tassert.ok(findModel(registry, \"openai-codex\", \"gpt-5.4\"));\n\t\tassert.ok(registry.find(\"openai-codex\", \"gpt-5.4-mini\"));\n\t\tassert.ok(findModel(registry, \"openai-codex\", \"gpt-5.4-mini\"));\n\t});\n\n\tit(\"keeps API-backed OpenAI Codex-capable models available\", () => {\n\t\tconst registry = createInMemoryRegistry({\n\t\t\topenai: {\n\t\t\t\ttype: \"api_key\",\n\t\t\t\tkey: \"sk-test\",\n\t\t\t},\n\t\t});\n\n\t\tassert.ok(registry.find(\"openai\", \"gpt-5.2-codex\"));\n\t\tassert.ok(findModel(registry, \"openai\", \"gpt-5.2-codex\"));\n\t});\n});\n\n// ─── getApiKey ────────────────────────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — getApiKey\", () => {\n\tit(\"returns undefined for externalCli provider\", async () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tconst model = registry.getAll().find((m) => m.provider === \"cli\")!;\n\t\tassert.equal(await registry.getApiKey(model), undefined);\n\t});\n\n\tit(\"returns undefined for none provider\", async () => {\n\t\tconst registry = createRegistry();\n\t\tregistry.registerProvider(\"local\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: \"openai-completions\",\n\t\t\tstreamSimple: noopStreamSimple,\n\t\t\tmodels: [createProviderModel(\"m\")],\n\t\t});\n\t\tconst model = registry.getAll().find((m) => m.provider === \"local\")!;\n\t\tassert.equal(await registry.getApiKey(model), undefined);\n\t});\n\n\tit(\"delegates to authStorage for apiKey provider\", async () => {\n\t\tconst registry = createRegistry();\n\t\tconst key = await registry.getApiKeyForProvider(\"anthropic\");\n\t\tassert.equal(key, undefined);\n\t});\n});\n\n// ─── streamSimple apiKey stripping ────────────────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — streamSimple apiKey boundary\", () => {\n\tit(\"strips apiKey from options for externalCli provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `ext-cli-strip-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"cli-strip\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"cli-strip\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"should-be-stripped\", maxTokens: 1024 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must not exist in options for externalCli provider\");\n\t\tassert.equal(captured.maxTokens, 1024, \"other options must pass through\");\n\t});\n\n\tit(\"strips apiKey from options for none provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `none-strip-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"none-strip\", {\n\t\t\tauthMode: \"none\",\n\t\t\tbaseUrl: \"http://localhost:11434\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"none-strip\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"should-be-stripped\", maxTokens: 2048 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must not exist in options for none provider\");\n\t\tassert.equal(captured.maxTokens, 2048, \"other options must pass through\");\n\t});\n\n\tit(\"preserves apiKey in options for apiKey provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `apikey-preserve-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"apikey-preserve\", {\n\t\t\tapiKey: \"MY_KEY\",\n\t\t\tbaseUrl: \"https://api.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"apikey-preserve\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"sk-real-key\", maxTokens: 4096 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(captured.apiKey, \"sk-real-key\", \"apiKey must be preserved for apiKey provider\");\n\t\tassert.equal(captured.maxTokens, 4096, \"other options must pass through\");\n\t});\n\n\tit(\"handles undefined options for externalCli provider\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `ext-cli-undef-${Date.now()}`;\n\n\t\tregistry.registerProvider(\"cli-undef\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"cli-undef\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\tundefined,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured !== undefined, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must not exist even when options is undefined\");\n\t});\n\n\tit(\"strips apiKey but preserves signal and other fields for externalCli\", () => {\n\t\tconst registry = createRegistry();\n\t\tconst spy = createStreamSpy();\n\t\tconst apiType = `ext-cli-fields-${Date.now()}`;\n\t\tconst abortController = new AbortController();\n\n\t\tregistry.registerProvider(\"cli-fields\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"https://cli.local\",\n\t\t\tapi: apiType as Api,\n\t\t\tstreamSimple: spy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"m\", apiType)],\n\t\t});\n\n\t\tconst provider = getApiProvider(apiType as Api);\n\t\tassert.ok(provider, \"provider must be registered in api registry\");\n\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"cli-fields\", \"m\", apiType),\n\t\t\tmakeContext(),\n\t\t\t{ apiKey: \"strip-me\", maxTokens: 8192, signal: abortController.signal, reasoning: \"high\" } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = spy.getCapturedOptions();\n\t\tassert.ok(captured, \"streamSimple must have been called\");\n\t\tassert.equal(\"apiKey\" in captured, false, \"apiKey must be stripped\");\n\t\tassert.equal(captured.maxTokens, 8192, \"maxTokens must pass through\");\n\t\tassert.equal(captured.signal, abortController.signal, \"signal must pass through\");\n\t\tassert.equal((captured as Record<string, unknown>).reasoning, \"high\", \"reasoning must pass through\");\n\t});\n});\n\n// ─── Provider-scoped stream routing (#2533) ───────────────────────────────────\n\ndescribe(\"ModelRegistry authMode — provider-scoped stream routing\", () => {\n\tit(\"does not clobber built-in stream handler when custom provider uses same api\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tconst customSpy = createStreamSpy();\n\n\t\t// Register a custom provider with the same API type as a built-in (anthropic-messages).\n\t\t// This simulates the claude-code-cli extension registering with api: \"anthropic-messages\".\n\t\tregistry.registerProvider(\"custom-cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"local://custom\",\n\t\t\tapi: \"anthropic-messages\",\n\t\t\tstreamSimple: customSpy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"custom-model\", \"anthropic-messages\")],\n\t\t});\n\n\t\t// The built-in anthropic-messages provider should still be accessible\n\t\t// when calling streamSimple with a model from the built-in provider.\n\t\tconst provider = getApiProvider(\"anthropic-messages\" as Api);\n\t\tassert.ok(provider, \"anthropic-messages provider must still be registered\");\n\n\t\t// Call with a built-in anthropic model — should NOT hit the custom spy.\n\t\t// The built-in handler will throw (no API key), which proves the routing\n\t\t// correctly delegates to the built-in instead of the custom handler.\n\t\tassert.throws(\n\t\t\t() => provider.streamSimple(\n\t\t\t\tmakeModel(\"anthropic\", \"claude-sonnet-4-6\", \"anthropic-messages\"),\n\t\t\t\tmakeContext(),\n\t\t\t\t{ maxTokens: 4096 } as SimpleStreamOptions,\n\t\t\t),\n\t\t\t(err: Error) => err.message.includes(\"API key\"),\n\t\t\t\"built-in Anthropic handler must be invoked (throws because no API key in tests)\",\n\t\t);\n\n\t\tassert.equal(\n\t\t\tcustomSpy.getCapturedOptions(),\n\t\t\tundefined,\n\t\t\t\"custom provider's streamSimple must NOT be called for anthropic provider models\",\n\t\t);\n\t});\n\n\tit(\"routes to custom provider when model.provider matches\", () => {\n\t\tconst registry = createRegistry(() => true);\n\t\tconst customSpy = createStreamSpy();\n\n\t\tregistry.registerProvider(\"custom-cli\", {\n\t\t\tauthMode: \"externalCli\",\n\t\t\tbaseUrl: \"local://custom\",\n\t\t\tapi: \"anthropic-messages\",\n\t\t\tstreamSimple: customSpy.streamSimple,\n\t\t\tmodels: [createProviderModel(\"custom-model\", \"anthropic-messages\")],\n\t\t});\n\n\t\tconst provider = getApiProvider(\"anthropic-messages\" as Api);\n\t\tassert.ok(provider);\n\n\t\t// Call with the custom provider's model — should hit the custom spy\n\t\tprovider.streamSimple(\n\t\t\tmakeModel(\"custom-cli\", \"custom-model\", \"anthropic-messages\"),\n\t\t\tmakeContext(),\n\t\t\t{ maxTokens: 2048 } as SimpleStreamOptions,\n\t\t);\n\n\t\tconst captured = customSpy.getCapturedOptions();\n\t\tassert.ok(captured, \"custom provider's streamSimple must be called for its own models\");\n\t\tassert.equal(captured.maxTokens, 2048);\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,15 @@
1
+ import { existsSync } from "node:fs";
1
2
  import { join } from "node:path";
3
+ /**
4
+ * Lightweight PATH scan for the `claude` binary — no subprocess, no network.
5
+ * Mirrors the check in src/resources/extensions/gsd/doctor-providers.ts so the
6
+ * legacy Anthropic OAuth self-heal path can only trigger when the user has a
7
+ * working Claude Code CLI to fall back to.
8
+ */
9
+ function isClaudeCodeBinaryInPath() {
10
+ const pathDirs = (process.env.PATH ?? "").split(":");
11
+ return pathDirs.some((dir) => dir && existsSync(join(dir, "claude")));
12
+ }
2
13
  /**
3
14
  * Structured error thrown when all credentials for a provider are in a
4
15
  * backoff window. Carries typed metadata so callers (e.g. the auto-loop)
@@ -288,6 +299,27 @@ export async function createAgentSession(options = {}) {
288
299
  // the retry handler and creating cascading error entries (#3429).
289
300
  const hasAuth = modelRegistry.authStorage.hasAuth(resolvedProvider);
290
301
  if (hasAuth) {
302
+ // Anthropic OAuth was removed in v2.74.0 for TOS compliance (#3952).
303
+ // Users who upgraded from an older version may still have OAuth
304
+ // credentials in auth.json that will never resolve to a valid API key.
305
+ if (resolvedProvider === "anthropic" &&
306
+ modelRegistry.authStorage.hasLegacyOAuthCredential(resolvedProvider)) {
307
+ // Self-heal: strip the stale oauth entry so hasAuth() stops lying
308
+ // about anthropic being configured. This preserves any api_key
309
+ // credentials alongside it.
310
+ const removed = modelRegistry.authStorage.removeLegacyOAuthCredential(resolvedProvider);
311
+ if (removed) {
312
+ console.warn(`[auth] Removed unsupported Anthropic OAuth credential from auth.json (#3952).`);
313
+ }
314
+ if (isClaudeCodeBinaryInPath()) {
315
+ throw new Error(`Removed stale Anthropic OAuth credential (OAuth support removed in v2.74.0). ` +
316
+ `Your current model's provider is set to "anthropic" but the local Claude Code CLI ` +
317
+ `is available — switch the model's provider to "claude-code" in your preferences ` +
318
+ `to use it, or set ANTHROPIC_API_KEY to continue with the Anthropic API directly.`);
319
+ }
320
+ throw new Error(`Removed stale Anthropic OAuth credential (OAuth support removed in v2.74.0). ` +
321
+ `Set ANTHROPIC_API_KEY, run '/login' and paste an API key, or switch to a different provider.`);
322
+ }
291
323
  const expiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);
292
324
  const retryAfterMs = expiry !== undefined ? Math.max(0, expiry - Date.now()) : undefined;
293
325
  throw new CredentialCooldownError(resolvedProvider, retryAfterMs);
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\n\n/**\n * Structured error thrown when all credentials for a provider are in a\n * backoff window. Carries typed metadata so callers (e.g. the auto-loop)\n * can make informed retry decisions instead of string-matching the message.\n */\nexport class CredentialCooldownError extends Error {\n\treadonly code = \"AUTH_COOLDOWN\" as const;\n\t/** Milliseconds until the earliest credential becomes available, or undefined if unknown. */\n\treadonly retryAfterMs: number | undefined;\n\n\tconstructor(provider: string, retryAfterMs?: number) {\n\t\tsuper(\n\t\t\t`All credentials for \"${provider}\" are in a cooldown window. ` +\n\t\t\t\t`Please wait a moment and try again, or switch to a different provider.`,\n\t\t);\n\t\tthis.name = \"CredentialCooldownError\";\n\t\tthis.retryAfterMs = retryAfterMs;\n\t}\n}\nimport { Agent, type AgentMessage, type ThinkingLevel } from \"@gsd/pi-agent-core\";\nimport type { Message, Model } from \"@gsd/pi-ai\";\nimport { getAgentDir, getDocsPath } from \"../config.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport type { ExtensionRunner, LoadExtensionsResult, ToolDefinition } from \"./extensions/index.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { findInitialModel } from \"./model-resolver.js\";\nimport type { ResourceLoader } from \"./resource-loader.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\nimport { time } from \"./timings.js\";\nimport {\n\tallTools,\n\tbashTool,\n\tcodingTools,\n\tcreateBashTool,\n\tcreateCodingTools,\n\tcreateEditTool,\n\tcreateFindTool,\n\tcreateGrepTool,\n\tcreateLsTool,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateWriteTool,\n\teditTool,\n\tfindTool,\n\tgrepTool,\n\thashlineCodingTools,\n\thashlineEditTool,\n\thashlineReadTool,\n\tcreateHashlineCodingTools,\n\tcreateHashlineEditTool,\n\tcreateHashlineReadTool,\n\tlsTool,\n\treadOnlyTools,\n\treadTool,\n\ttype Tool,\n\ttype ToolName,\n\twriteTool,\n} from \"./tools/index.js\";\n\nexport interface CreateAgentSessionOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.pi/agent */\n\tagentDir?: string;\n\n\t/** Auth storage for credentials. Default: AuthStorage.create(agentDir/auth.json) */\n\tauthStorage?: AuthStorage;\n\t/** Model registry. Default: new ModelRegistry(authStorage, agentDir/models.json) */\n\tmodelRegistry?: ModelRegistry;\n\n\t/** Model to use. Default: from settings, else first available */\n\tmodel?: Model<any>;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/** Built-in tools to use. Default: codingTools [read, bash, edit, write] */\n\ttools?: Tool[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\n\t/** Optional: check if the claude-code CLI provider is ready (installed + authed).\n\t * Passed to RetryHandler for third-party block recovery (#3772). */\n\tisClaudeCodeReady?: () => boolean;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Warning if session was restored with a different model than saved */\n\tmodelFallbackMessage?: string;\n}\n\n// Re-exports\n\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tSlashCommandInfo,\n\tSlashCommandLocation,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.js\";\nexport type { PromptTemplate } from \"./prompt-templates.js\";\nexport type { Skill } from \"./skills.js\";\nexport type { Tool } from \"./tools/index.js\";\n\nexport {\n\t// Pre-built tools (use process.cwd())\n\treadTool,\n\tbashTool,\n\teditTool,\n\twriteTool,\n\tgrepTool,\n\tfindTool,\n\tlsTool,\n\tcodingTools,\n\treadOnlyTools,\n\tallTools as allBuiltInTools,\n\t// Tool factories (for custom cwd)\n\tcreateCodingTools,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateWriteTool,\n\tcreateGrepTool,\n\tcreateFindTool,\n\tcreateLsTool,\n\t// Hashline edit mode\n\thashlineCodingTools,\n\thashlineEditTool,\n\thashlineReadTool,\n\tcreateHashlineCodingTools,\n\tcreateHashlineEditTool,\n\tcreateHashlineReadTool,\n};\n\n// Helper Functions\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@gsd/pi-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [readTool, bashTool],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst agentDir = options.agentDir ?? getDefaultAgentDir();\n\tlet resourceLoader = options.resourceLoader;\n\n\t// Use provided or create AuthStorage and ModelRegistry\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst authStorage = options.authStorage ?? AuthStorage.create(authPath);\n\tconst modelRegistry = options.modelRegistry ?? new ModelRegistry(authStorage, modelsPath);\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager = options.sessionManager ?? SessionManager.create(cwd);\n\n\tif (!resourceLoader) {\n\t\tresourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager });\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t}\n\n\t// Flush provider registrations queued during extension loading so that\n\t// extension models (e.g. pi-claude-cli) are visible in the registry before\n\t// findInitialModel() runs. bindCore() repeats this flush as a safety net\n\t// for any late-arriving registrations.\n\tconst { runtime: extensionRuntime } = resourceLoader.getExtensions();\n\tfor (const { name, config } of extensionRuntime.pendingProviderRegistrations) {\n\t\tmodelRegistry.registerProvider(name, config);\n\t}\n\textensionRuntime.pendingProviderRegistrations = [];\n\n\t// Check if session has existing data to restore\n\tconst existingSession = sessionManager.buildSessionContext();\n\tconst hasExistingSession = existingSession.messages.length > 0;\n\tconst hasThinkingEntry = sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\tlet model = options.model;\n\tlet modelFallbackMessage: string | undefined;\n\n\t// If session has data, try to restore model from it\n\tif (!model && hasExistingSession && existingSession.model) {\n\t\tconst restoredModel = modelRegistry.find(existingSession.model.provider, existingSession.model.modelId);\n\t\tif (restoredModel && (await modelRegistry.getApiKey(restoredModel))) {\n\t\t\tmodel = restoredModel;\n\t\t}\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t}\n\t}\n\n\t// Flush extension provider registrations so extension-provided models (e.g. claude-code/*)\n\t// are available in the registry before model resolution. Without this, findInitialModel()\n\t// cannot find extension models and falls back to built-in providers (#3534).\n\tconst extensionsForModelResolution = resourceLoader.getExtensions();\n\tfor (const { name, config } of extensionsForModelResolution.runtime.pendingProviderRegistrations) {\n\t\tmodelRegistry.registerProvider(name, config);\n\t}\n\t// Clear the queue so bindCore() doesn't re-register the same providers.\n\textensionsForModelResolution.runtime.pendingProviderRegistrations = [];\n\n\t// If still no model, use findInitialModel (checks settings default, then provider defaults)\n\tif (!model) {\n\t\tconst result = await findInitialModel({\n\t\t\tscopedModels: [],\n\t\t\tisContinuing: hasExistingSession,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelRegistry,\n\t\t});\n\t\tmodel = result.model;\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `No models available. Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}. Then use /model to select a model.`;\n\t\t} else if (modelFallbackMessage) {\n\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t}\n\t}\n\n\tlet thinkingLevel = options.thinkingLevel;\n\n\t// If session has data, restore thinking level from it\n\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\tthinkingLevel = hasThinkingEntry\n\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t}\n\n\t// Fall back to settings default\n\tif (thinkingLevel === undefined) {\n\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\n\t// Clamp to model capabilities\n\tif (!model || !model.reasoning) {\n\t\tthinkingLevel = \"off\";\n\t}\n\n\tconst editMode = settingsManager.getEditMode();\n\tconst defaultActiveToolNames: ToolName[] = editMode === \"hashline\"\n\t\t? [\"hashline_read\", \"bash\", \"hashline_edit\", \"write\", \"lsp\"]\n\t\t: [\"read\", \"bash\", \"edit\", \"write\", \"lsp\"];\n\tconst initialActiveToolNames: ToolName[] = options.tools\n\t\t? options.tools.map((t) => t.name).filter((n): n is ToolName => n in allTools)\n\t\t: defaultActiveToolNames;\n\n\tlet agent: Agent;\n\n\t// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)\n\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\tconst converted = convertToLlm(messages);\n\t\t// Check setting dynamically so mid-session changes take effect\n\t\tif (!settingsManager.getBlockImages()) {\n\t\t\treturn converted;\n\t\t}\n\t\t// Filter out ImageContent from all messages, replacing with text placeholder\n\t\treturn converted.map((msg) => {\n\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\tconst content = msg.content;\n\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t// Dedupe consecutive \"Image reading is disabled.\" texts\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn msg;\n\t\t});\n\t};\n\n\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\n\tagent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tmodel,\n\t\t\tthinkingLevel,\n\t\t\ttools: [],\n\t\t},\n\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\tonPayload: async (payload, currentModel) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\treturn payload;\n\t\t\t}\n\t\t\treturn runner.emitBeforeProviderRequest(payload, currentModel);\n\t\t},\n\t\tsessionId: sessionManager.getSessionId(),\n\t\ttransformContext: async (messages) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) return messages;\n\t\t\treturn runner.emitContext(messages);\n\t\t},\n\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\ttransport: settingsManager.getTransport(),\n\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\tmaxRetryDelayMs: settingsManager.getRetrySettings().maxDelayMs,\n\t\texternalToolExecution: (m) => modelRegistry.getProviderAuthMode(m.provider) === \"externalCli\",\n\t\tgetProviderOptions: async (currentModel) => {\n\t\t\tif (currentModel.provider !== \"claude-code\") return undefined;\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasUI()) return undefined;\n\t\t\treturn {\n\t\t\t\textensionUIContext: runner.getUIContext(),\n\t\t\t};\n\t\t},\n\t\tgetApiKey: async (provider) => {\n\t\t\t// Use the provider argument from the in-flight request;\n\t\t\t// agent.state.model may already be switched mid-turn.\n\t\t\tconst resolvedProvider = provider || agent.state.model?.provider;\n\t\t\tif (!resolvedProvider) {\n\t\t\t\tthrow new Error(\"No model selected\");\n\t\t\t}\n\t\t\tconst authMode = modelRegistry.getProviderAuthMode(resolvedProvider);\n\t\t\tif (authMode === \"externalCli\" || authMode === \"none\") {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\t// Retry key resolution with backoff to handle transient network failures\n\t\t\t// (e.g., OAuth token refresh failing due to brief connectivity loss).\n\t\t\t// When credentials are in a cooldown window (e.g., after a 429), wait\n\t\t\t// for the backoff to expire instead of using fixed delays that are\n\t\t\t// shorter than the cooldown duration.\n\t\t\tconst maxAttempts = 3;\n\t\t\tconst baseDelayMs = 2000;\n\t\t\tconst maxCooldownWaitMs = 60_000; // Don't wait longer than 60s (skip quota-exhausted 30min backoffs)\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\tconst key = await modelRegistry.getApiKeyForProvider(resolvedProvider);\n\t\t\t\tif (key) return key;\n\n\t\t\t\t// On the last attempt, fall through to error handling below\n\t\t\t\tif (attempt >= maxAttempts) break;\n\n\t\t\t\t// Only retry if credentials exist (network issue) — no point retrying\n\t\t\t\t// when there are genuinely no credentials configured.\n\t\t\t\tconst hasAuth = modelRegistry.authStorage.hasAuth(resolvedProvider);\n\t\t\t\tconst model = agent.state.model;\n\t\t\t\tconst isOAuth = model && modelRegistry.isUsingOAuth(model);\n\t\t\t\tif (!hasAuth && !isOAuth) break;\n\n\t\t\t\t// If credentials are in a cooldown window, wait for the earliest\n\t\t\t\t// one to expire rather than using a fixed delay that's too short.\n\t\t\t\tconst backoffExpiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);\n\t\t\t\tif (backoffExpiry !== undefined) {\n\t\t\t\t\tconst waitMs = backoffExpiry - Date.now() + 500; // 500ms buffer\n\t\t\t\t\tif (waitMs > 0 && waitMs <= maxCooldownWaitMs) {\n\t\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, waitMs));\n\t\t\t\t\t\tcontinue; // Retry immediately after cooldown clears\n\t\t\t\t\t}\n\t\t\t\t\tif (waitMs > maxCooldownWaitMs) {\n\t\t\t\t\t\tbreak; // Quota-exhausted or very long backoff — don't block\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Standard exponential backoff for non-cooldown transient failures\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, baseDelayMs * attempt));\n\t\t\t}\n\n\t\t\t// All retries exhausted — throw descriptive error.\n\t\t\t// Check if credentials exist but are temporarily in a backoff window\n\t\t\t// (e.g., after a 429). This message intentionally avoids phrases like\n\t\t\t// \"rate limit\" / \"429\" to prevent isRetryableError() from re-entering\n\t\t\t// the retry handler and creating cascading error entries (#3429).\n\t\t\tconst hasAuth = modelRegistry.authStorage.hasAuth(resolvedProvider);\n\t\t\tif (hasAuth) {\n\t\t\t\tconst expiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);\n\t\t\t\tconst retryAfterMs = expiry !== undefined ? Math.max(0, expiry - Date.now()) : undefined;\n\t\t\t\tthrow new CredentialCooldownError(resolvedProvider, retryAfterMs);\n\t\t\t}\n\t\t\tconst model = agent.state.model;\n\t\t\tconst isOAuth = model && modelRegistry.isUsingOAuth(model);\n\t\t\tif (isOAuth) {\n\t\t\t\t// If credentials exist but are all in a backoff window (quota / rate-limit),\n\t\t\t\t// surface a specific message instead of the misleading \"Authentication failed\".\n\t\t\t\tif (modelRegistry.authStorage.areAllCredentialsBackedOff(resolvedProvider)) {\n\t\t\t\t\tconst expiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);\n\t\t\t\t\tconst retryAfterMs = expiry !== undefined ? Math.max(0, expiry - Date.now()) : undefined;\n\t\t\t\t\tthrow new CredentialCooldownError(resolvedProvider, retryAfterMs);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Authentication failed for \"${resolvedProvider}\". ` +\n\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t`Run '/login ${resolvedProvider}' to re-authenticate.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`No API key found for \"${resolvedProvider}\". ` +\n\t\t\t\t\t`Set an API key environment variable or run '/login ${resolvedProvider}'.`,\n\t\t\t);\n\t\t},\n\t});\n\n\t// Restore messages if session has existing data\n\tif (hasExistingSession) {\n\t\tagent.replaceMessages(existingSession.messages);\n\t\tif (!hasThinkingEntry) {\n\t\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t} else {\n\t\t// Save initial model and thinking level for new sessions so they can be restored on resume\n\t\tif (model) {\n\t\t\tsessionManager.appendModelChange(model.provider, model.id);\n\t\t}\n\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t}\n\n\tconst session = new AgentSession({\n\t\tagent,\n\t\tsessionManager,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tscopedModels: options.scopedModels,\n\t\tresourceLoader,\n\t\tcustomTools: options.customTools,\n\t\tmodelRegistry,\n\t\tinitialActiveToolNames,\n\t\textensionRunnerRef,\n\t\tisClaudeCodeReady: options.isClaudeCodeReady,\n\t});\n\tconst extensionsResult = resourceLoader.getExtensions();\n\n\treturn {\n\t\tsession,\n\t\textensionsResult,\n\t\tmodelFallbackMessage,\n\t};\n}\n"]}
1
+ {"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/core/sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\n/**\n * Lightweight PATH scan for the `claude` binary — no subprocess, no network.\n * Mirrors the check in src/resources/extensions/gsd/doctor-providers.ts so the\n * legacy Anthropic OAuth self-heal path can only trigger when the user has a\n * working Claude Code CLI to fall back to.\n */\nfunction isClaudeCodeBinaryInPath(): boolean {\n\tconst pathDirs = (process.env.PATH ?? \"\").split(\":\");\n\treturn pathDirs.some((dir) => dir && existsSync(join(dir, \"claude\")));\n}\n\n/**\n * Structured error thrown when all credentials for a provider are in a\n * backoff window. Carries typed metadata so callers (e.g. the auto-loop)\n * can make informed retry decisions instead of string-matching the message.\n */\nexport class CredentialCooldownError extends Error {\n\treadonly code = \"AUTH_COOLDOWN\" as const;\n\t/** Milliseconds until the earliest credential becomes available, or undefined if unknown. */\n\treadonly retryAfterMs: number | undefined;\n\n\tconstructor(provider: string, retryAfterMs?: number) {\n\t\tsuper(\n\t\t\t`All credentials for \"${provider}\" are in a cooldown window. ` +\n\t\t\t\t`Please wait a moment and try again, or switch to a different provider.`,\n\t\t);\n\t\tthis.name = \"CredentialCooldownError\";\n\t\tthis.retryAfterMs = retryAfterMs;\n\t}\n}\nimport { Agent, type AgentMessage, type ThinkingLevel } from \"@gsd/pi-agent-core\";\nimport type { Message, Model } from \"@gsd/pi-ai\";\nimport { getAgentDir, getDocsPath } from \"../config.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport type { ExtensionRunner, LoadExtensionsResult, ToolDefinition } from \"./extensions/index.js\";\nimport { convertToLlm } from \"./messages.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { findInitialModel } from \"./model-resolver.js\";\nimport type { ResourceLoader } from \"./resource-loader.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\nimport { time } from \"./timings.js\";\nimport {\n\tallTools,\n\tbashTool,\n\tcodingTools,\n\tcreateBashTool,\n\tcreateCodingTools,\n\tcreateEditTool,\n\tcreateFindTool,\n\tcreateGrepTool,\n\tcreateLsTool,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateWriteTool,\n\teditTool,\n\tfindTool,\n\tgrepTool,\n\thashlineCodingTools,\n\thashlineEditTool,\n\thashlineReadTool,\n\tcreateHashlineCodingTools,\n\tcreateHashlineEditTool,\n\tcreateHashlineReadTool,\n\tlsTool,\n\treadOnlyTools,\n\treadTool,\n\ttype Tool,\n\ttype ToolName,\n\twriteTool,\n} from \"./tools/index.js\";\n\nexport interface CreateAgentSessionOptions {\n\t/** Working directory for project-local discovery. Default: process.cwd() */\n\tcwd?: string;\n\t/** Global config directory. Default: ~/.pi/agent */\n\tagentDir?: string;\n\n\t/** Auth storage for credentials. Default: AuthStorage.create(agentDir/auth.json) */\n\tauthStorage?: AuthStorage;\n\t/** Model registry. Default: new ModelRegistry(authStorage, agentDir/models.json) */\n\tmodelRegistry?: ModelRegistry;\n\n\t/** Model to use. Default: from settings, else first available */\n\tmodel?: Model<any>;\n\t/** Thinking level. Default: from settings, else 'medium' (clamped to model capabilities) */\n\tthinkingLevel?: ThinkingLevel;\n\t/** Models available for cycling (Ctrl+P in interactive mode) */\n\tscopedModels?: Array<{ model: Model<any>; thinkingLevel?: ThinkingLevel }>;\n\n\t/** Built-in tools to use. Default: codingTools [read, bash, edit, write] */\n\ttools?: Tool[];\n\t/** Custom tools to register (in addition to built-in tools). */\n\tcustomTools?: ToolDefinition[];\n\n\t/** Resource loader. When omitted, DefaultResourceLoader is used. */\n\tresourceLoader?: ResourceLoader;\n\n\t/** Session manager. Default: SessionManager.create(cwd) */\n\tsessionManager?: SessionManager;\n\n\t/** Settings manager. Default: SettingsManager.create(cwd, agentDir) */\n\tsettingsManager?: SettingsManager;\n\n\t/** Optional: check if the claude-code CLI provider is ready (installed + authed).\n\t * Passed to RetryHandler for third-party block recovery (#3772). */\n\tisClaudeCodeReady?: () => boolean;\n}\n\n/** Result from createAgentSession */\nexport interface CreateAgentSessionResult {\n\t/** The created session */\n\tsession: AgentSession;\n\t/** Extensions result (for UI context setup in interactive mode) */\n\textensionsResult: LoadExtensionsResult;\n\t/** Warning if session was restored with a different model than saved */\n\tmodelFallbackMessage?: string;\n}\n\n// Re-exports\n\nexport type {\n\tExtensionAPI,\n\tExtensionCommandContext,\n\tExtensionContext,\n\tExtensionFactory,\n\tSlashCommandInfo,\n\tSlashCommandLocation,\n\tSlashCommandSource,\n\tToolDefinition,\n} from \"./extensions/index.js\";\nexport type { PromptTemplate } from \"./prompt-templates.js\";\nexport type { Skill } from \"./skills.js\";\nexport type { Tool } from \"./tools/index.js\";\n\nexport {\n\t// Pre-built tools (use process.cwd())\n\treadTool,\n\tbashTool,\n\teditTool,\n\twriteTool,\n\tgrepTool,\n\tfindTool,\n\tlsTool,\n\tcodingTools,\n\treadOnlyTools,\n\tallTools as allBuiltInTools,\n\t// Tool factories (for custom cwd)\n\tcreateCodingTools,\n\tcreateReadOnlyTools,\n\tcreateReadTool,\n\tcreateBashTool,\n\tcreateEditTool,\n\tcreateWriteTool,\n\tcreateGrepTool,\n\tcreateFindTool,\n\tcreateLsTool,\n\t// Hashline edit mode\n\thashlineCodingTools,\n\thashlineEditTool,\n\thashlineReadTool,\n\tcreateHashlineCodingTools,\n\tcreateHashlineEditTool,\n\tcreateHashlineReadTool,\n};\n\n// Helper Functions\n\nfunction getDefaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\n/**\n * Create an AgentSession with the specified options.\n *\n * @example\n * ```typescript\n * // Minimal - uses defaults\n * const { session } = await createAgentSession();\n *\n * // With explicit model\n * import { getModel } from '@gsd/pi-ai';\n * const { session } = await createAgentSession({\n * model: getModel('anthropic', 'claude-opus-4-5'),\n * thinkingLevel: 'high',\n * });\n *\n * // Continue previous session\n * const { session, modelFallbackMessage } = await createAgentSession({\n * continueSession: true,\n * });\n *\n * // Full control\n * const loader = new DefaultResourceLoader({\n * cwd: process.cwd(),\n * agentDir: getAgentDir(),\n * settingsManager: SettingsManager.create(),\n * });\n * await loader.reload();\n * const { session } = await createAgentSession({\n * model: myModel,\n * tools: [readTool, bashTool],\n * resourceLoader: loader,\n * sessionManager: SessionManager.inMemory(),\n * });\n * ```\n */\nexport async function createAgentSession(options: CreateAgentSessionOptions = {}): Promise<CreateAgentSessionResult> {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst agentDir = options.agentDir ?? getDefaultAgentDir();\n\tlet resourceLoader = options.resourceLoader;\n\n\t// Use provided or create AuthStorage and ModelRegistry\n\tconst authPath = options.agentDir ? join(agentDir, \"auth.json\") : undefined;\n\tconst modelsPath = options.agentDir ? join(agentDir, \"models.json\") : undefined;\n\tconst authStorage = options.authStorage ?? AuthStorage.create(authPath);\n\tconst modelRegistry = options.modelRegistry ?? new ModelRegistry(authStorage, modelsPath);\n\n\tconst settingsManager = options.settingsManager ?? SettingsManager.create(cwd, agentDir);\n\tconst sessionManager = options.sessionManager ?? SessionManager.create(cwd);\n\n\tif (!resourceLoader) {\n\t\tresourceLoader = new DefaultResourceLoader({ cwd, agentDir, settingsManager });\n\t\tawait resourceLoader.reload();\n\t\ttime(\"resourceLoader.reload\");\n\t}\n\n\t// Flush provider registrations queued during extension loading so that\n\t// extension models (e.g. pi-claude-cli) are visible in the registry before\n\t// findInitialModel() runs. bindCore() repeats this flush as a safety net\n\t// for any late-arriving registrations.\n\tconst { runtime: extensionRuntime } = resourceLoader.getExtensions();\n\tfor (const { name, config } of extensionRuntime.pendingProviderRegistrations) {\n\t\tmodelRegistry.registerProvider(name, config);\n\t}\n\textensionRuntime.pendingProviderRegistrations = [];\n\n\t// Check if session has existing data to restore\n\tconst existingSession = sessionManager.buildSessionContext();\n\tconst hasExistingSession = existingSession.messages.length > 0;\n\tconst hasThinkingEntry = sessionManager.getBranch().some((entry) => entry.type === \"thinking_level_change\");\n\n\tlet model = options.model;\n\tlet modelFallbackMessage: string | undefined;\n\n\t// If session has data, try to restore model from it\n\tif (!model && hasExistingSession && existingSession.model) {\n\t\tconst restoredModel = modelRegistry.find(existingSession.model.provider, existingSession.model.modelId);\n\t\tif (restoredModel && (await modelRegistry.getApiKey(restoredModel))) {\n\t\t\tmodel = restoredModel;\n\t\t}\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `Could not restore model ${existingSession.model.provider}/${existingSession.model.modelId}`;\n\t\t}\n\t}\n\n\t// Flush extension provider registrations so extension-provided models (e.g. claude-code/*)\n\t// are available in the registry before model resolution. Without this, findInitialModel()\n\t// cannot find extension models and falls back to built-in providers (#3534).\n\tconst extensionsForModelResolution = resourceLoader.getExtensions();\n\tfor (const { name, config } of extensionsForModelResolution.runtime.pendingProviderRegistrations) {\n\t\tmodelRegistry.registerProvider(name, config);\n\t}\n\t// Clear the queue so bindCore() doesn't re-register the same providers.\n\textensionsForModelResolution.runtime.pendingProviderRegistrations = [];\n\n\t// If still no model, use findInitialModel (checks settings default, then provider defaults)\n\tif (!model) {\n\t\tconst result = await findInitialModel({\n\t\t\tscopedModels: [],\n\t\t\tisContinuing: hasExistingSession,\n\t\t\tdefaultProvider: settingsManager.getDefaultProvider(),\n\t\t\tdefaultModelId: settingsManager.getDefaultModel(),\n\t\t\tdefaultThinkingLevel: settingsManager.getDefaultThinkingLevel(),\n\t\t\tmodelRegistry,\n\t\t});\n\t\tmodel = result.model;\n\t\tif (!model) {\n\t\t\tmodelFallbackMessage = `No models available. Use /login or set an API key environment variable. See ${join(getDocsPath(), \"providers.md\")}. Then use /model to select a model.`;\n\t\t} else if (modelFallbackMessage) {\n\t\t\tmodelFallbackMessage += `. Using ${model.provider}/${model.id}`;\n\t\t}\n\t}\n\n\tlet thinkingLevel = options.thinkingLevel;\n\n\t// If session has data, restore thinking level from it\n\tif (thinkingLevel === undefined && hasExistingSession) {\n\t\tthinkingLevel = hasThinkingEntry\n\t\t\t? (existingSession.thinkingLevel as ThinkingLevel)\n\t\t\t: (settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL);\n\t}\n\n\t// Fall back to settings default\n\tif (thinkingLevel === undefined) {\n\t\tthinkingLevel = settingsManager.getDefaultThinkingLevel() ?? DEFAULT_THINKING_LEVEL;\n\t}\n\n\t// Clamp to model capabilities\n\tif (!model || !model.reasoning) {\n\t\tthinkingLevel = \"off\";\n\t}\n\n\tconst editMode = settingsManager.getEditMode();\n\tconst defaultActiveToolNames: ToolName[] = editMode === \"hashline\"\n\t\t? [\"hashline_read\", \"bash\", \"hashline_edit\", \"write\", \"lsp\"]\n\t\t: [\"read\", \"bash\", \"edit\", \"write\", \"lsp\"];\n\tconst initialActiveToolNames: ToolName[] = options.tools\n\t\t? options.tools.map((t) => t.name).filter((n): n is ToolName => n in allTools)\n\t\t: defaultActiveToolNames;\n\n\tlet agent: Agent;\n\n\t// Create convertToLlm wrapper that filters images if blockImages is enabled (defense-in-depth)\n\tconst convertToLlmWithBlockImages = (messages: AgentMessage[]): Message[] => {\n\t\tconst converted = convertToLlm(messages);\n\t\t// Check setting dynamically so mid-session changes take effect\n\t\tif (!settingsManager.getBlockImages()) {\n\t\t\treturn converted;\n\t\t}\n\t\t// Filter out ImageContent from all messages, replacing with text placeholder\n\t\treturn converted.map((msg) => {\n\t\t\tif (msg.role === \"user\" || msg.role === \"toolResult\") {\n\t\t\t\tconst content = msg.content;\n\t\t\t\tif (Array.isArray(content)) {\n\t\t\t\t\tconst hasImages = content.some((c) => c.type === \"image\");\n\t\t\t\t\tif (hasImages) {\n\t\t\t\t\t\tconst filteredContent = content\n\t\t\t\t\t\t\t.map((c) =>\n\t\t\t\t\t\t\t\tc.type === \"image\" ? { type: \"text\" as const, text: \"Image reading is disabled.\" } : c,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.filter(\n\t\t\t\t\t\t\t\t(c, i, arr) =>\n\t\t\t\t\t\t\t\t\t// Dedupe consecutive \"Image reading is disabled.\" texts\n\t\t\t\t\t\t\t\t\t!(\n\t\t\t\t\t\t\t\t\t\tc.type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\tc.text === \"Image reading is disabled.\" &&\n\t\t\t\t\t\t\t\t\t\ti > 0 &&\n\t\t\t\t\t\t\t\t\t\tarr[i - 1].type === \"text\" &&\n\t\t\t\t\t\t\t\t\t\t(arr[i - 1] as { type: \"text\"; text: string }).text === \"Image reading is disabled.\"\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { ...msg, content: filteredContent };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn msg;\n\t\t});\n\t};\n\n\tconst extensionRunnerRef: { current?: ExtensionRunner } = {};\n\n\tagent = new Agent({\n\t\tinitialState: {\n\t\t\tsystemPrompt: \"\",\n\t\t\tmodel,\n\t\t\tthinkingLevel,\n\t\t\ttools: [],\n\t\t},\n\t\tconvertToLlm: convertToLlmWithBlockImages,\n\t\tonPayload: async (payload, currentModel) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasHandlers(\"before_provider_request\")) {\n\t\t\t\treturn payload;\n\t\t\t}\n\t\t\treturn runner.emitBeforeProviderRequest(payload, currentModel);\n\t\t},\n\t\tsessionId: sessionManager.getSessionId(),\n\t\ttransformContext: async (messages) => {\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner) return messages;\n\t\t\treturn runner.emitContext(messages);\n\t\t},\n\t\tsteeringMode: settingsManager.getSteeringMode(),\n\t\tfollowUpMode: settingsManager.getFollowUpMode(),\n\t\ttransport: settingsManager.getTransport(),\n\t\tthinkingBudgets: settingsManager.getThinkingBudgets(),\n\t\tmaxRetryDelayMs: settingsManager.getRetrySettings().maxDelayMs,\n\t\texternalToolExecution: (m) => modelRegistry.getProviderAuthMode(m.provider) === \"externalCli\",\n\t\tgetProviderOptions: async (currentModel) => {\n\t\t\tif (currentModel.provider !== \"claude-code\") return undefined;\n\t\t\tconst runner = extensionRunnerRef.current;\n\t\t\tif (!runner?.hasUI()) return undefined;\n\t\t\treturn {\n\t\t\t\textensionUIContext: runner.getUIContext(),\n\t\t\t};\n\t\t},\n\t\tgetApiKey: async (provider) => {\n\t\t\t// Use the provider argument from the in-flight request;\n\t\t\t// agent.state.model may already be switched mid-turn.\n\t\t\tconst resolvedProvider = provider || agent.state.model?.provider;\n\t\t\tif (!resolvedProvider) {\n\t\t\t\tthrow new Error(\"No model selected\");\n\t\t\t}\n\t\t\tconst authMode = modelRegistry.getProviderAuthMode(resolvedProvider);\n\t\t\tif (authMode === \"externalCli\" || authMode === \"none\") {\n\t\t\t\treturn undefined;\n\t\t\t}\n\n\t\t\t// Retry key resolution with backoff to handle transient network failures\n\t\t\t// (e.g., OAuth token refresh failing due to brief connectivity loss).\n\t\t\t// When credentials are in a cooldown window (e.g., after a 429), wait\n\t\t\t// for the backoff to expire instead of using fixed delays that are\n\t\t\t// shorter than the cooldown duration.\n\t\t\tconst maxAttempts = 3;\n\t\t\tconst baseDelayMs = 2000;\n\t\t\tconst maxCooldownWaitMs = 60_000; // Don't wait longer than 60s (skip quota-exhausted 30min backoffs)\n\t\t\tfor (let attempt = 1; attempt <= maxAttempts; attempt++) {\n\t\t\t\tconst key = await modelRegistry.getApiKeyForProvider(resolvedProvider);\n\t\t\t\tif (key) return key;\n\n\t\t\t\t// On the last attempt, fall through to error handling below\n\t\t\t\tif (attempt >= maxAttempts) break;\n\n\t\t\t\t// Only retry if credentials exist (network issue) — no point retrying\n\t\t\t\t// when there are genuinely no credentials configured.\n\t\t\t\tconst hasAuth = modelRegistry.authStorage.hasAuth(resolvedProvider);\n\t\t\t\tconst model = agent.state.model;\n\t\t\t\tconst isOAuth = model && modelRegistry.isUsingOAuth(model);\n\t\t\t\tif (!hasAuth && !isOAuth) break;\n\n\t\t\t\t// If credentials are in a cooldown window, wait for the earliest\n\t\t\t\t// one to expire rather than using a fixed delay that's too short.\n\t\t\t\tconst backoffExpiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);\n\t\t\t\tif (backoffExpiry !== undefined) {\n\t\t\t\t\tconst waitMs = backoffExpiry - Date.now() + 500; // 500ms buffer\n\t\t\t\t\tif (waitMs > 0 && waitMs <= maxCooldownWaitMs) {\n\t\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve, waitMs));\n\t\t\t\t\t\tcontinue; // Retry immediately after cooldown clears\n\t\t\t\t\t}\n\t\t\t\t\tif (waitMs > maxCooldownWaitMs) {\n\t\t\t\t\t\tbreak; // Quota-exhausted or very long backoff — don't block\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Standard exponential backoff for non-cooldown transient failures\n\t\t\t\tawait new Promise(resolve => setTimeout(resolve, baseDelayMs * attempt));\n\t\t\t}\n\n\t\t\t// All retries exhausted — throw descriptive error.\n\t\t\t// Check if credentials exist but are temporarily in a backoff window\n\t\t\t// (e.g., after a 429). This message intentionally avoids phrases like\n\t\t\t// \"rate limit\" / \"429\" to prevent isRetryableError() from re-entering\n\t\t\t// the retry handler and creating cascading error entries (#3429).\n\t\t\tconst hasAuth = modelRegistry.authStorage.hasAuth(resolvedProvider);\n\t\t\tif (hasAuth) {\n\t\t\t\t// Anthropic OAuth was removed in v2.74.0 for TOS compliance (#3952).\n\t\t\t\t// Users who upgraded from an older version may still have OAuth\n\t\t\t\t// credentials in auth.json that will never resolve to a valid API key.\n\t\t\t\tif (\n\t\t\t\t\tresolvedProvider === \"anthropic\" &&\n\t\t\t\t\tmodelRegistry.authStorage.hasLegacyOAuthCredential(resolvedProvider)\n\t\t\t\t) {\n\t\t\t\t\t// Self-heal: strip the stale oauth entry so hasAuth() stops lying\n\t\t\t\t\t// about anthropic being configured. This preserves any api_key\n\t\t\t\t\t// credentials alongside it.\n\t\t\t\t\tconst removed = modelRegistry.authStorage.removeLegacyOAuthCredential(resolvedProvider);\n\t\t\t\t\tif (removed) {\n\t\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t\t`[auth] Removed unsupported Anthropic OAuth credential from auth.json (#3952).`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tif (isClaudeCodeBinaryInPath()) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Removed stale Anthropic OAuth credential (OAuth support removed in v2.74.0). ` +\n\t\t\t\t\t\t\t\t`Your current model's provider is set to \"anthropic\" but the local Claude Code CLI ` +\n\t\t\t\t\t\t\t\t`is available — switch the model's provider to \"claude-code\" in your preferences ` +\n\t\t\t\t\t\t\t\t`to use it, or set ANTHROPIC_API_KEY to continue with the Anthropic API directly.`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Removed stale Anthropic OAuth credential (OAuth support removed in v2.74.0). ` +\n\t\t\t\t\t\t\t`Set ANTHROPIC_API_KEY, run '/login' and paste an API key, or switch to a different provider.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tconst expiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);\n\t\t\t\tconst retryAfterMs = expiry !== undefined ? Math.max(0, expiry - Date.now()) : undefined;\n\t\t\t\tthrow new CredentialCooldownError(resolvedProvider, retryAfterMs);\n\t\t\t}\n\t\t\tconst model = agent.state.model;\n\t\t\tconst isOAuth = model && modelRegistry.isUsingOAuth(model);\n\t\t\tif (isOAuth) {\n\t\t\t\t// If credentials exist but are all in a backoff window (quota / rate-limit),\n\t\t\t\t// surface a specific message instead of the misleading \"Authentication failed\".\n\t\t\t\tif (modelRegistry.authStorage.areAllCredentialsBackedOff(resolvedProvider)) {\n\t\t\t\t\tconst expiry = modelRegistry.authStorage.getEarliestBackoffExpiry(resolvedProvider);\n\t\t\t\t\tconst retryAfterMs = expiry !== undefined ? Math.max(0, expiry - Date.now()) : undefined;\n\t\t\t\t\tthrow new CredentialCooldownError(resolvedProvider, retryAfterMs);\n\t\t\t\t}\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Authentication failed for \"${resolvedProvider}\". ` +\n\t\t\t\t\t\t`Credentials may have expired or network is unavailable. ` +\n\t\t\t\t\t\t`Run '/login ${resolvedProvider}' to re-authenticate.`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new Error(\n\t\t\t\t`No API key found for \"${resolvedProvider}\". ` +\n\t\t\t\t\t`Set an API key environment variable or run '/login ${resolvedProvider}'.`,\n\t\t\t);\n\t\t},\n\t});\n\n\t// Restore messages if session has existing data\n\tif (hasExistingSession) {\n\t\tagent.replaceMessages(existingSession.messages);\n\t\tif (!hasThinkingEntry) {\n\t\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t\t}\n\t} else {\n\t\t// Save initial model and thinking level for new sessions so they can be restored on resume\n\t\tif (model) {\n\t\t\tsessionManager.appendModelChange(model.provider, model.id);\n\t\t}\n\t\tsessionManager.appendThinkingLevelChange(thinkingLevel);\n\t}\n\n\tconst session = new AgentSession({\n\t\tagent,\n\t\tsessionManager,\n\t\tsettingsManager,\n\t\tcwd,\n\t\tscopedModels: options.scopedModels,\n\t\tresourceLoader,\n\t\tcustomTools: options.customTools,\n\t\tmodelRegistry,\n\t\tinitialActiveToolNames,\n\t\textensionRunnerRef,\n\t\tisClaudeCodeReady: options.isClaudeCodeReady,\n\t});\n\tconst extensionsResult = resourceLoader.getExtensions();\n\n\treturn {\n\t\tsession,\n\t\textensionsResult,\n\t\tmodelFallbackMessage,\n\t};\n}\n"]}
@@ -12,7 +12,7 @@ import { SessionManager } from "./session-manager.js";
12
12
  import { SettingsManager } from "./settings-manager.js";
13
13
  let testDir;
14
14
  function writeSkill(cwd, name, description, body = `# ${name}\n`) {
15
- const skillDir = join(cwd, ".pi", "skills", name);
15
+ const skillDir = join(cwd, ".agents", "skills", name);
16
16
  mkdirSync(skillDir, { recursive: true });
17
17
  const skillPath = join(skillDir, "SKILL.md");
18
18
  writeFileSync(skillPath, `---\nname: ${name}\ndescription: ${description}\n---\n\n${body}`);
@@ -54,7 +54,7 @@ describe("Skill tool", () => {
54
54
  const tool = session.state.tools.find((entry) => entry.name === "Skill");
55
55
  assert.ok(tool, "Skill tool should be registered");
56
56
  const result = await tool.execute("call-1", { skill: "swift-testing" });
57
- assert.equal(result.content[0]?.type === "text" ? result.content[0].text : "", `<skill name="swift-testing" location="${skillPath}">\nReferences are relative to ${join(testDir, ".pi", "skills", "swift-testing")}.\n\n# Swift Testing\nUse this skill.\n</skill>`);
57
+ assert.equal(result.content[0]?.type === "text" ? result.content[0].text : "", `<skill name="swift-testing" location="${skillPath}">\nReferences are relative to ${join(testDir, ".agents", "skills", "swift-testing")}.\n\n# Swift Testing\nUse this skill.\n</skill>`);
58
58
  });
59
59
  it("returns a helpful error for unknown skills", async () => {
60
60
  writeSkill(testDir, "swift-testing", "Use for Swift Testing assertions and verification patterns.");
@@ -1 +1 @@
1
- {"version":3,"file":"skill-tool.test.js","sourceRoot":"","sources":["../../src/core/skill-tool.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\";\nimport { mkdirSync, mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\n\nimport { Agent } from \"@gsd/pi-agent-core\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\n\nlet testDir: string;\n\nfunction writeSkill(cwd: string, name: string, description: string, body = `# ${name}\\n`): string {\n\tconst skillDir = join(cwd, \".pi\", \"skills\", name);\n\tmkdirSync(skillDir, { recursive: true });\n\tconst skillPath = join(skillDir, \"SKILL.md\");\n\twriteFileSync(skillPath, `---\\nname: ${name}\\ndescription: ${description}\\n---\\n\\n${body}`);\n\treturn skillPath;\n}\n\ndescribe(\"Skill tool\", () => {\n\tbeforeEach(() => {\n\t\ttestDir = mkdtempSync(join(tmpdir(), \"skill-tool-test-\"));\n\t});\n\n\tafterEach(() => {\n\t\trmSync(testDir, { recursive: true, force: true });\n\t});\n\n\tasync function createSession() {\n\t\tconst agentDir = join(testDir, \"agent-home\");\n\t\tconst authStorage = AuthStorage.inMemory({});\n\t\tconst modelRegistry = new ModelRegistry(authStorage, join(agentDir, \"models.json\"));\n\t\tconst settingsManager = SettingsManager.inMemory();\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: testDir,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tnoExtensions: true,\n\t\t\tnoPromptTemplates: true,\n\t\t\tnoThemes: true,\n\t\t});\n\t\tawait resourceLoader.reload();\n\n\t\treturn new AgentSession({\n\t\t\tagent: new Agent(),\n\t\t\tsessionManager: SessionManager.inMemory(testDir),\n\t\t\tsettingsManager,\n\t\t\tcwd: testDir,\n\t\t\tresourceLoader,\n\t\t\tmodelRegistry,\n\t\t});\n\t}\n\n\tit(\"resolves a project-level skill to the exact skill block format\", async () => {\n\t\tconst skillPath = writeSkill(\n\t\t\ttestDir,\n\t\t\t\"swift-testing\",\n\t\t\t\"Use for Swift Testing assertions and verification patterns.\",\n\t\t\t\"# Swift Testing\\nUse this skill.\\n\",\n\t\t);\n\t\tconst session = await createSession();\n\n\t\tconst tool = session.state.tools.find((entry) => entry.name === \"Skill\");\n\t\tassert.ok(tool, \"Skill tool should be registered\");\n\n\t\tconst result = await tool.execute(\"call-1\", { skill: \"swift-testing\" });\n\t\tassert.equal(\n\t\t\tresult.content[0]?.type === \"text\" ? result.content[0].text : \"\",\n\t\t\t`<skill name=\"swift-testing\" location=\"${skillPath}\">\\nReferences are relative to ${join(testDir, \".pi\", \"skills\", \"swift-testing\")}.\\n\\n# Swift Testing\\nUse this skill.\\n</skill>`,\n\t\t);\n\t});\n\n\tit(\"returns a helpful error for unknown skills\", async () => {\n\t\twriteSkill(testDir, \"swift-testing\", \"Use for Swift Testing assertions and verification patterns.\");\n\t\tconst session = await createSession();\n\t\tconst tool = session.state.tools.find((entry) => entry.name === \"Skill\");\n\t\tassert.ok(tool, \"Skill tool should be registered\");\n\n\t\tconst result = await tool.execute(\"call-2\", { skill: \"nonexistent\" });\n\t\tconst message = result.content[0]?.type === \"text\" ? result.content[0].text : \"\";\n\t\tassert.match(message, /^Skill \"nonexistent\" not found\\. Available skills: /);\n\t\tassert.match(message, /swift-testing/);\n\t});\n});\n"]}
1
+ {"version":3,"file":"skill-tool.test.js","sourceRoot":"","sources":["../../src/core/skill-tool.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\";\nimport { mkdirSync, mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { afterEach, beforeEach, describe, it } from \"node:test\";\n\nimport { Agent } from \"@gsd/pi-agent-core\";\nimport { AuthStorage } from \"./auth-storage.js\";\nimport { AgentSession } from \"./agent-session.js\";\nimport { ModelRegistry } from \"./model-registry.js\";\nimport { DefaultResourceLoader } from \"./resource-loader.js\";\nimport { SessionManager } from \"./session-manager.js\";\nimport { SettingsManager } from \"./settings-manager.js\";\n\nlet testDir: string;\n\nfunction writeSkill(cwd: string, name: string, description: string, body = `# ${name}\\n`): string {\n\tconst skillDir = join(cwd, \".agents\", \"skills\", name);\n\tmkdirSync(skillDir, { recursive: true });\n\tconst skillPath = join(skillDir, \"SKILL.md\");\n\twriteFileSync(skillPath, `---\\nname: ${name}\\ndescription: ${description}\\n---\\n\\n${body}`);\n\treturn skillPath;\n}\n\ndescribe(\"Skill tool\", () => {\n\tbeforeEach(() => {\n\t\ttestDir = mkdtempSync(join(tmpdir(), \"skill-tool-test-\"));\n\t});\n\n\tafterEach(() => {\n\t\trmSync(testDir, { recursive: true, force: true });\n\t});\n\n\tasync function createSession() {\n\t\tconst agentDir = join(testDir, \"agent-home\");\n\t\tconst authStorage = AuthStorage.inMemory({});\n\t\tconst modelRegistry = new ModelRegistry(authStorage, join(agentDir, \"models.json\"));\n\t\tconst settingsManager = SettingsManager.inMemory();\n\t\tconst resourceLoader = new DefaultResourceLoader({\n\t\t\tcwd: testDir,\n\t\t\tagentDir,\n\t\t\tsettingsManager,\n\t\t\tnoExtensions: true,\n\t\t\tnoPromptTemplates: true,\n\t\t\tnoThemes: true,\n\t\t});\n\t\tawait resourceLoader.reload();\n\n\t\treturn new AgentSession({\n\t\t\tagent: new Agent(),\n\t\t\tsessionManager: SessionManager.inMemory(testDir),\n\t\t\tsettingsManager,\n\t\t\tcwd: testDir,\n\t\t\tresourceLoader,\n\t\t\tmodelRegistry,\n\t\t});\n\t}\n\n\tit(\"resolves a project-level skill to the exact skill block format\", async () => {\n\t\tconst skillPath = writeSkill(\n\t\t\ttestDir,\n\t\t\t\"swift-testing\",\n\t\t\t\"Use for Swift Testing assertions and verification patterns.\",\n\t\t\t\"# Swift Testing\\nUse this skill.\\n\",\n\t\t);\n\t\tconst session = await createSession();\n\n\t\tconst tool = session.state.tools.find((entry) => entry.name === \"Skill\");\n\t\tassert.ok(tool, \"Skill tool should be registered\");\n\n\t\tconst result = await tool.execute(\"call-1\", { skill: \"swift-testing\" });\n\t\tassert.equal(\n\t\t\tresult.content[0]?.type === \"text\" ? result.content[0].text : \"\",\n\t\t\t`<skill name=\"swift-testing\" location=\"${skillPath}\">\\nReferences are relative to ${join(testDir, \".agents\", \"skills\", \"swift-testing\")}.\\n\\n# Swift Testing\\nUse this skill.\\n</skill>`,\n\t\t);\n\t});\n\n\tit(\"returns a helpful error for unknown skills\", async () => {\n\t\twriteSkill(testDir, \"swift-testing\", \"Use for Swift Testing assertions and verification patterns.\");\n\t\tconst session = await createSession();\n\t\tconst tool = session.state.tools.find((entry) => entry.name === \"Skill\");\n\t\tassert.ok(tool, \"Skill tool should be registered\");\n\n\t\tconst result = await tool.execute(\"call-2\", { skill: \"nonexistent\" });\n\t\tconst message = result.content[0]?.type === \"text\" ? result.content[0].text : \"\";\n\t\tassert.match(message, /^Skill \"nonexistent\" not found\\. Available skills: /);\n\t\tassert.match(message, /swift-testing/);\n\t});\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-frame.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/chat-frame.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvE,KAAK,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,CAAC;AAUrD,wBAAgB,eAAe,CAC9B,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB,GACC,MAAM,EAAE,CAkDV"}
1
+ {"version":3,"file":"chat-frame.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/chat-frame.ts"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvE,KAAK,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,YAAY,CAAC;AAUrD,wBAAgB,eAAe,CAC9B,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB,GACC,MAAM,EAAE,CA8DV"}
@@ -14,10 +14,10 @@ export function renderChatFrame(contentLines, width, opts) {
14
14
  const outerWidth = Math.max(20, width);
15
15
  const contentWidth = Math.max(1, outerWidth - 2); // "│ " + content
16
16
  const borderColor = opts.tone === "user"
17
- ? "borderAccent"
17
+ ? "border"
18
18
  : opts.tone === "compaction"
19
19
  ? "customMessageLabel"
20
- : "border";
20
+ : "borderAccent";
21
21
  const borderMuted = opts.tone === "compaction" ? "customMessageLabel" : "borderMuted";
22
22
  const border = (s) => theme.fg(borderColor, s);
23
23
  const leftRaw = `• ${opts.label}`;
@@ -28,11 +28,16 @@ export function renderChatFrame(contentLines, width, opts) {
28
28
  ? Math.max(1, outerWidth - visibleWidth(rightRaw) - 1)
29
29
  : outerWidth;
30
30
  const left = truncateToWidth(leftRaw, leftBudget, "");
31
- const leftStyled = opts.tone === "user"
32
- ? theme.fg("accent", theme.bold(left))
31
+ const labelColor = opts.tone === "user"
32
+ ? "border"
33
33
  : opts.tone === "compaction"
34
- ? theme.fg("customMessageLabel", theme.bold(left))
35
- : theme.fg("muted", theme.bold(left));
34
+ ? "customMessageLabel"
35
+ : "borderAccent";
36
+ const dashIdx = left.indexOf(" - ");
37
+ const leftStyled = dashIdx >= 0
38
+ ? theme.fg(labelColor, theme.bold(left.slice(0, dashIdx))) +
39
+ theme.fg("dim", left.slice(dashIdx))
40
+ : theme.fg(labelColor, theme.bold(left));
36
41
  const rightStyled = rightRaw ? theme.fg("dim", rightRaw) : "";
37
42
  const gap = rightRaw.length > 0
38
43
  ? Math.max(1, outerWidth - visibleWidth(leftStyled) - visibleWidth(rightStyled))
@@ -40,9 +45,14 @@ export function renderChatFrame(contentLines, width, opts) {
40
45
  const headerRow = `${leftStyled}${" ".repeat(gap)}${rightStyled}`;
41
46
  const headerPad = Math.max(0, outerWidth - visibleWidth(headerRow));
42
47
  const sourceLines = trimOuterBlankLines(contentLines);
48
+ const bodyColor = opts.tone === "user"
49
+ ? "userMessageText"
50
+ : opts.tone === "compaction"
51
+ ? "customMessageText"
52
+ : "assistantMessageText";
43
53
  const bodyLines = (sourceLines.length > 0 ? sourceLines : [""]).map((line) => {
44
54
  const clipped = truncateToWidth(line, contentWidth, "");
45
- return border("│ ") + clipped;
55
+ return border("│ ") + theme.fg(bodyColor, clipped);
46
56
  });
47
57
  return [
48
58
  theme.fg(borderMuted, "─".repeat(outerWidth)),