@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
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tier-based system prompt supplements.
|
|
3
|
-
*
|
|
4
|
-
* Model capability tiers drive how much extra guidance is injected into
|
|
5
|
-
* the system prompt. All features remain available regardless of tier;
|
|
6
|
-
* only the verbosity of the guidance changes.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { ModelTier } from '@pellux/goodvibes-sdk/platform/providers/registry';
|
|
10
|
-
export type { ModelTier };
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Derive the model tier from a model's context window size.
|
|
14
|
-
*
|
|
15
|
-
* - small (<32K) → 'free' (needs most guidance)
|
|
16
|
-
* - medium (32K–128K) → 'standard' (brief reminders)
|
|
17
|
-
* - large (>128K) → 'premium' (no extra guidance needed)
|
|
18
|
-
*
|
|
19
|
-
* This is used instead of the static ModelDefinition.tier field so that
|
|
20
|
-
* tier-prompt selection is driven by actual model capabilities.
|
|
21
|
-
*/
|
|
22
|
-
export function getTierForContextWindow(contextWindow: number): ModelTier {
|
|
23
|
-
if (contextWindow > 128_000) return 'premium';
|
|
24
|
-
if (contextWindow >= 32_000) return 'standard';
|
|
25
|
-
return 'free';
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Returns supplemental system prompt content based on the model's capability
|
|
30
|
-
* tier. The returned string is appended to the base system prompt before
|
|
31
|
-
* each LLM call.
|
|
32
|
-
*
|
|
33
|
-
* - free — explicit tool-call examples, multi-agent reminders, structured
|
|
34
|
-
* output enforcement (~300 tokens)
|
|
35
|
-
* - standard — brief reminders about tool usage and plan adherence (~80 tokens)
|
|
36
|
-
* - premium — empty; capable models need no extra hand-holding
|
|
37
|
-
*/
|
|
38
|
-
export function getTierPromptSupplement(tier: ModelTier): string {
|
|
39
|
-
switch (tier) {
|
|
40
|
-
case 'free':
|
|
41
|
-
return FREE_SUPPLEMENT;
|
|
42
|
-
case 'standard':
|
|
43
|
-
return STANDARD_SUPPLEMENT;
|
|
44
|
-
case 'premium':
|
|
45
|
-
return '';
|
|
46
|
-
case 'subscription':
|
|
47
|
-
return '';
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// ---------------------------------------------------------------------------
|
|
52
|
-
// Supplement text
|
|
53
|
-
// ---------------------------------------------------------------------------
|
|
54
|
-
|
|
55
|
-
const FREE_SUPPLEMENT = `## Agent Guidance
|
|
56
|
-
|
|
57
|
-
You are operating in a multi-agent system. Follow these rules carefully:
|
|
58
|
-
|
|
59
|
-
**Tool calls — required format:**
|
|
60
|
-
Every tool call must include ALL required parameters. Missing parameters cause
|
|
61
|
-
silent failures. When in doubt, check the tool's schema before calling it.
|
|
62
|
-
|
|
63
|
-
Example — correct agent spawn:
|
|
64
|
-
\`\`\`json
|
|
65
|
-
{ "name": "agent", "input": { "task": "<task>", "mode": "engineer" } }
|
|
66
|
-
\`\`\`
|
|
67
|
-
|
|
68
|
-
**Multi-agent workflows:**
|
|
69
|
-
When a plan requires multiple parallel agents, spawn ALL of them before
|
|
70
|
-
waiting for results — do not spawn one, wait, then spawn the next. Parallel
|
|
71
|
-
spawns run concurrently and complete faster.
|
|
72
|
-
|
|
73
|
-
**Structured output:**
|
|
74
|
-
Your final message MUST end with the required JSON completion block. Omitting
|
|
75
|
-
it causes the orchestrator to treat your run as failed.
|
|
76
|
-
|
|
77
|
-
**Plan adherence:**
|
|
78
|
-
Complete the full plan. Do not stop after the first step and ask for
|
|
79
|
-
confirmation — there is no human watching. Make the best choice and continue.`;
|
|
80
|
-
|
|
81
|
-
const STANDARD_SUPPLEMENT = `## Reminders
|
|
82
|
-
- Include all required parameters in every tool call.
|
|
83
|
-
- When spawning agents, use the correct \`mode\` parameter.
|
|
84
|
-
- Complete your full plan before reporting results.`;
|
|
@@ -1,414 +0,0 @@
|
|
|
1
|
-
import type { ToolDefinition, ToolCall } from '@pellux/goodvibes-sdk/platform/types/tools';
|
|
2
|
-
import type { ProviderMessage, ContentPart } from '@pellux/goodvibes-sdk/platform/providers/interface';
|
|
3
|
-
import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
|
|
4
|
-
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
5
|
-
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
// OpenAI wire format
|
|
8
|
-
// ---------------------------------------------------------------------------
|
|
9
|
-
|
|
10
|
-
export interface OpenAITool {
|
|
11
|
-
type: 'function';
|
|
12
|
-
function: {
|
|
13
|
-
name: string;
|
|
14
|
-
description: string;
|
|
15
|
-
parameters: Record<string, unknown>;
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface OpenAIToolCall {
|
|
20
|
-
id: string;
|
|
21
|
-
type: 'function';
|
|
22
|
-
function: { name: string; arguments: string };
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export type OpenAIContentPart =
|
|
26
|
-
| { type: 'text'; text: string }
|
|
27
|
-
| { type: 'image_url'; image_url: { url: string } };
|
|
28
|
-
|
|
29
|
-
export interface OpenAIMessage {
|
|
30
|
-
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
31
|
-
content: string | OpenAIContentPart[] | null;
|
|
32
|
-
tool_calls?: OpenAIToolCall[];
|
|
33
|
-
tool_call_id?: string;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/** Convert internal ToolDefinitions to OpenAI tools array. */
|
|
37
|
-
export function toOpenAITools(tools: ToolDefinition[]): OpenAITool[] {
|
|
38
|
-
return tools.map((t) => ({
|
|
39
|
-
type: 'function',
|
|
40
|
-
function: {
|
|
41
|
-
name: t.name,
|
|
42
|
-
description: t.description,
|
|
43
|
-
parameters: t.parameters,
|
|
44
|
-
},
|
|
45
|
-
}));
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/** Parse OpenAI tool_calls from a response into internal ToolCall[]. */
|
|
49
|
-
export function fromOpenAIToolCalls(calls: OpenAIToolCall[]): ToolCall[] {
|
|
50
|
-
return calls.map((c) => ({
|
|
51
|
-
id: c.id,
|
|
52
|
-
name: c.function.name,
|
|
53
|
-
arguments: parseJson(c.function.arguments),
|
|
54
|
-
}));
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** Convert internal ProviderMessages to OpenAI message array. */
|
|
58
|
-
export function toOpenAIMessages(
|
|
59
|
-
messages: ProviderMessage[],
|
|
60
|
-
systemPrompt?: string,
|
|
61
|
-
): OpenAIMessage[] {
|
|
62
|
-
const result: OpenAIMessage[] = [];
|
|
63
|
-
|
|
64
|
-
if (systemPrompt) {
|
|
65
|
-
result.push({ role: 'system', content: systemPrompt });
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
for (const msg of messages) {
|
|
69
|
-
if (msg.role === 'user') {
|
|
70
|
-
if (Array.isArray(msg.content)) {
|
|
71
|
-
// ContentPart[] — convert to OpenAI multimodal parts
|
|
72
|
-
const parts: OpenAIContentPart[] = msg.content.map((part: ContentPart) => {
|
|
73
|
-
if (part.type === 'text') return { type: 'text', text: part.text };
|
|
74
|
-
return { type: 'image_url', image_url: { url: `data:${part.mediaType};base64,${part.data}` } };
|
|
75
|
-
});
|
|
76
|
-
result.push({ role: 'user', content: parts });
|
|
77
|
-
} else {
|
|
78
|
-
result.push({ role: 'user', content: msg.content });
|
|
79
|
-
}
|
|
80
|
-
} else if (msg.role === 'assistant') {
|
|
81
|
-
const m: OpenAIMessage = { role: 'assistant', content: msg.content ?? '' };
|
|
82
|
-
if (msg.toolCalls && msg.toolCalls.length > 0) {
|
|
83
|
-
m.tool_calls = msg.toolCalls.map((tc) => ({
|
|
84
|
-
id: tc.id,
|
|
85
|
-
type: 'function',
|
|
86
|
-
function: { name: tc.name, arguments: JSON.stringify(tc.arguments) },
|
|
87
|
-
}));
|
|
88
|
-
}
|
|
89
|
-
result.push(m);
|
|
90
|
-
} else if (msg.role === 'tool') {
|
|
91
|
-
result.push({
|
|
92
|
-
role: 'tool',
|
|
93
|
-
content: msg.content,
|
|
94
|
-
tool_call_id: msg.callId,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
return result;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// ---------------------------------------------------------------------------
|
|
103
|
-
// Anthropic wire format
|
|
104
|
-
// ---------------------------------------------------------------------------
|
|
105
|
-
|
|
106
|
-
export interface AnthropicTool {
|
|
107
|
-
name: string;
|
|
108
|
-
description: string;
|
|
109
|
-
input_schema: Record<string, unknown>;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export type AnthropicContentBlock =
|
|
113
|
-
| { type: 'text'; text: string }
|
|
114
|
-
| { type: 'image'; source: { type: 'base64'; media_type: 'image/png' | 'image/jpeg' | 'image/gif' | 'image/webp'; data: string } }
|
|
115
|
-
| { type: 'tool_use'; id: string; name: string; input: Record<string, unknown> }
|
|
116
|
-
| { type: 'tool_result'; tool_use_id: string; content: string };
|
|
117
|
-
|
|
118
|
-
export interface AnthropicMessage {
|
|
119
|
-
role: 'user' | 'assistant';
|
|
120
|
-
content: string | AnthropicContentBlock[];
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/** Convert internal ToolDefinitions to Anthropic tools array. */
|
|
124
|
-
export function toAnthropicTools(tools: ToolDefinition[]): AnthropicTool[] {
|
|
125
|
-
return tools.map((t) => ({
|
|
126
|
-
name: t.name,
|
|
127
|
-
description: t.description,
|
|
128
|
-
input_schema: t.parameters,
|
|
129
|
-
}));
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/** Parse Anthropic response content blocks into text + ToolCall[]. */
|
|
133
|
-
export function fromAnthropicContent(content: AnthropicContentBlock[]): {
|
|
134
|
-
text: string;
|
|
135
|
-
toolCalls: ToolCall[];
|
|
136
|
-
} {
|
|
137
|
-
let text = '';
|
|
138
|
-
const toolCalls: ToolCall[] = [];
|
|
139
|
-
|
|
140
|
-
for (const block of content) {
|
|
141
|
-
if (block.type === 'text') {
|
|
142
|
-
text += block.text;
|
|
143
|
-
} else if (block.type === 'tool_use') {
|
|
144
|
-
toolCalls.push({ id: block.id, name: block.name, arguments: block.input });
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
return { text, toolCalls };
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/** Convert internal ProviderMessages to Anthropic message array. */
|
|
152
|
-
export function toAnthropicMessages(messages: ProviderMessage[]): AnthropicMessage[] {
|
|
153
|
-
const result: AnthropicMessage[] = [];
|
|
154
|
-
|
|
155
|
-
// Collect consecutive tool results to merge into one user message
|
|
156
|
-
let pendingToolResults: AnthropicContentBlock[] = [];
|
|
157
|
-
|
|
158
|
-
function flushToolResults(): void {
|
|
159
|
-
if (pendingToolResults.length > 0) {
|
|
160
|
-
result.push({ role: 'user', content: pendingToolResults });
|
|
161
|
-
pendingToolResults = [];
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
for (const msg of messages) {
|
|
166
|
-
if (msg.role === 'user') {
|
|
167
|
-
flushToolResults();
|
|
168
|
-
if (Array.isArray(msg.content)) {
|
|
169
|
-
// ContentPart[] — convert to Anthropic content blocks
|
|
170
|
-
const blocks: AnthropicContentBlock[] = msg.content.map((part: ContentPart) => {
|
|
171
|
-
if (part.type === 'text') return { type: 'text' as const, text: part.text };
|
|
172
|
-
return {
|
|
173
|
-
type: 'image' as const,
|
|
174
|
-
source: { type: 'base64' as const, media_type: part.mediaType as 'image/png' | 'image/jpeg' | 'image/gif' | 'image/webp', data: part.data },
|
|
175
|
-
};
|
|
176
|
-
});
|
|
177
|
-
result.push({ role: 'user', content: blocks });
|
|
178
|
-
} else {
|
|
179
|
-
result.push({ role: 'user', content: msg.content });
|
|
180
|
-
}
|
|
181
|
-
} else if (msg.role === 'assistant') {
|
|
182
|
-
flushToolResults();
|
|
183
|
-
if (msg.toolCalls && msg.toolCalls.length > 0) {
|
|
184
|
-
const blocks: AnthropicContentBlock[] = [];
|
|
185
|
-
if (msg.content) blocks.push({ type: 'text', text: msg.content });
|
|
186
|
-
for (const tc of msg.toolCalls) {
|
|
187
|
-
blocks.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.arguments });
|
|
188
|
-
}
|
|
189
|
-
result.push({ role: 'assistant', content: blocks });
|
|
190
|
-
} else {
|
|
191
|
-
result.push({ role: 'assistant', content: msg.content });
|
|
192
|
-
}
|
|
193
|
-
} else if (msg.role === 'tool') {
|
|
194
|
-
pendingToolResults.push({
|
|
195
|
-
type: 'tool_result',
|
|
196
|
-
tool_use_id: msg.callId,
|
|
197
|
-
content: msg.content,
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
flushToolResults();
|
|
203
|
-
return result;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// ---------------------------------------------------------------------------
|
|
207
|
-
// Gemini wire format
|
|
208
|
-
// ---------------------------------------------------------------------------
|
|
209
|
-
|
|
210
|
-
export interface GeminiFunctionDeclaration {
|
|
211
|
-
name: string;
|
|
212
|
-
description: string;
|
|
213
|
-
parameters: Record<string, unknown>;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
export interface GeminiPart {
|
|
217
|
-
text?: string;
|
|
218
|
-
inlineData?: { mimeType: string; data: string };
|
|
219
|
-
functionCall?: { name: string; args: Record<string, unknown> };
|
|
220
|
-
functionResponse?: { name: string; response: { content: string } };
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
export interface GeminiContent {
|
|
224
|
-
role: 'user' | 'model';
|
|
225
|
-
parts: GeminiPart[];
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
/** Strip properties that Gemini's API doesn't support (e.g. additionalProperties). */
|
|
229
|
-
function stripUnsupportedProperties(obj: unknown): unknown {
|
|
230
|
-
if (Array.isArray(obj)) return obj.map(stripUnsupportedProperties);
|
|
231
|
-
if (obj !== null && typeof obj === 'object') {
|
|
232
|
-
const result: Record<string, unknown> = {};
|
|
233
|
-
for (const [key, value] of Object.entries(obj as Record<string, unknown>)) {
|
|
234
|
-
if (key === 'additionalProperties') continue;
|
|
235
|
-
result[key] = stripUnsupportedProperties(value);
|
|
236
|
-
}
|
|
237
|
-
return result;
|
|
238
|
-
}
|
|
239
|
-
return obj;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/** Convert internal ToolDefinitions to Gemini functionDeclarations. */
|
|
243
|
-
export function toGeminiFunctionDeclarations(
|
|
244
|
-
tools: ToolDefinition[],
|
|
245
|
-
): GeminiFunctionDeclaration[] {
|
|
246
|
-
return tools.map((t) => ({
|
|
247
|
-
name: t.name,
|
|
248
|
-
description: t.description,
|
|
249
|
-
parameters: stripUnsupportedProperties(t.parameters) as Record<string, unknown>,
|
|
250
|
-
}));
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
/** Parse Gemini response parts into text + ToolCall[]. */
|
|
254
|
-
export function fromGeminiParts(parts: GeminiPart[]): {
|
|
255
|
-
text: string;
|
|
256
|
-
toolCalls: ToolCall[];
|
|
257
|
-
} {
|
|
258
|
-
let text = '';
|
|
259
|
-
const toolCalls: ToolCall[] = [];
|
|
260
|
-
|
|
261
|
-
for (const part of parts) {
|
|
262
|
-
if (part.text) {
|
|
263
|
-
text += part.text;
|
|
264
|
-
} else if (part.functionCall) {
|
|
265
|
-
toolCalls.push({
|
|
266
|
-
id: crypto.randomUUID(),
|
|
267
|
-
name: part.functionCall.name,
|
|
268
|
-
arguments: part.functionCall.args,
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
return { text, toolCalls };
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/** Convert internal ProviderMessages to Gemini contents array. */
|
|
277
|
-
export function toGeminiContents(
|
|
278
|
-
messages: ProviderMessage[],
|
|
279
|
-
systemPrompt?: string,
|
|
280
|
-
): { contents: GeminiContent[]; systemInstruction?: { parts: GeminiPart[] } } {
|
|
281
|
-
const contents: GeminiContent[] = [];
|
|
282
|
-
const systemInstruction = systemPrompt
|
|
283
|
-
? { parts: [{ text: systemPrompt }] }
|
|
284
|
-
: undefined;
|
|
285
|
-
|
|
286
|
-
let pendingFunctionResponses: GeminiPart[] = [];
|
|
287
|
-
|
|
288
|
-
function flushFunctionResponses(): void {
|
|
289
|
-
if (pendingFunctionResponses.length > 0) {
|
|
290
|
-
contents.push({ role: 'user', parts: pendingFunctionResponses });
|
|
291
|
-
pendingFunctionResponses = [];
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
for (const msg of messages) {
|
|
296
|
-
if (msg.role === 'user') {
|
|
297
|
-
flushFunctionResponses();
|
|
298
|
-
if (Array.isArray(msg.content)) {
|
|
299
|
-
// ContentPart[] — convert to Gemini parts
|
|
300
|
-
const parts: GeminiPart[] = msg.content.map((part: ContentPart) => {
|
|
301
|
-
if (part.type === 'text') return { text: part.text };
|
|
302
|
-
return { inlineData: { mimeType: part.mediaType, data: part.data } };
|
|
303
|
-
});
|
|
304
|
-
contents.push({ role: 'user', parts });
|
|
305
|
-
} else {
|
|
306
|
-
contents.push({ role: 'user', parts: [{ text: msg.content }] });
|
|
307
|
-
}
|
|
308
|
-
} else if (msg.role === 'assistant') {
|
|
309
|
-
flushFunctionResponses();
|
|
310
|
-
const parts: GeminiPart[] = [];
|
|
311
|
-
if (msg.content) parts.push({ text: msg.content });
|
|
312
|
-
if (msg.toolCalls) {
|
|
313
|
-
for (const tc of msg.toolCalls) {
|
|
314
|
-
parts.push({ functionCall: { name: tc.name, args: tc.arguments } });
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
contents.push({ role: 'model', parts });
|
|
318
|
-
} else if (msg.role === 'tool') {
|
|
319
|
-
pendingFunctionResponses.push({
|
|
320
|
-
functionResponse: {
|
|
321
|
-
name: msg.name ?? msg.callId,
|
|
322
|
-
response: { content: msg.content },
|
|
323
|
-
},
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
flushFunctionResponses();
|
|
329
|
-
return { contents, systemInstruction };
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
// ---------------------------------------------------------------------------
|
|
333
|
-
// Text-based tool call extraction (for models that emit tool calls as tokens)
|
|
334
|
-
// ---------------------------------------------------------------------------
|
|
335
|
-
|
|
336
|
-
/**
|
|
337
|
-
* Extracts tool calls from raw text content for models (e.g. kimi-k2-thinking
|
|
338
|
-
* via ollama-cloud) that emit tool calls as text tokens instead of using the
|
|
339
|
-
* OpenAI function-calling wire format.
|
|
340
|
-
*
|
|
341
|
-
* Supports two delimiter formats (both emitted by kimi variants):
|
|
342
|
-
* Without underscores: <|toolcallbegin|>functions.TOOLNAME:INDEX<|toolcallargumentbegin|>JSON_ARGS<|toolcallend|>
|
|
343
|
-
* With underscores: <|tool_call_begin|>functions.TOOLNAME:INDEX<|tool_call_argument_begin|>JSON_ARGS<|tool_call_end|>
|
|
344
|
-
*
|
|
345
|
-
* A trailing <|tool_calls_section_end|> or <|toolcallssectionend|> is also
|
|
346
|
-
* stripped from the cleaned content.
|
|
347
|
-
*
|
|
348
|
-
* @returns Extracted ToolCall array and the content with all tool-call tokens
|
|
349
|
-
* removed (trimmed). Returns empty array when no text-based calls are found.
|
|
350
|
-
*/
|
|
351
|
-
export function extractTextToolCalls(content: string): {
|
|
352
|
-
toolCalls: ToolCall[];
|
|
353
|
-
cleanedContent: string;
|
|
354
|
-
} {
|
|
355
|
-
// Fast path: skip regex work when neither sentinel variant is present
|
|
356
|
-
if (!content.includes('<|toolcallbegin|>') && !content.includes('<|tool_call_begin|>')) {
|
|
357
|
-
return { toolCalls: [], cleanedContent: content };
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
// Match both delimiter variants using optional underscores.
|
|
361
|
-
// The `.*?` lazy match with /s is safe here: backtracking is bounded by
|
|
362
|
-
// the end delimiter, which appears within kilobytes of the argument-begin
|
|
363
|
-
// delimiter — the span of a single tool call's JSON args.
|
|
364
|
-
// kimi is the known model that emits these delimiter formats.
|
|
365
|
-
const pattern =
|
|
366
|
-
/<\|tool_?call_?begin\|>functions\.([^:]+):\d+<\|tool_?call_?argument_?begin\|>(.*?)<\|tool_?call_?end\|>/gs;
|
|
367
|
-
|
|
368
|
-
const toolCalls: ToolCall[] = [];
|
|
369
|
-
// Build cleaned content in a single pass by collecting match spans,
|
|
370
|
-
// avoiding a second regex execution over the same string.
|
|
371
|
-
const segments: string[] = [];
|
|
372
|
-
let lastEnd = 0;
|
|
373
|
-
let index = 0;
|
|
374
|
-
|
|
375
|
-
for (const match of content.matchAll(pattern)) {
|
|
376
|
-
const matchStart = match.index!;
|
|
377
|
-
const matchEnd = matchStart + match[0].length;
|
|
378
|
-
// Collect the text before this match
|
|
379
|
-
segments.push(content.slice(lastEnd, matchStart));
|
|
380
|
-
lastEnd = matchEnd;
|
|
381
|
-
|
|
382
|
-
const toolName = match[1];
|
|
383
|
-
const rawArgs = match[2];
|
|
384
|
-
toolCalls.push({
|
|
385
|
-
id: `text-call-${index}`,
|
|
386
|
-
name: toolName,
|
|
387
|
-
arguments: parseJson(rawArgs),
|
|
388
|
-
});
|
|
389
|
-
index++;
|
|
390
|
-
}
|
|
391
|
-
// Append any trailing text after the last match
|
|
392
|
-
segments.push(content.slice(lastEnd));
|
|
393
|
-
|
|
394
|
-
// Strip section-end sentinels (both variants) and trim
|
|
395
|
-
const cleanedContent = segments
|
|
396
|
-
.join('')
|
|
397
|
-
.replace(/<\|tool_?calls_?section_?end\|>/g, '')
|
|
398
|
-
.trim();
|
|
399
|
-
|
|
400
|
-
return { toolCalls, cleanedContent };
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
// ---------------------------------------------------------------------------
|
|
404
|
-
// Shared helper
|
|
405
|
-
// ---------------------------------------------------------------------------
|
|
406
|
-
|
|
407
|
-
function parseJson(raw: string): Record<string, unknown> {
|
|
408
|
-
try {
|
|
409
|
-
return JSON.parse(raw) as Record<string, unknown>;
|
|
410
|
-
} catch (err) {
|
|
411
|
-
logger.warn('tool-formats: failed to parse JSON tool arguments', { error: summarizeError(err) });
|
|
412
|
-
return {};
|
|
413
|
-
}
|
|
414
|
-
}
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import { SecretsManager } from '../../config/secrets.ts';
|
|
2
|
-
import { ServiceRegistry } from '../../config/service-registry.ts';
|
|
3
|
-
import { SubscriptionManager, type ProviderSubscription } from '@pellux/goodvibes-sdk/platform/config/subscriptions';
|
|
4
|
-
import { getSubscriptionProviderConfig } from '../../config/subscription-providers.ts';
|
|
5
|
-
|
|
6
|
-
export type AuthInspectionFreshness = 'healthy' | 'expiring' | 'expired' | 'pending' | 'available' | 'unconfigured';
|
|
7
|
-
|
|
8
|
-
export interface ProviderAuthInspection {
|
|
9
|
-
readonly provider: string;
|
|
10
|
-
readonly configured: boolean;
|
|
11
|
-
readonly source?: 'service' | 'builtin';
|
|
12
|
-
readonly freshness: AuthInspectionFreshness;
|
|
13
|
-
readonly redirectUri?: string;
|
|
14
|
-
readonly callbackMode: 'local' | 'manual';
|
|
15
|
-
readonly localCallback?: string;
|
|
16
|
-
readonly activeSubscription: boolean;
|
|
17
|
-
readonly pendingLogin: boolean;
|
|
18
|
-
readonly overrideAmbientApiKeys: boolean;
|
|
19
|
-
readonly tokenType?: string;
|
|
20
|
-
readonly expiresAt?: number;
|
|
21
|
-
readonly issues: readonly string[];
|
|
22
|
-
readonly nextActions: readonly string[];
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface AuthInspectionSnapshot {
|
|
26
|
-
readonly generatedAt: number;
|
|
27
|
-
readonly secretKeyCount: number;
|
|
28
|
-
readonly activeSubscriptions: number;
|
|
29
|
-
readonly pendingSubscriptions: number;
|
|
30
|
-
readonly providers: readonly ProviderAuthInspection[];
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface AuthInspectionDeps {
|
|
34
|
-
readonly serviceRegistry: Pick<ServiceRegistry, 'get' | 'getAll'>;
|
|
35
|
-
readonly subscriptionManager: Pick<SubscriptionManager, 'get' | 'getPending' | 'list' | 'listPending'>;
|
|
36
|
-
readonly secretsManager: Pick<SecretsManager, 'list'>;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function determineFreshness(subscription: ProviderSubscription | null, pending: boolean, configured: boolean): AuthInspectionFreshness {
|
|
40
|
-
if (pending) return 'pending';
|
|
41
|
-
if (!subscription) return configured ? 'available' : 'unconfigured';
|
|
42
|
-
if (typeof subscription.expiresAt !== 'number' || !Number.isFinite(subscription.expiresAt)) return 'healthy';
|
|
43
|
-
if (subscription.expiresAt <= Date.now()) return 'expired';
|
|
44
|
-
if (subscription.expiresAt <= Date.now() + 24 * 60 * 60 * 1000) return 'expiring';
|
|
45
|
-
return 'healthy';
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export async function inspectProviderAuth(
|
|
49
|
-
provider: string,
|
|
50
|
-
deps: AuthInspectionDeps,
|
|
51
|
-
): Promise<ProviderAuthInspection> {
|
|
52
|
-
const service = deps.serviceRegistry.get(provider);
|
|
53
|
-
const resolved = getSubscriptionProviderConfig(provider, service);
|
|
54
|
-
const subscription = deps.subscriptionManager.get(provider);
|
|
55
|
-
const pending = deps.subscriptionManager.getPending(provider);
|
|
56
|
-
const configured = resolved != null;
|
|
57
|
-
const freshness = determineFreshness(subscription, pending != null, configured);
|
|
58
|
-
const issues: string[] = [];
|
|
59
|
-
const nextActions: string[] = [];
|
|
60
|
-
|
|
61
|
-
if (!configured) {
|
|
62
|
-
issues.push('No provider OAuth configuration is available.');
|
|
63
|
-
nextActions.push(`Add provider OAuth config or a built-in adapter before using /subscription login ${provider} start.`);
|
|
64
|
-
}
|
|
65
|
-
if (freshness === 'expired') {
|
|
66
|
-
issues.push('Stored provider session is expired.');
|
|
67
|
-
nextActions.push(`Refresh or replace the stored ${provider} session.`);
|
|
68
|
-
} else if (freshness === 'expiring') {
|
|
69
|
-
issues.push('Stored provider session expires within 24 hours.');
|
|
70
|
-
nextActions.push(`Verify or renew the stored ${provider} session soon.`);
|
|
71
|
-
} else if (freshness === 'pending') {
|
|
72
|
-
issues.push('OAuth login has started but has not been completed.');
|
|
73
|
-
nextActions.push(`Finish /subscription login ${provider} finish <code-or-url>.`);
|
|
74
|
-
} else if (freshness === 'available') {
|
|
75
|
-
nextActions.push(`Start /subscription login ${provider} start to create a stored session.`);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const callbackMode = resolved?.oauth.localCallback ? 'local' : 'manual';
|
|
79
|
-
const localCallback = resolved?.oauth.localCallback
|
|
80
|
-
? `${resolved.oauth.localCallback.host ?? 'localhost'}:${resolved.oauth.localCallback.port ?? 80}${resolved.oauth.localCallback.path ?? '/'}`
|
|
81
|
-
: undefined;
|
|
82
|
-
|
|
83
|
-
return Object.freeze({
|
|
84
|
-
provider,
|
|
85
|
-
configured,
|
|
86
|
-
...(resolved ? { source: resolved.source } : {}),
|
|
87
|
-
freshness,
|
|
88
|
-
...(resolved ? { redirectUri: resolved.oauth.redirectUri } : {}),
|
|
89
|
-
callbackMode,
|
|
90
|
-
...(localCallback ? { localCallback } : {}),
|
|
91
|
-
activeSubscription: subscription != null,
|
|
92
|
-
pendingLogin: pending != null,
|
|
93
|
-
overrideAmbientApiKeys: subscription?.overrideAmbientApiKeys ?? false,
|
|
94
|
-
...(subscription?.tokenType ? { tokenType: subscription.tokenType } : {}),
|
|
95
|
-
...(subscription?.expiresAt ? { expiresAt: subscription.expiresAt } : {}),
|
|
96
|
-
issues,
|
|
97
|
-
nextActions,
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
export async function buildAuthInspectionSnapshot(
|
|
102
|
-
deps: AuthInspectionDeps,
|
|
103
|
-
): Promise<AuthInspectionSnapshot> {
|
|
104
|
-
const secrets = await deps.secretsManager.list();
|
|
105
|
-
const services = deps.serviceRegistry.getAll();
|
|
106
|
-
const providerIds = new Set<string>([
|
|
107
|
-
...Object.values(services)
|
|
108
|
-
.filter((service) => service.authType === 'oauth' && service.oauth)
|
|
109
|
-
.map((service) => service.providerId ?? service.name),
|
|
110
|
-
...deps.subscriptionManager.list().map((entry) => entry.provider),
|
|
111
|
-
...deps.subscriptionManager.listPending().map((entry) => entry.provider),
|
|
112
|
-
]);
|
|
113
|
-
const providers = await Promise.all(
|
|
114
|
-
[...providerIds]
|
|
115
|
-
.sort((a, b) => a.localeCompare(b))
|
|
116
|
-
.map((provider) => inspectProviderAuth(provider, deps)),
|
|
117
|
-
);
|
|
118
|
-
return Object.freeze({
|
|
119
|
-
generatedAt: Date.now(),
|
|
120
|
-
secretKeyCount: secrets.length,
|
|
121
|
-
activeSubscriptions: deps.subscriptionManager.list().length,
|
|
122
|
-
pendingSubscriptions: deps.subscriptionManager.listPending().length,
|
|
123
|
-
providers,
|
|
124
|
-
});
|
|
125
|
-
}
|