@bastani/atomic 0.9.4 → 0.9.5-alpha.10

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 (759) hide show
  1. package/CHANGELOG.md +136 -2
  2. package/README.md +2 -2
  3. package/dist/builtin/cursor/CHANGELOG.md +6 -0
  4. package/dist/builtin/cursor/package.json +3 -3
  5. package/dist/builtin/cursor/src/model-mapper.ts +6 -3
  6. package/dist/builtin/intercom/CHANGELOG.md +31 -0
  7. package/dist/builtin/intercom/README.md +29 -21
  8. package/dist/builtin/intercom/broker/broker.ts +9 -120
  9. package/dist/builtin/intercom/broker/client.ts +29 -54
  10. package/dist/builtin/intercom/broker/delivered-message-cache.ts +44 -0
  11. package/dist/builtin/intercom/broker/paths.ts +42 -5
  12. package/dist/builtin/intercom/broker/pending-send-registry.ts +142 -0
  13. package/dist/builtin/intercom/broker/send-handler.ts +106 -0
  14. package/dist/builtin/intercom/broker/send-signature.ts +37 -0
  15. package/dist/builtin/intercom/broker/spawn.ts +78 -10
  16. package/dist/builtin/intercom/config.ts +6 -3
  17. package/dist/builtin/intercom/contact-supervisor-tool.ts +6 -4
  18. package/dist/builtin/intercom/foreground-detach-handoff.ts +136 -0
  19. package/dist/builtin/intercom/index-heavy.ts +50 -54
  20. package/dist/builtin/intercom/index.ts +320 -272
  21. package/dist/builtin/intercom/intercom-tool.ts +9 -3
  22. package/dist/builtin/intercom/lazy-heavy-proxy.ts +114 -0
  23. package/dist/builtin/intercom/lazy-subagent-ack.ts +20 -0
  24. package/dist/builtin/intercom/lazy-tool-execution.ts +39 -0
  25. package/dist/builtin/intercom/lifecycle-lease.ts +51 -0
  26. package/dist/builtin/intercom/lifecycle.ts +37 -20
  27. package/dist/builtin/intercom/package.json +12 -6
  28. package/dist/builtin/intercom/reply-routing.ts +17 -0
  29. package/dist/builtin/intercom/result-renderers.ts +1 -1
  30. package/dist/builtin/intercom/subagent-relay.ts +58 -12
  31. package/dist/builtin/intercom/types.ts +3 -3
  32. package/dist/builtin/intercom/ui/compose.ts +2 -2
  33. package/dist/builtin/intercom/ui/inline-message.ts +2 -2
  34. package/dist/builtin/intercom/ui/session-list.ts +2 -2
  35. package/dist/builtin/mcp/CHANGELOG.md +23 -0
  36. package/dist/builtin/mcp/OAUTH.md +1 -0
  37. package/dist/builtin/mcp/README.md +10 -6
  38. package/dist/builtin/mcp/apps-cancellation.ts +32 -0
  39. package/dist/builtin/mcp/call-tool-result.ts +9 -0
  40. package/dist/builtin/mcp/caller-wait.ts +50 -0
  41. package/dist/builtin/mcp/command-registration.ts +82 -0
  42. package/dist/builtin/mcp/direct-tool-executor.ts +279 -0
  43. package/dist/builtin/mcp/direct-tools.ts +40 -255
  44. package/dist/builtin/mcp/host-html-template.ts +4 -2
  45. package/dist/builtin/mcp/index.ts +274 -239
  46. package/dist/builtin/mcp/init.ts +96 -126
  47. package/dist/builtin/mcp/mcp-auth-flow.ts +247 -237
  48. package/dist/builtin/mcp/mcp-callback-server.ts +89 -68
  49. package/dist/builtin/mcp/mcp-oauth-provider.ts +23 -1
  50. package/dist/builtin/mcp/metadata-hydration.ts +52 -0
  51. package/dist/builtin/mcp/package.json +3 -3
  52. package/dist/builtin/mcp/proxy-auth.ts +4 -4
  53. package/dist/builtin/mcp/proxy-call.ts +111 -40
  54. package/dist/builtin/mcp/proxy-connect.ts +35 -15
  55. package/dist/builtin/mcp/proxy-info-modes.ts +106 -23
  56. package/dist/builtin/mcp/proxy-modes.ts +3 -3
  57. package/dist/builtin/mcp/session-cleanup-barrier.ts +43 -0
  58. package/dist/builtin/mcp/startup-warmup.ts +98 -0
  59. package/dist/builtin/mcp/state-lease.ts +12 -0
  60. package/dist/builtin/mcp/tool-result-renderer.ts +3 -3
  61. package/dist/builtin/mcp/ui-server.ts +8 -8
  62. package/dist/builtin/mcp/ui-session.ts +9 -18
  63. package/dist/builtin/subagents/CHANGELOG.md +60 -0
  64. package/dist/builtin/subagents/README.md +30 -29
  65. package/dist/builtin/subagents/agents/code-simplifier.md +2 -2
  66. package/dist/builtin/subagents/agents/codebase-analyzer.md +2 -2
  67. package/dist/builtin/subagents/agents/codebase-locator.md +2 -2
  68. package/dist/builtin/subagents/agents/codebase-online-researcher.md +2 -2
  69. package/dist/builtin/subagents/agents/codebase-pattern-finder.md +2 -2
  70. package/dist/builtin/subagents/agents/codebase-research-analyzer.md +2 -2
  71. package/dist/builtin/subagents/agents/codebase-research-locator.md +2 -2
  72. package/dist/builtin/subagents/agents/debugger.md +2 -2
  73. package/dist/builtin/subagents/agents/worker.md +2 -2
  74. package/dist/builtin/subagents/package.json +5 -5
  75. package/dist/builtin/subagents/prompts/review-loop.md +1 -1
  76. package/dist/builtin/subagents/skills/subagent/SKILL.md +37 -36
  77. package/dist/builtin/subagents/src/extension/api-lifecycle.ts +64 -0
  78. package/dist/builtin/subagents/src/extension/fanout-child.ts +44 -51
  79. package/dist/builtin/subagents/src/extension/index.ts +289 -320
  80. package/dist/builtin/subagents/src/extension/prompt-guidance.ts +7 -10
  81. package/dist/builtin/subagents/src/extension/schemas.ts +22 -5
  82. package/dist/builtin/subagents/src/extension/startup-maintenance.ts +89 -0
  83. package/dist/builtin/subagents/src/extension/tool-description.ts +29 -0
  84. package/dist/builtin/subagents/src/intercom/intercom-bridge.ts +13 -2
  85. package/dist/builtin/subagents/src/intercom/result-intercom.ts +4 -4
  86. package/dist/builtin/subagents/src/runs/background/async-event-journal.ts +106 -0
  87. package/dist/builtin/subagents/src/runs/background/async-execution-common.ts +26 -20
  88. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +13 -2
  89. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +3 -0
  90. package/dist/builtin/subagents/src/runs/background/async-job-tracker.ts +1 -1
  91. package/dist/builtin/subagents/src/runs/background/completion-claims.ts +189 -0
  92. package/dist/builtin/subagents/src/runs/background/completion-dedupe.ts +44 -7
  93. package/dist/builtin/subagents/src/runs/background/completion-notification.ts +34 -0
  94. package/dist/builtin/subagents/src/runs/background/notify.ts +72 -22
  95. package/dist/builtin/subagents/src/runs/background/result-delivery-processor.ts +232 -0
  96. package/dist/builtin/subagents/src/runs/background/result-file-claims.ts +151 -0
  97. package/dist/builtin/subagents/src/runs/background/result-quarantine.ts +72 -0
  98. package/dist/builtin/subagents/src/runs/background/result-retry-scheduler.ts +48 -0
  99. package/dist/builtin/subagents/src/runs/background/result-status.ts +81 -0
  100. package/dist/builtin/subagents/src/runs/background/result-watcher-data.ts +59 -0
  101. package/dist/builtin/subagents/src/runs/background/result-watcher.ts +177 -233
  102. package/dist/builtin/subagents/src/runs/background/run-id-resolver.ts +3 -2
  103. package/dist/builtin/subagents/src/runs/background/stale-run-reconciler.ts +73 -14
  104. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +29 -15
  105. package/dist/builtin/subagents/src/runs/background/top-level-async.ts +1 -2
  106. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +1 -0
  107. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +1 -0
  108. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +1 -0
  109. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +7 -9
  110. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +3 -13
  111. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +2 -15
  112. package/dist/builtin/subagents/src/runs/foreground/execution-attempt-finalize.ts +2 -2
  113. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +63 -46
  114. package/dist/builtin/subagents/src/runs/foreground/execution-detach-reservations.ts +48 -0
  115. package/dist/builtin/subagents/src/runs/foreground/execution-detach-route.ts +17 -0
  116. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +39 -26
  117. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +3 -1
  118. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-chain.ts +3 -51
  119. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-context.ts +6 -11
  120. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-input.ts +11 -2
  121. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +2 -0
  122. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +5 -112
  123. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-resume.ts +2 -0
  124. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +68 -118
  125. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-status.ts +79 -7
  126. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-types.ts +2 -2
  127. package/dist/builtin/subagents/src/runs/foreground/subagent-executor.ts +3 -0
  128. package/dist/builtin/subagents/src/runs/shared/pi-args.ts +2 -2
  129. package/dist/builtin/subagents/src/runs/shared/pi-spawn.ts +55 -12
  130. package/dist/builtin/subagents/src/shared/artifacts.ts +22 -11
  131. package/dist/builtin/subagents/src/shared/event-jsonl-writer.ts +294 -0
  132. package/dist/builtin/subagents/src/shared/exclusive-file-publication.ts +44 -0
  133. package/dist/builtin/subagents/src/shared/jsonl-writer.ts +1 -0
  134. package/dist/builtin/subagents/src/shared/model-info.ts +2 -2
  135. package/dist/builtin/subagents/src/shared/settings.ts +20 -10
  136. package/dist/builtin/subagents/src/shared/types-async.ts +3 -1
  137. package/dist/builtin/subagents/src/shared/types-config.ts +2 -0
  138. package/dist/builtin/subagents/src/shared/types-runtime.ts +3 -2
  139. package/dist/builtin/subagents/src/slash/slash-commands.ts +9 -12
  140. package/dist/builtin/subagents/src/slash/slash-live-state.ts +63 -32
  141. package/dist/builtin/subagents/src/tui/render-event-formatting.ts +15 -48
  142. package/dist/builtin/subagents/src/tui/render-layout.ts +9 -0
  143. package/dist/builtin/subagents/src/tui/render-result.ts +7 -0
  144. package/dist/builtin/subagents/src/tui/render-stable-output.ts +1 -0
  145. package/dist/builtin/subagents/src/tui/render-widget-graph.ts +27 -25
  146. package/dist/builtin/subagents/src/tui/render-widget.ts +177 -132
  147. package/dist/builtin/subagents/src/tui/render.ts +1 -1
  148. package/dist/builtin/web-access/CHANGELOG.md +14 -0
  149. package/dist/builtin/web-access/README.md +4 -0
  150. package/dist/builtin/web-access/content-tools.ts +8 -3
  151. package/dist/builtin/web-access/index-heavy.ts +1 -1
  152. package/dist/builtin/web-access/index.ts +190 -46
  153. package/dist/builtin/web-access/lifecycle-lease.ts +38 -0
  154. package/dist/builtin/web-access/package.json +2 -2
  155. package/dist/builtin/web-access/result-renderers.ts +1 -1
  156. package/dist/builtin/web-access/summary-review.ts +1 -1
  157. package/dist/builtin/web-access/web-search-activity.ts +1 -1
  158. package/dist/builtin/web-access/web-search-return.ts +7 -0
  159. package/dist/builtin/web-access/web-search-summary.ts +1 -1
  160. package/dist/builtin/web-access/web-search-tool.ts +4 -2
  161. package/dist/builtin/workflows/CHANGELOG.md +98 -0
  162. package/dist/builtin/workflows/README.md +20 -16
  163. package/dist/builtin/workflows/builtin/deep-research-codebase-utils.ts +33 -9
  164. package/dist/builtin/workflows/builtin/goal-artifacts.ts +3 -1
  165. package/dist/builtin/workflows/builtin/goal-ledger.ts +3 -0
  166. package/dist/builtin/workflows/builtin/goal-prompts.ts +39 -5
  167. package/dist/builtin/workflows/builtin/goal-reducer.ts +21 -0
  168. package/dist/builtin/workflows/builtin/goal-reports.ts +23 -0
  169. package/dist/builtin/workflows/builtin/goal-review.ts +85 -6
  170. package/dist/builtin/workflows/builtin/goal-runner.ts +122 -49
  171. package/dist/builtin/workflows/builtin/goal-schemas.ts +22 -0
  172. package/dist/builtin/workflows/builtin/goal-types.ts +25 -1
  173. package/dist/builtin/workflows/builtin/goal.d.ts +5 -0
  174. package/dist/builtin/workflows/builtin/goal.ts +13 -2
  175. package/dist/builtin/workflows/builtin/index.d.ts +8 -0
  176. package/dist/builtin/workflows/builtin/open-claude-design-runner.ts +16 -5
  177. package/dist/builtin/workflows/builtin/ralph-core.ts +100 -15
  178. package/dist/builtin/workflows/builtin/ralph-models.ts +98 -66
  179. package/dist/builtin/workflows/builtin/ralph-review-gate.ts +37 -5
  180. package/dist/builtin/workflows/builtin/ralph-reviewer-prompt.ts +159 -0
  181. package/dist/builtin/workflows/builtin/ralph-runner.ts +75 -165
  182. package/dist/builtin/workflows/builtin/ralph.d.ts +3 -0
  183. package/dist/builtin/workflows/builtin/ralph.ts +4 -1
  184. package/dist/builtin/workflows/builtin/review-convergence.ts +111 -0
  185. package/dist/builtin/workflows/builtin/shared-prompts.ts +20 -1
  186. package/dist/builtin/workflows/package.json +2 -2
  187. package/dist/builtin/workflows/skills/create-spec/SKILL.md +2 -0
  188. package/dist/builtin/workflows/skills/impeccable/SKILL.md +16 -13
  189. package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +1 -0
  190. package/dist/builtin/workflows/skills/impeccable/reference/adapt.native.md +58 -0
  191. package/dist/builtin/workflows/skills/impeccable/reference/android.md +40 -0
  192. package/dist/builtin/workflows/skills/impeccable/reference/animate.md +2 -0
  193. package/dist/builtin/workflows/skills/impeccable/reference/audit.md +2 -0
  194. package/dist/builtin/workflows/skills/impeccable/reference/audit.native.md +139 -0
  195. package/dist/builtin/workflows/skills/impeccable/reference/bolder.md +69 -62
  196. package/dist/builtin/workflows/skills/impeccable/reference/critique.md +21 -7
  197. package/dist/builtin/workflows/skills/impeccable/reference/document.md +1 -1
  198. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +92 -0
  199. package/dist/builtin/workflows/skills/impeccable/reference/init.md +29 -7
  200. package/dist/builtin/workflows/skills/impeccable/reference/ios.md +45 -0
  201. package/dist/builtin/workflows/skills/impeccable/reference/layout.md +25 -1
  202. package/dist/builtin/workflows/skills/impeccable/reference/typeset.md +23 -1
  203. package/dist/builtin/workflows/skills/impeccable/scripts/context-signals.mjs +2 -1
  204. package/dist/builtin/workflows/skills/impeccable/scripts/context.mjs +75 -14
  205. package/dist/builtin/workflows/skills/impeccable/scripts/detector/browser/injected/index.mjs +1 -1
  206. package/dist/builtin/workflows/skills/impeccable/scripts/detector/cli/main.mjs +31 -0
  207. package/dist/builtin/workflows/skills/impeccable/scripts/detector/design-system.mjs +64 -0
  208. package/dist/builtin/workflows/skills/impeccable/scripts/detector/detect-antipatterns-browser.js +118 -11
  209. package/dist/builtin/workflows/skills/impeccable/scripts/detector/engines/regex/detect-text.mjs +16 -11
  210. package/dist/builtin/workflows/skills/impeccable/scripts/detector/registry/antipatterns.mjs +66 -0
  211. package/dist/builtin/workflows/skills/impeccable/scripts/detector/rules/checks.mjs +42 -10
  212. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/fonts.mjs +30 -0
  213. package/dist/builtin/workflows/skills/impeccable/scripts/detector/shared/page.mjs +4 -6
  214. package/dist/builtin/workflows/skills/impeccable/scripts/hook-admin.mjs +660 -0
  215. package/dist/builtin/workflows/skills/impeccable/scripts/hook-before-edit.mjs +516 -0
  216. package/dist/builtin/workflows/skills/impeccable/scripts/hook-lib.mjs +1764 -0
  217. package/dist/builtin/workflows/skills/impeccable/scripts/hook.mjs +61 -0
  218. package/dist/builtin/workflows/skills/impeccable/scripts/lib/impeccable-config.mjs +4 -2
  219. package/dist/builtin/workflows/skills/impeccable/scripts/lib/is-generated.mjs +2 -2
  220. package/dist/builtin/workflows/skills/impeccable/scripts/live/svelte-component.mjs +13 -16
  221. package/dist/builtin/workflows/skills/impeccable/scripts/live-accept.mjs +17 -11
  222. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +104 -37
  223. package/dist/builtin/workflows/skills/impeccable/scripts/live-wrap.mjs +9 -0
  224. package/dist/builtin/workflows/src/durable/backend.ts +12 -0
  225. package/dist/builtin/workflows/src/durable/child-primitive.ts +12 -8
  226. package/dist/builtin/workflows/src/durable/dbos-backend.ts +63 -2
  227. package/dist/builtin/workflows/src/durable/dbos-envelope.ts +28 -0
  228. package/dist/builtin/workflows/src/durable/resume-catalog.ts +12 -0
  229. package/dist/builtin/workflows/src/durable/resume-runtime.ts +5 -2
  230. package/dist/builtin/workflows/src/durable/stage-primitive.ts +167 -28
  231. package/dist/builtin/workflows/src/durable/types.ts +30 -1
  232. package/dist/builtin/workflows/src/engine/primitives/task.ts +3 -1
  233. package/dist/builtin/workflows/src/engine/run-durable-finalize.ts +1 -2
  234. package/dist/builtin/workflows/src/engine/run-returned-status.ts +50 -16
  235. package/dist/builtin/workflows/src/engine/run.ts +32 -32
  236. package/dist/builtin/workflows/src/engine/runtime.ts +5 -0
  237. package/dist/builtin/workflows/src/extension/extension-factory.ts +3 -0
  238. package/dist/builtin/workflows/src/extension/extension-lifecycle.ts +9 -2
  239. package/dist/builtin/workflows/src/extension/extension-runtime-state.ts +137 -27
  240. package/dist/builtin/workflows/src/extension/lifecycle-notifications.ts +22 -6
  241. package/dist/builtin/workflows/src/extension/public-types.ts +1 -1
  242. package/dist/builtin/workflows/src/extension/workflow-command-completions.ts +13 -1
  243. package/dist/builtin/workflows/src/extension/workflow-command-registration.ts +19 -4
  244. package/dist/builtin/workflows/src/extension/workflow-command-surfaces.ts +9 -0
  245. package/dist/builtin/workflows/src/extension/workflow-prompts.ts +17 -17
  246. package/dist/builtin/workflows/src/extension/workflow-run-control-command.ts +48 -23
  247. package/dist/builtin/workflows/src/extension/workflow-schema.ts +15 -2
  248. package/dist/builtin/workflows/src/extension/workflow-tool-control.ts +20 -8
  249. package/dist/builtin/workflows/src/extension/workflow-tool.ts +24 -8
  250. package/dist/builtin/workflows/src/runs/background/status.ts +4 -3
  251. package/dist/builtin/workflows/src/runs/foreground/executor-continuation.ts +13 -3
  252. package/dist/builtin/workflows/src/runs/foreground/executor-direct-helpers.ts +29 -8
  253. package/dist/builtin/workflows/src/runs/foreground/executor-hil.ts +1 -1
  254. package/dist/builtin/workflows/src/runs/foreground/executor-stage-control.ts +8 -0
  255. package/dist/builtin/workflows/src/runs/foreground/executor-stage-factory.ts +4 -3
  256. package/dist/builtin/workflows/src/runs/foreground/stage-control-registry.ts +2 -0
  257. package/dist/builtin/workflows/src/runs/foreground/stage-runner-controller.ts +18 -19
  258. package/dist/builtin/workflows/src/runs/foreground/stage-runner-unresolved-overflow.ts +38 -0
  259. package/dist/builtin/workflows/src/runs/foreground/stage-tool-execution-buffer.ts +47 -0
  260. package/dist/builtin/workflows/src/runs/shared/model-fallback-candidates.ts +1 -1
  261. package/dist/builtin/workflows/src/runs/shared/worktree-git.ts +155 -20
  262. package/dist/builtin/workflows/src/runs/shared/worktree-types.ts +6 -0
  263. package/dist/builtin/workflows/src/runs/shared/worktree.ts +2 -1
  264. package/dist/builtin/workflows/src/shared/authoring-contract-stage.d.ts +2 -2
  265. package/dist/builtin/workflows/src/shared/authoring-contract-stage.ts +2 -2
  266. package/dist/builtin/workflows/src/shared/persistence-restore-helpers.ts +18 -1
  267. package/dist/builtin/workflows/src/shared/persistence-restore.ts +23 -5
  268. package/dist/builtin/workflows/src/shared/persistence-session-entries.ts +4 -0
  269. package/dist/builtin/workflows/src/shared/resume-continuation.ts +2 -0
  270. package/dist/builtin/workflows/src/shared/returned-run-status.ts +116 -0
  271. package/dist/builtin/workflows/src/shared/workflow-failures-decisions.ts +2 -0
  272. package/dist/builtin/workflows/src/tui/graph-view-render-helpers.ts +21 -3
  273. package/dist/builtin/workflows/src/tui/graph-view-state.ts +3 -0
  274. package/dist/builtin/workflows/src/tui/graph-view-types.ts +3 -0
  275. package/dist/builtin/workflows/src/tui/stage-chat-view-archive-history.ts +1 -23
  276. package/dist/builtin/workflows/src/tui/stage-chat-view-footer-status.ts +54 -9
  277. package/dist/builtin/workflows/src/tui/stage-chat-view-pending-tools.ts +9 -0
  278. package/dist/builtin/workflows/src/tui/stage-chat-view-render-settings.ts +27 -0
  279. package/dist/builtin/workflows/src/tui/stage-chat-view-state.ts +5 -6
  280. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +5 -2
  281. package/dist/builtin/workflows/src/tui/status-list.ts +22 -15
  282. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +4 -4
  283. package/dist/bun/internal-intercom-broker.d.ts +6 -0
  284. package/dist/bun/internal-intercom-broker.d.ts.map +1 -0
  285. package/dist/bun/internal-intercom-broker.js +39 -0
  286. package/dist/bun/internal-intercom-broker.js.map +1 -0
  287. package/dist/bun/split-loader.d.ts +2 -0
  288. package/dist/bun/split-loader.d.ts.map +1 -0
  289. package/dist/bun/split-loader.js +50 -0
  290. package/dist/bun/split-loader.js.map +1 -0
  291. package/dist/cli/args.d.ts.map +1 -1
  292. package/dist/cli/args.js +2 -2
  293. package/dist/cli/args.js.map +1 -1
  294. package/dist/config.d.ts.map +1 -1
  295. package/dist/config.js +6 -4
  296. package/dist/config.js.map +1 -1
  297. package/dist/core/agent-session-auto-compaction.d.ts +26 -6
  298. package/dist/core/agent-session-auto-compaction.d.ts.map +1 -1
  299. package/dist/core/agent-session-auto-compaction.js +178 -19
  300. package/dist/core/agent-session-auto-compaction.js.map +1 -1
  301. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  302. package/dist/core/agent-session-compaction.js +25 -4
  303. package/dist/core/agent-session-compaction.js.map +1 -1
  304. package/dist/core/agent-session-events.d.ts.map +1 -1
  305. package/dist/core/agent-session-events.js +12 -2
  306. package/dist/core/agent-session-events.js.map +1 -1
  307. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  308. package/dist/core/agent-session-extension-bindings.js +1 -1
  309. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  310. package/dist/core/agent-session-message-queue.d.ts.map +1 -1
  311. package/dist/core/agent-session-message-queue.js +1 -1
  312. package/dist/core/agent-session-message-queue.js.map +1 -1
  313. package/dist/core/agent-session-methods.d.ts +13 -4
  314. package/dist/core/agent-session-methods.d.ts.map +1 -1
  315. package/dist/core/agent-session-methods.js.map +1 -1
  316. package/dist/core/agent-session-models.d.ts +2 -2
  317. package/dist/core/agent-session-models.d.ts.map +1 -1
  318. package/dist/core/agent-session-models.js.map +1 -1
  319. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  320. package/dist/core/agent-session-prompt.js +2 -1
  321. package/dist/core/agent-session-prompt.js.map +1 -1
  322. package/dist/core/agent-session-retry.d.ts +2 -0
  323. package/dist/core/agent-session-retry.d.ts.map +1 -1
  324. package/dist/core/agent-session-retry.js +152 -4
  325. package/dist/core/agent-session-retry.js.map +1 -1
  326. package/dist/core/agent-session-services.d.ts +1 -0
  327. package/dist/core/agent-session-services.d.ts.map +1 -1
  328. package/dist/core/agent-session-services.js +4 -2
  329. package/dist/core/agent-session-services.js.map +1 -1
  330. package/dist/core/agent-session-types.d.ts +15 -1
  331. package/dist/core/agent-session-types.d.ts.map +1 -1
  332. package/dist/core/agent-session-types.js +1 -1
  333. package/dist/core/agent-session-types.js.map +1 -1
  334. package/dist/core/agent-session.d.ts +6 -0
  335. package/dist/core/agent-session.d.ts.map +1 -1
  336. package/dist/core/agent-session.js +6 -0
  337. package/dist/core/agent-session.js.map +1 -1
  338. package/dist/core/anthropic-thinking-guard.d.ts +5 -5
  339. package/dist/core/anthropic-thinking-guard.d.ts.map +1 -1
  340. package/dist/core/anthropic-thinking-guard.js +42 -32
  341. package/dist/core/anthropic-thinking-guard.js.map +1 -1
  342. package/dist/core/atomic-guide-command.d.ts.map +1 -1
  343. package/dist/core/atomic-guide-command.js +15 -15
  344. package/dist/core/atomic-guide-command.js.map +1 -1
  345. package/dist/core/auth-storage.d.ts.map +1 -1
  346. package/dist/core/auth-storage.js +14 -9
  347. package/dist/core/auth-storage.js.map +1 -1
  348. package/dist/core/builtin-packages.d.ts.map +1 -1
  349. package/dist/core/builtin-packages.js +8 -4
  350. package/dist/core/builtin-packages.js.map +1 -1
  351. package/dist/core/compaction/compaction.d.ts +2 -0
  352. package/dist/core/compaction/compaction.d.ts.map +1 -1
  353. package/dist/core/compaction/compaction.js +79 -46
  354. package/dist/core/compaction/compaction.js.map +1 -1
  355. package/dist/core/compaction/context-assistant-turns.d.ts +42 -0
  356. package/dist/core/compaction/context-assistant-turns.d.ts.map +1 -0
  357. package/dist/core/compaction/context-assistant-turns.js +87 -0
  358. package/dist/core/compaction/context-assistant-turns.js.map +1 -0
  359. package/dist/core/compaction/context-compaction-critical.d.ts +15 -0
  360. package/dist/core/compaction/context-compaction-critical.d.ts.map +1 -0
  361. package/dist/core/compaction/context-compaction-critical.js +57 -0
  362. package/dist/core/compaction/context-compaction-critical.js.map +1 -0
  363. package/dist/core/compaction/context-compaction-eviction-alternates.d.ts +18 -0
  364. package/dist/core/compaction/context-compaction-eviction-alternates.d.ts.map +1 -0
  365. package/dist/core/compaction/context-compaction-eviction-alternates.js +186 -0
  366. package/dist/core/compaction/context-compaction-eviction-alternates.js.map +1 -0
  367. package/dist/core/compaction/context-compaction-eviction.d.ts +12 -0
  368. package/dist/core/compaction/context-compaction-eviction.d.ts.map +1 -0
  369. package/dist/core/compaction/context-compaction-eviction.js +222 -0
  370. package/dist/core/compaction/context-compaction-eviction.js.map +1 -0
  371. package/dist/core/compaction/context-compaction-prompt.d.ts.map +1 -1
  372. package/dist/core/compaction/context-compaction-prompt.js +1 -1
  373. package/dist/core/compaction/context-compaction-prompt.js.map +1 -1
  374. package/dist/core/compaction/context-compaction-runner.d.ts +7 -1
  375. package/dist/core/compaction/context-compaction-runner.d.ts.map +1 -1
  376. package/dist/core/compaction/context-compaction-runner.js +113 -21
  377. package/dist/core/compaction/context-compaction-runner.js.map +1 -1
  378. package/dist/core/compaction/context-compaction-types.d.ts +2 -0
  379. package/dist/core/compaction/context-compaction-types.d.ts.map +1 -1
  380. package/dist/core/compaction/context-compaction-types.js.map +1 -1
  381. package/dist/core/compaction/context-deletion-application.d.ts +5 -4
  382. package/dist/core/compaction/context-deletion-application.d.ts.map +1 -1
  383. package/dist/core/compaction/context-deletion-application.js +17 -15
  384. package/dist/core/compaction/context-deletion-application.js.map +1 -1
  385. package/dist/core/compaction/context-deletion-store.d.ts.map +1 -1
  386. package/dist/core/compaction/context-deletion-store.js +1 -1
  387. package/dist/core/compaction/context-deletion-store.js.map +1 -1
  388. package/dist/core/compaction/context-deletion-targets.d.ts +2 -1
  389. package/dist/core/compaction/context-deletion-targets.d.ts.map +1 -1
  390. package/dist/core/compaction/context-deletion-targets.js +36 -31
  391. package/dist/core/compaction/context-deletion-targets.js.map +1 -1
  392. package/dist/core/compaction/context-deletion-tool-helpers.d.ts.map +1 -1
  393. package/dist/core/compaction/context-deletion-tool-helpers.js +116 -43
  394. package/dist/core/compaction/context-deletion-tool-helpers.js.map +1 -1
  395. package/dist/core/compaction/context-transcript-analysis.d.ts +4 -2
  396. package/dist/core/compaction/context-transcript-analysis.d.ts.map +1 -1
  397. package/dist/core/compaction/context-transcript-analysis.js +36 -40
  398. package/dist/core/compaction/context-transcript-analysis.js.map +1 -1
  399. package/dist/core/copilot-anthropic-sse-repair.d.ts +23 -0
  400. package/dist/core/copilot-anthropic-sse-repair.d.ts.map +1 -0
  401. package/dist/core/copilot-anthropic-sse-repair.js +340 -0
  402. package/dist/core/copilot-anthropic-sse-repair.js.map +1 -0
  403. package/dist/core/copilot-gemini-reasoning.d.ts +16 -8
  404. package/dist/core/copilot-gemini-reasoning.d.ts.map +1 -1
  405. package/dist/core/copilot-gemini-reasoning.js +27 -22
  406. package/dist/core/copilot-gemini-reasoning.js.map +1 -1
  407. package/dist/core/copilot-hosts.d.ts +12 -0
  408. package/dist/core/copilot-hosts.d.ts.map +1 -0
  409. package/dist/core/copilot-hosts.js +33 -0
  410. package/dist/core/copilot-hosts.js.map +1 -0
  411. package/dist/core/copilot-model-catalog.d.ts.map +1 -1
  412. package/dist/core/copilot-model-catalog.js +3 -2
  413. package/dist/core/copilot-model-catalog.js.map +1 -1
  414. package/dist/core/copilot-model-synthesis.d.ts.map +1 -1
  415. package/dist/core/copilot-model-synthesis.js +3 -1
  416. package/dist/core/copilot-model-synthesis.js.map +1 -1
  417. package/dist/core/extensions/agent-events.d.ts +1 -1
  418. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  419. package/dist/core/extensions/agent-events.js.map +1 -1
  420. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  421. package/dist/core/extensions/loader-core.js +6 -0
  422. package/dist/core/extensions/loader-core.js.map +1 -1
  423. package/dist/core/extensions/loader-virtual-modules.d.ts +8 -1
  424. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  425. package/dist/core/extensions/loader-virtual-modules.js +10 -4
  426. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  427. package/dist/core/extensions/provider-types.d.ts +2 -7
  428. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  429. package/dist/core/extensions/provider-types.js.map +1 -1
  430. package/dist/core/footer-data-provider.d.ts +6 -0
  431. package/dist/core/footer-data-provider.d.ts.map +1 -1
  432. package/dist/core/footer-data-provider.js +72 -29
  433. package/dist/core/footer-data-provider.js.map +1 -1
  434. package/dist/core/http-dispatcher.d.ts.map +1 -1
  435. package/dist/core/http-dispatcher.js +5 -5
  436. package/dist/core/http-dispatcher.js.map +1 -1
  437. package/dist/core/messages.d.ts +9 -0
  438. package/dist/core/messages.d.ts.map +1 -1
  439. package/dist/core/messages.js +100 -18
  440. package/dist/core/messages.js.map +1 -1
  441. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  442. package/dist/core/model-registry-builtins.js +5 -0
  443. package/dist/core/model-registry-builtins.js.map +1 -1
  444. package/dist/core/model-registry-custom-loader.d.ts.map +1 -1
  445. package/dist/core/model-registry-custom-loader.js +49 -8
  446. package/dist/core/model-registry-custom-loader.js.map +1 -1
  447. package/dist/core/model-registry-dynamic.d.ts.map +1 -1
  448. package/dist/core/model-registry-dynamic.js +11 -5
  449. package/dist/core/model-registry-dynamic.js.map +1 -1
  450. package/dist/core/model-registry-loader.d.ts.map +1 -1
  451. package/dist/core/model-registry-loader.js +8 -0
  452. package/dist/core/model-registry-loader.js.map +1 -1
  453. package/dist/core/model-registry-schemas.d.ts +93 -8
  454. package/dist/core/model-registry-schemas.d.ts.map +1 -1
  455. package/dist/core/model-registry-schemas.js +24 -12
  456. package/dist/core/model-registry-schemas.js.map +1 -1
  457. package/dist/core/model-registry-types.d.ts +7 -6
  458. package/dist/core/model-registry-types.d.ts.map +1 -1
  459. package/dist/core/model-registry-types.js.map +1 -1
  460. package/dist/core/model-registry.d.ts +5 -0
  461. package/dist/core/model-registry.d.ts.map +1 -1
  462. package/dist/core/model-registry.js +23 -0
  463. package/dist/core/model-registry.js.map +1 -1
  464. package/dist/core/model-resolver-cli.d.ts.map +1 -1
  465. package/dist/core/model-resolver-cli.js +33 -5
  466. package/dist/core/model-resolver-cli.js.map +1 -1
  467. package/dist/core/model-resolver-initial.d.ts +6 -1
  468. package/dist/core/model-resolver-initial.d.ts.map +1 -1
  469. package/dist/core/model-resolver-initial.js +12 -7
  470. package/dist/core/model-resolver-initial.js.map +1 -1
  471. package/dist/core/model-resolver-scope.d.ts +9 -0
  472. package/dist/core/model-resolver-scope.d.ts.map +1 -1
  473. package/dist/core/model-resolver-scope.js +12 -4
  474. package/dist/core/model-resolver-scope.js.map +1 -1
  475. package/dist/core/model-resolver.d.ts +4 -3
  476. package/dist/core/model-resolver.d.ts.map +1 -1
  477. package/dist/core/model-resolver.js +2 -2
  478. package/dist/core/model-resolver.js.map +1 -1
  479. package/dist/core/openai-responses-payload-sanitizer.d.ts +7 -0
  480. package/dist/core/openai-responses-payload-sanitizer.d.ts.map +1 -0
  481. package/dist/core/openai-responses-payload-sanitizer.js +74 -0
  482. package/dist/core/openai-responses-payload-sanitizer.js.map +1 -0
  483. package/dist/core/package-manager-auto-resources.d.ts +2 -2
  484. package/dist/core/package-manager-auto-resources.d.ts.map +1 -1
  485. package/dist/core/package-manager-auto-resources.js +32 -52
  486. package/dist/core/package-manager-auto-resources.js.map +1 -1
  487. package/dist/core/package-manager-resolver.d.ts.map +1 -1
  488. package/dist/core/package-manager-resolver.js +23 -14
  489. package/dist/core/package-manager-resolver.js.map +1 -1
  490. package/dist/core/package-manager-resource-collector.d.ts +3 -3
  491. package/dist/core/package-manager-resource-collector.d.ts.map +1 -1
  492. package/dist/core/package-manager-resource-collector.js +76 -73
  493. package/dist/core/package-manager-resource-collector.js.map +1 -1
  494. package/dist/core/package-manager-resource-files.d.ts +9 -8
  495. package/dist/core/package-manager-resource-files.d.ts.map +1 -1
  496. package/dist/core/package-manager-resource-files.js +92 -81
  497. package/dist/core/package-manager-resource-files.js.map +1 -1
  498. package/dist/core/prompt-templates-async.d.ts +3 -0
  499. package/dist/core/prompt-templates-async.d.ts.map +1 -0
  500. package/dist/core/prompt-templates-async.js +118 -0
  501. package/dist/core/prompt-templates-async.js.map +1 -0
  502. package/dist/core/provider-context-usage.d.ts +11 -0
  503. package/dist/core/provider-context-usage.d.ts.map +1 -0
  504. package/dist/core/provider-context-usage.js +58 -0
  505. package/dist/core/provider-context-usage.js.map +1 -0
  506. package/dist/core/resource-loader-assets.d.ts +3 -3
  507. package/dist/core/resource-loader-assets.d.ts.map +1 -1
  508. package/dist/core/resource-loader-assets.js +66 -83
  509. package/dist/core/resource-loader-assets.js.map +1 -1
  510. package/dist/core/resource-loader-context-files.d.ts +1 -0
  511. package/dist/core/resource-loader-context-files.d.ts.map +1 -1
  512. package/dist/core/resource-loader-context-files.js +13 -10
  513. package/dist/core/resource-loader-context-files.js.map +1 -1
  514. package/dist/core/resource-loader-core.d.ts +1 -1
  515. package/dist/core/resource-loader-core.d.ts.map +1 -1
  516. package/dist/core/resource-loader-core.js +5 -5
  517. package/dist/core/resource-loader-core.js.map +1 -1
  518. package/dist/core/resource-loader-extensions.d.ts.map +1 -1
  519. package/dist/core/resource-loader-extensions.js +4 -0
  520. package/dist/core/resource-loader-extensions.js.map +1 -1
  521. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  522. package/dist/core/resource-loader-reload.js +54 -7
  523. package/dist/core/resource-loader-reload.js.map +1 -1
  524. package/dist/core/resource-loader-types.d.ts +7 -1
  525. package/dist/core/resource-loader-types.d.ts.map +1 -1
  526. package/dist/core/resource-loader-types.js.map +1 -1
  527. package/dist/core/sdk-types.d.ts +2 -0
  528. package/dist/core/sdk-types.d.ts.map +1 -1
  529. package/dist/core/sdk-types.js.map +1 -1
  530. package/dist/core/sdk.d.ts.map +1 -1
  531. package/dist/core/sdk.js +9 -6
  532. package/dist/core/sdk.js.map +1 -1
  533. package/dist/core/session-entry-normalization.d.ts +7 -0
  534. package/dist/core/session-entry-normalization.d.ts.map +1 -0
  535. package/dist/core/session-entry-normalization.js +14 -0
  536. package/dist/core/session-entry-normalization.js.map +1 -0
  537. package/dist/core/session-manager-core.d.ts.map +1 -1
  538. package/dist/core/session-manager-core.js +1 -0
  539. package/dist/core/session-manager-core.js.map +1 -1
  540. package/dist/core/session-manager-history.d.ts +2 -2
  541. package/dist/core/session-manager-history.d.ts.map +1 -1
  542. package/dist/core/session-manager-history.js +127 -108
  543. package/dist/core/session-manager-history.js.map +1 -1
  544. package/dist/core/settings-manager-basic-accessors.d.ts +3 -2
  545. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  546. package/dist/core/settings-manager-basic-accessors.js +6 -0
  547. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  548. package/dist/core/settings-manager-core.d.ts.map +1 -1
  549. package/dist/core/settings-manager-core.js +3 -2
  550. package/dist/core/settings-manager-core.js.map +1 -1
  551. package/dist/core/settings-storage.d.ts.map +1 -1
  552. package/dist/core/settings-storage.js +2 -1
  553. package/dist/core/settings-storage.js.map +1 -1
  554. package/dist/core/settings-types.d.ts +2 -1
  555. package/dist/core/settings-types.d.ts.map +1 -1
  556. package/dist/core/settings-types.js.map +1 -1
  557. package/dist/core/skills-async.d.ts +3 -0
  558. package/dist/core/skills-async.d.ts.map +1 -0
  559. package/dist/core/skills-async.js +269 -0
  560. package/dist/core/skills-async.js.map +1 -0
  561. package/dist/core/slash-commands.d.ts +2 -0
  562. package/dist/core/slash-commands.d.ts.map +1 -1
  563. package/dist/core/slash-commands.js +141 -0
  564. package/dist/core/slash-commands.js.map +1 -1
  565. package/dist/core/tools/bash.d.ts.map +1 -1
  566. package/dist/core/tools/bash.js +11 -8
  567. package/dist/core/tools/bash.js.map +1 -1
  568. package/dist/core/trust-manager.d.ts +9 -0
  569. package/dist/core/trust-manager.d.ts.map +1 -1
  570. package/dist/core/trust-manager.js +44 -2
  571. package/dist/core/trust-manager.js.map +1 -1
  572. package/dist/index-extensions.d.ts +1 -1
  573. package/dist/index-extensions.d.ts.map +1 -1
  574. package/dist/index-extensions.js.map +1 -1
  575. package/dist/index.d.ts +2 -1
  576. package/dist/index.d.ts.map +1 -1
  577. package/dist/index.js +2 -1
  578. package/dist/index.js.map +1 -1
  579. package/dist/main-deferred-startup.d.ts +33 -0
  580. package/dist/main-deferred-startup.d.ts.map +1 -0
  581. package/dist/main-deferred-startup.js +44 -0
  582. package/dist/main-deferred-startup.js.map +1 -0
  583. package/dist/main-early-input.d.ts +41 -0
  584. package/dist/main-early-input.d.ts.map +1 -0
  585. package/dist/main-early-input.js +154 -0
  586. package/dist/main-early-input.js.map +1 -0
  587. package/dist/main-session.d.ts.map +1 -1
  588. package/dist/main-session.js +1 -0
  589. package/dist/main-session.js.map +1 -1
  590. package/dist/main.d.ts +0 -6
  591. package/dist/main.d.ts.map +1 -1
  592. package/dist/main.js +47 -39
  593. package/dist/main.js.map +1 -1
  594. package/dist/modes/interactive/components/chat-session-host-actions.d.ts.map +1 -1
  595. package/dist/modes/interactive/components/chat-session-host-actions.js +0 -1
  596. package/dist/modes/interactive/components/chat-session-host-actions.js.map +1 -1
  597. package/dist/modes/interactive/components/chat-session-host-events.d.ts.map +1 -1
  598. package/dist/modes/interactive/components/chat-session-host-events.js +15 -0
  599. package/dist/modes/interactive/components/chat-session-host-events.js.map +1 -1
  600. package/dist/modes/interactive/components/settings-selector-options.d.ts.map +1 -1
  601. package/dist/modes/interactive/components/settings-selector-options.js +3 -1
  602. package/dist/modes/interactive/components/settings-selector-options.js.map +1 -1
  603. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  604. package/dist/modes/interactive/components/thinking-selector.js +2 -1
  605. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  606. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
  607. package/dist/modes/interactive/interactive-agent-events.js +37 -2
  608. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  609. package/dist/modes/interactive/interactive-auth-login.d.ts.map +1 -1
  610. package/dist/modes/interactive/interactive-auth-login.js +0 -1
  611. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  612. package/dist/modes/interactive/interactive-autocomplete.d.ts.map +1 -1
  613. package/dist/modes/interactive/interactive-autocomplete.js +21 -9
  614. package/dist/modes/interactive/interactive-autocomplete.js.map +1 -1
  615. package/dist/modes/interactive/interactive-child-ordering.d.ts +7 -0
  616. package/dist/modes/interactive/interactive-child-ordering.d.ts.map +1 -0
  617. package/dist/modes/interactive/interactive-child-ordering.js +26 -0
  618. package/dist/modes/interactive/interactive-child-ordering.js.map +1 -0
  619. package/dist/modes/interactive/interactive-deferred-startup.d.ts +8 -1
  620. package/dist/modes/interactive/interactive-deferred-startup.d.ts.map +1 -1
  621. package/dist/modes/interactive/interactive-deferred-startup.js +86 -26
  622. package/dist/modes/interactive/interactive-deferred-startup.js.map +1 -1
  623. package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -1
  624. package/dist/modes/interactive/interactive-editor-actions.js +13 -13
  625. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  626. package/dist/modes/interactive/interactive-extension-runtime.d.ts.map +1 -1
  627. package/dist/modes/interactive/interactive-extension-runtime.js +16 -0
  628. package/dist/modes/interactive/interactive-extension-runtime.js.map +1 -1
  629. package/dist/modes/interactive/interactive-hotkeys-debug.d.ts.map +1 -1
  630. package/dist/modes/interactive/interactive-hotkeys-debug.js +4 -3
  631. package/dist/modes/interactive/interactive-hotkeys-debug.js.map +1 -1
  632. package/dist/modes/interactive/interactive-input-handling.d.ts.map +1 -1
  633. package/dist/modes/interactive/interactive-input-handling.js +360 -230
  634. package/dist/modes/interactive/interactive-input-handling.js.map +1 -1
  635. package/dist/modes/interactive/interactive-mode-base.d.ts +19 -4
  636. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  637. package/dist/modes/interactive/interactive-mode-base.js +46 -4
  638. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  639. package/dist/modes/interactive/interactive-mode-deps.d.ts +3 -3
  640. package/dist/modes/interactive/interactive-mode-deps.d.ts.map +1 -1
  641. package/dist/modes/interactive/interactive-mode-deps.js +3 -3
  642. package/dist/modes/interactive/interactive-mode-deps.js.map +1 -1
  643. package/dist/modes/interactive/interactive-mode-surface.d.ts +27 -17
  644. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  645. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  646. package/dist/modes/interactive/interactive-mode-types.d.ts +8 -1
  647. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  648. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  649. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  650. package/dist/modes/interactive/interactive-model-routing.js +14 -10
  651. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  652. package/dist/modes/interactive/interactive-onboarding.d.ts +0 -9
  653. package/dist/modes/interactive/interactive-onboarding.d.ts.map +1 -1
  654. package/dist/modes/interactive/interactive-onboarding.js +24 -201
  655. package/dist/modes/interactive/interactive-onboarding.js.map +1 -1
  656. package/dist/modes/interactive/interactive-process-lifecycle.d.ts.map +1 -1
  657. package/dist/modes/interactive/interactive-process-lifecycle.js +43 -9
  658. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  659. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
  660. package/dist/modes/interactive/interactive-render-chat.js +93 -10
  661. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  662. package/dist/modes/interactive/interactive-resource-disclosure.d.ts.map +1 -1
  663. package/dist/modes/interactive/interactive-resource-disclosure.js +3 -2
  664. package/dist/modes/interactive/interactive-resource-disclosure.js.map +1 -1
  665. package/dist/modes/interactive/interactive-resource-rendering.d.ts.map +1 -1
  666. package/dist/modes/interactive/interactive-resource-rendering.js +10 -8
  667. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  668. package/dist/modes/interactive/interactive-session-routing.d.ts.map +1 -1
  669. package/dist/modes/interactive/interactive-session-routing.js +9 -5
  670. package/dist/modes/interactive/interactive-session-routing.js.map +1 -1
  671. package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
  672. package/dist/modes/interactive/interactive-session-runtime.js +1 -1
  673. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  674. package/dist/modes/interactive/interactive-slash-commands.d.ts.map +1 -1
  675. package/dist/modes/interactive/interactive-slash-commands.js +1 -1
  676. package/dist/modes/interactive/interactive-slash-commands.js.map +1 -1
  677. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  678. package/dist/modes/interactive/interactive-startup.js +102 -98
  679. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  680. package/dist/modes/interactive/theme/global-theme.d.ts.map +1 -1
  681. package/dist/modes/interactive/theme/global-theme.js +26 -2
  682. package/dist/modes/interactive/theme/global-theme.js.map +1 -1
  683. package/dist/modes/interactive/theme/theme-class.d.ts +1 -1
  684. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  685. package/dist/modes/interactive/theme/theme-class.js +2 -0
  686. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  687. package/dist/modes/interactive/theme/theme-loading.d.ts +1 -0
  688. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  689. package/dist/modes/interactive/theme/theme-loading.js +3 -0
  690. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  691. package/dist/modes/interactive/theme/theme.d.ts +1 -1
  692. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  693. package/dist/modes/interactive/theme/theme.js +1 -1
  694. package/dist/modes/interactive/theme/theme.js.map +1 -1
  695. package/dist/utils/child-process.d.ts +8 -1
  696. package/dist/utils/child-process.d.ts.map +1 -1
  697. package/dist/utils/child-process.js +39 -6
  698. package/dist/utils/child-process.js.map +1 -1
  699. package/dist/utils/clipboard-image.d.ts.map +1 -1
  700. package/dist/utils/clipboard-image.js +3 -0
  701. package/dist/utils/clipboard-image.js.map +1 -1
  702. package/dist/utils/event-loop.d.ts +7 -0
  703. package/dist/utils/event-loop.d.ts.map +1 -0
  704. package/dist/utils/event-loop.js +14 -0
  705. package/dist/utils/event-loop.js.map +1 -0
  706. package/dist/utils/fs-watch.d.ts +24 -1
  707. package/dist/utils/fs-watch.d.ts.map +1 -1
  708. package/dist/utils/fs-watch.js +60 -5
  709. package/dist/utils/fs-watch.js.map +1 -1
  710. package/dist/utils/json.d.ts +4 -0
  711. package/dist/utils/json.d.ts.map +1 -1
  712. package/dist/utils/json.js +8 -0
  713. package/dist/utils/json.js.map +1 -1
  714. package/dist/utils/module-require.d.ts +11 -0
  715. package/dist/utils/module-require.d.ts.map +1 -1
  716. package/dist/utils/module-require.js +14 -1
  717. package/dist/utils/module-require.js.map +1 -1
  718. package/dist/utils/split-launcher.d.ts +38 -0
  719. package/dist/utils/split-launcher.d.ts.map +1 -0
  720. package/dist/utils/split-launcher.js +63 -0
  721. package/dist/utils/split-launcher.js.map +1 -0
  722. package/docs/changelog.mdx +19 -0
  723. package/docs/compaction.md +100 -64
  724. package/docs/custom-provider.md +18 -5
  725. package/docs/development.md +4 -0
  726. package/docs/extensions.md +11 -2
  727. package/docs/json.md +3 -1
  728. package/docs/keybindings.md +2 -2
  729. package/docs/models.md +69 -10
  730. package/docs/providers.md +3 -2
  731. package/docs/quickstart.md +15 -11
  732. package/docs/rpc.md +5 -3
  733. package/docs/sdk.md +1 -1
  734. package/docs/settings.md +33 -3
  735. package/docs/subagents.md +40 -5
  736. package/docs/terminal-setup.md +4 -0
  737. package/docs/tools.md +1 -1
  738. package/docs/usage.md +8 -6
  739. package/docs/windows.md +4 -0
  740. package/docs/workflows.md +59 -36
  741. package/examples/extensions/preset.ts +2 -2
  742. package/examples/extensions/subagent/README.md +2 -2
  743. package/examples/extensions/subagent/index.ts +1 -2
  744. package/examples/extensions/subagent/schemas.ts +4 -1
  745. package/examples/sdk/12-full-control.ts +1 -1
  746. package/npm-shrinkwrap.json +538 -51
  747. package/package.json +10 -9
  748. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-behavior.ts +0 -75
  749. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-component.ts +0 -202
  750. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-edit.ts +0 -97
  751. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-editor.ts +0 -160
  752. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-frame.ts +0 -72
  753. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-modes.ts +0 -161
  754. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-render-selectors.ts +0 -203
  755. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-selectors.ts +0 -234
  756. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-state.ts +0 -103
  757. package/dist/builtin/subagents/src/runs/foreground/chain-clarify-types.ts +0 -29
  758. package/dist/builtin/subagents/src/runs/foreground/chain-clarify.ts +0 -9
  759. package/dist/builtin/subagents/src/runs/foreground/chain-execution-clarify.ts +0 -117
@@ -1 +1 @@
1
- {"version":3,"file":"model-resolver-cli.js","sourceRoot":"","sources":["../../src/core/model-resolver-cli.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport { buildFallbackModel, parseModelPattern } from \"./model-resolver-patterns.ts\";\nimport type { ResolveCliModelResult } from \"./model-resolver-types.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\n\nfunction buildProviderMap(availableModels: Model<Api>[]): Map<string, string> {\n const providerMap = new Map<string, string>();\n for (const model of availableModels) {\n providerMap.set(model.provider.toLowerCase(), model.provider);\n }\n return providerMap;\n}\n\nfunction findRawExactModel(cliModel: string, availableModels: Model<Api>[]): Model<Api> | undefined {\n const lower = cliModel.toLowerCase();\n return availableModels.find(\n (m) => m.id.toLowerCase() === lower || `${m.provider}/${m.id}`.toLowerCase() === lower,\n );\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 cliProvider?: string;\n cliModel?: string;\n modelRegistry: ModelRegistry;\n}): ResolveCliModelResult {\n const { cliProvider, cliModel, modelRegistry } = options;\n\n if (!cliModel) {\n return { model: undefined, warning: undefined, error: undefined };\n }\n\n const availableModels = modelRegistry.getAll();\n if (availableModels.length === 0) {\n return {\n model: undefined,\n warning: undefined,\n error: \"No models available. Check your installation or add models to models.json.\",\n };\n }\n\n const providerMap = buildProviderMap(availableModels);\n let provider = cliProvider ? providerMap.get(cliProvider.toLowerCase()) : undefined;\n if (cliProvider && !provider) {\n return {\n model: undefined,\n warning: undefined,\n error: `Unknown provider \"${cliProvider}\". Use --list-models to see available providers/models.`,\n };\n }\n\n let pattern = cliModel;\n let inferredProvider = false;\n\n if (!provider) {\n const slashIndex = cliModel.indexOf(\"/\");\n if (slashIndex !== -1) {\n const maybeProvider = cliModel.substring(0, slashIndex);\n const canonical = providerMap.get(maybeProvider.toLowerCase());\n if (canonical) {\n provider = canonical;\n pattern = cliModel.substring(slashIndex + 1);\n inferredProvider = true;\n }\n }\n }\n\n if (!provider) {\n const exact = findRawExactModel(cliModel, availableModels);\n if (exact) {\n return { model: exact, warning: undefined, thinkingLevel: undefined, error: undefined };\n }\n }\n\n if (cliProvider && provider) {\n const prefix = `${provider}/`;\n if (cliModel.toLowerCase().startsWith(prefix.toLowerCase())) {\n pattern = cliModel.substring(prefix.length);\n }\n }\n\n const candidates = provider ? availableModels.filter((m) => m.provider === provider) : availableModels;\n const { model, thinkingLevel, warning } = parseModelPattern(pattern, candidates, {\n allowInvalidThinkingLevelFallback: false,\n });\n\n if (model) {\n return { model, thinkingLevel, warning, error: undefined };\n }\n\n if (inferredProvider) {\n const exact = findRawExactModel(cliModel, availableModels);\n if (exact) {\n return { model: exact, warning: undefined, thinkingLevel: undefined, error: undefined };\n }\n\n const fallback = parseModelPattern(cliModel, availableModels, {\n allowInvalidThinkingLevelFallback: false,\n });\n if (fallback.model) {\n return {\n model: fallback.model,\n thinkingLevel: fallback.thinkingLevel,\n warning: fallback.warning,\n error: undefined,\n };\n }\n }\n\n if (provider) {\n const fallbackModel = buildFallbackModel(provider, pattern, availableModels);\n if (fallbackModel) {\n const fallbackWarning = warning\n ? `${warning} Model \"${pattern}\" not found for provider \"${provider}\". Using custom model id.`\n : `Model \"${pattern}\" not found for provider \"${provider}\". Using custom model id.`;\n return {\n model: fallbackModel,\n thinkingLevel: undefined,\n warning: fallbackWarning,\n error: undefined,\n };\n }\n }\n\n const display = provider ? `${provider}/${pattern}` : cliModel;\n return {\n model: undefined,\n thinkingLevel: undefined,\n warning,\n error: `Model \"${display}\" not found. Use --list-models to see available models.`,\n };\n}\n"]}
1
+ {"version":3,"file":"model-resolver-cli.js","sourceRoot":"","sources":["../../src/core/model-resolver-cli.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport { isValidThinkingLevel } from \"../cli/args.ts\";\nimport { buildFallbackModel, parseModelPattern } from \"./model-resolver-patterns.ts\";\nimport type { ResolveCliModelResult } from \"./model-resolver-types.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\n\nfunction buildProviderMap(availableModels: Model<Api>[]): Map<string, string> {\n const providerMap = new Map<string, string>();\n for (const model of availableModels) {\n providerMap.set(model.provider.toLowerCase(), model.provider);\n }\n return providerMap;\n}\n\nfunction findRawExactModel(cliModel: string, availableModels: Model<Api>[]): Model<Api> | undefined {\n const lower = cliModel.toLowerCase();\n return availableModels.find(\n (m) => m.id.toLowerCase() === lower || `${m.provider}/${m.id}`.toLowerCase() === lower,\n );\n}\n\nfunction splitCustomModelThinkingSuffix(pattern: string): {\n modelId: string;\n thinkingLevel: ResolveCliModelResult[\"thinkingLevel\"];\n} {\n const lastColonIndex = pattern.lastIndexOf(\":\");\n if (lastColonIndex <= 0) return { modelId: pattern, thinkingLevel: undefined };\n\n const suffix = pattern.substring(lastColonIndex + 1);\n if (!isValidThinkingLevel(suffix)) return { modelId: pattern, thinkingLevel: undefined };\n\n return {\n modelId: pattern.substring(0, lastColonIndex),\n thinkingLevel: suffix,\n };\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 cliProvider?: string;\n cliModel?: string;\n modelRegistry: ModelRegistry;\n}): ResolveCliModelResult {\n const { cliProvider, cliModel, modelRegistry } = options;\n\n if (!cliModel) {\n return { model: undefined, warning: undefined, error: undefined };\n }\n\n const availableModels = modelRegistry.getAll();\n if (availableModels.length === 0) {\n return {\n model: undefined,\n warning: undefined,\n error: \"No models available. Check your installation or add models to models.json.\",\n };\n }\n\n const providerMap = buildProviderMap(availableModels);\n\n // A registered raw ID may itself look like \"provider/model:thinking\" (for example,\n // a gateway-owned ID). Preserve that exact ID before provider inference consumes the suffix.\n const rawPattern = splitCustomModelThinkingSuffix(cliModel);\n if (!cliProvider && rawPattern.thinkingLevel !== undefined) {\n const exact = findRawExactModel(cliModel, availableModels);\n if (exact) {\n return { model: exact, warning: undefined, thinkingLevel: undefined, error: undefined };\n }\n }\n\n let provider = cliProvider ? providerMap.get(cliProvider.toLowerCase()) : undefined;\n if (cliProvider && !provider) {\n return {\n model: undefined,\n warning: undefined,\n error: `Unknown provider \"${cliProvider}\". Use --list-models to see available providers/models.`,\n };\n }\n\n let pattern = cliModel;\n let inferredProvider = false;\n\n if (!provider) {\n const slashIndex = cliModel.indexOf(\"/\");\n if (slashIndex !== -1) {\n const maybeProvider = cliModel.substring(0, slashIndex);\n const canonical = providerMap.get(maybeProvider.toLowerCase());\n if (canonical) {\n provider = canonical;\n pattern = cliModel.substring(slashIndex + 1);\n inferredProvider = true;\n }\n }\n }\n\n if (!provider) {\n const exact = findRawExactModel(cliModel, availableModels);\n if (exact) {\n return { model: exact, warning: undefined, thinkingLevel: undefined, error: undefined };\n }\n }\n\n if (cliProvider && provider) {\n const prefix = `${provider}/`;\n if (cliModel.toLowerCase().startsWith(prefix.toLowerCase())) {\n pattern = cliModel.substring(prefix.length);\n }\n }\n\n const candidates = provider ? availableModels.filter((m) => m.provider === provider) : availableModels;\n const { model, thinkingLevel, warning } = parseModelPattern(pattern, candidates, {\n allowInvalidThinkingLevelFallback: false,\n });\n\n if (model) {\n return { model, thinkingLevel, warning, error: undefined };\n }\n\n if (inferredProvider) {\n const exact = findRawExactModel(cliModel, availableModels);\n if (exact) {\n return { model: exact, warning: undefined, thinkingLevel: undefined, error: undefined };\n }\n\n const fallback = parseModelPattern(cliModel, availableModels, {\n allowInvalidThinkingLevelFallback: false,\n });\n if (fallback.model) {\n return {\n model: fallback.model,\n thinkingLevel: fallback.thinkingLevel,\n warning: fallback.warning,\n error: undefined,\n };\n }\n }\n\n if (provider) {\n // Registered resolution above takes precedence, including model IDs whose final colon\n // segment happens to look like a thinking level. Only custom fallback splits it.\n const customPattern = splitCustomModelThinkingSuffix(pattern);\n const fallbackModel = buildFallbackModel(provider, customPattern.modelId, availableModels);\n if (fallbackModel) {\n const customModel =\n customPattern.thinkingLevel && customPattern.thinkingLevel !== \"off\"\n ? { ...fallbackModel, reasoning: true }\n : fallbackModel;\n const fallbackWarning = warning\n ? `${warning} Model \"${customPattern.modelId}\" not found for provider \"${provider}\". Using custom model id.`\n : `Model \"${customPattern.modelId}\" not found for provider \"${provider}\". Using custom model id.`;\n return {\n model: customModel,\n thinkingLevel: customPattern.thinkingLevel,\n warning: fallbackWarning,\n error: undefined,\n };\n }\n }\n\n const display = provider ? `${provider}/${pattern}` : cliModel;\n return {\n model: undefined,\n thinkingLevel: undefined,\n warning,\n error: `Model \"${display}\" not found. Use --list-models to see available models.`,\n };\n}\n"]}
@@ -2,7 +2,12 @@ import type { ThinkingLevel } from "@earendil-works/pi-agent-core";
2
2
  import type { Api, Model } from "@earendil-works/pi-ai/compat";
3
3
  import type { ModelRegistry } from "./model-registry.ts";
4
4
  import type { InitialModelResult, ScopedModel } from "./model-resolver-types.ts";
5
- export declare function resolveSavedModelReference(provider: string, modelId: string, modelRegistry: ModelRegistry): Promise<Model<Api> | undefined>;
5
+ /**
6
+ * Resolve a model reference persisted in a session. Exact unauthenticated
7
+ * models are authoritative failures; only an absent id may be reconstructed
8
+ * from an authenticated model for the same dynamic/custom provider.
9
+ */
10
+ export declare function resolveRestoredModelReference(provider: string, modelId: string, modelRegistry: ModelRegistry): Promise<Model<Api> | undefined>;
6
11
  /**
7
12
  * Find the initial model to use based on priority:
8
13
  * 1. CLI args (provider + model)
@@ -1 +1 @@
1
- {"version":3,"file":"model-resolver-initial.d.ts","sourceRoot":"","sources":["../../src/core/model-resolver-initial.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAG/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAUjF,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAIjC;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,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;CAC9B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmE9B;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,EACpC,mBAAmB,EAAE,OAAO,EAC5B,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC;IACT,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,CAAC,CA2CD","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport chalk from \"chalk\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport { findPreferredAvailableModel } from \"./model-resolver-defaults.ts\";\nimport { buildFallbackModel } from \"./model-resolver-patterns.ts\";\nimport { resolveCliModel } from \"./model-resolver-cli.ts\";\nimport type { InitialModelResult, ScopedModel } from \"./model-resolver-types.ts\";\n\nasync function buildConfiguredProviderFallbackModel(\n provider: string,\n modelId: string,\n modelRegistry: ModelRegistry,\n): Promise<Model<Api> | undefined> {\n return buildFallbackModel(provider, modelId, await modelRegistry.getAvailable());\n}\n\nexport async function resolveSavedModelReference(\n provider: string,\n modelId: string,\n modelRegistry: ModelRegistry,\n): Promise<Model<Api> | undefined> {\n const found = modelRegistry.find(provider, modelId);\n if (found) return found;\n return buildConfiguredProviderFallbackModel(provider, modelId, modelRegistry);\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 cliProvider?: string;\n cliModel?: string;\n scopedModels: ScopedModel[];\n isContinuing: boolean;\n defaultProvider?: string;\n defaultModelId?: string;\n defaultThinkingLevel?: ThinkingLevel;\n modelRegistry: ModelRegistry;\n}): Promise<InitialModelResult> {\n const {\n cliProvider,\n cliModel,\n scopedModels,\n isContinuing,\n defaultProvider,\n defaultModelId,\n defaultThinkingLevel,\n modelRegistry,\n } = options;\n\n let model: Model<Api> | undefined;\n let thinkingLevel: ThinkingLevel = DEFAULT_THINKING_LEVEL;\n\n if (cliProvider && cliModel) {\n const resolved = resolveCliModel({\n cliProvider,\n cliModel,\n modelRegistry,\n });\n if (resolved.error) {\n console.error(chalk.red(resolved.error));\n process.exit(1);\n }\n if (resolved.model) {\n return {\n model: resolved.model,\n thinkingLevel: DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n }\n }\n\n if (scopedModels.length > 0 && !isContinuing) {\n return {\n model: scopedModels[0].model,\n thinkingLevel: scopedModels[0].thinkingLevel ?? defaultThinkingLevel ?? DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n }\n\n if (defaultProvider && defaultModelId) {\n const found = await resolveSavedModelReference(defaultProvider, defaultModelId, modelRegistry);\n if (found) {\n model = found;\n if (defaultThinkingLevel) {\n thinkingLevel = defaultThinkingLevel;\n }\n return { model, thinkingLevel, fallbackMessage: undefined };\n }\n }\n\n const availableModels = await modelRegistry.getAvailable();\n if (availableModels.length > 0) {\n return {\n model: findPreferredAvailableModel(availableModels),\n thinkingLevel: DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n }\n\n return {\n model: undefined,\n thinkingLevel: DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n}\n\n/**\n * Restore model from session, with fallback to available models\n */\nexport async function restoreModelFromSession(\n savedProvider: string,\n savedModelId: string,\n currentModel: Model<Api> | undefined,\n shouldPrintMessages: boolean,\n modelRegistry: ModelRegistry,\n): Promise<{\n model: Model<Api> | undefined;\n fallbackMessage: string | undefined;\n}> {\n const exactRestoredModel = modelRegistry.find(savedProvider, savedModelId);\n const restoredModel = exactRestoredModel && modelRegistry.hasConfiguredAuth(exactRestoredModel)\n ? exactRestoredModel\n : await buildConfiguredProviderFallbackModel(savedProvider, savedModelId, modelRegistry);\n\n if (restoredModel) {\n if (shouldPrintMessages) {\n console.log(chalk.dim(`Restored model: ${savedProvider}/${savedModelId}`));\n }\n return { model: restoredModel, fallbackMessage: undefined };\n }\n\n const reason = !exactRestoredModel ? \"model no longer exists\" : \"no auth configured\";\n\n if (shouldPrintMessages) {\n console.error(chalk.yellow(`Warning: Could not restore model ${savedProvider}/${savedModelId} (${reason}).`));\n }\n\n if (currentModel) {\n if (shouldPrintMessages) {\n console.log(chalk.dim(`Falling back to: ${currentModel.provider}/${currentModel.id}`));\n }\n return {\n model: currentModel,\n fallbackMessage: `Could not restore model ${savedProvider}/${savedModelId} (${reason}). Using ${currentModel.provider}/${currentModel.id}.`,\n };\n }\n\n const availableModels = await modelRegistry.getAvailable();\n const fallbackModel = findPreferredAvailableModel(availableModels);\n if (fallbackModel) {\n if (shouldPrintMessages) {\n console.log(chalk.dim(`Falling back to: ${fallbackModel.provider}/${fallbackModel.id}`));\n }\n\n return {\n model: fallbackModel,\n fallbackMessage: `Could not restore model ${savedProvider}/${savedModelId} (${reason}). Using ${fallbackModel.provider}/${fallbackModel.id}.`,\n };\n }\n\n return { model: undefined, fallbackMessage: undefined };\n}\n"]}
1
+ {"version":3,"file":"model-resolver-initial.d.ts","sourceRoot":"","sources":["../../src/core/model-resolver-initial.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAG/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAUjF;;;;GAIG;AACH,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAKjC;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,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;CAC9B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmE9B;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,EACpC,mBAAmB,EAAE,OAAO,EAC5B,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC;IACT,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAC9B,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,CAAC,CAyCD","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport chalk from \"chalk\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport { findPreferredAvailableModel } from \"./model-resolver-defaults.ts\";\nimport { buildFallbackModel } from \"./model-resolver-patterns.ts\";\nimport { resolveCliModel } from \"./model-resolver-cli.ts\";\nimport type { InitialModelResult, ScopedModel } from \"./model-resolver-types.ts\";\n\nasync function buildConfiguredProviderFallbackModel(\n provider: string,\n modelId: string,\n modelRegistry: ModelRegistry,\n): Promise<Model<Api> | undefined> {\n return buildFallbackModel(provider, modelId, await modelRegistry.getAvailable());\n}\n\n/**\n * Resolve a model reference persisted in a session. Exact unauthenticated\n * models are authoritative failures; only an absent id may be reconstructed\n * from an authenticated model for the same dynamic/custom provider.\n */\nexport async function resolveRestoredModelReference(\n provider: string,\n modelId: string,\n modelRegistry: ModelRegistry,\n): Promise<Model<Api> | undefined> {\n const found = modelRegistry.find(provider, modelId);\n if (found) return modelRegistry.hasConfiguredAuth(found) ? found : undefined;\n if (!modelRegistry.canRestoreUnknownModel(provider)) return undefined;\n return buildConfiguredProviderFallbackModel(provider, modelId, modelRegistry);\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 cliProvider?: string;\n cliModel?: string;\n scopedModels: ScopedModel[];\n isContinuing: boolean;\n defaultProvider?: string;\n defaultModelId?: string;\n defaultThinkingLevel?: ThinkingLevel;\n modelRegistry: ModelRegistry;\n}): Promise<InitialModelResult> {\n const {\n cliProvider,\n cliModel,\n scopedModels,\n isContinuing,\n defaultProvider,\n defaultModelId,\n defaultThinkingLevel,\n modelRegistry,\n } = options;\n\n let model: Model<Api> | undefined;\n let thinkingLevel: ThinkingLevel = DEFAULT_THINKING_LEVEL;\n\n if (cliProvider && cliModel) {\n const resolved = resolveCliModel({\n cliProvider,\n cliModel,\n modelRegistry,\n });\n if (resolved.error) {\n console.error(chalk.red(resolved.error));\n process.exit(1);\n }\n if (resolved.model) {\n return {\n model: resolved.model,\n thinkingLevel: DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n }\n }\n\n if (scopedModels.length > 0 && !isContinuing) {\n return {\n model: scopedModels[0].model,\n thinkingLevel: scopedModels[0].thinkingLevel ?? defaultThinkingLevel ?? DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n }\n\n if (defaultProvider && defaultModelId) {\n const found = modelRegistry.find(defaultProvider, defaultModelId);\n if (found && modelRegistry.hasConfiguredAuth(found)) {\n model = found;\n if (defaultThinkingLevel) {\n thinkingLevel = defaultThinkingLevel;\n }\n return { model, thinkingLevel, fallbackMessage: undefined };\n }\n }\n\n const availableModels = await modelRegistry.getAvailable();\n if (availableModels.length > 0) {\n return {\n model: findPreferredAvailableModel(availableModels),\n thinkingLevel: DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n }\n\n return {\n model: undefined,\n thinkingLevel: DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n}\n\n/**\n * Restore model from session, with fallback to available models\n */\nexport async function restoreModelFromSession(\n savedProvider: string,\n savedModelId: string,\n currentModel: Model<Api> | undefined,\n shouldPrintMessages: boolean,\n modelRegistry: ModelRegistry,\n): Promise<{\n model: Model<Api> | undefined;\n fallbackMessage: string | undefined;\n}> {\n const exactRestoredModel = modelRegistry.find(savedProvider, savedModelId);\n const restoredModel = await resolveRestoredModelReference(savedProvider, savedModelId, modelRegistry);\n\n if (restoredModel) {\n if (shouldPrintMessages) {\n console.log(chalk.dim(`Restored model: ${savedProvider}/${savedModelId}`));\n }\n return { model: restoredModel, fallbackMessage: undefined };\n }\n\n const reason = !exactRestoredModel ? \"model no longer exists\" : \"no auth configured\";\n\n if (shouldPrintMessages) {\n console.error(chalk.yellow(`Warning: Could not restore model ${savedProvider}/${savedModelId} (${reason}).`));\n }\n\n if (currentModel) {\n if (shouldPrintMessages) {\n console.log(chalk.dim(`Falling back to: ${currentModel.provider}/${currentModel.id}`));\n }\n return {\n model: currentModel,\n fallbackMessage: `Could not restore model ${savedProvider}/${savedModelId} (${reason}). Using ${currentModel.provider}/${currentModel.id}.`,\n };\n }\n\n const availableModels = await modelRegistry.getAvailable();\n const fallbackModel = findPreferredAvailableModel(availableModels);\n if (fallbackModel) {\n if (shouldPrintMessages) {\n console.log(chalk.dim(`Falling back to: ${fallbackModel.provider}/${fallbackModel.id}`));\n }\n\n return {\n model: fallbackModel,\n fallbackMessage: `Could not restore model ${savedProvider}/${savedModelId} (${reason}). Using ${fallbackModel.provider}/${fallbackModel.id}.`,\n };\n }\n\n return { model: undefined, fallbackMessage: undefined };\n}\n"]}
@@ -6,10 +6,17 @@ import { resolveCliModel } from "./model-resolver-cli.js";
6
6
  async function buildConfiguredProviderFallbackModel(provider, modelId, modelRegistry) {
7
7
  return buildFallbackModel(provider, modelId, await modelRegistry.getAvailable());
8
8
  }
9
- export async function resolveSavedModelReference(provider, modelId, modelRegistry) {
9
+ /**
10
+ * Resolve a model reference persisted in a session. Exact unauthenticated
11
+ * models are authoritative failures; only an absent id may be reconstructed
12
+ * from an authenticated model for the same dynamic/custom provider.
13
+ */
14
+ export async function resolveRestoredModelReference(provider, modelId, modelRegistry) {
10
15
  const found = modelRegistry.find(provider, modelId);
11
16
  if (found)
12
- return found;
17
+ return modelRegistry.hasConfiguredAuth(found) ? found : undefined;
18
+ if (!modelRegistry.canRestoreUnknownModel(provider))
19
+ return undefined;
13
20
  return buildConfiguredProviderFallbackModel(provider, modelId, modelRegistry);
14
21
  }
15
22
  /**
@@ -50,8 +57,8 @@ export async function findInitialModel(options) {
50
57
  };
51
58
  }
52
59
  if (defaultProvider && defaultModelId) {
53
- const found = await resolveSavedModelReference(defaultProvider, defaultModelId, modelRegistry);
54
- if (found) {
60
+ const found = modelRegistry.find(defaultProvider, defaultModelId);
61
+ if (found && modelRegistry.hasConfiguredAuth(found)) {
55
62
  model = found;
56
63
  if (defaultThinkingLevel) {
57
64
  thinkingLevel = defaultThinkingLevel;
@@ -78,9 +85,7 @@ export async function findInitialModel(options) {
78
85
  */
79
86
  export async function restoreModelFromSession(savedProvider, savedModelId, currentModel, shouldPrintMessages, modelRegistry) {
80
87
  const exactRestoredModel = modelRegistry.find(savedProvider, savedModelId);
81
- const restoredModel = exactRestoredModel && modelRegistry.hasConfiguredAuth(exactRestoredModel)
82
- ? exactRestoredModel
83
- : await buildConfiguredProviderFallbackModel(savedProvider, savedModelId, modelRegistry);
88
+ const restoredModel = await resolveRestoredModelReference(savedProvider, savedModelId, modelRegistry);
84
89
  if (restoredModel) {
85
90
  if (shouldPrintMessages) {
86
91
  console.log(chalk.dim(`Restored model: ${savedProvider}/${savedModelId}`));
@@ -1 +1 @@
1
- {"version":3,"file":"model-resolver-initial.js","sourceRoot":"","sources":["../../src/core/model-resolver-initial.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport chalk from \"chalk\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport { findPreferredAvailableModel } from \"./model-resolver-defaults.ts\";\nimport { buildFallbackModel } from \"./model-resolver-patterns.ts\";\nimport { resolveCliModel } from \"./model-resolver-cli.ts\";\nimport type { InitialModelResult, ScopedModel } from \"./model-resolver-types.ts\";\n\nasync function buildConfiguredProviderFallbackModel(\n provider: string,\n modelId: string,\n modelRegistry: ModelRegistry,\n): Promise<Model<Api> | undefined> {\n return buildFallbackModel(provider, modelId, await modelRegistry.getAvailable());\n}\n\nexport async function resolveSavedModelReference(\n provider: string,\n modelId: string,\n modelRegistry: ModelRegistry,\n): Promise<Model<Api> | undefined> {\n const found = modelRegistry.find(provider, modelId);\n if (found) return found;\n return buildConfiguredProviderFallbackModel(provider, modelId, modelRegistry);\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 cliProvider?: string;\n cliModel?: string;\n scopedModels: ScopedModel[];\n isContinuing: boolean;\n defaultProvider?: string;\n defaultModelId?: string;\n defaultThinkingLevel?: ThinkingLevel;\n modelRegistry: ModelRegistry;\n}): Promise<InitialModelResult> {\n const {\n cliProvider,\n cliModel,\n scopedModels,\n isContinuing,\n defaultProvider,\n defaultModelId,\n defaultThinkingLevel,\n modelRegistry,\n } = options;\n\n let model: Model<Api> | undefined;\n let thinkingLevel: ThinkingLevel = DEFAULT_THINKING_LEVEL;\n\n if (cliProvider && cliModel) {\n const resolved = resolveCliModel({\n cliProvider,\n cliModel,\n modelRegistry,\n });\n if (resolved.error) {\n console.error(chalk.red(resolved.error));\n process.exit(1);\n }\n if (resolved.model) {\n return {\n model: resolved.model,\n thinkingLevel: DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n }\n }\n\n if (scopedModels.length > 0 && !isContinuing) {\n return {\n model: scopedModels[0].model,\n thinkingLevel: scopedModels[0].thinkingLevel ?? defaultThinkingLevel ?? DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n }\n\n if (defaultProvider && defaultModelId) {\n const found = await resolveSavedModelReference(defaultProvider, defaultModelId, modelRegistry);\n if (found) {\n model = found;\n if (defaultThinkingLevel) {\n thinkingLevel = defaultThinkingLevel;\n }\n return { model, thinkingLevel, fallbackMessage: undefined };\n }\n }\n\n const availableModels = await modelRegistry.getAvailable();\n if (availableModels.length > 0) {\n return {\n model: findPreferredAvailableModel(availableModels),\n thinkingLevel: DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n }\n\n return {\n model: undefined,\n thinkingLevel: DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n}\n\n/**\n * Restore model from session, with fallback to available models\n */\nexport async function restoreModelFromSession(\n savedProvider: string,\n savedModelId: string,\n currentModel: Model<Api> | undefined,\n shouldPrintMessages: boolean,\n modelRegistry: ModelRegistry,\n): Promise<{\n model: Model<Api> | undefined;\n fallbackMessage: string | undefined;\n}> {\n const exactRestoredModel = modelRegistry.find(savedProvider, savedModelId);\n const restoredModel = exactRestoredModel && modelRegistry.hasConfiguredAuth(exactRestoredModel)\n ? exactRestoredModel\n : await buildConfiguredProviderFallbackModel(savedProvider, savedModelId, modelRegistry);\n\n if (restoredModel) {\n if (shouldPrintMessages) {\n console.log(chalk.dim(`Restored model: ${savedProvider}/${savedModelId}`));\n }\n return { model: restoredModel, fallbackMessage: undefined };\n }\n\n const reason = !exactRestoredModel ? \"model no longer exists\" : \"no auth configured\";\n\n if (shouldPrintMessages) {\n console.error(chalk.yellow(`Warning: Could not restore model ${savedProvider}/${savedModelId} (${reason}).`));\n }\n\n if (currentModel) {\n if (shouldPrintMessages) {\n console.log(chalk.dim(`Falling back to: ${currentModel.provider}/${currentModel.id}`));\n }\n return {\n model: currentModel,\n fallbackMessage: `Could not restore model ${savedProvider}/${savedModelId} (${reason}). Using ${currentModel.provider}/${currentModel.id}.`,\n };\n }\n\n const availableModels = await modelRegistry.getAvailable();\n const fallbackModel = findPreferredAvailableModel(availableModels);\n if (fallbackModel) {\n if (shouldPrintMessages) {\n console.log(chalk.dim(`Falling back to: ${fallbackModel.provider}/${fallbackModel.id}`));\n }\n\n return {\n model: fallbackModel,\n fallbackMessage: `Could not restore model ${savedProvider}/${savedModelId} (${reason}). Using ${fallbackModel.provider}/${fallbackModel.id}.`,\n };\n }\n\n return { model: undefined, fallbackMessage: undefined };\n}\n"]}
1
+ {"version":3,"file":"model-resolver-initial.js","sourceRoot":"","sources":["../../src/core/model-resolver-initial.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\nimport chalk from \"chalk\";\nimport { DEFAULT_THINKING_LEVEL } from \"./defaults.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport { findPreferredAvailableModel } from \"./model-resolver-defaults.ts\";\nimport { buildFallbackModel } from \"./model-resolver-patterns.ts\";\nimport { resolveCliModel } from \"./model-resolver-cli.ts\";\nimport type { InitialModelResult, ScopedModel } from \"./model-resolver-types.ts\";\n\nasync function buildConfiguredProviderFallbackModel(\n provider: string,\n modelId: string,\n modelRegistry: ModelRegistry,\n): Promise<Model<Api> | undefined> {\n return buildFallbackModel(provider, modelId, await modelRegistry.getAvailable());\n}\n\n/**\n * Resolve a model reference persisted in a session. Exact unauthenticated\n * models are authoritative failures; only an absent id may be reconstructed\n * from an authenticated model for the same dynamic/custom provider.\n */\nexport async function resolveRestoredModelReference(\n provider: string,\n modelId: string,\n modelRegistry: ModelRegistry,\n): Promise<Model<Api> | undefined> {\n const found = modelRegistry.find(provider, modelId);\n if (found) return modelRegistry.hasConfiguredAuth(found) ? found : undefined;\n if (!modelRegistry.canRestoreUnknownModel(provider)) return undefined;\n return buildConfiguredProviderFallbackModel(provider, modelId, modelRegistry);\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 cliProvider?: string;\n cliModel?: string;\n scopedModels: ScopedModel[];\n isContinuing: boolean;\n defaultProvider?: string;\n defaultModelId?: string;\n defaultThinkingLevel?: ThinkingLevel;\n modelRegistry: ModelRegistry;\n}): Promise<InitialModelResult> {\n const {\n cliProvider,\n cliModel,\n scopedModels,\n isContinuing,\n defaultProvider,\n defaultModelId,\n defaultThinkingLevel,\n modelRegistry,\n } = options;\n\n let model: Model<Api> | undefined;\n let thinkingLevel: ThinkingLevel = DEFAULT_THINKING_LEVEL;\n\n if (cliProvider && cliModel) {\n const resolved = resolveCliModel({\n cliProvider,\n cliModel,\n modelRegistry,\n });\n if (resolved.error) {\n console.error(chalk.red(resolved.error));\n process.exit(1);\n }\n if (resolved.model) {\n return {\n model: resolved.model,\n thinkingLevel: DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n }\n }\n\n if (scopedModels.length > 0 && !isContinuing) {\n return {\n model: scopedModels[0].model,\n thinkingLevel: scopedModels[0].thinkingLevel ?? defaultThinkingLevel ?? DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n }\n\n if (defaultProvider && defaultModelId) {\n const found = modelRegistry.find(defaultProvider, defaultModelId);\n if (found && modelRegistry.hasConfiguredAuth(found)) {\n model = found;\n if (defaultThinkingLevel) {\n thinkingLevel = defaultThinkingLevel;\n }\n return { model, thinkingLevel, fallbackMessage: undefined };\n }\n }\n\n const availableModels = await modelRegistry.getAvailable();\n if (availableModels.length > 0) {\n return {\n model: findPreferredAvailableModel(availableModels),\n thinkingLevel: DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n }\n\n return {\n model: undefined,\n thinkingLevel: DEFAULT_THINKING_LEVEL,\n fallbackMessage: undefined,\n };\n}\n\n/**\n * Restore model from session, with fallback to available models\n */\nexport async function restoreModelFromSession(\n savedProvider: string,\n savedModelId: string,\n currentModel: Model<Api> | undefined,\n shouldPrintMessages: boolean,\n modelRegistry: ModelRegistry,\n): Promise<{\n model: Model<Api> | undefined;\n fallbackMessage: string | undefined;\n}> {\n const exactRestoredModel = modelRegistry.find(savedProvider, savedModelId);\n const restoredModel = await resolveRestoredModelReference(savedProvider, savedModelId, modelRegistry);\n\n if (restoredModel) {\n if (shouldPrintMessages) {\n console.log(chalk.dim(`Restored model: ${savedProvider}/${savedModelId}`));\n }\n return { model: restoredModel, fallbackMessage: undefined };\n }\n\n const reason = !exactRestoredModel ? \"model no longer exists\" : \"no auth configured\";\n\n if (shouldPrintMessages) {\n console.error(chalk.yellow(`Warning: Could not restore model ${savedProvider}/${savedModelId} (${reason}).`));\n }\n\n if (currentModel) {\n if (shouldPrintMessages) {\n console.log(chalk.dim(`Falling back to: ${currentModel.provider}/${currentModel.id}`));\n }\n return {\n model: currentModel,\n fallbackMessage: `Could not restore model ${savedProvider}/${savedModelId} (${reason}). Using ${currentModel.provider}/${currentModel.id}.`,\n };\n }\n\n const availableModels = await modelRegistry.getAvailable();\n const fallbackModel = findPreferredAvailableModel(availableModels);\n if (fallbackModel) {\n if (shouldPrintMessages) {\n console.log(chalk.dim(`Falling back to: ${fallbackModel.provider}/${fallbackModel.id}`));\n }\n\n return {\n model: fallbackModel,\n fallbackMessage: `Could not restore model ${savedProvider}/${savedModelId} (${reason}). Using ${fallbackModel.provider}/${fallbackModel.id}.`,\n };\n }\n\n return { model: undefined, fallbackMessage: undefined };\n}\n"]}
@@ -1,5 +1,13 @@
1
1
  import type { ModelRegistry } from "./model-registry.ts";
2
2
  import type { ScopedModel } from "./model-resolver-types.ts";
3
+ export interface ModelScopeDiagnostic {
4
+ type: "warning";
5
+ message: string;
6
+ }
7
+ export interface ResolveModelScopeResult {
8
+ scopedModels: ScopedModel[];
9
+ diagnostics: ModelScopeDiagnostic[];
10
+ }
3
11
  /**
4
12
  * Resolve model patterns to actual Model objects with optional thinking levels
5
13
  * Format: "pattern:level" where :level is optional
@@ -11,5 +19,6 @@ import type { ScopedModel } from "./model-resolver-types.ts";
11
19
  * The algorithm tries to match the full pattern first, then progressively
12
20
  * strips colon-suffixes to find a match.
13
21
  */
22
+ export declare function resolveModelScopeWithDiagnostics(patterns: string[], modelRegistry: ModelRegistry): Promise<ResolveModelScopeResult>;
14
23
  export declare function resolveModelScope(patterns: string[], modelRegistry: ModelRegistry): Promise<ScopedModel[]>;
15
24
  //# sourceMappingURL=model-resolver-scope.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-resolver-scope.d.ts","sourceRoot":"","sources":["../../src/core/model-resolver-scope.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAoB7D;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CA0ChH","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { modelsAreEqual } from \"@earendil-works/pi-ai/compat\";\nimport chalk from \"chalk\";\nimport { minimatch } from \"minimatch\";\nimport { isValidThinkingLevel } from \"../cli/args.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport { parseModelPattern } from \"./model-resolver-patterns.ts\";\nimport type { ScopedModel } from \"./model-resolver-types.ts\";\n\nfunction hasGlobCharacters(pattern: string): boolean {\n return pattern.includes(\"*\") || pattern.includes(\"?\") || pattern.includes(\"[\");\n}\n\nfunction parseGlobThinkingLevel(pattern: string): { globPattern: string; thinkingLevel?: ThinkingLevel } {\n const colonIdx = pattern.lastIndexOf(\":\");\n if (colonIdx === -1) {\n return { globPattern: pattern };\n }\n\n const suffix = pattern.substring(colonIdx + 1);\n if (!isValidThinkingLevel(suffix)) {\n return { globPattern: pattern };\n }\n\n return { globPattern: pattern.substring(0, colonIdx), thinkingLevel: suffix };\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 const availableModels = await modelRegistry.getAvailable();\n const scopedModels: ScopedModel[] = [];\n\n for (const pattern of patterns) {\n if (hasGlobCharacters(pattern)) {\n const { globPattern, thinkingLevel } = parseGlobThinkingLevel(pattern);\n const matchingModels = availableModels.filter((m) => {\n const fullId = `${m.provider}/${m.id}`;\n return minimatch(fullId, globPattern, { nocase: true }) || minimatch(m.id, globPattern, { nocase: true });\n });\n\n if (matchingModels.length === 0) {\n console.warn(chalk.yellow(`Warning: No models match pattern \"${pattern}\"`));\n continue;\n }\n\n for (const model of matchingModels) {\n if (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {\n scopedModels.push({ model, thinkingLevel });\n }\n }\n continue;\n }\n\n const { model, thinkingLevel, warning } = parseModelPattern(pattern, availableModels);\n\n if (warning) {\n console.warn(chalk.yellow(`Warning: ${warning}`));\n }\n\n if (!model) {\n console.warn(chalk.yellow(`Warning: No models match pattern \"${pattern}\"`));\n continue;\n }\n\n if (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {\n scopedModels.push({ model, thinkingLevel });\n }\n }\n\n return scopedModels;\n}\n"]}
1
+ {"version":3,"file":"model-resolver-scope.d.ts","sourceRoot":"","sources":["../../src/core/model-resolver-scope.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAE7D,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,WAAW,EAAE,oBAAoB,EAAE,CAAC;CACrC;AAoBD;;;;;;;;;;GAUG;AACH,wBAAsB,gCAAgC,CACpD,QAAQ,EAAE,MAAM,EAAE,EAClB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,uBAAuB,CAAC,CA0ClC;AAED,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAMhH","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { modelsAreEqual } from \"@earendil-works/pi-ai/compat\";\nimport chalk from \"chalk\";\nimport { minimatch } from \"minimatch\";\nimport { isValidThinkingLevel } from \"../cli/args.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport { parseModelPattern } from \"./model-resolver-patterns.ts\";\nimport type { ScopedModel } from \"./model-resolver-types.ts\";\n\nexport interface ModelScopeDiagnostic {\n type: \"warning\";\n message: string;\n}\n\nexport interface ResolveModelScopeResult {\n scopedModels: ScopedModel[];\n diagnostics: ModelScopeDiagnostic[];\n}\n\nfunction hasGlobCharacters(pattern: string): boolean {\n return pattern.includes(\"*\") || pattern.includes(\"?\") || pattern.includes(\"[\");\n}\n\nfunction parseGlobThinkingLevel(pattern: string): { globPattern: string; thinkingLevel?: ThinkingLevel } {\n const colonIdx = pattern.lastIndexOf(\":\");\n if (colonIdx === -1) {\n return { globPattern: pattern };\n }\n\n const suffix = pattern.substring(colonIdx + 1);\n if (!isValidThinkingLevel(suffix)) {\n return { globPattern: pattern };\n }\n\n return { globPattern: pattern.substring(0, colonIdx), thinkingLevel: suffix };\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 resolveModelScopeWithDiagnostics(\n patterns: string[],\n modelRegistry: ModelRegistry,\n): Promise<ResolveModelScopeResult> {\n const availableModels = await modelRegistry.getAvailable();\n const scopedModels: ScopedModel[] = [];\n const diagnostics: ModelScopeDiagnostic[] = [];\n for (const pattern of patterns) {\n if (hasGlobCharacters(pattern)) {\n const { globPattern, thinkingLevel } = parseGlobThinkingLevel(pattern);\n const matchingModels = availableModels.filter((m) => {\n const fullId = `${m.provider}/${m.id}`;\n return minimatch(fullId, globPattern, { nocase: true }) || minimatch(m.id, globPattern, { nocase: true });\n });\n\n if (matchingModels.length === 0) {\n diagnostics.push({ type: \"warning\", message: `No models match pattern \"${pattern}\"` });\n continue;\n }\n\n for (const model of matchingModels) {\n if (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {\n scopedModels.push({ model, thinkingLevel });\n }\n }\n continue;\n }\n\n const { model, thinkingLevel, warning } = parseModelPattern(pattern, availableModels);\n\n if (warning) {\n diagnostics.push({ type: \"warning\", message: warning });\n }\n\n if (!model) {\n diagnostics.push({ type: \"warning\", message: `No models match pattern \"${pattern}\"` });\n continue;\n }\n\n if (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {\n scopedModels.push({ model, thinkingLevel });\n }\n }\n\n return { scopedModels, diagnostics };\n}\n\nexport async function resolveModelScope(patterns: string[], modelRegistry: ModelRegistry): Promise<ScopedModel[]> {\n const { scopedModels, diagnostics } = await resolveModelScopeWithDiagnostics(patterns, modelRegistry);\n for (const diagnostic of diagnostics) {\n console.warn(chalk.yellow(`Warning: ${diagnostic.message}`));\n }\n return scopedModels;\n}\n"]}
@@ -28,9 +28,10 @@ function parseGlobThinkingLevel(pattern) {
28
28
  * The algorithm tries to match the full pattern first, then progressively
29
29
  * strips colon-suffixes to find a match.
30
30
  */
31
- export async function resolveModelScope(patterns, modelRegistry) {
31
+ export async function resolveModelScopeWithDiagnostics(patterns, modelRegistry) {
32
32
  const availableModels = await modelRegistry.getAvailable();
33
33
  const scopedModels = [];
34
+ const diagnostics = [];
34
35
  for (const pattern of patterns) {
35
36
  if (hasGlobCharacters(pattern)) {
36
37
  const { globPattern, thinkingLevel } = parseGlobThinkingLevel(pattern);
@@ -39,7 +40,7 @@ export async function resolveModelScope(patterns, modelRegistry) {
39
40
  return minimatch(fullId, globPattern, { nocase: true }) || minimatch(m.id, globPattern, { nocase: true });
40
41
  });
41
42
  if (matchingModels.length === 0) {
42
- console.warn(chalk.yellow(`Warning: No models match pattern "${pattern}"`));
43
+ diagnostics.push({ type: "warning", message: `No models match pattern "${pattern}"` });
43
44
  continue;
44
45
  }
45
46
  for (const model of matchingModels) {
@@ -51,16 +52,23 @@ export async function resolveModelScope(patterns, modelRegistry) {
51
52
  }
52
53
  const { model, thinkingLevel, warning } = parseModelPattern(pattern, availableModels);
53
54
  if (warning) {
54
- console.warn(chalk.yellow(`Warning: ${warning}`));
55
+ diagnostics.push({ type: "warning", message: warning });
55
56
  }
56
57
  if (!model) {
57
- console.warn(chalk.yellow(`Warning: No models match pattern "${pattern}"`));
58
+ diagnostics.push({ type: "warning", message: `No models match pattern "${pattern}"` });
58
59
  continue;
59
60
  }
60
61
  if (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {
61
62
  scopedModels.push({ model, thinkingLevel });
62
63
  }
63
64
  }
65
+ return { scopedModels, diagnostics };
66
+ }
67
+ export async function resolveModelScope(patterns, modelRegistry) {
68
+ const { scopedModels, diagnostics } = await resolveModelScopeWithDiagnostics(patterns, modelRegistry);
69
+ for (const diagnostic of diagnostics) {
70
+ console.warn(chalk.yellow(`Warning: ${diagnostic.message}`));
71
+ }
64
72
  return scopedModels;
65
73
  }
66
74
  //# sourceMappingURL=model-resolver-scope.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-resolver-scope.js","sourceRoot":"","sources":["../../src/core/model-resolver-scope.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { modelsAreEqual } from \"@earendil-works/pi-ai/compat\";\nimport chalk from \"chalk\";\nimport { minimatch } from \"minimatch\";\nimport { isValidThinkingLevel } from \"../cli/args.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport { parseModelPattern } from \"./model-resolver-patterns.ts\";\nimport type { ScopedModel } from \"./model-resolver-types.ts\";\n\nfunction hasGlobCharacters(pattern: string): boolean {\n return pattern.includes(\"*\") || pattern.includes(\"?\") || pattern.includes(\"[\");\n}\n\nfunction parseGlobThinkingLevel(pattern: string): { globPattern: string; thinkingLevel?: ThinkingLevel } {\n const colonIdx = pattern.lastIndexOf(\":\");\n if (colonIdx === -1) {\n return { globPattern: pattern };\n }\n\n const suffix = pattern.substring(colonIdx + 1);\n if (!isValidThinkingLevel(suffix)) {\n return { globPattern: pattern };\n }\n\n return { globPattern: pattern.substring(0, colonIdx), thinkingLevel: suffix };\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 const availableModels = await modelRegistry.getAvailable();\n const scopedModels: ScopedModel[] = [];\n\n for (const pattern of patterns) {\n if (hasGlobCharacters(pattern)) {\n const { globPattern, thinkingLevel } = parseGlobThinkingLevel(pattern);\n const matchingModels = availableModels.filter((m) => {\n const fullId = `${m.provider}/${m.id}`;\n return minimatch(fullId, globPattern, { nocase: true }) || minimatch(m.id, globPattern, { nocase: true });\n });\n\n if (matchingModels.length === 0) {\n console.warn(chalk.yellow(`Warning: No models match pattern \"${pattern}\"`));\n continue;\n }\n\n for (const model of matchingModels) {\n if (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {\n scopedModels.push({ model, thinkingLevel });\n }\n }\n continue;\n }\n\n const { model, thinkingLevel, warning } = parseModelPattern(pattern, availableModels);\n\n if (warning) {\n console.warn(chalk.yellow(`Warning: ${warning}`));\n }\n\n if (!model) {\n console.warn(chalk.yellow(`Warning: No models match pattern \"${pattern}\"`));\n continue;\n }\n\n if (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {\n scopedModels.push({ model, thinkingLevel });\n }\n }\n\n return scopedModels;\n}\n"]}
1
+ {"version":3,"file":"model-resolver-scope.js","sourceRoot":"","sources":["../../src/core/model-resolver-scope.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@earendil-works/pi-agent-core\";\nimport { modelsAreEqual } from \"@earendil-works/pi-ai/compat\";\nimport chalk from \"chalk\";\nimport { minimatch } from \"minimatch\";\nimport { isValidThinkingLevel } from \"../cli/args.ts\";\nimport type { ModelRegistry } from \"./model-registry.ts\";\nimport { parseModelPattern } from \"./model-resolver-patterns.ts\";\nimport type { ScopedModel } from \"./model-resolver-types.ts\";\n\nexport interface ModelScopeDiagnostic {\n type: \"warning\";\n message: string;\n}\n\nexport interface ResolveModelScopeResult {\n scopedModels: ScopedModel[];\n diagnostics: ModelScopeDiagnostic[];\n}\n\nfunction hasGlobCharacters(pattern: string): boolean {\n return pattern.includes(\"*\") || pattern.includes(\"?\") || pattern.includes(\"[\");\n}\n\nfunction parseGlobThinkingLevel(pattern: string): { globPattern: string; thinkingLevel?: ThinkingLevel } {\n const colonIdx = pattern.lastIndexOf(\":\");\n if (colonIdx === -1) {\n return { globPattern: pattern };\n }\n\n const suffix = pattern.substring(colonIdx + 1);\n if (!isValidThinkingLevel(suffix)) {\n return { globPattern: pattern };\n }\n\n return { globPattern: pattern.substring(0, colonIdx), thinkingLevel: suffix };\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 resolveModelScopeWithDiagnostics(\n patterns: string[],\n modelRegistry: ModelRegistry,\n): Promise<ResolveModelScopeResult> {\n const availableModels = await modelRegistry.getAvailable();\n const scopedModels: ScopedModel[] = [];\n const diagnostics: ModelScopeDiagnostic[] = [];\n for (const pattern of patterns) {\n if (hasGlobCharacters(pattern)) {\n const { globPattern, thinkingLevel } = parseGlobThinkingLevel(pattern);\n const matchingModels = availableModels.filter((m) => {\n const fullId = `${m.provider}/${m.id}`;\n return minimatch(fullId, globPattern, { nocase: true }) || minimatch(m.id, globPattern, { nocase: true });\n });\n\n if (matchingModels.length === 0) {\n diagnostics.push({ type: \"warning\", message: `No models match pattern \"${pattern}\"` });\n continue;\n }\n\n for (const model of matchingModels) {\n if (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {\n scopedModels.push({ model, thinkingLevel });\n }\n }\n continue;\n }\n\n const { model, thinkingLevel, warning } = parseModelPattern(pattern, availableModels);\n\n if (warning) {\n diagnostics.push({ type: \"warning\", message: warning });\n }\n\n if (!model) {\n diagnostics.push({ type: \"warning\", message: `No models match pattern \"${pattern}\"` });\n continue;\n }\n\n if (!scopedModels.find((sm) => modelsAreEqual(sm.model, model))) {\n scopedModels.push({ model, thinkingLevel });\n }\n }\n\n return { scopedModels, diagnostics };\n}\n\nexport async function resolveModelScope(patterns: string[], modelRegistry: ModelRegistry): Promise<ScopedModel[]> {\n const { scopedModels, diagnostics } = await resolveModelScopeWithDiagnostics(patterns, modelRegistry);\n for (const diagnostic of diagnostics) {\n console.warn(chalk.yellow(`Warning: ${diagnostic.message}`));\n }\n return scopedModels;\n}\n"]}
@@ -3,8 +3,9 @@
3
3
  */
4
4
  export { defaultModelPerProvider } from "./model-resolver-defaults.ts";
5
5
  export { resolveCliModel } from "./model-resolver-cli.ts";
6
- export { findInitialModel, resolveSavedModelReference, restoreModelFromSession } from "./model-resolver-initial.ts";
6
+ export { findInitialModel, resolveRestoredModelReference, restoreModelFromSession } from "./model-resolver-initial.ts";
7
7
  export { findExactModelReferenceMatch, parseModelPattern } from "./model-resolver-patterns.ts";
8
- export { resolveModelScope } from "./model-resolver-scope.ts";
9
- export type { InitialModelResult, ParsedModelResult, ResolveCliModelResult, ScopedModel, } from "./model-resolver-types.ts";
8
+ export { resolveModelScope, resolveModelScopeWithDiagnostics } from "./model-resolver-scope.ts";
9
+ export type { ModelScopeDiagnostic, ResolveModelScopeResult } from "./model-resolver-scope.ts";
10
+ export type { InitialModelResult, ParsedModelResult, ResolveCliModelResult, ScopedModel } from "./model-resolver-types.ts";
10
11
  //# sourceMappingURL=model-resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../../src/core/model-resolver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACpH,OAAO,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,GACZ,MAAM,2BAA2B,CAAC","sourcesContent":["/**\n * Model resolution, scoping, and initial selection\n */\n\nexport { defaultModelPerProvider } from \"./model-resolver-defaults.ts\";\nexport { resolveCliModel } from \"./model-resolver-cli.ts\";\nexport { findInitialModel, resolveSavedModelReference, restoreModelFromSession } from \"./model-resolver-initial.ts\";\nexport { findExactModelReferenceMatch, parseModelPattern } from \"./model-resolver-patterns.ts\";\nexport { resolveModelScope } from \"./model-resolver-scope.ts\";\nexport type {\n InitialModelResult,\n ParsedModelResult,\n ResolveCliModelResult,\n ScopedModel,\n} from \"./model-resolver-types.ts\";\n"]}
1
+ {"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../../src/core/model-resolver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACvH,OAAO,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC;AAChG,YAAY,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAC/F,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC","sourcesContent":["/**\n * Model resolution, scoping, and initial selection\n */\n\nexport { defaultModelPerProvider } from \"./model-resolver-defaults.ts\";\nexport { resolveCliModel } from \"./model-resolver-cli.ts\";\nexport { findInitialModel, resolveRestoredModelReference, restoreModelFromSession } from \"./model-resolver-initial.ts\";\nexport { findExactModelReferenceMatch, parseModelPattern } from \"./model-resolver-patterns.ts\";\nexport { resolveModelScope, resolveModelScopeWithDiagnostics } from \"./model-resolver-scope.ts\";\nexport type { ModelScopeDiagnostic, ResolveModelScopeResult } from \"./model-resolver-scope.ts\";\nexport type { InitialModelResult, ParsedModelResult, ResolveCliModelResult, ScopedModel } from \"./model-resolver-types.ts\";\n"]}
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export { defaultModelPerProvider } from "./model-resolver-defaults.js";
5
5
  export { resolveCliModel } from "./model-resolver-cli.js";
6
- export { findInitialModel, resolveSavedModelReference, restoreModelFromSession } from "./model-resolver-initial.js";
6
+ export { findInitialModel, resolveRestoredModelReference, restoreModelFromSession } from "./model-resolver-initial.js";
7
7
  export { findExactModelReferenceMatch, parseModelPattern } from "./model-resolver-patterns.js";
8
- export { resolveModelScope } from "./model-resolver-scope.js";
8
+ export { resolveModelScope, resolveModelScopeWithDiagnostics } from "./model-resolver-scope.js";
9
9
  //# sourceMappingURL=model-resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../src/core/model-resolver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACpH,OAAO,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC","sourcesContent":["/**\n * Model resolution, scoping, and initial selection\n */\n\nexport { defaultModelPerProvider } from \"./model-resolver-defaults.ts\";\nexport { resolveCliModel } from \"./model-resolver-cli.ts\";\nexport { findInitialModel, resolveSavedModelReference, restoreModelFromSession } from \"./model-resolver-initial.ts\";\nexport { findExactModelReferenceMatch, parseModelPattern } from \"./model-resolver-patterns.ts\";\nexport { resolveModelScope } from \"./model-resolver-scope.ts\";\nexport type {\n InitialModelResult,\n ParsedModelResult,\n ResolveCliModelResult,\n ScopedModel,\n} from \"./model-resolver-types.ts\";\n"]}
1
+ {"version":3,"file":"model-resolver.js","sourceRoot":"","sources":["../../src/core/model-resolver.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACvH,OAAO,EAAE,4BAA4B,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAC/F,OAAO,EAAE,iBAAiB,EAAE,gCAAgC,EAAE,MAAM,2BAA2B,CAAC","sourcesContent":["/**\n * Model resolution, scoping, and initial selection\n */\n\nexport { defaultModelPerProvider } from \"./model-resolver-defaults.ts\";\nexport { resolveCliModel } from \"./model-resolver-cli.ts\";\nexport { findInitialModel, resolveRestoredModelReference, restoreModelFromSession } from \"./model-resolver-initial.ts\";\nexport { findExactModelReferenceMatch, parseModelPattern } from \"./model-resolver-patterns.ts\";\nexport { resolveModelScope, resolveModelScopeWithDiagnostics } from \"./model-resolver-scope.ts\";\nexport type { ModelScopeDiagnostic, ResolveModelScopeResult } from \"./model-resolver-scope.ts\";\nexport type { InitialModelResult, ParsedModelResult, ResolveCliModelResult, ScopedModel } from \"./model-resolver-types.ts\";\n"]}
@@ -0,0 +1,7 @@
1
+ import type { Api, Model } from "@earendil-works/pi-ai/compat";
2
+ export declare const MIN_RESPONSES_MAX_OUTPUT_TOKENS = 16;
3
+ export declare function isOpenAIResponsesModel(model: Pick<Model<Api>, "api">): boolean;
4
+ export declare function isValidResponsesFunctionCallId(id: unknown): id is string;
5
+ export declare function responsesFunctionCallIdForCallId(callId: unknown): string | undefined;
6
+ export declare function sanitizeOpenAIResponsesPayload(payload: unknown, model: Pick<Model<Api>, "api">): unknown;
7
+ //# sourceMappingURL=openai-responses-payload-sanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-responses-payload-sanitizer.d.ts","sourceRoot":"","sources":["../../src/core/openai-responses-payload-sanitizer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAQ/D,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAMlD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CAE9E;AAED,wBAAgB,8BAA8B,CAAC,EAAE,EAAE,OAAO,GAAG,EAAE,IAAI,MAAM,CAExE;AAUD,wBAAgB,gCAAgC,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAUpF;AAeD,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,OAAO,CA+BxG","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\n\ntype JsonObject = { [key: string]: JsonValue };\ntype JsonValue = string | number | boolean | null | JsonValue[] | JsonObject;\n\nconst RESPONSES_FUNCTION_CALL_ID = /^fc_[A-Za-z0-9_-]{1,61}$/;\nconst RESPONSES_FUNCTION_CALL_ID_PREFIX = \"fc_\";\nconst MAX_RESPONSES_FUNCTION_CALL_ID_LENGTH = 64;\nexport const MIN_RESPONSES_MAX_OUTPUT_TOKENS = 16;\n\nfunction isPlainObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isOpenAIResponsesModel(model: Pick<Model<Api>, \"api\">): boolean {\n return model.api === \"openai-responses\";\n}\n\nexport function isValidResponsesFunctionCallId(id: unknown): id is string {\n return typeof id === \"string\" && RESPONSES_FUNCTION_CALL_ID.test(id);\n}\n\nfunction sha256Base64Url(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"base64url\");\n}\n\nfunction sanitizedCallIdFragment(callId: string): string {\n return callId.replace(/[^A-Za-z0-9_-]/g, \"_\").replace(/^_+|_+$/g, \"\");\n}\n\nexport function responsesFunctionCallIdForCallId(callId: unknown): string | undefined {\n if (typeof callId !== \"string\" || callId.length === 0) return undefined;\n const direct = `${RESPONSES_FUNCTION_CALL_ID_PREFIX}${callId}`;\n if (isValidResponsesFunctionCallId(direct)) return direct;\n\n const sanitized = sanitizedCallIdFragment(callId);\n const hash = sha256Base64Url(callId).slice(0, 16);\n const suffixBudget = MAX_RESPONSES_FUNCTION_CALL_ID_LENGTH - RESPONSES_FUNCTION_CALL_ID_PREFIX.length;\n const suffix = sanitized.length > 0 ? `${sanitized.slice(0, suffixBudget - hash.length - 1)}_${hash}` : hash;\n return `${RESPONSES_FUNCTION_CALL_ID_PREFIX}${suffix}`;\n}\n\nfunction sanitizeResponsesFunctionCall(item: JsonObject): boolean {\n if (item.type !== \"function_call\") return false;\n if (isValidResponsesFunctionCallId(item.id)) return false;\n\n const synthesized = responsesFunctionCallIdForCallId(item.call_id);\n if (synthesized) {\n item.id = synthesized;\n } else {\n delete item.id;\n }\n return true;\n}\n\nexport function sanitizeOpenAIResponsesPayload(payload: unknown, model: Pick<Model<Api>, \"api\">): unknown {\n if (!isOpenAIResponsesModel(model) || !isPlainObject(payload)) return payload;\n\n let changed = false;\n let sanitizedPayload: JsonObject = payload;\n\n if (\n typeof payload.max_output_tokens === \"number\" &&\n Number.isFinite(payload.max_output_tokens) &&\n payload.max_output_tokens < MIN_RESPONSES_MAX_OUTPUT_TOKENS\n ) {\n changed = true;\n sanitizedPayload = { ...sanitizedPayload, max_output_tokens: MIN_RESPONSES_MAX_OUTPUT_TOKENS };\n }\n\n if (Array.isArray(payload.input)) {\n let inputChanged = false;\n const input = payload.input.map((item) => {\n if (!isPlainObject(item)) return item;\n const cloned = { ...item };\n inputChanged = sanitizeResponsesFunctionCall(cloned) || inputChanged;\n return cloned;\n });\n\n if (inputChanged) {\n changed = true;\n sanitizedPayload = { ...sanitizedPayload, input };\n }\n }\n\n return changed ? sanitizedPayload : payload;\n}\n"]}
@@ -0,0 +1,74 @@
1
+ import { createHash } from "node:crypto";
2
+ const RESPONSES_FUNCTION_CALL_ID = /^fc_[A-Za-z0-9_-]{1,61}$/;
3
+ const RESPONSES_FUNCTION_CALL_ID_PREFIX = "fc_";
4
+ const MAX_RESPONSES_FUNCTION_CALL_ID_LENGTH = 64;
5
+ export const MIN_RESPONSES_MAX_OUTPUT_TOKENS = 16;
6
+ function isPlainObject(value) {
7
+ return typeof value === "object" && value !== null && !Array.isArray(value);
8
+ }
9
+ export function isOpenAIResponsesModel(model) {
10
+ return model.api === "openai-responses";
11
+ }
12
+ export function isValidResponsesFunctionCallId(id) {
13
+ return typeof id === "string" && RESPONSES_FUNCTION_CALL_ID.test(id);
14
+ }
15
+ function sha256Base64Url(value) {
16
+ return createHash("sha256").update(value).digest("base64url");
17
+ }
18
+ function sanitizedCallIdFragment(callId) {
19
+ return callId.replace(/[^A-Za-z0-9_-]/g, "_").replace(/^_+|_+$/g, "");
20
+ }
21
+ export function responsesFunctionCallIdForCallId(callId) {
22
+ if (typeof callId !== "string" || callId.length === 0)
23
+ return undefined;
24
+ const direct = `${RESPONSES_FUNCTION_CALL_ID_PREFIX}${callId}`;
25
+ if (isValidResponsesFunctionCallId(direct))
26
+ return direct;
27
+ const sanitized = sanitizedCallIdFragment(callId);
28
+ const hash = sha256Base64Url(callId).slice(0, 16);
29
+ const suffixBudget = MAX_RESPONSES_FUNCTION_CALL_ID_LENGTH - RESPONSES_FUNCTION_CALL_ID_PREFIX.length;
30
+ const suffix = sanitized.length > 0 ? `${sanitized.slice(0, suffixBudget - hash.length - 1)}_${hash}` : hash;
31
+ return `${RESPONSES_FUNCTION_CALL_ID_PREFIX}${suffix}`;
32
+ }
33
+ function sanitizeResponsesFunctionCall(item) {
34
+ if (item.type !== "function_call")
35
+ return false;
36
+ if (isValidResponsesFunctionCallId(item.id))
37
+ return false;
38
+ const synthesized = responsesFunctionCallIdForCallId(item.call_id);
39
+ if (synthesized) {
40
+ item.id = synthesized;
41
+ }
42
+ else {
43
+ delete item.id;
44
+ }
45
+ return true;
46
+ }
47
+ export function sanitizeOpenAIResponsesPayload(payload, model) {
48
+ if (!isOpenAIResponsesModel(model) || !isPlainObject(payload))
49
+ return payload;
50
+ let changed = false;
51
+ let sanitizedPayload = payload;
52
+ if (typeof payload.max_output_tokens === "number" &&
53
+ Number.isFinite(payload.max_output_tokens) &&
54
+ payload.max_output_tokens < MIN_RESPONSES_MAX_OUTPUT_TOKENS) {
55
+ changed = true;
56
+ sanitizedPayload = { ...sanitizedPayload, max_output_tokens: MIN_RESPONSES_MAX_OUTPUT_TOKENS };
57
+ }
58
+ if (Array.isArray(payload.input)) {
59
+ let inputChanged = false;
60
+ const input = payload.input.map((item) => {
61
+ if (!isPlainObject(item))
62
+ return item;
63
+ const cloned = { ...item };
64
+ inputChanged = sanitizeResponsesFunctionCall(cloned) || inputChanged;
65
+ return cloned;
66
+ });
67
+ if (inputChanged) {
68
+ changed = true;
69
+ sanitizedPayload = { ...sanitizedPayload, input };
70
+ }
71
+ }
72
+ return changed ? sanitizedPayload : payload;
73
+ }
74
+ //# sourceMappingURL=openai-responses-payload-sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-responses-payload-sanitizer.js","sourceRoot":"","sources":["../../src/core/openai-responses-payload-sanitizer.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHash } from \"node:crypto\";\nimport type { Api, Model } from \"@earendil-works/pi-ai/compat\";\n\ntype JsonObject = { [key: string]: JsonValue };\ntype JsonValue = string | number | boolean | null | JsonValue[] | JsonObject;\n\nconst RESPONSES_FUNCTION_CALL_ID = /^fc_[A-Za-z0-9_-]{1,61}$/;\nconst RESPONSES_FUNCTION_CALL_ID_PREFIX = \"fc_\";\nconst MAX_RESPONSES_FUNCTION_CALL_ID_LENGTH = 64;\nexport const MIN_RESPONSES_MAX_OUTPUT_TOKENS = 16;\n\nfunction isPlainObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isOpenAIResponsesModel(model: Pick<Model<Api>, \"api\">): boolean {\n return model.api === \"openai-responses\";\n}\n\nexport function isValidResponsesFunctionCallId(id: unknown): id is string {\n return typeof id === \"string\" && RESPONSES_FUNCTION_CALL_ID.test(id);\n}\n\nfunction sha256Base64Url(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"base64url\");\n}\n\nfunction sanitizedCallIdFragment(callId: string): string {\n return callId.replace(/[^A-Za-z0-9_-]/g, \"_\").replace(/^_+|_+$/g, \"\");\n}\n\nexport function responsesFunctionCallIdForCallId(callId: unknown): string | undefined {\n if (typeof callId !== \"string\" || callId.length === 0) return undefined;\n const direct = `${RESPONSES_FUNCTION_CALL_ID_PREFIX}${callId}`;\n if (isValidResponsesFunctionCallId(direct)) return direct;\n\n const sanitized = sanitizedCallIdFragment(callId);\n const hash = sha256Base64Url(callId).slice(0, 16);\n const suffixBudget = MAX_RESPONSES_FUNCTION_CALL_ID_LENGTH - RESPONSES_FUNCTION_CALL_ID_PREFIX.length;\n const suffix = sanitized.length > 0 ? `${sanitized.slice(0, suffixBudget - hash.length - 1)}_${hash}` : hash;\n return `${RESPONSES_FUNCTION_CALL_ID_PREFIX}${suffix}`;\n}\n\nfunction sanitizeResponsesFunctionCall(item: JsonObject): boolean {\n if (item.type !== \"function_call\") return false;\n if (isValidResponsesFunctionCallId(item.id)) return false;\n\n const synthesized = responsesFunctionCallIdForCallId(item.call_id);\n if (synthesized) {\n item.id = synthesized;\n } else {\n delete item.id;\n }\n return true;\n}\n\nexport function sanitizeOpenAIResponsesPayload(payload: unknown, model: Pick<Model<Api>, \"api\">): unknown {\n if (!isOpenAIResponsesModel(model) || !isPlainObject(payload)) return payload;\n\n let changed = false;\n let sanitizedPayload: JsonObject = payload;\n\n if (\n typeof payload.max_output_tokens === \"number\" &&\n Number.isFinite(payload.max_output_tokens) &&\n payload.max_output_tokens < MIN_RESPONSES_MAX_OUTPUT_TOKENS\n ) {\n changed = true;\n sanitizedPayload = { ...sanitizedPayload, max_output_tokens: MIN_RESPONSES_MAX_OUTPUT_TOKENS };\n }\n\n if (Array.isArray(payload.input)) {\n let inputChanged = false;\n const input = payload.input.map((item) => {\n if (!isPlainObject(item)) return item;\n const cloned = { ...item };\n inputChanged = sanitizeResponsesFunctionCall(cloned) || inputChanged;\n return cloned;\n });\n\n if (inputChanged) {\n changed = true;\n sanitizedPayload = { ...sanitizedPayload, input };\n }\n }\n\n return changed ? sanitizedPayload : payload;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import type { PackageFilter, PackageManagerContext, PathMetadata, ResourceAccumulator } from "./package-manager-types.ts";
2
2
  import type { SettingsManager } from "./settings-manager.ts";
3
- export declare function collectProjectLocalResources(sourceRoot: string, accumulator: ResourceAccumulator, filter: PackageFilter | undefined, metadata: PathMetadata): boolean;
4
- export declare function addAutoDiscoveredResources(context: PackageManagerContext, accumulator: ResourceAccumulator, globalSettings: ReturnType<SettingsManager["getGlobalSettings"]>, projectSettings: ReturnType<SettingsManager["getProjectSettings"]>, globalBaseDir: string, projectBaseDir: string): void;
3
+ export declare function collectProjectLocalResources(sourceRoot: string, accumulator: ResourceAccumulator, filter: PackageFilter | undefined, metadata: PathMetadata): Promise<boolean>;
4
+ export declare function addAutoDiscoveredResources(context: PackageManagerContext, accumulator: ResourceAccumulator, globalSettings: ReturnType<SettingsManager["getGlobalSettings"]>, projectSettings: ReturnType<SettingsManager["getProjectSettings"]>, globalBaseDir: string, projectBaseDir: string): Promise<void>;
5
5
  //# sourceMappingURL=package-manager-auto-resources.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager-auto-resources.d.ts","sourceRoot":"","sources":["../../src/core/package-manager-auto-resources.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EACX,aAAa,EACb,qBAAqB,EACrB,YAAY,EACZ,mBAAmB,EAEnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,wBAAgB,4BAA4B,CAC3C,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,mBAAmB,EAChC,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,QAAQ,EAAE,YAAY,GACpB,OAAO,CA4CT;AAED,wBAAgB,0BAA0B,CACzC,OAAO,EAAE,qBAAqB,EAC9B,WAAW,EAAE,mBAAmB,EAChC,cAAc,EAAE,UAAU,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,EAChE,eAAe,EAAE,UAAU,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAClE,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACpB,IAAI,CAsFN","sourcesContent":["import { dirname, join, resolve } from \"node:path\";\nimport { getProjectConfigDirs } from \"../config.ts\";\nimport { getHomeDir, getBaseDirsForScope } from \"./package-manager-paths.ts\";\nimport { addResource, getTargetMap } from \"./package-manager-resource-accumulator.ts\";\nimport {\n\tcollectAncestorAgentsSkillDirs,\n\tcollectAutoExtensionEntries,\n\tcollectAutoPromptEntries,\n\tcollectAutoSkillEntries,\n\tcollectAutoThemeEntries,\n\tcollectResourceFiles,\n} from \"./package-manager-resource-files.ts\";\nimport { applyPatterns, isEnabledByOverrides } from \"./package-manager-resource-patterns.ts\";\nimport type {\n\tPackageFilter,\n\tPackageManagerContext,\n\tPathMetadata,\n\tResourceAccumulator,\n\tResourceType,\n} from \"./package-manager-types.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\n\nexport function collectProjectLocalResources(\n\tsourceRoot: string,\n\taccumulator: ResourceAccumulator,\n\tfilter: PackageFilter | undefined,\n\tmetadata: PathMetadata,\n): boolean {\n\tlet found = false;\n\tconst projectMetadata: PathMetadata = { ...metadata, origin: \"top-level\", borrowedProjectLocal: true };\n\n\tconst addResources = (\n\t\tresourceType: ResourceType,\n\t\tpaths: string[],\n\t\tresourceMetadata: PathMetadata,\n\t\tpatterns: string[] | undefined,\n\t): void => {\n\t\tif (paths.length === 0) return;\n\t\tfound = true;\n\t\tconst target = getTargetMap(accumulator, resourceType);\n\t\tlet enabledPaths: Set<string>;\n\t\tif (patterns === undefined) {\n\t\t\tenabledPaths = new Set(paths);\n\t\t} else if (patterns.length === 0) {\n\t\t\tenabledPaths = new Set();\n\t\t} else {\n\t\t\tenabledPaths = applyPatterns(paths, patterns, sourceRoot);\n\t\t}\n\t\tfor (const path of paths) {\n\t\t\taddResource(target, path, resourceMetadata, enabledPaths.has(path));\n\t\t}\n\t};\n\n\tfor (const configDir of getProjectConfigDirs(sourceRoot)) {\n\t\tconst configMetadata: PathMetadata = { ...projectMetadata, baseDir: configDir };\n\t\taddResources(\"extensions\", collectAutoExtensionEntries(join(configDir, \"extensions\")), configMetadata, filter?.extensions);\n\t\taddResources(\"skills\", collectAutoSkillEntries(join(configDir, \"skills\"), \"pi\"), configMetadata, filter?.skills);\n\t\taddResources(\"prompts\", collectAutoPromptEntries(join(configDir, \"prompts\")), configMetadata, filter?.prompts);\n\t\taddResources(\"themes\", collectAutoThemeEntries(join(configDir, \"themes\")), configMetadata, filter?.themes);\n\t\taddResources(\"workflows\", collectResourceFiles(join(configDir, \"workflows\"), \"workflows\"), configMetadata, filter?.workflows);\n\t}\n\n\tconst agentsSkillsDir = join(sourceRoot, \".agents\", \"skills\");\n\taddResources(\n\t\t\"skills\",\n\t\tcollectAutoSkillEntries(agentsSkillsDir, \"agents\"),\n\t\t{ ...projectMetadata, baseDir: dirname(agentsSkillsDir) },\n\t\tfilter?.skills,\n\t);\n\n\treturn found;\n}\n\nexport function addAutoDiscoveredResources(\n\tcontext: PackageManagerContext,\n\taccumulator: ResourceAccumulator,\n\tglobalSettings: ReturnType<SettingsManager[\"getGlobalSettings\"]>,\n\tprojectSettings: ReturnType<SettingsManager[\"getProjectSettings\"]>,\n\tglobalBaseDir: string,\n\tprojectBaseDir: string,\n): void {\n\tconst userMetadata: PathMetadata = {\n\t\tsource: \"auto\",\n\t\tscope: \"user\",\n\t\torigin: \"top-level\",\n\t\tbaseDir: globalBaseDir,\n\t};\n\tconst projectMetadata: PathMetadata = {\n\t\tsource: \"auto\",\n\t\tscope: \"project\",\n\t\torigin: \"top-level\",\n\t\tbaseDir: projectBaseDir,\n\t};\n\n\tconst userOverrides = {\n\t\textensions: (globalSettings.extensions ?? []) as string[],\n\t\tskills: (globalSettings.skills ?? []) as string[],\n\t\tprompts: (globalSettings.prompts ?? []) as string[],\n\t\tthemes: (globalSettings.themes ?? []) as string[],\n\t\tworkflows: (globalSettings.workflows ?? []) as string[],\n\t};\n\tconst projectOverrides = {\n\t\textensions: (projectSettings.extensions ?? []) as string[],\n\t\tskills: (projectSettings.skills ?? []) as string[],\n\t\tprompts: (projectSettings.prompts ?? []) as string[],\n\t\tthemes: (projectSettings.themes ?? []) as string[],\n\t\tworkflows: (projectSettings.workflows ?? []) as string[],\n\t};\n\n\tconst userConfigDirs = getBaseDirsForScope(context, \"user\");\n\tconst projectConfigDirs = getBaseDirsForScope(context, \"project\");\n\tconst userAgentsSkillsDir = join(getHomeDir(), \".agents\", \"skills\");\n\tconst projectTrusted = context.settingsManager.isProjectTrusted();\n\tconst projectAgentsSkillDirs = projectTrusted\n\t\t? collectAncestorAgentsSkillDirs(context.cwd).filter((dir) => resolve(dir) !== resolve(userAgentsSkillsDir))\n\t\t: [];\n\n\tconst addResources = (\n\t\tresourceType: ResourceType,\n\t\tpaths: string[],\n\t\tmetadata: PathMetadata,\n\t\toverrides: string[],\n\t\tbaseDir: string,\n\t) => {\n\t\tconst target = getTargetMap(accumulator, resourceType);\n\t\tfor (const path of paths) {\n\t\t\tconst enabled = isEnabledByOverrides(path, overrides, baseDir);\n\t\t\taddResource(target, path, metadata, enabled);\n\t\t}\n\t};\n\n\tif (projectTrusted) {\n\t\tfor (const configDir of projectConfigDirs) {\n\t\t\tconst metadata: PathMetadata = { ...projectMetadata, baseDir: configDir };\n\t\t\taddResources(\"extensions\", collectAutoExtensionEntries(join(configDir, \"extensions\")), metadata, projectOverrides.extensions, configDir);\n\t\t\taddResources(\"skills\", collectAutoSkillEntries(join(configDir, \"skills\"), \"pi\"), metadata, projectOverrides.skills, configDir);\n\t\t\taddResources(\"prompts\", collectAutoPromptEntries(join(configDir, \"prompts\")), metadata, projectOverrides.prompts, configDir);\n\t\t\taddResources(\"themes\", collectAutoThemeEntries(join(configDir, \"themes\")), metadata, projectOverrides.themes, configDir);\n\t\t\taddResources(\"workflows\", collectResourceFiles(join(configDir, \"workflows\"), \"workflows\"), metadata, projectOverrides.workflows, configDir);\n\t\t}\n\t}\n\n\tfor (const agentsSkillsDir of projectAgentsSkillDirs) {\n\t\tconst agentsBaseDir = dirname(agentsSkillsDir);\n\t\tconst agentsMetadata: PathMetadata = { ...projectMetadata, baseDir: agentsBaseDir };\n\t\taddResources(\"skills\", collectAutoSkillEntries(agentsSkillsDir, \"agents\"), agentsMetadata, projectOverrides.skills, agentsBaseDir);\n\t}\n\n\tfor (const configDir of userConfigDirs) {\n\t\tconst metadata: PathMetadata = { ...userMetadata, baseDir: configDir };\n\t\taddResources(\"extensions\", collectAutoExtensionEntries(join(configDir, \"extensions\")), metadata, userOverrides.extensions, configDir);\n\t\taddResources(\"skills\", collectAutoSkillEntries(join(configDir, \"skills\"), \"pi\"), metadata, userOverrides.skills, configDir);\n\t\taddResources(\"prompts\", collectAutoPromptEntries(join(configDir, \"prompts\")), metadata, userOverrides.prompts, configDir);\n\t\taddResources(\"themes\", collectAutoThemeEntries(join(configDir, \"themes\")), metadata, userOverrides.themes, configDir);\n\t\taddResources(\"workflows\", collectResourceFiles(join(configDir, \"workflows\"), \"workflows\"), metadata, userOverrides.workflows, configDir);\n\t}\n\n\tconst userAgentsBaseDir = dirname(userAgentsSkillsDir);\n\tconst userAgentsMetadata: PathMetadata = { ...userMetadata, baseDir: userAgentsBaseDir };\n\taddResources(\n\t\t\"skills\",\n\t\tcollectAutoSkillEntries(userAgentsSkillsDir, \"agents\"),\n\t\tuserAgentsMetadata,\n\t\tuserOverrides.skills,\n\t\tuserAgentsBaseDir,\n\t);\n}\n"]}
1
+ {"version":3,"file":"package-manager-auto-resources.d.ts","sourceRoot":"","sources":["../../src/core/package-manager-auto-resources.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,YAAY,EAAE,mBAAmB,EAAgB,MAAM,4BAA4B,CAAC;AACxI,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,wBAAsB,4BAA4B,CACjD,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,mBAAmB,EAChC,MAAM,EAAE,aAAa,GAAG,SAAS,EACjC,QAAQ,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CAyBlB;AAED,wBAAsB,0BAA0B,CAC/C,OAAO,EAAE,qBAAqB,EAC9B,WAAW,EAAE,mBAAmB,EAChC,cAAc,EAAE,UAAU,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,EAChE,eAAe,EAAE,UAAU,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC,EAClE,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,MAAM,GACpB,OAAO,CAAC,IAAI,CAAC,CAoDf","sourcesContent":["import { dirname, join, resolve } from \"node:path\";\nimport { getProjectConfigDirs } from \"../config.ts\";\nimport { getBaseDirsForScope, getHomeDir } from \"./package-manager-paths.ts\";\nimport { addResource, getTargetMap } from \"./package-manager-resource-accumulator.ts\";\nimport {\n\tcollectAncestorAgentsSkillDirs,\n\tcollectAutoExtensionEntries,\n\tcollectAutoPromptEntries,\n\tcollectAutoSkillEntries,\n\tcollectAutoThemeEntries,\n\tcollectResourceFiles,\n} from \"./package-manager-resource-files.ts\";\nimport { applyPatterns, isEnabledByOverrides } from \"./package-manager-resource-patterns.ts\";\nimport type { PackageFilter, PackageManagerContext, PathMetadata, ResourceAccumulator, ResourceType } from \"./package-manager-types.ts\";\nimport type { SettingsManager } from \"./settings-manager.ts\";\n\nexport async function collectProjectLocalResources(\n\tsourceRoot: string,\n\taccumulator: ResourceAccumulator,\n\tfilter: PackageFilter | undefined,\n\tmetadata: PathMetadata,\n): Promise<boolean> {\n\tlet found = false;\n\tconst projectMetadata: PathMetadata = { ...metadata, origin: \"top-level\", borrowedProjectLocal: true };\n\tconst addResources = (resourceType: ResourceType, paths: string[], resourceMetadata: PathMetadata, patterns: string[] | undefined): void => {\n\t\tif (paths.length === 0) return;\n\t\tfound = true;\n\t\tconst target = getTargetMap(accumulator, resourceType);\n\t\tconst enabledPaths = patterns === undefined\n\t\t\t? new Set(paths)\n\t\t\t: patterns.length === 0\n\t\t\t\t? new Set<string>()\n\t\t\t\t: applyPatterns(paths, patterns, sourceRoot);\n\t\tfor (const path of paths) addResource(target, path, resourceMetadata, enabledPaths.has(path));\n\t};\n\tfor (const configDir of getProjectConfigDirs(sourceRoot)) {\n\t\tconst configMetadata: PathMetadata = { ...projectMetadata, baseDir: configDir };\n\t\taddResources(\"extensions\", await collectAutoExtensionEntries(join(configDir, \"extensions\")), configMetadata, filter?.extensions);\n\t\taddResources(\"skills\", await collectAutoSkillEntries(join(configDir, \"skills\"), \"pi\"), configMetadata, filter?.skills);\n\t\taddResources(\"prompts\", await collectAutoPromptEntries(join(configDir, \"prompts\")), configMetadata, filter?.prompts);\n\t\taddResources(\"themes\", await collectAutoThemeEntries(join(configDir, \"themes\")), configMetadata, filter?.themes);\n\t\taddResources(\"workflows\", await collectResourceFiles(join(configDir, \"workflows\"), \"workflows\"), configMetadata, filter?.workflows);\n\t}\n\tconst agentsSkillsDir = join(sourceRoot, \".agents\", \"skills\");\n\taddResources(\"skills\", await collectAutoSkillEntries(agentsSkillsDir, \"agents\"), { ...projectMetadata, baseDir: dirname(agentsSkillsDir) }, filter?.skills);\n\treturn found;\n}\n\nexport async function addAutoDiscoveredResources(\n\tcontext: PackageManagerContext,\n\taccumulator: ResourceAccumulator,\n\tglobalSettings: ReturnType<SettingsManager[\"getGlobalSettings\"]>,\n\tprojectSettings: ReturnType<SettingsManager[\"getProjectSettings\"]>,\n\tglobalBaseDir: string,\n\tprojectBaseDir: string,\n): Promise<void> {\n\tconst userMetadata: PathMetadata = { source: \"auto\", scope: \"user\", origin: \"top-level\", baseDir: globalBaseDir };\n\tconst projectMetadata: PathMetadata = { source: \"auto\", scope: \"project\", origin: \"top-level\", baseDir: projectBaseDir };\n\tconst userOverrides = {\n\t\textensions: (globalSettings.extensions ?? []) as string[],\n\t\tskills: (globalSettings.skills ?? []) as string[],\n\t\tprompts: (globalSettings.prompts ?? []) as string[],\n\t\tthemes: (globalSettings.themes ?? []) as string[],\n\t\tworkflows: (globalSettings.workflows ?? []) as string[],\n\t};\n\tconst projectOverrides = {\n\t\textensions: (projectSettings.extensions ?? []) as string[],\n\t\tskills: (projectSettings.skills ?? []) as string[],\n\t\tprompts: (projectSettings.prompts ?? []) as string[],\n\t\tthemes: (projectSettings.themes ?? []) as string[],\n\t\tworkflows: (projectSettings.workflows ?? []) as string[],\n\t};\n\tconst userConfigDirs = getBaseDirsForScope(context, \"user\");\n\tconst projectConfigDirs = getBaseDirsForScope(context, \"project\");\n\tconst userAgentsSkillsDir = join(getHomeDir(), \".agents\", \"skills\");\n\tconst projectTrusted = context.settingsManager.isProjectTrusted();\n\tconst projectAgentsSkillDirs = projectTrusted\n\t\t? (await collectAncestorAgentsSkillDirs(context.cwd)).filter((dir) => resolve(dir) !== resolve(userAgentsSkillsDir))\n\t\t: [];\n\tconst addResources = (resourceType: ResourceType, paths: string[], metadata: PathMetadata, overrides: string[], baseDir: string): void => {\n\t\tconst target = getTargetMap(accumulator, resourceType);\n\t\tfor (const path of paths) addResource(target, path, metadata, isEnabledByOverrides(path, overrides, baseDir));\n\t};\n\tif (projectTrusted) {\n\t\tfor (const configDir of projectConfigDirs) {\n\t\t\tconst metadata: PathMetadata = { ...projectMetadata, baseDir: configDir };\n\t\t\taddResources(\"extensions\", await collectAutoExtensionEntries(join(configDir, \"extensions\")), metadata, projectOverrides.extensions, configDir);\n\t\t\taddResources(\"skills\", await collectAutoSkillEntries(join(configDir, \"skills\"), \"pi\"), metadata, projectOverrides.skills, configDir);\n\t\t\taddResources(\"prompts\", await collectAutoPromptEntries(join(configDir, \"prompts\")), metadata, projectOverrides.prompts, configDir);\n\t\t\taddResources(\"themes\", await collectAutoThemeEntries(join(configDir, \"themes\")), metadata, projectOverrides.themes, configDir);\n\t\t\taddResources(\"workflows\", await collectResourceFiles(join(configDir, \"workflows\"), \"workflows\"), metadata, projectOverrides.workflows, configDir);\n\t\t}\n\t}\n\tfor (const agentsSkillsDir of projectAgentsSkillDirs) {\n\t\tconst agentsBaseDir = dirname(agentsSkillsDir);\n\t\taddResources(\"skills\", await collectAutoSkillEntries(agentsSkillsDir, \"agents\"), { ...projectMetadata, baseDir: agentsBaseDir }, projectOverrides.skills, agentsBaseDir);\n\t}\n\tfor (const configDir of userConfigDirs) {\n\t\tconst metadata: PathMetadata = { ...userMetadata, baseDir: configDir };\n\t\taddResources(\"extensions\", await collectAutoExtensionEntries(join(configDir, \"extensions\")), metadata, userOverrides.extensions, configDir);\n\t\taddResources(\"skills\", await collectAutoSkillEntries(join(configDir, \"skills\"), \"pi\"), metadata, userOverrides.skills, configDir);\n\t\taddResources(\"prompts\", await collectAutoPromptEntries(join(configDir, \"prompts\")), metadata, userOverrides.prompts, configDir);\n\t\taddResources(\"themes\", await collectAutoThemeEntries(join(configDir, \"themes\")), metadata, userOverrides.themes, configDir);\n\t\taddResources(\"workflows\", await collectResourceFiles(join(configDir, \"workflows\"), \"workflows\"), metadata, userOverrides.workflows, configDir);\n\t}\n\tconst userAgentsBaseDir = dirname(userAgentsSkillsDir);\n\taddResources(\"skills\", await collectAutoSkillEntries(userAgentsSkillsDir, \"agents\"), { ...userMetadata, baseDir: userAgentsBaseDir }, userOverrides.skills, userAgentsBaseDir);\n}\n"]}