@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/plugins/manager.ts
DELETED
|
@@ -1,481 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
-
import { dirname, join } from 'path';
|
|
3
|
-
import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
|
|
4
|
-
import {
|
|
5
|
-
discoverPlugins,
|
|
6
|
-
getPluginDirectories,
|
|
7
|
-
loadPlugin,
|
|
8
|
-
unloadPlugin,
|
|
9
|
-
type LoadedPlugin,
|
|
10
|
-
type PluginLoaderDeps,
|
|
11
|
-
type PluginPathOptions,
|
|
12
|
-
} from './loader';
|
|
13
|
-
import {
|
|
14
|
-
PluginTrustStore,
|
|
15
|
-
type PluginTrustTier,
|
|
16
|
-
type PluginTrustRecord,
|
|
17
|
-
type SignatureValidationResult,
|
|
18
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/plugins/trust';
|
|
19
|
-
import { PluginQuarantineEngine, type QuarantineRecord } from '@pellux/goodvibes-sdk/platform/runtime/plugins/quarantine';
|
|
20
|
-
import { isHighRiskCapability, resolveCapabilityManifest } from '@pellux/goodvibes-sdk/platform/runtime/plugins/manifest';
|
|
21
|
-
import type { PluginCapability, PluginManifestV2 } from '@pellux/goodvibes-sdk/platform/runtime/plugins/types';
|
|
22
|
-
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* PluginState — Persisted state for all plugins.
|
|
26
|
-
*/
|
|
27
|
-
interface PluginState {
|
|
28
|
-
/** Map of plugin name → enabled boolean. */
|
|
29
|
-
enabled: Record<string, boolean>;
|
|
30
|
-
/** Map of plugin name → plugin-specific config. */
|
|
31
|
-
config: Record<string, Record<string, unknown>>;
|
|
32
|
-
/** Map of plugin name → trust record. */
|
|
33
|
-
trust: Record<string, PluginTrustRecord>;
|
|
34
|
-
/** Map of plugin name → quarantine record. */
|
|
35
|
-
quarantine: Record<string, QuarantineRecord>;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* PluginStatus — Public-facing plugin info for /plugin list.
|
|
40
|
-
*/
|
|
41
|
-
export interface PluginStatus {
|
|
42
|
-
name: string;
|
|
43
|
-
version: string;
|
|
44
|
-
description: string;
|
|
45
|
-
author?: string;
|
|
46
|
-
enabled: boolean;
|
|
47
|
-
active: boolean;
|
|
48
|
-
/** Trust tier for this plugin. */
|
|
49
|
-
trustTier: PluginTrustTier;
|
|
50
|
-
/** Whether this plugin is currently quarantined. */
|
|
51
|
-
quarantined: boolean;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export interface PluginManagerObserver {
|
|
55
|
-
subscribe(callback: () => void): () => void;
|
|
56
|
-
list(): PluginStatus[];
|
|
57
|
-
capabilities(name: string): {
|
|
58
|
-
ok: boolean;
|
|
59
|
-
error?: string;
|
|
60
|
-
requested: string[];
|
|
61
|
-
highRisk: string[];
|
|
62
|
-
safe: string[];
|
|
63
|
-
tier: PluginTrustTier;
|
|
64
|
-
blocked: string[];
|
|
65
|
-
} | null;
|
|
66
|
-
getTrustRecord(name: string): Readonly<PluginTrustRecord> | undefined;
|
|
67
|
-
getQuarantineRecord(name: string): Readonly<QuarantineRecord> | undefined;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const DEFAULT_STATE: PluginState = { enabled: {}, config: {}, trust: {}, quarantine: {} };
|
|
71
|
-
|
|
72
|
-
export interface PluginManagerOptions {
|
|
73
|
-
readonly pathOptions: PluginPathOptions;
|
|
74
|
-
readonly stateFilePath?: string;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* PluginManager — orchestrates plugin discovery, loading, and persistence.
|
|
79
|
-
*/
|
|
80
|
-
export class PluginManager {
|
|
81
|
-
private plugins = new Map<string, LoadedPlugin>();
|
|
82
|
-
private state: PluginState = { ...DEFAULT_STATE, enabled: {}, config: {}, trust: {}, quarantine: {} };
|
|
83
|
-
private deps: PluginLoaderDeps | undefined;
|
|
84
|
-
|
|
85
|
-
/** Trust store — manages tier records for all plugins. */
|
|
86
|
-
private readonly trustStore = new PluginTrustStore();
|
|
87
|
-
/** Quarantine engine — manages plugin quarantine state. */
|
|
88
|
-
private readonly quarantineEngine = new PluginQuarantineEngine();
|
|
89
|
-
private readonly subscribers = new Set<() => void>();
|
|
90
|
-
private readonly pathOptions: PluginPathOptions;
|
|
91
|
-
private readonly stateFilePath: string;
|
|
92
|
-
|
|
93
|
-
constructor(options: PluginManagerOptions) {
|
|
94
|
-
this.pathOptions = options.pathOptions;
|
|
95
|
-
this.stateFilePath = options.stateFilePath
|
|
96
|
-
?? join(options.pathOptions.homeDir, '.goodvibes', 'tui', 'plugins.json');
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* init — Must be called once at startup with application dependencies.
|
|
101
|
-
* Loads state from disk, then discovers and loads all enabled plugins.
|
|
102
|
-
*/
|
|
103
|
-
async init(deps: PluginLoaderDeps): Promise<void> {
|
|
104
|
-
this.deps = deps;
|
|
105
|
-
this.loadState();
|
|
106
|
-
await this.loadEnabledPlugins();
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/** Returns status for all discovered plugins (enabled or not). */
|
|
110
|
-
list(): PluginStatus[] {
|
|
111
|
-
const discovered = this.discoverPlugins();
|
|
112
|
-
return discovered.map((d) => {
|
|
113
|
-
const loaded = this.plugins.get(d.manifest.name);
|
|
114
|
-
return {
|
|
115
|
-
name: d.manifest.name,
|
|
116
|
-
version: d.manifest.version,
|
|
117
|
-
description: d.manifest.description,
|
|
118
|
-
author: d.manifest.author,
|
|
119
|
-
enabled: this.isEnabled(d.manifest.name),
|
|
120
|
-
active: loaded?.active ?? false,
|
|
121
|
-
trustTier: this.trustStore.getTier(d.manifest.name),
|
|
122
|
-
quarantined: this.quarantineEngine.isQuarantined(d.manifest.name),
|
|
123
|
-
};
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
subscribe(callback: () => void): () => void {
|
|
128
|
-
this.subscribers.add(callback);
|
|
129
|
-
return () => this.subscribers.delete(callback);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
getTrustRecord(name: string): Readonly<PluginTrustRecord> | undefined {
|
|
133
|
-
return this.trustStore.getRecord(name);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
getQuarantineRecord(name: string): Readonly<QuarantineRecord> | undefined {
|
|
137
|
-
return this.quarantineEngine.getRecord(name);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* trust — Set the trust tier for a plugin.
|
|
142
|
-
*
|
|
143
|
-
* For the `trusted` tier, prefer `trustSigned()` which also validates the
|
|
144
|
-
* signature. This method is for operator-forced tier assignment.
|
|
145
|
-
*/
|
|
146
|
-
trust(
|
|
147
|
-
name: string,
|
|
148
|
-
tier: PluginTrustTier,
|
|
149
|
-
note?: string,
|
|
150
|
-
): { ok: boolean; error?: string } {
|
|
151
|
-
const discovered = this.findDiscoveredPlugin(name);
|
|
152
|
-
if (!discovered) {
|
|
153
|
-
return { ok: false, error: this.notFoundError(name) };
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Warn if trying to manually set 'trusted' without a signed manifest.
|
|
157
|
-
if (tier === 'trusted') {
|
|
158
|
-
const manifest = discovered.manifest as { signature?: string };
|
|
159
|
-
if (!manifest.signature) {
|
|
160
|
-
logger.warn(
|
|
161
|
-
`[plugins] '${name}' set to 'trusted' tier without a signed manifest — ` +
|
|
162
|
-
'consider using /plugin verify first',
|
|
163
|
-
);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
const record = this.trustStore.setTier(name, tier, { note });
|
|
168
|
-
this.state.trust[name] = record;
|
|
169
|
-
this.saveState();
|
|
170
|
-
logger.info(`[plugins] ${name}: trust tier set to '${tier}'`);
|
|
171
|
-
this.notifySubscribers();
|
|
172
|
-
return { ok: true };
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* trustSigned — Elevate a plugin to `trusted` after validating its manifest signature.
|
|
177
|
-
*/
|
|
178
|
-
trustSigned(
|
|
179
|
-
name: string,
|
|
180
|
-
publicKey?: string,
|
|
181
|
-
): { ok: boolean; fingerprint?: string; error?: string } {
|
|
182
|
-
const discovered = this.findDiscoveredPlugin(name);
|
|
183
|
-
if (!discovered) {
|
|
184
|
-
return { ok: false, error: this.notFoundError(name) };
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
const manifest = discovered.manifest as {
|
|
188
|
-
name: string;
|
|
189
|
-
version: string;
|
|
190
|
-
capabilities?: string[];
|
|
191
|
-
signature?: string;
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
const result = this.trustStore.trustSigned(name, manifest, publicKey);
|
|
195
|
-
if (!result.ok) {
|
|
196
|
-
return { ok: false, error: result.reason };
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
this.state.trust[name] = result.record;
|
|
200
|
-
this.saveState();
|
|
201
|
-
this.notifySubscribers();
|
|
202
|
-
return { ok: true, fingerprint: result.record.signatureFingerprint };
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
/**
|
|
206
|
-
* verify — Inspect a plugin's manifest signature without changing its tier.
|
|
207
|
-
*/
|
|
208
|
-
verify(name: string, publicKey?: string): { ok: boolean } & SignatureValidationResult {
|
|
209
|
-
const discovered = this.findDiscoveredPlugin(name);
|
|
210
|
-
if (!discovered) {
|
|
211
|
-
return { ok: false, valid: false, reason: this.notFoundError(name) };
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
const manifest = discovered.manifest as {
|
|
215
|
-
name: string;
|
|
216
|
-
version: string;
|
|
217
|
-
capabilities?: string[];
|
|
218
|
-
signature?: string;
|
|
219
|
-
};
|
|
220
|
-
|
|
221
|
-
const result = this.trustStore.verify(manifest, publicKey);
|
|
222
|
-
return { ok: result.valid, ...result };
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* capabilities — Return the capability information for a plugin.
|
|
227
|
-
*
|
|
228
|
-
* Returns the full set: requested, granted (based on current trust tier),
|
|
229
|
-
* denied, and which capabilities are high-risk.
|
|
230
|
-
*/
|
|
231
|
-
capabilities(name: string): {
|
|
232
|
-
ok: boolean;
|
|
233
|
-
error?: string;
|
|
234
|
-
requested: string[];
|
|
235
|
-
highRisk: string[];
|
|
236
|
-
safe: string[];
|
|
237
|
-
tier: PluginTrustTier;
|
|
238
|
-
blocked: string[];
|
|
239
|
-
} | null {
|
|
240
|
-
const discovered = this.findDiscoveredPlugin(name);
|
|
241
|
-
if (!discovered) {
|
|
242
|
-
return null;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
const manifest = discovered.manifest as { capabilities?: string[] };
|
|
246
|
-
const requested = (manifest.capabilities ?? []) as PluginCapability[];
|
|
247
|
-
const tier = this.trustStore.getTier(name);
|
|
248
|
-
const highRisk = requested.filter((c) => isHighRiskCapability(c));
|
|
249
|
-
const safe = requested.filter((c) => !isHighRiskCapability(c));
|
|
250
|
-
// Capabilities blocked by current trust tier
|
|
251
|
-
const blocked = tier !== 'trusted' ? highRisk : [];
|
|
252
|
-
|
|
253
|
-
return { ok: true, requested, highRisk, safe, tier, blocked };
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* quarantine — Apply quarantine to a plugin.
|
|
258
|
-
*
|
|
259
|
-
* This is the high-level operator path. It resolves the plugin's declared
|
|
260
|
-
* capability manifest using the current trust tier, then applies quarantine
|
|
261
|
-
* immediately to the resolved capability set.
|
|
262
|
-
*/
|
|
263
|
-
quarantine(
|
|
264
|
-
name: string,
|
|
265
|
-
reason: string,
|
|
266
|
-
): { ok: boolean; error?: string } {
|
|
267
|
-
const discovered = this.findDiscoveredPlugin(name);
|
|
268
|
-
if (!discovered) {
|
|
269
|
-
return { ok: false, error: this.notFoundError(name) };
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
if (this.quarantineEngine.isQuarantined(name)) {
|
|
273
|
-
return { ok: false, error: `Plugin '${name}' is already quarantined` };
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
const trustTier = this.trustStore.getTier(name);
|
|
277
|
-
const capabilityManifest = resolveCapabilityManifest(
|
|
278
|
-
name,
|
|
279
|
-
discovered.manifest as PluginManifestV2,
|
|
280
|
-
undefined,
|
|
281
|
-
trustTier,
|
|
282
|
-
);
|
|
283
|
-
|
|
284
|
-
const record = this.quarantineEngine.quarantine(name, capabilityManifest, reason);
|
|
285
|
-
if (!record) {
|
|
286
|
-
return { ok: false, error: `Failed to quarantine '${name}'` };
|
|
287
|
-
}
|
|
288
|
-
|
|
289
|
-
this.state.quarantine[name] = { ...record, revokedCapabilities: [...record.revokedCapabilities] };
|
|
290
|
-
this.saveState();
|
|
291
|
-
logger.warn(`[plugins] ${name}: quarantined — ${reason}`);
|
|
292
|
-
this.notifySubscribers();
|
|
293
|
-
return { ok: true };
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
/**
|
|
297
|
-
* liftQuarantine — Remove quarantine from a plugin.
|
|
298
|
-
*/
|
|
299
|
-
liftQuarantine(name: string): { ok: boolean; error?: string } {
|
|
300
|
-
if (!this.quarantineEngine.isQuarantined(name)) {
|
|
301
|
-
return { ok: false, error: `Plugin '${name}' is not quarantined` };
|
|
302
|
-
}
|
|
303
|
-
this.quarantineEngine.lift(name);
|
|
304
|
-
const record = this.quarantineEngine.getRecord(name);
|
|
305
|
-
if (record) {
|
|
306
|
-
this.state.quarantine[name] = { ...record, revokedCapabilities: [...record.revokedCapabilities] };
|
|
307
|
-
}
|
|
308
|
-
this.saveState();
|
|
309
|
-
logger.info(`[plugins] ${name}: quarantine lifted`);
|
|
310
|
-
this.notifySubscribers();
|
|
311
|
-
return { ok: true };
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/** Enable a plugin by name. Loads it immediately if deps are available. */
|
|
315
|
-
async enable(name: string): Promise<{ ok: boolean; error?: string }> {
|
|
316
|
-
if (this.isEnabled(name)) {
|
|
317
|
-
return { ok: false, error: `Plugin '${name}' is already enabled` };
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
const discovered = this.findDiscoveredPlugin(name);
|
|
321
|
-
if (!discovered) {
|
|
322
|
-
return { ok: false, error: this.notFoundError(name) };
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
this.state.enabled[name] = true;
|
|
326
|
-
this.saveState();
|
|
327
|
-
|
|
328
|
-
if (this.deps) {
|
|
329
|
-
const loaded = await loadPlugin(discovered, this.deps);
|
|
330
|
-
if (loaded) {
|
|
331
|
-
this.plugins.set(name, loaded);
|
|
332
|
-
this.notifySubscribers();
|
|
333
|
-
} else {
|
|
334
|
-
// Revert enable on load failure
|
|
335
|
-
delete this.state.enabled[name];
|
|
336
|
-
this.saveState();
|
|
337
|
-
return { ok: false, error: `Plugin '${name}' failed to load — check logs` };
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
return { ok: true };
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
/** Disable a plugin by name. Deactivates it immediately if active. */
|
|
345
|
-
async disable(name: string): Promise<{ ok: boolean; error?: string }> {
|
|
346
|
-
if (!this.isEnabled(name)) {
|
|
347
|
-
return { ok: false, error: `Plugin '${name}' is not enabled` };
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
const loaded = this.plugins.get(name);
|
|
351
|
-
if (loaded) {
|
|
352
|
-
await unloadPlugin(loaded);
|
|
353
|
-
this.plugins.delete(name);
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
delete this.state.enabled[name];
|
|
357
|
-
this.saveState();
|
|
358
|
-
this.notifySubscribers();
|
|
359
|
-
return { ok: true };
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
/** Reload all currently enabled plugins (deactivate then reactivate). */
|
|
363
|
-
async reload(): Promise<{ reloaded: number; failed: number }> {
|
|
364
|
-
const names = Object.keys(this.state.enabled).filter((n) => this.state.enabled[n]);
|
|
365
|
-
let reloaded = 0;
|
|
366
|
-
let failed = 0;
|
|
367
|
-
|
|
368
|
-
// Deactivate all
|
|
369
|
-
for (const name of names) {
|
|
370
|
-
const loaded = this.plugins.get(name);
|
|
371
|
-
if (loaded) {
|
|
372
|
-
await unloadPlugin(loaded);
|
|
373
|
-
this.plugins.delete(name);
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
// Reactivate with cache busting — append timestamp to force fresh import
|
|
378
|
-
if (this.deps) {
|
|
379
|
-
const discovered = this.discoverPlugins();
|
|
380
|
-
const cacheBust = Date.now();
|
|
381
|
-
for (const d of discovered) {
|
|
382
|
-
if (!this.isEnabled(d.manifest.name)) continue;
|
|
383
|
-
// Pass cacheBust so loadPlugin appends ?t=<timestamp> to the import URL,
|
|
384
|
-
// forcing Bun to bypass its module cache and re-execute the file.
|
|
385
|
-
const loaded = await loadPlugin(d, this.deps, cacheBust);
|
|
386
|
-
if (loaded) {
|
|
387
|
-
this.plugins.set(d.manifest.name, loaded);
|
|
388
|
-
reloaded++;
|
|
389
|
-
} else {
|
|
390
|
-
failed++;
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
this.notifySubscribers();
|
|
395
|
-
return { reloaded, failed };
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
/** Returns whether a plugin is marked as enabled in persisted state. */
|
|
399
|
-
isEnabled(name: string): boolean {
|
|
400
|
-
return this.state.enabled[name] === true;
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
/** Returns plugin-specific config for a given plugin name. */
|
|
404
|
-
getPluginConfig(name: string): Record<string, unknown> {
|
|
405
|
-
return this.state.config[name] ?? {};
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
// ─── Private helpers ────────────────────────────────────────────────────────
|
|
409
|
-
|
|
410
|
-
private async loadEnabledPlugins(): Promise<void> {
|
|
411
|
-
if (!this.deps) return;
|
|
412
|
-
const discovered = this.discoverPlugins();
|
|
413
|
-
for (const d of discovered) {
|
|
414
|
-
if (!this.isEnabled(d.manifest.name)) continue;
|
|
415
|
-
const loaded = await loadPlugin(d, this.deps);
|
|
416
|
-
if (loaded) {
|
|
417
|
-
this.plugins.set(d.manifest.name, loaded);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
this.notifySubscribers();
|
|
421
|
-
}
|
|
422
|
-
|
|
423
|
-
private loadState(): void {
|
|
424
|
-
try {
|
|
425
|
-
if (existsSync(this.stateFilePath)) {
|
|
426
|
-
const raw = readFileSync(this.stateFilePath, 'utf-8');
|
|
427
|
-
const parsed = JSON.parse(raw) as Partial<PluginState>;
|
|
428
|
-
this.state.enabled = parsed.enabled ?? {};
|
|
429
|
-
this.state.config = parsed.config ?? {};
|
|
430
|
-
this.state.trust = parsed.trust ?? {};
|
|
431
|
-
this.state.quarantine = parsed.quarantine ?? {};
|
|
432
|
-
// Restore trust and quarantine state into their engines.
|
|
433
|
-
if (Object.keys(this.state.trust).length > 0) {
|
|
434
|
-
this.trustStore.importRecords(this.state.trust);
|
|
435
|
-
}
|
|
436
|
-
// Note: quarantine records are read-only from persistence; active
|
|
437
|
-
// quarantines take effect when plugins are loaded via PluginLifecycleManager.
|
|
438
|
-
}
|
|
439
|
-
} catch (err) {
|
|
440
|
-
logger.warn(`[plugins] Could not load state: ${summarizeError(err)}`);
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
private saveState(): void {
|
|
445
|
-
try {
|
|
446
|
-
mkdirSync(dirname(this.stateFilePath), { recursive: true });
|
|
447
|
-
writeFileSync(this.stateFilePath, JSON.stringify(this.state, null, 2), 'utf-8');
|
|
448
|
-
} catch (err) {
|
|
449
|
-
logger.warn(`[plugins] Could not save state: ${summarizeError(err)}`);
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
private discoverPlugins() {
|
|
454
|
-
return discoverPlugins(this.pathOptions);
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
private findDiscoveredPlugin(name: string) {
|
|
458
|
-
return this.discoverPlugins().find((plugin) => plugin.manifest.name === name);
|
|
459
|
-
}
|
|
460
|
-
|
|
461
|
-
private notFoundError(name: string): string {
|
|
462
|
-
return `Plugin '${name}' not found in configured plugin search directories (${this.describeSearchDirectories()})`;
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
private describeSearchDirectories(): string {
|
|
466
|
-
return getPluginDirectories(this.pathOptions).join(', ');
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
private notifySubscribers(): void {
|
|
470
|
-
for (const callback of this.subscribers) {
|
|
471
|
-
try {
|
|
472
|
-
callback();
|
|
473
|
-
} catch (err) {
|
|
474
|
-
logger.debug('[plugins] subscriber callback failed', {
|
|
475
|
-
error: summarizeError(err),
|
|
476
|
-
});
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
}
|
package/src/profiles/shape.ts
DELETED
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { CONFIG_SCHEMA, type ConfigKey } from '../config/index.ts';
|
|
2
|
-
import type { ProfileData } from '@pellux/goodvibes-sdk/platform/profiles/manager';
|
|
3
|
-
|
|
4
|
-
function setNestedValue(target: Record<string, unknown>, path: readonly string[], value: unknown): void {
|
|
5
|
-
let current: Record<string, unknown> = target;
|
|
6
|
-
for (let index = 0; index < path.length - 1; index += 1) {
|
|
7
|
-
const segment = path[index];
|
|
8
|
-
const existing = current[segment];
|
|
9
|
-
if (!existing || typeof existing !== 'object') {
|
|
10
|
-
current[segment] = {};
|
|
11
|
-
}
|
|
12
|
-
current = current[segment] as Record<string, unknown>;
|
|
13
|
-
}
|
|
14
|
-
current[path[path.length - 1]!] = structuredClone(value);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
function getNestedValue(source: unknown, path: readonly string[]): unknown {
|
|
18
|
-
let current: unknown = source;
|
|
19
|
-
for (const segment of path) {
|
|
20
|
-
if (!current || typeof current !== 'object') return undefined;
|
|
21
|
-
current = (current as Record<string, unknown>)[segment];
|
|
22
|
-
}
|
|
23
|
-
return current;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function configSnapshotToProfileData(snapshot: Record<string, unknown>): ProfileData {
|
|
27
|
-
const profile: Record<string, unknown> = {};
|
|
28
|
-
for (const entry of CONFIG_SCHEMA) {
|
|
29
|
-
if (
|
|
30
|
-
!entry.key.startsWith('display.')
|
|
31
|
-
&& !entry.key.startsWith('provider.')
|
|
32
|
-
&& !entry.key.startsWith('behavior.')
|
|
33
|
-
) {
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
const value = snapshot[entry.key];
|
|
37
|
-
if (value !== undefined) {
|
|
38
|
-
setNestedValue(profile, entry.key.split('.'), value);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
return profile as ProfileData;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function profileDataToConfigSnapshot(data: ProfileData): Partial<Record<ConfigKey, unknown>> {
|
|
45
|
-
const snapshot: Partial<Record<ConfigKey, unknown>> = {};
|
|
46
|
-
for (const entry of CONFIG_SCHEMA) {
|
|
47
|
-
if (
|
|
48
|
-
!entry.key.startsWith('display.')
|
|
49
|
-
&& !entry.key.startsWith('provider.')
|
|
50
|
-
&& !entry.key.startsWith('behavior.')
|
|
51
|
-
) {
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
const value = getNestedValue(data, entry.key.split('.'));
|
|
55
|
-
if (value !== undefined) snapshot[entry.key] = structuredClone(value);
|
|
56
|
-
}
|
|
57
|
-
return snapshot;
|
|
58
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { AnthropicBedrockMantle } from '@anthropic-ai/bedrock-sdk';
|
|
2
|
-
import { AnthropicSdkProvider } from '@pellux/goodvibes-sdk/platform/providers/anthropic-sdk-provider';
|
|
3
|
-
|
|
4
|
-
const BEDROCK_MANTLE_MODELS = [
|
|
5
|
-
'claude-sonnet-4-6',
|
|
6
|
-
'claude-opus-4-6',
|
|
7
|
-
'claude-haiku-4-5',
|
|
8
|
-
];
|
|
9
|
-
|
|
10
|
-
function hasMantleCredentials(): boolean {
|
|
11
|
-
return Boolean(
|
|
12
|
-
process.env['AWS_BEARER_TOKEN_BEDROCK']
|
|
13
|
-
|| (process.env['AWS_ACCESS_KEY_ID'] && process.env['AWS_SECRET_ACCESS_KEY'])
|
|
14
|
-
|| process.env['AWS_PROFILE'],
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export class AmazonBedrockMantleProvider extends AnthropicSdkProvider {
|
|
19
|
-
constructor() {
|
|
20
|
-
const configured = hasMantleCredentials();
|
|
21
|
-
super({
|
|
22
|
-
name: 'amazon-bedrock-mantle',
|
|
23
|
-
label: 'Amazon Bedrock Mantle',
|
|
24
|
-
defaultModel: 'claude-sonnet-4-6',
|
|
25
|
-
models: BEDROCK_MANTLE_MODELS,
|
|
26
|
-
createClient: () => new AnthropicBedrockMantle({
|
|
27
|
-
apiKey: process.env['AWS_BEARER_TOKEN_BEDROCK'],
|
|
28
|
-
awsAccessKey: process.env['AWS_ACCESS_KEY_ID'] ?? null,
|
|
29
|
-
awsSecretAccessKey: process.env['AWS_SECRET_ACCESS_KEY'] ?? null,
|
|
30
|
-
awsSessionToken: process.env['AWS_SESSION_TOKEN'] ?? null,
|
|
31
|
-
awsProfile: process.env['AWS_PROFILE'],
|
|
32
|
-
awsRegion: process.env['AWS_REGION'] ?? process.env['AWS_DEFAULT_REGION'] ?? 'us-east-1',
|
|
33
|
-
}),
|
|
34
|
-
auth: {
|
|
35
|
-
mode: configured ? 'api-key' : 'anonymous',
|
|
36
|
-
configured,
|
|
37
|
-
detail: configured
|
|
38
|
-
? 'Bedrock Mantle auth is available through bearer token or AWS credential resolution.'
|
|
39
|
-
: 'Configure AWS_BEARER_TOKEN_BEDROCK or AWS credentials/profile for Bedrock Mantle.',
|
|
40
|
-
envVars: ['AWS_BEARER_TOKEN_BEDROCK', 'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN', 'AWS_PROFILE', 'AWS_REGION'],
|
|
41
|
-
secretKeys: ['AWS_BEARER_TOKEN_BEDROCK'],
|
|
42
|
-
allowAnonymous: true,
|
|
43
|
-
anonymousConfigured: Boolean(process.env['AWS_PROFILE']),
|
|
44
|
-
anonymousDetail: 'Bedrock Mantle can also use the AWS credential provider chain.',
|
|
45
|
-
},
|
|
46
|
-
streamProtocol: 'anthropic-sdk-stream',
|
|
47
|
-
notes: ['Bedrock Mantle uses the Anthropic Bedrock Mantle SDK path.'],
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { AnthropicBedrock } from '@anthropic-ai/bedrock-sdk';
|
|
2
|
-
import { AnthropicSdkProvider } from '@pellux/goodvibes-sdk/platform/providers/anthropic-sdk-provider';
|
|
3
|
-
|
|
4
|
-
const BEDROCK_MODELS = [
|
|
5
|
-
'claude-opus-4-6',
|
|
6
|
-
'claude-sonnet-4-6',
|
|
7
|
-
'claude-haiku-4-5',
|
|
8
|
-
];
|
|
9
|
-
|
|
10
|
-
function hasAwsCredentials(): boolean {
|
|
11
|
-
return Boolean(
|
|
12
|
-
process.env['AWS_BEARER_TOKEN_BEDROCK']
|
|
13
|
-
|| (process.env['AWS_ACCESS_KEY_ID'] && process.env['AWS_SECRET_ACCESS_KEY'])
|
|
14
|
-
|| process.env['AWS_PROFILE'],
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export class AmazonBedrockProvider extends AnthropicSdkProvider {
|
|
19
|
-
constructor() {
|
|
20
|
-
const configured = hasAwsCredentials();
|
|
21
|
-
super({
|
|
22
|
-
name: 'amazon-bedrock',
|
|
23
|
-
label: 'Amazon Bedrock',
|
|
24
|
-
defaultModel: 'claude-sonnet-4-6',
|
|
25
|
-
models: BEDROCK_MODELS,
|
|
26
|
-
createClient: () => {
|
|
27
|
-
const apiKey = process.env['AWS_BEARER_TOKEN_BEDROCK']?.trim();
|
|
28
|
-
const awsAccessKey = process.env['AWS_ACCESS_KEY_ID']?.trim();
|
|
29
|
-
const awsSecretKey = process.env['AWS_SECRET_ACCESS_KEY']?.trim();
|
|
30
|
-
const awsSessionToken = process.env['AWS_SESSION_TOKEN']?.trim();
|
|
31
|
-
const baseOptions = {
|
|
32
|
-
...(apiKey ? { apiKey } : {}),
|
|
33
|
-
awsRegion: process.env['AWS_REGION'] ?? process.env['AWS_DEFAULT_REGION'] ?? 'us-east-1',
|
|
34
|
-
};
|
|
35
|
-
if (awsAccessKey && awsSecretKey) {
|
|
36
|
-
return new AnthropicBedrock({
|
|
37
|
-
...baseOptions,
|
|
38
|
-
awsAccessKey,
|
|
39
|
-
awsSecretKey,
|
|
40
|
-
...(awsSessionToken ? { awsSessionToken } : {}),
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
return new AnthropicBedrock(baseOptions);
|
|
44
|
-
},
|
|
45
|
-
auth: {
|
|
46
|
-
mode: configured ? 'api-key' : 'anonymous',
|
|
47
|
-
configured,
|
|
48
|
-
detail: configured
|
|
49
|
-
? 'AWS Bedrock credentials are available through bearer token or AWS credential resolution.'
|
|
50
|
-
: 'Configure AWS_BEARER_TOKEN_BEDROCK or AWS credentials/profile for Amazon Bedrock.',
|
|
51
|
-
envVars: ['AWS_BEARER_TOKEN_BEDROCK', 'AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_SESSION_TOKEN', 'AWS_PROFILE', 'AWS_REGION'],
|
|
52
|
-
secretKeys: ['AWS_BEARER_TOKEN_BEDROCK'],
|
|
53
|
-
allowAnonymous: true,
|
|
54
|
-
anonymousConfigured: Boolean(process.env['AWS_PROFILE']),
|
|
55
|
-
anonymousDetail: 'The AWS credential provider chain can satisfy Bedrock auth without storing an API key in GoodVibes.',
|
|
56
|
-
},
|
|
57
|
-
streamProtocol: 'anthropic-sdk-stream',
|
|
58
|
-
notes: ['Claude-on-Bedrock models are exposed through the Anthropic Bedrock SDK.'],
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
}
|