@pellux/goodvibes-tui 0.18.4
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/.goodvibes/GOODVIBES.md +35 -0
- package/.goodvibes/agents/reviewer.md +89 -0
- package/.goodvibes/skills/add-provider/SKILL.md +199 -0
- package/CHANGELOG.md +1681 -0
- package/README.md +1607 -0
- package/bin/goodvibes +66 -0
- package/docs/README.md +32 -0
- package/docs/foundation-artifacts/README.md +16 -0
- package/docs/foundation-artifacts/knowledge-graphql.graphql +397 -0
- package/docs/foundation-artifacts/knowledge-store.sql +183 -0
- package/docs/foundation-artifacts/operator-contract.json +55157 -0
- package/docs/foundation-artifacts/peer-contract.json +2384 -0
- package/package.json +114 -0
- package/scripts/postinstall.mjs +203 -0
- package/src/acp/connection.ts +447 -0
- package/src/acp/index.ts +7 -0
- package/src/acp/manager.ts +133 -0
- package/src/adapters/bluebubbles/index.ts +127 -0
- package/src/adapters/discord/index.ts +297 -0
- package/src/adapters/github/index.ts +73 -0
- package/src/adapters/google-chat/index.ts +119 -0
- package/src/adapters/imessage/index.ts +92 -0
- package/src/adapters/index.ts +15 -0
- package/src/adapters/matrix/index.ts +116 -0
- package/src/adapters/mattermost/index.ts +151 -0
- package/src/adapters/msteams/index.ts +180 -0
- package/src/adapters/ntfy/index.ts +118 -0
- package/src/adapters/signal/index.ts +92 -0
- package/src/adapters/slack/index.ts +323 -0
- package/src/adapters/telegram/index.ts +160 -0
- package/src/adapters/types.ts +97 -0
- package/src/adapters/webhook/index.ts +178 -0
- package/src/adapters/whatsapp/index.ts +135 -0
- package/src/agents/message-bus-core.ts +312 -0
- package/src/agents/message-bus.ts +2 -0
- package/src/agents/orchestrator-prompts.ts +351 -0
- package/src/agents/orchestrator-runner.ts +668 -0
- package/src/agents/orchestrator.ts +437 -0
- package/src/agents/session.ts +108 -0
- package/src/agents/worktree.ts +153 -0
- package/src/agents/wrfc-config.ts +47 -0
- package/src/agents/wrfc-controller.ts +747 -0
- package/src/agents/wrfc-gate-runtime.ts +75 -0
- package/src/agents/wrfc-reporting.ts +284 -0
- package/src/agents/wrfc-runtime-events.ts +150 -0
- package/src/agents/wrfc-types.ts +67 -0
- package/src/automation/delivery-manager.ts +368 -0
- package/src/automation/index.ts +72 -0
- package/src/automation/manager-runtime-delivery.ts +139 -0
- package/src/automation/manager-runtime-events.ts +131 -0
- package/src/automation/manager-runtime-execution.ts +511 -0
- package/src/automation/manager-runtime-helpers.ts +433 -0
- package/src/automation/manager-runtime-job-mutations.ts +175 -0
- package/src/automation/manager-runtime-reconcile.ts +148 -0
- package/src/automation/manager-runtime-scheduling.ts +189 -0
- package/src/automation/manager-runtime-sync.ts +54 -0
- package/src/automation/manager-runtime.ts +721 -0
- package/src/automation/manager.ts +10 -0
- package/src/automation/service.ts +242 -0
- package/src/channels/builtin/account-actions.ts +490 -0
- package/src/channels/builtin/accounts.ts +433 -0
- package/src/channels/builtin/contracts.ts +405 -0
- package/src/channels/builtin/plugins.ts +308 -0
- package/src/channels/builtin/rendering.ts +174 -0
- package/src/channels/builtin/setup-schema.ts +504 -0
- package/src/channels/builtin/shared.ts +96 -0
- package/src/channels/builtin/surfaces.ts +57 -0
- package/src/channels/builtin/targets.ts +693 -0
- package/src/channels/builtin-runtime.ts +443 -0
- package/src/channels/delivery/shared.ts +199 -0
- package/src/channels/delivery/strategies-bridge.ts +246 -0
- package/src/channels/delivery/strategies-core.ts +299 -0
- package/src/channels/delivery/strategies-enterprise.ts +178 -0
- package/src/channels/delivery/types.ts +59 -0
- package/src/channels/delivery-router.ts +127 -0
- package/src/channels/index.ts +77 -0
- package/src/channels/plugin-registry.ts +551 -0
- package/src/channels/provider-runtime.ts +330 -0
- package/src/channels/reply-pipeline.ts +522 -0
- package/src/channels/route-manager.ts +340 -0
- package/src/channels/surface-registry.ts +186 -0
- package/src/config/helper-model.ts +233 -0
- package/src/config/index.ts +193 -0
- package/src/config/manager.ts +404 -0
- package/src/config/secrets.ts +547 -0
- package/src/config/service-registry.ts +329 -0
- package/src/config/subscription-auth.ts +31 -0
- package/src/config/subscription-providers.ts +127 -0
- package/src/config/tool-llm.ts +110 -0
- package/src/control-plane/approval-broker.ts +351 -0
- package/src/control-plane/gateway.ts +713 -0
- package/src/control-plane/index.ts +54 -0
- package/src/control-plane/media-contract-schemas.ts +208 -0
- package/src/control-plane/method-catalog-admin.ts +136 -0
- package/src/control-plane/method-catalog-channels.ts +591 -0
- package/src/control-plane/method-catalog-control-automation.ts +475 -0
- package/src/control-plane/method-catalog-control-core.ts +594 -0
- package/src/control-plane/method-catalog-control.ts +8 -0
- package/src/control-plane/method-catalog-events.ts +74 -0
- package/src/control-plane/method-catalog-knowledge.ts +531 -0
- package/src/control-plane/method-catalog-media.ts +279 -0
- package/src/control-plane/method-catalog-runtime.ts +304 -0
- package/src/control-plane/method-catalog-shared.ts +223 -0
- package/src/control-plane/method-catalog.ts +242 -0
- package/src/control-plane/operator-contract-schemas-admin.ts +639 -0
- package/src/control-plane/operator-contract-schemas-channels.ts +375 -0
- package/src/control-plane/operator-contract-schemas-control.ts +226 -0
- package/src/control-plane/operator-contract-schemas-domains.ts +4 -0
- package/src/control-plane/operator-contract-schemas-knowledge.ts +582 -0
- package/src/control-plane/operator-contract-schemas-media.ts +297 -0
- package/src/control-plane/operator-contract-schemas-permissions.ts +100 -0
- package/src/control-plane/operator-contract-schemas-remote.ts +38 -0
- package/src/control-plane/operator-contract-schemas-runtime.ts +563 -0
- package/src/control-plane/operator-contract-schemas-shared.ts +85 -0
- package/src/control-plane/operator-contract-schemas-telemetry.ts +349 -0
- package/src/control-plane/operator-contract-schemas.ts +6 -0
- package/src/control-plane/operator-contract.ts +163 -0
- package/src/control-plane/session-broker.ts +780 -0
- package/src/core/compaction-sections.ts +492 -0
- package/src/core/compaction-types.ts +147 -0
- package/src/core/composer-state.ts +59 -0
- package/src/core/context-compaction.ts +542 -0
- package/src/core/conversation-compaction.ts +68 -0
- package/src/core/conversation-diff.ts +55 -0
- package/src/core/conversation-rendering.ts +343 -0
- package/src/core/conversation-utils.ts +72 -0
- package/src/core/conversation.ts +775 -0
- package/src/core/event-replay.ts +287 -0
- package/src/core/orchestrator-context-runtime.ts +407 -0
- package/src/core/orchestrator-follow-up-runtime.ts +134 -0
- package/src/core/orchestrator-runtime.ts +132 -0
- package/src/core/orchestrator-tool-runtime.ts +468 -0
- package/src/core/orchestrator-turn-helpers.ts +355 -0
- package/src/core/orchestrator-turn-loop.ts +443 -0
- package/src/core/orchestrator.ts +733 -0
- package/src/core/plan-command-handler.ts +169 -0
- package/src/core/system-message-router.ts +210 -0
- package/src/core/transcript-events/classify.ts +95 -0
- package/src/core/transcript-events/index.ts +15 -0
- package/src/daemon/cli.ts +88 -0
- package/src/daemon/control-plane.ts +522 -0
- package/src/daemon/facade-composition.ts +397 -0
- package/src/daemon/facade.ts +638 -0
- package/src/daemon/helpers.ts +74 -0
- package/src/daemon/http/router-route-contexts.ts +370 -0
- package/src/daemon/http/router.ts +531 -0
- package/src/daemon/http-listener.ts +301 -0
- package/src/daemon/index.ts +3 -0
- package/src/daemon/server.ts +1 -0
- package/src/daemon/service-manager.ts +413 -0
- package/src/daemon/surface-actions.ts +183 -0
- package/src/daemon/surface-delivery.ts +530 -0
- package/src/daemon/surface-policy.ts +60 -0
- package/src/daemon/transport-events.ts +110 -0
- package/src/daemon/types.ts +191 -0
- package/src/export/markdown.ts +213 -0
- package/src/export/session-export.ts +633 -0
- package/src/git/index.ts +1 -0
- package/src/git/service.ts +414 -0
- package/src/hooks/chain-engine.ts +414 -0
- package/src/hooks/dispatcher.ts +414 -0
- package/src/hooks/hook-api.ts +170 -0
- package/src/hooks/index.ts +48 -0
- package/src/hooks/runners/agent.ts +93 -0
- package/src/hooks/runners/prompt.ts +69 -0
- package/src/hooks/workbench.ts +360 -0
- package/src/input/autocomplete.ts +96 -0
- package/src/input/bookmark-modal.ts +115 -0
- package/src/input/command-registry.ts +300 -0
- package/src/input/commands/branch-runtime.ts +72 -0
- package/src/input/commands/config.ts +515 -0
- package/src/input/commands/control-room-runtime.ts +255 -0
- package/src/input/commands/conversation-runtime.ts +207 -0
- package/src/input/commands/diff-runtime.ts +161 -0
- package/src/input/commands/discovery-runtime.ts +45 -0
- package/src/input/commands/eval.ts +204 -0
- package/src/input/commands/experience-runtime.ts +278 -0
- package/src/input/commands/git-runtime.ts +81 -0
- package/src/input/commands/guidance-runtime.ts +101 -0
- package/src/input/commands/health-runtime.ts +434 -0
- package/src/input/commands/hooks-runtime.ts +148 -0
- package/src/input/commands/incident-runtime.ts +95 -0
- package/src/input/commands/integration-runtime.ts +394 -0
- package/src/input/commands/intelligence-runtime.ts +223 -0
- package/src/input/commands/knowledge.ts +368 -0
- package/src/input/commands/local-auth-runtime.ts +105 -0
- package/src/input/commands/local-provider-runtime.ts +170 -0
- package/src/input/commands/local-runtime.ts +458 -0
- package/src/input/commands/local-setup-review.ts +192 -0
- package/src/input/commands/local-setup-transfer.ts +134 -0
- package/src/input/commands/local-setup.ts +292 -0
- package/src/input/commands/managed-runtime.ts +208 -0
- package/src/input/commands/marketplace-runtime.ts +290 -0
- package/src/input/commands/mcp-runtime.ts +202 -0
- package/src/input/commands/memory-product-runtime.ts +111 -0
- package/src/input/commands/memory.ts +151 -0
- package/src/input/commands/notify-runtime.ts +83 -0
- package/src/input/commands/operator-panel-runtime.ts +141 -0
- package/src/input/commands/operator-runtime.ts +392 -0
- package/src/input/commands/permissions-runtime.ts +104 -0
- package/src/input/commands/planning-runtime.ts +97 -0
- package/src/input/commands/platform-access-runtime.ts +422 -0
- package/src/input/commands/platform-runtime.ts +6 -0
- package/src/input/commands/platform-sandbox-qemu.ts +137 -0
- package/src/input/commands/platform-sandbox-runtime.ts +406 -0
- package/src/input/commands/platform-sandbox-session.ts +128 -0
- package/src/input/commands/platform-services-runtime.ts +246 -0
- package/src/input/commands/policy-dispatch.ts +339 -0
- package/src/input/commands/policy.ts +17 -0
- package/src/input/commands/product-runtime.ts +351 -0
- package/src/input/commands/profile-sync-runtime.ts +99 -0
- package/src/input/commands/provider-accounts-runtime.ts +113 -0
- package/src/input/commands/provider.ts +363 -0
- package/src/input/commands/quit-shared.ts +162 -0
- package/src/input/commands/recall-bundle.ts +132 -0
- package/src/input/commands/recall-capture.ts +152 -0
- package/src/input/commands/recall-query.ts +229 -0
- package/src/input/commands/recall-review.ts +98 -0
- package/src/input/commands/recall-shared.ts +22 -0
- package/src/input/commands/remote-runtime-pool.ts +106 -0
- package/src/input/commands/remote-runtime-setup.ts +199 -0
- package/src/input/commands/remote-runtime.ts +531 -0
- package/src/input/commands/replay-runtime.ts +18 -0
- package/src/input/commands/runtime-services.ts +279 -0
- package/src/input/commands/schedule-runtime.ts +332 -0
- package/src/input/commands/services-runtime.ts +207 -0
- package/src/input/commands/session-content.ts +408 -0
- package/src/input/commands/session-workflow.ts +464 -0
- package/src/input/commands/session.ts +376 -0
- package/src/input/commands/settings-sync-runtime.ts +173 -0
- package/src/input/commands/share-runtime.ts +114 -0
- package/src/input/commands/shell-core.ts +320 -0
- package/src/input/commands/skills-runtime.ts +221 -0
- package/src/input/commands/subscription-runtime.ts +434 -0
- package/src/input/commands/tasks-runtime.ts +230 -0
- package/src/input/commands/teamwork-runtime.ts +374 -0
- package/src/input/commands/teleport-runtime.ts +57 -0
- package/src/input/commands/worktree-runtime.ts +137 -0
- package/src/input/commands.ts +127 -0
- package/src/input/file-picker.ts +192 -0
- package/src/input/handler-command-route.ts +106 -0
- package/src/input/handler-content-actions.ts +465 -0
- package/src/input/handler-feed-routes.ts +541 -0
- package/src/input/handler-feed.ts +361 -0
- package/src/input/handler-modal-routes.ts +335 -0
- package/src/input/handler-modal-stack.ts +237 -0
- package/src/input/handler-modal-token-routes.ts +272 -0
- package/src/input/handler-picker-routes.ts +416 -0
- package/src/input/handler-prompt-buffer.ts +320 -0
- package/src/input/handler-shortcuts.ts +195 -0
- package/src/input/handler-ui-state.ts +294 -0
- package/src/input/handler.ts +798 -0
- package/src/input/input-history.ts +267 -0
- package/src/input/keybindings.ts +256 -0
- package/src/input/model-picker.ts +730 -0
- package/src/input/panel-integration-actions.ts +77 -0
- package/src/input/profile-picker-modal.ts +222 -0
- package/src/input/search.ts +100 -0
- package/src/input/selection-modal.ts +163 -0
- package/src/input/selection.ts +135 -0
- package/src/input/session-picker-modal.ts +136 -0
- package/src/input/settings-modal.ts +718 -0
- package/src/input/submission-intent.ts +18 -0
- package/src/input/submission-router.ts +64 -0
- package/src/integrations/index.ts +42 -0
- package/src/integrations/notifier.ts +206 -0
- package/src/integrations/webhooks.ts +177 -0
- package/src/knowledge/consolidation.ts +346 -0
- package/src/knowledge/graphql.ts +324 -0
- package/src/knowledge/index.ts +60 -0
- package/src/knowledge/ingest-compile.ts +386 -0
- package/src/knowledge/ingest-context.ts +18 -0
- package/src/knowledge/ingest-inputs.ts +387 -0
- package/src/knowledge/ingest.ts +20 -0
- package/src/knowledge/internal.ts +257 -0
- package/src/knowledge/knowledge-api.ts +432 -0
- package/src/knowledge/lint.ts +121 -0
- package/src/knowledge/memory-sync.ts +62 -0
- package/src/knowledge/packet.ts +370 -0
- package/src/knowledge/scheduling.ts +283 -0
- package/src/knowledge/service.ts +715 -0
- package/src/main.ts +798 -0
- package/src/mcp/client.ts +383 -0
- package/src/mcp/index.ts +12 -0
- package/src/mcp/mcp-api.ts +90 -0
- package/src/mcp/registry.ts +508 -0
- package/src/media/builtin-image-understanding.ts +303 -0
- package/src/media/builtin-providers.ts +26 -0
- package/src/media/index.ts +18 -0
- package/src/multimodal/index.ts +13 -0
- package/src/multimodal/service.ts +492 -0
- package/src/panels/agent-inspector-panel.ts +515 -0
- package/src/panels/agent-inspector-shared.ts +94 -0
- package/src/panels/agent-logs-panel.ts +539 -0
- package/src/panels/agent-logs-shared.ts +129 -0
- package/src/panels/approval-panel.ts +169 -0
- package/src/panels/automation-control-panel.ts +253 -0
- package/src/panels/base-panel.ts +72 -0
- package/src/panels/builtin/agent.ts +88 -0
- package/src/panels/builtin/development.ts +111 -0
- package/src/panels/builtin/knowledge.ts +26 -0
- package/src/panels/builtin/operations.ts +385 -0
- package/src/panels/builtin/session.ts +61 -0
- package/src/panels/builtin/shared.ts +240 -0
- package/src/panels/builtin-panels.ts +23 -0
- package/src/panels/cockpit-panel.ts +183 -0
- package/src/panels/communication-panel.ts +191 -0
- package/src/panels/context-visualizer-panel.ts +199 -0
- package/src/panels/control-plane-panel.ts +266 -0
- package/src/panels/cost-tracker-panel.ts +444 -0
- package/src/panels/debug-panel.ts +432 -0
- package/src/panels/diff-panel.ts +518 -0
- package/src/panels/docs-panel.ts +283 -0
- package/src/panels/eval-panel.ts +399 -0
- package/src/panels/file-explorer-panel.ts +556 -0
- package/src/panels/file-preview-panel.ts +412 -0
- package/src/panels/forensics-panel.ts +364 -0
- package/src/panels/git-panel.ts +630 -0
- package/src/panels/hooks-panel.ts +274 -0
- package/src/panels/incident-review-panel.ts +247 -0
- package/src/panels/index.ts +48 -0
- package/src/panels/intelligence-panel.ts +176 -0
- package/src/panels/knowledge-panel.ts +328 -0
- package/src/panels/local-auth-panel.ts +146 -0
- package/src/panels/marketplace-panel.ts +223 -0
- package/src/panels/mcp-panel.ts +260 -0
- package/src/panels/memory-panel.ts +293 -0
- package/src/panels/ops-control-panel.ts +184 -0
- package/src/panels/ops-strategy-panel.ts +235 -0
- package/src/panels/orchestration-panel.ts +254 -0
- package/src/panels/panel-list-panel.ts +508 -0
- package/src/panels/panel-manager.ts +538 -0
- package/src/panels/panel-picker.ts +106 -0
- package/src/panels/plan-dashboard-panel.ts +272 -0
- package/src/panels/plugins-panel.ts +201 -0
- package/src/panels/policy-panel.ts +308 -0
- package/src/panels/polish.ts +668 -0
- package/src/panels/provider-account-snapshot.ts +259 -0
- package/src/panels/provider-accounts-panel.ts +221 -0
- package/src/panels/provider-health-domains.ts +211 -0
- package/src/panels/provider-health-panel.ts +725 -0
- package/src/panels/provider-health-tracker.ts +115 -0
- package/src/panels/provider-stats-panel.ts +366 -0
- package/src/panels/remote-panel.ts +449 -0
- package/src/panels/routes-panel.ts +228 -0
- package/src/panels/sandbox-panel.ts +289 -0
- package/src/panels/schedule-panel.ts +344 -0
- package/src/panels/search-focus.ts +32 -0
- package/src/panels/security-panel.ts +329 -0
- package/src/panels/services-panel.ts +271 -0
- package/src/panels/session-browser-panel.ts +399 -0
- package/src/panels/session-maintenance.ts +125 -0
- package/src/panels/settings-sync-panel.ts +164 -0
- package/src/panels/skills-panel.ts +475 -0
- package/src/panels/subscription-panel.ts +273 -0
- package/src/panels/symbol-outline-panel.ts +486 -0
- package/src/panels/system-messages-panel.ts +224 -0
- package/src/panels/tasks-panel.ts +448 -0
- package/src/panels/thinking-panel.ts +304 -0
- package/src/panels/token-budget-panel.ts +469 -0
- package/src/panels/tool-inspector-panel.ts +434 -0
- package/src/panels/types.ts +44 -0
- package/src/panels/watchers-panel.ts +241 -0
- package/src/panels/welcome-panel.ts +64 -0
- package/src/panels/worktree-panel.ts +180 -0
- package/src/panels/wrfc-panel.ts +480 -0
- package/src/permissions/briefs/build.ts +88 -0
- package/src/permissions/manager.ts +356 -0
- package/src/permissions/prompt.ts +184 -0
- package/src/plugins/api.ts +383 -0
- package/src/plugins/loader.ts +304 -0
- package/src/plugins/manager.ts +481 -0
- package/src/profiles/shape.ts +58 -0
- package/src/providers/amazon-bedrock-mantle.ts +50 -0
- package/src/providers/amazon-bedrock.ts +61 -0
- package/src/providers/anthropic-compat.ts +373 -0
- package/src/providers/anthropic-sdk-provider.ts +230 -0
- package/src/providers/anthropic-vertex.ts +59 -0
- package/src/providers/anthropic.ts +469 -0
- package/src/providers/auto-register.ts +417 -0
- package/src/providers/builtin-catalog.ts +326 -0
- package/src/providers/builtin-registry.ts +575 -0
- package/src/providers/cache-planner.ts +258 -0
- package/src/providers/capabilities.ts +601 -0
- package/src/providers/custom-loader.ts +425 -0
- package/src/providers/discovered-compat.ts +18 -0
- package/src/providers/discovered-factory.ts +61 -0
- package/src/providers/discovered-traits.ts +138 -0
- package/src/providers/gemini.ts +462 -0
- package/src/providers/github-copilot.ts +254 -0
- package/src/providers/index.ts +47 -0
- package/src/providers/interface.ts +185 -0
- package/src/providers/llama-cpp.ts +402 -0
- package/src/providers/lm-studio-helpers.ts +367 -0
- package/src/providers/lm-studio.ts +484 -0
- package/src/providers/model-catalog-cache.ts +221 -0
- package/src/providers/model-catalog-notifications.ts +97 -0
- package/src/providers/model-catalog-synthetic.ts +202 -0
- package/src/providers/model-catalog.ts +211 -0
- package/src/providers/model-limits.ts +280 -0
- package/src/providers/ollama.ts +469 -0
- package/src/providers/openai-codex.ts +472 -0
- package/src/providers/openai-compat.ts +615 -0
- package/src/providers/openai.ts +231 -0
- package/src/providers/optimizer.ts +381 -0
- package/src/providers/provider-api.ts +553 -0
- package/src/providers/registry-helpers.ts +34 -0
- package/src/providers/registry-models.ts +77 -0
- package/src/providers/registry-types.ts +67 -0
- package/src/providers/registry.ts +729 -0
- package/src/providers/runtime-metadata.ts +149 -0
- package/src/providers/runtime-snapshot.ts +130 -0
- package/src/providers/synthetic.ts +561 -0
- package/src/providers/tier-prompts.ts +84 -0
- package/src/providers/tool-formats.ts +414 -0
- package/src/renderer/agent-detail-modal.ts +285 -0
- package/src/renderer/autocomplete-overlay.ts +154 -0
- package/src/renderer/block-actions.ts +76 -0
- package/src/renderer/bookmark-modal.ts +101 -0
- package/src/renderer/bottom-bar.ts +58 -0
- package/src/renderer/buffer.ts +34 -0
- package/src/renderer/code-block.ts +373 -0
- package/src/renderer/compositor.ts +261 -0
- package/src/renderer/context-inspector.ts +219 -0
- package/src/renderer/conversation-layout.ts +67 -0
- package/src/renderer/conversation-overlays.ts +123 -0
- package/src/renderer/conversation-surface.ts +260 -0
- package/src/renderer/diff-view.ts +132 -0
- package/src/renderer/diff.ts +122 -0
- package/src/renderer/file-picker-overlay.ts +101 -0
- package/src/renderer/file-tree.ts +153 -0
- package/src/renderer/git-status.ts +89 -0
- package/src/renderer/help-overlay.ts +247 -0
- package/src/renderer/history-search-overlay.ts +73 -0
- package/src/renderer/layout-engine.ts +97 -0
- package/src/renderer/layout.ts +32 -0
- package/src/renderer/live-tail-modal.ts +156 -0
- package/src/renderer/markdown.ts +777 -0
- package/src/renderer/modal-factory.ts +467 -0
- package/src/renderer/modal-utils.ts +24 -0
- package/src/renderer/model-picker-overlay.ts +396 -0
- package/src/renderer/overlay-box.ts +165 -0
- package/src/renderer/overlay-viewport.ts +104 -0
- package/src/renderer/panel-composite.ts +80 -0
- package/src/renderer/panel-picker-overlay.ts +202 -0
- package/src/renderer/panel-tab-bar.ts +69 -0
- package/src/renderer/panel-workspace-bar.ts +38 -0
- package/src/renderer/process-indicator.ts +96 -0
- package/src/renderer/process-modal.ts +295 -0
- package/src/renderer/profile-picker-modal.ts +129 -0
- package/src/renderer/progress.ts +98 -0
- package/src/renderer/search-overlay.ts +54 -0
- package/src/renderer/selection-modal-overlay.ts +214 -0
- package/src/renderer/semantic-diff.ts +369 -0
- package/src/renderer/session-picker-modal.ts +127 -0
- package/src/renderer/settings-modal.ts +701 -0
- package/src/renderer/shell-surface.ts +88 -0
- package/src/renderer/surface-layout.ts +101 -0
- package/src/renderer/syntax-highlighter.ts +542 -0
- package/src/renderer/system-message.ts +83 -0
- package/src/renderer/tab-strip.ts +108 -0
- package/src/renderer/text-layout.ts +31 -0
- package/src/renderer/thinking.ts +17 -0
- package/src/renderer/tool-call.ts +233 -0
- package/src/renderer/ui-factory.ts +524 -0
- package/src/renderer/ui-primitives.ts +96 -0
- package/src/runtime/auth/inspection.ts +125 -0
- package/src/runtime/bootstrap-background.ts +147 -0
- package/src/runtime/bootstrap-command-context.ts +265 -0
- package/src/runtime/bootstrap-command-parts.ts +357 -0
- package/src/runtime/bootstrap-core.ts +375 -0
- package/src/runtime/bootstrap-helpers.ts +88 -0
- package/src/runtime/bootstrap-hook-bridge.ts +271 -0
- package/src/runtime/bootstrap-runtime-events.ts +254 -0
- package/src/runtime/bootstrap-services.ts +197 -0
- package/src/runtime/bootstrap-shell.ts +262 -0
- package/src/runtime/bootstrap.ts +488 -0
- package/src/runtime/compaction/index.ts +90 -0
- package/src/runtime/compaction/lifecycle.ts +167 -0
- package/src/runtime/compaction/manager.ts +474 -0
- package/src/runtime/compaction/quality-score.ts +279 -0
- package/src/runtime/compaction/resume-repair.ts +183 -0
- package/src/runtime/compaction/strategies/autocompact.ts +65 -0
- package/src/runtime/compaction/strategies/boundary-commit.ts +106 -0
- package/src/runtime/compaction/strategies/collapse.ts +90 -0
- package/src/runtime/compaction/strategies/index.ts +23 -0
- package/src/runtime/compaction/strategies/microcompact.ts +74 -0
- package/src/runtime/compaction/strategies/reactive.ts +89 -0
- package/src/runtime/compaction/types.ts +221 -0
- package/src/runtime/context.ts +158 -0
- package/src/runtime/diagnostics/actions.ts +776 -0
- package/src/runtime/diagnostics/index.ts +99 -0
- package/src/runtime/diagnostics/panels/agents.ts +252 -0
- package/src/runtime/diagnostics/panels/events.ts +188 -0
- package/src/runtime/diagnostics/panels/health.ts +242 -0
- package/src/runtime/diagnostics/panels/index.ts +24 -0
- package/src/runtime/diagnostics/panels/ops.ts +156 -0
- package/src/runtime/diagnostics/panels/policy.ts +176 -0
- package/src/runtime/diagnostics/panels/tasks.ts +251 -0
- package/src/runtime/diagnostics/panels/tool-calls.ts +267 -0
- package/src/runtime/diagnostics/provider.ts +262 -0
- package/src/runtime/ecosystem/catalog.ts +606 -0
- package/src/runtime/ecosystem/recommendations.ts +117 -0
- package/src/runtime/emitters/agents.ts +96 -0
- package/src/runtime/emitters/automation.ts +112 -0
- package/src/runtime/emitters/communication.ts +53 -0
- package/src/runtime/emitters/compaction.ts +161 -0
- package/src/runtime/emitters/control-plane.ts +65 -0
- package/src/runtime/emitters/deliveries.ts +65 -0
- package/src/runtime/emitters/forensics.ts +17 -0
- package/src/runtime/emitters/index.ts +59 -0
- package/src/runtime/emitters/knowledge.ts +129 -0
- package/src/runtime/emitters/mcp.ts +95 -0
- package/src/runtime/emitters/ops.ts +163 -0
- package/src/runtime/emitters/orchestration.ts +87 -0
- package/src/runtime/emitters/permissions.ts +98 -0
- package/src/runtime/emitters/planner.ts +23 -0
- package/src/runtime/emitters/plugins.ts +78 -0
- package/src/runtime/emitters/providers.ts +30 -0
- package/src/runtime/emitters/routes.ts +57 -0
- package/src/runtime/emitters/security.ts +53 -0
- package/src/runtime/emitters/session.ts +93 -0
- package/src/runtime/emitters/surfaces.ts +57 -0
- package/src/runtime/emitters/tasks.ts +69 -0
- package/src/runtime/emitters/tools.ts +140 -0
- package/src/runtime/emitters/transport.ts +78 -0
- package/src/runtime/emitters/turn.ts +155 -0
- package/src/runtime/emitters/ui.ts +57 -0
- package/src/runtime/emitters/watchers.ts +57 -0
- package/src/runtime/emitters/workflows.ts +79 -0
- package/src/runtime/eval/index.ts +48 -0
- package/src/runtime/eval/runner.ts +163 -0
- package/src/runtime/eval/suites.ts +264 -0
- package/src/runtime/events/domain-map.ts +148 -0
- package/src/runtime/events/index.ts +194 -0
- package/src/runtime/events/turn.ts +60 -0
- package/src/runtime/events/workflows.ts +17 -0
- package/src/runtime/forensics/collector.ts +693 -0
- package/src/runtime/forensics/index.ts +23 -0
- package/src/runtime/foundation-clients.ts +78 -0
- package/src/runtime/foundation-services.ts +96 -0
- package/src/runtime/guidance.ts +183 -0
- package/src/runtime/health/effect-handlers.ts +189 -0
- package/src/runtime/health/index.ts +70 -0
- package/src/runtime/health/wiring.ts +115 -0
- package/src/runtime/index.ts +174 -0
- package/src/runtime/integration/helpers.ts +640 -0
- package/src/runtime/lifecycle.ts +107 -0
- package/src/runtime/mcp/index.ts +68 -0
- package/src/runtime/mcp/manager.ts +513 -0
- package/src/runtime/network/inbound.ts +131 -0
- package/src/runtime/network/index.ts +30 -0
- package/src/runtime/network/outbound.ts +292 -0
- package/src/runtime/network/shared.ts +82 -0
- package/src/runtime/operator-client.ts +235 -0
- package/src/runtime/ops/control-plane.ts +363 -0
- package/src/runtime/ops/index.ts +122 -0
- package/src/runtime/ops/playbooks/index.ts +10 -0
- package/src/runtime/ops/playbooks/session-unrecoverable.ts +196 -0
- package/src/runtime/ops/playbooks/stuck-turn.ts +197 -0
- package/src/runtime/ops/runtime-context.ts +100 -0
- package/src/runtime/ops-api.ts +27 -0
- package/src/runtime/orchestration/spawn-policy.ts +83 -0
- package/src/runtime/peer-client.ts +404 -0
- package/src/runtime/perf/index.ts +57 -0
- package/src/runtime/perf/slo-collector.ts +375 -0
- package/src/runtime/permissions/index.ts +190 -0
- package/src/runtime/permissions/policy-runtime.ts +175 -0
- package/src/runtime/permissions/preflight.ts +101 -0
- package/src/runtime/permissions/rule-suggestions.ts +36 -0
- package/src/runtime/plugins/hot-reload.ts +221 -0
- package/src/runtime/plugins/index.ts +84 -0
- package/src/runtime/plugins/lifecycle.ts +95 -0
- package/src/runtime/plugins/manager.ts +474 -0
- package/src/runtime/plugins/manifest.ts +167 -0
- package/src/runtime/plugins/quarantine.ts +202 -0
- package/src/runtime/plugins/trust.ts +291 -0
- package/src/runtime/plugins/types.ts +205 -0
- package/src/runtime/provider-accounts/registry.ts +326 -0
- package/src/runtime/remote/distributed-runtime-contract-schemas.ts +386 -0
- package/src/runtime/remote/index.ts +488 -0
- package/src/runtime/remote/runner-registry.ts +438 -0
- package/src/runtime/remote/supervisor.ts +70 -0
- package/src/runtime/runtime-hook-api.ts +5 -0
- package/src/runtime/runtime-knowledge-api.ts +14 -0
- package/src/runtime/runtime-mcp-api.ts +5 -0
- package/src/runtime/runtime-ops-api.ts +86 -0
- package/src/runtime/runtime-provider-api.ts +18 -0
- package/src/runtime/sandbox/backend.ts +291 -0
- package/src/runtime/sandbox/manager.ts +364 -0
- package/src/runtime/sandbox/provisioning.ts +422 -0
- package/src/runtime/sandbox/session-registry.ts +289 -0
- package/src/runtime/services.ts +541 -0
- package/src/runtime/session-maintenance.ts +188 -0
- package/src/runtime/session-persistence.ts +288 -0
- package/src/runtime/session-return-context.ts +195 -0
- package/src/runtime/settings/control-plane-store.ts +258 -0
- package/src/runtime/settings/control-plane.ts +599 -0
- package/src/runtime/shell-command-extensions.ts +54 -0
- package/src/runtime/shell-command-ops.ts +207 -0
- package/src/runtime/shell-command-platform.ts +47 -0
- package/src/runtime/shell-command-services.ts +143 -0
- package/src/runtime/shell-command-workspace.ts +31 -0
- package/src/runtime/store/domains/conversation.ts +181 -0
- package/src/runtime/store/domains/domain-read-matrix.ts +17 -0
- package/src/runtime/store/domains/index.ts +222 -0
- package/src/runtime/store/domains/panels.ts +117 -0
- package/src/runtime/store/domains/permissions.ts +143 -0
- package/src/runtime/store/domains/ui-perf.ts +103 -0
- package/src/runtime/store/helpers/reducers/conversation.ts +228 -0
- package/src/runtime/store/helpers/reducers/lifecycle.ts +440 -0
- package/src/runtime/store/helpers/reducers/shared.ts +60 -0
- package/src/runtime/store/helpers/reducers/sync.ts +555 -0
- package/src/runtime/store/helpers/reducers.ts +30 -0
- package/src/runtime/store/index.ts +304 -0
- package/src/runtime/store/selectors/index.ts +354 -0
- package/src/runtime/store/state.ts +137 -0
- package/src/runtime/tasks/adapters/acp-adapter.ts +211 -0
- package/src/runtime/tasks/adapters/agent-adapter.ts +208 -0
- package/src/runtime/tasks/adapters/index.ts +16 -0
- package/src/runtime/tasks/adapters/process-adapter.ts +214 -0
- package/src/runtime/tasks/adapters/scheduler-adapter.ts +193 -0
- package/src/runtime/tasks/index.ts +68 -0
- package/src/runtime/tasks/manager.ts +415 -0
- package/src/runtime/telemetry/api-helpers.ts +517 -0
- package/src/runtime/telemetry/api.ts +768 -0
- package/src/runtime/telemetry/index.ts +178 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +440 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +200 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +18 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +204 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge.ts +125 -0
- package/src/runtime/telemetry/instrumentation/index.ts +67 -0
- package/src/runtime/tools/context.ts +114 -0
- package/src/runtime/tools/index.ts +46 -0
- package/src/runtime/tools/phased-executor.ts +448 -0
- package/src/runtime/tools/phases/budget.ts +130 -0
- package/src/runtime/tools/phases/execute.ts +69 -0
- package/src/runtime/tools/phases/index.ts +13 -0
- package/src/runtime/tools/phases/map-output.ts +98 -0
- package/src/runtime/tools/phases/permission.ts +133 -0
- package/src/runtime/tools/phases/posthook.ts +57 -0
- package/src/runtime/tools/phases/prehook.ts +68 -0
- package/src/runtime/tools/phases/validate.ts +53 -0
- package/src/runtime/transports/direct.ts +73 -0
- package/src/runtime/transports/http-helpers.ts +218 -0
- package/src/runtime/transports/http-types.ts +364 -0
- package/src/runtime/transports/http.ts +629 -0
- package/src/runtime/transports/realtime.ts +50 -0
- package/src/runtime/transports/remote-events.ts +16 -0
- package/src/runtime/transports/shared.ts +39 -0
- package/src/runtime/transports/ui-runtime-events.ts +35 -0
- package/src/runtime/ui/index.ts +39 -0
- package/src/runtime/ui/model-picker/data-provider.ts +182 -0
- package/src/runtime/ui/model-picker/health-enrichment.ts +228 -0
- package/src/runtime/ui/model-picker/index.ts +59 -0
- package/src/runtime/ui/model-picker/types.ts +149 -0
- package/src/runtime/ui/provider-health/data-provider.ts +244 -0
- package/src/runtime/ui/provider-health/fallback-visualizer.ts +69 -0
- package/src/runtime/ui/provider-health/index.ts +46 -0
- package/src/runtime/ui/provider-health/types.ts +146 -0
- package/src/runtime/ui-events.ts +46 -0
- package/src/runtime/ui-read-model-helpers.ts +32 -0
- package/src/runtime/ui-read-models-core.ts +95 -0
- package/src/runtime/ui-read-models-observability-maintenance.ts +81 -0
- package/src/runtime/ui-read-models-observability-options.ts +5 -0
- package/src/runtime/ui-read-models-observability-remote.ts +73 -0
- package/src/runtime/ui-read-models-observability-security.ts +172 -0
- package/src/runtime/ui-read-models-observability-system.ts +217 -0
- package/src/runtime/ui-read-models-observability.ts +59 -0
- package/src/runtime/ui-read-models-operations.ts +203 -0
- package/src/runtime/ui-read-models.ts +61 -0
- package/src/runtime/ui-service-queries.ts +114 -0
- package/src/runtime/ui-services.ts +163 -0
- package/src/runtime/worktree/registry.ts +252 -0
- package/src/scripts/process-messages.ts +42 -0
- package/src/sessions/manager.ts +388 -0
- package/src/shell/blocking-input.ts +89 -0
- package/src/shell/ui-openers.ts +163 -0
- package/src/state/file-watcher.ts +294 -0
- package/src/state/index.ts +56 -0
- package/src/state/knowledge-injection.ts +214 -0
- package/src/state/memory-embedding-http.ts +642 -0
- package/src/state/memory-embeddings.ts +312 -0
- package/src/state/memory-ingest.ts +132 -0
- package/src/state/memory-registry.ts +111 -0
- package/src/state/memory-store-helpers.ts +160 -0
- package/src/state/memory-store.ts +728 -0
- package/src/state/memory-vector-store.ts +418 -0
- package/src/templates/manager.ts +187 -0
- package/src/tools/agent/index.ts +610 -0
- package/src/tools/agent/manager.ts +476 -0
- package/src/tools/analyze/git-modes.ts +380 -0
- package/src/tools/analyze/index.ts +128 -0
- package/src/tools/channel/agent-tools.ts +16 -0
- package/src/tools/channel/index.ts +268 -0
- package/src/tools/control/index.ts +90 -0
- package/src/tools/edit/core.ts +619 -0
- package/src/tools/edit/index.ts +4 -0
- package/src/tools/edit/phased.ts +33 -0
- package/src/tools/fetch/index.ts +3 -0
- package/src/tools/fetch/phased.ts +34 -0
- package/src/tools/fetch/runtime.ts +499 -0
- package/src/tools/index.ts +186 -0
- package/src/tools/mcp/index.ts +190 -0
- package/src/tools/remote-trigger/index.ts +130 -0
- package/src/tools/repl/index.ts +318 -0
- package/src/tools/shared/auto-heal.ts +282 -0
- package/src/tools/state/index.ts +688 -0
- package/src/tools/web-search/index.ts +38 -0
- package/src/tools/write/index.ts +604 -0
- package/src/tools/write/phased.ts +41 -0
- package/src/types/generated/foundation-client-types.ts +22 -0
- package/src/types/sql-js.d.ts +15 -0
- package/src/utils/splash-lines.ts +46 -0
- package/src/version.ts +17 -0
- package/src/watchers/index.ts +11 -0
- package/src/watchers/registry.ts +517 -0
- package/src/web-search/index.ts +26 -0
- package/src/web-search/provider-registry.ts +64 -0
- package/src/web-search/providers/brave.ts +100 -0
- package/src/web-search/providers/duckduckgo.ts +270 -0
- package/src/web-search/providers/exa.ts +77 -0
- package/src/web-search/providers/firecrawl.ts +90 -0
- package/src/web-search/providers/perplexity.ts +86 -0
- package/src/web-search/providers/searxng.ts +88 -0
- package/src/web-search/providers/shared.ts +249 -0
- package/src/web-search/providers/tavily.ts +90 -0
- package/src/web-search/service.ts +142 -0
- package/src/widget/index.ts +2 -0
- package/src/widget/types.ts +9 -0
- package/src/widget/widget.ts +8 -0
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
import type { DiscoveredServer } from '@pellux/goodvibes-sdk/platform/discovery/index';
|
|
2
|
+
import { HelperModel, type HelperModelDeps } from '../config/helper-model.ts';
|
|
3
|
+
import {
|
|
4
|
+
compositeScore,
|
|
5
|
+
getQualityTier,
|
|
6
|
+
getQualityTierFromScore,
|
|
7
|
+
type BenchmarkEntry,
|
|
8
|
+
type BenchmarkStore,
|
|
9
|
+
type ModelBenchmarks,
|
|
10
|
+
type QualityTier,
|
|
11
|
+
} from '@pellux/goodvibes-sdk/platform/providers/model-benchmarks';
|
|
12
|
+
import type { MinimalModelDefinition, SyntheticModelInfo } from './model-catalog.ts';
|
|
13
|
+
import type { FavoritesData, FavoritesStore } from '@pellux/goodvibes-sdk/platform/providers/favorites';
|
|
14
|
+
import type { LLMProvider, ProviderRuntimeMetadata } from './interface.ts';
|
|
15
|
+
import type { ModelDefinition } from './registry-types.ts';
|
|
16
|
+
import {
|
|
17
|
+
getProviderRuntimeSnapshot,
|
|
18
|
+
getProviderUsageSnapshot,
|
|
19
|
+
listProviderRuntimeSnapshots,
|
|
20
|
+
type ProviderRuntimeSnapshot,
|
|
21
|
+
type ProviderUsageSnapshot,
|
|
22
|
+
} from './runtime-snapshot.ts';
|
|
23
|
+
|
|
24
|
+
export interface ProviderApiModelReference {
|
|
25
|
+
readonly modelId: string;
|
|
26
|
+
readonly providerId: string;
|
|
27
|
+
readonly registryKey: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export interface ProviderApiFavoriteState {
|
|
31
|
+
readonly pinned: boolean;
|
|
32
|
+
readonly recent: boolean;
|
|
33
|
+
readonly pinnedAt?: string;
|
|
34
|
+
readonly lastUsed?: string;
|
|
35
|
+
readonly useCount?: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface ProviderApiSyntheticRouting {
|
|
39
|
+
readonly backendCount: number;
|
|
40
|
+
readonly keyedBackendCount: number;
|
|
41
|
+
readonly tier: string;
|
|
42
|
+
readonly bestCompositeScore: number | null;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface ProviderApiModelRouting {
|
|
46
|
+
readonly kind: 'direct' | 'synthetic';
|
|
47
|
+
readonly failoverStrategy: 'none' | 'synthetic-wrapper' | 'same-tier-provider' | 'intra-synthetic';
|
|
48
|
+
readonly alternative?: ProviderApiModelReference;
|
|
49
|
+
readonly synthetic?: ProviderApiSyntheticRouting;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export interface ProviderApiCatalogBenchmarkRecord extends ProviderApiModelReference {
|
|
53
|
+
readonly kind: 'catalog';
|
|
54
|
+
readonly available: boolean;
|
|
55
|
+
readonly displayName?: string;
|
|
56
|
+
readonly organization: string;
|
|
57
|
+
readonly sourceName: string;
|
|
58
|
+
readonly benchmarks: ModelBenchmarks;
|
|
59
|
+
readonly compositeScore: number | null;
|
|
60
|
+
readonly qualityTier: QualityTier;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface ProviderApiSyntheticBenchmarkRecord extends ProviderApiModelReference {
|
|
64
|
+
readonly kind: 'synthetic';
|
|
65
|
+
readonly available: boolean;
|
|
66
|
+
readonly displayName?: string;
|
|
67
|
+
readonly backendCount: number;
|
|
68
|
+
readonly keyedBackendCount: number;
|
|
69
|
+
readonly tier: string;
|
|
70
|
+
readonly compositeScore: number | null;
|
|
71
|
+
readonly qualityTier?: QualityTier;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export type ProviderApiBenchmarkRecord =
|
|
75
|
+
| ProviderApiCatalogBenchmarkRecord
|
|
76
|
+
| ProviderApiSyntheticBenchmarkRecord;
|
|
77
|
+
|
|
78
|
+
export interface ProviderApiModelRecord extends ProviderApiModelReference {
|
|
79
|
+
readonly displayName: string;
|
|
80
|
+
readonly description: string;
|
|
81
|
+
readonly selectable: boolean;
|
|
82
|
+
readonly current: boolean;
|
|
83
|
+
readonly capabilities: ModelDefinition['capabilities'];
|
|
84
|
+
readonly contextWindow: number;
|
|
85
|
+
readonly tier?: ModelDefinition['tier'];
|
|
86
|
+
readonly reasoningEffort?: readonly string[];
|
|
87
|
+
readonly favorite: ProviderApiFavoriteState;
|
|
88
|
+
readonly benchmark?: ProviderApiBenchmarkRecord;
|
|
89
|
+
readonly routing: ProviderApiModelRouting;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export interface ProviderApiFavoriteRecord {
|
|
93
|
+
readonly modelId: string;
|
|
94
|
+
readonly available: boolean;
|
|
95
|
+
readonly providerId?: string;
|
|
96
|
+
readonly registryKey?: string;
|
|
97
|
+
readonly displayName?: string;
|
|
98
|
+
readonly pinnedAt?: string;
|
|
99
|
+
readonly lastUsed?: string;
|
|
100
|
+
readonly useCount?: number;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export interface ProviderApiFavoritesSnapshot {
|
|
104
|
+
readonly pinned: readonly ProviderApiFavoriteRecord[];
|
|
105
|
+
readonly recent: readonly ProviderApiFavoriteRecord[];
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface ProviderApiModelQuery {
|
|
109
|
+
readonly providerId?: string;
|
|
110
|
+
readonly selectableOnly?: boolean;
|
|
111
|
+
readonly favorites?: 'all' | 'pinned' | 'recent';
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export interface ProviderApiBenchmarkQuery {
|
|
115
|
+
readonly modelRefs?: readonly string[];
|
|
116
|
+
readonly limit?: number;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export interface ProviderApiCatalogRefreshResult {
|
|
120
|
+
readonly modelCount: number;
|
|
121
|
+
readonly providerCount: number;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export type ProviderApiRuntimeQuery =
|
|
125
|
+
| { readonly scope: 'all' }
|
|
126
|
+
| { readonly scope: 'provider'; readonly providerId: string }
|
|
127
|
+
| { readonly scope: 'usage'; readonly providerId: string };
|
|
128
|
+
|
|
129
|
+
export type ProviderApiRuntimeQueryResult =
|
|
130
|
+
| { readonly scope: 'all'; readonly snapshots: readonly ProviderRuntimeSnapshot[] }
|
|
131
|
+
| { readonly scope: 'provider'; readonly snapshot: ProviderRuntimeSnapshot | null }
|
|
132
|
+
| { readonly scope: 'usage'; readonly snapshot: ProviderUsageSnapshot | null };
|
|
133
|
+
|
|
134
|
+
export interface ProviderApi {
|
|
135
|
+
listProviderIds(): readonly string[];
|
|
136
|
+
getCurrentModel(): Promise<ProviderApiModelRecord>;
|
|
137
|
+
listModels(query?: ProviderApiModelQuery): Promise<readonly ProviderApiModelRecord[]>;
|
|
138
|
+
selectModel(modelRef: string): Promise<ProviderApiModelRecord>;
|
|
139
|
+
registerDiscoveredProviders(servers: readonly DiscoveredServer[]): Promise<void>;
|
|
140
|
+
refreshCatalog(): Promise<ProviderApiCatalogRefreshResult>;
|
|
141
|
+
refreshBenchmarks(): Promise<number>;
|
|
142
|
+
refreshModelLimits(): Promise<number>;
|
|
143
|
+
getFavorites(): Promise<ProviderApiFavoritesSnapshot>;
|
|
144
|
+
pinModel(modelRef: string): Promise<ProviderApiFavoritesSnapshot>;
|
|
145
|
+
unpinModel(modelRef: string): Promise<ProviderApiFavoritesSnapshot>;
|
|
146
|
+
recordModelUsage(modelRef: string): Promise<ProviderApiFavoritesSnapshot>;
|
|
147
|
+
listBenchmarks(query?: ProviderApiBenchmarkQuery): Promise<readonly ProviderApiBenchmarkRecord[]>;
|
|
148
|
+
queryRuntimeMetadata(query: ProviderApiRuntimeQuery): Promise<ProviderApiRuntimeQueryResult>;
|
|
149
|
+
createHelperModel(configManager: HelperModelDeps['configManager']): HelperModel;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface ProviderApiRegistry {
|
|
153
|
+
describeRuntime(name: string): Promise<ProviderRuntimeMetadata | null>;
|
|
154
|
+
findAlternativeModel(currentModelId: string): ModelDefinition | null;
|
|
155
|
+
getCostFromCatalog(modelId: string): { input: number; output: number };
|
|
156
|
+
getCatalogModelDefinitions(): readonly MinimalModelDefinition[];
|
|
157
|
+
get(name: string): LLMProvider;
|
|
158
|
+
getCurrentModel(): ModelDefinition;
|
|
159
|
+
getContextWindowForModel(modelDef: ModelDefinition): number;
|
|
160
|
+
getForModel(modelId: string, provider?: string): LLMProvider;
|
|
161
|
+
getRegistered(name: string): LLMProvider;
|
|
162
|
+
getSelectableModels(): ModelDefinition[];
|
|
163
|
+
getSyntheticModelInfoFromCatalog(modelId: string): SyntheticModelInfo | null;
|
|
164
|
+
listModels(): ModelDefinition[];
|
|
165
|
+
listProviders(): readonly LLMProvider[];
|
|
166
|
+
registerDiscoveredProviders(servers: DiscoveredServer[]): void;
|
|
167
|
+
refreshCatalog(): Promise<void>;
|
|
168
|
+
refreshModelLimits(): Promise<number>;
|
|
169
|
+
setCurrentModel(modelId: string): void;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export interface ProviderApiFavoritesStore extends Pick<FavoritesStore, 'load' | 'pinModel' | 'recordUsage' | 'unpinModel'> {}
|
|
173
|
+
|
|
174
|
+
export interface ProviderApiBenchmarkStore extends Pick<BenchmarkStore, 'getBenchmarks' | 'refreshBenchmarks'> {}
|
|
175
|
+
|
|
176
|
+
export interface ProviderApiDependencies {
|
|
177
|
+
readonly providerRegistry: ProviderApiRegistry;
|
|
178
|
+
readonly favoritesStore: ProviderApiFavoritesStore;
|
|
179
|
+
readonly benchmarkStore: ProviderApiBenchmarkStore;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function cloneFavoritesData(data: FavoritesData): FavoritesData {
|
|
183
|
+
return {
|
|
184
|
+
pinned: data.pinned.map((entry) => ({ ...entry })),
|
|
185
|
+
history: data.history.map((entry) => ({ ...entry })),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function findModelDefinition(
|
|
190
|
+
models: readonly ModelDefinition[],
|
|
191
|
+
modelRef: string,
|
|
192
|
+
): ModelDefinition | undefined {
|
|
193
|
+
if (modelRef.includes(':')) {
|
|
194
|
+
return models.find((model) => model.registryKey === modelRef) ?? models.find((model) => model.id === modelRef);
|
|
195
|
+
}
|
|
196
|
+
return models.find((model) => model.id === modelRef);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
function toModelReference(model: ModelDefinition): ProviderApiModelReference {
|
|
200
|
+
return {
|
|
201
|
+
modelId: model.id,
|
|
202
|
+
providerId: model.provider,
|
|
203
|
+
registryKey: model.registryKey,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
function buildFavoriteIndexes(data: FavoritesData): {
|
|
208
|
+
readonly pinnedByModelId: ReadonlyMap<string, FavoritesData['pinned'][number]>;
|
|
209
|
+
readonly recentByModelId: ReadonlyMap<string, FavoritesData['history'][number]>;
|
|
210
|
+
} {
|
|
211
|
+
return {
|
|
212
|
+
pinnedByModelId: new Map(data.pinned.map((entry) => [entry.modelId, entry])),
|
|
213
|
+
recentByModelId: new Map(data.history.map((entry) => [entry.modelId, entry])),
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
function buildSyntheticBenchmarkRecord(
|
|
218
|
+
model: ModelDefinition,
|
|
219
|
+
syntheticInfo: SyntheticModelInfo,
|
|
220
|
+
): ProviderApiSyntheticBenchmarkRecord {
|
|
221
|
+
return {
|
|
222
|
+
...toModelReference(model),
|
|
223
|
+
kind: 'synthetic',
|
|
224
|
+
available: true,
|
|
225
|
+
displayName: model.displayName,
|
|
226
|
+
backendCount: syntheticInfo.backendCount,
|
|
227
|
+
keyedBackendCount: syntheticInfo.keyedBackendCount,
|
|
228
|
+
tier: syntheticInfo.tier,
|
|
229
|
+
compositeScore: syntheticInfo.bestCompositeScore,
|
|
230
|
+
...(syntheticInfo.bestCompositeScore != null
|
|
231
|
+
? { qualityTier: getQualityTierFromScore(syntheticInfo.bestCompositeScore) }
|
|
232
|
+
: {}),
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
function buildCatalogBenchmarkRecord(
|
|
237
|
+
model: ModelDefinition,
|
|
238
|
+
benchmark: BenchmarkEntry,
|
|
239
|
+
): ProviderApiCatalogBenchmarkRecord {
|
|
240
|
+
return {
|
|
241
|
+
...toModelReference(model),
|
|
242
|
+
kind: 'catalog',
|
|
243
|
+
available: true,
|
|
244
|
+
displayName: model.displayName,
|
|
245
|
+
organization: benchmark.organization,
|
|
246
|
+
sourceName: benchmark.name,
|
|
247
|
+
benchmarks: benchmark.benchmarks,
|
|
248
|
+
compositeScore: compositeScore(benchmark.benchmarks),
|
|
249
|
+
qualityTier: getQualityTier(benchmark.benchmarks),
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function buildModelBenchmark(
|
|
254
|
+
model: ModelDefinition,
|
|
255
|
+
deps: ProviderApiDependencies,
|
|
256
|
+
): ProviderApiBenchmarkRecord | undefined {
|
|
257
|
+
if (model.provider === 'synthetic') {
|
|
258
|
+
const syntheticInfo = deps.providerRegistry.getSyntheticModelInfoFromCatalog(model.id);
|
|
259
|
+
return syntheticInfo ? buildSyntheticBenchmarkRecord(model, syntheticInfo) : undefined;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
const benchmark = deps.benchmarkStore.getBenchmarks(model.id)
|
|
263
|
+
?? deps.benchmarkStore.getBenchmarks(model.displayName);
|
|
264
|
+
return benchmark ? buildCatalogBenchmarkRecord(model, benchmark) : undefined;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
function buildModelRouting(
|
|
268
|
+
model: ModelDefinition,
|
|
269
|
+
deps: ProviderApiDependencies,
|
|
270
|
+
): ProviderApiModelRouting {
|
|
271
|
+
if (model.provider === 'synthetic') {
|
|
272
|
+
const syntheticInfo = deps.providerRegistry.getSyntheticModelInfoFromCatalog(model.id);
|
|
273
|
+
return {
|
|
274
|
+
kind: 'synthetic',
|
|
275
|
+
failoverStrategy: 'intra-synthetic',
|
|
276
|
+
...(syntheticInfo
|
|
277
|
+
? {
|
|
278
|
+
synthetic: {
|
|
279
|
+
backendCount: syntheticInfo.backendCount,
|
|
280
|
+
keyedBackendCount: syntheticInfo.keyedBackendCount,
|
|
281
|
+
tier: syntheticInfo.tier,
|
|
282
|
+
bestCompositeScore: syntheticInfo.bestCompositeScore,
|
|
283
|
+
},
|
|
284
|
+
}
|
|
285
|
+
: {}),
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
const alternative = deps.providerRegistry.findAlternativeModel(model.registryKey);
|
|
290
|
+
if (!alternative) {
|
|
291
|
+
return {
|
|
292
|
+
kind: 'direct',
|
|
293
|
+
failoverStrategy: 'none',
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return {
|
|
298
|
+
kind: 'direct',
|
|
299
|
+
failoverStrategy: alternative.provider === 'synthetic' ? 'synthetic-wrapper' : 'same-tier-provider',
|
|
300
|
+
alternative: toModelReference(alternative),
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function buildModelRecord(
|
|
305
|
+
model: ModelDefinition,
|
|
306
|
+
currentModel: ModelDefinition,
|
|
307
|
+
favorites: FavoritesData,
|
|
308
|
+
deps: ProviderApiDependencies,
|
|
309
|
+
): ProviderApiModelRecord {
|
|
310
|
+
const indexes = buildFavoriteIndexes(favorites);
|
|
311
|
+
const pinned = indexes.pinnedByModelId.get(model.id);
|
|
312
|
+
const recent = indexes.recentByModelId.get(model.id);
|
|
313
|
+
|
|
314
|
+
return {
|
|
315
|
+
...toModelReference(model),
|
|
316
|
+
displayName: model.displayName,
|
|
317
|
+
description: model.description,
|
|
318
|
+
selectable: model.selectable,
|
|
319
|
+
current: currentModel.registryKey === model.registryKey,
|
|
320
|
+
capabilities: model.capabilities,
|
|
321
|
+
contextWindow: model.contextWindow,
|
|
322
|
+
...(model.tier ? { tier: model.tier } : {}),
|
|
323
|
+
...(model.reasoningEffort ? { reasoningEffort: model.reasoningEffort } : {}),
|
|
324
|
+
favorite: {
|
|
325
|
+
pinned: pinned != null,
|
|
326
|
+
recent: recent != null,
|
|
327
|
+
...(pinned ? { pinnedAt: pinned.pinnedAt } : {}),
|
|
328
|
+
...(recent ? { lastUsed: recent.lastUsed, useCount: recent.count } : {}),
|
|
329
|
+
},
|
|
330
|
+
...(buildModelBenchmark(model, deps) ? { benchmark: buildModelBenchmark(model, deps)! } : {}),
|
|
331
|
+
routing: buildModelRouting(model, deps),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function buildFavoriteRecord(
|
|
336
|
+
modelId: string,
|
|
337
|
+
models: readonly ModelDefinition[],
|
|
338
|
+
extras: {
|
|
339
|
+
readonly pinnedAt?: string;
|
|
340
|
+
readonly lastUsed?: string;
|
|
341
|
+
readonly useCount?: number;
|
|
342
|
+
},
|
|
343
|
+
): ProviderApiFavoriteRecord {
|
|
344
|
+
const model = findModelDefinition(models, modelId);
|
|
345
|
+
return {
|
|
346
|
+
modelId,
|
|
347
|
+
available: model != null,
|
|
348
|
+
...(model
|
|
349
|
+
? {
|
|
350
|
+
providerId: model.provider,
|
|
351
|
+
registryKey: model.registryKey,
|
|
352
|
+
displayName: model.displayName,
|
|
353
|
+
}
|
|
354
|
+
: {}),
|
|
355
|
+
...extras,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
async function loadFavoritesSnapshot(
|
|
360
|
+
deps: ProviderApiDependencies,
|
|
361
|
+
): Promise<ProviderApiFavoritesSnapshot> {
|
|
362
|
+
const favorites = cloneFavoritesData(await deps.favoritesStore.load());
|
|
363
|
+
const models = deps.providerRegistry.listModels();
|
|
364
|
+
const pinned = favorites.pinned.map((entry) =>
|
|
365
|
+
buildFavoriteRecord(entry.modelId, models, { pinnedAt: entry.pinnedAt }),
|
|
366
|
+
);
|
|
367
|
+
const recent = favorites.history
|
|
368
|
+
.slice()
|
|
369
|
+
.sort((a, b) => b.lastUsed.localeCompare(a.lastUsed))
|
|
370
|
+
.map((entry) =>
|
|
371
|
+
buildFavoriteRecord(entry.modelId, models, {
|
|
372
|
+
lastUsed: entry.lastUsed,
|
|
373
|
+
useCount: entry.count,
|
|
374
|
+
}),
|
|
375
|
+
);
|
|
376
|
+
return { pinned, recent };
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
function applyModelQuery(
|
|
380
|
+
models: readonly ProviderApiModelRecord[],
|
|
381
|
+
query: ProviderApiModelQuery | undefined,
|
|
382
|
+
): readonly ProviderApiModelRecord[] {
|
|
383
|
+
if (!query) return models;
|
|
384
|
+
|
|
385
|
+
return models.filter((model) => {
|
|
386
|
+
if (query.providerId && model.providerId !== query.providerId) return false;
|
|
387
|
+
if (query.selectableOnly && !model.selectable) return false;
|
|
388
|
+
if (query.favorites === 'pinned' && !model.favorite.pinned) return false;
|
|
389
|
+
if (query.favorites === 'recent' && !model.favorite.recent) return false;
|
|
390
|
+
return true;
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
function resolveModelOrThrow(
|
|
395
|
+
deps: ProviderApiDependencies,
|
|
396
|
+
modelRef: string,
|
|
397
|
+
): ModelDefinition {
|
|
398
|
+
const model = findModelDefinition(deps.providerRegistry.listModels(), modelRef);
|
|
399
|
+
if (!model) {
|
|
400
|
+
throw new Error(`Model '${modelRef}' not found.`);
|
|
401
|
+
}
|
|
402
|
+
return model;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
async function resolvePinnedModelIdOrThrow(
|
|
406
|
+
deps: ProviderApiDependencies,
|
|
407
|
+
modelRef: string,
|
|
408
|
+
): Promise<string> {
|
|
409
|
+
const model = findModelDefinition(deps.providerRegistry.listModels(), modelRef);
|
|
410
|
+
if (model) return model.id;
|
|
411
|
+
|
|
412
|
+
const favorites = cloneFavoritesData(await deps.favoritesStore.load());
|
|
413
|
+
const pinned = favorites.pinned.find((entry) => entry.modelId === modelRef);
|
|
414
|
+
if (pinned) return pinned.modelId;
|
|
415
|
+
|
|
416
|
+
throw new Error(`Model '${modelRef}' not found.`);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
async function buildBenchmarkRecords(
|
|
420
|
+
deps: ProviderApiDependencies,
|
|
421
|
+
query?: ProviderApiBenchmarkQuery,
|
|
422
|
+
): Promise<readonly ProviderApiBenchmarkRecord[]> {
|
|
423
|
+
const models = deps.providerRegistry.listModels();
|
|
424
|
+
const selectedModels = query?.modelRefs
|
|
425
|
+
? query.modelRefs
|
|
426
|
+
.map((modelRef) => findModelDefinition(models, modelRef))
|
|
427
|
+
.filter((model): model is ModelDefinition => model != null)
|
|
428
|
+
: models;
|
|
429
|
+
|
|
430
|
+
const records = selectedModels
|
|
431
|
+
.map((model) => buildModelBenchmark(model, deps))
|
|
432
|
+
.filter((record): record is ProviderApiBenchmarkRecord => record != null)
|
|
433
|
+
.sort((a, b) => {
|
|
434
|
+
const scoreA = a.compositeScore ?? -1;
|
|
435
|
+
const scoreB = b.compositeScore ?? -1;
|
|
436
|
+
if (scoreA !== scoreB) return scoreB - scoreA;
|
|
437
|
+
return a.registryKey.localeCompare(b.registryKey);
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
return typeof query?.limit === 'number' ? records.slice(0, query.limit) : records;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
function buildCatalogRefreshResult(deps: ProviderApiDependencies): ProviderApiCatalogRefreshResult {
|
|
444
|
+
const models = deps.providerRegistry.getCatalogModelDefinitions();
|
|
445
|
+
return {
|
|
446
|
+
modelCount: models.length,
|
|
447
|
+
providerCount: new Set(models.map((model) => model.provider)).size,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
export function createProviderApi(deps: ProviderApiDependencies): ProviderApi {
|
|
452
|
+
return {
|
|
453
|
+
listProviderIds(): readonly string[] {
|
|
454
|
+
return deps.providerRegistry
|
|
455
|
+
.listProviders()
|
|
456
|
+
.map((provider) => provider.name)
|
|
457
|
+
.slice()
|
|
458
|
+
.sort((a, b) => a.localeCompare(b));
|
|
459
|
+
},
|
|
460
|
+
|
|
461
|
+
async getCurrentModel(): Promise<ProviderApiModelRecord> {
|
|
462
|
+
const currentModel = deps.providerRegistry.getCurrentModel();
|
|
463
|
+
const favorites = cloneFavoritesData(await deps.favoritesStore.load());
|
|
464
|
+
return buildModelRecord(currentModel, currentModel, favorites, deps);
|
|
465
|
+
},
|
|
466
|
+
|
|
467
|
+
async listModels(query?: ProviderApiModelQuery): Promise<readonly ProviderApiModelRecord[]> {
|
|
468
|
+
const currentModel = deps.providerRegistry.getCurrentModel();
|
|
469
|
+
const favorites = cloneFavoritesData(await deps.favoritesStore.load());
|
|
470
|
+
const models = deps.providerRegistry.listModels().map((model) =>
|
|
471
|
+
buildModelRecord(model, currentModel, favorites, deps),
|
|
472
|
+
);
|
|
473
|
+
return applyModelQuery(models, query);
|
|
474
|
+
},
|
|
475
|
+
|
|
476
|
+
async selectModel(modelRef: string): Promise<ProviderApiModelRecord> {
|
|
477
|
+
deps.providerRegistry.setCurrentModel(modelRef);
|
|
478
|
+
return await this.getCurrentModel();
|
|
479
|
+
},
|
|
480
|
+
|
|
481
|
+
async registerDiscoveredProviders(servers: readonly DiscoveredServer[]): Promise<void> {
|
|
482
|
+
deps.providerRegistry.registerDiscoveredProviders([...servers]);
|
|
483
|
+
},
|
|
484
|
+
|
|
485
|
+
async refreshCatalog(): Promise<ProviderApiCatalogRefreshResult> {
|
|
486
|
+
await deps.providerRegistry.refreshCatalog();
|
|
487
|
+
return buildCatalogRefreshResult(deps);
|
|
488
|
+
},
|
|
489
|
+
|
|
490
|
+
async refreshBenchmarks(): Promise<number> {
|
|
491
|
+
await deps.benchmarkStore.refreshBenchmarks();
|
|
492
|
+
return (await buildBenchmarkRecords(deps)).length;
|
|
493
|
+
},
|
|
494
|
+
|
|
495
|
+
async refreshModelLimits(): Promise<number> {
|
|
496
|
+
return await deps.providerRegistry.refreshModelLimits();
|
|
497
|
+
},
|
|
498
|
+
|
|
499
|
+
async getFavorites(): Promise<ProviderApiFavoritesSnapshot> {
|
|
500
|
+
return await loadFavoritesSnapshot(deps);
|
|
501
|
+
},
|
|
502
|
+
|
|
503
|
+
async pinModel(modelRef: string): Promise<ProviderApiFavoritesSnapshot> {
|
|
504
|
+
const model = resolveModelOrThrow(deps, modelRef);
|
|
505
|
+
await deps.favoritesStore.pinModel(model.id);
|
|
506
|
+
return await loadFavoritesSnapshot(deps);
|
|
507
|
+
},
|
|
508
|
+
|
|
509
|
+
async unpinModel(modelRef: string): Promise<ProviderApiFavoritesSnapshot> {
|
|
510
|
+
const modelId = await resolvePinnedModelIdOrThrow(deps, modelRef);
|
|
511
|
+
await deps.favoritesStore.unpinModel(modelId);
|
|
512
|
+
return await loadFavoritesSnapshot(deps);
|
|
513
|
+
},
|
|
514
|
+
|
|
515
|
+
async recordModelUsage(modelRef: string): Promise<ProviderApiFavoritesSnapshot> {
|
|
516
|
+
const model = resolveModelOrThrow(deps, modelRef);
|
|
517
|
+
await deps.favoritesStore.recordUsage(model.id);
|
|
518
|
+
return await loadFavoritesSnapshot(deps);
|
|
519
|
+
},
|
|
520
|
+
|
|
521
|
+
async listBenchmarks(query?: ProviderApiBenchmarkQuery): Promise<readonly ProviderApiBenchmarkRecord[]> {
|
|
522
|
+
return await buildBenchmarkRecords(deps, query);
|
|
523
|
+
},
|
|
524
|
+
|
|
525
|
+
async queryRuntimeMetadata(query: ProviderApiRuntimeQuery): Promise<ProviderApiRuntimeQueryResult> {
|
|
526
|
+
if (query.scope === 'all') {
|
|
527
|
+
return {
|
|
528
|
+
scope: 'all',
|
|
529
|
+
snapshots: await listProviderRuntimeSnapshots(deps.providerRegistry),
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
if (query.scope === 'provider') {
|
|
533
|
+
return {
|
|
534
|
+
scope: 'provider',
|
|
535
|
+
snapshot: await getProviderRuntimeSnapshot(deps.providerRegistry, query.providerId),
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
return {
|
|
539
|
+
scope: 'usage',
|
|
540
|
+
snapshot: await getProviderUsageSnapshot(deps.providerRegistry, query.providerId),
|
|
541
|
+
};
|
|
542
|
+
},
|
|
543
|
+
|
|
544
|
+
createHelperModel(configManager: HelperModelDeps['configManager']): HelperModel {
|
|
545
|
+
return new HelperModel({
|
|
546
|
+
configManager,
|
|
547
|
+
providerRegistry: deps.providerRegistry,
|
|
548
|
+
});
|
|
549
|
+
},
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
export type { ProviderRuntimeSnapshot, ProviderUsageSnapshot };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ModelDefinition } from './registry-types.ts';
|
|
2
|
+
|
|
3
|
+
export function withRegistryKey(model: ModelDefinition): ModelDefinition {
|
|
4
|
+
return model.registryKey ? model : { ...model, registryKey: `${model.provider}:${model.id}` };
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function splitModelRegistryKey(modelId: string): { providerId: string; resolvedModelId: string } {
|
|
8
|
+
if (!modelId.includes(':')) {
|
|
9
|
+
return { providerId: modelId, resolvedModelId: modelId };
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return {
|
|
13
|
+
providerId: modelId.split(':')[0] ?? 'unknown',
|
|
14
|
+
resolvedModelId: modelId.split(':').slice(1).join(':'),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function getBaseModelId(modelId: string): string {
|
|
19
|
+
return modelId.includes(':') ? modelId.split(':').slice(1).join(':') : modelId;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Key-order-independent JSON serialisation used for model diff comparisons.
|
|
24
|
+
* Recursively sorts object keys so that { a: 1, b: 2 } and { b: 2, a: 1 }
|
|
25
|
+
* produce the same string.
|
|
26
|
+
*/
|
|
27
|
+
export function stableStringify(value: unknown): string {
|
|
28
|
+
if (value === null || typeof value !== 'object') return JSON.stringify(value);
|
|
29
|
+
if (Array.isArray(value)) return '[' + value.map(stableStringify).join(',') + ']';
|
|
30
|
+
const sorted = Object.keys(value as Record<string, unknown>).sort();
|
|
31
|
+
return '{' + sorted.map((key) => (
|
|
32
|
+
JSON.stringify(key) + ':' + stableStringify((value as Record<string, unknown>)[key])
|
|
33
|
+
)).join(',') + '}';
|
|
34
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { ModelDefinition } from './registry-types.ts';
|
|
2
|
+
import { splitModelRegistryKey, withRegistryKey } from './registry-helpers.ts';
|
|
3
|
+
|
|
4
|
+
export function getProviderLookupCandidates(
|
|
5
|
+
providerName: string,
|
|
6
|
+
aliases: Readonly<Record<string, string>>,
|
|
7
|
+
): string[] {
|
|
8
|
+
const candidates = new Set<string>([providerName]);
|
|
9
|
+
const directAlias = aliases[providerName];
|
|
10
|
+
if (directAlias) candidates.add(directAlias);
|
|
11
|
+
for (const [catalogName, registeredName] of Object.entries(aliases)) {
|
|
12
|
+
if (registeredName === providerName) candidates.add(catalogName);
|
|
13
|
+
if (directAlias && registeredName === directAlias) candidates.add(catalogName);
|
|
14
|
+
}
|
|
15
|
+
return [...candidates];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function findModelDefinition(
|
|
19
|
+
modelId: string,
|
|
20
|
+
registry: readonly ModelDefinition[],
|
|
21
|
+
): ModelDefinition | undefined {
|
|
22
|
+
if (modelId.includes(':')) {
|
|
23
|
+
return registry.find((model) => model.registryKey === modelId) ?? registry.find((model) => model.id === modelId);
|
|
24
|
+
}
|
|
25
|
+
return registry.find((model) => model.id === modelId);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function findModelDefinitionForProvider(
|
|
29
|
+
modelId: string,
|
|
30
|
+
providerName: string,
|
|
31
|
+
registry: readonly ModelDefinition[],
|
|
32
|
+
aliases: Readonly<Record<string, string>>,
|
|
33
|
+
): ModelDefinition | undefined {
|
|
34
|
+
const providerCandidates = new Set(getProviderLookupCandidates(providerName, aliases));
|
|
35
|
+
const resolvedModelId = modelId.includes(':') ? splitModelRegistryKey(modelId).resolvedModelId : modelId;
|
|
36
|
+
const registryMatch = modelId.includes(':')
|
|
37
|
+
? findModelDefinition(modelId, registry)
|
|
38
|
+
: undefined;
|
|
39
|
+
|
|
40
|
+
if (registryMatch && providerCandidates.has(registryMatch.provider)) {
|
|
41
|
+
return registryMatch;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return registry.find((model) => model.id === resolvedModelId && providerCandidates.has(model.provider));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function buildModelRegistry(input: {
|
|
48
|
+
readonly customModels: readonly ModelDefinition[];
|
|
49
|
+
readonly runtimeModels: readonly ModelDefinition[];
|
|
50
|
+
readonly syntheticModels: readonly ModelDefinition[];
|
|
51
|
+
readonly catalogModels: readonly ModelDefinition[];
|
|
52
|
+
readonly discoveredModels: readonly ModelDefinition[];
|
|
53
|
+
readonly suppressedCatalogIds: ReadonlySet<string>;
|
|
54
|
+
}): ModelDefinition[] {
|
|
55
|
+
const catalogFiltered = input.catalogModels.filter(
|
|
56
|
+
(builtin) =>
|
|
57
|
+
!input.customModels.some((model) => model.id === builtin.id) &&
|
|
58
|
+
!input.runtimeModels.some((model) => model.id === builtin.id) &&
|
|
59
|
+
!input.suppressedCatalogIds.has(builtin.id) &&
|
|
60
|
+
!builtin.id.startsWith('hf:'),
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
const discoveredFiltered = input.discoveredModels.filter(
|
|
64
|
+
(discovered) =>
|
|
65
|
+
!input.catalogModels.some((model) => model.id === discovered.id) &&
|
|
66
|
+
!input.customModels.some((model) => model.id === discovered.id) &&
|
|
67
|
+
!input.runtimeModels.some((model) => model.id === discovered.id),
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
return [
|
|
71
|
+
...input.customModels.map(withRegistryKey),
|
|
72
|
+
...input.runtimeModels.map(withRegistryKey),
|
|
73
|
+
...input.syntheticModels.map(withRegistryKey),
|
|
74
|
+
...catalogFiltered.map(withRegistryKey),
|
|
75
|
+
...discoveredFiltered.map(withRegistryKey),
|
|
76
|
+
];
|
|
77
|
+
}
|