@mono-agent/agent-app 0.20.11 → 0.21.0

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 (369) hide show
  1. package/README.md +260 -98
  2. package/dist/adapter-send-tools.d.ts +3 -2
  3. package/dist/adapter-send-tools.d.ts.map +1 -1
  4. package/dist/adapter-send-tools.js +15 -5
  5. package/dist/adapter-send-tools.js.map +1 -1
  6. package/dist/app-controller-channels.d.ts +6 -0
  7. package/dist/app-controller-channels.d.ts.map +1 -1
  8. package/dist/app-controller-channels.js +29 -2
  9. package/dist/app-controller-channels.js.map +1 -1
  10. package/dist/app-controller-continuation.d.ts.map +1 -1
  11. package/dist/app-controller-continuation.js +2 -3
  12. package/dist/app-controller-continuation.js.map +1 -1
  13. package/dist/app-controller-lifecycle.d.ts +4 -0
  14. package/dist/app-controller-lifecycle.d.ts.map +1 -1
  15. package/dist/app-controller-lifecycle.js +7 -0
  16. package/dist/app-controller-lifecycle.js.map +1 -1
  17. package/dist/app-controller-maintenance.d.ts +3 -1
  18. package/dist/app-controller-maintenance.d.ts.map +1 -1
  19. package/dist/app-controller-maintenance.js +3 -0
  20. package/dist/app-controller-maintenance.js.map +1 -1
  21. package/dist/app-controller-monitors.d.ts +26 -0
  22. package/dist/app-controller-monitors.d.ts.map +1 -0
  23. package/dist/app-controller-monitors.js +127 -0
  24. package/dist/app-controller-monitors.js.map +1 -0
  25. package/dist/app-controller-responder.d.ts +9 -17
  26. package/dist/app-controller-responder.d.ts.map +1 -1
  27. package/dist/app-controller-responder.js +54 -86
  28. package/dist/app-controller-responder.js.map +1 -1
  29. package/dist/app-controller-traceability.d.ts.map +1 -1
  30. package/dist/app-controller-traceability.js +3 -0
  31. package/dist/app-controller-traceability.js.map +1 -1
  32. package/dist/app-controller-types.d.ts +1 -0
  33. package/dist/app-controller-types.d.ts.map +1 -1
  34. package/dist/app-controller-utils.d.ts +1 -5
  35. package/dist/app-controller-utils.d.ts.map +1 -1
  36. package/dist/app-controller-utils.js +4 -21
  37. package/dist/app-controller-utils.js.map +1 -1
  38. package/dist/app-controller.d.ts +26 -10
  39. package/dist/app-controller.d.ts.map +1 -1
  40. package/dist/app-controller.js +39 -1
  41. package/dist/app-controller.js.map +1 -1
  42. package/dist/artifact-retention.js +11 -0
  43. package/dist/artifact-retention.js.map +1 -1
  44. package/dist/background.d.ts +0 -6
  45. package/dist/background.d.ts.map +1 -1
  46. package/dist/background.js +5 -58
  47. package/dist/background.js.map +1 -1
  48. package/dist/channel-drivers/slack.d.ts.map +1 -1
  49. package/dist/channel-drivers/slack.js +18 -0
  50. package/dist/channel-drivers/slack.js.map +1 -1
  51. package/dist/channel-drivers/telegram.d.ts.map +1 -1
  52. package/dist/channel-drivers/telegram.js +26 -0
  53. package/dist/channel-drivers/telegram.js.map +1 -1
  54. package/dist/channel-drivers/tui.d.ts +68 -8
  55. package/dist/channel-drivers/tui.d.ts.map +1 -1
  56. package/dist/channel-drivers/tui.js +407 -89
  57. package/dist/channel-drivers/tui.js.map +1 -1
  58. package/dist/channel-runtime-controls.d.ts +2 -1
  59. package/dist/channel-runtime-controls.d.ts.map +1 -1
  60. package/dist/channel-runtime-controls.js +79 -22
  61. package/dist/channel-runtime-controls.js.map +1 -1
  62. package/dist/cli-args.d.ts +5 -8
  63. package/dist/cli-args.d.ts.map +1 -1
  64. package/dist/cli-args.js +33 -52
  65. package/dist/cli-args.js.map +1 -1
  66. package/dist/cli-background-command.d.ts.map +1 -1
  67. package/dist/cli-background-command.js +4 -0
  68. package/dist/cli-background-command.js.map +1 -1
  69. package/dist/cli-commands.d.ts.map +1 -1
  70. package/dist/cli-commands.js +24 -2
  71. package/dist/cli-commands.js.map +1 -1
  72. package/dist/cli-help.d.ts +26 -0
  73. package/dist/cli-help.d.ts.map +1 -1
  74. package/dist/cli-help.js +58 -53
  75. package/dist/cli-help.js.map +1 -1
  76. package/dist/cli-init-command.d.ts +1 -2
  77. package/dist/cli-init-command.d.ts.map +1 -1
  78. package/dist/cli-init-command.js +31 -71
  79. package/dist/cli-init-command.js.map +1 -1
  80. package/dist/cli-install-skill-command.d.ts.map +1 -1
  81. package/dist/cli-install-skill-command.js +12 -3
  82. package/dist/cli-install-skill-command.js.map +1 -1
  83. package/dist/config-reference.d.ts +1 -0
  84. package/dist/config-reference.d.ts.map +1 -1
  85. package/dist/config-reference.js +217 -60
  86. package/dist/config-reference.js.map +1 -1
  87. package/dist/configured-agent.d.ts +27 -4
  88. package/dist/configured-agent.d.ts.map +1 -1
  89. package/dist/configured-agent.js +159 -112
  90. package/dist/configured-agent.js.map +1 -1
  91. package/dist/conversation-title.d.ts.map +1 -1
  92. package/dist/conversation-title.js +9 -2
  93. package/dist/conversation-title.js.map +1 -1
  94. package/dist/cron-control-store.d.ts.map +1 -1
  95. package/dist/cron-control-store.js +4 -2
  96. package/dist/cron-control-store.js.map +1 -1
  97. package/dist/doctor.d.ts +7 -13
  98. package/dist/doctor.d.ts.map +1 -1
  99. package/dist/doctor.js +406 -770
  100. package/dist/doctor.js.map +1 -1
  101. package/dist/first-run-readiness.d.ts.map +1 -1
  102. package/dist/first-run-readiness.js +0 -6
  103. package/dist/first-run-readiness.js.map +1 -1
  104. package/dist/index.d.ts +2 -0
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +1 -0
  107. package/dist/index.js.map +1 -1
  108. package/dist/interaction-bridge.d.ts +3 -3
  109. package/dist/interaction-bridge.d.ts.map +1 -1
  110. package/dist/interaction-bridge.js +27 -10
  111. package/dist/interaction-bridge.js.map +1 -1
  112. package/dist/launchd.d.ts +2 -0
  113. package/dist/launchd.d.ts.map +1 -1
  114. package/dist/launchd.js +3 -0
  115. package/dist/launchd.js.map +1 -1
  116. package/dist/local-tui-session.d.ts +14 -0
  117. package/dist/local-tui-session.d.ts.map +1 -0
  118. package/dist/local-tui-session.js +100 -0
  119. package/dist/local-tui-session.js.map +1 -0
  120. package/dist/mcp-apps.d.ts.map +1 -1
  121. package/dist/mcp-apps.js +3 -0
  122. package/dist/mcp-apps.js.map +1 -1
  123. package/dist/memory-journal.d.ts +53 -0
  124. package/dist/memory-journal.d.ts.map +1 -0
  125. package/dist/memory-journal.js +586 -0
  126. package/dist/memory-journal.js.map +1 -0
  127. package/dist/memory-recall.d.ts.map +1 -1
  128. package/dist/memory-recall.js +16 -2
  129. package/dist/memory-recall.js.map +1 -1
  130. package/dist/memory-remember.d.ts +49 -0
  131. package/dist/memory-remember.d.ts.map +1 -0
  132. package/dist/memory-remember.js +190 -0
  133. package/dist/memory-remember.js.map +1 -0
  134. package/dist/memory-retrieval.d.ts +33 -0
  135. package/dist/memory-retrieval.d.ts.map +1 -1
  136. package/dist/memory-retrieval.js +43 -0
  137. package/dist/memory-retrieval.js.map +1 -1
  138. package/dist/model-effort-capabilities.d.ts +8 -9
  139. package/dist/model-effort-capabilities.d.ts.map +1 -1
  140. package/dist/model-effort-capabilities.js +17 -35
  141. package/dist/model-effort-capabilities.js.map +1 -1
  142. package/dist/modules/base.d.ts +3 -4
  143. package/dist/modules/base.d.ts.map +1 -1
  144. package/dist/modules/base.js +4 -6
  145. package/dist/modules/base.js.map +1 -1
  146. package/dist/modules/catalog.d.ts.map +1 -1
  147. package/dist/modules/catalog.js +11 -9
  148. package/dist/modules/catalog.js.map +1 -1
  149. package/dist/modules/known-tools.d.ts +2 -2
  150. package/dist/modules/known-tools.d.ts.map +1 -1
  151. package/dist/modules/known-tools.js +7 -0
  152. package/dist/modules/known-tools.js.map +1 -1
  153. package/dist/monitor-channel-routing.d.ts +20 -0
  154. package/dist/monitor-channel-routing.d.ts.map +1 -0
  155. package/dist/monitor-channel-routing.js +73 -0
  156. package/dist/monitor-channel-routing.js.map +1 -0
  157. package/dist/monitors-command.d.ts +23 -0
  158. package/dist/monitors-command.d.ts.map +1 -0
  159. package/dist/monitors-command.js +217 -0
  160. package/dist/monitors-command.js.map +1 -0
  161. package/dist/monitors-config.d.ts +77 -0
  162. package/dist/monitors-config.d.ts.map +1 -0
  163. package/dist/monitors-config.js +150 -0
  164. package/dist/monitors-config.js.map +1 -0
  165. package/dist/monitors-context.d.ts +58 -0
  166. package/dist/monitors-context.d.ts.map +1 -0
  167. package/dist/monitors-context.js +194 -0
  168. package/dist/monitors-context.js.map +1 -0
  169. package/dist/monitors-runtime.d.ts +36 -0
  170. package/dist/monitors-runtime.d.ts.map +1 -0
  171. package/dist/monitors-runtime.js +103 -0
  172. package/dist/monitors-runtime.js.map +1 -0
  173. package/dist/monitors-service.d.ts +71 -0
  174. package/dist/monitors-service.d.ts.map +1 -0
  175. package/dist/monitors-service.js +1796 -0
  176. package/dist/monitors-service.js.map +1 -0
  177. package/dist/monitors-store.d.ts +93 -0
  178. package/dist/monitors-store.d.ts.map +1 -0
  179. package/dist/monitors-store.js +313 -0
  180. package/dist/monitors-store.js.map +1 -0
  181. package/dist/notify-destinations.d.ts +3 -2
  182. package/dist/notify-destinations.d.ts.map +1 -1
  183. package/dist/notify-destinations.js +6 -7
  184. package/dist/notify-destinations.js.map +1 -1
  185. package/dist/posted-reply-history.d.ts.map +1 -1
  186. package/dist/posted-reply-history.js +40 -3
  187. package/dist/posted-reply-history.js.map +1 -1
  188. package/dist/proactive-notify.d.ts +20 -1
  189. package/dist/proactive-notify.d.ts.map +1 -1
  190. package/dist/proactive-notify.js +56 -3
  191. package/dist/proactive-notify.js.map +1 -1
  192. package/dist/process-job-channel-routing.js +2 -1
  193. package/dist/process-job-channel-routing.js.map +1 -1
  194. package/dist/process-job-output-tail.d.ts +53 -0
  195. package/dist/process-job-output-tail.d.ts.map +1 -0
  196. package/dist/process-job-output-tail.js +257 -0
  197. package/dist/process-job-output-tail.js.map +1 -0
  198. package/dist/process-jobs-config.d.ts +1 -1
  199. package/dist/process-jobs-config.js +1 -1
  200. package/dist/process-jobs-config.js.map +1 -1
  201. package/dist/process-jobs-context.d.ts +11 -1
  202. package/dist/process-jobs-context.d.ts.map +1 -1
  203. package/dist/process-jobs-context.js +55 -11
  204. package/dist/process-jobs-context.js.map +1 -1
  205. package/dist/process-jobs-protection.js +1 -1
  206. package/dist/process-jobs-protection.js.map +1 -1
  207. package/dist/process-jobs-runtime.d.ts.map +1 -1
  208. package/dist/process-jobs-runtime.js +15 -12
  209. package/dist/process-jobs-runtime.js.map +1 -1
  210. package/dist/process-jobs-service.d.ts.map +1 -1
  211. package/dist/process-jobs-service.js +118 -172
  212. package/dist/process-jobs-service.js.map +1 -1
  213. package/dist/process-jobs-store.d.ts +3 -1
  214. package/dist/process-jobs-store.d.ts.map +1 -1
  215. package/dist/process-jobs-store.js +4 -1
  216. package/dist/process-jobs-store.js.map +1 -1
  217. package/dist/process-output-redaction.d.ts +58 -0
  218. package/dist/process-output-redaction.d.ts.map +1 -0
  219. package/dist/process-output-redaction.js +311 -0
  220. package/dist/process-output-redaction.js.map +1 -0
  221. package/dist/project-skills.d.ts +11 -5
  222. package/dist/project-skills.d.ts.map +1 -1
  223. package/dist/project-skills.js +88 -39
  224. package/dist/project-skills.js.map +1 -1
  225. package/dist/provider-auth-checks.d.ts +27 -0
  226. package/dist/provider-auth-checks.d.ts.map +1 -0
  227. package/dist/provider-auth-checks.js +349 -0
  228. package/dist/provider-auth-checks.js.map +1 -0
  229. package/dist/provider-auth-observations.d.ts +22 -0
  230. package/dist/provider-auth-observations.d.ts.map +1 -0
  231. package/dist/provider-auth-observations.js +139 -0
  232. package/dist/provider-auth-observations.js.map +1 -0
  233. package/dist/provider-auth-operator.d.ts +19 -0
  234. package/dist/provider-auth-operator.d.ts.map +1 -0
  235. package/dist/provider-auth-operator.js +560 -0
  236. package/dist/provider-auth-operator.js.map +1 -0
  237. package/dist/provider-auth-status.d.ts +20 -0
  238. package/dist/provider-auth-status.d.ts.map +1 -0
  239. package/dist/provider-auth-status.js +235 -0
  240. package/dist/provider-auth-status.js.map +1 -0
  241. package/dist/provider-model-catalog.d.ts +95 -0
  242. package/dist/provider-model-catalog.d.ts.map +1 -0
  243. package/dist/provider-model-catalog.js +550 -0
  244. package/dist/provider-model-catalog.js.map +1 -0
  245. package/dist/provider-setup.d.ts +26 -13
  246. package/dist/provider-setup.d.ts.map +1 -1
  247. package/dist/provider-setup.js +106 -130
  248. package/dist/provider-setup.js.map +1 -1
  249. package/dist/readiness-probe-worker.d.ts +1 -2
  250. package/dist/readiness-probe-worker.d.ts.map +1 -1
  251. package/dist/readiness-probe-worker.js +3 -8
  252. package/dist/readiness-probe-worker.js.map +1 -1
  253. package/dist/readiness-probe.d.ts +1 -1
  254. package/dist/readiness-probe.d.ts.map +1 -1
  255. package/dist/readiness-probe.js +3 -33
  256. package/dist/readiness-probe.js.map +1 -1
  257. package/dist/reply-artifacts.d.ts +3 -1
  258. package/dist/reply-artifacts.d.ts.map +1 -1
  259. package/dist/reply-artifacts.js +45 -10
  260. package/dist/reply-artifacts.js.map +1 -1
  261. package/dist/request-model-override.d.ts +14 -37
  262. package/dist/request-model-override.d.ts.map +1 -1
  263. package/dist/request-model-override.js +105 -143
  264. package/dist/request-model-override.js.map +1 -1
  265. package/dist/request-scoped-mcp.d.ts +3 -0
  266. package/dist/request-scoped-mcp.d.ts.map +1 -1
  267. package/dist/request-scoped-mcp.js +1 -1
  268. package/dist/request-scoped-mcp.js.map +1 -1
  269. package/dist/run-history.d.ts.map +1 -1
  270. package/dist/run-history.js +56 -13
  271. package/dist/run-history.js.map +1 -1
  272. package/dist/runtime-option-extensions.d.ts +2 -4
  273. package/dist/runtime-option-extensions.d.ts.map +1 -1
  274. package/dist/runtime-option-extensions.js +4 -8
  275. package/dist/runtime-option-extensions.js.map +1 -1
  276. package/dist/runtime-routes.d.ts +5 -5
  277. package/dist/runtime-routes.d.ts.map +1 -1
  278. package/dist/runtime-routes.js +29 -18
  279. package/dist/runtime-routes.js.map +1 -1
  280. package/dist/sandbox-settings-cleanup.d.ts +15 -0
  281. package/dist/sandbox-settings-cleanup.d.ts.map +1 -0
  282. package/dist/sandbox-settings-cleanup.js +88 -0
  283. package/dist/sandbox-settings-cleanup.js.map +1 -0
  284. package/dist/seen-conversations.d.ts +4 -3
  285. package/dist/seen-conversations.d.ts.map +1 -1
  286. package/dist/seen-conversations.js +6 -5
  287. package/dist/seen-conversations.js.map +1 -1
  288. package/dist/session-history.d.ts +14 -0
  289. package/dist/session-history.d.ts.map +1 -1
  290. package/dist/session-history.js +120 -5
  291. package/dist/session-history.js.map +1 -1
  292. package/dist/systemd-command.d.ts +8 -0
  293. package/dist/systemd-command.d.ts.map +1 -0
  294. package/dist/systemd-command.js +206 -0
  295. package/dist/systemd-command.js.map +1 -0
  296. package/dist/systemd.d.ts +51 -0
  297. package/dist/systemd.d.ts.map +1 -0
  298. package/dist/systemd.js +299 -0
  299. package/dist/systemd.js.map +1 -0
  300. package/dist/tool-output-artifacts.d.ts +4 -0
  301. package/dist/tool-output-artifacts.d.ts.map +1 -0
  302. package/dist/tool-output-artifacts.js +17 -0
  303. package/dist/tool-output-artifacts.js.map +1 -0
  304. package/dist/trigger-overrides.d.ts +6 -0
  305. package/dist/trigger-overrides.d.ts.map +1 -1
  306. package/dist/trigger-overrides.js +36 -4
  307. package/dist/trigger-overrides.js.map +1 -1
  308. package/dist/tui-command.d.ts +0 -45
  309. package/dist/tui-command.d.ts.map +1 -1
  310. package/dist/tui-command.js +27 -264
  311. package/dist/tui-command.js.map +1 -1
  312. package/dist/untrusted-text.d.ts +36 -0
  313. package/dist/untrusted-text.d.ts.map +1 -0
  314. package/dist/untrusted-text.js +150 -0
  315. package/dist/untrusted-text.js.map +1 -0
  316. package/dist/web-command.d.ts +3 -0
  317. package/dist/web-command.d.ts.map +1 -1
  318. package/dist/web-command.js +112 -7
  319. package/dist/web-command.js.map +1 -1
  320. package/dist/web-request-coordinator.d.ts +19 -0
  321. package/dist/web-request-coordinator.d.ts.map +1 -0
  322. package/dist/web-request-coordinator.js +242 -0
  323. package/dist/web-request-coordinator.js.map +1 -0
  324. package/dist/wizard/answers.d.ts +3 -9
  325. package/dist/wizard/answers.d.ts.map +1 -1
  326. package/dist/wizard/answers.js +11 -36
  327. package/dist/wizard/answers.js.map +1 -1
  328. package/dist/wizard/from-flags.d.ts +1 -2
  329. package/dist/wizard/from-flags.d.ts.map +1 -1
  330. package/dist/wizard/from-flags.js +8 -3
  331. package/dist/wizard/from-flags.js.map +1 -1
  332. package/dist/wizard/model-discovery.d.ts +7 -8
  333. package/dist/wizard/model-discovery.d.ts.map +1 -1
  334. package/dist/wizard/model-discovery.js +58 -431
  335. package/dist/wizard/model-discovery.js.map +1 -1
  336. package/dist/wizard/presets.js +2 -2
  337. package/dist/wizard/presets.js.map +1 -1
  338. package/dist/wizard/prompts.d.ts +13 -12
  339. package/dist/wizard/prompts.d.ts.map +1 -1
  340. package/dist/wizard/prompts.js +25 -45
  341. package/dist/wizard/prompts.js.map +1 -1
  342. package/dist/wizard/run.d.ts.map +1 -1
  343. package/dist/wizard/run.js +30 -153
  344. package/dist/wizard/run.js.map +1 -1
  345. package/package.json +18 -18
  346. package/schema/mono-agent.config.schema.json +301 -53
  347. package/skills/mono-agent-composer/SKILL.md +5 -5
  348. package/skills/mono-agent-composer/references/config-blueprint.md +61 -47
  349. package/skills/mono-agent-composer/references/discovery-questions.md +18 -18
  350. package/skills/mono-agent-composer/references/feature-coverage.md +39 -21
  351. package/skills/mono-agent-composer/references/package-map.md +26 -17
  352. package/skills/mono-agent-composer/references/playbooks.md +39 -28
  353. package/skills/mono-agent-composer/references/validation.md +4 -3
  354. package/dist/codex-model-catalog.d.ts +0 -15
  355. package/dist/codex-model-catalog.d.ts.map +0 -1
  356. package/dist/codex-model-catalog.js +0 -220
  357. package/dist/codex-model-catalog.js.map +0 -1
  358. package/dist/configuration-proposal-main.d.ts +0 -3
  359. package/dist/configuration-proposal-main.d.ts.map +0 -1
  360. package/dist/configuration-proposal-main.js +0 -13
  361. package/dist/configuration-proposal-main.js.map +0 -1
  362. package/dist/configuration-proposal-tool.d.ts +0 -33
  363. package/dist/configuration-proposal-tool.d.ts.map +0 -1
  364. package/dist/configuration-proposal-tool.js +0 -188
  365. package/dist/configuration-proposal-tool.js.map +0 -1
  366. package/dist/local-configuration.d.ts +0 -99
  367. package/dist/local-configuration.d.ts.map +0 -1
  368. package/dist/local-configuration.js +0 -1330
  369. package/dist/local-configuration.js.map +0 -1
@@ -0,0 +1,550 @@
1
+ import { MAX_INFO_PROVIDER_ID_BYTES, MAX_INFO_PROVIDER_LABEL_BYTES, } from "@mono-agent/agent-contracts";
2
+ import { getPiBuiltinModel, listPiBuiltinModels, listPiBuiltinProviders, } from "@mono-agent/agent-runtime";
3
+ import { modelReferenceKey, parseMonoRuntimeModelReference } from "@mono-agent/runtime-adapter";
4
+ import { resolveAdvertisedModelEffort, resolveAdvertisedModelEffortForBuiltin, } from "./model-effort-capabilities.js";
5
+ export const DEFAULT_PAGE_SIZE = 100;
6
+ export const MAX_PAGE_SIZE = 200;
7
+ /**
8
+ * Producer-side length bounds for the CATALOG's own projections
9
+ * (`listProviders`/`listModels`/`searchModels`). Provider ids, model
10
+ * ids and display names are not length-bounded by config validation, and both
11
+ * `/v1/info` and a `/v1/models` page have a body cap to respect: an over-cap
12
+ * `/v1/models` page 500s instead of serving, and an over-cap `/v1/info` body
13
+ * costs the console a whole field at `sendBoundedInfo`'s fence. Oversized
14
+ * entries are skipped rather than truncated, because a truncated id would not
15
+ * resolve anyway.
16
+ *
17
+ * These are display/paging bounds, NOT validity bounds, and that distinction is
18
+ * the whole reason they are safe to keep. The runtime reference parser bounds a
19
+ * reference's CONTENT (no control or formatting code points) and deliberately
20
+ * not its length — what a model may be called is decided by providers, and two
21
+ * attempts at a ceiling each refused a model that really exists. So an id past
22
+ * `MAX_CATALOG_ID_BYTES` is something a local `/v1/models` can genuinely report
23
+ * and this filter genuinely cuts. Cutting it HERE costs a page one row; cutting
24
+ * it at the parser would have cost an operator a route that runs.
25
+ *
26
+ * `/v1/info.models` deliberately does not inherit them (see the `/v1/info`
27
+ * budget note in `channel-drivers/tui.ts`) — reusing them there deleted runnable
28
+ * models from schema-1 clients at a wire schema that cannot be bumped. The TUI
29
+ * has no `/v1/models` call site at all, so a model this filter drops is still
30
+ * selectable in the picker; `tui-channel.test.ts` pins that divergence.
31
+ *
32
+ * PROVIDER ids and labels are bounded by the shared wire contract instead
33
+ * (`MAX_INFO_PROVIDER_ID_BYTES`/`..._LABEL_BYTES` in `@mono-agent/agent-contracts`),
34
+ * because `/v1/info.providers` has a consumer that enforces its own copy of the
35
+ * same numbers. A local bound here and a local bound there is how a 129-byte
36
+ * provider id came to be published by this catalog and discarded by the
37
+ * console. Model ids have no such second enforcer and keep the local bound.
38
+ */
39
+ export const MAX_CATALOG_ID_BYTES = 256;
40
+ export const MAX_CATALOG_LABEL_BYTES = 256;
41
+ /**
42
+ * The catalog must not advertise a model a turn cannot route to. Byte bounds are
43
+ * a paging concern; they say nothing about content, so a local endpoint reporting
44
+ * an id with a control character passed the length filter, reached `/v1/models`,
45
+ * and was admitted by the console — the operator only discovered it at turn time,
46
+ * when the parser refused the reference. `/v1/info` already guards this by
47
+ * parsing each discovered ref; the paged catalog did not.
48
+ */
49
+ const isSelectableReference = (providerId, modelId) => {
50
+ try {
51
+ parseMonoRuntimeModelReference(`${providerId}:${modelId}`);
52
+ return true;
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ };
58
+ const withinBytes = (value, max) => Buffer.byteLength(value, "utf8") <= max;
59
+ export const DEFAULT_MAX_ADVERTISED_PER_PROVIDER = 100;
60
+ export const MAX_SEARCH_RESULTS = 100;
61
+ /**
62
+ * Producer-side bounds on ONE `describe()` entry's effort ladder.
63
+ *
64
+ * The built-in path is already bounded — `resolveAdvertisedModelEffortForBuiltin`
65
+ * runs every level through the `EFFORT_LEVELS` allowlist. The LOCAL path is not:
66
+ * `resolveModelEffortLevels` returns `capabilities.reasoning_levels` verbatim
67
+ * from `providers.local[].models[].capabilities`, which config validates for
68
+ * neither element length nor count. A single authored megabyte-wide level
69
+ * therefore reached `/v1/info` unmeasured and blew the shared 1 MiB body cap,
70
+ * taking the agent offline rather than degrading it.
71
+ *
72
+ * An over-long level is DROPPED rather than truncated: a truncated effort name
73
+ * would not be accepted by the runtime anyway, so publishing it offers a
74
+ * selection whose next turn fails. When nothing survives, `effortLevels` is
75
+ * omitted entirely and the client falls back to the global effort enum — the
76
+ * same degrade path a cloud model with unknown metadata already takes.
77
+ */
78
+ const MAX_ADVERTISED_EFFORT_LEVELS = 32;
79
+ const MAX_ADVERTISED_EFFORT_LEVEL_BYTES = 64;
80
+ function boundedEffortLevels(levels) {
81
+ if (levels === undefined)
82
+ return undefined;
83
+ const bounded = levels
84
+ .filter((level) => withinBytes(level, MAX_ADVERTISED_EFFORT_LEVEL_BYTES))
85
+ .slice(0, MAX_ADVERTISED_EFFORT_LEVELS);
86
+ if (bounded.length === 0)
87
+ return undefined;
88
+ return bounded.length === levels.length ? levels : bounded;
89
+ }
90
+ /**
91
+ * Select one cheapest text-generation model without network discovery. Missing
92
+ * prices are deliberately incomparable unless there is exactly one candidate.
93
+ */
94
+ export function selectProviderAuthCheckModel(providerId, input = {}) {
95
+ const providers = input.providers ?? [];
96
+ const configuredRoutes = input.configuredRoutes ?? [];
97
+ const configured = providers.find((provider) => provider.id === providerId);
98
+ if (configured?.enabled === false) {
99
+ return { kind: "unavailable", code: "provider_unsupported", message: "Provider is disabled." };
100
+ }
101
+ const routeOrder = configuredRoutes
102
+ .filter((ref) => ref.provider === providerId)
103
+ .map((ref) => configured?.models?.find((model) => model.name === ref.model || model.alias === ref.model)?.name ?? ref.model);
104
+ const declaredModels = configured?.models;
105
+ const narrowed = declaredModels !== undefined && declaredModels.length > 0;
106
+ const allowed = declaredModels?.filter((model) => model.enabled !== false
107
+ && !(model.capabilities?.advertised_capabilities?.includes("embedding")
108
+ && !model.capabilities.advertised_capabilities.includes("completion")));
109
+ if (narrowed && allowed?.length === 0) {
110
+ return { kind: "unavailable", code: "no_eligible_model", message: "No eligible text model is configured." };
111
+ }
112
+ const candidates = [];
113
+ const isLocal = configured?.type !== undefined || providerId === "ollama" || providerId === "lmstudio";
114
+ if (isLocal) {
115
+ for (const model of allowed ?? []) {
116
+ const cost = boundedProbeCost(model.pricing?.input_per_million, model.pricing?.output_per_million);
117
+ candidates.push({
118
+ model: { provider: providerId, model: model.name, reference: `${providerId}:${model.name}` },
119
+ ...(cost === undefined ? {} : { cost }),
120
+ });
121
+ }
122
+ }
123
+ else {
124
+ const listBuiltin = input.listBuiltinModels ?? listPiBuiltinModels;
125
+ let snapshots;
126
+ try {
127
+ snapshots = listBuiltin(providerId);
128
+ }
129
+ catch {
130
+ return { kind: "unavailable", code: "provider_unsupported", message: "Provider model catalog is unavailable." };
131
+ }
132
+ const allowedNames = !narrowed
133
+ ? undefined
134
+ : new Set((allowed ?? []).map((model) => model.name));
135
+ for (const snapshot of snapshots) {
136
+ if (allowedNames !== undefined && !allowedNames.has(snapshot.id))
137
+ continue;
138
+ if (!snapshot.input.includes("text"))
139
+ continue;
140
+ const cost = boundedProbeCost(snapshot.cost?.input, snapshot.cost?.output);
141
+ candidates.push({
142
+ model: { provider: providerId, model: snapshot.id, reference: `${providerId}:${snapshot.id}` },
143
+ ...(cost === undefined ? {} : { cost }),
144
+ });
145
+ }
146
+ }
147
+ if (candidates.length === 0) {
148
+ return { kind: "unavailable", code: "no_eligible_model", message: "No eligible text model is configured." };
149
+ }
150
+ if (candidates.length === 1 && candidates[0].cost === undefined) {
151
+ return { kind: "selected", model: candidates[0].model, selectionBasis: "sole_candidate_unknown_price" };
152
+ }
153
+ if (candidates.some((candidate) => candidate.cost === undefined)) {
154
+ return { kind: "unavailable", code: "pricing_unavailable", message: "Model prices are not comparable." };
155
+ }
156
+ candidates.sort((left, right) => {
157
+ const cost = left.cost - right.cost;
158
+ if (cost !== 0)
159
+ return cost;
160
+ const leftRoute = routeOrder.indexOf(left.model.model);
161
+ const rightRoute = routeOrder.indexOf(right.model.model);
162
+ const leftRank = leftRoute === -1 ? Number.MAX_SAFE_INTEGER : leftRoute;
163
+ const rightRank = rightRoute === -1 ? Number.MAX_SAFE_INTEGER : rightRoute;
164
+ return leftRank - rightRank || left.model.model.localeCompare(right.model.model);
165
+ });
166
+ const selected = candidates[0];
167
+ return {
168
+ kind: "selected",
169
+ model: selected.model,
170
+ selectionBasis: selected.cost === 0 ? "subscription_zero_price" : "catalog_pricing",
171
+ };
172
+ }
173
+ function boundedProbeCost(input, output) {
174
+ if (typeof input !== "number" || !Number.isFinite(input) || input < 0
175
+ || typeof output !== "number" || !Number.isFinite(output) || output < 0)
176
+ return undefined;
177
+ return input * 64 / 1_000_000 + output * 4 / 1_000_000;
178
+ }
179
+ function positiveContextWindow(value) {
180
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0
181
+ ? value
182
+ : undefined;
183
+ }
184
+ function clampPageSize(limit) {
185
+ if (limit === undefined)
186
+ return DEFAULT_PAGE_SIZE;
187
+ if (!Number.isSafeInteger(limit) || limit < 1)
188
+ return DEFAULT_PAGE_SIZE;
189
+ return Math.min(limit, MAX_PAGE_SIZE);
190
+ }
191
+ function compareModelId(left, right) {
192
+ return left.localeCompare(right);
193
+ }
194
+ /**
195
+ * Build the provider-widened model catalog once at channel start. The catalog
196
+ * is total by construction: an unknown provider yields an empty page, a
197
+ * built-in listing that throws degrades to zero models, and no code path
198
+ * propagates. Everything is precomputed here so `/v1/info` reads memory only
199
+ * and never awaits network I/O, and the lazy `/v1/models` endpoint only slices
200
+ * already-frozen pages.
201
+ */
202
+ export function buildProviderModelCatalog(input = {}) {
203
+ const listBuiltin = input.listBuiltinModels ?? listPiBuiltinModels;
204
+ const providers = input.providers ?? [];
205
+ const localProviders = input.localProviders;
206
+ const configuredRoutes = input.configuredRoutes ?? [];
207
+ const configuredById = new Map(providers.map((provider) => [provider.id, provider]));
208
+ const embeddingRefs = new Set((input.discoveredModels ?? []).filter((model) => model.embeddingOnly).map((model) => model.ref));
209
+ for (const provider of [...providers, ...(localProviders ?? [])]) {
210
+ const localType = provider.type ?? provider.id;
211
+ if (localType !== "ollama" && localType !== "lmstudio")
212
+ continue;
213
+ for (const model of provider.models ?? []) {
214
+ const capabilities = model.capabilities?.advertised_capabilities;
215
+ if (capabilities?.includes("embedding") && !capabilities.includes("completion")) {
216
+ embeddingRefs.add(`${provider.id}:${model.name}`);
217
+ }
218
+ }
219
+ }
220
+ const isEmbeddingOnly = (ref) => {
221
+ const model = configuredById.get(ref.provider)?.models?.find((entry) => entry.name === ref.model || entry.alias === ref.model);
222
+ return embeddingRefs.has(`${ref.provider}:${model?.name ?? ref.model}`);
223
+ };
224
+ const configuredRouteKeys = new Set(configuredRoutes.map((ref) => modelReferenceKey(ref)));
225
+ // `providers` is the operator's explicit support list, and a route's own
226
+ // provider is supported by construction — you cannot route through a provider
227
+ // you did not mean to use. Either one marks the provider configured, so a
228
+ // provider listed purely to widen selection is still flagged for the UI.
229
+ const supportedProviderIds = new Set([
230
+ ...providers.map((provider) => provider.id),
231
+ ...configuredRoutes.map((ref) => ref.provider),
232
+ ]);
233
+ // The authoritative 39-entry static catalog. The dynamic "radius" gateway is
234
+ // already excluded by the facade.
235
+ let builtinProviders = [];
236
+ try {
237
+ builtinProviders = listPiBuiltinProviders();
238
+ }
239
+ catch {
240
+ builtinProviders = [];
241
+ }
242
+ const builtinIds = new Set(builtinProviders.map((provider) => provider.id));
243
+ const providerLabelById = new Map();
244
+ for (const provider of builtinProviders) {
245
+ providerLabelById.set(provider.id, provider.label);
246
+ }
247
+ for (const provider of providers) {
248
+ if (!providerLabelById.has(provider.id))
249
+ providerLabelById.set(provider.id, provider.id);
250
+ }
251
+ const discoveredByProvider = new Map();
252
+ for (const discovered of input.discoveredModels ?? []) {
253
+ const list = discoveredByProvider.get(discovered.providerId) ?? [];
254
+ list.push(discovered);
255
+ discoveredByProvider.set(discovered.providerId, list);
256
+ }
257
+ for (const id of discoveredByProvider.keys()) {
258
+ if (!providerLabelById.has(id))
259
+ providerLabelById.set(id, id);
260
+ }
261
+ // `providers` is a support gate, not a hint: an agent advertises exactly the
262
+ // providers it declared, the providers its own routes use, and whatever local
263
+ // discovery found. A Pi built-in nobody declared is NOT selectable — offering
264
+ // all 39 would let an operator pick a provider the agent holds no credential
265
+ // for, and the failure would only surface at turn time.
266
+ //
267
+ // Deterministic order: declared providers (config order, id-sorted at load),
268
+ // then route providers not already declared (route order), then discovered
269
+ // local providers (alphabetical).
270
+ const orderedIds = [];
271
+ const seen = new Set();
272
+ // `enabled: false` disables the provider everywhere, not just at its endpoint:
273
+ // advertising a disabled provider's models offers a route config validation
274
+ // now rejects.
275
+ const disabled = new Set(providers.filter((provider) => provider.enabled === false).map((provider) => provider.id));
276
+ for (const provider of providers) {
277
+ if (seen.has(provider.id) || disabled.has(provider.id))
278
+ continue;
279
+ seen.add(provider.id);
280
+ orderedIds.push(provider.id);
281
+ }
282
+ for (const ref of configuredRoutes) {
283
+ if (seen.has(ref.provider) || disabled.has(ref.provider))
284
+ continue;
285
+ seen.add(ref.provider);
286
+ orderedIds.push(ref.provider);
287
+ }
288
+ const remainingDiscovered = [...discoveredByProvider.keys()]
289
+ .filter((id) => !seen.has(id))
290
+ .sort(compareModelId);
291
+ for (const id of remainingDiscovered) {
292
+ seen.add(id);
293
+ orderedIds.push(id);
294
+ }
295
+ // Drop oversized provider ids here rather than mid-loop: `orderedIds` drives
296
+ // the final `listProviders()` projection, so an id skipped later would still
297
+ // be dereferenced there.
298
+ const boundedIds = orderedIds.filter((id) => withinBytes(id, MAX_INFO_PROVIDER_ID_BYTES));
299
+ orderedIds.length = 0;
300
+ orderedIds.push(...boundedIds);
301
+ const byProviderId = new Map();
302
+ const builtinCatalogModel = (snapshot, providerLabel) => {
303
+ const effort = resolveAdvertisedModelEffortForBuiltin(snapshot);
304
+ const contextWindow = positiveContextWindow(snapshot.contextWindow);
305
+ return {
306
+ id: snapshot.id,
307
+ name: snapshot.name,
308
+ provider: snapshot.provider,
309
+ providerLabel,
310
+ ...(contextWindow === undefined ? {} : { contextWindow }),
311
+ reasoning: effort.reasoning,
312
+ ...(effort.reasoningMode === undefined ? {} : { reasoningMode: effort.reasoningMode }),
313
+ ...(effort.effortLevels === undefined ? {} : { effortLevels: effort.effortLevels }),
314
+ };
315
+ };
316
+ for (const id of orderedIds) {
317
+ const rawLabel = providerLabelById.get(id) ?? id;
318
+ const providerLabel = withinBytes(rawLabel, MAX_INFO_PROVIDER_LABEL_BYTES) ? rawLabel : id;
319
+ const configured = configuredById.get(id);
320
+ // A configured provider that declares a local `type` OWNS the id, even when
321
+ // Pi ships a built-in under the same name. `runtimeOptionsForLocalProvider`
322
+ // matches on provider id ALONE, so every selection for this id executes
323
+ // against the local endpoint; advertising Pi's built-in list would offer
324
+ // models that endpoint does not serve — selectable in the picker, dead at
325
+ // turn time. The local definition therefore wins the `source` decision and
326
+ // every model-building branch below.
327
+ const localTyped = configured?.type !== undefined;
328
+ const treatAsBuiltin = builtinIds.has(id) && !localTyped;
329
+ const source = treatAsBuiltin
330
+ ? "builtin"
331
+ : configured !== undefined
332
+ ? "custom"
333
+ : "discovered";
334
+ // `enabled: false` on an allowlist entry withdraws the model, not just its
335
+ // endpoint wiring: doctor reports a route to it as unresolvable, so
336
+ // advertising it offers a selection whose next turn fails. Branch on the
337
+ // DECLARED list, filter for the advertised one — an operator who disabled
338
+ // every entry narrowed the provider to nothing, and must not fall through
339
+ // to the un-narrowed built-in catalog.
340
+ const declaredModels = configured?.models;
341
+ const allowlist = declaredModels?.filter((model) => model.enabled !== false
342
+ && !embeddingRefs.has(`${id}:${model.name}`)) ?? [];
343
+ const maxAdvertised = configured?.maxAdvertisedModels ?? DEFAULT_MAX_ADVERTISED_PER_PROVIDER;
344
+ let models = [];
345
+ let totalModelCount;
346
+ if (declaredModels !== undefined && declaredModels.length > 0) {
347
+ // An explicit `models` allowlist bypasses the cap and preserves its
348
+ // declared order — the operator narrowed the provider on purpose.
349
+ //
350
+ // For a Pi built-in the allowlist NARROWS the real catalog; it does not
351
+ // replace it. Emitting the declared name verbatim advertised a model Pi
352
+ // cannot resolve when the name was wrong (selectable, then `pi model not
353
+ // found` at turn time) and dropped reasoning/effort metadata when it was
354
+ // right. Resolve against the snapshot, keep the operator's ordering and
355
+ // display overrides, and drop names the provider does not have.
356
+ const builtinByName = new Map();
357
+ if (treatAsBuiltin) {
358
+ try {
359
+ for (const snapshot of listBuiltin(id))
360
+ builtinByName.set(snapshot.id, snapshot);
361
+ }
362
+ catch {
363
+ builtinByName.clear();
364
+ }
365
+ }
366
+ models = allowlist.flatMap((model) => {
367
+ const snapshot = builtinByName.get(model.name);
368
+ // Fail closed on the SNAPSHOT, not on its size. Keying the drop off
369
+ // `builtinByName.size > 0` meant a throwing or empty built-in listing
370
+ // advertised every authored name unvalidated — precisely the `pi model
371
+ // not found` outcome this branch exists to prevent. Pi's catalog is a
372
+ // synchronous, version-pinned in-process constant, so "unavailable" is
373
+ // never a transient network blip: an empty listing for a provider Pi
374
+ // claims to own is a real answer, and a throw makes every name
375
+ // unverifiable. The provider still appears with `modelCount: 0` rather
376
+ // than vanishing from the picker.
377
+ if (treatAsBuiltin && snapshot === undefined)
378
+ return [];
379
+ const contextWindow = positiveContextWindow(model.capabilities?.context_window)
380
+ ?? positiveContextWindow(model.capabilities?.num_ctx)
381
+ ?? (snapshot === undefined ? undefined : positiveContextWindow(snapshot.contextWindow));
382
+ const effort = snapshot === undefined
383
+ ? undefined
384
+ : resolveAdvertisedModelEffortForBuiltin(snapshot);
385
+ return [{
386
+ id: model.name,
387
+ name: model.displayName ?? model.alias ?? snapshot?.name ?? model.name,
388
+ provider: id,
389
+ providerLabel,
390
+ ...(contextWindow === undefined ? {} : { contextWindow }),
391
+ ...(effort === undefined ? {} : {
392
+ reasoning: effort.reasoning,
393
+ ...(effort.reasoningMode === undefined ? {} : { reasoningMode: effort.reasoningMode }),
394
+ ...(effort.effortLevels === undefined ? {} : { effortLevels: effort.effortLevels }),
395
+ }),
396
+ }];
397
+ });
398
+ totalModelCount = undefined;
399
+ }
400
+ else if (treatAsBuiltin) {
401
+ let snapshots = [];
402
+ try {
403
+ snapshots = [...listBuiltin(id)];
404
+ }
405
+ catch {
406
+ snapshots = [];
407
+ }
408
+ const full = snapshots.sort((left, right) => compareModelId(left.id, right.id));
409
+ const capped = full.slice(0, maxAdvertised);
410
+ models = capped.map((snapshot) => builtinCatalogModel(snapshot, providerLabel));
411
+ // Report the pre-cap total only when a cap actually shrank the list.
412
+ totalModelCount = full.length > capped.length ? full.length : undefined;
413
+ }
414
+ else if (discoveredByProvider.has(id)) {
415
+ // Dedupe by canonical ref (last wins) before sorting/capping, so a noisy
416
+ // live /v1/models response cannot double-list a model.
417
+ const discovered = [...new Map((discoveredByProvider.get(id) ?? []).filter((model) => !embeddingRefs.has(model.ref))
418
+ .map((model) => [model.ref, model])).values()].sort((left, right) => compareModelId(left.ref, right.ref));
419
+ // The provider's own `maxAdvertisedModels`, not the default: a provider
420
+ // that narrowed its contribution to 10 was still handed 100 live-discovered
421
+ // rows, because only the built-in branch honoured the configured cap.
422
+ const capped = discovered.slice(0, maxAdvertised);
423
+ models = capped.map((discoveredModel) => ({
424
+ id: discoveredModel.ref.slice(discoveredModel.providerId.length + 1),
425
+ name: discoveredModel.label,
426
+ provider: discoveredModel.providerId,
427
+ providerLabel,
428
+ }));
429
+ totalModelCount = discovered.length > capped.length ? discovered.length : undefined;
430
+ }
431
+ // Ids must be unique per provider: the pagination cursor IS the last row's
432
+ // id, and `pageStartIndex` resolves it with `findIndex`. A duplicate id
433
+ // therefore resolves to the FIRST occurrence, the cursor never advances,
434
+ // and the walk serves the same page forever. First declaration wins so an
435
+ // operator's allowlist ordering is preserved.
436
+ const byId = new Map();
437
+ for (const model of models) {
438
+ if (!byId.has(model.id))
439
+ byId.set(model.id, model);
440
+ }
441
+ const frozenModels = Object.freeze([...byId.values()].filter((model) => withinBytes(model.id, MAX_CATALOG_ID_BYTES)
442
+ && withinBytes(model.name, MAX_CATALOG_LABEL_BYTES)
443
+ && isSelectableReference(id, model.id)));
444
+ const info = Object.freeze({
445
+ id,
446
+ label: providerLabel,
447
+ modelCount: frozenModels.length,
448
+ ...(totalModelCount === undefined ? {} : { totalModelCount }),
449
+ source,
450
+ ...(supportedProviderIds.has(id) ? { configured: true } : {}),
451
+ });
452
+ byProviderId.set(id, { info, models: frozenModels });
453
+ }
454
+ const frozenProviders = Object.freeze(orderedIds.map((id) => byProviderId.get(id).info));
455
+ const resolveContextWindow = (ref) => {
456
+ const configuredProvider = localProviders?.find((provider) => provider.id === ref.provider);
457
+ if (configuredProvider !== undefined) {
458
+ const configuredModel = configuredProvider.models?.find((model) => model.name === ref.model || model.alias === ref.model);
459
+ return positiveContextWindow(configuredModel?.capabilities?.context_window)
460
+ ?? positiveContextWindow(configuredModel?.capabilities?.num_ctx);
461
+ }
462
+ return positiveContextWindow(getPiBuiltinModel(ref.provider, ref.model)?.contextWindow);
463
+ };
464
+ const describeOne = (ref) => {
465
+ const effort = resolveAdvertisedModelEffort(ref, {
466
+ ...(localProviders === undefined ? {} : { localProviders }),
467
+ });
468
+ const contextWindow = resolveContextWindow(ref);
469
+ const configuredModel = configuredById.get(ref.provider)?.models?.find((model) => model.name === ref.model || model.alias === ref.model);
470
+ const label = byProviderId.get(ref.provider)?.models.find((model) => model.id === (configuredModel?.name ?? ref.model))?.name;
471
+ // `effortLevels` is the ONLY unbounded field in this projection.
472
+ // `provider` and `providerLabel` need no clamp of their own: the label is
473
+ // either a short Pi built-in label or the provider id verbatim, and the id
474
+ // repeats the provider half of this entry's own key — so a pathological one
475
+ // is charged, not hidden, by the caller's per-entry byte measurement.
476
+ const effortLevels = boundedEffortLevels(effort.effortLevels);
477
+ return {
478
+ ...(label === undefined ? {} : { label }),
479
+ ...(effortLevels === undefined ? {} : { effortLevels }),
480
+ reasoning: effort.reasoning,
481
+ ...(effort.reasoningMode === undefined ? {} : { reasoningMode: effort.reasoningMode }),
482
+ ...(contextWindow === undefined ? {} : { contextWindow }),
483
+ provider: ref.provider,
484
+ providerLabel: providerLabelById.get(ref.provider) ?? ref.provider,
485
+ };
486
+ };
487
+ return {
488
+ isEmbeddingOnly,
489
+ listProviders: () => frozenProviders,
490
+ listModels(providerId, options = {}) {
491
+ const entry = byProviderId.get(providerId);
492
+ const pageSize = clampPageSize(options.limit);
493
+ const models = entry?.models ?? [];
494
+ const start = pageStartIndex(models, options.cursor);
495
+ const page = models.slice(start, start + pageSize);
496
+ const truncated = start + pageSize < models.length;
497
+ const lastModel = page[page.length - 1];
498
+ return {
499
+ models: page,
500
+ ...(truncated && lastModel !== undefined ? { nextCursor: lastModel.id } : {}),
501
+ truncated,
502
+ };
503
+ },
504
+ searchModels(query, limit) {
505
+ const needle = query.trim().toLowerCase();
506
+ if (needle.length === 0)
507
+ return [];
508
+ const cap = Math.min(clampPageSize(limit), MAX_SEARCH_RESULTS);
509
+ const results = [];
510
+ for (const provider of frozenProviders) {
511
+ const entry = byProviderId.get(provider.id);
512
+ if (entry === undefined)
513
+ continue;
514
+ for (const model of entry.models) {
515
+ if (!modelMatches(model, needle))
516
+ continue;
517
+ results.push(model);
518
+ if (results.length >= cap)
519
+ return results;
520
+ }
521
+ }
522
+ return results;
523
+ },
524
+ describe(refs) {
525
+ const result = {};
526
+ for (const ref of refs) {
527
+ const entry = describeOne(ref);
528
+ if (Object.keys(entry).length > 0) {
529
+ result[modelReferenceKey(ref)] = entry;
530
+ }
531
+ }
532
+ return result;
533
+ },
534
+ };
535
+ }
536
+ function pageStartIndex(models, cursor) {
537
+ if (cursor === undefined)
538
+ return 0;
539
+ const index = models.findIndex((model) => model.id === cursor);
540
+ // A stale/unknown cursor terminates the walk (empty page) rather than
541
+ // silently re-serving an earlier slice.
542
+ return index === -1 ? models.length : index + 1;
543
+ }
544
+ function modelMatches(model, needle) {
545
+ return model.id.toLowerCase().includes(needle)
546
+ || model.name.toLowerCase().includes(needle)
547
+ || model.provider.toLowerCase().includes(needle)
548
+ || model.providerLabel.toLowerCase().includes(needle);
549
+ }
550
+ //# sourceMappingURL=provider-model-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-model-catalog.js","sourceRoot":"","sources":["../src/provider-model-catalog.ts"],"names":[],"mappings":"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"}