@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,114 +0,0 @@
|
|
|
1
|
-
import type { HookDispatcher } from '@pellux/goodvibes-sdk/platform/hooks/dispatcher';
|
|
2
|
-
import type { PermissionManager } from '@pellux/goodvibes-sdk/platform/permissions/manager';
|
|
3
|
-
import type { FileStateCache } from '@pellux/goodvibes-sdk/platform/state/file-cache';
|
|
4
|
-
import type { ProjectIndex } from '@pellux/goodvibes-sdk/platform/state/project-index';
|
|
5
|
-
import type { RuntimeEventBus } from '@pellux/goodvibes-sdk/platform/runtime/events/index';
|
|
6
|
-
import type { OverflowHandler } from '@pellux/goodvibes-sdk/platform/tools/shared/overflow';
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Minimal read/subscribe interface over the Zustand RuntimeStore.
|
|
10
|
-
* Mirrors StoreApi<RuntimeState> without importing RuntimeState directly,
|
|
11
|
-
* keeping this module decoupled from the full store domain tree.
|
|
12
|
-
*/
|
|
13
|
-
export interface RuntimeStoreAccess {
|
|
14
|
-
/** Returns a snapshot of the current store state. */
|
|
15
|
-
getState(): Record<string, unknown>;
|
|
16
|
-
/** Subscribes to store changes; returns an unsubscribe function. */
|
|
17
|
-
subscribe(listener: () => void): () => void;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* TaskHooks — lifecycle callbacks for task/subtask tracking.
|
|
22
|
-
* Populated by higher tiers; all fields optional until wired.
|
|
23
|
-
*/
|
|
24
|
-
export interface TaskHooks {
|
|
25
|
-
/** Called when the tool begins execution. */
|
|
26
|
-
onStart?: (callId: string, toolName: string) => void;
|
|
27
|
-
/** Called when the tool completes (success or failure). */
|
|
28
|
-
onComplete?: (callId: string, durationMs: number) => void;
|
|
29
|
-
/** Called when the tool fails. */
|
|
30
|
-
onError?: (callId: string, error: string) => void;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* ToolRuntimeContext — full context passed to each phase and to the tool itself.
|
|
35
|
-
*
|
|
36
|
-
* The typed runtime substrate is mandatory for tool execution; phase handlers
|
|
37
|
-
* should not need defensive guards around store or runtime-bus availability.
|
|
38
|
-
*/
|
|
39
|
-
export interface ToolRuntimeContext {
|
|
40
|
-
/** Read/subscribe access to the Zustand runtime store. */
|
|
41
|
-
runtime: RuntimeStoreAccess;
|
|
42
|
-
|
|
43
|
-
/** Correlation identifiers for the current execution context. */
|
|
44
|
-
ids: {
|
|
45
|
-
sessionId: string;
|
|
46
|
-
conversationId: string;
|
|
47
|
-
turnId: string;
|
|
48
|
-
toolCallId: string;
|
|
49
|
-
traceId: string;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
/** Task lifecycle callbacks. */
|
|
53
|
-
tasks: TaskHooks;
|
|
54
|
-
|
|
55
|
-
/** Shared caches from the runtime context. */
|
|
56
|
-
resources: {
|
|
57
|
-
fileCache: FileStateCache;
|
|
58
|
-
projectIndex: ProjectIndex;
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
/** Shared overflow handler used by output-policy and exec tool result truncation. */
|
|
62
|
-
overflowHandler?: OverflowHandler;
|
|
63
|
-
|
|
64
|
-
/** Active provider and model identifiers. */
|
|
65
|
-
provider: {
|
|
66
|
-
providerId: string;
|
|
67
|
-
modelId: string;
|
|
68
|
-
contextWindow: number;
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
/** Agent context — present only when executing inside an agent scope. */
|
|
72
|
-
agent?: {
|
|
73
|
-
agentId: string;
|
|
74
|
-
parentAgentId?: string;
|
|
75
|
-
isolationMode: 'full' | 'partial' | 'none';
|
|
76
|
-
};
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Execution budget constraints.
|
|
80
|
-
* All fields optional — absent means unlimited.
|
|
81
|
-
*/
|
|
82
|
-
budget?: {
|
|
83
|
-
maxMs?: number;
|
|
84
|
-
maxTokens?: number;
|
|
85
|
-
maxCostUsd?: number;
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Cancellation signal.
|
|
90
|
-
* Phases check `signal.aborted` at boundaries to support cooperative cancellation.
|
|
91
|
-
*/
|
|
92
|
-
cancellation: {
|
|
93
|
-
signal: AbortSignal;
|
|
94
|
-
/** Human-readable reason set when the call is cancelled. */
|
|
95
|
-
reason?: string;
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
/** Execution mode — determines prompt and timeout behaviour. */
|
|
99
|
-
executionMode: 'interactive' | 'background' | 'remote';
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Runtime event bus for structured phase and audit emission.
|
|
103
|
-
*
|
|
104
|
-
* ExecutorConfig still decides whether individual phase events are emitted,
|
|
105
|
-
* but the bus itself is a required runtime dependency.
|
|
106
|
-
*/
|
|
107
|
-
runtimeBus: RuntimeEventBus;
|
|
108
|
-
|
|
109
|
-
/** Full PermissionManager instance (used by permission phase). */
|
|
110
|
-
permissionManager: PermissionManager;
|
|
111
|
-
|
|
112
|
-
/** Full HookDispatcher instance (used by pre/post hook phases). */
|
|
113
|
-
hookDispatcher: HookDispatcher;
|
|
114
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* src/runtime/tools/index.ts — barrel and factory for the phased tool executor.
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* ```ts
|
|
6
|
-
* import { createPhasedExecutor } from './runtime/tools/index.ts';
|
|
7
|
-
*
|
|
8
|
-
* const executor = createPhasedExecutor({
|
|
9
|
-
* enableHooks: true,
|
|
10
|
-
* enablePermissions: true,
|
|
11
|
-
* enableEvents: true,
|
|
12
|
-
* });
|
|
13
|
-
* const result = await executor.execute(call, tool, context);
|
|
14
|
-
* ```
|
|
15
|
-
*/
|
|
16
|
-
export type { ToolExecutionPhase, PhaseResult, ToolExecutionRecord, ExecutorConfig } from '@pellux/goodvibes-sdk/platform/runtime/tools/types';
|
|
17
|
-
export type {
|
|
18
|
-
ToolRuntimeContext,
|
|
19
|
-
RuntimeStoreAccess,
|
|
20
|
-
TaskHooks,
|
|
21
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/tools/context';
|
|
22
|
-
export { PhasedToolExecutor } from '@pellux/goodvibes-sdk/platform/runtime/tools/phased-executor';
|
|
23
|
-
export * from '@pellux/goodvibes-sdk/platform/runtime/tools/phases/index';
|
|
24
|
-
|
|
25
|
-
import { PhasedToolExecutor } from '@pellux/goodvibes-sdk/platform/runtime/tools/phased-executor';
|
|
26
|
-
import type { ExecutorConfig } from '@pellux/goodvibes-sdk/platform/runtime/tools/types';
|
|
27
|
-
|
|
28
|
-
/** Default executor configuration. */
|
|
29
|
-
const DEFAULTS: ExecutorConfig = {
|
|
30
|
-
enableHooks: true,
|
|
31
|
-
enablePermissions: true,
|
|
32
|
-
enableEvents: true,
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* createPhasedExecutor — factory with sane defaults.
|
|
37
|
-
*
|
|
38
|
-
* Merges the provided partial config over the defaults so callers only
|
|
39
|
-
* need to specify what they want to change.
|
|
40
|
-
*
|
|
41
|
-
* @param config - Optional overrides for ExecutorConfig.
|
|
42
|
-
* @returns A fully configured PhasedToolExecutor instance.
|
|
43
|
-
*/
|
|
44
|
-
export function createPhasedExecutor(config?: Partial<ExecutorConfig>): PhasedToolExecutor {
|
|
45
|
-
return new PhasedToolExecutor({ ...DEFAULTS, ...config });
|
|
46
|
-
}
|
|
@@ -1,448 +0,0 @@
|
|
|
1
|
-
import type { Tool, ToolCall, ToolResult } from '@pellux/goodvibes-sdk/platform/types/tools';
|
|
2
|
-
import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
|
|
3
|
-
import type { ToolRuntimeContext } from '@pellux/goodvibes-sdk/platform/runtime/tools/context';
|
|
4
|
-
import type { ExecutorConfig, PhaseResult, ToolExecutionPhase, ToolExecutionRecord } from '@pellux/goodvibes-sdk/platform/runtime/tools/types';
|
|
5
|
-
import {
|
|
6
|
-
emitBudgetExceededCost,
|
|
7
|
-
emitBudgetExceededMs,
|
|
8
|
-
emitBudgetExceededTokens,
|
|
9
|
-
emitToolCancelled,
|
|
10
|
-
emitToolExecuting,
|
|
11
|
-
emitToolFailed,
|
|
12
|
-
emitToolMapped,
|
|
13
|
-
emitToolPermissioned,
|
|
14
|
-
emitToolPosthooked,
|
|
15
|
-
emitToolPrehooked,
|
|
16
|
-
emitToolSucceeded,
|
|
17
|
-
emitToolValidated,
|
|
18
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/emitters/tools';
|
|
19
|
-
import {
|
|
20
|
-
budgetPhase,
|
|
21
|
-
executePhase,
|
|
22
|
-
mapOutputPhase,
|
|
23
|
-
permissionPhase,
|
|
24
|
-
posthookPhase,
|
|
25
|
-
prehookPhase,
|
|
26
|
-
validatePhase,
|
|
27
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/tools/phases/index';
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* PhasedToolExecutor — runs a ToolCall through the multi-phase execution pipeline.
|
|
31
|
-
*
|
|
32
|
-
* Pipeline (in order):
|
|
33
|
-
* validate → prehook → permission → execute → mapOutput → posthook → succeeded
|
|
34
|
-
*
|
|
35
|
-
* Any phase that sets `abort: true` on its PhaseResult will halt the pipeline
|
|
36
|
-
* and transition to the `failed` or `cancelled` terminal state.
|
|
37
|
-
*
|
|
38
|
-
* Cancellation is cooperative: the executor checks `context.cancellation.signal`
|
|
39
|
-
* at each phase boundary and immediately transitions to `cancelled` when aborted.
|
|
40
|
-
*
|
|
41
|
-
* @example
|
|
42
|
-
* ```ts
|
|
43
|
-
* const executor = createPhasedExecutor({ enableHooks: true, enablePermissions: true, enableEvents: true });
|
|
44
|
-
* const result = await executor.execute(call, tool, context);
|
|
45
|
-
* ```
|
|
46
|
-
*/
|
|
47
|
-
/** Maximum number of completed records retained in memory before eviction. */
|
|
48
|
-
const MAX_RECORDS = 1000;
|
|
49
|
-
|
|
50
|
-
export class PhasedToolExecutor {
|
|
51
|
-
private readonly config: ExecutorConfig;
|
|
52
|
-
private readonly records = new Map<string, ToolExecutionRecord>();
|
|
53
|
-
private readonly controllers = new Map<string, AbortController>();
|
|
54
|
-
/** Maps ToolCall instances to their idempotency key without mutating the input. */
|
|
55
|
-
private readonly _idKeyMap = new WeakMap<ToolCall, string>();
|
|
56
|
-
|
|
57
|
-
constructor(config: ExecutorConfig) {
|
|
58
|
-
this.config = config;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/**
|
|
62
|
-
* Execute a tool call through all pipeline phases.
|
|
63
|
-
* Returns a ToolResult regardless of outcome — callers never need to catch.
|
|
64
|
-
*/
|
|
65
|
-
async execute(
|
|
66
|
-
call: ToolCall,
|
|
67
|
-
tool: Tool,
|
|
68
|
-
context: ToolRuntimeContext,
|
|
69
|
-
): Promise<ToolResult> {
|
|
70
|
-
// --- Idempotency check ---
|
|
71
|
-
// Must run before creating a record to avoid registering calls that will be
|
|
72
|
-
// short-circuited as duplicates or rejected as in-flight.
|
|
73
|
-
if (this.config.idempotencyStore) {
|
|
74
|
-
const idKey = this.config.idempotencyStore.generateKey({
|
|
75
|
-
sessionId: context.ids.sessionId,
|
|
76
|
-
turnId: context.ids.turnId,
|
|
77
|
-
callId: call.id,
|
|
78
|
-
});
|
|
79
|
-
const check = this.config.idempotencyStore.checkAndRecord(idKey);
|
|
80
|
-
|
|
81
|
-
if (check.status === 'duplicate') {
|
|
82
|
-
logger.debug('PhasedToolExecutor: duplicate tool call — returning cached result', {
|
|
83
|
-
callId: call.id,
|
|
84
|
-
tool: call.name,
|
|
85
|
-
idKey,
|
|
86
|
-
priorStatus: check.record.status,
|
|
87
|
-
});
|
|
88
|
-
// Return the cached result from the prior completed execution.
|
|
89
|
-
// If the prior run failed (status === 'failed'), the cached result will
|
|
90
|
-
// be undefined and we return a generic error to the LLM.
|
|
91
|
-
if (check.record.result !== undefined) {
|
|
92
|
-
return check.record.result as ToolResult;
|
|
93
|
-
}
|
|
94
|
-
return {
|
|
95
|
-
callId: call.id,
|
|
96
|
-
success: false,
|
|
97
|
-
error: 'Duplicate tool call: prior execution failed; retry is not permitted.',
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
if (check.status === 'in-flight') {
|
|
102
|
-
logger.warn('PhasedToolExecutor: in-flight duplicate detected — rejecting', {
|
|
103
|
-
callId: call.id,
|
|
104
|
-
tool: call.name,
|
|
105
|
-
idKey,
|
|
106
|
-
inFlightSince: check.record.createdAt,
|
|
107
|
-
});
|
|
108
|
-
return {
|
|
109
|
-
callId: call.id,
|
|
110
|
-
success: false,
|
|
111
|
-
error: 'Duplicate tool call: an identical submission is already in-flight.',
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// 'new' — proceed; store the key so _fail/_cancel can markFailed.
|
|
116
|
-
this._idKeyMap.set(call, idKey);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const record: ToolExecutionRecord = {
|
|
120
|
-
callId: call.id,
|
|
121
|
-
toolName: call.name,
|
|
122
|
-
phases: [],
|
|
123
|
-
currentPhase: 'received',
|
|
124
|
-
startedAt: performance.now(),
|
|
125
|
-
wallStartedAt: Date.now(),
|
|
126
|
-
cancelled: false,
|
|
127
|
-
};
|
|
128
|
-
this.records.set(call.id, record);
|
|
129
|
-
this._evictOldestCompleted();
|
|
130
|
-
|
|
131
|
-
// Create a per-execution AbortController. cancel() aborts this controller;
|
|
132
|
-
// the pipeline loop checks controller.signal.aborted at every boundary.
|
|
133
|
-
// The outer context.cancellation.signal is also respected via a forwarding listener.
|
|
134
|
-
const controller = new AbortController();
|
|
135
|
-
this.controllers.set(call.id, controller);
|
|
136
|
-
const cancelSignal = controller.signal;
|
|
137
|
-
// Forward outer cancellation into our local controller
|
|
138
|
-
const forwardAbort = () => controller.abort(context.cancellation.reason);
|
|
139
|
-
if (context.cancellation.signal.aborted) {
|
|
140
|
-
controller.abort(context.cancellation.reason);
|
|
141
|
-
} else {
|
|
142
|
-
context.cancellation.signal.addEventListener('abort', forwardAbort, { once: true });
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// --- Phase pipeline ---
|
|
146
|
-
// Each entry: [phase name used for cancellation check, phase function, config guard]
|
|
147
|
-
type PipelineEntry = [
|
|
148
|
-
phase: ToolExecutionPhase,
|
|
149
|
-
fn: (call: ToolCall, tool: Tool, context: ToolRuntimeContext, record: ToolExecutionRecord) => Promise<PhaseResult & { toolResult?: ToolResult }>,
|
|
150
|
-
enabled: boolean,
|
|
151
|
-
];
|
|
152
|
-
|
|
153
|
-
const budgetEnabled = this.config.enableBudgetEnforcement === true;
|
|
154
|
-
|
|
155
|
-
const pipeline: PipelineEntry[] = [
|
|
156
|
-
['validated', validatePhase, true],
|
|
157
|
-
['prehooked', prehookPhase, this.config.enableHooks],
|
|
158
|
-
['permissioned', permissionPhase, this.config.enablePermissions],
|
|
159
|
-
['budget-entry', (c, t, ctx, r) => budgetPhase(c, t, ctx, r, 'entry'), budgetEnabled],
|
|
160
|
-
['executing', (c, t, ctx, r) => executePhase(c, t, ctx, r, this.config), true],
|
|
161
|
-
['mapped', mapOutputPhase, true],
|
|
162
|
-
['budget-exit', (c, t, ctx, r) => budgetPhase(c, t, ctx, r, 'exit'), budgetEnabled],
|
|
163
|
-
['posthooked', posthookPhase, this.config.enableHooks],
|
|
164
|
-
];
|
|
165
|
-
|
|
166
|
-
const emitterCtx = {
|
|
167
|
-
sessionId: context.ids.sessionId,
|
|
168
|
-
traceId: context.ids.traceId,
|
|
169
|
-
source: 'phased-executor' as const,
|
|
170
|
-
};
|
|
171
|
-
|
|
172
|
-
for (const [phaseName, phaseFn, enabled] of pipeline) {
|
|
173
|
-
// --- Cancellation check at every boundary ---
|
|
174
|
-
if (cancelSignal.aborted) {
|
|
175
|
-
context.cancellation.signal.removeEventListener('abort', forwardAbort);
|
|
176
|
-
this.controllers.delete(call.id);
|
|
177
|
-
return this._cancel(record, call, context, emitterCtx, cancelSignal.reason as string | undefined);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
if (!enabled) {
|
|
181
|
-
continue;
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
record.currentPhase = phaseName;
|
|
185
|
-
const phaseResult = await phaseFn(call, tool, context, record);
|
|
186
|
-
record.phases.push(phaseResult);
|
|
187
|
-
|
|
188
|
-
// --- Emit per-phase event ---
|
|
189
|
-
if (this.config.enableEvents && context.runtimeBus) {
|
|
190
|
-
this._emitPhaseEvent(phaseName, phaseResult, call, context, emitterCtx);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// --- Capture execute result ---
|
|
194
|
-
if (phaseName === 'executing' && phaseResult.toolResult) {
|
|
195
|
-
record.result = phaseResult.toolResult;
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
// --- Handle phase failure/abort ---
|
|
199
|
-
if (!phaseResult.success || phaseResult.abort) {
|
|
200
|
-
context.cancellation.signal.removeEventListener('abort', forwardAbort);
|
|
201
|
-
this.controllers.delete(call.id);
|
|
202
|
-
|
|
203
|
-
// Emit typed budget breach event before failing
|
|
204
|
-
if (phaseResult.budgetExceedReason && this.config.enableEvents && context.runtimeBus) {
|
|
205
|
-
this._emitBudgetEvent(
|
|
206
|
-
phaseResult.budgetExceedReason,
|
|
207
|
-
phaseResult.budgetMeta ?? {},
|
|
208
|
-
phaseName,
|
|
209
|
-
call,
|
|
210
|
-
context,
|
|
211
|
-
emitterCtx,
|
|
212
|
-
);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
return this._fail(record, call, context, emitterCtx, phaseResult.error ?? 'Phase failed');
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// --- Final cancellation check before transitioning to succeeded ---
|
|
220
|
-
context.cancellation.signal.removeEventListener('abort', forwardAbort);
|
|
221
|
-
if (cancelSignal.aborted) {
|
|
222
|
-
this.controllers.delete(call.id);
|
|
223
|
-
return this._cancel(record, call, context, emitterCtx, cancelSignal.reason as string | undefined);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// --- Succeeded ---
|
|
227
|
-
this.controllers.delete(call.id);
|
|
228
|
-
record.currentPhase = 'succeeded';
|
|
229
|
-
const durationMs = performance.now() - record.startedAt;
|
|
230
|
-
record.completedAt = Date.now();
|
|
231
|
-
if (this.config.enableEvents && context.runtimeBus) {
|
|
232
|
-
emitToolSucceeded(context.runtimeBus, emitterCtx, {
|
|
233
|
-
callId: call.id,
|
|
234
|
-
turnId: context.ids.turnId,
|
|
235
|
-
tool: call.name,
|
|
236
|
-
durationMs,
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
context.tasks.onComplete?.(call.id, durationMs);
|
|
241
|
-
|
|
242
|
-
const finalResult: ToolResult = record.result ?? {
|
|
243
|
-
callId: call.id,
|
|
244
|
-
success: true,
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
// --- Idempotency: cache the successful result ---
|
|
248
|
-
const idKey = this._getIdKey(call);
|
|
249
|
-
if (idKey && this.config.idempotencyStore) {
|
|
250
|
-
this.config.idempotencyStore.markComplete(idKey, finalResult);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return finalResult;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Cancel an in-flight tool execution.
|
|
258
|
-
* Sets a cancelled flag on the record; the next phase boundary will pick it up.
|
|
259
|
-
*/
|
|
260
|
-
cancel(callId: string, reason?: string): void {
|
|
261
|
-
const record = this.records.get(callId);
|
|
262
|
-
if (record && !record.completedAt) {
|
|
263
|
-
record.cancelled = true;
|
|
264
|
-
record.cancelledReason = reason;
|
|
265
|
-
this.controllers.get(callId)?.abort(reason);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
/** Returns the full execution record for a given call id, if any. */
|
|
270
|
-
getRecord(callId: string): ToolExecutionRecord | undefined {
|
|
271
|
-
return this.records.get(callId);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
/** Returns all execution records for in-flight calls. */
|
|
275
|
-
getActiveRecords(): ToolExecutionRecord[] {
|
|
276
|
-
return Array.from(this.records.values()).filter((r) => !r.completedAt);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
// ---------------------------------------------------------------------------
|
|
280
|
-
// Private helpers
|
|
281
|
-
// ---------------------------------------------------------------------------
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* Extract the idempotency key previously attached to a call during `execute`.
|
|
285
|
-
* Returns `undefined` if no idempotency store is configured.
|
|
286
|
-
*/
|
|
287
|
-
private _getIdKey(call: ToolCall): string | undefined {
|
|
288
|
-
return this._idKeyMap.get(call);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
private _fail(
|
|
292
|
-
record: ToolExecutionRecord,
|
|
293
|
-
call: ToolCall,
|
|
294
|
-
context: ToolRuntimeContext,
|
|
295
|
-
emitterCtx: { sessionId: string; traceId: string; source: string },
|
|
296
|
-
error: string,
|
|
297
|
-
): ToolResult {
|
|
298
|
-
record.currentPhase = 'failed';
|
|
299
|
-
const durationMs = performance.now() - record.startedAt;
|
|
300
|
-
record.completedAt = Date.now();
|
|
301
|
-
|
|
302
|
-
if (this.config.enableEvents && context.runtimeBus) {
|
|
303
|
-
emitToolFailed(context.runtimeBus, emitterCtx as Parameters<typeof emitToolFailed>[1], {
|
|
304
|
-
callId: call.id,
|
|
305
|
-
turnId: context.ids.turnId,
|
|
306
|
-
tool: call.name,
|
|
307
|
-
error,
|
|
308
|
-
durationMs,
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
context.tasks.onError?.(call.id, error);
|
|
313
|
-
|
|
314
|
-
// --- Idempotency: mark failed to allow retry ---
|
|
315
|
-
const idKey = this._getIdKey(call);
|
|
316
|
-
if (idKey && this.config.idempotencyStore) {
|
|
317
|
-
this.config.idempotencyStore.markFailed(idKey);
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
return {
|
|
321
|
-
callId: call.id,
|
|
322
|
-
success: false,
|
|
323
|
-
error,
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
private _cancel(
|
|
328
|
-
record: ToolExecutionRecord,
|
|
329
|
-
call: ToolCall,
|
|
330
|
-
context: ToolRuntimeContext,
|
|
331
|
-
emitterCtx: { sessionId: string; traceId: string; source: string },
|
|
332
|
-
reason?: string,
|
|
333
|
-
): ToolResult {
|
|
334
|
-
record.currentPhase = 'cancelled';
|
|
335
|
-
record.cancelled = true;
|
|
336
|
-
record.cancelledReason = reason;
|
|
337
|
-
record.completedAt = Date.now();
|
|
338
|
-
|
|
339
|
-
if (this.config.enableEvents && context.runtimeBus) {
|
|
340
|
-
emitToolCancelled(
|
|
341
|
-
context.runtimeBus,
|
|
342
|
-
emitterCtx as Parameters<typeof emitToolCancelled>[1],
|
|
343
|
-
{
|
|
344
|
-
callId: call.id,
|
|
345
|
-
turnId: context.ids.turnId,
|
|
346
|
-
tool: call.name,
|
|
347
|
-
reason,
|
|
348
|
-
},
|
|
349
|
-
);
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// --- Idempotency: mark failed so the cancelled call can be retried ---
|
|
353
|
-
const idKey = this._getIdKey(call);
|
|
354
|
-
if (idKey && this.config.idempotencyStore) {
|
|
355
|
-
this.config.idempotencyStore.markFailed(idKey);
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
return {
|
|
359
|
-
callId: call.id,
|
|
360
|
-
success: false,
|
|
361
|
-
error: reason ? `Cancelled: ${reason}` : 'Tool call cancelled',
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
/**
|
|
366
|
-
* Evicts the oldest completed records when the map exceeds MAX_RECORDS.
|
|
367
|
-
* Only completed records are eligible for eviction.
|
|
368
|
-
*/
|
|
369
|
-
private _evictOldestCompleted(): void {
|
|
370
|
-
if (this.records.size <= MAX_RECORDS) return;
|
|
371
|
-
for (const [id, record] of this.records) {
|
|
372
|
-
if (record.completedAt) {
|
|
373
|
-
this.records.delete(id);
|
|
374
|
-
if (this.records.size <= MAX_RECORDS) break;
|
|
375
|
-
}
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
private _emitBudgetEvent(
|
|
380
|
-
reason: import('@pellux/goodvibes-sdk/platform/runtime/tools/types').BudgetExceedReason,
|
|
381
|
-
meta: Record<string, number>,
|
|
382
|
-
phase: ToolExecutionPhase,
|
|
383
|
-
call: ToolCall,
|
|
384
|
-
context: ToolRuntimeContext,
|
|
385
|
-
emitterCtx: Parameters<typeof emitToolValidated>[1],
|
|
386
|
-
): void {
|
|
387
|
-
if (!context.runtimeBus) return;
|
|
388
|
-
const base = { callId: call.id, turnId: context.ids.turnId, tool: call.name, phase: String(phase) };
|
|
389
|
-
switch (reason) {
|
|
390
|
-
case 'BUDGET_EXCEEDED_MS':
|
|
391
|
-
emitBudgetExceededMs(context.runtimeBus, emitterCtx, {
|
|
392
|
-
...base,
|
|
393
|
-
limitMs: meta['limitMs'] ?? 0,
|
|
394
|
-
elapsedMs: meta['elapsedMs'] ?? 0,
|
|
395
|
-
});
|
|
396
|
-
break;
|
|
397
|
-
case 'BUDGET_EXCEEDED_TOKENS':
|
|
398
|
-
emitBudgetExceededTokens(context.runtimeBus, emitterCtx, {
|
|
399
|
-
...base,
|
|
400
|
-
limitTokens: meta['limitTokens'] ?? 0,
|
|
401
|
-
usedTokens: meta['usedTokens'] ?? 0,
|
|
402
|
-
});
|
|
403
|
-
break;
|
|
404
|
-
case 'BUDGET_EXCEEDED_COST':
|
|
405
|
-
emitBudgetExceededCost(context.runtimeBus, emitterCtx, {
|
|
406
|
-
...base,
|
|
407
|
-
limitCostUsd: meta['limitCostUsd'] ?? 0,
|
|
408
|
-
usedCostUsd: meta['usedCostUsd'] ?? 0,
|
|
409
|
-
});
|
|
410
|
-
break;
|
|
411
|
-
default:
|
|
412
|
-
break;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
private _emitPhaseEvent(
|
|
417
|
-
phase: ToolExecutionPhase,
|
|
418
|
-
_result: PhaseResult,
|
|
419
|
-
call: ToolCall,
|
|
420
|
-
context: ToolRuntimeContext,
|
|
421
|
-
emitterCtx: Parameters<typeof emitToolValidated>[1],
|
|
422
|
-
): void {
|
|
423
|
-
if (!context.runtimeBus) return;
|
|
424
|
-
const base = { callId: call.id, turnId: context.ids.turnId, tool: call.name };
|
|
425
|
-
switch (phase) {
|
|
426
|
-
case 'validated':
|
|
427
|
-
emitToolValidated(context.runtimeBus, emitterCtx, base);
|
|
428
|
-
break;
|
|
429
|
-
case 'prehooked':
|
|
430
|
-
emitToolPrehooked(context.runtimeBus, emitterCtx, base);
|
|
431
|
-
break;
|
|
432
|
-
case 'permissioned':
|
|
433
|
-
emitToolPermissioned(context.runtimeBus, emitterCtx, { ...base, approved: _result.success });
|
|
434
|
-
break;
|
|
435
|
-
case 'executing':
|
|
436
|
-
emitToolExecuting(context.runtimeBus, emitterCtx, { ...base, startedAt: Date.now() });
|
|
437
|
-
break;
|
|
438
|
-
case 'mapped':
|
|
439
|
-
emitToolMapped(context.runtimeBus, emitterCtx, base);
|
|
440
|
-
break;
|
|
441
|
-
case 'posthooked':
|
|
442
|
-
emitToolPosthooked(context.runtimeBus, emitterCtx, base);
|
|
443
|
-
break;
|
|
444
|
-
default:
|
|
445
|
-
break;
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
}
|