@pellux/goodvibes-tui 0.18.11 → 0.18.13
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/CHANGELOG.md +72 -0
- package/README.md +1 -1
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +2 -2
- package/src/config/index.ts +1 -138
- package/src/config/subscription-providers.ts +1 -127
- package/src/core/conversation-rendering.ts +5 -5
- package/src/core/conversation.ts +177 -424
- package/src/core/history.ts +45 -0
- package/src/core/orchestrator.ts +3 -733
- package/src/core/system-message-router.ts +19 -58
- package/src/input/command-registry.ts +3 -3
- package/src/input/commands/session-content.ts +2 -2
- package/src/input/commands/session-workflow.ts +1 -1
- package/src/input/handler-content-actions.ts +2 -2
- package/src/input/handler-feed.ts +2 -2
- package/src/input/handler-modal-token-routes.ts +1 -1
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +1 -1
- package/src/input/search.ts +1 -1
- package/src/input/selection.ts +2 -2
- package/src/input/session-picker-modal.ts +1 -1
- package/src/main.ts +1 -1
- package/src/panels/agent-inspector-panel.ts +3 -3
- package/src/panels/agent-logs-panel.ts +3 -3
- package/src/panels/approval-panel.ts +2 -2
- package/src/panels/automation-control-panel.ts +3 -3
- package/src/panels/base-panel.ts +14 -14
- package/src/panels/builtin/agent.ts +1 -0
- package/src/panels/builtin/operations.ts +2 -1
- package/src/panels/builtin/session.ts +2 -2
- package/src/panels/builtin/shared.ts +5 -5
- package/src/panels/cockpit-panel.ts +2 -2
- package/src/panels/communication-panel.ts +3 -3
- package/src/panels/context-visualizer-panel.ts +6 -3
- package/src/panels/control-plane-panel.ts +3 -3
- package/src/panels/cost-tracker-panel.ts +3 -3
- package/src/panels/debug-panel.ts +2 -2
- package/src/panels/diff-panel.ts +2 -2
- package/src/panels/docs-panel.ts +1 -1
- package/src/panels/eval-panel.ts +2 -2
- package/src/panels/file-explorer-panel.ts +3 -3
- package/src/panels/file-preview-panel.ts +3 -3
- package/src/panels/forensics-panel.ts +2 -2
- package/src/panels/git-panel.ts +1 -1
- package/src/panels/hooks-panel.ts +3 -3
- package/src/panels/incident-review-panel.ts +1 -1
- package/src/panels/intelligence-panel.ts +2 -2
- package/src/panels/knowledge-panel.ts +1 -1
- package/src/panels/local-auth-panel.ts +2 -2
- package/src/panels/marketplace-panel.ts +1 -1
- package/src/panels/mcp-panel.ts +3 -3
- package/src/panels/memory-panel.ts +1 -1
- package/src/panels/ops-control-panel.ts +3 -3
- package/src/panels/ops-strategy-panel.ts +2 -2
- package/src/panels/orchestration-panel.ts +2 -2
- package/src/panels/panel-list-panel.ts +6 -6
- package/src/panels/plan-dashboard-panel.ts +1 -1
- package/src/panels/plugins-panel.ts +2 -2
- package/src/panels/policy-panel.ts +2 -2
- package/src/panels/polish.ts +3 -3
- package/src/panels/provider-accounts-panel.ts +2 -2
- package/src/panels/provider-health-domains.ts +5 -1
- package/src/panels/provider-health-panel.ts +7 -3
- package/src/panels/provider-stats-panel.ts +3 -3
- package/src/panels/remote-panel.ts +3 -3
- package/src/panels/routes-panel.ts +3 -3
- package/src/panels/sandbox-panel.ts +2 -2
- package/src/panels/schedule-panel.ts +1 -1
- package/src/panels/security-panel.ts +2 -2
- package/src/panels/services-panel.ts +2 -2
- package/src/panels/session-browser-panel.ts +3 -3
- package/src/panels/settings-sync-panel.ts +2 -2
- package/src/panels/skills-panel.ts +6 -6
- package/src/panels/subscription-panel.ts +2 -2
- package/src/panels/symbol-outline-panel.ts +3 -3
- package/src/panels/system-messages-panel.ts +4 -4
- package/src/panels/tasks-panel.ts +2 -2
- package/src/panels/thinking-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +7 -3
- package/src/panels/tool-inspector-panel.ts +3 -3
- package/src/panels/types.ts +5 -5
- package/src/panels/watchers-panel.ts +3 -3
- package/src/panels/welcome-panel.ts +1 -1
- package/src/panels/worktree-panel.ts +2 -2
- package/src/panels/wrfc-panel.ts +3 -3
- package/src/permissions/prompt.ts +3 -22
- package/src/plugins/loader.ts +15 -304
- package/src/renderer/agent-detail-modal.ts +1 -1
- package/src/renderer/autocomplete-overlay.ts +2 -2
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/bottom-bar.ts +2 -2
- package/src/renderer/buffer.ts +1 -1
- package/src/renderer/code-block.ts +2 -2
- package/src/renderer/compositor.ts +2 -2
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +1 -1
- package/src/renderer/conversation-surface.ts +2 -2
- package/src/renderer/diff-view.ts +2 -2
- package/src/renderer/diff.ts +1 -1
- package/src/renderer/file-picker-overlay.ts +2 -2
- package/src/renderer/file-tree.ts +2 -2
- package/src/renderer/help-overlay.ts +1 -1
- package/src/renderer/history-search-overlay.ts +2 -2
- package/src/renderer/live-tail-modal.ts +1 -1
- package/src/renderer/markdown.ts +2 -2
- package/src/renderer/modal-factory.ts +3 -3
- package/src/renderer/model-picker-overlay.ts +2 -2
- package/src/renderer/overlay-box.ts +2 -2
- package/src/renderer/panel-composite.ts +1 -1
- package/src/renderer/panel-picker-overlay.ts +2 -2
- package/src/renderer/panel-tab-bar.ts +1 -1
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +2 -2
- package/src/renderer/process-modal.ts +1 -1
- package/src/renderer/profile-picker-modal.ts +2 -2
- package/src/renderer/progress.ts +2 -2
- package/src/renderer/search-overlay.ts +2 -2
- package/src/renderer/selection-modal-overlay.ts +2 -2
- package/src/renderer/session-picker-modal.ts +2 -2
- package/src/renderer/settings-modal.ts +2 -2
- package/src/renderer/shell-surface.ts +1 -1
- package/src/renderer/system-message.ts +1 -1
- package/src/renderer/tab-strip.ts +2 -2
- package/src/renderer/text-layout.ts +1 -1
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +2 -2
- package/src/renderer/ui-factory.ts +2 -2
- package/src/runtime/bootstrap-command-context.ts +7 -8
- package/src/runtime/bootstrap-command-parts.ts +4 -6
- package/src/runtime/bootstrap-core.ts +5 -4
- package/src/runtime/bootstrap-hook-bridge.ts +16 -175
- package/src/runtime/bootstrap-shell.ts +5 -5
- package/src/runtime/bootstrap.ts +6 -5
- package/src/runtime/context.ts +4 -20
- package/src/runtime/diagnostics/panels/index.ts +1 -1
- package/src/runtime/diagnostics/panels/ops.ts +1 -1
- package/src/runtime/diagnostics/panels/panel-resources.ts +118 -0
- package/src/runtime/perf/panel-contracts.ts +32 -0
- package/src/runtime/perf/panel-health-monitor.ts +18 -0
- package/src/runtime/services.ts +6 -6
- package/src/runtime/store/domains/conversation.ts +1 -181
- package/src/runtime/store/domains/permissions.ts +1 -143
- package/src/runtime/store/helpers/reducers/conversation.ts +1 -228
- package/src/runtime/store/helpers/reducers/lifecycle.ts +1 -440
- package/src/runtime/store/selectors/index.ts +11 -6
- package/src/runtime/store/state.ts +12 -4
- package/src/runtime/ui-read-models-observability-security.ts +2 -2
- package/src/runtime/ui-read-models-observability-system.ts +1 -1
- package/src/runtime/ui-service-queries.ts +1 -1
- package/src/runtime/ui-services.ts +1 -1
- package/src/shell/ui-openers.ts +1 -1
- package/src/tools/index.ts +1 -186
- package/src/types/grid.ts +48 -0
- package/src/utils/clipboard.ts +21 -0
- package/src/utils/splash-lines.ts +1 -1
- package/src/utils/terminal-width.ts +185 -0
- package/src/version.ts +1 -1
- package/src/acp/connection.ts +0 -447
- package/src/acp/index.ts +0 -7
- package/src/acp/manager.ts +0 -1
- package/src/adapters/bluebubbles/index.ts +0 -127
- package/src/adapters/discord/index.ts +0 -297
- package/src/adapters/github/index.ts +0 -73
- package/src/adapters/google-chat/index.ts +0 -119
- package/src/adapters/imessage/index.ts +0 -92
- package/src/adapters/index.ts +0 -15
- package/src/adapters/matrix/index.ts +0 -116
- package/src/adapters/mattermost/index.ts +0 -151
- package/src/adapters/msteams/index.ts +0 -180
- package/src/adapters/ntfy/index.ts +0 -118
- package/src/adapters/signal/index.ts +0 -92
- package/src/adapters/slack/index.ts +0 -323
- package/src/adapters/telegram/index.ts +0 -160
- package/src/adapters/types.ts +0 -97
- package/src/adapters/webhook/index.ts +0 -178
- package/src/adapters/whatsapp/index.ts +0 -135
- package/src/agents/message-bus-core.ts +0 -312
- package/src/agents/message-bus.ts +0 -2
- package/src/agents/orchestrator-prompts.ts +0 -351
- package/src/agents/orchestrator-runner.ts +0 -668
- package/src/agents/orchestrator.ts +0 -438
- package/src/agents/session.ts +0 -108
- package/src/agents/worktree.ts +0 -153
- package/src/agents/wrfc-config.ts +0 -47
- package/src/agents/wrfc-controller.ts +0 -747
- package/src/agents/wrfc-gate-runtime.ts +0 -75
- package/src/agents/wrfc-reporting.ts +0 -284
- package/src/agents/wrfc-runtime-events.ts +0 -150
- package/src/agents/wrfc-types.ts +0 -67
- package/src/automation/delivery-manager.ts +0 -368
- package/src/automation/index.ts +0 -72
- package/src/automation/manager-runtime-delivery.ts +0 -139
- package/src/automation/manager-runtime-events.ts +0 -131
- package/src/automation/manager-runtime-execution.ts +0 -511
- package/src/automation/manager-runtime-helpers.ts +0 -433
- package/src/automation/manager-runtime-job-mutations.ts +0 -175
- package/src/automation/manager-runtime-reconcile.ts +0 -148
- package/src/automation/manager-runtime-scheduling.ts +0 -189
- package/src/automation/manager-runtime-sync.ts +0 -54
- package/src/automation/manager-runtime.ts +0 -721
- package/src/automation/manager.ts +0 -10
- package/src/automation/service.ts +0 -242
- package/src/channels/builtin/account-actions.ts +0 -490
- package/src/channels/builtin/accounts.ts +0 -433
- package/src/channels/builtin/contracts.ts +0 -405
- package/src/channels/builtin/plugins.ts +0 -308
- package/src/channels/builtin/rendering.ts +0 -174
- package/src/channels/builtin/setup-schema.ts +0 -504
- package/src/channels/builtin/shared.ts +0 -96
- package/src/channels/builtin/surfaces.ts +0 -57
- package/src/channels/builtin/targets.ts +0 -693
- package/src/channels/builtin-runtime.ts +0 -443
- package/src/channels/delivery/shared.ts +0 -199
- package/src/channels/delivery/strategies-bridge.ts +0 -246
- package/src/channels/delivery/strategies-core.ts +0 -299
- package/src/channels/delivery/strategies-enterprise.ts +0 -178
- package/src/channels/delivery/types.ts +0 -59
- package/src/channels/delivery-router.ts +0 -127
- package/src/channels/index.ts +0 -77
- package/src/channels/plugin-registry.ts +0 -551
- package/src/channels/provider-runtime.ts +0 -330
- package/src/channels/reply-pipeline.ts +0 -522
- package/src/channels/route-manager.ts +0 -340
- package/src/channels/surface-registry.ts +0 -186
- package/src/config/helper-model.ts +0 -1
- package/src/config/manager.ts +0 -8
- package/src/config/subscription-auth.ts +0 -31
- package/src/config/tool-llm.ts +0 -110
- package/src/control-plane/approval-broker.ts +0 -351
- package/src/control-plane/gateway.ts +0 -1
- package/src/control-plane/index.ts +0 -54
- package/src/control-plane/media-contract-schemas.ts +0 -1
- package/src/control-plane/method-catalog-admin.ts +0 -1
- package/src/control-plane/method-catalog-channels.ts +0 -1
- package/src/control-plane/method-catalog-control-automation.ts +0 -1
- package/src/control-plane/method-catalog-control-core.ts +0 -1
- package/src/control-plane/method-catalog-control.ts +0 -1
- package/src/control-plane/method-catalog-events.ts +0 -1
- package/src/control-plane/method-catalog-knowledge.ts +0 -1
- package/src/control-plane/method-catalog-media.ts +0 -1
- package/src/control-plane/method-catalog-runtime.ts +0 -1
- package/src/control-plane/method-catalog-shared.ts +0 -1
- package/src/control-plane/method-catalog.ts +0 -1
- package/src/control-plane/operator-contract-schemas-admin.ts +0 -1
- package/src/control-plane/operator-contract-schemas-channels.ts +0 -1
- package/src/control-plane/operator-contract-schemas-control.ts +0 -1
- package/src/control-plane/operator-contract-schemas-domains.ts +0 -1
- package/src/control-plane/operator-contract-schemas-knowledge.ts +0 -1
- package/src/control-plane/operator-contract-schemas-media.ts +0 -1
- package/src/control-plane/operator-contract-schemas-permissions.ts +0 -1
- package/src/control-plane/operator-contract-schemas-remote.ts +0 -1
- package/src/control-plane/operator-contract-schemas-runtime.ts +0 -1
- package/src/control-plane/operator-contract-schemas-shared.ts +0 -1
- package/src/control-plane/operator-contract-schemas-telemetry.ts +0 -1
- package/src/control-plane/operator-contract-schemas.ts +0 -1
- package/src/control-plane/operator-contract.ts +0 -165
- package/src/control-plane/session-broker.ts +0 -780
- package/src/core/compaction-sections.ts +0 -492
- package/src/core/compaction-types.ts +0 -147
- package/src/core/context-compaction.ts +0 -542
- package/src/core/conversation-compaction.ts +0 -68
- package/src/core/conversation-diff.ts +0 -55
- package/src/core/conversation-utils.ts +0 -72
- package/src/core/event-replay.ts +0 -287
- package/src/core/orchestrator-context-runtime.ts +0 -407
- package/src/core/orchestrator-follow-up-runtime.ts +0 -134
- package/src/core/orchestrator-runtime.ts +0 -132
- package/src/core/orchestrator-tool-runtime.ts +0 -468
- package/src/core/orchestrator-turn-helpers.ts +0 -355
- package/src/core/orchestrator-turn-loop.ts +0 -443
- package/src/core/plan-command-handler.ts +0 -169
- package/src/core/transcript-events/classify.ts +0 -95
- package/src/core/transcript-events/index.ts +0 -15
- package/src/daemon/control-plane.ts +0 -522
- package/src/daemon/facade-composition.ts +0 -398
- package/src/daemon/facade.ts +0 -638
- package/src/daemon/helpers.ts +0 -74
- package/src/daemon/http/router-route-contexts.ts +0 -370
- package/src/daemon/http/router.ts +0 -531
- package/src/daemon/http-listener.ts +0 -301
- package/src/daemon/index.ts +0 -1
- package/src/daemon/server.ts +0 -1
- package/src/daemon/service-manager.ts +0 -413
- package/src/daemon/surface-actions.ts +0 -183
- package/src/daemon/surface-delivery.ts +0 -530
- package/src/daemon/surface-policy.ts +0 -60
- package/src/daemon/transport-events.ts +0 -110
- package/src/daemon/types.ts +0 -191
- package/src/export/markdown.ts +0 -213
- package/src/export/session-export.ts +0 -1
- package/src/git/index.ts +0 -1
- package/src/git/service.ts +0 -414
- package/src/hooks/chain-engine.ts +0 -414
- package/src/hooks/dispatcher.ts +0 -414
- package/src/hooks/hook-api.ts +0 -170
- package/src/hooks/index.ts +0 -48
- package/src/hooks/runners/agent.ts +0 -93
- package/src/hooks/runners/prompt.ts +0 -69
- package/src/hooks/workbench.ts +0 -360
- package/src/integrations/index.ts +0 -42
- package/src/integrations/notifier.ts +0 -206
- package/src/integrations/webhooks.ts +0 -1
- package/src/knowledge/consolidation.ts +0 -346
- package/src/knowledge/graphql.ts +0 -324
- package/src/knowledge/index.ts +0 -60
- package/src/knowledge/ingest-compile.ts +0 -386
- package/src/knowledge/ingest-context.ts +0 -18
- package/src/knowledge/ingest-inputs.ts +0 -387
- package/src/knowledge/ingest.ts +0 -1
- package/src/knowledge/internal.ts +0 -257
- package/src/knowledge/knowledge-api.ts +0 -432
- package/src/knowledge/lint.ts +0 -121
- package/src/knowledge/memory-sync.ts +0 -62
- package/src/knowledge/packet.ts +0 -370
- package/src/knowledge/scheduling.ts +0 -283
- package/src/knowledge/service.ts +0 -715
- package/src/mcp/client.ts +0 -383
- package/src/mcp/index.ts +0 -12
- package/src/mcp/mcp-api.ts +0 -90
- package/src/mcp/registry.ts +0 -1
- package/src/media/builtin-image-understanding.ts +0 -303
- package/src/media/builtin-providers.ts +0 -26
- package/src/media/index.ts +0 -18
- package/src/multimodal/index.ts +0 -13
- package/src/multimodal/service.ts +0 -492
- package/src/permissions/briefs/build.ts +0 -88
- package/src/permissions/manager.ts +0 -1
- package/src/plugins/api.ts +0 -383
- package/src/plugins/manager.ts +0 -481
- package/src/profiles/shape.ts +0 -58
- package/src/providers/amazon-bedrock-mantle.ts +0 -50
- package/src/providers/amazon-bedrock.ts +0 -61
- package/src/providers/anthropic-compat.ts +0 -373
- package/src/providers/anthropic-sdk-provider.ts +0 -230
- package/src/providers/anthropic-vertex.ts +0 -59
- package/src/providers/anthropic.ts +0 -469
- package/src/providers/auto-register.ts +0 -417
- package/src/providers/builtin-catalog.ts +0 -326
- package/src/providers/builtin-registry.ts +0 -575
- package/src/providers/cache-planner.ts +0 -258
- package/src/providers/capabilities.ts +0 -1
- package/src/providers/custom-loader.ts +0 -425
- package/src/providers/discovered-compat.ts +0 -7
- package/src/providers/discovered-factory.ts +0 -61
- package/src/providers/discovered-traits.ts +0 -138
- package/src/providers/gemini.ts +0 -462
- package/src/providers/github-copilot.ts +0 -254
- package/src/providers/index.ts +0 -1
- package/src/providers/interface.ts +0 -185
- package/src/providers/llama-cpp.ts +0 -402
- package/src/providers/lm-studio-helpers.ts +0 -367
- package/src/providers/lm-studio.ts +0 -484
- package/src/providers/model-catalog-cache.ts +0 -221
- package/src/providers/model-catalog-notifications.ts +0 -97
- package/src/providers/model-catalog-synthetic.ts +0 -202
- package/src/providers/model-catalog.ts +0 -211
- package/src/providers/model-limits.ts +0 -1
- package/src/providers/ollama.ts +0 -469
- package/src/providers/openai-codex.ts +0 -472
- package/src/providers/openai-compat.ts +0 -615
- package/src/providers/openai.ts +0 -231
- package/src/providers/optimizer.ts +0 -1
- package/src/providers/provider-api.ts +0 -1
- package/src/providers/registry-helpers.ts +0 -34
- package/src/providers/registry-models.ts +0 -77
- package/src/providers/registry-types.ts +0 -67
- package/src/providers/registry.ts +0 -1
- package/src/providers/runtime-metadata.ts +0 -149
- package/src/providers/runtime-snapshot.ts +0 -130
- package/src/providers/synthetic.ts +0 -561
- package/src/providers/tier-prompts.ts +0 -84
- package/src/providers/tool-formats.ts +0 -414
- package/src/runtime/auth/inspection.ts +0 -125
- package/src/runtime/bootstrap-background.ts +0 -157
- package/src/runtime/bootstrap-helpers.ts +0 -88
- package/src/runtime/bootstrap-runtime-events.ts +0 -254
- package/src/runtime/bootstrap-services.ts +0 -197
- package/src/runtime/compaction/index.ts +0 -1
- package/src/runtime/compaction/lifecycle.ts +0 -1
- package/src/runtime/compaction/manager.ts +0 -474
- package/src/runtime/compaction/quality-score.ts +0 -1
- package/src/runtime/compaction/resume-repair.ts +0 -1
- package/src/runtime/compaction/strategies/autocompact.ts +0 -1
- package/src/runtime/compaction/strategies/boundary-commit.ts +0 -1
- package/src/runtime/compaction/strategies/collapse.ts +0 -1
- package/src/runtime/compaction/strategies/index.ts +0 -1
- package/src/runtime/compaction/strategies/microcompact.ts +0 -1
- package/src/runtime/compaction/strategies/reactive.ts +0 -1
- package/src/runtime/compaction/types.ts +0 -1
- package/src/runtime/ecosystem/recommendations.ts +0 -117
- package/src/runtime/emitters/agents.ts +0 -96
- package/src/runtime/emitters/automation.ts +0 -112
- package/src/runtime/emitters/communication.ts +0 -53
- package/src/runtime/emitters/compaction.ts +0 -161
- package/src/runtime/emitters/control-plane.ts +0 -65
- package/src/runtime/emitters/deliveries.ts +0 -65
- package/src/runtime/emitters/forensics.ts +0 -17
- package/src/runtime/emitters/index.ts +0 -59
- package/src/runtime/emitters/knowledge.ts +0 -129
- package/src/runtime/emitters/mcp.ts +0 -95
- package/src/runtime/emitters/ops.ts +0 -163
- package/src/runtime/emitters/orchestration.ts +0 -87
- package/src/runtime/emitters/permissions.ts +0 -98
- package/src/runtime/emitters/planner.ts +0 -23
- package/src/runtime/emitters/plugins.ts +0 -78
- package/src/runtime/emitters/providers.ts +0 -30
- package/src/runtime/emitters/routes.ts +0 -57
- package/src/runtime/emitters/security.ts +0 -53
- package/src/runtime/emitters/session.ts +0 -93
- package/src/runtime/emitters/surfaces.ts +0 -57
- package/src/runtime/emitters/tasks.ts +0 -69
- package/src/runtime/emitters/tools.ts +0 -140
- package/src/runtime/emitters/transport.ts +0 -78
- package/src/runtime/emitters/turn.ts +0 -155
- package/src/runtime/emitters/ui.ts +0 -57
- package/src/runtime/emitters/watchers.ts +0 -57
- package/src/runtime/emitters/workflows.ts +0 -79
- package/src/runtime/eval/index.ts +0 -48
- package/src/runtime/eval/runner.ts +0 -163
- package/src/runtime/eval/suites.ts +0 -264
- package/src/runtime/events/domain-map.ts +0 -148
- package/src/runtime/events/index.ts +0 -1
- package/src/runtime/events/turn.ts +0 -1
- package/src/runtime/events/workflows.ts +0 -1
- package/src/runtime/forensics/collector.ts +0 -693
- package/src/runtime/forensics/index.ts +0 -23
- package/src/runtime/foundation-clients.ts +0 -78
- package/src/runtime/foundation-services.ts +0 -96
- package/src/runtime/guidance.ts +0 -183
- package/src/runtime/health/effect-handlers.ts +0 -189
- package/src/runtime/health/index.ts +0 -70
- package/src/runtime/health/wiring.ts +0 -115
- package/src/runtime/integration/helpers.ts +0 -640
- package/src/runtime/lifecycle.ts +0 -107
- package/src/runtime/mcp/index.ts +0 -68
- package/src/runtime/mcp/manager.ts +0 -513
- package/src/runtime/network/inbound.ts +0 -131
- package/src/runtime/network/index.ts +0 -30
- package/src/runtime/network/outbound.ts +0 -292
- package/src/runtime/network/shared.ts +0 -82
- package/src/runtime/operator-client.ts +0 -235
- package/src/runtime/ops/control-plane.ts +0 -363
- package/src/runtime/ops/index.ts +0 -122
- package/src/runtime/ops/playbooks/index.ts +0 -10
- package/src/runtime/ops/playbooks/session-unrecoverable.ts +0 -196
- package/src/runtime/ops/playbooks/stuck-turn.ts +0 -197
- package/src/runtime/ops/runtime-context.ts +0 -100
- package/src/runtime/ops-api.ts +0 -27
- package/src/runtime/orchestration/spawn-policy.ts +0 -83
- package/src/runtime/peer-client.ts +0 -404
- package/src/runtime/perf/index.ts +0 -57
- package/src/runtime/perf/slo-collector.ts +0 -375
- package/src/runtime/permissions/index.ts +0 -190
- package/src/runtime/permissions/policy-runtime.ts +0 -1
- package/src/runtime/permissions/preflight.ts +0 -101
- package/src/runtime/permissions/rule-suggestions.ts +0 -36
- package/src/runtime/plugins/hot-reload.ts +0 -221
- package/src/runtime/plugins/index.ts +0 -84
- package/src/runtime/plugins/lifecycle.ts +0 -95
- package/src/runtime/plugins/manager.ts +0 -474
- package/src/runtime/plugins/manifest.ts +0 -167
- package/src/runtime/plugins/quarantine.ts +0 -202
- package/src/runtime/plugins/trust.ts +0 -291
- package/src/runtime/plugins/types.ts +0 -205
- package/src/runtime/provider-accounts/registry.ts +0 -326
- package/src/runtime/remote/distributed-runtime-contract-schemas.ts +0 -386
- package/src/runtime/remote/index.ts +0 -488
- package/src/runtime/remote/runner-registry.ts +0 -438
- package/src/runtime/remote/supervisor.ts +0 -70
- package/src/runtime/runtime-hook-api.ts +0 -5
- package/src/runtime/runtime-knowledge-api.ts +0 -14
- package/src/runtime/runtime-mcp-api.ts +0 -5
- package/src/runtime/runtime-ops-api.ts +0 -86
- package/src/runtime/runtime-provider-api.ts +0 -18
- package/src/runtime/session-maintenance.ts +0 -188
- package/src/runtime/session-persistence.ts +0 -288
- package/src/runtime/session-return-context.ts +0 -195
- package/src/runtime/settings/control-plane-store.ts +0 -258
- package/src/runtime/settings/control-plane.ts +0 -599
- package/src/runtime/shell-command-extensions.ts +0 -54
- package/src/runtime/shell-command-ops.ts +0 -207
- package/src/runtime/shell-command-platform.ts +0 -47
- package/src/runtime/shell-command-services.ts +0 -143
- package/src/runtime/shell-command-workspace.ts +0 -31
- package/src/runtime/tasks/adapters/acp-adapter.ts +0 -211
- package/src/runtime/tasks/adapters/agent-adapter.ts +0 -208
- package/src/runtime/tasks/adapters/index.ts +0 -16
- package/src/runtime/tasks/adapters/process-adapter.ts +0 -214
- package/src/runtime/tasks/adapters/scheduler-adapter.ts +0 -193
- package/src/runtime/tasks/index.ts +0 -68
- package/src/runtime/tasks/manager.ts +0 -415
- package/src/runtime/telemetry/api-helpers.ts +0 -517
- package/src/runtime/telemetry/api.ts +0 -768
- package/src/runtime/telemetry/index.ts +0 -178
- package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +0 -440
- package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +0 -200
- package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +0 -18
- package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +0 -204
- package/src/runtime/telemetry/instrumentation/domain-bridge.ts +0 -125
- package/src/runtime/telemetry/instrumentation/index.ts +0 -67
- package/src/runtime/tools/context.ts +0 -114
- package/src/runtime/tools/index.ts +0 -46
- package/src/runtime/tools/phased-executor.ts +0 -448
- package/src/runtime/tools/phases/budget.ts +0 -130
- package/src/runtime/tools/phases/execute.ts +0 -69
- package/src/runtime/tools/phases/index.ts +0 -13
- package/src/runtime/tools/phases/map-output.ts +0 -98
- package/src/runtime/tools/phases/permission.ts +0 -133
- package/src/runtime/tools/phases/posthook.ts +0 -57
- package/src/runtime/tools/phases/prehook.ts +0 -68
- package/src/runtime/tools/phases/validate.ts +0 -53
- package/src/runtime/transports/direct.ts +0 -73
- package/src/runtime/transports/http-helpers.ts +0 -218
- package/src/runtime/transports/http-types.ts +0 -364
- package/src/runtime/transports/http.ts +0 -629
- package/src/runtime/transports/realtime.ts +0 -50
- package/src/runtime/transports/remote-events.ts +0 -16
- package/src/runtime/transports/shared.ts +0 -39
- package/src/runtime/transports/ui-runtime-events.ts +0 -35
- package/src/runtime/ui-read-models-core.ts +0 -95
- package/src/runtime/ui-read-models-operations.ts +0 -203
- package/src/runtime/worktree/registry.ts +0 -252
- package/src/sessions/manager.ts +0 -14
- package/src/state/file-watcher.ts +0 -294
- package/src/state/index.ts +0 -56
- package/src/state/knowledge-injection.ts +0 -214
- package/src/state/memory-embedding-http.ts +0 -642
- package/src/state/memory-embeddings.ts +0 -312
- package/src/state/memory-ingest.ts +0 -132
- package/src/state/memory-registry.ts +0 -111
- package/src/state/memory-store-helpers.ts +0 -160
- package/src/state/memory-store.ts +0 -728
- package/src/state/memory-vector-store.ts +0 -418
- package/src/templates/manager.ts +0 -187
- package/src/tools/agent/index.ts +0 -610
- package/src/tools/agent/manager.ts +0 -476
- package/src/tools/analyze/git-modes.ts +0 -380
- package/src/tools/analyze/index.ts +0 -128
- package/src/tools/channel/agent-tools.ts +0 -16
- package/src/tools/channel/index.ts +0 -268
- package/src/tools/control/index.ts +0 -90
- package/src/tools/edit/core.ts +0 -619
- package/src/tools/edit/index.ts +0 -4
- package/src/tools/edit/phased.ts +0 -33
- package/src/tools/fetch/index.ts +0 -3
- package/src/tools/fetch/phased.ts +0 -34
- package/src/tools/fetch/runtime.ts +0 -499
- package/src/tools/mcp/index.ts +0 -190
- package/src/tools/remote-trigger/index.ts +0 -130
- package/src/tools/shared/auto-heal.ts +0 -282
- package/src/tools/state/index.ts +0 -688
- package/src/tools/web-search/index.ts +0 -38
- package/src/tools/write/index.ts +0 -604
- package/src/tools/write/phased.ts +0 -41
- package/src/types/generated/foundation-client-types.ts +0 -22
- package/src/watchers/index.ts +0 -11
- package/src/watchers/registry.ts +0 -517
- package/src/web-search/index.ts +0 -26
- package/src/web-search/provider-registry.ts +0 -64
- package/src/web-search/providers/brave.ts +0 -100
- package/src/web-search/providers/duckduckgo.ts +0 -270
- package/src/web-search/providers/exa.ts +0 -77
- package/src/web-search/providers/firecrawl.ts +0 -90
- package/src/web-search/providers/perplexity.ts +0 -86
- package/src/web-search/providers/searxng.ts +0 -88
- package/src/web-search/providers/shared.ts +0 -249
- package/src/web-search/providers/tavily.ts +0 -90
- package/src/web-search/service.ts +0 -142
package/src/providers/openai.ts
DELETED
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
import OpenAI from 'openai';
|
|
2
|
-
import type {
|
|
3
|
-
LLMProvider,
|
|
4
|
-
ChatRequest,
|
|
5
|
-
ChatResponse,
|
|
6
|
-
ProviderEmbeddingRequest,
|
|
7
|
-
ProviderEmbeddingResult,
|
|
8
|
-
ProviderRuntimeMetadata,
|
|
9
|
-
ProviderRuntimeMetadataDeps,
|
|
10
|
-
} from '@pellux/goodvibes-sdk/platform/providers/interface';
|
|
11
|
-
import { ProviderError } from '@pellux/goodvibes-sdk/platform/types/errors';
|
|
12
|
-
import { withRetry } from '@pellux/goodvibes-sdk/platform/utils/retry';
|
|
13
|
-
import {
|
|
14
|
-
toOpenAITools,
|
|
15
|
-
toOpenAIMessages,
|
|
16
|
-
fromOpenAIToolCalls,
|
|
17
|
-
extractTextToolCalls,
|
|
18
|
-
} from '@pellux/goodvibes-sdk/platform/providers/tool-formats';
|
|
19
|
-
import type { OpenAIToolCall } from '@pellux/goodvibes-sdk/platform/providers/tool-formats';
|
|
20
|
-
import type { CacheHitTracker } from '@pellux/goodvibes-sdk/platform/providers/cache-strategy';
|
|
21
|
-
import { extractOpenAIStreamTextDelta } from '@pellux/goodvibes-sdk/platform/providers/openai-stream-delta';
|
|
22
|
-
import { summarizeError, toProviderError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
23
|
-
|
|
24
|
-
const NOOP_CACHE_HIT_TRACKER: Pick<CacheHitTracker, 'recordTurn'> = {
|
|
25
|
-
recordTurn: () => {},
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* OpenAIProvider — wraps the official `openai` npm package.
|
|
30
|
-
* Supports GPT-5 family models with full function/tool calling.
|
|
31
|
-
*/
|
|
32
|
-
export class OpenAIProvider implements LLMProvider {
|
|
33
|
-
readonly name = 'openai';
|
|
34
|
-
readonly models: string[] = [];
|
|
35
|
-
|
|
36
|
-
private client: OpenAI;
|
|
37
|
-
private readonly embeddingModel = 'text-embedding-3-small';
|
|
38
|
-
private readonly cacheHitTracker: Pick<CacheHitTracker, 'recordTurn'>;
|
|
39
|
-
|
|
40
|
-
constructor(apiKey: string, cacheHitTracker: Pick<CacheHitTracker, 'recordTurn'> = NOOP_CACHE_HIT_TRACKER) {
|
|
41
|
-
this.client = new OpenAI({ apiKey });
|
|
42
|
-
this.cacheHitTracker = cacheHitTracker;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
async chat(params: ChatRequest): Promise<ChatResponse> {
|
|
46
|
-
const { messages, tools, model, maxTokens, signal, systemPrompt, onDelta, reasoningEffort: _reasoningEffort } = params;
|
|
47
|
-
// Note: OpenAI GPT-5 does not expose reasoning effort as a configurable API parameter
|
|
48
|
-
|
|
49
|
-
return withRetry(async () => {
|
|
50
|
-
let responseText = '';
|
|
51
|
-
let inputTokens = 0;
|
|
52
|
-
let outputTokens = 0;
|
|
53
|
-
let cacheReadTokens = 0;
|
|
54
|
-
let stopReason: ChatResponse['stopReason'] = 'end';
|
|
55
|
-
let rawToolCalls: OpenAIToolCall[] = [];
|
|
56
|
-
|
|
57
|
-
const openaiMessages = toOpenAIMessages(messages, systemPrompt);
|
|
58
|
-
const openaiTools = tools && tools.length > 0 ? toOpenAITools(tools) : undefined;
|
|
59
|
-
|
|
60
|
-
try {
|
|
61
|
-
const stream = await this.client.chat.completions.create(
|
|
62
|
-
{
|
|
63
|
-
model,
|
|
64
|
-
messages: openaiMessages as Parameters<typeof this.client.chat.completions.create>[0]['messages'],
|
|
65
|
-
...(openaiTools ? { tools: openaiTools as Parameters<typeof this.client.chat.completions.create>[0]['tools'] } : {}),
|
|
66
|
-
...(maxTokens ? { max_tokens: maxTokens } : {}),
|
|
67
|
-
stream: true,
|
|
68
|
-
stream_options: { include_usage: true },
|
|
69
|
-
},
|
|
70
|
-
{ signal },
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
const accToolCalls: Map<number, { id: string; name: string; args: string }> = new Map();
|
|
74
|
-
|
|
75
|
-
for await (const chunk of stream) {
|
|
76
|
-
const delta = chunk.choices[0]?.delta;
|
|
77
|
-
const textDelta = extractOpenAIStreamTextDelta(chunk);
|
|
78
|
-
for (const contentDelta of textDelta.content) {
|
|
79
|
-
responseText += contentDelta;
|
|
80
|
-
if (onDelta) onDelta({ content: contentDelta });
|
|
81
|
-
}
|
|
82
|
-
for (const reasoningDelta of textDelta.reasoning) {
|
|
83
|
-
if (onDelta) onDelta({ reasoning: reasoningDelta });
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Accumulate streaming tool_calls deltas
|
|
87
|
-
if (delta?.tool_calls) {
|
|
88
|
-
for (const tc of delta.tool_calls) {
|
|
89
|
-
const idx = tc.index;
|
|
90
|
-
if (!accToolCalls.has(idx)) {
|
|
91
|
-
accToolCalls.set(idx, { id: tc.id ?? '', name: tc.function?.name ?? '', args: '' });
|
|
92
|
-
}
|
|
93
|
-
const entry = accToolCalls.get(idx)!;
|
|
94
|
-
if (tc.id) entry.id = tc.id;
|
|
95
|
-
if (tc.function?.name) entry.name = tc.function.name;
|
|
96
|
-
if (tc.function?.arguments) entry.args += tc.function.arguments;
|
|
97
|
-
if (onDelta) {
|
|
98
|
-
onDelta({ toolCalls: [{ index: idx, id: tc.id, name: tc.function?.name, arguments: tc.function?.arguments }] });
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const finishReason = chunk.choices[0]?.finish_reason;
|
|
104
|
-
if (finishReason === 'tool_calls') stopReason = 'tool_use';
|
|
105
|
-
else if (finishReason === 'length') stopReason = 'max_tokens';
|
|
106
|
-
|
|
107
|
-
const usage = (chunk as { usage?: { prompt_tokens?: number; completion_tokens?: number; prompt_tokens_details?: { cached_tokens?: number } } }).usage;
|
|
108
|
-
if (usage) {
|
|
109
|
-
inputTokens = usage.prompt_tokens ?? 0;
|
|
110
|
-
outputTokens = usage.completion_tokens ?? 0;
|
|
111
|
-
cacheReadTokens = usage.prompt_tokens_details?.cached_tokens ?? cacheReadTokens;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Finalise accumulated tool calls
|
|
116
|
-
for (const [, tc] of [...accToolCalls.entries()].sort(([a], [b]) => a - b)) {
|
|
117
|
-
rawToolCalls.push({
|
|
118
|
-
id: tc.id,
|
|
119
|
-
type: 'function',
|
|
120
|
-
function: { name: tc.name, arguments: tc.args },
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
} catch (err: unknown) {
|
|
124
|
-
const { hasStatus } = await import('@pellux/goodvibes-sdk/platform/utils/retry');
|
|
125
|
-
const status = hasStatus(err) ? err.status : undefined;
|
|
126
|
-
throw toProviderError(err, {
|
|
127
|
-
...(status !== undefined ? { statusCode: status } : {}),
|
|
128
|
-
provider: this.name,
|
|
129
|
-
operation: 'chat',
|
|
130
|
-
phase: 'stream',
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// Some models may emit tool calls as raw text tokens instead of the
|
|
135
|
-
// OpenAI function-calling wire format. Fall back to text extraction.
|
|
136
|
-
let toolCalls = rawToolCalls.length > 0 ? fromOpenAIToolCalls(rawToolCalls) : [];
|
|
137
|
-
if (toolCalls.length === 0 && (responseText.includes('<|toolcallbegin|>') || responseText.includes('<|tool_call_begin|>'))) {
|
|
138
|
-
const extracted = extractTextToolCalls(responseText);
|
|
139
|
-
if (extracted.toolCalls.length > 0) {
|
|
140
|
-
toolCalls = extracted.toolCalls;
|
|
141
|
-
responseText = extracted.cleanedContent;
|
|
142
|
-
stopReason = 'tool_use';
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
this.cacheHitTracker.recordTurn({
|
|
147
|
-
inputTokens,
|
|
148
|
-
cacheReadTokens,
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
return {
|
|
152
|
-
content: responseText,
|
|
153
|
-
toolCalls,
|
|
154
|
-
usage: {
|
|
155
|
-
inputTokens,
|
|
156
|
-
outputTokens,
|
|
157
|
-
...(cacheReadTokens > 0 ? { cacheReadTokens } : {}),
|
|
158
|
-
},
|
|
159
|
-
stopReason,
|
|
160
|
-
};
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
async embed(request: ProviderEmbeddingRequest): Promise<ProviderEmbeddingResult> {
|
|
165
|
-
let response;
|
|
166
|
-
try {
|
|
167
|
-
response = await this.client.embeddings.create(
|
|
168
|
-
{
|
|
169
|
-
model: request.model ?? this.embeddingModel,
|
|
170
|
-
input: request.text,
|
|
171
|
-
...(request.dimensions ? { dimensions: request.dimensions } : {}),
|
|
172
|
-
},
|
|
173
|
-
request.signal ? { signal: request.signal } : undefined,
|
|
174
|
-
);
|
|
175
|
-
} catch (error: unknown) {
|
|
176
|
-
throw toProviderError(error, {
|
|
177
|
-
provider: this.name,
|
|
178
|
-
operation: 'embed',
|
|
179
|
-
phase: 'request',
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
const embedding = response.data[0]?.embedding ?? [];
|
|
183
|
-
return {
|
|
184
|
-
vector: Float32Array.from(embedding),
|
|
185
|
-
dimensions: embedding.length,
|
|
186
|
-
modelId: response.model,
|
|
187
|
-
metadata: {
|
|
188
|
-
usage: request.usage,
|
|
189
|
-
provider: this.name,
|
|
190
|
-
},
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
async describeRuntime(deps: ProviderRuntimeMetadataDeps): Promise<ProviderRuntimeMetadata> {
|
|
195
|
-
const configured = Boolean(process.env.OPENAI_API_KEY || process.env.OPENAI_KEY);
|
|
196
|
-
const { buildStandardProviderAuthRoutes } = await import('./runtime-metadata.ts');
|
|
197
|
-
const authRoutes = await buildStandardProviderAuthRoutes({
|
|
198
|
-
providerId: 'openai',
|
|
199
|
-
apiKeyEnvVars: ['OPENAI_API_KEY', 'OPENAI_KEY'],
|
|
200
|
-
serviceNames: ['openai'],
|
|
201
|
-
subscriptionProviderId: 'openai',
|
|
202
|
-
}, deps);
|
|
203
|
-
return {
|
|
204
|
-
auth: {
|
|
205
|
-
mode: 'api-key',
|
|
206
|
-
configured,
|
|
207
|
-
detail: configured ? 'OpenAI API key available' : 'OPENAI_API_KEY or OPENAI_KEY not set',
|
|
208
|
-
envVars: ['OPENAI_API_KEY', 'OPENAI_KEY'],
|
|
209
|
-
routes: authRoutes,
|
|
210
|
-
},
|
|
211
|
-
models: {
|
|
212
|
-
models: this.models,
|
|
213
|
-
embeddingModel: this.embeddingModel,
|
|
214
|
-
embeddingDimensions: 384,
|
|
215
|
-
},
|
|
216
|
-
usage: {
|
|
217
|
-
streaming: true,
|
|
218
|
-
toolCalling: true,
|
|
219
|
-
parallelTools: true,
|
|
220
|
-
notes: ['Embeddings use the OpenAI embeddings API.'],
|
|
221
|
-
},
|
|
222
|
-
policy: {
|
|
223
|
-
local: false,
|
|
224
|
-
streamProtocol: 'openai-chat-completions',
|
|
225
|
-
reasoningMode: 'provider-default',
|
|
226
|
-
cacheStrategy: 'implicit-openai-cache-observation',
|
|
227
|
-
notes: ['OpenAI embedding usage is subject to OpenAI API terms.'],
|
|
228
|
-
},
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '@pellux/goodvibes-sdk/platform/providers/optimizer';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '@pellux/goodvibes-sdk/platform/providers/provider-api';
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import type { ModelDefinition } from '@pellux/goodvibes-sdk/platform/providers/registry-types';
|
|
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
|
-
}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import type { ModelDefinition } from '@pellux/goodvibes-sdk/platform/providers/registry-types';
|
|
2
|
-
import { splitModelRegistryKey, withRegistryKey } from '@pellux/goodvibes-sdk/platform/providers/registry-helpers';
|
|
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
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import type { LLMProvider, ProviderRuntimeMetadataDeps } from '@pellux/goodvibes-sdk/platform/providers/interface';
|
|
2
|
-
import type { ProviderCapabilityRegistry } from '@pellux/goodvibes-sdk/platform/providers/capabilities';
|
|
3
|
-
import type { ConfigManager } from '@pellux/goodvibes-sdk/platform/config/manager';
|
|
4
|
-
import type { RuntimeEventBus } from '@pellux/goodvibes-sdk/platform/runtime/events/index';
|
|
5
|
-
import type { SubscriptionManager } from '@pellux/goodvibes-sdk/platform/config/subscriptions';
|
|
6
|
-
import type { CacheHitTracker } from '@pellux/goodvibes-sdk/platform/providers/cache-strategy';
|
|
7
|
-
import type { FeatureFlagManager } from '@pellux/goodvibes-sdk/platform/runtime/feature-flags/index';
|
|
8
|
-
import type { FavoritesStore } from '@pellux/goodvibes-sdk/platform/providers/favorites';
|
|
9
|
-
import type { BenchmarkStore } from '@pellux/goodvibes-sdk/platform/providers/model-benchmarks';
|
|
10
|
-
import type { ModelLimitsService } from '@pellux/goodvibes-sdk/platform/providers/model-limits';
|
|
11
|
-
|
|
12
|
-
/** Model capability tier — controls system prompt verbosity. */
|
|
13
|
-
export type ModelTier = 'free' | 'standard' | 'premium' | 'subscription';
|
|
14
|
-
|
|
15
|
-
/** Per-model token limits for output, tool results, tool calls, and reasoning. */
|
|
16
|
-
export interface TokenLimits {
|
|
17
|
-
maxOutputTokens?: number;
|
|
18
|
-
maxToolResultTokens?: number;
|
|
19
|
-
maxToolCalls?: number;
|
|
20
|
-
maxReasoningTokens?: number;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/** Provenance of a resolved context window value. */
|
|
24
|
-
export type ContextWindowProvenance = 'provider_api' | 'configured_cap' | 'fallback';
|
|
25
|
-
|
|
26
|
-
/** Describes a selectable model and its capabilities. */
|
|
27
|
-
export interface ModelDefinition {
|
|
28
|
-
id: string;
|
|
29
|
-
provider: string;
|
|
30
|
-
/** Compound unique key: `${provider}:${id}`. Safe separator since model IDs use `/` not `:`. */
|
|
31
|
-
registryKey: string;
|
|
32
|
-
displayName: string;
|
|
33
|
-
description: string;
|
|
34
|
-
capabilities: {
|
|
35
|
-
toolCalling: boolean;
|
|
36
|
-
codeEditing: boolean;
|
|
37
|
-
reasoning: boolean;
|
|
38
|
-
multimodal: boolean;
|
|
39
|
-
};
|
|
40
|
-
contextWindow: number;
|
|
41
|
-
contextWindowProvenance?: ContextWindowProvenance;
|
|
42
|
-
selectable: boolean;
|
|
43
|
-
reasoningEffort?: string[];
|
|
44
|
-
tier?: ModelTier;
|
|
45
|
-
tokenLimits?: TokenLimits;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export interface RuntimeProviderRegistration {
|
|
49
|
-
readonly provider: LLMProvider;
|
|
50
|
-
readonly models?: readonly ModelDefinition[];
|
|
51
|
-
readonly suppressCatalogModels?: readonly string[];
|
|
52
|
-
readonly replace?: boolean;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface ProviderRegistryOptions {
|
|
56
|
-
readonly configManager: Pick<ConfigManager, 'get' | 'getCategory' | 'getControlPlaneConfigDir'>;
|
|
57
|
-
readonly subscriptionManager: Pick<SubscriptionManager, 'get' | 'getPending' | 'saveSubscription' | 'resolveAccessToken'>;
|
|
58
|
-
readonly secretsManager: ProviderRuntimeMetadataDeps['secretsManager'];
|
|
59
|
-
readonly serviceRegistry: ProviderRuntimeMetadataDeps['serviceRegistry'];
|
|
60
|
-
readonly capabilityRegistry: ProviderCapabilityRegistry;
|
|
61
|
-
readonly cacheHitTracker: CacheHitTracker;
|
|
62
|
-
readonly favoritesStore: Pick<FavoritesStore, 'load'>;
|
|
63
|
-
readonly benchmarkStore: Pick<BenchmarkStore, 'getBenchmarks' | 'getTopBenchmarkModelIds'>;
|
|
64
|
-
readonly modelLimitsService?: ModelLimitsService;
|
|
65
|
-
readonly featureFlags?: Pick<FeatureFlagManager, 'isEnabled'> | null;
|
|
66
|
-
readonly runtimeBus?: RuntimeEventBus | null;
|
|
67
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '@pellux/goodvibes-sdk/platform/providers/registry';
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import { listBuiltinSubscriptionProviders } from '../config/subscription-providers.ts';
|
|
2
|
-
import type { ProviderAuthRouteDescriptor, ProviderRuntimeMetadataDeps } from '@pellux/goodvibes-sdk/platform/providers/interface';
|
|
3
|
-
|
|
4
|
-
export interface StandardProviderAuthOptions {
|
|
5
|
-
readonly providerId: string;
|
|
6
|
-
readonly apiKeyEnvVars?: readonly string[];
|
|
7
|
-
readonly secretKeys?: readonly string[];
|
|
8
|
-
readonly serviceNames?: readonly string[];
|
|
9
|
-
readonly subscriptionProviderId?: string;
|
|
10
|
-
readonly allowAnonymous?: boolean;
|
|
11
|
-
readonly anonymousConfigured?: boolean;
|
|
12
|
-
readonly anonymousDetail?: string;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function determineFreshness(expiresAt?: number): 'healthy' | 'expiring' | 'expired' {
|
|
16
|
-
if (typeof expiresAt !== 'number' || !Number.isFinite(expiresAt)) return 'healthy';
|
|
17
|
-
if (expiresAt <= Date.now()) return 'expired';
|
|
18
|
-
if (expiresAt <= Date.now() + 24 * 60 * 60 * 1000) return 'expiring';
|
|
19
|
-
return 'healthy';
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export async function buildStandardProviderAuthRoutes(
|
|
23
|
-
options: StandardProviderAuthOptions,
|
|
24
|
-
deps: ProviderRuntimeMetadataDeps,
|
|
25
|
-
): Promise<readonly ProviderAuthRouteDescriptor[]> {
|
|
26
|
-
const secretKeys = [...new Set([...(options.secretKeys ?? []), ...(options.apiKeyEnvVars ?? [])])];
|
|
27
|
-
const detailedSecrets = await deps.secretsManager.listDetailed();
|
|
28
|
-
const matchingSecretRecords = detailedSecrets.filter((record) => secretKeys.includes(record.key) && record.source !== 'env');
|
|
29
|
-
const hasSecretRef = matchingSecretRecords.some((record) => Boolean(record.refSource));
|
|
30
|
-
const hasStoredDirectSecret = matchingSecretRecords.some((record) => !record.refSource);
|
|
31
|
-
const hasEnv = (options.apiKeyEnvVars ?? []).some((envVar) => {
|
|
32
|
-
const value = process.env[envVar];
|
|
33
|
-
return typeof value === 'string' && value.length > 0;
|
|
34
|
-
});
|
|
35
|
-
const builtinSubscriptions = new Set(listBuiltinSubscriptionProviders().map((entry) => entry.provider));
|
|
36
|
-
const subscriptionProviderId = options.subscriptionProviderId ?? options.providerId;
|
|
37
|
-
const subscription = deps.subscriptionManager.get(subscriptionProviderId);
|
|
38
|
-
const pendingSubscription = deps.subscriptionManager.getPending(subscriptionProviderId);
|
|
39
|
-
const hasSubscriptionRoute = builtinSubscriptions.has(subscriptionProviderId) || subscription != null || pendingSubscription != null;
|
|
40
|
-
const subscriptionFreshness = pendingSubscription
|
|
41
|
-
? 'pending'
|
|
42
|
-
: subscription
|
|
43
|
-
? determineFreshness(subscription.expiresAt)
|
|
44
|
-
: 'unconfigured';
|
|
45
|
-
const serviceNames = options.serviceNames && options.serviceNames.length > 0
|
|
46
|
-
? [...new Set(options.serviceNames)]
|
|
47
|
-
: Object.values(deps.serviceRegistry.getAll())
|
|
48
|
-
.filter((service) => service.authType === 'oauth' && (service.providerId ?? service.name) === options.providerId)
|
|
49
|
-
.map((service) => service.name);
|
|
50
|
-
const serviceInspections = await Promise.all(serviceNames.map(async (name) => ({
|
|
51
|
-
name,
|
|
52
|
-
inspection: await deps.serviceRegistry.inspect(name),
|
|
53
|
-
})));
|
|
54
|
-
const hasServiceConfig = serviceInspections.some(({ inspection }) => inspection?.config.authType === 'oauth');
|
|
55
|
-
const hasUsableServiceOauth = serviceInspections.some(({ inspection }) => Boolean(inspection?.hasPrimaryCredential));
|
|
56
|
-
|
|
57
|
-
const routes: ProviderAuthRouteDescriptor[] = [];
|
|
58
|
-
if ((options.apiKeyEnvVars?.length ?? 0) > 0 || secretKeys.length > 0) {
|
|
59
|
-
routes.push({
|
|
60
|
-
route: 'api-key',
|
|
61
|
-
label: 'Ambient API key',
|
|
62
|
-
configured: hasEnv || hasStoredDirectSecret,
|
|
63
|
-
usable: hasEnv || hasStoredDirectSecret,
|
|
64
|
-
freshness: hasEnv || hasStoredDirectSecret ? 'healthy' : 'unconfigured',
|
|
65
|
-
detail: hasEnv
|
|
66
|
-
? 'Environment-backed API key is available.'
|
|
67
|
-
: hasStoredDirectSecret
|
|
68
|
-
? 'GoodVibes secret store contains a direct API key value.'
|
|
69
|
-
: 'No direct API key is configured.',
|
|
70
|
-
...(options.apiKeyEnvVars?.length ? { envVars: options.apiKeyEnvVars } : {}),
|
|
71
|
-
...(secretKeys.length > 0 ? { secretKeys } : {}),
|
|
72
|
-
repairHints: [
|
|
73
|
-
...(options.apiKeyEnvVars?.length
|
|
74
|
-
? [`Set ${options.apiKeyEnvVars.join(' or ')} or store one of those keys in /secrets.`]
|
|
75
|
-
: ['Store the provider API key in /secrets or the process environment.']),
|
|
76
|
-
],
|
|
77
|
-
});
|
|
78
|
-
routes.push({
|
|
79
|
-
route: 'secret-ref',
|
|
80
|
-
label: 'SecretRef-backed API key',
|
|
81
|
-
configured: hasSecretRef,
|
|
82
|
-
usable: hasSecretRef,
|
|
83
|
-
freshness: hasSecretRef ? 'healthy' : 'unconfigured',
|
|
84
|
-
detail: hasSecretRef
|
|
85
|
-
? 'A GoodVibes SecretRef is configured for this provider.'
|
|
86
|
-
: 'No SecretRef-backed credential is configured.',
|
|
87
|
-
...(secretKeys.length > 0 ? { secretKeys } : {}),
|
|
88
|
-
repairHints: [
|
|
89
|
-
'Use /secrets link <KEY> <secret-ref> to attach Bitwarden, Vaultwarden, BWS, or another supported SecretRef.',
|
|
90
|
-
],
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (hasServiceConfig || serviceNames.length > 0) {
|
|
95
|
-
routes.push({
|
|
96
|
-
route: 'service-oauth',
|
|
97
|
-
label: 'Service OAuth',
|
|
98
|
-
configured: hasServiceConfig,
|
|
99
|
-
usable: hasUsableServiceOauth,
|
|
100
|
-
freshness: hasUsableServiceOauth ? 'healthy' : 'unconfigured',
|
|
101
|
-
detail: hasUsableServiceOauth
|
|
102
|
-
? 'A service-owned OAuth credential is available for this provider.'
|
|
103
|
-
: 'Service OAuth metadata exists, but the credential path is incomplete.',
|
|
104
|
-
...(serviceNames.length > 0 ? { serviceNames } : {}),
|
|
105
|
-
repairHints: ['Repair the provider service credential in /services or the settings surface.'],
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
if (hasSubscriptionRoute) {
|
|
110
|
-
routes.push({
|
|
111
|
-
route: 'subscription-oauth',
|
|
112
|
-
label: 'Subscription OAuth',
|
|
113
|
-
configured: subscription != null || pendingSubscription != null || builtinSubscriptions.has(subscriptionProviderId),
|
|
114
|
-
usable: subscriptionFreshness !== 'expired' && subscriptionFreshness !== 'unconfigured',
|
|
115
|
-
freshness: subscriptionFreshness,
|
|
116
|
-
detail: pendingSubscription
|
|
117
|
-
? 'Subscription OAuth login is pending completion.'
|
|
118
|
-
: subscription
|
|
119
|
-
? 'A stored subscription OAuth session is available for this provider.'
|
|
120
|
-
: 'A built-in subscription OAuth adapter is available, but no session is stored yet.',
|
|
121
|
-
providerId: subscriptionProviderId,
|
|
122
|
-
repairHints: [`Use /subscription login ${subscriptionProviderId} start or refresh the stored subscription session.`],
|
|
123
|
-
});
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
if (options.allowAnonymous) {
|
|
127
|
-
routes.push({
|
|
128
|
-
route: 'anonymous',
|
|
129
|
-
label: 'Anonymous / local access',
|
|
130
|
-
configured: Boolean(options.anonymousConfigured),
|
|
131
|
-
usable: Boolean(options.anonymousConfigured),
|
|
132
|
-
freshness: options.anonymousConfigured ? 'healthy' : 'unconfigured',
|
|
133
|
-
detail: options.anonymousDetail ?? 'This provider can be used without an API key.',
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (routes.length === 0) {
|
|
138
|
-
return [{
|
|
139
|
-
route: 'none',
|
|
140
|
-
label: 'No auth route declared',
|
|
141
|
-
configured: false,
|
|
142
|
-
usable: false,
|
|
143
|
-
freshness: 'unconfigured',
|
|
144
|
-
detail: 'The provider did not declare any runtime auth routes.',
|
|
145
|
-
}];
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return routes;
|
|
149
|
-
}
|