gsd-pi 2.57.0-dev.f22a903 → 2.58.0-dev.394cb18

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 (770) hide show
  1. package/README.md +1 -1
  2. package/dist/cli.js +58 -35
  3. package/dist/headless-ui.d.ts +17 -0
  4. package/dist/headless-ui.js +97 -3
  5. package/dist/headless.js +67 -6
  6. package/dist/help-text.js +1 -0
  7. package/dist/onboarding.js +44 -0
  8. package/dist/resource-loader.js +16 -1
  9. package/dist/resources/agents/researcher.md +1 -1
  10. package/dist/resources/extensions/ask-user-questions.js +16 -3
  11. package/dist/resources/extensions/async-jobs/extension-manifest.json +1 -1
  12. package/dist/resources/extensions/bg-shell/extension-manifest.json +1 -1
  13. package/dist/resources/extensions/browser-tools/extension-manifest.json +1 -1
  14. package/dist/resources/extensions/claude-code-cli/partial-builder.js +14 -6
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +59 -36
  16. package/dist/resources/extensions/context7/extension-manifest.json +1 -1
  17. package/dist/resources/extensions/get-secrets-from-user.js +8 -5
  18. package/dist/resources/extensions/google-search/extension-manifest.json +1 -1
  19. package/dist/resources/extensions/google-search/index.js +2 -1
  20. package/dist/resources/extensions/gsd/auto/phases.js +25 -21
  21. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  22. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -20
  23. package/dist/resources/extensions/gsd/auto-dispatch.js +17 -2
  24. package/dist/resources/extensions/gsd/auto-model-selection.js +26 -3
  25. package/dist/resources/extensions/gsd/auto-post-unit.js +16 -4
  26. package/dist/resources/extensions/gsd/auto-prompts.js +1 -1
  27. package/dist/resources/extensions/gsd/auto-recovery.js +13 -5
  28. package/dist/resources/extensions/gsd/auto-start.js +35 -22
  29. package/dist/resources/extensions/gsd/auto-worktree.js +199 -12
  30. package/dist/resources/extensions/gsd/auto.js +4 -0
  31. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +32 -0
  32. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +80 -8
  33. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +32 -1
  34. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +42 -34
  35. package/dist/resources/extensions/gsd/bootstrap/system-context.js +66 -12
  36. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +67 -0
  37. package/dist/resources/extensions/gsd/captures.js +56 -4
  38. package/dist/resources/extensions/gsd/codebase-generator.js +279 -0
  39. package/dist/resources/extensions/gsd/commands/catalog.js +10 -1
  40. package/dist/resources/extensions/gsd/commands/handlers/ops.js +5 -0
  41. package/dist/resources/extensions/gsd/commands-codebase.js +115 -0
  42. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +41 -4
  43. package/dist/resources/extensions/gsd/complexity-classifier.js +8 -6
  44. package/dist/resources/extensions/gsd/db-writer.js +116 -8
  45. package/dist/resources/extensions/gsd/doctor-git-checks.js +76 -1
  46. package/dist/resources/extensions/gsd/doctor-proactive.js +34 -1
  47. package/dist/resources/extensions/gsd/doctor-providers.js +2 -1
  48. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +5 -4
  49. package/dist/resources/extensions/gsd/doctor.js +3 -1
  50. package/dist/resources/extensions/gsd/error-classifier.js +12 -10
  51. package/dist/resources/extensions/gsd/extension-manifest.json +16 -1
  52. package/dist/resources/extensions/gsd/forensics.js +123 -20
  53. package/dist/resources/extensions/gsd/git-service.js +105 -2
  54. package/dist/resources/extensions/gsd/gitignore.js +33 -0
  55. package/dist/resources/extensions/gsd/gsd-db.js +36 -9
  56. package/dist/resources/extensions/gsd/guided-flow.js +106 -44
  57. package/dist/resources/extensions/gsd/health-widget-core.js +31 -0
  58. package/dist/resources/extensions/gsd/health-widget.js +17 -0
  59. package/dist/resources/extensions/gsd/index.js +1 -1
  60. package/dist/resources/extensions/gsd/memory-extractor.js +7 -0
  61. package/dist/resources/extensions/gsd/migrate-external.js +8 -1
  62. package/dist/resources/extensions/gsd/milestone-validation-gates.js +45 -0
  63. package/dist/resources/extensions/gsd/model-cost-table.js +18 -0
  64. package/dist/resources/extensions/gsd/model-router.js +35 -1
  65. package/dist/resources/extensions/gsd/native-git-bridge.js +39 -0
  66. package/dist/resources/extensions/gsd/notifications.js +16 -1
  67. package/dist/resources/extensions/gsd/parallel-eligibility.js +13 -2
  68. package/dist/resources/extensions/gsd/parallel-merge.js +78 -5
  69. package/dist/resources/extensions/gsd/parsers-legacy.js +20 -3
  70. package/dist/resources/extensions/gsd/paths.js +45 -0
  71. package/dist/resources/extensions/gsd/preferences-models.js +14 -1
  72. package/dist/resources/extensions/gsd/preferences-types.js +3 -1
  73. package/dist/resources/extensions/gsd/preferences.js +13 -16
  74. package/dist/resources/extensions/gsd/prompt-loader.js +4 -1
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  77. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/discuss.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -1
  80. package/dist/resources/extensions/gsd/prompts/forensics.md +2 -2
  81. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  82. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  84. package/dist/resources/extensions/gsd/prompts/rethink.md +1 -1
  85. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  86. package/dist/resources/extensions/gsd/repo-identity.js +205 -11
  87. package/dist/resources/extensions/gsd/rethink.js +5 -0
  88. package/dist/resources/extensions/gsd/roadmap-slices.js +5 -4
  89. package/dist/resources/extensions/gsd/state.js +85 -27
  90. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  91. package/dist/resources/extensions/gsd/tools/complete-task.js +34 -71
  92. package/dist/resources/extensions/gsd/tools/plan-milestone.js +12 -2
  93. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +29 -1
  94. package/dist/resources/extensions/gsd/tools/validate-milestone.js +14 -3
  95. package/dist/resources/extensions/gsd/triage-resolution.js +22 -7
  96. package/dist/resources/extensions/gsd/undo.js +2 -2
  97. package/dist/resources/extensions/gsd/unit-ownership.js +164 -33
  98. package/dist/resources/extensions/gsd/verdict-parser.js +20 -8
  99. package/dist/resources/extensions/gsd/watch/header-renderer.js +241 -0
  100. package/dist/resources/extensions/gsd/workflow-manifest.js +24 -5
  101. package/dist/resources/extensions/gsd/workflow-projections.js +95 -63
  102. package/dist/resources/extensions/gsd/workflow-reconcile.js +35 -5
  103. package/dist/resources/extensions/gsd/workspace-index.js +24 -0
  104. package/dist/resources/extensions/gsd/worktree-manager.js +105 -1
  105. package/dist/resources/extensions/gsd/worktree-resolver.js +20 -3
  106. package/dist/resources/extensions/mcp-client/index.js +11 -7
  107. package/dist/resources/extensions/ollama/index.js +112 -0
  108. package/dist/resources/extensions/ollama/model-capabilities.js +115 -0
  109. package/dist/resources/extensions/ollama/ollama-client.js +168 -0
  110. package/dist/resources/extensions/ollama/ollama-commands.js +194 -0
  111. package/dist/resources/extensions/ollama/ollama-discovery.js +69 -0
  112. package/dist/resources/extensions/ollama/ollama-tool.js +184 -0
  113. package/dist/resources/extensions/ollama/types.js +2 -0
  114. package/dist/resources/extensions/search-the-web/extension-manifest.json +1 -1
  115. package/dist/resources/extensions/shared/interview-ui.js +11 -1
  116. package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -3
  117. package/dist/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  118. package/dist/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  119. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  120. package/dist/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  121. package/dist/startup-model-validation.d.ts +39 -0
  122. package/dist/startup-model-validation.js +50 -0
  123. package/dist/web/standalone/.next/BUILD_ID +1 -1
  124. package/dist/web/standalone/.next/app-path-routes-manifest.json +15 -15
  125. package/dist/web/standalone/.next/build-manifest.json +3 -3
  126. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  127. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.html +2 -2
  130. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  146. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/index.html +1 -1
  201. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  202. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  204. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  206. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  207. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/app-paths-manifest.json +15 -15
  209. package/dist/web/standalone/.next/server/chunks/2229.js +2 -2
  210. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  211. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  213. package/dist/web/standalone/.next/server/pages/500.html +2 -2
  214. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  215. package/dist/web/standalone/.next/static/chunks/6502.7593d7797a4b3999.js +9 -0
  216. package/dist/web/standalone/.next/static/chunks/{webpack-61d3afac6d0f0ce7.js → webpack-a1c1e452c6b32d04.js} +1 -1
  217. package/dist/web/standalone/.next/static/css/f6e8833d46e738d8.css +1 -0
  218. package/dist/web-mode.js +2 -1
  219. package/dist/welcome-screen.d.ts +1 -0
  220. package/dist/welcome-screen.js +32 -6
  221. package/package.json +2 -2
  222. package/packages/daemon/src/cli.ts +49 -0
  223. package/packages/daemon/src/daemon.test.ts +104 -1
  224. package/packages/daemon/src/daemon.ts +24 -1
  225. package/packages/daemon/src/discord-bot.ts +73 -3
  226. package/packages/daemon/src/event-bridge.ts +15 -9
  227. package/packages/daemon/src/event-formatter.ts +30 -2
  228. package/packages/daemon/src/index.ts +9 -0
  229. package/packages/daemon/src/launchd.test.ts +356 -0
  230. package/packages/daemon/src/launchd.ts +242 -0
  231. package/packages/daemon/src/message-batcher.test.ts +2 -2
  232. package/packages/daemon/src/message-batcher.ts +9 -3
  233. package/packages/daemon/src/orchestrator.test.ts +1 -0
  234. package/packages/daemon/src/orchestrator.ts +106 -2
  235. package/packages/native/dist/ast/index.js +9 -5
  236. package/packages/native/dist/ast/types.js +2 -1
  237. package/packages/native/dist/clipboard/index.js +12 -7
  238. package/packages/native/dist/clipboard/types.js +2 -1
  239. package/packages/native/dist/diff/index.js +12 -7
  240. package/packages/native/dist/diff/types.js +2 -1
  241. package/packages/native/dist/fd/index.js +6 -3
  242. package/packages/native/dist/fd/types.js +2 -1
  243. package/packages/native/dist/glob/index.js +9 -5
  244. package/packages/native/dist/glob/types.js +2 -1
  245. package/packages/native/dist/grep/index.js +9 -5
  246. package/packages/native/dist/grep/types.js +2 -1
  247. package/packages/native/dist/gsd-parser/index.js +18 -11
  248. package/packages/native/dist/gsd-parser/types.js +2 -1
  249. package/packages/native/dist/highlight/index.js +12 -7
  250. package/packages/native/dist/highlight/types.js +2 -1
  251. package/packages/native/dist/html/index.js +6 -3
  252. package/packages/native/dist/html/types.js +2 -1
  253. package/packages/native/dist/image/index.js +10 -5
  254. package/packages/native/dist/image/types.js +7 -4
  255. package/packages/native/dist/index.js +70 -17
  256. package/packages/native/dist/json-parse/index.js +13 -8
  257. package/packages/native/dist/native.js +47 -10
  258. package/packages/native/dist/ps/index.js +15 -9
  259. package/packages/native/dist/ps/types.js +2 -1
  260. package/packages/native/dist/stream-process/index.js +12 -7
  261. package/packages/native/dist/text/index.js +24 -14
  262. package/packages/native/dist/text/types.js +5 -2
  263. package/packages/native/dist/truncate/index.js +12 -7
  264. package/packages/native/dist/ttsr/index.js +12 -7
  265. package/packages/native/dist/ttsr/types.js +2 -1
  266. package/packages/native/dist/xxhash/index.js +9 -5
  267. package/packages/native/package.json +19 -19
  268. package/packages/native/src/__tests__/module-compat.test.mjs +91 -0
  269. package/packages/native/src/native.ts +9 -8
  270. package/packages/pi-agent-core/dist/agent-loop.js +3 -2
  271. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  272. package/packages/pi-agent-core/dist/proxy.d.ts +1 -1
  273. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  274. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  275. package/packages/pi-agent-core/src/agent-loop.test.ts +45 -0
  276. package/packages/pi-agent-core/src/agent-loop.ts +3 -2
  277. package/packages/pi-agent-core/src/proxy.ts +1 -1
  278. package/packages/pi-ai/dist/env-api-keys.js +1 -0
  279. package/packages/pi-ai/dist/env-api-keys.js.map +1 -1
  280. package/packages/pi-ai/dist/index.d.ts +1 -0
  281. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  282. package/packages/pi-ai/dist/index.js +1 -0
  283. package/packages/pi-ai/dist/index.js.map +1 -1
  284. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  285. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -2
  286. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  287. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts +2 -0
  288. package/packages/pi-ai/dist/providers/anthropic-shared.test.d.ts.map +1 -0
  289. package/packages/pi-ai/dist/providers/anthropic-shared.test.js +25 -0
  290. package/packages/pi-ai/dist/providers/anthropic-shared.test.js.map +1 -0
  291. package/packages/pi-ai/dist/types.d.ts +3 -3
  292. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  293. package/packages/pi-ai/dist/types.js.map +1 -1
  294. package/packages/pi-ai/dist/utils/json-parse.d.ts +3 -0
  295. package/packages/pi-ai/dist/utils/json-parse.d.ts.map +1 -1
  296. package/packages/pi-ai/dist/utils/json-parse.js +24 -1
  297. package/packages/pi-ai/dist/utils/json-parse.js.map +1 -1
  298. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts +37 -0
  299. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -0
  300. package/packages/pi-ai/dist/utils/repair-tool-json.js +75 -0
  301. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -0
  302. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts +2 -0
  303. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.d.ts.map +1 -0
  304. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +73 -0
  305. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -0
  306. package/packages/pi-ai/src/env-api-keys.ts +1 -0
  307. package/packages/pi-ai/src/index.ts +1 -0
  308. package/packages/pi-ai/src/providers/anthropic-shared.test.ts +29 -0
  309. package/packages/pi-ai/src/providers/anthropic-shared.ts +17 -2
  310. package/packages/pi-ai/src/types.ts +3 -2
  311. package/packages/pi-ai/src/utils/json-parse.ts +28 -1
  312. package/packages/pi-ai/src/utils/repair-tool-json.ts +88 -0
  313. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +102 -0
  314. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +4 -0
  315. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  316. package/packages/pi-coding-agent/dist/core/agent-session.js +31 -0
  317. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +17 -1
  319. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +62 -2
  321. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts +6 -0
  323. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.d.ts.map +1 -0
  324. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +176 -0
  325. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -0
  326. package/packages/pi-coding-agent/dist/core/exec.d.ts.map +1 -1
  327. package/packages/pi-coding-agent/dist/core/exec.js +3 -1
  328. package/packages/pi-coding-agent/dist/core/exec.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts +28 -0
  330. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.d.ts.map +1 -0
  331. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js +37 -0
  332. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.js.map +1 -0
  333. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts +2 -0
  334. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.d.ts.map +1 -0
  335. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js +63 -0
  336. package/packages/pi-coding-agent/dist/core/extensions/extension-manifest.test.js.map +1 -0
  337. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts +19 -0
  338. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.d.ts.map +1 -0
  339. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js +115 -0
  340. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.js.map +1 -0
  341. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts +2 -0
  342. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.d.ts.map +1 -0
  343. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js +109 -0
  344. package/packages/pi-coding-agent/dist/core/extensions/extension-sort.test.js.map +1 -0
  345. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +4 -0
  346. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  347. package/packages/pi-coding-agent/dist/core/extensions/index.js +2 -0
  348. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  349. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +5 -0
  350. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  351. package/packages/pi-coding-agent/dist/core/extensions/loader.js +5 -0
  352. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  353. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts +44 -0
  354. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.d.ts.map +1 -0
  355. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js +97 -0
  356. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.js.map +1 -0
  357. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts +2 -0
  358. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.d.ts.map +1 -0
  359. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js +181 -0
  360. package/packages/pi-coding-agent/dist/core/image-overflow-recovery.test.js.map +1 -0
  361. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -1
  362. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/core/index.js +1 -1
  364. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/lsp/index.js +3 -0
  367. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  369. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -0
  370. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  371. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/messages.js +31 -2
  373. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/messages.test.d.ts +9 -0
  375. package/packages/pi-coding-agent/dist/core/messages.test.d.ts.map +1 -0
  376. package/packages/pi-coding-agent/dist/core/messages.test.js +86 -0
  377. package/packages/pi-coding-agent/dist/core/messages.test.js.map +1 -0
  378. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  379. package/packages/pi-coding-agent/dist/core/model-resolver.js +1 -0
  380. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  381. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +10 -0
  382. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/resource-loader.js +12 -1
  384. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +6 -0
  386. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/retry-handler.js +48 -1
  388. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts +9 -0
  390. package/packages/pi-coding-agent/dist/core/retry-handler.test.d.ts.map +1 -0
  391. package/packages/pi-coding-agent/dist/core/retry-handler.test.js +193 -0
  392. package/packages/pi-coding-agent/dist/core/retry-handler.test.js.map +1 -0
  393. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  394. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +10 -3
  395. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  396. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/tools/read.js +13 -4
  398. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  399. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts +16 -0
  400. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.d.ts.map +1 -0
  401. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +80 -0
  402. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -0
  403. package/packages/pi-coding-agent/dist/index.d.ts +2 -2
  404. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  405. package/packages/pi-coding-agent/dist/index.js +1 -1
  406. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  407. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts +1 -1
  408. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.d.ts.map +1 -1
  409. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js +9 -8
  410. package/packages/pi-coding-agent/dist/modes/interactive/components/armin.js.map +1 -1
  411. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  412. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js +0 -3
  413. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  414. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts +1 -0
  415. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  416. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js +2 -1
  417. package/packages/pi-coding-agent/dist/modes/interactive/components/bash-execution.js.map +1 -1
  418. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js +1 -1
  419. package/packages/pi-coding-agent/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  420. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js +1 -1
  421. package/packages/pi-coding-agent/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  422. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js +1 -1
  423. package/packages/pi-coding-agent/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  424. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  425. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js +5 -2
  426. package/packages/pi-coding-agent/dist/modes/interactive/components/config-selector.js.map +1 -1
  427. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts +1 -0
  428. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  429. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js +4 -0
  430. package/packages/pi-coding-agent/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  431. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js +1 -1
  432. package/packages/pi-coding-agent/dist/modes/interactive/components/custom-message.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts +1 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js +4 -2
  436. package/packages/pi-coding-agent/dist/modes/interactive/components/daxnuts.js.map +1 -1
  437. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js +2 -2
  438. package/packages/pi-coding-agent/dist/modes/interactive/components/diff.js.map +1 -1
  439. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  440. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js +8 -1
  441. package/packages/pi-coding-agent/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  442. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  443. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js +2 -0
  444. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-input.js.map +1 -1
  445. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  446. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js +4 -0
  447. package/packages/pi-coding-agent/dist/modes/interactive/components/extension-selector.js.map +1 -1
  448. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  449. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +26 -12
  450. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  451. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js +4 -4
  452. package/packages/pi-coding-agent/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  453. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts +3 -0
  454. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  455. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +46 -14
  456. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  457. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  458. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js +2 -8
  459. package/packages/pi-coding-agent/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  460. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +4 -4
  461. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  462. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +2 -2
  463. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  464. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  465. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +8 -3
  466. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  467. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  468. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js +3 -2
  469. package/packages/pi-coding-agent/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  470. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  471. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +19 -1
  472. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  473. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.d.ts.map +1 -1
  474. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +16 -1
  475. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  476. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -0
  477. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  478. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +27 -4
  479. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  480. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  481. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +6 -0
  482. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  483. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +1 -1
  484. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  485. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts +1 -0
  486. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.d.ts.map +1 -1
  487. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js +5 -0
  488. package/packages/pi-coding-agent/dist/modes/rpc/remote-terminal.js.map +1 -1
  489. package/packages/pi-coding-agent/package.json +1 -1
  490. package/packages/pi-coding-agent/src/core/agent-session.ts +38 -1
  491. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +236 -0
  492. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +94 -1
  493. package/packages/pi-coding-agent/src/core/exec.ts +3 -1
  494. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.test.ts +77 -0
  495. package/packages/pi-coding-agent/src/core/extensions/extension-manifest.ts +62 -0
  496. package/packages/pi-coding-agent/src/core/extensions/extension-sort.test.ts +134 -0
  497. package/packages/pi-coding-agent/src/core/extensions/extension-sort.ts +137 -0
  498. package/packages/pi-coding-agent/src/core/extensions/index.ts +4 -0
  499. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  500. package/packages/pi-coding-agent/src/core/image-overflow-recovery.test.ts +228 -0
  501. package/packages/pi-coding-agent/src/core/image-overflow-recovery.ts +118 -0
  502. package/packages/pi-coding-agent/src/core/index.ts +6 -0
  503. package/packages/pi-coding-agent/src/core/lsp/index.ts +3 -0
  504. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -0
  505. package/packages/pi-coding-agent/src/core/messages.test.ts +114 -0
  506. package/packages/pi-coding-agent/src/core/messages.ts +29 -2
  507. package/packages/pi-coding-agent/src/core/model-resolver.ts +1 -0
  508. package/packages/pi-coding-agent/src/core/resource-loader.ts +20 -1
  509. package/packages/pi-coding-agent/src/core/retry-handler.test.ts +255 -0
  510. package/packages/pi-coding-agent/src/core/retry-handler.ts +52 -1
  511. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +11 -3
  512. package/packages/pi-coding-agent/src/core/tools/read.ts +14 -4
  513. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +92 -0
  514. package/packages/pi-coding-agent/src/index.ts +6 -0
  515. package/packages/pi-coding-agent/src/modes/interactive/components/armin.ts +9 -9
  516. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +0 -2
  517. package/packages/pi-coding-agent/src/modes/interactive/components/bash-execution.ts +3 -1
  518. package/packages/pi-coding-agent/src/modes/interactive/components/bordered-loader.ts +1 -1
  519. package/packages/pi-coding-agent/src/modes/interactive/components/branch-summary-message.ts +1 -1
  520. package/packages/pi-coding-agent/src/modes/interactive/components/compaction-summary-message.ts +1 -1
  521. package/packages/pi-coding-agent/src/modes/interactive/components/config-selector.ts +7 -2
  522. package/packages/pi-coding-agent/src/modes/interactive/components/countdown-timer.ts +3 -0
  523. package/packages/pi-coding-agent/src/modes/interactive/components/custom-message.ts +1 -1
  524. package/packages/pi-coding-agent/src/modes/interactive/components/daxnuts.ts +4 -3
  525. package/packages/pi-coding-agent/src/modes/interactive/components/diff.ts +2 -2
  526. package/packages/pi-coding-agent/src/modes/interactive/components/dynamic-border.ts +3 -1
  527. package/packages/pi-coding-agent/src/modes/interactive/components/extension-input.ts +1 -0
  528. package/packages/pi-coding-agent/src/modes/interactive/components/extension-selector.ts +4 -0
  529. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +27 -13
  530. package/packages/pi-coding-agent/src/modes/interactive/components/oauth-selector.ts +4 -4
  531. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +45 -14
  532. package/packages/pi-coding-agent/src/modes/interactive/components/scoped-models-selector.ts +2 -7
  533. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +4 -4
  534. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +2 -2
  535. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +8 -3
  536. package/packages/pi-coding-agent/src/modes/interactive/components/user-message-selector.ts +3 -2
  537. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +24 -1
  538. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +14 -1
  539. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +35 -3
  540. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +7 -0
  541. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +1 -1
  542. package/packages/pi-coding-agent/src/modes/rpc/remote-terminal.ts +6 -0
  543. package/packages/pi-tui/dist/terminal.d.ts +2 -0
  544. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  545. package/packages/pi-tui/dist/terminal.js +9 -0
  546. package/packages/pi-tui/dist/terminal.js.map +1 -1
  547. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  548. package/packages/pi-tui/dist/tui.js +9 -0
  549. package/packages/pi-tui/dist/tui.js.map +1 -1
  550. package/packages/pi-tui/src/terminal.ts +14 -0
  551. package/packages/pi-tui/src/tui.ts +8 -0
  552. package/pkg/dist/modes/interactive/theme/themes.js +1 -1
  553. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  554. package/pkg/package.json +1 -1
  555. package/scripts/ensure-workspace-builds.cjs +45 -14
  556. package/src/resources/agents/researcher.md +1 -1
  557. package/src/resources/extensions/ask-user-questions.ts +21 -3
  558. package/src/resources/extensions/async-jobs/extension-manifest.json +1 -1
  559. package/src/resources/extensions/bg-shell/extension-manifest.json +1 -1
  560. package/src/resources/extensions/browser-tools/extension-manifest.json +1 -1
  561. package/src/resources/extensions/claude-code-cli/partial-builder.ts +13 -6
  562. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +63 -35
  563. package/src/resources/extensions/claude-code-cli/tests/partial-builder.test.ts +28 -0
  564. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +108 -1
  565. package/src/resources/extensions/context7/extension-manifest.json +1 -1
  566. package/src/resources/extensions/get-secrets-from-user.ts +8 -5
  567. package/src/resources/extensions/google-search/extension-manifest.json +1 -1
  568. package/src/resources/extensions/google-search/index.ts +2 -1
  569. package/src/resources/extensions/gsd/auto/loop-deps.ts +1 -0
  570. package/src/resources/extensions/gsd/auto/phases.ts +43 -34
  571. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  572. package/src/resources/extensions/gsd/auto-dashboard.ts +37 -19
  573. package/src/resources/extensions/gsd/auto-dispatch.ts +18 -2
  574. package/src/resources/extensions/gsd/auto-model-selection.ts +26 -5
  575. package/src/resources/extensions/gsd/auto-post-unit.ts +18 -4
  576. package/src/resources/extensions/gsd/auto-prompts.ts +1 -1
  577. package/src/resources/extensions/gsd/auto-recovery.ts +12 -5
  578. package/src/resources/extensions/gsd/auto-start.ts +35 -26
  579. package/src/resources/extensions/gsd/auto-worktree.ts +193 -9
  580. package/src/resources/extensions/gsd/auto.ts +5 -0
  581. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +31 -0
  582. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +85 -8
  583. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +38 -1
  584. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +41 -35
  585. package/src/resources/extensions/gsd/bootstrap/system-context.ts +72 -12
  586. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +75 -0
  587. package/src/resources/extensions/gsd/captures.ts +63 -3
  588. package/src/resources/extensions/gsd/codebase-generator.ts +351 -0
  589. package/src/resources/extensions/gsd/commands/catalog.ts +10 -1
  590. package/src/resources/extensions/gsd/commands/handlers/ops.ts +5 -0
  591. package/src/resources/extensions/gsd/commands-codebase.ts +164 -0
  592. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +46 -4
  593. package/src/resources/extensions/gsd/complexity-classifier.ts +8 -6
  594. package/src/resources/extensions/gsd/db-writer.ts +140 -7
  595. package/src/resources/extensions/gsd/doctor-git-checks.ts +75 -1
  596. package/src/resources/extensions/gsd/doctor-proactive.ts +35 -1
  597. package/src/resources/extensions/gsd/doctor-providers.ts +2 -1
  598. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +5 -4
  599. package/src/resources/extensions/gsd/doctor-types.ts +2 -0
  600. package/src/resources/extensions/gsd/doctor.ts +3 -1
  601. package/src/resources/extensions/gsd/error-classifier.ts +13 -11
  602. package/src/resources/extensions/gsd/extension-manifest.json +16 -1
  603. package/src/resources/extensions/gsd/forensics.ts +144 -20
  604. package/src/resources/extensions/gsd/git-service.ts +119 -3
  605. package/src/resources/extensions/gsd/gitignore.ts +33 -0
  606. package/src/resources/extensions/gsd/gsd-db.ts +43 -7
  607. package/src/resources/extensions/gsd/guided-flow.ts +114 -45
  608. package/src/resources/extensions/gsd/health-widget-core.ts +34 -0
  609. package/src/resources/extensions/gsd/health-widget.ts +17 -0
  610. package/src/resources/extensions/gsd/index.ts +1 -0
  611. package/src/resources/extensions/gsd/memory-extractor.ts +8 -0
  612. package/src/resources/extensions/gsd/migrate-external.ts +9 -1
  613. package/src/resources/extensions/gsd/milestone-validation-gates.ts +56 -0
  614. package/src/resources/extensions/gsd/model-cost-table.ts +19 -0
  615. package/src/resources/extensions/gsd/model-router.ts +35 -1
  616. package/src/resources/extensions/gsd/native-git-bridge.ts +41 -0
  617. package/src/resources/extensions/gsd/notifications.ts +16 -0
  618. package/src/resources/extensions/gsd/parallel-eligibility.ts +15 -2
  619. package/src/resources/extensions/gsd/parallel-merge.ts +87 -4
  620. package/src/resources/extensions/gsd/parsers-legacy.ts +22 -3
  621. package/src/resources/extensions/gsd/paths.ts +44 -0
  622. package/src/resources/extensions/gsd/preferences-models.ts +14 -1
  623. package/src/resources/extensions/gsd/preferences-types.ts +10 -1
  624. package/src/resources/extensions/gsd/preferences.ts +13 -15
  625. package/src/resources/extensions/gsd/prompt-loader.ts +4 -1
  626. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  627. package/src/resources/extensions/gsd/prompts/complete-slice.md +4 -2
  628. package/src/resources/extensions/gsd/prompts/discuss-headless.md +1 -1
  629. package/src/resources/extensions/gsd/prompts/discuss.md +1 -1
  630. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -1
  631. package/src/resources/extensions/gsd/prompts/forensics.md +2 -2
  632. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +1 -1
  633. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +1 -1
  634. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  635. package/src/resources/extensions/gsd/prompts/rethink.md +1 -1
  636. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -0
  637. package/src/resources/extensions/gsd/repo-identity.ts +186 -11
  638. package/src/resources/extensions/gsd/rethink.ts +6 -0
  639. package/src/resources/extensions/gsd/roadmap-slices.ts +5 -4
  640. package/src/resources/extensions/gsd/state.ts +84 -32
  641. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +47 -0
  642. package/src/resources/extensions/gsd/tests/auto-mode-interactive-guard.test.ts +71 -0
  643. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +71 -1
  644. package/src/resources/extensions/gsd/tests/captures.test.ts +103 -0
  645. package/src/resources/extensions/gsd/tests/cli-provider-rate-limit.test.ts +47 -0
  646. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +488 -0
  647. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +27 -0
  648. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +21 -0
  649. package/src/resources/extensions/gsd/tests/completion-hierarchy-guards.test.ts +192 -0
  650. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +4 -4
  651. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +131 -0
  652. package/src/resources/extensions/gsd/tests/db-writer.test.ts +7 -12
  653. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +78 -5
  654. package/src/resources/extensions/gsd/tests/derive-state.test.ts +29 -0
  655. package/src/resources/extensions/gsd/tests/discord-invite-links.test.ts +47 -0
  656. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +127 -0
  657. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +40 -0
  658. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +20 -1
  659. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -0
  660. package/src/resources/extensions/gsd/tests/dynamic-routing-default.test.ts +20 -0
  661. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +74 -0
  662. package/src/resources/extensions/gsd/tests/event-replay-idempotency.test.ts +140 -0
  663. package/src/resources/extensions/gsd/tests/forensics-context-persist.test.ts +129 -0
  664. package/src/resources/extensions/gsd/tests/forensics-db-completion.test.ts +96 -0
  665. package/src/resources/extensions/gsd/tests/forensics-dedup.test.ts +31 -0
  666. package/src/resources/extensions/gsd/tests/gsd-tools.test.ts +125 -12
  667. package/src/resources/extensions/gsd/tests/gsdroot-worktree-detection.test.ts +164 -0
  668. package/src/resources/extensions/gsd/tests/guided-flow-dynamic-routing.test.ts +135 -0
  669. package/src/resources/extensions/gsd/tests/guided-flow-session-isolation.test.ts +97 -0
  670. package/src/resources/extensions/gsd/tests/health-widget.test.ts +67 -0
  671. package/src/resources/extensions/gsd/tests/hook-key-parsing.test.ts +107 -0
  672. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +111 -1
  673. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +134 -0
  674. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +59 -0
  675. package/src/resources/extensions/gsd/tests/integration/doctor-false-positives.test.ts +243 -0
  676. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +72 -0
  677. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +68 -0
  678. package/src/resources/extensions/gsd/tests/integration/gitignore-staging-2570.test.ts +150 -0
  679. package/src/resources/extensions/gsd/tests/integration/parallel-merge.test.ts +110 -0
  680. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +1 -1
  681. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +959 -0
  682. package/src/resources/extensions/gsd/tests/memory-extractor.test.ts +85 -2
  683. package/src/resources/extensions/gsd/tests/migrate-external-worktree.test.ts +105 -0
  684. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +116 -0
  685. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +34 -0
  686. package/src/resources/extensions/gsd/tests/model-router.test.ts +68 -3
  687. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +28 -0
  688. package/src/resources/extensions/gsd/tests/notifications.test.ts +45 -0
  689. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +159 -0
  690. package/src/resources/extensions/gsd/tests/parallel-eligibility-ghost.test.ts +150 -0
  691. package/src/resources/extensions/gsd/tests/plan-milestone-title.test.ts +70 -0
  692. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +33 -1
  693. package/src/resources/extensions/gsd/tests/project-relocation-recovery.test.ts +297 -0
  694. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +29 -0
  695. package/src/resources/extensions/gsd/tests/prompt-loader-replacement.test.ts +178 -0
  696. package/src/resources/extensions/gsd/tests/prompt-tool-names.test.ts +69 -0
  697. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +38 -0
  698. package/src/resources/extensions/gsd/tests/queue-execution-guard.test.ts +157 -0
  699. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +90 -0
  700. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +117 -0
  701. package/src/resources/extensions/gsd/tests/reconciliation-edge-cases.test.ts +162 -0
  702. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +97 -0
  703. package/src/resources/extensions/gsd/tests/secure-env-collect.test.ts +134 -0
  704. package/src/resources/extensions/gsd/tests/slice-disk-reconcile.test.ts +233 -0
  705. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +305 -0
  706. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +405 -0
  707. package/src/resources/extensions/gsd/tests/state-derivation-parity.test.ts +257 -0
  708. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +1628 -0
  709. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +106 -0
  710. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +174 -0
  711. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +221 -0
  712. package/src/resources/extensions/gsd/tests/terminated-transient.test.ts +44 -0
  713. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +2 -1
  714. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +8 -0
  715. package/src/resources/extensions/gsd/tests/uat-stuck-loop-orphaned-worktree.test.ts +289 -0
  716. package/src/resources/extensions/gsd/tests/unit-ownership.test.ts +100 -17
  717. package/src/resources/extensions/gsd/tests/vacuum-recovery.test.ts +154 -0
  718. package/src/resources/extensions/gsd/tests/validate-milestone-write-order.test.ts +4 -1
  719. package/src/resources/extensions/gsd/tests/verdict-parser.test.ts +156 -0
  720. package/src/resources/extensions/gsd/tests/verification-operational-gate.test.ts +82 -0
  721. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +48 -0
  722. package/src/resources/extensions/gsd/tests/workflow-manifest.test.ts +92 -0
  723. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +4 -2
  724. package/src/resources/extensions/gsd/tests/worktree-db-respawn-truncation.test.ts +140 -0
  725. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +101 -0
  726. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +48 -1
  727. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +29 -5
  728. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +95 -0
  729. package/src/resources/extensions/gsd/tools/complete-task.ts +36 -74
  730. package/src/resources/extensions/gsd/tools/plan-milestone.ts +13 -1
  731. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +36 -0
  732. package/src/resources/extensions/gsd/tools/validate-milestone.ts +20 -2
  733. package/src/resources/extensions/gsd/triage-resolution.ts +23 -6
  734. package/src/resources/extensions/gsd/types.ts +4 -2
  735. package/src/resources/extensions/gsd/undo.ts +2 -2
  736. package/src/resources/extensions/gsd/unit-ownership.ts +206 -35
  737. package/src/resources/extensions/gsd/verdict-parser.ts +21 -6
  738. package/src/resources/extensions/gsd/watch/header-renderer.ts +275 -0
  739. package/src/resources/extensions/gsd/workflow-logger.ts +3 -1
  740. package/src/resources/extensions/gsd/workflow-manifest.ts +22 -5
  741. package/src/resources/extensions/gsd/workflow-projections.ts +97 -64
  742. package/src/resources/extensions/gsd/workflow-reconcile.ts +39 -10
  743. package/src/resources/extensions/gsd/workspace-index.ts +30 -0
  744. package/src/resources/extensions/gsd/worktree-manager.ts +120 -1
  745. package/src/resources/extensions/gsd/worktree-resolver.ts +22 -3
  746. package/src/resources/extensions/mcp-client/index.ts +13 -7
  747. package/src/resources/extensions/mcp-client/tests/server-name-spaces.test.ts +55 -0
  748. package/src/resources/extensions/ollama/index.ts +130 -0
  749. package/src/resources/extensions/ollama/model-capabilities.ts +145 -0
  750. package/src/resources/extensions/ollama/ollama-client.ts +196 -0
  751. package/src/resources/extensions/ollama/ollama-commands.ts +248 -0
  752. package/src/resources/extensions/ollama/ollama-discovery.ts +106 -0
  753. package/src/resources/extensions/ollama/ollama-tool.ts +218 -0
  754. package/src/resources/extensions/ollama/tests/model-capabilities.test.ts +162 -0
  755. package/src/resources/extensions/ollama/tests/ollama-client.test.ts +38 -0
  756. package/src/resources/extensions/ollama/tests/ollama-discovery.test.ts +28 -0
  757. package/src/resources/extensions/ollama/types.ts +130 -0
  758. package/src/resources/extensions/search-the-web/extension-manifest.json +1 -1
  759. package/src/resources/extensions/shared/interview-ui.ts +12 -1
  760. package/src/resources/extensions/shared/tests/ask-user-freetext.test.ts +156 -0
  761. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -3
  762. package/src/resources/skills/create-gsd-extension/references/key-rules-gotchas.md +5 -4
  763. package/src/resources/skills/create-gsd-extension/workflows/add-capability.md +2 -2
  764. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +4 -4
  765. package/src/resources/skills/create-gsd-extension/workflows/debug-extension.md +5 -3
  766. package/dist/web/standalone/.next/static/chunks/6502.8b732f67a11b11b4.js +0 -9
  767. package/dist/web/standalone/.next/static/css/a58ef8a151aa0493.css +0 -1
  768. package/src/resources/extensions/gsd/tests/empty-db-reconciliation.test.ts +0 -79
  769. /package/dist/web/standalone/.next/static/{OS7_z6QaL6uqp8q5pjHSJ → uDm3eO1oo9lDfY2TyoO9t}/_buildManifest.js +0 -0
  770. /package/dist/web/standalone/.next/static/{OS7_z6QaL6uqp8q5pjHSJ → uDm3eO1oo9lDfY2TyoO9t}/_ssgManifest.js +0 -0
@@ -0,0 +1,86 @@
1
+ /**
2
+ * messages.test.ts — Tests for convertToLlm custom message handling.
3
+ *
4
+ * Reproduction test for #3026: background job completion notifications
5
+ * delivered as custom messages must be clearly distinguishable from
6
+ * user-typed input when converted to LLM messages.
7
+ */
8
+ import test from "node:test";
9
+ import assert from "node:assert/strict";
10
+ import { convertToLlm } from "./messages.js";
11
+ /** Extract the first content block from a message, asserting array content. */
12
+ function firstTextBlock(msg) {
13
+ const { content } = msg;
14
+ assert.ok(Array.isArray(content), "Expected content to be an array");
15
+ const block = content[0];
16
+ assert.ok(typeof block === "object" && block !== null, "Expected first block to be an object");
17
+ return block;
18
+ }
19
+ test("convertToLlm wraps custom messages with system notification prefix", () => {
20
+ const customMsg = {
21
+ role: "custom",
22
+ customType: "async_job_result",
23
+ content: "**Background job done: bg_abc123** (sleep 2, 2.1s)\n\ndone",
24
+ display: true,
25
+ timestamp: Date.now(),
26
+ };
27
+ const result = convertToLlm([customMsg]);
28
+ assert.equal(result.length, 1);
29
+ assert.equal(result[0].role, "user");
30
+ // The content must include a system notification wrapper so the LLM
31
+ // does not confuse it with user input (#3026).
32
+ const text = firstTextBlock(result[0]);
33
+ assert.equal(text.type, "text");
34
+ assert.ok("text" in text && text.text.includes("[system notification"), "Custom message should be wrapped with system notification marker");
35
+ });
36
+ test("convertToLlm wraps custom messages with array content", () => {
37
+ const customMsg = {
38
+ role: "custom",
39
+ customType: "bg-shell-status",
40
+ content: [{ type: "text", text: "Background processes:\n ✓ bg1 dev-server :3000" }],
41
+ display: false,
42
+ timestamp: Date.now(),
43
+ };
44
+ const result = convertToLlm([customMsg]);
45
+ assert.equal(result.length, 1);
46
+ assert.equal(result[0].role, "user");
47
+ const text = firstTextBlock(result[0]);
48
+ assert.equal(text.type, "text");
49
+ assert.ok("text" in text && text.text.includes("[system notification"), "Custom message with array content should be wrapped with system notification marker");
50
+ });
51
+ test("convertToLlm includes customType in notification wrapper", () => {
52
+ const customMsg = {
53
+ role: "custom",
54
+ customType: "async_job_result",
55
+ content: "job output here",
56
+ display: true,
57
+ timestamp: Date.now(),
58
+ };
59
+ const result = convertToLlm([customMsg]);
60
+ const text = firstTextBlock(result[0]);
61
+ assert.ok("text" in text && text.text.includes("async_job_result"), "Notification wrapper should include the customType for context");
62
+ });
63
+ test("convertToLlm notification wrapper instructs LLM not to treat as user input", () => {
64
+ const customMsg = {
65
+ role: "custom",
66
+ customType: "async_job_result",
67
+ content: "**Background job done: bg_abc123** (sleep 2, 2.1s)\n\ndone",
68
+ display: true,
69
+ timestamp: Date.now(),
70
+ };
71
+ const result = convertToLlm([customMsg]);
72
+ const text = firstTextBlock(result[0]);
73
+ assert.ok("text" in text && text.text.includes("not user input"), "Notification should explicitly state this is not user input");
74
+ });
75
+ test("convertToLlm preserves user messages without wrapper", () => {
76
+ const userMsg = {
77
+ role: "user",
78
+ content: [{ type: "text", text: "Hello world" }],
79
+ timestamp: Date.now(),
80
+ };
81
+ const result = convertToLlm([userMsg]);
82
+ assert.equal(result.length, 1);
83
+ const text = firstTextBlock(result[0]);
84
+ assert.ok("text" in text && text.text === "Hello world", "User messages should pass through unchanged");
85
+ });
86
+ //# sourceMappingURL=messages.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.test.js","sourceRoot":"","sources":["../../src/core/messages.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * messages.test.ts — Tests for convertToLlm custom message handling.\n *\n * Reproduction test for #3026: background job completion notifications\n * delivered as custom messages must be clearly distinguishable from\n * user-typed input when converted to LLM messages.\n */\n\nimport test from \"node:test\";\nimport assert from \"node:assert/strict\";\nimport { convertToLlm, type CustomMessage } from \"./messages.js\";\n\n/** Extract the first content block from a message, asserting array content. */\nfunction firstTextBlock(msg: ReturnType<typeof convertToLlm>[number]) {\n\tconst { content } = msg;\n\tassert.ok(Array.isArray(content), \"Expected content to be an array\");\n\tconst block = content[0];\n\tassert.ok(typeof block === \"object\" && block !== null, \"Expected first block to be an object\");\n\treturn block;\n}\n\ntest(\"convertToLlm wraps custom messages with system notification prefix\", () => {\n\tconst customMsg: CustomMessage = {\n\t\trole: \"custom\",\n\t\tcustomType: \"async_job_result\",\n\t\tcontent: \"**Background job done: bg_abc123** (sleep 2, 2.1s)\\n\\ndone\",\n\t\tdisplay: true,\n\t\ttimestamp: Date.now(),\n\t};\n\n\tconst result = convertToLlm([customMsg]);\n\tassert.equal(result.length, 1);\n\tassert.equal(result[0].role, \"user\");\n\n\t// The content must include a system notification wrapper so the LLM\n\t// does not confuse it with user input (#3026).\n\tconst text = firstTextBlock(result[0]);\n\tassert.equal(text.type, \"text\");\n\tassert.ok(\n\t\t\"text\" in text && text.text.includes(\"[system notification\"),\n\t\t\"Custom message should be wrapped with system notification marker\",\n\t);\n});\n\ntest(\"convertToLlm wraps custom messages with array content\", () => {\n\tconst customMsg: CustomMessage = {\n\t\trole: \"custom\",\n\t\tcustomType: \"bg-shell-status\",\n\t\tcontent: [{ type: \"text\", text: \"Background processes:\\n ✓ bg1 dev-server :3000\" }],\n\t\tdisplay: false,\n\t\ttimestamp: Date.now(),\n\t};\n\n\tconst result = convertToLlm([customMsg]);\n\tassert.equal(result.length, 1);\n\tassert.equal(result[0].role, \"user\");\n\n\tconst text = firstTextBlock(result[0]);\n\tassert.equal(text.type, \"text\");\n\tassert.ok(\n\t\t\"text\" in text && text.text.includes(\"[system notification\"),\n\t\t\"Custom message with array content should be wrapped with system notification marker\",\n\t);\n});\n\ntest(\"convertToLlm includes customType in notification wrapper\", () => {\n\tconst customMsg: CustomMessage = {\n\t\trole: \"custom\",\n\t\tcustomType: \"async_job_result\",\n\t\tcontent: \"job output here\",\n\t\tdisplay: true,\n\t\ttimestamp: Date.now(),\n\t};\n\n\tconst result = convertToLlm([customMsg]);\n\tconst text = firstTextBlock(result[0]);\n\tassert.ok(\n\t\t\"text\" in text && text.text.includes(\"async_job_result\"),\n\t\t\"Notification wrapper should include the customType for context\",\n\t);\n});\n\ntest(\"convertToLlm notification wrapper instructs LLM not to treat as user input\", () => {\n\tconst customMsg: CustomMessage = {\n\t\trole: \"custom\",\n\t\tcustomType: \"async_job_result\",\n\t\tcontent: \"**Background job done: bg_abc123** (sleep 2, 2.1s)\\n\\ndone\",\n\t\tdisplay: true,\n\t\ttimestamp: Date.now(),\n\t};\n\n\tconst result = convertToLlm([customMsg]);\n\tconst text = firstTextBlock(result[0]);\n\tassert.ok(\n\t\t\"text\" in text && text.text.includes(\"not user input\"),\n\t\t\"Notification should explicitly state this is not user input\",\n\t);\n});\n\ntest(\"convertToLlm preserves user messages without wrapper\", () => {\n\tconst userMsg = {\n\t\trole: \"user\" as const,\n\t\tcontent: [{ type: \"text\" as const, text: \"Hello world\" }],\n\t\ttimestamp: Date.now(),\n\t};\n\n\tconst result = convertToLlm([userMsg]);\n\tassert.equal(result.length, 1);\n\tconst text = firstTextBlock(result[0]);\n\tassert.ok(\n\t\t\"text\" in text && text.text === \"Hello world\",\n\t\t\"User messages should pass through unchanged\",\n\t);\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../../src/core/model-resolver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,KAAK,GAAG,EAAsB,KAAK,KAAK,EAAkB,MAAM,YAAY,CAAC;AAKtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAgCzD,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,kGAAkG;IAClG,aAAa,CAAC,EAAE,aAAa,CAAC;CAC9B;AAkED,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9B,6EAA6E;IAC7E,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAsFD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAsEhH;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,aAAa,CAAC;CAC7B,GAAG,qBAAqB,CA8HxB;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9B,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,aAAa,CAAC;IACrC,aAAa,EAAE,aAAa,CAAC;CAC7B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqF9B"}
1
+ {"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../../src/core/model-resolver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,KAAK,GAAG,EAAsB,KAAK,KAAK,EAAkB,MAAM,YAAY,CAAC;AAKtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAiCzD,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAClB,kGAAkG;IAClG,aAAa,CAAC,EAAE,aAAa,CAAC;CAC9B;AAkED,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9B,6EAA6E;IAC7E,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B;AAsFD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAsEhH;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9B,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B;;;OAGG;IACH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,aAAa,CAAC;CAC7B,GAAG,qBAAqB,CA8HxB;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9B,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,aAAa,CAAC;IACrC,aAAa,EAAE,aAAa,CAAC;CAC7B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqF9B"}
@@ -33,6 +33,7 @@ const defaultModelPerProvider = {
33
33
  "opencode-go": "kimi-k2.5",
34
34
  "kimi-coding": "kimi-k2-thinking",
35
35
  "alibaba-coding-plan": "qwen3.5-plus",
36
+ ollama: "llama3.1:8b",
36
37
  "ollama-cloud": "qwen3:32b",
37
38
  };
38
39
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../src/core/model-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Model resolution, scoping, and initial selection\n */\n\nimport type { ThinkingLevel } from \"@gsd/pi-agent-core\";\nimport { type Api, type KnownProvider, type Model, modelsAreEqual } from \"@gsd/pi-ai\";\nimport chalk from \"chalk\";\nimport { minimatch } from \"minimatch\";\nimport { isValidThinkingLevel } from \"../cli/args.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport type { ModelRegistry } from \"./model-registry.js\";\n\n/** Default model IDs for each known provider */\nconst defaultModelPerProvider: Record<KnownProvider, string> = {\n\t\"amazon-bedrock\": \"us.anthropic.claude-opus-4-6-v1\",\n\tanthropic: \"claude-opus-4-6[1m]\",\n\t\"anthropic-vertex\": \"claude-sonnet-4-6\",\n\topenai: \"gpt-5.4\",\n\t\"azure-openai-responses\": \"gpt-5.2\",\n\t\"openai-codex\": \"gpt-5.4\",\n\tgoogle: \"gemini-2.5-pro\",\n\t\"google-gemini-cli\": \"gemini-2.5-pro\",\n\t\"google-antigravity\": \"gemini-3.1-pro-high\",\n\t\"google-vertex\": \"gemini-3-pro-preview\",\n\t\"github-copilot\": \"gpt-4o\",\n\topenrouter: \"openai/gpt-5.1-codex\",\n\t\"vercel-ai-gateway\": \"anthropic/claude-opus-4-6[1m]\",\n\txai: \"grok-4-fast-non-reasoning\",\n\tgroq: \"openai/gpt-oss-120b\",\n\tcerebras: \"zai-glm-4.6\",\n\tzai: \"glm-4.6\",\n\tmistral: \"devstral-medium-latest\",\n\tminimax: \"MiniMax-M2.1\",\n\t\"minimax-cn\": \"MiniMax-M2.1\",\n\thuggingface: \"moonshotai/Kimi-K2.5\",\n\topencode: \"claude-opus-4-6\",\n\t\"opencode-go\": \"kimi-k2.5\",\n\t\"kimi-coding\": \"kimi-k2-thinking\",\n\t\"alibaba-coding-plan\": \"qwen3.5-plus\",\n\t\"ollama-cloud\": \"qwen3:32b\",\n};\n\nexport interface ScopedModel {\n\tmodel: Model<Api>;\n\t/** Thinking level if explicitly specified in pattern (e.g., \"model:high\"), undefined otherwise */\n\tthinkingLevel?: ThinkingLevel;\n}\n\n/**\n * Helper to check if a model ID looks like an alias (no date suffix)\n * Dates are typically in format: -20241022 or -20250929\n */\nfunction isAlias(id: string): boolean {\n\t// Check if ID ends with -latest\n\tif (id.endsWith(\"-latest\")) return true;\n\n\t// Check if ID ends with a date pattern (-YYYYMMDD)\n\tconst datePattern = /-\\d{8}$/;\n\treturn !datePattern.test(id);\n}\n\n/**\n * Try to match a pattern to a model from the available models list.\n * Returns the matched model or undefined if no match found.\n */\nfunction tryMatchModel(modelPattern: string, availableModels: Model<Api>[]): Model<Api> | undefined {\n\t// Check for provider/modelId format (provider is everything before the first /)\n\tconst slashIndex = modelPattern.indexOf(\"/\");\n\tif (slashIndex !== -1) {\n\t\tconst provider = modelPattern.substring(0, slashIndex);\n\t\tconst modelId = modelPattern.substring(slashIndex + 1);\n\t\tconst providerMatch = availableModels.find(\n\t\t\t(m) => m.provider.toLowerCase() === provider.toLowerCase() && m.id.toLowerCase() === modelId.toLowerCase(),\n\t\t);\n\t\tif (providerMatch) {\n\t\t\treturn providerMatch;\n\t\t}\n\t\t// No exact provider/model match - fall through to other matching\n\t}\n\n\t// Check for exact ID match (case-insensitive)\n\tconst exactMatch = availableModels.find((m) => m.id.toLowerCase() === modelPattern.toLowerCase());\n\tif (exactMatch) {\n\t\treturn exactMatch;\n\t}\n\n\t// No exact match - fall back to partial matching\n\tconst matches = availableModels.filter(\n\t\t(m) =>\n\t\t\tm.id.toLowerCase().includes(modelPattern.toLowerCase()) ||\n\t\t\tm.name?.toLowerCase().includes(modelPattern.toLowerCase()),\n\t);\n\n\tif (matches.length === 0) {\n\t\treturn undefined;\n\t}\n\n\t// Separate into aliases and dated versions\n\tconst aliases = matches.filter((m) => isAlias(m.id));\n\tconst datedVersions = matches.filter((m) => !isAlias(m.id));\n\n\tif (aliases.length > 0) {\n\t\t// Prefer alias - if multiple aliases, pick the one that sorts highest\n\t\taliases.sort((a, b) => b.id.localeCompare(a.id));\n\t\treturn aliases[0];\n\t} else {\n\t\t// No alias found, pick latest dated version\n\t\tdatedVersions.sort((a, b) => b.id.localeCompare(a.id));\n\t\treturn datedVersions[0];\n\t}\n}\n\nexport interface ParsedModelResult {\n\tmodel: Model<Api> | undefined;\n\t/** Thinking level if explicitly specified in pattern, undefined otherwise */\n\tthinkingLevel?: ThinkingLevel;\n\twarning: string | undefined;\n}\n\nfunction buildFallbackModel(provider: string, modelId: string, availableModels: Model<Api>[]): Model<Api> | undefined {\n\tconst providerModels = availableModels.filter((m) => m.provider === provider);\n\tif (providerModels.length === 0) return undefined;\n\n\tconst defaultId = defaultModelPerProvider[provider as KnownProvider];\n\tconst baseModel = defaultId\n\t\t? (providerModels.find((m) => m.id === defaultId) ?? providerModels[0])\n\t\t: providerModels[0];\n\n\treturn {\n\t\t...baseModel,\n\t\tid: modelId,\n\t\tname: modelId,\n\t};\n}\n\n/**\n * Parse a pattern to extract model and thinking level.\n * Handles models with colons in their IDs (e.g., OpenRouter's :exacto suffix).\n *\n * Algorithm:\n * 1. Try to match full pattern as a model\n * 2. If found, return it with \"off\" thinking level\n * 3. If not found and has colons, split on last colon:\n * - If suffix is valid thinking level, use it and recurse on prefix\n * - If suffix is invalid, warn and recurse on prefix with \"off\"\n *\n * @internal\n */\nfunction parseModelPattern(\n\tpattern: string,\n\tavailableModels: Model<Api>[],\n\toptions?: { allowInvalidThinkingLevelFallback?: boolean },\n): ParsedModelResult {\n\t// Try exact match first\n\tconst exactMatch = tryMatchModel(pattern, availableModels);\n\tif (exactMatch) {\n\t\treturn { model: exactMatch, thinkingLevel: undefined, warning: undefined };\n\t}\n\n\t// No match - try splitting on last colon if present\n\tconst lastColonIndex = pattern.lastIndexOf(\":\");\n\tif (lastColonIndex === -1) {\n\t\t// No colons, pattern simply doesn't match any model\n\t\treturn { model: undefined, thinkingLevel: undefined, warning: undefined };\n\t}\n\n\tconst prefix = pattern.substring(0, lastColonIndex);\n\tconst suffix = pattern.substring(lastColonIndex + 1);\n\n\tif (isValidThinkingLevel(suffix)) {\n\t\t// Valid thinking level - recurse on prefix and use this level\n\t\tconst result = parseModelPattern(prefix, availableModels, options);\n\t\tif (result.model) {\n\t\t\t// Only use this thinking level if no warning from inner recursion\n\t\t\treturn {\n\t\t\t\tmodel: result.model,\n\t\t\t\tthinkingLevel: result.warning ? undefined : suffix,\n\t\t\t\twarning: result.warning,\n\t\t\t};\n\t\t}\n\t\treturn result;\n\t} else {\n\t\t// Invalid suffix\n\t\tconst allowFallback = options?.allowInvalidThinkingLevelFallback ?? true;\n\t\tif (!allowFallback) {\n\t\t\t// In strict mode (CLI --model parsing), treat it as part of the model id and fail.\n\t\t\t// This avoids accidentally resolving to a different model.\n\t\t\treturn { model: undefined, thinkingLevel: undefined, warning: undefined };\n\t\t}\n\n\t\t// Scope mode: recurse on prefix and warn\n\t\tconst result = parseModelPattern(prefix, availableModels, options);\n\t\tif (result.model) {\n\t\t\treturn {\n\t\t\t\tmodel: result.model,\n\t\t\t\tthinkingLevel: undefined,\n\t\t\t\twarning: `Invalid thinking level \"${suffix}\" in pattern \"${pattern}\". Using default instead.`,\n\t\t\t};\n\t\t}\n\t\treturn result;\n\t}\n}\n\n/**\n * Resolve model patterns to actual Model objects with optional thinking levels\n * Format: \"pattern:level\" where :level is optional\n * For each pattern, finds all matching models and picks the best version:\n * 1. Prefer alias (e.g., claude-sonnet-4-5) over dated versions (claude-sonnet-4-5-20250929)\n * 2. If no alias, pick the latest dated version\n *\n * Supports models with colons in their IDs (e.g., OpenRouter's model:exacto).\n * The algorithm tries to match the full pattern first, then progressively\n * strips colon-suffixes to find a match.\n */\nexport async function resolveModelScope(patterns: string[], modelRegistry: ModelRegistry): Promise<ScopedModel[]> {\n\tconst availableModels = await modelRegistry.getAvailable();\n\tconst scopedModels: ScopedModel[] = [];\n\n\tfor (const pattern of patterns) {\n\t\t// Try exact match first (handles model IDs containing glob chars like [1m])\n\t\tconst exactResult = parseModelPattern(pattern, availableModels);\n\t\tif (exactResult.model) {\n\t\t\tif (exactResult.warning) {\n\t\t\t\tconsole.warn(chalk.yellow(`Warning: ${exactResult.warning}`));\n\t\t\t}\n\t\t\tif (!scopedModels.find((sm) => modelsAreEqual(sm.model, exactResult.model!))) {\n\t\t\t\tscopedModels.push({ model: exactResult.model, thinkingLevel: exactResult.thinkingLevel });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check if pattern contains glob characters\n\t\tif (pattern.includes(\"*\") || pattern.includes(\"?\") || pattern.includes(\"[\")) {\n\t\t\t// Extract optional thinking level suffix (e.g., \"provider/*:high\")\n\t\t\tconst colonIdx = pattern.lastIndexOf(\":\");\n\t\t\tlet globPattern = pattern;\n\t\t\tlet thinkingLevel: ThinkingLevel | undefined;\n\n\t\t\tif (colonIdx !== -1) {\n\t\t\t\tconst suffix = pattern.substring(colonIdx + 1);\n\t\t\t\tif (isValidThinkingLevel(suffix)) {\n\t\t\t\t\tthinkingLevel = suffix;\n\t\t\t\t\tglobPattern = pattern.substring(0, colonIdx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Match against \"provider/modelId\" format OR just model ID\n\t\t\t// This allows \"*sonnet*\" to match without requiring \"anthropic/*sonnet*\"\n\t\t\tconst matchingModels = availableModels.filter((m) => {\n\t\t\t\tconst fullId = `${m.provider}/${m.id}`;\n\t\t\t\treturn minimatch(fullId, globPattern, { nocase: true }) || minimatch(m.id, globPattern, { nocase: true });\n\t\t\t});\n\n\t\t\tif (matchingModels.length === 0) {\n\t\t\t\tconsole.warn(chalk.yellow(`Warning: No models match pattern \"${pattern}\"`));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (const model of matchingModels) {\n\t\t\t\tif (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {\n\t\t\t\t\tscopedModels.push({ model, thinkingLevel });\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst { model, thinkingLevel, warning } = parseModelPattern(pattern, availableModels);\n\n\t\tif (warning) {\n\t\t\tconsole.warn(chalk.yellow(`Warning: ${warning}`));\n\t\t}\n\n\t\tif (!model) {\n\t\t\tconsole.warn(chalk.yellow(`Warning: No models match pattern \"${pattern}\"`));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Avoid duplicates\n\t\tif (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {\n\t\t\tscopedModels.push({ model, thinkingLevel });\n\t\t}\n\t}\n\n\treturn scopedModels;\n}\n\nexport interface ResolveCliModelResult {\n\tmodel: Model<Api> | undefined;\n\tthinkingLevel?: ThinkingLevel;\n\twarning: string | undefined;\n\t/**\n\t * Error message suitable for CLI display.\n\t * When set, model will be undefined.\n\t */\n\terror: string | undefined;\n}\n\n/**\n * Resolve a single model from CLI flags.\n *\n * Supports:\n * - --provider <provider> --model <pattern>\n * - --model <provider>/<pattern>\n * - Fuzzy matching (same rules as model scoping: exact id, then partial id/name)\n *\n * Note: This does not apply the thinking level by itself, but it may *parse* and\n * return a thinking level from \"<pattern>:<thinking>\" so the caller can apply it.\n */\nexport function resolveCliModel(options: {\n\tcliProvider?: string;\n\tcliModel?: string;\n\tmodelRegistry: ModelRegistry;\n}): ResolveCliModelResult {\n\tconst { cliProvider, cliModel, modelRegistry } = options;\n\n\tif (!cliModel) {\n\t\treturn { model: undefined, warning: undefined, error: undefined };\n\t}\n\n\t// Important: use *all* models here, not just models with pre-configured auth.\n\t// This allows \"--api-key\" to be used for first-time setup.\n\tconst availableModels = modelRegistry.getAll();\n\tif (availableModels.length === 0) {\n\t\treturn {\n\t\t\tmodel: undefined,\n\t\t\twarning: undefined,\n\t\t\terror: \"No models available. Check your installation or add models to models.json.\",\n\t\t};\n\t}\n\n\t// Build canonical provider lookup (case-insensitive)\n\tconst providerMap = new Map<string, string>();\n\tfor (const m of availableModels) {\n\t\tproviderMap.set(m.provider.toLowerCase(), m.provider);\n\t}\n\n\tlet provider = cliProvider ? providerMap.get(cliProvider.toLowerCase()) : undefined;\n\tif (cliProvider && !provider) {\n\t\treturn {\n\t\t\tmodel: undefined,\n\t\t\twarning: undefined,\n\t\t\terror: `Unknown provider \"${cliProvider}\". Use --list-models to see available providers/models.`,\n\t\t};\n\t}\n\n\t// If no explicit --provider, try to interpret \"provider/model\" format first.\n\t// When the prefix before the first slash matches a known provider, prefer that\n\t// interpretation over matching models whose IDs literally contain slashes\n\t// (e.g. \"zai/glm-5\" should resolve to provider=zai, model=glm-5, not to a\n\t// vercel-ai-gateway model with id \"zai/glm-5\").\n\tlet pattern = cliModel;\n\tlet inferredProvider = false;\n\n\tif (!provider) {\n\t\tconst slashIndex = cliModel.indexOf(\"/\");\n\t\tif (slashIndex !== -1) {\n\t\t\tconst maybeProvider = cliModel.substring(0, slashIndex);\n\t\t\tconst canonical = providerMap.get(maybeProvider.toLowerCase());\n\t\t\tif (canonical) {\n\t\t\t\tprovider = canonical;\n\t\t\t\tpattern = cliModel.substring(slashIndex + 1);\n\t\t\t\tinferredProvider = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// If no provider was inferred from the slash, try exact matches without provider inference.\n\t// This handles models whose IDs naturally contain slashes (e.g. OpenRouter-style IDs).\n\tif (!provider) {\n\t\tconst lower = cliModel.toLowerCase();\n\t\tconst exact = availableModels.find(\n\t\t\t(m) => m.id.toLowerCase() === lower || `${m.provider}/${m.id}`.toLowerCase() === lower,\n\t\t);\n\t\tif (exact) {\n\t\t\treturn { model: exact, warning: undefined, thinkingLevel: undefined, error: undefined };\n\t\t}\n\t}\n\n\tif (cliProvider && provider) {\n\t\t// If both were provided, tolerate --model <provider>/<pattern> by stripping the provider prefix\n\t\tconst prefix = `${provider}/`;\n\t\tif (cliModel.toLowerCase().startsWith(prefix.toLowerCase())) {\n\t\t\tpattern = cliModel.substring(prefix.length);\n\t\t}\n\t}\n\n\tconst candidates = provider ? availableModels.filter((m) => m.provider === provider) : availableModels;\n\tconst { model, thinkingLevel, warning } = parseModelPattern(pattern, candidates, {\n\t\tallowInvalidThinkingLevelFallback: false,\n\t});\n\n\tif (model) {\n\t\treturn { model, thinkingLevel, warning, error: undefined };\n\t}\n\n\t// If we inferred a provider from the slash but found no match within that provider,\n\t// fall back to matching the full input as a raw model id across all models.\n\t// This handles OpenRouter-style IDs like \"openai/gpt-4o:extended\" where \"openai\"\n\t// looks like a provider but the full string is actually a model id on openrouter.\n\tif (inferredProvider) {\n\t\tconst lower = cliModel.toLowerCase();\n\t\tconst exact = availableModels.find(\n\t\t\t(m) => m.id.toLowerCase() === lower || `${m.provider}/${m.id}`.toLowerCase() === lower,\n\t\t);\n\t\tif (exact) {\n\t\t\treturn { model: exact, warning: undefined, thinkingLevel: undefined, error: undefined };\n\t\t}\n\t\t// Also try parseModelPattern on the full input against all models\n\t\tconst fallback = parseModelPattern(cliModel, availableModels, {\n\t\t\tallowInvalidThinkingLevelFallback: false,\n\t\t});\n\t\tif (fallback.model) {\n\t\t\treturn {\n\t\t\t\tmodel: fallback.model,\n\t\t\t\tthinkingLevel: fallback.thinkingLevel,\n\t\t\t\twarning: fallback.warning,\n\t\t\t\terror: undefined,\n\t\t\t};\n\t\t}\n\t}\n\n\tif (provider) {\n\t\tconst fallbackModel = buildFallbackModel(provider, pattern, availableModels);\n\t\tif (fallbackModel) {\n\t\t\tconst fallbackWarning = warning\n\t\t\t\t? `${warning} Model \"${pattern}\" not found for provider \"${provider}\". Using custom model id.`\n\t\t\t\t: `Model \"${pattern}\" not found for provider \"${provider}\". Using custom model id.`;\n\t\t\treturn { model: fallbackModel, thinkingLevel: undefined, warning: fallbackWarning, error: undefined };\n\t\t}\n\t}\n\n\tconst display = provider ? `${provider}/${pattern}` : cliModel;\n\treturn {\n\t\tmodel: undefined,\n\t\tthinkingLevel: undefined,\n\t\twarning,\n\t\terror: `Model \"${display}\" not found. Use --list-models to see available models.`,\n\t};\n}\n\nexport interface InitialModelResult {\n\tmodel: Model<Api> | undefined;\n\tthinkingLevel: ThinkingLevel;\n\tfallbackMessage: string | undefined;\n}\n\n/**\n * Find the initial model to use based on priority:\n * 1. CLI args (provider + model)\n * 2. First model from scoped models (if not continuing/resuming)\n * 3. Restored from session (if continuing/resuming)\n * 4. Saved default from settings\n * 5. First available model with valid API key\n */\nexport async function findInitialModel(options: {\n\tcliProvider?: string;\n\tcliModel?: string;\n\tscopedModels: ScopedModel[];\n\tisContinuing: boolean;\n\tdefaultProvider?: string;\n\tdefaultModelId?: string;\n\tdefaultThinkingLevel?: ThinkingLevel;\n\tmodelRegistry: ModelRegistry;\n}): Promise<InitialModelResult> {\n\tconst {\n\t\tcliProvider,\n\t\tcliModel,\n\t\tscopedModels,\n\t\tisContinuing,\n\t\tdefaultProvider,\n\t\tdefaultModelId,\n\t\tdefaultThinkingLevel,\n\t\tmodelRegistry,\n\t} = options;\n\n\tlet model: Model<Api> | undefined;\n\tlet thinkingLevel: ThinkingLevel = DEFAULT_THINKING_LEVEL;\n\n\t// 1. CLI args take priority\n\tif (cliProvider && cliModel) {\n\t\tconst resolved = resolveCliModel({\n\t\t\tcliProvider,\n\t\t\tcliModel,\n\t\t\tmodelRegistry,\n\t\t});\n\t\tif (resolved.error) {\n\t\t\tconsole.error(chalk.red(resolved.error));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tif (resolved.model) {\n\t\t\treturn { model: resolved.model, thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined };\n\t\t}\n\t}\n\n\t// 2. Use first model from scoped models (skip if continuing/resuming)\n\tif (scopedModels.length > 0 && !isContinuing) {\n\t\treturn {\n\t\t\tmodel: scopedModels[0].model,\n\t\t\tthinkingLevel: scopedModels[0].thinkingLevel ?? defaultThinkingLevel ?? DEFAULT_THINKING_LEVEL,\n\t\t\tfallbackMessage: undefined,\n\t\t};\n\t}\n\n\t// 3. Try saved default from settings\n\tif (defaultProvider && defaultModelId) {\n\t\tconst found = modelRegistry.find(defaultProvider, defaultModelId);\n\t\tif (found) {\n\t\t\t// Check if the provider's recommended default is a higher-capability variant\n\t\t\t// of the saved model (e.g. saved \"claude-opus-4-6\" vs recommended \"claude-opus-4-6[1m]\").\n\t\t\t// If so, prefer the recommended variant to avoid using a smaller context window (#1125).\n\t\t\tconst recommendedId = defaultModelPerProvider[defaultProvider as KnownProvider];\n\t\t\tif (recommendedId && recommendedId !== defaultModelId && recommendedId.startsWith(defaultModelId)) {\n\t\t\t\tconst recommended = modelRegistry.find(defaultProvider, recommendedId);\n\t\t\t\tif (recommended) {\n\t\t\t\t\tmodel = recommended;\n\t\t\t\t\tif (defaultThinkingLevel) {\n\t\t\t\t\t\tthinkingLevel = defaultThinkingLevel;\n\t\t\t\t\t}\n\t\t\t\t\treturn { model, thinkingLevel, fallbackMessage: undefined };\n\t\t\t\t}\n\t\t\t}\n\t\t\tmodel = found;\n\t\t\tif (defaultThinkingLevel) {\n\t\t\t\tthinkingLevel = defaultThinkingLevel;\n\t\t\t}\n\t\t\treturn { model, thinkingLevel, fallbackMessage: undefined };\n\t\t}\n\t}\n\n\t// 4. Try first available model with valid API key\n\tconst availableModels = await modelRegistry.getAvailable();\n\n\tif (availableModels.length > 0) {\n\t\t// Try to find a default model from known providers\n\t\tfor (const provider of Object.keys(defaultModelPerProvider) as KnownProvider[]) {\n\t\t\tconst defaultId = defaultModelPerProvider[provider];\n\t\t\tconst match = availableModels.find((m) => m.provider === provider && m.id === defaultId);\n\t\t\tif (match) {\n\t\t\t\treturn { model: match, thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined };\n\t\t\t}\n\t\t}\n\n\t\t// If no default found, use first available\n\t\treturn { model: availableModels[0], thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined };\n\t}\n\n\t// 5. No model found\n\treturn { model: undefined, thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined };\n}\n"]}
1
+ {"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../src/core/model-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Model resolution, scoping, and initial selection\n */\n\nimport type { ThinkingLevel } from \"@gsd/pi-agent-core\";\nimport { type Api, type KnownProvider, type Model, modelsAreEqual } from \"@gsd/pi-ai\";\nimport chalk from \"chalk\";\nimport { minimatch } from \"minimatch\";\nimport { isValidThinkingLevel } from \"../cli/args.js\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.js\";\nimport type { ModelRegistry } from \"./model-registry.js\";\n\n/** Default model IDs for each known provider */\nconst defaultModelPerProvider: Record<KnownProvider, string> = {\n\t\"amazon-bedrock\": \"us.anthropic.claude-opus-4-6-v1\",\n\tanthropic: \"claude-opus-4-6[1m]\",\n\t\"anthropic-vertex\": \"claude-sonnet-4-6\",\n\topenai: \"gpt-5.4\",\n\t\"azure-openai-responses\": \"gpt-5.2\",\n\t\"openai-codex\": \"gpt-5.4\",\n\tgoogle: \"gemini-2.5-pro\",\n\t\"google-gemini-cli\": \"gemini-2.5-pro\",\n\t\"google-antigravity\": \"gemini-3.1-pro-high\",\n\t\"google-vertex\": \"gemini-3-pro-preview\",\n\t\"github-copilot\": \"gpt-4o\",\n\topenrouter: \"openai/gpt-5.1-codex\",\n\t\"vercel-ai-gateway\": \"anthropic/claude-opus-4-6[1m]\",\n\txai: \"grok-4-fast-non-reasoning\",\n\tgroq: \"openai/gpt-oss-120b\",\n\tcerebras: \"zai-glm-4.6\",\n\tzai: \"glm-4.6\",\n\tmistral: \"devstral-medium-latest\",\n\tminimax: \"MiniMax-M2.1\",\n\t\"minimax-cn\": \"MiniMax-M2.1\",\n\thuggingface: \"moonshotai/Kimi-K2.5\",\n\topencode: \"claude-opus-4-6\",\n\t\"opencode-go\": \"kimi-k2.5\",\n\t\"kimi-coding\": \"kimi-k2-thinking\",\n\t\"alibaba-coding-plan\": \"qwen3.5-plus\",\n\tollama: \"llama3.1:8b\",\n\t\"ollama-cloud\": \"qwen3:32b\",\n};\n\nexport interface ScopedModel {\n\tmodel: Model<Api>;\n\t/** Thinking level if explicitly specified in pattern (e.g., \"model:high\"), undefined otherwise */\n\tthinkingLevel?: ThinkingLevel;\n}\n\n/**\n * Helper to check if a model ID looks like an alias (no date suffix)\n * Dates are typically in format: -20241022 or -20250929\n */\nfunction isAlias(id: string): boolean {\n\t// Check if ID ends with -latest\n\tif (id.endsWith(\"-latest\")) return true;\n\n\t// Check if ID ends with a date pattern (-YYYYMMDD)\n\tconst datePattern = /-\\d{8}$/;\n\treturn !datePattern.test(id);\n}\n\n/**\n * Try to match a pattern to a model from the available models list.\n * Returns the matched model or undefined if no match found.\n */\nfunction tryMatchModel(modelPattern: string, availableModels: Model<Api>[]): Model<Api> | undefined {\n\t// Check for provider/modelId format (provider is everything before the first /)\n\tconst slashIndex = modelPattern.indexOf(\"/\");\n\tif (slashIndex !== -1) {\n\t\tconst provider = modelPattern.substring(0, slashIndex);\n\t\tconst modelId = modelPattern.substring(slashIndex + 1);\n\t\tconst providerMatch = availableModels.find(\n\t\t\t(m) => m.provider.toLowerCase() === provider.toLowerCase() && m.id.toLowerCase() === modelId.toLowerCase(),\n\t\t);\n\t\tif (providerMatch) {\n\t\t\treturn providerMatch;\n\t\t}\n\t\t// No exact provider/model match - fall through to other matching\n\t}\n\n\t// Check for exact ID match (case-insensitive)\n\tconst exactMatch = availableModels.find((m) => m.id.toLowerCase() === modelPattern.toLowerCase());\n\tif (exactMatch) {\n\t\treturn exactMatch;\n\t}\n\n\t// No exact match - fall back to partial matching\n\tconst matches = availableModels.filter(\n\t\t(m) =>\n\t\t\tm.id.toLowerCase().includes(modelPattern.toLowerCase()) ||\n\t\t\tm.name?.toLowerCase().includes(modelPattern.toLowerCase()),\n\t);\n\n\tif (matches.length === 0) {\n\t\treturn undefined;\n\t}\n\n\t// Separate into aliases and dated versions\n\tconst aliases = matches.filter((m) => isAlias(m.id));\n\tconst datedVersions = matches.filter((m) => !isAlias(m.id));\n\n\tif (aliases.length > 0) {\n\t\t// Prefer alias - if multiple aliases, pick the one that sorts highest\n\t\taliases.sort((a, b) => b.id.localeCompare(a.id));\n\t\treturn aliases[0];\n\t} else {\n\t\t// No alias found, pick latest dated version\n\t\tdatedVersions.sort((a, b) => b.id.localeCompare(a.id));\n\t\treturn datedVersions[0];\n\t}\n}\n\nexport interface ParsedModelResult {\n\tmodel: Model<Api> | undefined;\n\t/** Thinking level if explicitly specified in pattern, undefined otherwise */\n\tthinkingLevel?: ThinkingLevel;\n\twarning: string | undefined;\n}\n\nfunction buildFallbackModel(provider: string, modelId: string, availableModels: Model<Api>[]): Model<Api> | undefined {\n\tconst providerModels = availableModels.filter((m) => m.provider === provider);\n\tif (providerModels.length === 0) return undefined;\n\n\tconst defaultId = defaultModelPerProvider[provider as KnownProvider];\n\tconst baseModel = defaultId\n\t\t? (providerModels.find((m) => m.id === defaultId) ?? providerModels[0])\n\t\t: providerModels[0];\n\n\treturn {\n\t\t...baseModel,\n\t\tid: modelId,\n\t\tname: modelId,\n\t};\n}\n\n/**\n * Parse a pattern to extract model and thinking level.\n * Handles models with colons in their IDs (e.g., OpenRouter's :exacto suffix).\n *\n * Algorithm:\n * 1. Try to match full pattern as a model\n * 2. If found, return it with \"off\" thinking level\n * 3. If not found and has colons, split on last colon:\n * - If suffix is valid thinking level, use it and recurse on prefix\n * - If suffix is invalid, warn and recurse on prefix with \"off\"\n *\n * @internal\n */\nfunction parseModelPattern(\n\tpattern: string,\n\tavailableModels: Model<Api>[],\n\toptions?: { allowInvalidThinkingLevelFallback?: boolean },\n): ParsedModelResult {\n\t// Try exact match first\n\tconst exactMatch = tryMatchModel(pattern, availableModels);\n\tif (exactMatch) {\n\t\treturn { model: exactMatch, thinkingLevel: undefined, warning: undefined };\n\t}\n\n\t// No match - try splitting on last colon if present\n\tconst lastColonIndex = pattern.lastIndexOf(\":\");\n\tif (lastColonIndex === -1) {\n\t\t// No colons, pattern simply doesn't match any model\n\t\treturn { model: undefined, thinkingLevel: undefined, warning: undefined };\n\t}\n\n\tconst prefix = pattern.substring(0, lastColonIndex);\n\tconst suffix = pattern.substring(lastColonIndex + 1);\n\n\tif (isValidThinkingLevel(suffix)) {\n\t\t// Valid thinking level - recurse on prefix and use this level\n\t\tconst result = parseModelPattern(prefix, availableModels, options);\n\t\tif (result.model) {\n\t\t\t// Only use this thinking level if no warning from inner recursion\n\t\t\treturn {\n\t\t\t\tmodel: result.model,\n\t\t\t\tthinkingLevel: result.warning ? undefined : suffix,\n\t\t\t\twarning: result.warning,\n\t\t\t};\n\t\t}\n\t\treturn result;\n\t} else {\n\t\t// Invalid suffix\n\t\tconst allowFallback = options?.allowInvalidThinkingLevelFallback ?? true;\n\t\tif (!allowFallback) {\n\t\t\t// In strict mode (CLI --model parsing), treat it as part of the model id and fail.\n\t\t\t// This avoids accidentally resolving to a different model.\n\t\t\treturn { model: undefined, thinkingLevel: undefined, warning: undefined };\n\t\t}\n\n\t\t// Scope mode: recurse on prefix and warn\n\t\tconst result = parseModelPattern(prefix, availableModels, options);\n\t\tif (result.model) {\n\t\t\treturn {\n\t\t\t\tmodel: result.model,\n\t\t\t\tthinkingLevel: undefined,\n\t\t\t\twarning: `Invalid thinking level \"${suffix}\" in pattern \"${pattern}\". Using default instead.`,\n\t\t\t};\n\t\t}\n\t\treturn result;\n\t}\n}\n\n/**\n * Resolve model patterns to actual Model objects with optional thinking levels\n * Format: \"pattern:level\" where :level is optional\n * For each pattern, finds all matching models and picks the best version:\n * 1. Prefer alias (e.g., claude-sonnet-4-5) over dated versions (claude-sonnet-4-5-20250929)\n * 2. If no alias, pick the latest dated version\n *\n * Supports models with colons in their IDs (e.g., OpenRouter's model:exacto).\n * The algorithm tries to match the full pattern first, then progressively\n * strips colon-suffixes to find a match.\n */\nexport async function resolveModelScope(patterns: string[], modelRegistry: ModelRegistry): Promise<ScopedModel[]> {\n\tconst availableModels = await modelRegistry.getAvailable();\n\tconst scopedModels: ScopedModel[] = [];\n\n\tfor (const pattern of patterns) {\n\t\t// Try exact match first (handles model IDs containing glob chars like [1m])\n\t\tconst exactResult = parseModelPattern(pattern, availableModels);\n\t\tif (exactResult.model) {\n\t\t\tif (exactResult.warning) {\n\t\t\t\tconsole.warn(chalk.yellow(`Warning: ${exactResult.warning}`));\n\t\t\t}\n\t\t\tif (!scopedModels.find((sm) => modelsAreEqual(sm.model, exactResult.model!))) {\n\t\t\t\tscopedModels.push({ model: exactResult.model, thinkingLevel: exactResult.thinkingLevel });\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check if pattern contains glob characters\n\t\tif (pattern.includes(\"*\") || pattern.includes(\"?\") || pattern.includes(\"[\")) {\n\t\t\t// Extract optional thinking level suffix (e.g., \"provider/*:high\")\n\t\t\tconst colonIdx = pattern.lastIndexOf(\":\");\n\t\t\tlet globPattern = pattern;\n\t\t\tlet thinkingLevel: ThinkingLevel | undefined;\n\n\t\t\tif (colonIdx !== -1) {\n\t\t\t\tconst suffix = pattern.substring(colonIdx + 1);\n\t\t\t\tif (isValidThinkingLevel(suffix)) {\n\t\t\t\t\tthinkingLevel = suffix;\n\t\t\t\t\tglobPattern = pattern.substring(0, colonIdx);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Match against \"provider/modelId\" format OR just model ID\n\t\t\t// This allows \"*sonnet*\" to match without requiring \"anthropic/*sonnet*\"\n\t\t\tconst matchingModels = availableModels.filter((m) => {\n\t\t\t\tconst fullId = `${m.provider}/${m.id}`;\n\t\t\t\treturn minimatch(fullId, globPattern, { nocase: true }) || minimatch(m.id, globPattern, { nocase: true });\n\t\t\t});\n\n\t\t\tif (matchingModels.length === 0) {\n\t\t\t\tconsole.warn(chalk.yellow(`Warning: No models match pattern \"${pattern}\"`));\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tfor (const model of matchingModels) {\n\t\t\t\tif (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {\n\t\t\t\t\tscopedModels.push({ model, thinkingLevel });\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst { model, thinkingLevel, warning } = parseModelPattern(pattern, availableModels);\n\n\t\tif (warning) {\n\t\t\tconsole.warn(chalk.yellow(`Warning: ${warning}`));\n\t\t}\n\n\t\tif (!model) {\n\t\t\tconsole.warn(chalk.yellow(`Warning: No models match pattern \"${pattern}\"`));\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Avoid duplicates\n\t\tif (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {\n\t\t\tscopedModels.push({ model, thinkingLevel });\n\t\t}\n\t}\n\n\treturn scopedModels;\n}\n\nexport interface ResolveCliModelResult {\n\tmodel: Model<Api> | undefined;\n\tthinkingLevel?: ThinkingLevel;\n\twarning: string | undefined;\n\t/**\n\t * Error message suitable for CLI display.\n\t * When set, model will be undefined.\n\t */\n\terror: string | undefined;\n}\n\n/**\n * Resolve a single model from CLI flags.\n *\n * Supports:\n * - --provider <provider> --model <pattern>\n * - --model <provider>/<pattern>\n * - Fuzzy matching (same rules as model scoping: exact id, then partial id/name)\n *\n * Note: This does not apply the thinking level by itself, but it may *parse* and\n * return a thinking level from \"<pattern>:<thinking>\" so the caller can apply it.\n */\nexport function resolveCliModel(options: {\n\tcliProvider?: string;\n\tcliModel?: string;\n\tmodelRegistry: ModelRegistry;\n}): ResolveCliModelResult {\n\tconst { cliProvider, cliModel, modelRegistry } = options;\n\n\tif (!cliModel) {\n\t\treturn { model: undefined, warning: undefined, error: undefined };\n\t}\n\n\t// Important: use *all* models here, not just models with pre-configured auth.\n\t// This allows \"--api-key\" to be used for first-time setup.\n\tconst availableModels = modelRegistry.getAll();\n\tif (availableModels.length === 0) {\n\t\treturn {\n\t\t\tmodel: undefined,\n\t\t\twarning: undefined,\n\t\t\terror: \"No models available. Check your installation or add models to models.json.\",\n\t\t};\n\t}\n\n\t// Build canonical provider lookup (case-insensitive)\n\tconst providerMap = new Map<string, string>();\n\tfor (const m of availableModels) {\n\t\tproviderMap.set(m.provider.toLowerCase(), m.provider);\n\t}\n\n\tlet provider = cliProvider ? providerMap.get(cliProvider.toLowerCase()) : undefined;\n\tif (cliProvider && !provider) {\n\t\treturn {\n\t\t\tmodel: undefined,\n\t\t\twarning: undefined,\n\t\t\terror: `Unknown provider \"${cliProvider}\". Use --list-models to see available providers/models.`,\n\t\t};\n\t}\n\n\t// If no explicit --provider, try to interpret \"provider/model\" format first.\n\t// When the prefix before the first slash matches a known provider, prefer that\n\t// interpretation over matching models whose IDs literally contain slashes\n\t// (e.g. \"zai/glm-5\" should resolve to provider=zai, model=glm-5, not to a\n\t// vercel-ai-gateway model with id \"zai/glm-5\").\n\tlet pattern = cliModel;\n\tlet inferredProvider = false;\n\n\tif (!provider) {\n\t\tconst slashIndex = cliModel.indexOf(\"/\");\n\t\tif (slashIndex !== -1) {\n\t\t\tconst maybeProvider = cliModel.substring(0, slashIndex);\n\t\t\tconst canonical = providerMap.get(maybeProvider.toLowerCase());\n\t\t\tif (canonical) {\n\t\t\t\tprovider = canonical;\n\t\t\t\tpattern = cliModel.substring(slashIndex + 1);\n\t\t\t\tinferredProvider = true;\n\t\t\t}\n\t\t}\n\t}\n\n\t// If no provider was inferred from the slash, try exact matches without provider inference.\n\t// This handles models whose IDs naturally contain slashes (e.g. OpenRouter-style IDs).\n\tif (!provider) {\n\t\tconst lower = cliModel.toLowerCase();\n\t\tconst exact = availableModels.find(\n\t\t\t(m) => m.id.toLowerCase() === lower || `${m.provider}/${m.id}`.toLowerCase() === lower,\n\t\t);\n\t\tif (exact) {\n\t\t\treturn { model: exact, warning: undefined, thinkingLevel: undefined, error: undefined };\n\t\t}\n\t}\n\n\tif (cliProvider && provider) {\n\t\t// If both were provided, tolerate --model <provider>/<pattern> by stripping the provider prefix\n\t\tconst prefix = `${provider}/`;\n\t\tif (cliModel.toLowerCase().startsWith(prefix.toLowerCase())) {\n\t\t\tpattern = cliModel.substring(prefix.length);\n\t\t}\n\t}\n\n\tconst candidates = provider ? availableModels.filter((m) => m.provider === provider) : availableModels;\n\tconst { model, thinkingLevel, warning } = parseModelPattern(pattern, candidates, {\n\t\tallowInvalidThinkingLevelFallback: false,\n\t});\n\n\tif (model) {\n\t\treturn { model, thinkingLevel, warning, error: undefined };\n\t}\n\n\t// If we inferred a provider from the slash but found no match within that provider,\n\t// fall back to matching the full input as a raw model id across all models.\n\t// This handles OpenRouter-style IDs like \"openai/gpt-4o:extended\" where \"openai\"\n\t// looks like a provider but the full string is actually a model id on openrouter.\n\tif (inferredProvider) {\n\t\tconst lower = cliModel.toLowerCase();\n\t\tconst exact = availableModels.find(\n\t\t\t(m) => m.id.toLowerCase() === lower || `${m.provider}/${m.id}`.toLowerCase() === lower,\n\t\t);\n\t\tif (exact) {\n\t\t\treturn { model: exact, warning: undefined, thinkingLevel: undefined, error: undefined };\n\t\t}\n\t\t// Also try parseModelPattern on the full input against all models\n\t\tconst fallback = parseModelPattern(cliModel, availableModels, {\n\t\t\tallowInvalidThinkingLevelFallback: false,\n\t\t});\n\t\tif (fallback.model) {\n\t\t\treturn {\n\t\t\t\tmodel: fallback.model,\n\t\t\t\tthinkingLevel: fallback.thinkingLevel,\n\t\t\t\twarning: fallback.warning,\n\t\t\t\terror: undefined,\n\t\t\t};\n\t\t}\n\t}\n\n\tif (provider) {\n\t\tconst fallbackModel = buildFallbackModel(provider, pattern, availableModels);\n\t\tif (fallbackModel) {\n\t\t\tconst fallbackWarning = warning\n\t\t\t\t? `${warning} Model \"${pattern}\" not found for provider \"${provider}\". Using custom model id.`\n\t\t\t\t: `Model \"${pattern}\" not found for provider \"${provider}\". Using custom model id.`;\n\t\t\treturn { model: fallbackModel, thinkingLevel: undefined, warning: fallbackWarning, error: undefined };\n\t\t}\n\t}\n\n\tconst display = provider ? `${provider}/${pattern}` : cliModel;\n\treturn {\n\t\tmodel: undefined,\n\t\tthinkingLevel: undefined,\n\t\twarning,\n\t\terror: `Model \"${display}\" not found. Use --list-models to see available models.`,\n\t};\n}\n\nexport interface InitialModelResult {\n\tmodel: Model<Api> | undefined;\n\tthinkingLevel: ThinkingLevel;\n\tfallbackMessage: string | undefined;\n}\n\n/**\n * Find the initial model to use based on priority:\n * 1. CLI args (provider + model)\n * 2. First model from scoped models (if not continuing/resuming)\n * 3. Restored from session (if continuing/resuming)\n * 4. Saved default from settings\n * 5. First available model with valid API key\n */\nexport async function findInitialModel(options: {\n\tcliProvider?: string;\n\tcliModel?: string;\n\tscopedModels: ScopedModel[];\n\tisContinuing: boolean;\n\tdefaultProvider?: string;\n\tdefaultModelId?: string;\n\tdefaultThinkingLevel?: ThinkingLevel;\n\tmodelRegistry: ModelRegistry;\n}): Promise<InitialModelResult> {\n\tconst {\n\t\tcliProvider,\n\t\tcliModel,\n\t\tscopedModels,\n\t\tisContinuing,\n\t\tdefaultProvider,\n\t\tdefaultModelId,\n\t\tdefaultThinkingLevel,\n\t\tmodelRegistry,\n\t} = options;\n\n\tlet model: Model<Api> | undefined;\n\tlet thinkingLevel: ThinkingLevel = DEFAULT_THINKING_LEVEL;\n\n\t// 1. CLI args take priority\n\tif (cliProvider && cliModel) {\n\t\tconst resolved = resolveCliModel({\n\t\t\tcliProvider,\n\t\t\tcliModel,\n\t\t\tmodelRegistry,\n\t\t});\n\t\tif (resolved.error) {\n\t\t\tconsole.error(chalk.red(resolved.error));\n\t\t\tprocess.exit(1);\n\t\t}\n\t\tif (resolved.model) {\n\t\t\treturn { model: resolved.model, thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined };\n\t\t}\n\t}\n\n\t// 2. Use first model from scoped models (skip if continuing/resuming)\n\tif (scopedModels.length > 0 && !isContinuing) {\n\t\treturn {\n\t\t\tmodel: scopedModels[0].model,\n\t\t\tthinkingLevel: scopedModels[0].thinkingLevel ?? defaultThinkingLevel ?? DEFAULT_THINKING_LEVEL,\n\t\t\tfallbackMessage: undefined,\n\t\t};\n\t}\n\n\t// 3. Try saved default from settings\n\tif (defaultProvider && defaultModelId) {\n\t\tconst found = modelRegistry.find(defaultProvider, defaultModelId);\n\t\tif (found) {\n\t\t\t// Check if the provider's recommended default is a higher-capability variant\n\t\t\t// of the saved model (e.g. saved \"claude-opus-4-6\" vs recommended \"claude-opus-4-6[1m]\").\n\t\t\t// If so, prefer the recommended variant to avoid using a smaller context window (#1125).\n\t\t\tconst recommendedId = defaultModelPerProvider[defaultProvider as KnownProvider];\n\t\t\tif (recommendedId && recommendedId !== defaultModelId && recommendedId.startsWith(defaultModelId)) {\n\t\t\t\tconst recommended = modelRegistry.find(defaultProvider, recommendedId);\n\t\t\t\tif (recommended) {\n\t\t\t\t\tmodel = recommended;\n\t\t\t\t\tif (defaultThinkingLevel) {\n\t\t\t\t\t\tthinkingLevel = defaultThinkingLevel;\n\t\t\t\t\t}\n\t\t\t\t\treturn { model, thinkingLevel, fallbackMessage: undefined };\n\t\t\t\t}\n\t\t\t}\n\t\t\tmodel = found;\n\t\t\tif (defaultThinkingLevel) {\n\t\t\t\tthinkingLevel = defaultThinkingLevel;\n\t\t\t}\n\t\t\treturn { model, thinkingLevel, fallbackMessage: undefined };\n\t\t}\n\t}\n\n\t// 4. Try first available model with valid API key\n\tconst availableModels = await modelRegistry.getAvailable();\n\n\tif (availableModels.length > 0) {\n\t\t// Try to find a default model from known providers\n\t\tfor (const provider of Object.keys(defaultModelPerProvider) as KnownProvider[]) {\n\t\t\tconst defaultId = defaultModelPerProvider[provider];\n\t\t\tconst match = availableModels.find((m) => m.provider === provider && m.id === defaultId);\n\t\t\tif (match) {\n\t\t\t\treturn { model: match, thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined };\n\t\t\t}\n\t\t}\n\n\t\t// If no default found, use first available\n\t\treturn { model: availableModels[0], thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined };\n\t}\n\n\t// 5. No model found\n\treturn { model: undefined, thinkingLevel: DEFAULT_THINKING_LEVEL, fallbackMessage: undefined };\n}\n"]}
@@ -65,6 +65,15 @@ export interface DefaultResourceLoaderOptions {
65
65
  appendSystemPrompt?: string;
66
66
  /** Names of bundled extensions (used to identify built-in extensions in conflict detection). */
67
67
  bundledExtensionNames?: Set<string>;
68
+ /**
69
+ * Transform extension paths before loading. Receives the merged list of all
70
+ * discovered extension paths and returns a (possibly reordered/filtered) list.
71
+ * Use this to apply dependency sorting or registry-based filtering.
72
+ */
73
+ extensionPathsTransform?: (paths: string[]) => {
74
+ paths: string[];
75
+ diagnostics?: string[];
76
+ };
68
77
  extensionsOverride?: (base: LoadExtensionsResult) => LoadExtensionsResult;
69
78
  skillsOverride?: (base: {
70
79
  skills: Skill[];
@@ -119,6 +128,7 @@ export declare class DefaultResourceLoader implements ResourceLoader {
119
128
  private systemPromptSource?;
120
129
  private appendSystemPromptSource?;
121
130
  private bundledExtensionNames;
131
+ private extensionPathsTransform?;
122
132
  private extensionsOverride?;
123
133
  private skillsOverride?;
124
134
  private promptsOverride?;
@@ -1 +1 @@
1
- {"version":3,"file":"resource-loader.d.ts","sourceRoot":"","sources":["../../src/core/resource-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-loader.d.ts","sourceRoot":"","sources":["../../src/core/resource-loader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,KAAK,EAAE,MAAM,qCAAqC,CAAC;AACpF,OAAO,KAAK,EAAqB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,EAAkB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,KAAK,EAAa,gBAAgB,EAAoB,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACjH,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAChF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,WAAW,sBAAsB;IACtC,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IAC7D,WAAW,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;IAC9D,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,cAAc;IAC9B,aAAa,IAAI,oBAAoB,CAAC;IACtC,SAAS,IAAI;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,WAAW,EAAE,kBAAkB,EAAE,CAAA;KAAE,CAAC;IACpE,UAAU,IAAI;QAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QAAC,WAAW,EAAE,kBAAkB,EAAE,CAAA;KAAE,CAAC;IAC/E,SAAS,IAAI;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,WAAW,EAAE,kBAAkB,EAAE,CAAA;KAAE,CAAC;IACpE,cAAc,IAAI;QAAE,WAAW,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAC5E,eAAe,IAAI,MAAM,GAAG,SAAS,CAAC;IACtC,qBAAqB,IAAI,MAAM,EAAE,CAAC;IAClC,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC7C,eAAe,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAAC;IACrD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AA4ED,MAAM,WAAW,4BAA4B;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,6BAA6B,CAAC,EAAE,MAAM,EAAE,CAAC;IACzC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gGAAgG;IAChG,qBAAqB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC3F,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,oBAAoB,CAAC;IAC1E,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,WAAW,EAAE,kBAAkB,EAAE,CAAA;KAAE,KAAK;QAClF,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,WAAW,EAAE,kBAAkB,EAAE,CAAC;KAClC,CAAC;IACF,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QAAC,WAAW,EAAE,kBAAkB,EAAE,CAAA;KAAE,KAAK;QAC7F,OAAO,EAAE,cAAc,EAAE,CAAC;QAC1B,WAAW,EAAE,kBAAkB,EAAE,CAAC;KAClC,CAAC;IACF,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,WAAW,EAAE,kBAAkB,EAAE,CAAA;KAAE,KAAK;QAClF,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,WAAW,EAAE,kBAAkB,EAAE,CAAC;KAClC,CAAC;IACF,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,WAAW,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,KAAK;QAC1F,WAAW,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACtD,CAAC;IACF,oBAAoB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;CAC1D;AAED,qBAAa,qBAAsB,YAAW,cAAc;IAC3D,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,wBAAwB,CAAW;IAC3C,OAAO,CAAC,oBAAoB,CAAW;IACvC,OAAO,CAAC,6BAA6B,CAAW;IAChD,OAAO,CAAC,oBAAoB,CAAW;IACvC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,kBAAkB,CAAC,CAAS;IACpC,OAAO,CAAC,wBAAwB,CAAC,CAAS;IAC1C,OAAO,CAAC,qBAAqB,CAAc;IAC3C,OAAO,CAAC,uBAAuB,CAAC,CAAmE;IACnG,OAAO,CAAC,kBAAkB,CAAC,CAAuD;IAClF,OAAO,CAAC,cAAc,CAAC,CAGrB;IACF,OAAO,CAAC,eAAe,CAAC,CAGtB;IACF,OAAO,CAAC,cAAc,CAAC,CAGrB;IACF,OAAO,CAAC,mBAAmB,CAAC,CAE1B;IACF,OAAO,CAAC,oBAAoB,CAAC,CAAmD;IAChF,OAAO,CAAC,0BAA0B,CAAC,CAA+B;IAElE,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,YAAY,CAAC,CAAS;IAC9B,OAAO,CAAC,kBAAkB,CAAW;IACrC,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,cAAc,CAAW;IACjC,OAAO,CAAC,eAAe,CAAW;IAClC,OAAO,CAAC,cAAc,CAAW;gBAErB,OAAO,EAAE,4BAA4B;IA8CjD,aAAa,IAAI,oBAAoB;IAIrC,SAAS,IAAI;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,WAAW,EAAE,kBAAkB,EAAE,CAAA;KAAE;IAInE,UAAU,IAAI;QAAE,OAAO,EAAE,cAAc,EAAE,CAAC;QAAC,WAAW,EAAE,kBAAkB,EAAE,CAAA;KAAE;IAI9E,SAAS,IAAI;QAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAAC,WAAW,EAAE,kBAAkB,EAAE,CAAA;KAAE;IAInE,cAAc,IAAI;QAAE,WAAW,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE;IAI3E,eAAe,IAAI,MAAM,GAAG,SAAS;IAIrC,qBAAqB,IAAI,MAAM,EAAE;IAIjC,eAAe,IAAI,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;IAI5C,eAAe,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI;IA8B9C,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IA8I7B,OAAO,CAAC,uBAAuB;IAS/B,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,sBAAsB;IAkC9B,OAAO,CAAC,qBAAqB;IA4B7B,OAAO,CAAC,sBAAsB;IAkC9B,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,UAAU;IA0ClB,OAAO,CAAC,iBAAiB;IA8BzB,OAAO,CAAC,iBAAiB;YASX,sBAAsB;IAqBpC,OAAO,CAAC,eAAe;IAoCvB,OAAO,CAAC,yBAAyB;IAWjC,OAAO,CAAC,yBAAyB;IAsCjC,OAAO,CAAC,WAAW;IASnB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAQhC,OAAO,CAAC,wBAAwB;CA+DhC"}
@@ -95,6 +95,7 @@ export class DefaultResourceLoader {
95
95
  this.systemPromptSource = options.systemPrompt;
96
96
  this.appendSystemPromptSource = options.appendSystemPrompt;
97
97
  this.bundledExtensionNames = options.bundledExtensionNames ?? new Set();
98
+ this.extensionPathsTransform = options.extensionPathsTransform;
98
99
  this.extensionsOverride = options.extensionsOverride;
99
100
  this.skillsOverride = options.skillsOverride;
100
101
  this.promptsOverride = options.promptsOverride;
@@ -216,9 +217,19 @@ export class DefaultResourceLoader {
216
217
  const cliEnabledSkills = getEnabledPaths(cliExtensionPaths.skills);
217
218
  const cliEnabledPrompts = getEnabledPaths(cliExtensionPaths.prompts);
218
219
  const cliEnabledThemes = getEnabledPaths(cliExtensionPaths.themes);
219
- const extensionPaths = this.noExtensions
220
+ let extensionPaths = this.noExtensions
220
221
  ? cliEnabledExtensions
221
222
  : this.mergePaths(cliEnabledExtensions, enabledExtensions);
223
+ // Apply path transform (dependency sorting, registry filtering) if provided
224
+ if (this.extensionPathsTransform) {
225
+ const transformed = this.extensionPathsTransform(extensionPaths);
226
+ extensionPaths = transformed.paths;
227
+ if (transformed.diagnostics?.length) {
228
+ for (const msg of transformed.diagnostics) {
229
+ process.stderr.write(`[extensions] ${msg}\n`);
230
+ }
231
+ }
232
+ }
222
233
  const extensionsResult = await loadExtensions(extensionPaths, this.cwd, this.eventBus);
223
234
  const inlineExtensions = await this.loadExtensionFactories(extensionsResult.runtime);
224
235
  extensionsResult.extensions.push(...inlineExtensions.extensions);