@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,375 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SloCollector — collects SLO duration measurements from runtime events.
|
|
3
|
-
*
|
|
4
|
-
* Listens to the RuntimeEventBus and tracks four critical path latencies:
|
|
5
|
-
* - turn_start_ms: TURN_SUBMITTED → first STREAM_DELTA
|
|
6
|
-
* - cancel_ms: TURN_CANCEL → TURN_COMPLETED or TURN_ERROR
|
|
7
|
-
* - reconnect_recovery_ms: TRANSPORT_RECONNECTING → TRANSPORT_CONNECTED
|
|
8
|
-
* - permission_decision_ms: PERMISSION_REQUESTED → DECISION_EMITTED
|
|
9
|
-
*
|
|
10
|
-
* Maintains a capped rolling window of measurements per SLO and exposes
|
|
11
|
-
* p95 values for PerfMonitor integration via `getMetrics()`.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import type { RuntimeEventBus, RuntimeEventEnvelope, AnyRuntimeEvent } from '@pellux/goodvibes-sdk/platform/runtime/events/index';
|
|
15
|
-
import type { PerfMetric } from '@pellux/goodvibes-sdk/platform/runtime/perf/types';
|
|
16
|
-
|
|
17
|
-
/** Metric key constants for each SLO measurement. */
|
|
18
|
-
export const SLO_METRICS = {
|
|
19
|
-
TURN_START: 'slo.turn_start.p95',
|
|
20
|
-
CANCEL: 'slo.cancel.p95',
|
|
21
|
-
RECONNECT_RECOVERY: 'slo.reconnect_recovery.p95',
|
|
22
|
-
PERMISSION_DECISION: 'slo.permission_decision.p95',
|
|
23
|
-
} as const;
|
|
24
|
-
|
|
25
|
-
/** Maximum number of samples retained in each rolling window. */
|
|
26
|
-
const WINDOW_SIZE = 200;
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Maximum age for a pending map entry before it is swept as stale.
|
|
30
|
-
* Entries that never receive a follow-up event (e.g. TURN_CANCEL without
|
|
31
|
-
* TURN_COMPLETED due to a connection drop) are evicted after this duration
|
|
32
|
-
* to prevent unbounded memory growth.
|
|
33
|
-
*/
|
|
34
|
-
const PENDING_TTL_MS = 60_000;
|
|
35
|
-
|
|
36
|
-
/** Interval between periodic stale-entry sweeps (ms). */
|
|
37
|
-
const SWEEP_INTERVAL_MS = 30_000;
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Computes the 95th percentile from a numeric array.
|
|
41
|
-
* Returns 0 for empty arrays.
|
|
42
|
-
*/
|
|
43
|
-
function p95(values: readonly number[]): number {
|
|
44
|
-
if (values.length === 0) return 0;
|
|
45
|
-
const sorted = [...values].sort((a, b) => a - b);
|
|
46
|
-
const idx = Math.ceil(sorted.length * 0.95) - 1;
|
|
47
|
-
return sorted[Math.max(0, idx)] ?? 0;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Appends a sample to a capped rolling window.
|
|
52
|
-
* Evicts the oldest entry when the window exceeds WINDOW_SIZE.
|
|
53
|
-
*/
|
|
54
|
-
function appendSample(window: number[], sample: number): void {
|
|
55
|
-
window.push(sample);
|
|
56
|
-
if (window.length > WINDOW_SIZE) {
|
|
57
|
-
window.shift();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** Minimal shape for an untyped envelope used for payload extraction. */
|
|
62
|
-
type RawEnvelope = RuntimeEventEnvelope<AnyRuntimeEvent['type'], AnyRuntimeEvent>;
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Coerce a strongly-typed bus callback argument to the raw envelope shape.
|
|
66
|
-
*
|
|
67
|
-
* The RuntimeEventBus `on()` callback receives a per-event typed envelope,
|
|
68
|
-
* but SloCollector reads only generic fields (`.ts`, `.payload.*`). The
|
|
69
|
-
* double-cast is intentional: we lose specificity to gain a uniform access
|
|
70
|
-
* pattern, isolated to this single conversion site.
|
|
71
|
-
*/
|
|
72
|
-
function toRaw(env: unknown): RawEnvelope {
|
|
73
|
-
return env as unknown as RawEnvelope;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/**
|
|
77
|
-
* Safely extract a named field from an envelope payload.
|
|
78
|
-
* Returns `undefined` when the field does not exist on the payload.
|
|
79
|
-
*/
|
|
80
|
-
function getField<T>(envelope: RawEnvelope, key: string): T | undefined {
|
|
81
|
-
const payload = envelope.payload as Record<string, unknown>;
|
|
82
|
-
return payload[key] as T | undefined;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* SloCollector subscribes to RuntimeEventBus events and tracks per-SLO
|
|
87
|
-
* duration samples in rolling windows. Call `getMetrics()` to retrieve
|
|
88
|
-
* current p95 values compatible with PerfMonitor's extraMetrics field.
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* ```ts
|
|
92
|
-
* const collector = new SloCollector(bus);
|
|
93
|
-
* const metrics = collector.getMetrics();
|
|
94
|
-
* const report = monitor.evaluate({ uiPerf, extraMetrics: Object.fromEntries(
|
|
95
|
-
* metrics.map(m => [m.name, m.value])
|
|
96
|
-
* )});
|
|
97
|
-
* collector.dispose();
|
|
98
|
-
* ```
|
|
99
|
-
*/
|
|
100
|
-
export class SloCollector {
|
|
101
|
-
/** Rolling window of turn_start_ms samples (TURN_SUBMITTED → first STREAM_DELTA). */
|
|
102
|
-
private readonly _turnStartSamples: number[] = [];
|
|
103
|
-
/** Rolling window of cancel_ms samples (TURN_CANCEL → TURN_COMPLETED/ERROR). */
|
|
104
|
-
private readonly _cancelSamples: number[] = [];
|
|
105
|
-
/** Rolling window of reconnect_recovery_ms samples (TRANSPORT_RECONNECTING → TRANSPORT_CONNECTED). */
|
|
106
|
-
private readonly _reconnectSamples: number[] = [];
|
|
107
|
-
/** Rolling window of permission_decision_ms samples (PERMISSION_REQUESTED → DECISION_EMITTED). */
|
|
108
|
-
private readonly _permissionSamples: number[] = [];
|
|
109
|
-
|
|
110
|
-
/** Pending turn start timestamps keyed by turnId. */
|
|
111
|
-
private readonly _pendingTurnStart = new Map<string, number>();
|
|
112
|
-
/** Tracks which turnIds have received their first STREAM_DELTA. */
|
|
113
|
-
private readonly _seenFirstDelta = new Set<string>();
|
|
114
|
-
/** Pending cancel timestamps keyed by turnId (set on TURN_CANCEL). */
|
|
115
|
-
private readonly _pendingCancel = new Map<string, number>();
|
|
116
|
-
/** Pending reconnect start timestamp. Only the most recent reconnect attempt is tracked. */
|
|
117
|
-
private _pendingReconnectAt: number | null = null;
|
|
118
|
-
/** Pending permission request timestamps keyed by callId. */
|
|
119
|
-
private readonly _pendingPermission = new Map<string, number>();
|
|
120
|
-
|
|
121
|
-
/** Registered unsubscribe functions. */
|
|
122
|
-
private readonly _unsubs: Array<() => void> = [];
|
|
123
|
-
|
|
124
|
-
/** Timer handle for the periodic stale-entry sweep. */
|
|
125
|
-
private _sweepTimer: ReturnType<typeof setInterval> | null = null;
|
|
126
|
-
|
|
127
|
-
constructor(bus: RuntimeEventBus) {
|
|
128
|
-
this._subscribe(bus);
|
|
129
|
-
this._sweepTimer = setInterval(() => this._sweepPending(), SWEEP_INTERVAL_MS);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Attach all event listeners to the bus.
|
|
134
|
-
*/
|
|
135
|
-
private _subscribe(bus: RuntimeEventBus): void {
|
|
136
|
-
// ── turn_start_ms ───────────────────────────────────────────────────────
|
|
137
|
-
this._unsubs.push(
|
|
138
|
-
bus.on('TURN_SUBMITTED', (env) => {
|
|
139
|
-
const e = toRaw(env);
|
|
140
|
-
const turnId = getField<string>(e, 'turnId');
|
|
141
|
-
if (turnId !== undefined) {
|
|
142
|
-
this._pendingTurnStart.set(turnId, e.ts);
|
|
143
|
-
this._seenFirstDelta.delete(turnId);
|
|
144
|
-
}
|
|
145
|
-
})
|
|
146
|
-
);
|
|
147
|
-
|
|
148
|
-
this._unsubs.push(
|
|
149
|
-
bus.on('STREAM_DELTA', (env) => {
|
|
150
|
-
const e = toRaw(env);
|
|
151
|
-
const turnId = getField<string>(e, 'turnId');
|
|
152
|
-
if (turnId === undefined) return;
|
|
153
|
-
if (this._seenFirstDelta.has(turnId)) return;
|
|
154
|
-
this._seenFirstDelta.add(turnId);
|
|
155
|
-
const startAt = this._pendingTurnStart.get(turnId);
|
|
156
|
-
if (startAt !== undefined) {
|
|
157
|
-
appendSample(this._turnStartSamples, e.ts - startAt);
|
|
158
|
-
this._pendingTurnStart.delete(turnId);
|
|
159
|
-
}
|
|
160
|
-
})
|
|
161
|
-
);
|
|
162
|
-
|
|
163
|
-
// Clean up stale pending turn starts when a turn ends without streaming
|
|
164
|
-
this._unsubs.push(
|
|
165
|
-
bus.on('PREFLIGHT_FAIL', (env) => {
|
|
166
|
-
const e = toRaw(env);
|
|
167
|
-
const turnId = getField<string>(e, 'turnId');
|
|
168
|
-
if (turnId !== undefined) {
|
|
169
|
-
this._pendingTurnStart.delete(turnId);
|
|
170
|
-
this._seenFirstDelta.delete(turnId);
|
|
171
|
-
this._pendingCancel.delete(turnId);
|
|
172
|
-
}
|
|
173
|
-
})
|
|
174
|
-
);
|
|
175
|
-
|
|
176
|
-
this._unsubs.push(
|
|
177
|
-
bus.on('TURN_ERROR', (env) => {
|
|
178
|
-
const e = toRaw(env);
|
|
179
|
-
const turnId = getField<string>(e, 'turnId');
|
|
180
|
-
if (turnId !== undefined) {
|
|
181
|
-
this._pendingTurnStart.delete(turnId);
|
|
182
|
-
this._seenFirstDelta.delete(turnId);
|
|
183
|
-
// Resolve cancel if pending
|
|
184
|
-
const cancelAt = this._pendingCancel.get(turnId);
|
|
185
|
-
if (cancelAt !== undefined) {
|
|
186
|
-
appendSample(this._cancelSamples, e.ts - cancelAt);
|
|
187
|
-
this._pendingCancel.delete(turnId);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
})
|
|
191
|
-
);
|
|
192
|
-
|
|
193
|
-
this._unsubs.push(
|
|
194
|
-
bus.on('TURN_COMPLETED', (env) => {
|
|
195
|
-
const e = toRaw(env);
|
|
196
|
-
const turnId = getField<string>(e, 'turnId');
|
|
197
|
-
if (turnId !== undefined) {
|
|
198
|
-
this._pendingTurnStart.delete(turnId);
|
|
199
|
-
this._seenFirstDelta.delete(turnId);
|
|
200
|
-
// Resolve cancel if pending
|
|
201
|
-
const cancelAt = this._pendingCancel.get(turnId);
|
|
202
|
-
if (cancelAt !== undefined) {
|
|
203
|
-
appendSample(this._cancelSamples, e.ts - cancelAt);
|
|
204
|
-
this._pendingCancel.delete(turnId);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
})
|
|
208
|
-
);
|
|
209
|
-
|
|
210
|
-
// ── cancel_ms ───────────────────────────────────────────────────────────
|
|
211
|
-
this._unsubs.push(
|
|
212
|
-
bus.on('TURN_CANCEL', (env) => {
|
|
213
|
-
const e = toRaw(env);
|
|
214
|
-
const turnId = getField<string>(e, 'turnId');
|
|
215
|
-
if (turnId !== undefined) {
|
|
216
|
-
this._pendingCancel.set(turnId, e.ts);
|
|
217
|
-
}
|
|
218
|
-
})
|
|
219
|
-
);
|
|
220
|
-
|
|
221
|
-
// ── reconnect_recovery_ms ───────────────────────────────────────────────
|
|
222
|
-
this._unsubs.push(
|
|
223
|
-
bus.on('TRANSPORT_RECONNECTING', (env) => {
|
|
224
|
-
const e = toRaw(env);
|
|
225
|
-
const attempt = getField<number>(e, 'attempt');
|
|
226
|
-
// Track start of reconnect sequence; use first attempt timestamp
|
|
227
|
-
if (attempt === 1 || this._pendingReconnectAt === null) {
|
|
228
|
-
this._pendingReconnectAt = e.ts;
|
|
229
|
-
}
|
|
230
|
-
})
|
|
231
|
-
);
|
|
232
|
-
|
|
233
|
-
this._unsubs.push(
|
|
234
|
-
bus.on('TRANSPORT_CONNECTED', (env) => {
|
|
235
|
-
const e = toRaw(env);
|
|
236
|
-
if (this._pendingReconnectAt !== null) {
|
|
237
|
-
appendSample(this._reconnectSamples, e.ts - this._pendingReconnectAt);
|
|
238
|
-
this._pendingReconnectAt = null;
|
|
239
|
-
}
|
|
240
|
-
})
|
|
241
|
-
);
|
|
242
|
-
|
|
243
|
-
// Clear pending reconnect on terminal failure
|
|
244
|
-
this._unsubs.push(
|
|
245
|
-
bus.on('TRANSPORT_TERMINAL_FAILURE', () => {
|
|
246
|
-
this._pendingReconnectAt = null;
|
|
247
|
-
})
|
|
248
|
-
);
|
|
249
|
-
|
|
250
|
-
// ── permission_decision_ms ──────────────────────────────────────────────
|
|
251
|
-
this._unsubs.push(
|
|
252
|
-
bus.on('PERMISSION_REQUESTED', (env) => {
|
|
253
|
-
const e = toRaw(env);
|
|
254
|
-
const callId = getField<string>(e, 'callId');
|
|
255
|
-
if (callId !== undefined) {
|
|
256
|
-
this._pendingPermission.set(callId, e.ts);
|
|
257
|
-
}
|
|
258
|
-
})
|
|
259
|
-
);
|
|
260
|
-
|
|
261
|
-
this._unsubs.push(
|
|
262
|
-
bus.on('DECISION_EMITTED', (env) => {
|
|
263
|
-
const e = toRaw(env);
|
|
264
|
-
const callId = getField<string>(e, 'callId');
|
|
265
|
-
if (callId !== undefined) {
|
|
266
|
-
const startAt = this._pendingPermission.get(callId);
|
|
267
|
-
if (startAt !== undefined) {
|
|
268
|
-
appendSample(this._permissionSamples, e.ts - startAt);
|
|
269
|
-
this._pendingPermission.delete(callId);
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
})
|
|
273
|
-
);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Sweep all pending maps and evict entries older than PENDING_TTL_MS.
|
|
278
|
-
*
|
|
279
|
-
* Called periodically by the sweep timer to prevent unbounded memory growth
|
|
280
|
-
* when expected follow-up events (e.g. TURN_COMPLETED after TURN_CANCEL)
|
|
281
|
-
* never arrive due to connection drops or unexpected process termination.
|
|
282
|
-
*/
|
|
283
|
-
private _sweepPending(): void {
|
|
284
|
-
const cutoff = Date.now() - PENDING_TTL_MS;
|
|
285
|
-
for (const [key, ts] of this._pendingTurnStart) {
|
|
286
|
-
if (ts < cutoff) {
|
|
287
|
-
this._pendingTurnStart.delete(key);
|
|
288
|
-
this._seenFirstDelta.delete(key);
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
for (const [key, ts] of this._pendingCancel) {
|
|
292
|
-
if (ts < cutoff) this._pendingCancel.delete(key);
|
|
293
|
-
}
|
|
294
|
-
for (const [key, ts] of this._pendingPermission) {
|
|
295
|
-
if (ts < cutoff) this._pendingPermission.delete(key);
|
|
296
|
-
}
|
|
297
|
-
// _pendingReconnectAt is a scalar; clear if stale
|
|
298
|
-
if (this._pendingReconnectAt !== null && this._pendingReconnectAt < cutoff) {
|
|
299
|
-
this._pendingReconnectAt = null;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Returns current p95 values for all four SLO metrics as PerfMetric entries.
|
|
305
|
-
* Metrics with no samples return a value of 0.
|
|
306
|
-
*
|
|
307
|
-
* Intended for use with `PerfMonitor.evaluate()` via the `extraMetrics` field:
|
|
308
|
-
* ```ts
|
|
309
|
-
* const extras = Object.fromEntries(collector.getMetrics().map(m => [m.name, m.value]));
|
|
310
|
-
* monitor.evaluate({ uiPerf, extraMetrics: extras });
|
|
311
|
-
* ```
|
|
312
|
-
*/
|
|
313
|
-
public getMetrics(): PerfMetric[] {
|
|
314
|
-
const now = Date.now();
|
|
315
|
-
return [
|
|
316
|
-
{
|
|
317
|
-
name: SLO_METRICS.TURN_START,
|
|
318
|
-
value: p95(this._turnStartSamples),
|
|
319
|
-
unit: 'ms',
|
|
320
|
-
timestamp: now,
|
|
321
|
-
},
|
|
322
|
-
{
|
|
323
|
-
name: SLO_METRICS.CANCEL,
|
|
324
|
-
value: p95(this._cancelSamples),
|
|
325
|
-
unit: 'ms',
|
|
326
|
-
timestamp: now,
|
|
327
|
-
},
|
|
328
|
-
{
|
|
329
|
-
name: SLO_METRICS.RECONNECT_RECOVERY,
|
|
330
|
-
value: p95(this._reconnectSamples),
|
|
331
|
-
unit: 'ms',
|
|
332
|
-
timestamp: now,
|
|
333
|
-
},
|
|
334
|
-
{
|
|
335
|
-
name: SLO_METRICS.PERMISSION_DECISION,
|
|
336
|
-
value: p95(this._permissionSamples),
|
|
337
|
-
unit: 'ms',
|
|
338
|
-
timestamp: now,
|
|
339
|
-
},
|
|
340
|
-
];
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* Returns the number of samples collected for each SLO metric.
|
|
345
|
-
* Useful for diagnostics to distinguish "no data yet" from an actual 0ms result.
|
|
346
|
-
*/
|
|
347
|
-
public getSampleCounts(): Readonly<Record<string, number>> {
|
|
348
|
-
return {
|
|
349
|
-
[SLO_METRICS.TURN_START]: this._turnStartSamples.length,
|
|
350
|
-
[SLO_METRICS.CANCEL]: this._cancelSamples.length,
|
|
351
|
-
[SLO_METRICS.RECONNECT_RECOVERY]: this._reconnectSamples.length,
|
|
352
|
-
[SLO_METRICS.PERMISSION_DECISION]: this._permissionSamples.length,
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
|
|
356
|
-
/**
|
|
357
|
-
* Unsubscribes all event listeners and releases resources.
|
|
358
|
-
* The collector should not be used after disposal.
|
|
359
|
-
*/
|
|
360
|
-
public dispose(): void {
|
|
361
|
-
if (this._sweepTimer !== null) {
|
|
362
|
-
clearInterval(this._sweepTimer);
|
|
363
|
-
this._sweepTimer = null;
|
|
364
|
-
}
|
|
365
|
-
for (const unsub of this._unsubs) {
|
|
366
|
-
unsub();
|
|
367
|
-
}
|
|
368
|
-
this._unsubs.length = 0;
|
|
369
|
-
this._pendingTurnStart.clear();
|
|
370
|
-
this._seenFirstDelta.clear();
|
|
371
|
-
this._pendingCancel.clear();
|
|
372
|
-
this._pendingPermission.clear();
|
|
373
|
-
this._pendingReconnectAt = null;
|
|
374
|
-
}
|
|
375
|
-
}
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Runtime permissions public API barrel.
|
|
3
|
-
*
|
|
4
|
-
* Exports the LayeredPolicyEvaluator, all types, rule evaluators, safety checks,
|
|
5
|
-
* and the createPermissionEvaluator() factory function.
|
|
6
|
-
*
|
|
7
|
-
* Feature flag: `permissions-policy-engine` must be enabled to use this module in production.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
export { LayeredPolicyEvaluator } from '@pellux/goodvibes-sdk/platform/runtime/permissions/evaluator';
|
|
11
|
-
export { DecisionLog } from '@pellux/goodvibes-sdk/platform/runtime/permissions/decision-log';
|
|
12
|
-
export { runSafetyChecks } from '@pellux/goodvibes-sdk/platform/runtime/permissions/safety-checks';
|
|
13
|
-
export { PermissionSimulator, SimulationEnforcementError } from '@pellux/goodvibes-sdk/platform/runtime/permissions/simulation';
|
|
14
|
-
export { buildDefaultPolicySimulationScenarios, runPolicySimulationScenarios } from '@pellux/goodvibes-sdk/platform/runtime/permissions/simulation-scenarios';
|
|
15
|
-
export { lintPolicyConfig } from '@pellux/goodvibes-sdk/platform/runtime/permissions/lint';
|
|
16
|
-
export { buildPolicyPreflightReview } from '@pellux/goodvibes-sdk/platform/runtime/permissions/preflight';
|
|
17
|
-
export { buildPermissionRuleSuggestions } from '@pellux/goodvibes-sdk/platform/runtime/permissions/rule-suggestions';
|
|
18
|
-
// Policy signing
|
|
19
|
-
export { signBundle, verifyBundle, canonicalise } from '@pellux/goodvibes-sdk/platform/runtime/permissions/policy-signer';
|
|
20
|
-
export { loadPolicyBundle, createUnsignedBundle, PolicySignatureError } from '@pellux/goodvibes-sdk/platform/runtime/permissions/policy-loader';
|
|
21
|
-
|
|
22
|
-
export type {
|
|
23
|
-
PermissionMode,
|
|
24
|
-
CommandClassification,
|
|
25
|
-
DecisionReason,
|
|
26
|
-
SourceLayer,
|
|
27
|
-
EvaluationStep,
|
|
28
|
-
PermissionDecision,
|
|
29
|
-
PolicyRule,
|
|
30
|
-
PrefixRule,
|
|
31
|
-
ArgShapeRule,
|
|
32
|
-
PathScopeRule,
|
|
33
|
-
NetworkScopeRule,
|
|
34
|
-
ModeConstraintRule,
|
|
35
|
-
RuleOrigin,
|
|
36
|
-
PermissionsConfig,
|
|
37
|
-
SimulationMode,
|
|
38
|
-
SimulationResult,
|
|
39
|
-
DivergenceType,
|
|
40
|
-
DivergenceRecord,
|
|
41
|
-
DivergenceStats,
|
|
42
|
-
DivergenceReport,
|
|
43
|
-
PermissionSimulatorConfig,
|
|
44
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/permissions/types';
|
|
45
|
-
|
|
46
|
-
export type { DecisionLogEntry, DecisionLogQuery } from '@pellux/goodvibes-sdk/platform/runtime/permissions/decision-log';
|
|
47
|
-
export type { SafetyCheckResult } from '@pellux/goodvibes-sdk/platform/runtime/permissions/safety-checks';
|
|
48
|
-
export type { PolicyLintFinding, PolicyLintSeverity } from '@pellux/goodvibes-sdk/platform/runtime/permissions/lint';
|
|
49
|
-
export type { PermissionRuleSuggestion } from '@pellux/goodvibes-sdk/platform/runtime/permissions/rule-suggestions';
|
|
50
|
-
export type {
|
|
51
|
-
PolicyPreflightStatus,
|
|
52
|
-
PolicyPreflightServer,
|
|
53
|
-
PolicyPreflightIssue,
|
|
54
|
-
PolicyPreflightReview,
|
|
55
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/permissions/preflight';
|
|
56
|
-
export type {
|
|
57
|
-
PolicySimulationScenario,
|
|
58
|
-
PolicySimulationScenarioResult,
|
|
59
|
-
PolicySimulationSummary,
|
|
60
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/permissions/simulation-scenarios';
|
|
61
|
-
// Policy signing
|
|
62
|
-
export type {
|
|
63
|
-
PolicyBundleId,
|
|
64
|
-
SignatureStatus,
|
|
65
|
-
ProvenanceSource,
|
|
66
|
-
SignedPolicyBundle,
|
|
67
|
-
VerifyResult,
|
|
68
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/permissions/policy-signer';
|
|
69
|
-
export type {
|
|
70
|
-
PolicyBundlePayload,
|
|
71
|
-
BundleProvenance,
|
|
72
|
-
PolicyLoadResult,
|
|
73
|
-
PolicyLoaderOptions,
|
|
74
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/permissions/policy-loader';
|
|
75
|
-
|
|
76
|
-
export {
|
|
77
|
-
evaluatePrefixRule,
|
|
78
|
-
evaluateArgShapeRule,
|
|
79
|
-
evaluatePathScopeRule,
|
|
80
|
-
evaluateNetworkScopeRule,
|
|
81
|
-
evaluateModeConstraintRule,
|
|
82
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/permissions/rules/index';
|
|
83
|
-
|
|
84
|
-
// Divergence dashboard
|
|
85
|
-
export {
|
|
86
|
-
DivergenceDashboard,
|
|
87
|
-
DivergenceGateError,
|
|
88
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/permissions/divergence-dashboard';
|
|
89
|
-
export type {
|
|
90
|
-
DivergenceTrendEntry,
|
|
91
|
-
EnforceGateStatus,
|
|
92
|
-
EnforceGateResult,
|
|
93
|
-
DivergenceDashboardSnapshot,
|
|
94
|
-
DivergenceDashboardConfig,
|
|
95
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/permissions/divergence-dashboard';
|
|
96
|
-
|
|
97
|
-
// Policy-as-Code
|
|
98
|
-
export { PolicyRegistry } from '@pellux/goodvibes-sdk/platform/runtime/permissions/policy-registry';
|
|
99
|
-
export {
|
|
100
|
-
PolicyRuntimeState,
|
|
101
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/permissions/policy-runtime';
|
|
102
|
-
export type {
|
|
103
|
-
BundleLifecycleState,
|
|
104
|
-
PolicyBundleVersion,
|
|
105
|
-
PolicyDiffResult,
|
|
106
|
-
PromoteResult,
|
|
107
|
-
RollbackResult,
|
|
108
|
-
PolicyRegistryConfig,
|
|
109
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/permissions/policy-registry';
|
|
110
|
-
|
|
111
|
-
// ── Factory ──────────────────────────────────────────────────────────────────────
|
|
112
|
-
|
|
113
|
-
import { LayeredPolicyEvaluator } from '@pellux/goodvibes-sdk/platform/runtime/permissions/evaluator';
|
|
114
|
-
import { PermissionSimulator } from '@pellux/goodvibes-sdk/platform/runtime/permissions/simulation';
|
|
115
|
-
import type { PermissionsConfig, SimulationMode, PermissionSimulatorConfig } from '@pellux/goodvibes-sdk/platform/runtime/permissions/types';
|
|
116
|
-
import type { FeatureFlagManager } from '@pellux/goodvibes-sdk/platform/runtime/feature-flags/manager';
|
|
117
|
-
import type { BundleProvenance } from '@pellux/goodvibes-sdk/platform/runtime/permissions/policy-loader';
|
|
118
|
-
|
|
119
|
-
/**
|
|
120
|
-
* createPermissionEvaluator — Factory function for the runtime permission evaluator.
|
|
121
|
-
*
|
|
122
|
-
* Returns a LayeredPolicyEvaluator configured with the given options.
|
|
123
|
-
* Designed as the primary entry point for integrating the runtime permissions system.
|
|
124
|
-
*
|
|
125
|
-
* The returned evaluator exposes:
|
|
126
|
-
* - `evaluate(toolName, args)` — perform a full layered evaluation
|
|
127
|
-
* - `recordSessionOverride(...)` — cache a user prompt response
|
|
128
|
-
* - `log` — DecisionLog for audit queries
|
|
129
|
-
* - `getMode()` — inspect the active mode
|
|
130
|
-
*
|
|
131
|
-
* @example
|
|
132
|
-
* ```ts
|
|
133
|
-
* const perms = createPermissionEvaluator({ mode: 'default', rules: [] });
|
|
134
|
-
* const decision = perms.evaluate('write', { path: '/tmp/out.txt' });
|
|
135
|
-
* if (!decision.allowed) {
|
|
136
|
-
* console.error('denied:', decision.reason);
|
|
137
|
-
* }
|
|
138
|
-
* ```
|
|
139
|
-
*
|
|
140
|
-
* @param config — Optional configuration; all fields have safe defaults.
|
|
141
|
-
* @param provenance — Optional bundle provenance (GC-PERM-011).
|
|
142
|
-
*/
|
|
143
|
-
export function createPermissionEvaluator(
|
|
144
|
-
config: PermissionsConfig = {},
|
|
145
|
-
provenance?: BundleProvenance,
|
|
146
|
-
): LayeredPolicyEvaluator {
|
|
147
|
-
return new LayeredPolicyEvaluator(config, provenance);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* createPermissionSimulator — Factory for `PermissionSimulator`.
|
|
152
|
-
*
|
|
153
|
-
* Creates a dual-evaluator simulation pipeline for the runtime permissions system that runs
|
|
154
|
-
* both the actual and simulated evaluators in parallel, tracking divergence.
|
|
155
|
-
*
|
|
156
|
-
* Requires the `permissions-simulation` feature flag to be enabled.
|
|
157
|
-
*
|
|
158
|
-
* @param actualConfig — Config for the authoritative evaluator.
|
|
159
|
-
* @param simulatedConfig — Config for the candidate evaluator.
|
|
160
|
-
* @param simulationMode — Controls enforcement and warning behaviour.
|
|
161
|
-
* @param config — Optional tuning: record limit, divergence threshold.
|
|
162
|
-
*
|
|
163
|
-
* @example
|
|
164
|
-
* ```ts
|
|
165
|
-
* const simulator = createPermissionSimulator(
|
|
166
|
-
* { mode: 'default', rules: currentRules },
|
|
167
|
-
* { mode: 'default', rules: candidateRules },
|
|
168
|
-
* 'warn-on-divergence',
|
|
169
|
-
* );
|
|
170
|
-
* const result = simulator.evaluate('write', { path: '/tmp/out.txt' });
|
|
171
|
-
* const report = simulator.getDivergenceReport();
|
|
172
|
-
* ```
|
|
173
|
-
*/
|
|
174
|
-
export function createPermissionSimulator(
|
|
175
|
-
actualConfig: PermissionsConfig,
|
|
176
|
-
simulatedConfig: PermissionsConfig,
|
|
177
|
-
simulationMode: SimulationMode,
|
|
178
|
-
config: PermissionSimulatorConfig = {},
|
|
179
|
-
flagManager?: FeatureFlagManager,
|
|
180
|
-
): PermissionSimulator {
|
|
181
|
-
if (flagManager && !flagManager.isEnabled('permissions-simulation')) {
|
|
182
|
-
throw new Error('Feature flag "permissions-simulation" is not enabled');
|
|
183
|
-
}
|
|
184
|
-
return new PermissionSimulator(
|
|
185
|
-
actualConfig,
|
|
186
|
-
simulatedConfig,
|
|
187
|
-
simulationMode,
|
|
188
|
-
config,
|
|
189
|
-
);
|
|
190
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '@pellux/goodvibes-sdk/platform/runtime/permissions/policy-runtime';
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import type { GoodVibesConfig, DeepReadonly } from '../../config/index.ts';
|
|
2
|
-
import type { PolicyLintFinding } from '@pellux/goodvibes-sdk/platform/runtime/permissions/lint';
|
|
3
|
-
import type { McpServerRole, McpTrustMode } from '@pellux/goodvibes-sdk/platform/runtime/mcp/types';
|
|
4
|
-
|
|
5
|
-
export type PolicyPreflightStatus = 'pass' | 'warn' | 'block';
|
|
6
|
-
|
|
7
|
-
export interface PolicyPreflightServer {
|
|
8
|
-
readonly serverName: string;
|
|
9
|
-
readonly trustMode: McpTrustMode;
|
|
10
|
-
readonly role: McpServerRole;
|
|
11
|
-
readonly allowedPaths: readonly string[];
|
|
12
|
-
readonly allowedHosts: readonly string[];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface PolicyPreflightIssue {
|
|
16
|
-
readonly severity: 'info' | 'warn' | 'error';
|
|
17
|
-
readonly source: 'policy' | 'runtime' | 'mcp';
|
|
18
|
-
readonly message: string;
|
|
19
|
-
readonly detail?: string;
|
|
20
|
-
readonly serverName?: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface PolicyPreflightReview {
|
|
24
|
-
readonly generatedAt: string;
|
|
25
|
-
readonly status: PolicyPreflightStatus;
|
|
26
|
-
readonly summary: string;
|
|
27
|
-
readonly issueCount: number;
|
|
28
|
-
readonly issues: readonly PolicyPreflightIssue[];
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function summarize(status: PolicyPreflightStatus, issues: readonly PolicyPreflightIssue[]): string {
|
|
32
|
-
if (issues.length === 0) {
|
|
33
|
-
return 'No blocking or warning conditions detected for the current policy state.';
|
|
34
|
-
}
|
|
35
|
-
const errors = issues.filter((issue) => issue.severity === 'error').length;
|
|
36
|
-
const warnings = issues.filter((issue) => issue.severity === 'warn').length;
|
|
37
|
-
if (status === 'block') {
|
|
38
|
-
return `${errors} blocking issue${errors === 1 ? '' : 's'} and ${warnings} warning${warnings === 1 ? '' : 's'} require attention before high-risk runs.`;
|
|
39
|
-
}
|
|
40
|
-
return `${warnings} warning${warnings === 1 ? '' : 's'} detected in the current policy posture.`;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export function buildPolicyPreflightReview(params: {
|
|
44
|
-
config: DeepReadonly<GoodVibesConfig>;
|
|
45
|
-
lintFindings: readonly PolicyLintFinding[];
|
|
46
|
-
mcpServers: readonly PolicyPreflightServer[];
|
|
47
|
-
}): PolicyPreflightReview {
|
|
48
|
-
const issues: PolicyPreflightIssue[] = [];
|
|
49
|
-
|
|
50
|
-
for (const finding of params.lintFindings) {
|
|
51
|
-
issues.push({
|
|
52
|
-
severity: finding.severity === 'error' ? 'error' : finding.severity === 'warn' ? 'warn' : 'info',
|
|
53
|
-
source: 'policy',
|
|
54
|
-
message: finding.message,
|
|
55
|
-
detail: finding.ruleId ? `rule=${finding.ruleId}` : undefined,
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (params.config.permissions.mode === 'allow-all') {
|
|
60
|
-
issues.push({
|
|
61
|
-
severity: 'error',
|
|
62
|
-
source: 'runtime',
|
|
63
|
-
message: 'Permission mode is allow-all.',
|
|
64
|
-
detail: 'All runtime permission checks are bypassed for local tools.',
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
for (const server of params.mcpServers) {
|
|
69
|
-
if (server.trustMode === 'allow-all') {
|
|
70
|
-
issues.push({
|
|
71
|
-
severity: 'error',
|
|
72
|
-
source: 'mcp',
|
|
73
|
-
serverName: server.serverName,
|
|
74
|
-
message: `MCP server "${server.serverName}" is in allow-all mode.`,
|
|
75
|
-
detail: `role=${server.role} paths=${server.allowedPaths.length} hosts=${server.allowedHosts.length}`,
|
|
76
|
-
});
|
|
77
|
-
} else if (server.trustMode === 'ask-on-risk') {
|
|
78
|
-
issues.push({
|
|
79
|
-
severity: 'warn',
|
|
80
|
-
source: 'mcp',
|
|
81
|
-
serverName: server.serverName,
|
|
82
|
-
message: `MCP server "${server.serverName}" requires approval for risky actions.`,
|
|
83
|
-
detail: `role=${server.role} paths=${server.allowedPaths.length} hosts=${server.allowedHosts.length}`,
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const status: PolicyPreflightStatus = issues.some((issue) => issue.severity === 'error')
|
|
89
|
-
? 'block'
|
|
90
|
-
: issues.some((issue) => issue.severity === 'warn')
|
|
91
|
-
? 'warn'
|
|
92
|
-
: 'pass';
|
|
93
|
-
|
|
94
|
-
return {
|
|
95
|
-
generatedAt: new Date().toISOString(),
|
|
96
|
-
status,
|
|
97
|
-
summary: summarize(status, issues),
|
|
98
|
-
issueCount: issues.length,
|
|
99
|
-
issues,
|
|
100
|
-
};
|
|
101
|
-
}
|