@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.
- package/README.md +260 -98
- package/dist/adapter-send-tools.d.ts +3 -2
- package/dist/adapter-send-tools.d.ts.map +1 -1
- package/dist/adapter-send-tools.js +15 -5
- package/dist/adapter-send-tools.js.map +1 -1
- package/dist/app-controller-channels.d.ts +6 -0
- package/dist/app-controller-channels.d.ts.map +1 -1
- package/dist/app-controller-channels.js +29 -2
- package/dist/app-controller-channels.js.map +1 -1
- package/dist/app-controller-continuation.d.ts.map +1 -1
- package/dist/app-controller-continuation.js +2 -3
- package/dist/app-controller-continuation.js.map +1 -1
- package/dist/app-controller-lifecycle.d.ts +4 -0
- package/dist/app-controller-lifecycle.d.ts.map +1 -1
- package/dist/app-controller-lifecycle.js +7 -0
- package/dist/app-controller-lifecycle.js.map +1 -1
- package/dist/app-controller-maintenance.d.ts +3 -1
- package/dist/app-controller-maintenance.d.ts.map +1 -1
- package/dist/app-controller-maintenance.js +3 -0
- package/dist/app-controller-maintenance.js.map +1 -1
- package/dist/app-controller-monitors.d.ts +26 -0
- package/dist/app-controller-monitors.d.ts.map +1 -0
- package/dist/app-controller-monitors.js +127 -0
- package/dist/app-controller-monitors.js.map +1 -0
- package/dist/app-controller-responder.d.ts +9 -17
- package/dist/app-controller-responder.d.ts.map +1 -1
- package/dist/app-controller-responder.js +54 -86
- package/dist/app-controller-responder.js.map +1 -1
- package/dist/app-controller-traceability.d.ts.map +1 -1
- package/dist/app-controller-traceability.js +3 -0
- package/dist/app-controller-traceability.js.map +1 -1
- package/dist/app-controller-types.d.ts +1 -0
- package/dist/app-controller-types.d.ts.map +1 -1
- package/dist/app-controller-utils.d.ts +1 -5
- package/dist/app-controller-utils.d.ts.map +1 -1
- package/dist/app-controller-utils.js +4 -21
- package/dist/app-controller-utils.js.map +1 -1
- package/dist/app-controller.d.ts +26 -10
- package/dist/app-controller.d.ts.map +1 -1
- package/dist/app-controller.js +39 -1
- package/dist/app-controller.js.map +1 -1
- package/dist/artifact-retention.js +11 -0
- package/dist/artifact-retention.js.map +1 -1
- package/dist/background.d.ts +0 -6
- package/dist/background.d.ts.map +1 -1
- package/dist/background.js +5 -58
- package/dist/background.js.map +1 -1
- package/dist/channel-drivers/slack.d.ts.map +1 -1
- package/dist/channel-drivers/slack.js +18 -0
- package/dist/channel-drivers/slack.js.map +1 -1
- package/dist/channel-drivers/telegram.d.ts.map +1 -1
- package/dist/channel-drivers/telegram.js +26 -0
- package/dist/channel-drivers/telegram.js.map +1 -1
- package/dist/channel-drivers/tui.d.ts +68 -8
- package/dist/channel-drivers/tui.d.ts.map +1 -1
- package/dist/channel-drivers/tui.js +407 -89
- package/dist/channel-drivers/tui.js.map +1 -1
- package/dist/channel-runtime-controls.d.ts +2 -1
- package/dist/channel-runtime-controls.d.ts.map +1 -1
- package/dist/channel-runtime-controls.js +79 -22
- package/dist/channel-runtime-controls.js.map +1 -1
- package/dist/cli-args.d.ts +5 -8
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +33 -52
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-background-command.d.ts.map +1 -1
- package/dist/cli-background-command.js +4 -0
- package/dist/cli-background-command.js.map +1 -1
- package/dist/cli-commands.d.ts.map +1 -1
- package/dist/cli-commands.js +24 -2
- package/dist/cli-commands.js.map +1 -1
- package/dist/cli-help.d.ts +26 -0
- package/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +58 -53
- package/dist/cli-help.js.map +1 -1
- package/dist/cli-init-command.d.ts +1 -2
- package/dist/cli-init-command.d.ts.map +1 -1
- package/dist/cli-init-command.js +31 -71
- package/dist/cli-init-command.js.map +1 -1
- package/dist/cli-install-skill-command.d.ts.map +1 -1
- package/dist/cli-install-skill-command.js +12 -3
- package/dist/cli-install-skill-command.js.map +1 -1
- package/dist/config-reference.d.ts +1 -0
- package/dist/config-reference.d.ts.map +1 -1
- package/dist/config-reference.js +217 -60
- package/dist/config-reference.js.map +1 -1
- package/dist/configured-agent.d.ts +27 -4
- package/dist/configured-agent.d.ts.map +1 -1
- package/dist/configured-agent.js +159 -112
- package/dist/configured-agent.js.map +1 -1
- package/dist/conversation-title.d.ts.map +1 -1
- package/dist/conversation-title.js +9 -2
- package/dist/conversation-title.js.map +1 -1
- package/dist/cron-control-store.d.ts.map +1 -1
- package/dist/cron-control-store.js +4 -2
- package/dist/cron-control-store.js.map +1 -1
- package/dist/doctor.d.ts +7 -13
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +406 -770
- package/dist/doctor.js.map +1 -1
- package/dist/first-run-readiness.d.ts.map +1 -1
- package/dist/first-run-readiness.js +0 -6
- package/dist/first-run-readiness.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interaction-bridge.d.ts +3 -3
- package/dist/interaction-bridge.d.ts.map +1 -1
- package/dist/interaction-bridge.js +27 -10
- package/dist/interaction-bridge.js.map +1 -1
- package/dist/launchd.d.ts +2 -0
- package/dist/launchd.d.ts.map +1 -1
- package/dist/launchd.js +3 -0
- package/dist/launchd.js.map +1 -1
- package/dist/local-tui-session.d.ts +14 -0
- package/dist/local-tui-session.d.ts.map +1 -0
- package/dist/local-tui-session.js +100 -0
- package/dist/local-tui-session.js.map +1 -0
- package/dist/mcp-apps.d.ts.map +1 -1
- package/dist/mcp-apps.js +3 -0
- package/dist/mcp-apps.js.map +1 -1
- package/dist/memory-journal.d.ts +53 -0
- package/dist/memory-journal.d.ts.map +1 -0
- package/dist/memory-journal.js +586 -0
- package/dist/memory-journal.js.map +1 -0
- package/dist/memory-recall.d.ts.map +1 -1
- package/dist/memory-recall.js +16 -2
- package/dist/memory-recall.js.map +1 -1
- package/dist/memory-remember.d.ts +49 -0
- package/dist/memory-remember.d.ts.map +1 -0
- package/dist/memory-remember.js +190 -0
- package/dist/memory-remember.js.map +1 -0
- package/dist/memory-retrieval.d.ts +33 -0
- package/dist/memory-retrieval.d.ts.map +1 -1
- package/dist/memory-retrieval.js +43 -0
- package/dist/memory-retrieval.js.map +1 -1
- package/dist/model-effort-capabilities.d.ts +8 -9
- package/dist/model-effort-capabilities.d.ts.map +1 -1
- package/dist/model-effort-capabilities.js +17 -35
- package/dist/model-effort-capabilities.js.map +1 -1
- package/dist/modules/base.d.ts +3 -4
- package/dist/modules/base.d.ts.map +1 -1
- package/dist/modules/base.js +4 -6
- package/dist/modules/base.js.map +1 -1
- package/dist/modules/catalog.d.ts.map +1 -1
- package/dist/modules/catalog.js +11 -9
- package/dist/modules/catalog.js.map +1 -1
- package/dist/modules/known-tools.d.ts +2 -2
- package/dist/modules/known-tools.d.ts.map +1 -1
- package/dist/modules/known-tools.js +7 -0
- package/dist/modules/known-tools.js.map +1 -1
- package/dist/monitor-channel-routing.d.ts +20 -0
- package/dist/monitor-channel-routing.d.ts.map +1 -0
- package/dist/monitor-channel-routing.js +73 -0
- package/dist/monitor-channel-routing.js.map +1 -0
- package/dist/monitors-command.d.ts +23 -0
- package/dist/monitors-command.d.ts.map +1 -0
- package/dist/monitors-command.js +217 -0
- package/dist/monitors-command.js.map +1 -0
- package/dist/monitors-config.d.ts +77 -0
- package/dist/monitors-config.d.ts.map +1 -0
- package/dist/monitors-config.js +150 -0
- package/dist/monitors-config.js.map +1 -0
- package/dist/monitors-context.d.ts +58 -0
- package/dist/monitors-context.d.ts.map +1 -0
- package/dist/monitors-context.js +194 -0
- package/dist/monitors-context.js.map +1 -0
- package/dist/monitors-runtime.d.ts +36 -0
- package/dist/monitors-runtime.d.ts.map +1 -0
- package/dist/monitors-runtime.js +103 -0
- package/dist/monitors-runtime.js.map +1 -0
- package/dist/monitors-service.d.ts +71 -0
- package/dist/monitors-service.d.ts.map +1 -0
- package/dist/monitors-service.js +1796 -0
- package/dist/monitors-service.js.map +1 -0
- package/dist/monitors-store.d.ts +93 -0
- package/dist/monitors-store.d.ts.map +1 -0
- package/dist/monitors-store.js +313 -0
- package/dist/monitors-store.js.map +1 -0
- package/dist/notify-destinations.d.ts +3 -2
- package/dist/notify-destinations.d.ts.map +1 -1
- package/dist/notify-destinations.js +6 -7
- package/dist/notify-destinations.js.map +1 -1
- package/dist/posted-reply-history.d.ts.map +1 -1
- package/dist/posted-reply-history.js +40 -3
- package/dist/posted-reply-history.js.map +1 -1
- package/dist/proactive-notify.d.ts +20 -1
- package/dist/proactive-notify.d.ts.map +1 -1
- package/dist/proactive-notify.js +56 -3
- package/dist/proactive-notify.js.map +1 -1
- package/dist/process-job-channel-routing.js +2 -1
- package/dist/process-job-channel-routing.js.map +1 -1
- package/dist/process-job-output-tail.d.ts +53 -0
- package/dist/process-job-output-tail.d.ts.map +1 -0
- package/dist/process-job-output-tail.js +257 -0
- package/dist/process-job-output-tail.js.map +1 -0
- package/dist/process-jobs-config.d.ts +1 -1
- package/dist/process-jobs-config.js +1 -1
- package/dist/process-jobs-config.js.map +1 -1
- package/dist/process-jobs-context.d.ts +11 -1
- package/dist/process-jobs-context.d.ts.map +1 -1
- package/dist/process-jobs-context.js +55 -11
- package/dist/process-jobs-context.js.map +1 -1
- package/dist/process-jobs-protection.js +1 -1
- package/dist/process-jobs-protection.js.map +1 -1
- package/dist/process-jobs-runtime.d.ts.map +1 -1
- package/dist/process-jobs-runtime.js +15 -12
- package/dist/process-jobs-runtime.js.map +1 -1
- package/dist/process-jobs-service.d.ts.map +1 -1
- package/dist/process-jobs-service.js +118 -172
- package/dist/process-jobs-service.js.map +1 -1
- package/dist/process-jobs-store.d.ts +3 -1
- package/dist/process-jobs-store.d.ts.map +1 -1
- package/dist/process-jobs-store.js +4 -1
- package/dist/process-jobs-store.js.map +1 -1
- package/dist/process-output-redaction.d.ts +58 -0
- package/dist/process-output-redaction.d.ts.map +1 -0
- package/dist/process-output-redaction.js +311 -0
- package/dist/process-output-redaction.js.map +1 -0
- package/dist/project-skills.d.ts +11 -5
- package/dist/project-skills.d.ts.map +1 -1
- package/dist/project-skills.js +88 -39
- package/dist/project-skills.js.map +1 -1
- package/dist/provider-auth-checks.d.ts +27 -0
- package/dist/provider-auth-checks.d.ts.map +1 -0
- package/dist/provider-auth-checks.js +349 -0
- package/dist/provider-auth-checks.js.map +1 -0
- package/dist/provider-auth-observations.d.ts +22 -0
- package/dist/provider-auth-observations.d.ts.map +1 -0
- package/dist/provider-auth-observations.js +139 -0
- package/dist/provider-auth-observations.js.map +1 -0
- package/dist/provider-auth-operator.d.ts +19 -0
- package/dist/provider-auth-operator.d.ts.map +1 -0
- package/dist/provider-auth-operator.js +560 -0
- package/dist/provider-auth-operator.js.map +1 -0
- package/dist/provider-auth-status.d.ts +20 -0
- package/dist/provider-auth-status.d.ts.map +1 -0
- package/dist/provider-auth-status.js +235 -0
- package/dist/provider-auth-status.js.map +1 -0
- package/dist/provider-model-catalog.d.ts +95 -0
- package/dist/provider-model-catalog.d.ts.map +1 -0
- package/dist/provider-model-catalog.js +550 -0
- package/dist/provider-model-catalog.js.map +1 -0
- package/dist/provider-setup.d.ts +26 -13
- package/dist/provider-setup.d.ts.map +1 -1
- package/dist/provider-setup.js +106 -130
- package/dist/provider-setup.js.map +1 -1
- package/dist/readiness-probe-worker.d.ts +1 -2
- package/dist/readiness-probe-worker.d.ts.map +1 -1
- package/dist/readiness-probe-worker.js +3 -8
- package/dist/readiness-probe-worker.js.map +1 -1
- package/dist/readiness-probe.d.ts +1 -1
- package/dist/readiness-probe.d.ts.map +1 -1
- package/dist/readiness-probe.js +3 -33
- package/dist/readiness-probe.js.map +1 -1
- package/dist/reply-artifacts.d.ts +3 -1
- package/dist/reply-artifacts.d.ts.map +1 -1
- package/dist/reply-artifacts.js +45 -10
- package/dist/reply-artifacts.js.map +1 -1
- package/dist/request-model-override.d.ts +14 -37
- package/dist/request-model-override.d.ts.map +1 -1
- package/dist/request-model-override.js +105 -143
- package/dist/request-model-override.js.map +1 -1
- package/dist/request-scoped-mcp.d.ts +3 -0
- package/dist/request-scoped-mcp.d.ts.map +1 -1
- package/dist/request-scoped-mcp.js +1 -1
- package/dist/request-scoped-mcp.js.map +1 -1
- package/dist/run-history.d.ts.map +1 -1
- package/dist/run-history.js +56 -13
- package/dist/run-history.js.map +1 -1
- package/dist/runtime-option-extensions.d.ts +2 -4
- package/dist/runtime-option-extensions.d.ts.map +1 -1
- package/dist/runtime-option-extensions.js +4 -8
- package/dist/runtime-option-extensions.js.map +1 -1
- package/dist/runtime-routes.d.ts +5 -5
- package/dist/runtime-routes.d.ts.map +1 -1
- package/dist/runtime-routes.js +29 -18
- package/dist/runtime-routes.js.map +1 -1
- package/dist/sandbox-settings-cleanup.d.ts +15 -0
- package/dist/sandbox-settings-cleanup.d.ts.map +1 -0
- package/dist/sandbox-settings-cleanup.js +88 -0
- package/dist/sandbox-settings-cleanup.js.map +1 -0
- package/dist/seen-conversations.d.ts +4 -3
- package/dist/seen-conversations.d.ts.map +1 -1
- package/dist/seen-conversations.js +6 -5
- package/dist/seen-conversations.js.map +1 -1
- package/dist/session-history.d.ts +14 -0
- package/dist/session-history.d.ts.map +1 -1
- package/dist/session-history.js +120 -5
- package/dist/session-history.js.map +1 -1
- package/dist/systemd-command.d.ts +8 -0
- package/dist/systemd-command.d.ts.map +1 -0
- package/dist/systemd-command.js +206 -0
- package/dist/systemd-command.js.map +1 -0
- package/dist/systemd.d.ts +51 -0
- package/dist/systemd.d.ts.map +1 -0
- package/dist/systemd.js +299 -0
- package/dist/systemd.js.map +1 -0
- package/dist/tool-output-artifacts.d.ts +4 -0
- package/dist/tool-output-artifacts.d.ts.map +1 -0
- package/dist/tool-output-artifacts.js +17 -0
- package/dist/tool-output-artifacts.js.map +1 -0
- package/dist/trigger-overrides.d.ts +6 -0
- package/dist/trigger-overrides.d.ts.map +1 -1
- package/dist/trigger-overrides.js +36 -4
- package/dist/trigger-overrides.js.map +1 -1
- package/dist/tui-command.d.ts +0 -45
- package/dist/tui-command.d.ts.map +1 -1
- package/dist/tui-command.js +27 -264
- package/dist/tui-command.js.map +1 -1
- package/dist/untrusted-text.d.ts +36 -0
- package/dist/untrusted-text.d.ts.map +1 -0
- package/dist/untrusted-text.js +150 -0
- package/dist/untrusted-text.js.map +1 -0
- package/dist/web-command.d.ts +3 -0
- package/dist/web-command.d.ts.map +1 -1
- package/dist/web-command.js +112 -7
- package/dist/web-command.js.map +1 -1
- package/dist/web-request-coordinator.d.ts +19 -0
- package/dist/web-request-coordinator.d.ts.map +1 -0
- package/dist/web-request-coordinator.js +242 -0
- package/dist/web-request-coordinator.js.map +1 -0
- package/dist/wizard/answers.d.ts +3 -9
- package/dist/wizard/answers.d.ts.map +1 -1
- package/dist/wizard/answers.js +11 -36
- package/dist/wizard/answers.js.map +1 -1
- package/dist/wizard/from-flags.d.ts +1 -2
- package/dist/wizard/from-flags.d.ts.map +1 -1
- package/dist/wizard/from-flags.js +8 -3
- package/dist/wizard/from-flags.js.map +1 -1
- package/dist/wizard/model-discovery.d.ts +7 -8
- package/dist/wizard/model-discovery.d.ts.map +1 -1
- package/dist/wizard/model-discovery.js +58 -431
- package/dist/wizard/model-discovery.js.map +1 -1
- package/dist/wizard/presets.js +2 -2
- package/dist/wizard/presets.js.map +1 -1
- package/dist/wizard/prompts.d.ts +13 -12
- package/dist/wizard/prompts.d.ts.map +1 -1
- package/dist/wizard/prompts.js +25 -45
- package/dist/wizard/prompts.js.map +1 -1
- package/dist/wizard/run.d.ts.map +1 -1
- package/dist/wizard/run.js +30 -153
- package/dist/wizard/run.js.map +1 -1
- package/package.json +18 -18
- package/schema/mono-agent.config.schema.json +301 -53
- package/skills/mono-agent-composer/SKILL.md +5 -5
- package/skills/mono-agent-composer/references/config-blueprint.md +61 -47
- package/skills/mono-agent-composer/references/discovery-questions.md +18 -18
- package/skills/mono-agent-composer/references/feature-coverage.md +39 -21
- package/skills/mono-agent-composer/references/package-map.md +26 -17
- package/skills/mono-agent-composer/references/playbooks.md +39 -28
- package/skills/mono-agent-composer/references/validation.md +4 -3
- package/dist/codex-model-catalog.d.ts +0 -15
- package/dist/codex-model-catalog.d.ts.map +0 -1
- package/dist/codex-model-catalog.js +0 -220
- package/dist/codex-model-catalog.js.map +0 -1
- package/dist/configuration-proposal-main.d.ts +0 -3
- package/dist/configuration-proposal-main.d.ts.map +0 -1
- package/dist/configuration-proposal-main.js +0 -13
- package/dist/configuration-proposal-main.js.map +0 -1
- package/dist/configuration-proposal-tool.d.ts +0 -33
- package/dist/configuration-proposal-tool.d.ts.map +0 -1
- package/dist/configuration-proposal-tool.js +0 -188
- package/dist/configuration-proposal-tool.js.map +0 -1
- package/dist/local-configuration.d.ts +0 -99
- package/dist/local-configuration.d.ts.map +0 -1
- package/dist/local-configuration.js +0 -1330
- 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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"}
|