@pellux/goodvibes-tui 0.18.11 → 0.18.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +72 -0
- package/README.md +1 -1
- package/docs/foundation-artifacts/operator-contract.json +1 -1
- package/package.json +2 -2
- package/src/config/index.ts +1 -138
- package/src/config/subscription-providers.ts +1 -127
- package/src/core/conversation-rendering.ts +5 -5
- package/src/core/conversation.ts +177 -424
- package/src/core/history.ts +45 -0
- package/src/core/orchestrator.ts +3 -733
- package/src/core/system-message-router.ts +19 -58
- package/src/input/command-registry.ts +3 -3
- package/src/input/commands/session-content.ts +2 -2
- package/src/input/commands/session-workflow.ts +1 -1
- package/src/input/handler-content-actions.ts +2 -2
- package/src/input/handler-feed.ts +2 -2
- package/src/input/handler-modal-token-routes.ts +1 -1
- package/src/input/handler-ui-state.ts +1 -1
- package/src/input/handler.ts +1 -1
- package/src/input/search.ts +1 -1
- package/src/input/selection.ts +2 -2
- package/src/input/session-picker-modal.ts +1 -1
- package/src/main.ts +1 -1
- package/src/panels/agent-inspector-panel.ts +3 -3
- package/src/panels/agent-logs-panel.ts +3 -3
- package/src/panels/approval-panel.ts +2 -2
- package/src/panels/automation-control-panel.ts +3 -3
- package/src/panels/base-panel.ts +14 -14
- package/src/panels/builtin/agent.ts +1 -0
- package/src/panels/builtin/operations.ts +2 -1
- package/src/panels/builtin/session.ts +2 -2
- package/src/panels/builtin/shared.ts +5 -5
- package/src/panels/cockpit-panel.ts +2 -2
- package/src/panels/communication-panel.ts +3 -3
- package/src/panels/context-visualizer-panel.ts +6 -3
- package/src/panels/control-plane-panel.ts +3 -3
- package/src/panels/cost-tracker-panel.ts +3 -3
- package/src/panels/debug-panel.ts +2 -2
- package/src/panels/diff-panel.ts +2 -2
- package/src/panels/docs-panel.ts +1 -1
- package/src/panels/eval-panel.ts +2 -2
- package/src/panels/file-explorer-panel.ts +3 -3
- package/src/panels/file-preview-panel.ts +3 -3
- package/src/panels/forensics-panel.ts +2 -2
- package/src/panels/git-panel.ts +1 -1
- package/src/panels/hooks-panel.ts +3 -3
- package/src/panels/incident-review-panel.ts +1 -1
- package/src/panels/intelligence-panel.ts +2 -2
- package/src/panels/knowledge-panel.ts +1 -1
- package/src/panels/local-auth-panel.ts +2 -2
- package/src/panels/marketplace-panel.ts +1 -1
- package/src/panels/mcp-panel.ts +3 -3
- package/src/panels/memory-panel.ts +1 -1
- package/src/panels/ops-control-panel.ts +3 -3
- package/src/panels/ops-strategy-panel.ts +2 -2
- package/src/panels/orchestration-panel.ts +2 -2
- package/src/panels/panel-list-panel.ts +6 -6
- package/src/panels/plan-dashboard-panel.ts +1 -1
- package/src/panels/plugins-panel.ts +2 -2
- package/src/panels/policy-panel.ts +2 -2
- package/src/panels/polish.ts +3 -3
- package/src/panels/provider-accounts-panel.ts +2 -2
- package/src/panels/provider-health-domains.ts +5 -1
- package/src/panels/provider-health-panel.ts +7 -3
- package/src/panels/provider-stats-panel.ts +3 -3
- package/src/panels/remote-panel.ts +3 -3
- package/src/panels/routes-panel.ts +3 -3
- package/src/panels/sandbox-panel.ts +2 -2
- package/src/panels/schedule-panel.ts +1 -1
- package/src/panels/security-panel.ts +2 -2
- package/src/panels/services-panel.ts +2 -2
- package/src/panels/session-browser-panel.ts +3 -3
- package/src/panels/settings-sync-panel.ts +2 -2
- package/src/panels/skills-panel.ts +6 -6
- package/src/panels/subscription-panel.ts +2 -2
- package/src/panels/symbol-outline-panel.ts +3 -3
- package/src/panels/system-messages-panel.ts +4 -4
- package/src/panels/tasks-panel.ts +2 -2
- package/src/panels/thinking-panel.ts +3 -3
- package/src/panels/token-budget-panel.ts +7 -3
- package/src/panels/tool-inspector-panel.ts +3 -3
- package/src/panels/types.ts +5 -5
- package/src/panels/watchers-panel.ts +3 -3
- package/src/panels/welcome-panel.ts +1 -1
- package/src/panels/worktree-panel.ts +2 -2
- package/src/panels/wrfc-panel.ts +3 -3
- package/src/permissions/prompt.ts +3 -22
- package/src/plugins/loader.ts +15 -304
- package/src/renderer/agent-detail-modal.ts +1 -1
- package/src/renderer/autocomplete-overlay.ts +2 -2
- package/src/renderer/bookmark-modal.ts +1 -1
- package/src/renderer/bottom-bar.ts +2 -2
- package/src/renderer/buffer.ts +1 -1
- package/src/renderer/code-block.ts +2 -2
- package/src/renderer/compositor.ts +2 -2
- package/src/renderer/context-inspector.ts +1 -1
- package/src/renderer/conversation-layout.ts +2 -2
- package/src/renderer/conversation-overlays.ts +1 -1
- package/src/renderer/conversation-surface.ts +2 -2
- package/src/renderer/diff-view.ts +2 -2
- package/src/renderer/diff.ts +1 -1
- package/src/renderer/file-picker-overlay.ts +2 -2
- package/src/renderer/file-tree.ts +2 -2
- package/src/renderer/help-overlay.ts +1 -1
- package/src/renderer/history-search-overlay.ts +2 -2
- package/src/renderer/live-tail-modal.ts +1 -1
- package/src/renderer/markdown.ts +2 -2
- package/src/renderer/modal-factory.ts +3 -3
- package/src/renderer/model-picker-overlay.ts +2 -2
- package/src/renderer/overlay-box.ts +2 -2
- package/src/renderer/panel-composite.ts +1 -1
- package/src/renderer/panel-picker-overlay.ts +2 -2
- package/src/renderer/panel-tab-bar.ts +1 -1
- package/src/renderer/panel-workspace-bar.ts +1 -1
- package/src/renderer/process-indicator.ts +2 -2
- package/src/renderer/process-modal.ts +1 -1
- package/src/renderer/profile-picker-modal.ts +2 -2
- package/src/renderer/progress.ts +2 -2
- package/src/renderer/search-overlay.ts +2 -2
- package/src/renderer/selection-modal-overlay.ts +2 -2
- package/src/renderer/session-picker-modal.ts +2 -2
- package/src/renderer/settings-modal.ts +2 -2
- package/src/renderer/shell-surface.ts +1 -1
- package/src/renderer/system-message.ts +1 -1
- package/src/renderer/tab-strip.ts +2 -2
- package/src/renderer/text-layout.ts +1 -1
- package/src/renderer/thinking.ts +1 -1
- package/src/renderer/tool-call.ts +2 -2
- package/src/renderer/ui-factory.ts +2 -2
- package/src/runtime/bootstrap-command-context.ts +7 -8
- package/src/runtime/bootstrap-command-parts.ts +4 -6
- package/src/runtime/bootstrap-core.ts +5 -4
- package/src/runtime/bootstrap-hook-bridge.ts +16 -175
- package/src/runtime/bootstrap-shell.ts +5 -5
- package/src/runtime/bootstrap.ts +6 -5
- package/src/runtime/context.ts +4 -20
- package/src/runtime/diagnostics/panels/index.ts +1 -1
- package/src/runtime/diagnostics/panels/ops.ts +1 -1
- package/src/runtime/diagnostics/panels/panel-resources.ts +118 -0
- package/src/runtime/perf/panel-contracts.ts +32 -0
- package/src/runtime/perf/panel-health-monitor.ts +18 -0
- package/src/runtime/services.ts +6 -6
- package/src/runtime/store/domains/conversation.ts +1 -181
- package/src/runtime/store/domains/permissions.ts +1 -143
- package/src/runtime/store/helpers/reducers/conversation.ts +1 -228
- package/src/runtime/store/helpers/reducers/lifecycle.ts +1 -440
- package/src/runtime/store/selectors/index.ts +11 -6
- package/src/runtime/store/state.ts +12 -4
- package/src/runtime/ui-read-models-observability-security.ts +2 -2
- package/src/runtime/ui-read-models-observability-system.ts +1 -1
- package/src/runtime/ui-service-queries.ts +1 -1
- package/src/runtime/ui-services.ts +1 -1
- package/src/shell/ui-openers.ts +1 -1
- package/src/tools/index.ts +1 -186
- package/src/types/grid.ts +48 -0
- package/src/utils/clipboard.ts +21 -0
- package/src/utils/splash-lines.ts +1 -1
- package/src/utils/terminal-width.ts +185 -0
- package/src/version.ts +1 -1
- package/src/acp/connection.ts +0 -447
- package/src/acp/index.ts +0 -7
- package/src/acp/manager.ts +0 -1
- package/src/adapters/bluebubbles/index.ts +0 -127
- package/src/adapters/discord/index.ts +0 -297
- package/src/adapters/github/index.ts +0 -73
- package/src/adapters/google-chat/index.ts +0 -119
- package/src/adapters/imessage/index.ts +0 -92
- package/src/adapters/index.ts +0 -15
- package/src/adapters/matrix/index.ts +0 -116
- package/src/adapters/mattermost/index.ts +0 -151
- package/src/adapters/msteams/index.ts +0 -180
- package/src/adapters/ntfy/index.ts +0 -118
- package/src/adapters/signal/index.ts +0 -92
- package/src/adapters/slack/index.ts +0 -323
- package/src/adapters/telegram/index.ts +0 -160
- package/src/adapters/types.ts +0 -97
- package/src/adapters/webhook/index.ts +0 -178
- package/src/adapters/whatsapp/index.ts +0 -135
- package/src/agents/message-bus-core.ts +0 -312
- package/src/agents/message-bus.ts +0 -2
- package/src/agents/orchestrator-prompts.ts +0 -351
- package/src/agents/orchestrator-runner.ts +0 -668
- package/src/agents/orchestrator.ts +0 -438
- package/src/agents/session.ts +0 -108
- package/src/agents/worktree.ts +0 -153
- package/src/agents/wrfc-config.ts +0 -47
- package/src/agents/wrfc-controller.ts +0 -747
- package/src/agents/wrfc-gate-runtime.ts +0 -75
- package/src/agents/wrfc-reporting.ts +0 -284
- package/src/agents/wrfc-runtime-events.ts +0 -150
- package/src/agents/wrfc-types.ts +0 -67
- package/src/automation/delivery-manager.ts +0 -368
- package/src/automation/index.ts +0 -72
- package/src/automation/manager-runtime-delivery.ts +0 -139
- package/src/automation/manager-runtime-events.ts +0 -131
- package/src/automation/manager-runtime-execution.ts +0 -511
- package/src/automation/manager-runtime-helpers.ts +0 -433
- package/src/automation/manager-runtime-job-mutations.ts +0 -175
- package/src/automation/manager-runtime-reconcile.ts +0 -148
- package/src/automation/manager-runtime-scheduling.ts +0 -189
- package/src/automation/manager-runtime-sync.ts +0 -54
- package/src/automation/manager-runtime.ts +0 -721
- package/src/automation/manager.ts +0 -10
- package/src/automation/service.ts +0 -242
- package/src/channels/builtin/account-actions.ts +0 -490
- package/src/channels/builtin/accounts.ts +0 -433
- package/src/channels/builtin/contracts.ts +0 -405
- package/src/channels/builtin/plugins.ts +0 -308
- package/src/channels/builtin/rendering.ts +0 -174
- package/src/channels/builtin/setup-schema.ts +0 -504
- package/src/channels/builtin/shared.ts +0 -96
- package/src/channels/builtin/surfaces.ts +0 -57
- package/src/channels/builtin/targets.ts +0 -693
- package/src/channels/builtin-runtime.ts +0 -443
- package/src/channels/delivery/shared.ts +0 -199
- package/src/channels/delivery/strategies-bridge.ts +0 -246
- package/src/channels/delivery/strategies-core.ts +0 -299
- package/src/channels/delivery/strategies-enterprise.ts +0 -178
- package/src/channels/delivery/types.ts +0 -59
- package/src/channels/delivery-router.ts +0 -127
- package/src/channels/index.ts +0 -77
- package/src/channels/plugin-registry.ts +0 -551
- package/src/channels/provider-runtime.ts +0 -330
- package/src/channels/reply-pipeline.ts +0 -522
- package/src/channels/route-manager.ts +0 -340
- package/src/channels/surface-registry.ts +0 -186
- package/src/config/helper-model.ts +0 -1
- package/src/config/manager.ts +0 -8
- package/src/config/subscription-auth.ts +0 -31
- package/src/config/tool-llm.ts +0 -110
- package/src/control-plane/approval-broker.ts +0 -351
- package/src/control-plane/gateway.ts +0 -1
- package/src/control-plane/index.ts +0 -54
- package/src/control-plane/media-contract-schemas.ts +0 -1
- package/src/control-plane/method-catalog-admin.ts +0 -1
- package/src/control-plane/method-catalog-channels.ts +0 -1
- package/src/control-plane/method-catalog-control-automation.ts +0 -1
- package/src/control-plane/method-catalog-control-core.ts +0 -1
- package/src/control-plane/method-catalog-control.ts +0 -1
- package/src/control-plane/method-catalog-events.ts +0 -1
- package/src/control-plane/method-catalog-knowledge.ts +0 -1
- package/src/control-plane/method-catalog-media.ts +0 -1
- package/src/control-plane/method-catalog-runtime.ts +0 -1
- package/src/control-plane/method-catalog-shared.ts +0 -1
- package/src/control-plane/method-catalog.ts +0 -1
- package/src/control-plane/operator-contract-schemas-admin.ts +0 -1
- package/src/control-plane/operator-contract-schemas-channels.ts +0 -1
- package/src/control-plane/operator-contract-schemas-control.ts +0 -1
- package/src/control-plane/operator-contract-schemas-domains.ts +0 -1
- package/src/control-plane/operator-contract-schemas-knowledge.ts +0 -1
- package/src/control-plane/operator-contract-schemas-media.ts +0 -1
- package/src/control-plane/operator-contract-schemas-permissions.ts +0 -1
- package/src/control-plane/operator-contract-schemas-remote.ts +0 -1
- package/src/control-plane/operator-contract-schemas-runtime.ts +0 -1
- package/src/control-plane/operator-contract-schemas-shared.ts +0 -1
- package/src/control-plane/operator-contract-schemas-telemetry.ts +0 -1
- package/src/control-plane/operator-contract-schemas.ts +0 -1
- package/src/control-plane/operator-contract.ts +0 -165
- package/src/control-plane/session-broker.ts +0 -780
- package/src/core/compaction-sections.ts +0 -492
- package/src/core/compaction-types.ts +0 -147
- package/src/core/context-compaction.ts +0 -542
- package/src/core/conversation-compaction.ts +0 -68
- package/src/core/conversation-diff.ts +0 -55
- package/src/core/conversation-utils.ts +0 -72
- package/src/core/event-replay.ts +0 -287
- package/src/core/orchestrator-context-runtime.ts +0 -407
- package/src/core/orchestrator-follow-up-runtime.ts +0 -134
- package/src/core/orchestrator-runtime.ts +0 -132
- package/src/core/orchestrator-tool-runtime.ts +0 -468
- package/src/core/orchestrator-turn-helpers.ts +0 -355
- package/src/core/orchestrator-turn-loop.ts +0 -443
- package/src/core/plan-command-handler.ts +0 -169
- package/src/core/transcript-events/classify.ts +0 -95
- package/src/core/transcript-events/index.ts +0 -15
- package/src/daemon/control-plane.ts +0 -522
- package/src/daemon/facade-composition.ts +0 -398
- package/src/daemon/facade.ts +0 -638
- package/src/daemon/helpers.ts +0 -74
- package/src/daemon/http/router-route-contexts.ts +0 -370
- package/src/daemon/http/router.ts +0 -531
- package/src/daemon/http-listener.ts +0 -301
- package/src/daemon/index.ts +0 -1
- package/src/daemon/server.ts +0 -1
- package/src/daemon/service-manager.ts +0 -413
- package/src/daemon/surface-actions.ts +0 -183
- package/src/daemon/surface-delivery.ts +0 -530
- package/src/daemon/surface-policy.ts +0 -60
- package/src/daemon/transport-events.ts +0 -110
- package/src/daemon/types.ts +0 -191
- package/src/export/markdown.ts +0 -213
- package/src/export/session-export.ts +0 -1
- package/src/git/index.ts +0 -1
- package/src/git/service.ts +0 -414
- package/src/hooks/chain-engine.ts +0 -414
- package/src/hooks/dispatcher.ts +0 -414
- package/src/hooks/hook-api.ts +0 -170
- package/src/hooks/index.ts +0 -48
- package/src/hooks/runners/agent.ts +0 -93
- package/src/hooks/runners/prompt.ts +0 -69
- package/src/hooks/workbench.ts +0 -360
- package/src/integrations/index.ts +0 -42
- package/src/integrations/notifier.ts +0 -206
- package/src/integrations/webhooks.ts +0 -1
- package/src/knowledge/consolidation.ts +0 -346
- package/src/knowledge/graphql.ts +0 -324
- package/src/knowledge/index.ts +0 -60
- package/src/knowledge/ingest-compile.ts +0 -386
- package/src/knowledge/ingest-context.ts +0 -18
- package/src/knowledge/ingest-inputs.ts +0 -387
- package/src/knowledge/ingest.ts +0 -1
- package/src/knowledge/internal.ts +0 -257
- package/src/knowledge/knowledge-api.ts +0 -432
- package/src/knowledge/lint.ts +0 -121
- package/src/knowledge/memory-sync.ts +0 -62
- package/src/knowledge/packet.ts +0 -370
- package/src/knowledge/scheduling.ts +0 -283
- package/src/knowledge/service.ts +0 -715
- package/src/mcp/client.ts +0 -383
- package/src/mcp/index.ts +0 -12
- package/src/mcp/mcp-api.ts +0 -90
- package/src/mcp/registry.ts +0 -1
- package/src/media/builtin-image-understanding.ts +0 -303
- package/src/media/builtin-providers.ts +0 -26
- package/src/media/index.ts +0 -18
- package/src/multimodal/index.ts +0 -13
- package/src/multimodal/service.ts +0 -492
- package/src/permissions/briefs/build.ts +0 -88
- package/src/permissions/manager.ts +0 -1
- package/src/plugins/api.ts +0 -383
- package/src/plugins/manager.ts +0 -481
- package/src/profiles/shape.ts +0 -58
- package/src/providers/amazon-bedrock-mantle.ts +0 -50
- package/src/providers/amazon-bedrock.ts +0 -61
- package/src/providers/anthropic-compat.ts +0 -373
- package/src/providers/anthropic-sdk-provider.ts +0 -230
- package/src/providers/anthropic-vertex.ts +0 -59
- package/src/providers/anthropic.ts +0 -469
- package/src/providers/auto-register.ts +0 -417
- package/src/providers/builtin-catalog.ts +0 -326
- package/src/providers/builtin-registry.ts +0 -575
- package/src/providers/cache-planner.ts +0 -258
- package/src/providers/capabilities.ts +0 -1
- package/src/providers/custom-loader.ts +0 -425
- package/src/providers/discovered-compat.ts +0 -7
- package/src/providers/discovered-factory.ts +0 -61
- package/src/providers/discovered-traits.ts +0 -138
- package/src/providers/gemini.ts +0 -462
- package/src/providers/github-copilot.ts +0 -254
- package/src/providers/index.ts +0 -1
- package/src/providers/interface.ts +0 -185
- package/src/providers/llama-cpp.ts +0 -402
- package/src/providers/lm-studio-helpers.ts +0 -367
- package/src/providers/lm-studio.ts +0 -484
- package/src/providers/model-catalog-cache.ts +0 -221
- package/src/providers/model-catalog-notifications.ts +0 -97
- package/src/providers/model-catalog-synthetic.ts +0 -202
- package/src/providers/model-catalog.ts +0 -211
- package/src/providers/model-limits.ts +0 -1
- package/src/providers/ollama.ts +0 -469
- package/src/providers/openai-codex.ts +0 -472
- package/src/providers/openai-compat.ts +0 -615
- package/src/providers/openai.ts +0 -231
- package/src/providers/optimizer.ts +0 -1
- package/src/providers/provider-api.ts +0 -1
- package/src/providers/registry-helpers.ts +0 -34
- package/src/providers/registry-models.ts +0 -77
- package/src/providers/registry-types.ts +0 -67
- package/src/providers/registry.ts +0 -1
- package/src/providers/runtime-metadata.ts +0 -149
- package/src/providers/runtime-snapshot.ts +0 -130
- package/src/providers/synthetic.ts +0 -561
- package/src/providers/tier-prompts.ts +0 -84
- package/src/providers/tool-formats.ts +0 -414
- package/src/runtime/auth/inspection.ts +0 -125
- package/src/runtime/bootstrap-background.ts +0 -157
- package/src/runtime/bootstrap-helpers.ts +0 -88
- package/src/runtime/bootstrap-runtime-events.ts +0 -254
- package/src/runtime/bootstrap-services.ts +0 -197
- package/src/runtime/compaction/index.ts +0 -1
- package/src/runtime/compaction/lifecycle.ts +0 -1
- package/src/runtime/compaction/manager.ts +0 -474
- package/src/runtime/compaction/quality-score.ts +0 -1
- package/src/runtime/compaction/resume-repair.ts +0 -1
- package/src/runtime/compaction/strategies/autocompact.ts +0 -1
- package/src/runtime/compaction/strategies/boundary-commit.ts +0 -1
- package/src/runtime/compaction/strategies/collapse.ts +0 -1
- package/src/runtime/compaction/strategies/index.ts +0 -1
- package/src/runtime/compaction/strategies/microcompact.ts +0 -1
- package/src/runtime/compaction/strategies/reactive.ts +0 -1
- package/src/runtime/compaction/types.ts +0 -1
- package/src/runtime/ecosystem/recommendations.ts +0 -117
- package/src/runtime/emitters/agents.ts +0 -96
- package/src/runtime/emitters/automation.ts +0 -112
- package/src/runtime/emitters/communication.ts +0 -53
- package/src/runtime/emitters/compaction.ts +0 -161
- package/src/runtime/emitters/control-plane.ts +0 -65
- package/src/runtime/emitters/deliveries.ts +0 -65
- package/src/runtime/emitters/forensics.ts +0 -17
- package/src/runtime/emitters/index.ts +0 -59
- package/src/runtime/emitters/knowledge.ts +0 -129
- package/src/runtime/emitters/mcp.ts +0 -95
- package/src/runtime/emitters/ops.ts +0 -163
- package/src/runtime/emitters/orchestration.ts +0 -87
- package/src/runtime/emitters/permissions.ts +0 -98
- package/src/runtime/emitters/planner.ts +0 -23
- package/src/runtime/emitters/plugins.ts +0 -78
- package/src/runtime/emitters/providers.ts +0 -30
- package/src/runtime/emitters/routes.ts +0 -57
- package/src/runtime/emitters/security.ts +0 -53
- package/src/runtime/emitters/session.ts +0 -93
- package/src/runtime/emitters/surfaces.ts +0 -57
- package/src/runtime/emitters/tasks.ts +0 -69
- package/src/runtime/emitters/tools.ts +0 -140
- package/src/runtime/emitters/transport.ts +0 -78
- package/src/runtime/emitters/turn.ts +0 -155
- package/src/runtime/emitters/ui.ts +0 -57
- package/src/runtime/emitters/watchers.ts +0 -57
- package/src/runtime/emitters/workflows.ts +0 -79
- package/src/runtime/eval/index.ts +0 -48
- package/src/runtime/eval/runner.ts +0 -163
- package/src/runtime/eval/suites.ts +0 -264
- package/src/runtime/events/domain-map.ts +0 -148
- package/src/runtime/events/index.ts +0 -1
- package/src/runtime/events/turn.ts +0 -1
- package/src/runtime/events/workflows.ts +0 -1
- package/src/runtime/forensics/collector.ts +0 -693
- package/src/runtime/forensics/index.ts +0 -23
- package/src/runtime/foundation-clients.ts +0 -78
- package/src/runtime/foundation-services.ts +0 -96
- package/src/runtime/guidance.ts +0 -183
- package/src/runtime/health/effect-handlers.ts +0 -189
- package/src/runtime/health/index.ts +0 -70
- package/src/runtime/health/wiring.ts +0 -115
- package/src/runtime/integration/helpers.ts +0 -640
- package/src/runtime/lifecycle.ts +0 -107
- package/src/runtime/mcp/index.ts +0 -68
- package/src/runtime/mcp/manager.ts +0 -513
- package/src/runtime/network/inbound.ts +0 -131
- package/src/runtime/network/index.ts +0 -30
- package/src/runtime/network/outbound.ts +0 -292
- package/src/runtime/network/shared.ts +0 -82
- package/src/runtime/operator-client.ts +0 -235
- package/src/runtime/ops/control-plane.ts +0 -363
- package/src/runtime/ops/index.ts +0 -122
- package/src/runtime/ops/playbooks/index.ts +0 -10
- package/src/runtime/ops/playbooks/session-unrecoverable.ts +0 -196
- package/src/runtime/ops/playbooks/stuck-turn.ts +0 -197
- package/src/runtime/ops/runtime-context.ts +0 -100
- package/src/runtime/ops-api.ts +0 -27
- package/src/runtime/orchestration/spawn-policy.ts +0 -83
- package/src/runtime/peer-client.ts +0 -404
- package/src/runtime/perf/index.ts +0 -57
- package/src/runtime/perf/slo-collector.ts +0 -375
- package/src/runtime/permissions/index.ts +0 -190
- package/src/runtime/permissions/policy-runtime.ts +0 -1
- package/src/runtime/permissions/preflight.ts +0 -101
- package/src/runtime/permissions/rule-suggestions.ts +0 -36
- package/src/runtime/plugins/hot-reload.ts +0 -221
- package/src/runtime/plugins/index.ts +0 -84
- package/src/runtime/plugins/lifecycle.ts +0 -95
- package/src/runtime/plugins/manager.ts +0 -474
- package/src/runtime/plugins/manifest.ts +0 -167
- package/src/runtime/plugins/quarantine.ts +0 -202
- package/src/runtime/plugins/trust.ts +0 -291
- package/src/runtime/plugins/types.ts +0 -205
- package/src/runtime/provider-accounts/registry.ts +0 -326
- package/src/runtime/remote/distributed-runtime-contract-schemas.ts +0 -386
- package/src/runtime/remote/index.ts +0 -488
- package/src/runtime/remote/runner-registry.ts +0 -438
- package/src/runtime/remote/supervisor.ts +0 -70
- package/src/runtime/runtime-hook-api.ts +0 -5
- package/src/runtime/runtime-knowledge-api.ts +0 -14
- package/src/runtime/runtime-mcp-api.ts +0 -5
- package/src/runtime/runtime-ops-api.ts +0 -86
- package/src/runtime/runtime-provider-api.ts +0 -18
- package/src/runtime/session-maintenance.ts +0 -188
- package/src/runtime/session-persistence.ts +0 -288
- package/src/runtime/session-return-context.ts +0 -195
- package/src/runtime/settings/control-plane-store.ts +0 -258
- package/src/runtime/settings/control-plane.ts +0 -599
- package/src/runtime/shell-command-extensions.ts +0 -54
- package/src/runtime/shell-command-ops.ts +0 -207
- package/src/runtime/shell-command-platform.ts +0 -47
- package/src/runtime/shell-command-services.ts +0 -143
- package/src/runtime/shell-command-workspace.ts +0 -31
- package/src/runtime/tasks/adapters/acp-adapter.ts +0 -211
- package/src/runtime/tasks/adapters/agent-adapter.ts +0 -208
- package/src/runtime/tasks/adapters/index.ts +0 -16
- package/src/runtime/tasks/adapters/process-adapter.ts +0 -214
- package/src/runtime/tasks/adapters/scheduler-adapter.ts +0 -193
- package/src/runtime/tasks/index.ts +0 -68
- package/src/runtime/tasks/manager.ts +0 -415
- package/src/runtime/telemetry/api-helpers.ts +0 -517
- package/src/runtime/telemetry/api.ts +0 -768
- package/src/runtime/telemetry/index.ts +0 -178
- package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +0 -440
- package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +0 -200
- package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +0 -18
- package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +0 -204
- package/src/runtime/telemetry/instrumentation/domain-bridge.ts +0 -125
- package/src/runtime/telemetry/instrumentation/index.ts +0 -67
- package/src/runtime/tools/context.ts +0 -114
- package/src/runtime/tools/index.ts +0 -46
- package/src/runtime/tools/phased-executor.ts +0 -448
- package/src/runtime/tools/phases/budget.ts +0 -130
- package/src/runtime/tools/phases/execute.ts +0 -69
- package/src/runtime/tools/phases/index.ts +0 -13
- package/src/runtime/tools/phases/map-output.ts +0 -98
- package/src/runtime/tools/phases/permission.ts +0 -133
- package/src/runtime/tools/phases/posthook.ts +0 -57
- package/src/runtime/tools/phases/prehook.ts +0 -68
- package/src/runtime/tools/phases/validate.ts +0 -53
- package/src/runtime/transports/direct.ts +0 -73
- package/src/runtime/transports/http-helpers.ts +0 -218
- package/src/runtime/transports/http-types.ts +0 -364
- package/src/runtime/transports/http.ts +0 -629
- package/src/runtime/transports/realtime.ts +0 -50
- package/src/runtime/transports/remote-events.ts +0 -16
- package/src/runtime/transports/shared.ts +0 -39
- package/src/runtime/transports/ui-runtime-events.ts +0 -35
- package/src/runtime/ui-read-models-core.ts +0 -95
- package/src/runtime/ui-read-models-operations.ts +0 -203
- package/src/runtime/worktree/registry.ts +0 -252
- package/src/sessions/manager.ts +0 -14
- package/src/state/file-watcher.ts +0 -294
- package/src/state/index.ts +0 -56
- package/src/state/knowledge-injection.ts +0 -214
- package/src/state/memory-embedding-http.ts +0 -642
- package/src/state/memory-embeddings.ts +0 -312
- package/src/state/memory-ingest.ts +0 -132
- package/src/state/memory-registry.ts +0 -111
- package/src/state/memory-store-helpers.ts +0 -160
- package/src/state/memory-store.ts +0 -728
- package/src/state/memory-vector-store.ts +0 -418
- package/src/templates/manager.ts +0 -187
- package/src/tools/agent/index.ts +0 -610
- package/src/tools/agent/manager.ts +0 -476
- package/src/tools/analyze/git-modes.ts +0 -380
- package/src/tools/analyze/index.ts +0 -128
- package/src/tools/channel/agent-tools.ts +0 -16
- package/src/tools/channel/index.ts +0 -268
- package/src/tools/control/index.ts +0 -90
- package/src/tools/edit/core.ts +0 -619
- package/src/tools/edit/index.ts +0 -4
- package/src/tools/edit/phased.ts +0 -33
- package/src/tools/fetch/index.ts +0 -3
- package/src/tools/fetch/phased.ts +0 -34
- package/src/tools/fetch/runtime.ts +0 -499
- package/src/tools/mcp/index.ts +0 -190
- package/src/tools/remote-trigger/index.ts +0 -130
- package/src/tools/shared/auto-heal.ts +0 -282
- package/src/tools/state/index.ts +0 -688
- package/src/tools/web-search/index.ts +0 -38
- package/src/tools/write/index.ts +0 -604
- package/src/tools/write/phased.ts +0 -41
- package/src/types/generated/foundation-client-types.ts +0 -22
- package/src/watchers/index.ts +0 -11
- package/src/watchers/registry.ts +0 -517
- package/src/web-search/index.ts +0 -26
- package/src/web-search/provider-registry.ts +0 -64
- package/src/web-search/providers/brave.ts +0 -100
- package/src/web-search/providers/duckduckgo.ts +0 -270
- package/src/web-search/providers/exa.ts +0 -77
- package/src/web-search/providers/firecrawl.ts +0 -90
- package/src/web-search/providers/perplexity.ts +0 -86
- package/src/web-search/providers/searxng.ts +0 -88
- package/src/web-search/providers/shared.ts +0 -249
- package/src/web-search/providers/tavily.ts +0 -90
- package/src/web-search/service.ts +0 -142
package/src/core/orchestrator.ts
CHANGED
|
@@ -1,733 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { PermissionError, ProviderError, ToolError, isNonTransientProviderFailure } from '@pellux/goodvibes-sdk/platform/types/errors';
|
|
5
|
-
import type { HookEvent, HookResult } from '@pellux/goodvibes-sdk/platform/hooks/types';
|
|
6
|
-
import { formatError, summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
7
|
-
import type { ModelDefinition } from '@pellux/goodvibes-sdk/platform/providers/registry';
|
|
8
|
-
import type { ContentPart } from '@pellux/goodvibes-sdk/platform/providers/interface';
|
|
9
|
-
import { notifyCompletion } from '@pellux/goodvibes-sdk/platform/utils/notify';
|
|
10
|
-
import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
|
|
11
|
-
import type { PermissionManager } from '@pellux/goodvibes-sdk/platform/permissions/manager';
|
|
12
|
-
import type { AcpManager } from '@pellux/goodvibes-sdk/platform/acp/manager';
|
|
13
|
-
import type { SubagentTask } from '@pellux/goodvibes-sdk/platform/acp/protocol';
|
|
14
|
-
import { ConsecutiveErrorBreaker } from '@pellux/goodvibes-sdk/platform/core/circuit-breaker';
|
|
15
|
-
import type { ExecutionPlan, PlanItem } from '@pellux/goodvibes-sdk/platform/core/execution-plan';
|
|
16
|
-
import { classifyIntent } from '@pellux/goodvibes-sdk/platform/core/intent-classifier';
|
|
17
|
-
import { estimateConversationTokens } from '@pellux/goodvibes-sdk/platform/core/context-compaction';
|
|
18
|
-
import { SessionLineageTracker } from '@pellux/goodvibes-sdk/platform/core/session-lineage';
|
|
19
|
-
import { EventReplayQueue } from '@pellux/goodvibes-sdk/platform/core/event-replay';
|
|
20
|
-
import {
|
|
21
|
-
type ConversationFollowUpItem,
|
|
22
|
-
} from '@pellux/goodvibes-sdk/platform/core/conversation-follow-ups';
|
|
23
|
-
import { OrchestratorFollowUpRuntime } from './orchestrator-follow-up-runtime';
|
|
24
|
-
import type { SystemMessageRouter } from './system-message-router.ts';
|
|
25
|
-
import { AgentManager } from '@pellux/goodvibes-sdk/platform/tools/agent/index';
|
|
26
|
-
import { WrfcController } from '@pellux/goodvibes-sdk/platform/agents/wrfc-controller';
|
|
27
|
-
import { THINKING_SPINNER_FRAMES } from '../renderer/progress.ts';
|
|
28
|
-
import { randomUUID, createHash } from 'node:crypto';
|
|
29
|
-
import { CacheHitTracker } from '@pellux/goodvibes-sdk/platform/providers/cache-strategy';
|
|
30
|
-
import { IdempotencyStore } from '@pellux/goodvibes-sdk/platform/runtime/idempotency/index';
|
|
31
|
-
import { type ReconciliationReason } from '@pellux/goodvibes-sdk/platform/core/tool-reconciliation';
|
|
32
|
-
import type { FeatureFlagManager } from '@pellux/goodvibes-sdk/platform/runtime/feature-flags/manager';
|
|
33
|
-
import type { RuntimeEventBus } from '@pellux/goodvibes-sdk/platform/runtime/events/index';
|
|
34
|
-
import { HelperModel } from '@pellux/goodvibes-sdk/platform/config/helper-model';
|
|
35
|
-
import {
|
|
36
|
-
emitStreamEnd,
|
|
37
|
-
emitTurnCancel,
|
|
38
|
-
emitTurnError,
|
|
39
|
-
emitTurnSubmitted,
|
|
40
|
-
} from '@pellux/goodvibes-sdk/platform/runtime/emitters/index';
|
|
41
|
-
import {
|
|
42
|
-
autoSpawnPendingItems,
|
|
43
|
-
executeToolCalls,
|
|
44
|
-
reconcileUnresolvedToolCalls,
|
|
45
|
-
} from './orchestrator-tool-runtime';
|
|
46
|
-
import {
|
|
47
|
-
checkContextWindowPreflight,
|
|
48
|
-
emitContextOverflowError,
|
|
49
|
-
handlePostTurnContextMaintenance,
|
|
50
|
-
} from './orchestrator-context-runtime';
|
|
51
|
-
import {
|
|
52
|
-
createEmitterContext,
|
|
53
|
-
estimateFreshTurnInputTokens,
|
|
54
|
-
getCacheHitTracker,
|
|
55
|
-
getIdempotencyStore,
|
|
56
|
-
getSessionLineageTracker,
|
|
57
|
-
normalizeUsage,
|
|
58
|
-
requireConfigManager,
|
|
59
|
-
requireProviderRegistry,
|
|
60
|
-
type OrchestratorCoreServices,
|
|
61
|
-
} from './orchestrator-runtime';
|
|
62
|
-
import {
|
|
63
|
-
type ChatResponseWithReasoning,
|
|
64
|
-
maybeEmitAdaptivePlannerDecision,
|
|
65
|
-
prepareConversationForTurn,
|
|
66
|
-
} from './orchestrator-turn-helpers';
|
|
67
|
-
import { executeOrchestratorTurnLoop } from './orchestrator-turn-loop';
|
|
68
|
-
|
|
69
|
-
/** Minimal interface for hook dispatch — allows any compatible implementation */
|
|
70
|
-
interface HookDispatcherLike {
|
|
71
|
-
fire(event: HookEvent): Promise<HookResult>;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/** Delay (ms) before auto-spawning plan items if the model ends its turn without spawning them. */
|
|
75
|
-
const AUTO_SPAWN_FALLBACK_DELAY_MS = 5_000;
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Orchestrator - Manages LLM turn lifecycle with full tool-use loop.
|
|
79
|
-
* Supports multi-turn agent loops: call LLM -> execute tools -> send results -> repeat.
|
|
80
|
-
*/
|
|
81
|
-
export class Orchestrator {
|
|
82
|
-
public isThinking = false;
|
|
83
|
-
public thinkingFrame = 0;
|
|
84
|
-
public usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 };
|
|
85
|
-
/**
|
|
86
|
-
* Input tokens from the most recent LLM response — represents current context window usage.
|
|
87
|
-
* Includes cache read/write tokens for accurate context window occupancy.
|
|
88
|
-
* Value is 0 before the first LLM response (context bar shows empty, which is correct).
|
|
89
|
-
*/
|
|
90
|
-
public lastInputTokens = 0;
|
|
91
|
-
/** Fresh input tokens from the most recent turn (excluding cache-read reuse where applicable). */
|
|
92
|
-
public lastRequestInputTokens = 0;
|
|
93
|
-
/** Approximate input tokens for the current streaming turn (from prior turn's response). */
|
|
94
|
-
public streamingInputTokens = 0;
|
|
95
|
-
/** Output tokens received so far in the current streaming turn (one per delta chunk). */
|
|
96
|
-
public streamingOutputTokens = 0;
|
|
97
|
-
public messageQueue: { text: string; content?: ContentPart[] }[] = [];
|
|
98
|
-
|
|
99
|
-
private animInterval: ReturnType<typeof setInterval> | null = null;
|
|
100
|
-
private abortController: AbortController | null = null;
|
|
101
|
-
private autoSpawnTimeout: ReturnType<typeof setTimeout> | null = null;
|
|
102
|
-
private acpManager: AcpManager | null = null;
|
|
103
|
-
/** Message count at the start of a turn, used to rollback on cancel. */
|
|
104
|
-
private turnStartMessageCount = 0;
|
|
105
|
-
/** Whether a streaming block is currently active (for cleanup on abort). */
|
|
106
|
-
private isStreaming = false;
|
|
107
|
-
/** Last token warning bracket (multiples of 10%) to avoid repeat warnings at same level. */
|
|
108
|
-
private lastWarningBracket = 0;
|
|
109
|
-
/** Whether auto-compaction is currently in progress (prevents re-entry). */
|
|
110
|
-
private isCompacting = false;
|
|
111
|
-
|
|
112
|
-
/** Session ID for hook events — unique per Orchestrator instance */
|
|
113
|
-
private readonly sessionId = randomUUID();
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Submission key for the currently active turn.
|
|
117
|
-
*
|
|
118
|
-
* Generated at the start of each `runTurn` call and used as the idempotency
|
|
119
|
-
* key for the turn-level deduplication fence. A duplicate `runTurn` call with
|
|
120
|
-
* the same text that arrives while a turn is still in-flight will be detected
|
|
121
|
-
* via the shared `idempotencyStore` and rejected before re-executing.
|
|
122
|
-
*
|
|
123
|
-
* The key is reset to `null` when the turn completes.
|
|
124
|
-
*/
|
|
125
|
-
public currentSubmissionKey: string | null = null;
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Tracks whether the current turn ended in failure.
|
|
129
|
-
* Set to `true` in the catch block; read in `finally` to decide markComplete vs markFailed.
|
|
130
|
-
*/
|
|
131
|
-
private _turnFailed = false;
|
|
132
|
-
|
|
133
|
-
/** Event replay queue — ensures model acknowledges significant events */
|
|
134
|
-
private readonly replayQueue: EventReplayQueue;
|
|
135
|
-
|
|
136
|
-
/** Cleanup function returned by the active replay queue attachment. */
|
|
137
|
-
private detachReplay: (() => void) | null = null;
|
|
138
|
-
private readonly runtimeBus: RuntimeEventBus | null;
|
|
139
|
-
private readonly agentManager: Pick<AgentManager, 'list' | 'spawn'>;
|
|
140
|
-
private readonly wrfcController: Pick<WrfcController, 'listChains'>;
|
|
141
|
-
private coreServices: OrchestratorCoreServices = {};
|
|
142
|
-
private readonly ownedSessionLineageTracker = new SessionLineageTracker();
|
|
143
|
-
private readonly ownedIdempotencyStore = new IdempotencyStore();
|
|
144
|
-
private readonly ownedCacheHitTracker = new CacheHitTracker();
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Optional feature flag manager.
|
|
148
|
-
*
|
|
149
|
-
* When provided, the `tool-result-reconciliation` flag is
|
|
150
|
-
* consulted at each turn end to decide whether to use full reconciliation
|
|
151
|
-
* (`enabled`) or skip reconciliation (`disabled`).
|
|
152
|
-
* When `null`, reconciliation defaults to enabled (matching the flag's
|
|
153
|
-
* declared `defaultState`).
|
|
154
|
-
*/
|
|
155
|
-
private flagManager: FeatureFlagManager | null = null;
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Tracks the last provider response's tool calls within the current turn
|
|
159
|
-
* iteration so the reconciliation pass can detect unresolved calls when
|
|
160
|
-
* the loop exits early.
|
|
161
|
-
*/
|
|
162
|
-
private _pendingToolCalls: ToolCall[] = [];
|
|
163
|
-
private readonly requestRender: () => void;
|
|
164
|
-
private systemMessageRouter: Pick<SystemMessageRouter, 'low'> | null = null;
|
|
165
|
-
private readonly followUpRuntime: OrchestratorFollowUpRuntime;
|
|
166
|
-
|
|
167
|
-
constructor(
|
|
168
|
-
private conversation: ConversationManager,
|
|
169
|
-
private getViewportHeight: () => number,
|
|
170
|
-
private scrollToEnd: (vHeight: number) => void,
|
|
171
|
-
private toolRegistry: ToolRegistry,
|
|
172
|
-
private permissionManager: PermissionManager,
|
|
173
|
-
private getSystemPrompt: () => string = () => '',
|
|
174
|
-
private hookDispatcher: HookDispatcherLike | null = null,
|
|
175
|
-
flagManager: FeatureFlagManager | null = null,
|
|
176
|
-
requestRender: (() => void) | null = null,
|
|
177
|
-
runtimeBus: RuntimeEventBus | null = null,
|
|
178
|
-
services: {
|
|
179
|
-
readonly agentManager: Pick<AgentManager, 'list' | 'spawn'>;
|
|
180
|
-
readonly wrfcController: Pick<WrfcController, 'listChains'>;
|
|
181
|
-
},
|
|
182
|
-
) {
|
|
183
|
-
this.replayQueue = new EventReplayQueue();
|
|
184
|
-
this.detachReplay = runtimeBus
|
|
185
|
-
? EventReplayQueue.attachToRuntimeBus(runtimeBus, this.replayQueue)
|
|
186
|
-
: null;
|
|
187
|
-
this.flagManager = flagManager;
|
|
188
|
-
this.requestRender = requestRender ?? (() => {});
|
|
189
|
-
this.runtimeBus = runtimeBus;
|
|
190
|
-
this.agentManager = services.agentManager;
|
|
191
|
-
this.wrfcController = services.wrfcController;
|
|
192
|
-
this.followUpRuntime = new OrchestratorFollowUpRuntime({
|
|
193
|
-
conversation: this.conversation,
|
|
194
|
-
getViewportHeight: () => this.getViewportHeight(),
|
|
195
|
-
scrollToEnd: (height) => this.scrollToEnd(height),
|
|
196
|
-
getSystemPrompt: () => this.getSystemPrompt(),
|
|
197
|
-
requestRender: () => this.requestRender(),
|
|
198
|
-
getThinkingState: () => ({ isThinking: this.isThinking, isCompacting: this.isCompacting }),
|
|
199
|
-
getQueuedUserMessageCount: () => this.messageQueue.length,
|
|
200
|
-
getProviderRegistry: () => requireProviderRegistry(this.coreServices),
|
|
201
|
-
getCurrentModel: () => requireProviderRegistry(this.coreServices).getCurrentModel(),
|
|
202
|
-
routeLowPriorityMessage: (message) => {
|
|
203
|
-
if (this.systemMessageRouter) this.systemMessageRouter.low(message);
|
|
204
|
-
else this.conversation.addSystemMessage(message);
|
|
205
|
-
},
|
|
206
|
-
applyUsage: (usage) => {
|
|
207
|
-
this.usage.input += usage.inputTokens;
|
|
208
|
-
this.usage.output += usage.outputTokens;
|
|
209
|
-
this.usage.cacheRead += usage.cacheReadTokens ?? 0;
|
|
210
|
-
this.usage.cacheWrite += usage.cacheWriteTokens ?? 0;
|
|
211
|
-
this.lastRequestInputTokens = usage.inputTokens;
|
|
212
|
-
this.lastInputTokens = usage.inputTokens + (usage.cacheReadTokens ?? 0) + (usage.cacheWriteTokens ?? 0);
|
|
213
|
-
},
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
public setCoreServices(services: OrchestratorCoreServices): void {
|
|
218
|
-
this.coreServices = {
|
|
219
|
-
...this.coreServices,
|
|
220
|
-
...services,
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Attach an AcpManager and register the 'delegate' tool into the ToolRegistry.
|
|
226
|
-
* Call this after construction, before the first turn.
|
|
227
|
-
*/
|
|
228
|
-
public registerDelegateTool(manager: AcpManager): void {
|
|
229
|
-
this.acpManager = manager;
|
|
230
|
-
|
|
231
|
-
this.toolRegistry.register({
|
|
232
|
-
definition: {
|
|
233
|
-
name: 'delegate',
|
|
234
|
-
description:
|
|
235
|
-
'Delegate a task to a subagent child process via ACP. ' +
|
|
236
|
-
'The subagent runs autonomously and reports results when complete. ' +
|
|
237
|
-
'Returns the subagent ID immediately; results are delivered via subagent events.',
|
|
238
|
-
parameters: {
|
|
239
|
-
type: 'object',
|
|
240
|
-
required: ['description', 'context', 'tools'],
|
|
241
|
-
properties: {
|
|
242
|
-
description: {
|
|
243
|
-
type: 'string',
|
|
244
|
-
description: 'Clear description of the task for the subagent to complete.',
|
|
245
|
-
},
|
|
246
|
-
context: {
|
|
247
|
-
type: 'string',
|
|
248
|
-
description: 'Additional context, constraints, or background information.',
|
|
249
|
-
},
|
|
250
|
-
tools: {
|
|
251
|
-
type: 'array',
|
|
252
|
-
items: { type: 'string' },
|
|
253
|
-
description: 'Tool names the subagent is allowed to use.',
|
|
254
|
-
},
|
|
255
|
-
model: {
|
|
256
|
-
type: 'string',
|
|
257
|
-
description: 'Optional model override (e.g. "claude-sonnet-4-5").',
|
|
258
|
-
},
|
|
259
|
-
provider: {
|
|
260
|
-
type: 'string',
|
|
261
|
-
description: 'Optional provider override (e.g. "anthropic").',
|
|
262
|
-
},
|
|
263
|
-
},
|
|
264
|
-
},
|
|
265
|
-
},
|
|
266
|
-
execute: async (args): Promise<{ success: boolean; output: string }> => {
|
|
267
|
-
if (!this.acpManager) {
|
|
268
|
-
return { success: false, output: 'ACP manager not initialized' };
|
|
269
|
-
}
|
|
270
|
-
const configManager = requireConfigManager(this.coreServices);
|
|
271
|
-
const workingDirectory = configManager.getWorkingDirectory();
|
|
272
|
-
if (!workingDirectory) {
|
|
273
|
-
return { success: false, output: 'ACP manager requires an explicit working directory.' };
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
const task: SubagentTask = {
|
|
277
|
-
description: String(args.description ?? ''),
|
|
278
|
-
context: String(args.context ?? ''),
|
|
279
|
-
tools: Array.isArray(args.tools) ? args.tools.map(String) : [],
|
|
280
|
-
workingDirectory,
|
|
281
|
-
model: args.model ? String(args.model) : undefined,
|
|
282
|
-
provider: args.provider ? String(args.provider) : undefined,
|
|
283
|
-
};
|
|
284
|
-
|
|
285
|
-
const id = await this.acpManager.spawn(task);
|
|
286
|
-
return {
|
|
287
|
-
success: true,
|
|
288
|
-
output: `Subagent spawned with ID: ${id}. Task: "${task.description}". The subagent is running in the background.`,
|
|
289
|
-
};
|
|
290
|
-
},
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
public getSpinner(): string {
|
|
295
|
-
return THINKING_SPINNER_FRAMES[this.thinkingFrame % THINKING_SPINNER_FRAMES.length];
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
public setSystemMessageRouter(router: Pick<SystemMessageRouter, 'low'> | null): void {
|
|
299
|
-
this.systemMessageRouter = router;
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
public enqueueConversationFollowUp(item: ConversationFollowUpItem): void {
|
|
303
|
-
this.followUpRuntime.enqueue(item);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
/** Abort the current in-flight LLM request, if any. */
|
|
307
|
-
public abort(): void {
|
|
308
|
-
this.abortController?.abort();
|
|
309
|
-
if (this.autoSpawnTimeout !== null) {
|
|
310
|
-
clearTimeout(this.autoSpawnTimeout);
|
|
311
|
-
this.autoSpawnTimeout = null;
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
/**
|
|
316
|
-
* Dispose long-lived runtime attachments owned by this orchestrator.
|
|
317
|
-
*
|
|
318
|
-
* Safe to call multiple times. Intended for process shutdown and tests that
|
|
319
|
-
* construct transient orchestrators against a shared RuntimeEventBus.
|
|
320
|
-
*/
|
|
321
|
-
public dispose(): void {
|
|
322
|
-
this.abort();
|
|
323
|
-
if (this.animInterval) {
|
|
324
|
-
clearInterval(this.animInterval);
|
|
325
|
-
this.animInterval = null;
|
|
326
|
-
}
|
|
327
|
-
this.isThinking = false;
|
|
328
|
-
this.isStreaming = false;
|
|
329
|
-
this.streamingInputTokens = 0;
|
|
330
|
-
this.streamingOutputTokens = 0;
|
|
331
|
-
if (this.detachReplay) {
|
|
332
|
-
this.detachReplay();
|
|
333
|
-
this.detachReplay = null;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
/**
|
|
338
|
-
* handleUserInput - Entry point for a user-submitted message.
|
|
339
|
-
* Queues if already thinking, otherwise kicks off the LLM turn.
|
|
340
|
-
* @param text - Plain text representation (for display and queuing).
|
|
341
|
-
* @param content - Optional ContentPart[] for multimodal messages.
|
|
342
|
-
*/
|
|
343
|
-
public async handleUserInput(text: string, content?: ContentPart[]): Promise<void> {
|
|
344
|
-
if (!text.trim() && !content?.length) return;
|
|
345
|
-
|
|
346
|
-
if (this.isThinking || this.isCompacting) {
|
|
347
|
-
this.messageQueue.push({ text, content });
|
|
348
|
-
this.requestRender();
|
|
349
|
-
return;
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// Set the original task on the first user message (idempotent — subsequent calls are no-ops)
|
|
353
|
-
getSessionLineageTracker(this.coreServices, this.ownedSessionLineageTracker).setOriginalTask(text.slice(0, 200));
|
|
354
|
-
|
|
355
|
-
await this.runTurn(text, content);
|
|
356
|
-
|
|
357
|
-
// Process any messages queued while the LLM was thinking (iterative, not recursive)
|
|
358
|
-
while (this.messageQueue.length > 0) {
|
|
359
|
-
const next = this.messageQueue.shift()!;
|
|
360
|
-
await this.runTurn(next.text, next.content);
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
this.followUpRuntime.scheduleFlush();
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
private startThinking(estimatedInputTokens?: number): void {
|
|
367
|
-
this.isThinking = true;
|
|
368
|
-
this.thinkingFrame = 0; // Reset each turn so gradient starts clean and frame never grows unbounded
|
|
369
|
-
this.streamingInputTokens = estimatedInputTokens ?? this.lastRequestInputTokens;
|
|
370
|
-
this.streamingOutputTokens = 0;
|
|
371
|
-
this.abortController = new AbortController();
|
|
372
|
-
if (this.animInterval) clearInterval(this.animInterval);
|
|
373
|
-
this.animInterval = setInterval(() => {
|
|
374
|
-
this.thinkingFrame++;
|
|
375
|
-
this.requestRender();
|
|
376
|
-
}, 80);
|
|
377
|
-
this.requestRender();
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
private stopThinking(): void {
|
|
381
|
-
if (this.animInterval) clearInterval(this.animInterval);
|
|
382
|
-
this.animInterval = null;
|
|
383
|
-
this.abortController = null;
|
|
384
|
-
this.isThinking = false;
|
|
385
|
-
this.streamingInputTokens = 0;
|
|
386
|
-
this.streamingOutputTokens = 0;
|
|
387
|
-
this.scrollToEnd(this.getViewportHeight());
|
|
388
|
-
this.requestRender();
|
|
389
|
-
}
|
|
390
|
-
|
|
391
|
-
private async runTurn(text: string, content?: ContentPart[]): Promise<void> {
|
|
392
|
-
const turnStartTime = Date.now();
|
|
393
|
-
const configManager = requireConfigManager(this.coreServices);
|
|
394
|
-
const providerRegistry = requireProviderRegistry(this.coreServices);
|
|
395
|
-
|
|
396
|
-
// --- Submission key — per-turn idempotency fence ---
|
|
397
|
-
// Generates a stable, deterministic key for this turn using a SHA-256 hash
|
|
398
|
-
// of the message content (first 512 chars) + conversation length as context.
|
|
399
|
-
// If the same physical turn is replayed (reconnect/restart) before the
|
|
400
|
-
// prior execution completes, the second attempt hits 'in-flight' and is
|
|
401
|
-
// silently dropped. After completion the key expires via TTL.
|
|
402
|
-
// Note: turnId is deliberately pre-hashed here (SHA-256, sliced to 16 chars) so
|
|
403
|
-
// that long message text does not bloat the intermediate string passed to
|
|
404
|
-
// generateKey — which applies its own SHA-256 internally. The double-hash is
|
|
405
|
-
// intentional and harmless: the outer hash provides key isolation and the
|
|
406
|
-
// inner hash ensures the final store key is a uniform 64-char hex digest.
|
|
407
|
-
const turnId = createHash('sha256')
|
|
408
|
-
.update(`${this.sessionId}:${this.conversation.getMessageCount()}:${text.slice(0, 512)}`)
|
|
409
|
-
.digest('hex')
|
|
410
|
-
.slice(0, 16); // 16-char prefix is sufficient for in-process dedup
|
|
411
|
-
const idempotencyStore = getIdempotencyStore(this.coreServices, this.ownedIdempotencyStore);
|
|
412
|
-
const submissionKey = idempotencyStore.generateKey({
|
|
413
|
-
sessionId: this.sessionId,
|
|
414
|
-
turnId,
|
|
415
|
-
callId: text.slice(0, 64), // use prompt prefix for human-readable correlation
|
|
416
|
-
});
|
|
417
|
-
const submissionCheck = idempotencyStore.checkAndRecord(submissionKey);
|
|
418
|
-
this.currentSubmissionKey = submissionKey;
|
|
419
|
-
|
|
420
|
-
if (submissionCheck.status === 'in-flight') {
|
|
421
|
-
logger.warn('Orchestrator: duplicate turn submission detected (in-flight) — dropping', {
|
|
422
|
-
sessionId: this.sessionId,
|
|
423
|
-
submissionKey,
|
|
424
|
-
});
|
|
425
|
-
this.currentSubmissionKey = null;
|
|
426
|
-
return;
|
|
427
|
-
}
|
|
428
|
-
// 'duplicate' (completed/failed) — allow re-run (user sent same text intentionally).
|
|
429
|
-
// We just let it proceed; the prior record will be overwritten.
|
|
430
|
-
|
|
431
|
-
if (this.runtimeBus) {
|
|
432
|
-
emitTurnSubmitted(this.runtimeBus, createEmitterContext(this.sessionId, turnId), { turnId, prompt: text });
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
// Adaptive Execution Planner.
|
|
436
|
-
// If the feature flag is enabled, score and select the execution strategy
|
|
437
|
-
// before the turn proceeds. The selected strategy and reason code are
|
|
438
|
-
// emitted for the Ops panel and logged for observability.
|
|
439
|
-
maybeEmitAdaptivePlannerDecision(
|
|
440
|
-
text,
|
|
441
|
-
this.flagManager?.isEnabled('adaptive-execution-planner') ?? false,
|
|
442
|
-
this.coreServices.adaptivePlanner ?? null,
|
|
443
|
-
this.runtimeBus,
|
|
444
|
-
(id) => createEmitterContext(this.sessionId, id),
|
|
445
|
-
turnId,
|
|
446
|
-
);
|
|
447
|
-
// ────────────────────────────────────────────────────────────────────────
|
|
448
|
-
|
|
449
|
-
// Pre-turn plan injection: if an active plan exists, inject its current state into
|
|
450
|
-
// the conversation so the LLM can refer to it and update item statuses.
|
|
451
|
-
const preTurnPlan = prepareConversationForTurn(
|
|
452
|
-
this.conversation,
|
|
453
|
-
providerRegistry,
|
|
454
|
-
text,
|
|
455
|
-
content,
|
|
456
|
-
this.sessionId,
|
|
457
|
-
this.coreServices.planManager ?? null,
|
|
458
|
-
);
|
|
459
|
-
|
|
460
|
-
this.turnStartMessageCount = this.conversation.getMessageCount();
|
|
461
|
-
this.scrollToEnd(this.getViewportHeight());
|
|
462
|
-
|
|
463
|
-
const initialEstimatedTokens = estimateConversationTokens(this.conversation.getMessagesForLLM());
|
|
464
|
-
this.startThinking(estimateFreshTurnInputTokens(this.lastInputTokens, initialEstimatedTokens, text, content));
|
|
465
|
-
|
|
466
|
-
try {
|
|
467
|
-
await executeOrchestratorTurnLoop({
|
|
468
|
-
conversation: this.conversation,
|
|
469
|
-
toolRegistry: this.toolRegistry,
|
|
470
|
-
getSystemPrompt: this.getSystemPrompt,
|
|
471
|
-
getAbortSignal: () => this.abortController?.signal,
|
|
472
|
-
hookDispatcher: this.hookDispatcher,
|
|
473
|
-
requestRender: this.requestRender,
|
|
474
|
-
runtimeBus: this.runtimeBus,
|
|
475
|
-
agentManager: this.agentManager,
|
|
476
|
-
configManager,
|
|
477
|
-
providerRegistry,
|
|
478
|
-
favoritesStore: this.coreServices.favoritesStore,
|
|
479
|
-
cacheHitTracker: getCacheHitTracker(this.coreServices, this.ownedCacheHitTracker),
|
|
480
|
-
helperModel: new HelperModel({ configManager, providerRegistry }),
|
|
481
|
-
sessionId: this.sessionId,
|
|
482
|
-
preTurnPlan,
|
|
483
|
-
planManager: this.coreServices.planManager ?? null,
|
|
484
|
-
text,
|
|
485
|
-
content,
|
|
486
|
-
turnId,
|
|
487
|
-
emitterContext: (id) => createEmitterContext(this.sessionId, id),
|
|
488
|
-
executeToolCalls: (id, calls) => this.executeToolCalls(id, calls),
|
|
489
|
-
checkContextWindowPreflight: (id, model) => this.checkContextWindowPreflight(id, model),
|
|
490
|
-
normalizeUsage,
|
|
491
|
-
estimateFreshTurnInputTokens: (currentEstimatedTokens, nextText, nextContent) =>
|
|
492
|
-
estimateFreshTurnInputTokens(this.lastInputTokens, currentEstimatedTokens, nextText, nextContent),
|
|
493
|
-
getMessageQueueLength: () => this.messageQueue.length,
|
|
494
|
-
isReconciliationEnabled: () => this.isReconciliationEnabled(),
|
|
495
|
-
setPendingToolCalls: (calls) => { this._pendingToolCalls = calls; },
|
|
496
|
-
setAutoSpawnTimeout: (timeout) => { this.autoSpawnTimeout = timeout; },
|
|
497
|
-
setStreamingActive: (value) => { this.isStreaming = value; },
|
|
498
|
-
setStreamingInputTokens: (value) => { this.streamingInputTokens = value; },
|
|
499
|
-
addStreamingOutputTokens: (value) => { this.streamingOutputTokens += value; },
|
|
500
|
-
setLastRequestInputTokens: (value) => { this.lastRequestInputTokens = value; },
|
|
501
|
-
setLastInputTokens: (value) => { this.lastInputTokens = value; },
|
|
502
|
-
markTurnFailed: () => { this._turnFailed = true; },
|
|
503
|
-
usage: this.usage,
|
|
504
|
-
});
|
|
505
|
-
|
|
506
|
-
await handlePostTurnContextMaintenance({
|
|
507
|
-
conversation: this.conversation,
|
|
508
|
-
agentManager: this.agentManager,
|
|
509
|
-
wrfcController: this.wrfcController,
|
|
510
|
-
planManager: this.coreServices.planManager ?? null,
|
|
511
|
-
sessionMemoryStore: this.coreServices.sessionMemoryStore ?? null,
|
|
512
|
-
configManager,
|
|
513
|
-
providerRegistry,
|
|
514
|
-
sessionLineageTracker: getSessionLineageTracker(this.coreServices, this.ownedSessionLineageTracker),
|
|
515
|
-
runtimeBus: this.runtimeBus,
|
|
516
|
-
emitterContext: (id) => createEmitterContext(this.sessionId, id),
|
|
517
|
-
hookDispatcher: this.hookDispatcher,
|
|
518
|
-
sessionId: this.sessionId,
|
|
519
|
-
requestRender: this.requestRender,
|
|
520
|
-
isCompacting: this.isCompacting,
|
|
521
|
-
setIsCompacting: (value) => { this.isCompacting = value; },
|
|
522
|
-
lastWarningBracket: this.lastWarningBracket,
|
|
523
|
-
setLastWarningBracket: (value) => { this.lastWarningBracket = value; },
|
|
524
|
-
}, turnId, this.lastInputTokens);
|
|
525
|
-
} catch (err: unknown) {
|
|
526
|
-
if (this.abortController?.signal.aborted) {
|
|
527
|
-
// Clean up streaming block if one was active when aborted
|
|
528
|
-
if (this.isStreaming) {
|
|
529
|
-
this.isStreaming = false;
|
|
530
|
-
this.conversation.finalizeStreamingBlock();
|
|
531
|
-
if (this.runtimeBus) {
|
|
532
|
-
emitStreamEnd(this.runtimeBus, createEmitterContext(this.sessionId, turnId), { turnId });
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
// Remove any partial LLM response, keep user message but mark it cancelled
|
|
536
|
-
this.conversation.removeMessagesAfter(this.turnStartMessageCount);
|
|
537
|
-
this.conversation.markLastUserMessageCancelled();
|
|
538
|
-
this.conversation.addSystemMessage('[Response cancelled]');
|
|
539
|
-
if (this.runtimeBus) {
|
|
540
|
-
emitTurnCancel(this.runtimeBus, createEmitterContext(this.sessionId, turnId), {
|
|
541
|
-
turnId,
|
|
542
|
-
reason: 'cancelled',
|
|
543
|
-
stopReason: 'cancelled',
|
|
544
|
-
});
|
|
545
|
-
}
|
|
546
|
-
return;
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
const error = err instanceof Error ? err : new Error(summarizeError(err));
|
|
550
|
-
const msg = formatError(error, {
|
|
551
|
-
...(error instanceof ProviderError
|
|
552
|
-
? { provider: providerRegistry.getCurrentModel().provider, source: 'provider' as const }
|
|
553
|
-
: {}),
|
|
554
|
-
});
|
|
555
|
-
this.conversation.addSystemMessage(msg);
|
|
556
|
-
this.requestRender();
|
|
557
|
-
// Graceful degradation — suggest alternative when provider fails non-transiently
|
|
558
|
-
const autoSwitch = configManager.get('behavior.suggestAlternativeOnProviderFail') as boolean;
|
|
559
|
-
if (autoSwitch && isNonTransientProviderFailure(err)) {
|
|
560
|
-
const currentModel = providerRegistry.getCurrentModel();
|
|
561
|
-
const alt = currentModel ? providerRegistry.findAlternativeModel(currentModel.id) : null;
|
|
562
|
-
if (alt) {
|
|
563
|
-
this.conversation.addSystemMessage(`[Provider] ${currentModel?.provider ?? 'Unknown'} failed. Alternative available: ${alt.displayName} (${alt.provider}). Use /model to switch.`);
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
this._turnFailed = true;
|
|
567
|
-
if (this.runtimeBus) {
|
|
568
|
-
emitTurnError(this.runtimeBus, createEmitterContext(this.sessionId, turnId), {
|
|
569
|
-
turnId,
|
|
570
|
-
error: summarizeError(error),
|
|
571
|
-
stopReason: err instanceof ProviderError ? 'provider_error' : 'unexpected_error',
|
|
572
|
-
});
|
|
573
|
-
}
|
|
574
|
-
} finally {
|
|
575
|
-
// ── GC-ORCH-015: Terminal-state tool-call reconciliation ───────────────────
|
|
576
|
-
// If the turn threw an exception between addAssistantMessage (which sets
|
|
577
|
-
// _pendingToolCalls) and addToolResults (which clears it), there are
|
|
578
|
-
// unresolved tool-call blocks in the conversation. Reconcile them now
|
|
579
|
-
// so the conversation is always in a valid state on turn exit.
|
|
580
|
-
if (this._pendingToolCalls.length > 0) {
|
|
581
|
-
this.reconcileUnresolvedToolCalls([], 'exception-before-results');
|
|
582
|
-
}
|
|
583
|
-
|
|
584
|
-
// --- Submission key: mark turn complete or failed ---
|
|
585
|
-
// Success: markComplete caches the result for duplicate callers.
|
|
586
|
-
// Failure: markFailed allows retry on the next submission.
|
|
587
|
-
if (this.currentSubmissionKey) {
|
|
588
|
-
if (this._turnFailed) {
|
|
589
|
-
getIdempotencyStore(this.coreServices, this.ownedIdempotencyStore).markFailed(this.currentSubmissionKey);
|
|
590
|
-
} else {
|
|
591
|
-
getIdempotencyStore(this.coreServices, this.ownedIdempotencyStore).markComplete(this.currentSubmissionKey);
|
|
592
|
-
}
|
|
593
|
-
this.currentSubmissionKey = null;
|
|
594
|
-
this._turnFailed = false;
|
|
595
|
-
}
|
|
596
|
-
this.stopThinking();
|
|
597
|
-
const durationMs = Date.now() - turnStartTime;
|
|
598
|
-
const notifyEnabled = configManager.get('behavior.notifyOnComplete') as boolean | undefined;
|
|
599
|
-
if (notifyEnabled !== false) {
|
|
600
|
-
notifyCompletion('GoodVibes', `Response complete (${Math.round(durationMs / 1000)}s)`, durationMs);
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
// ── Event replay queue ────────────────────────────────────────────────
|
|
604
|
-
// Signal turn completion; if any tracked events went unacknowledged,
|
|
605
|
-
// inject them as system messages so the model sees them next turn.
|
|
606
|
-
const eventsToReplay = this.replayQueue.onTurnComplete();
|
|
607
|
-
if (eventsToReplay.length > 0) {
|
|
608
|
-
const messages = this.replayQueue.formatReplays(eventsToReplay);
|
|
609
|
-
for (const msg of messages) {
|
|
610
|
-
if (this.systemMessageRouter) {
|
|
611
|
-
this.systemMessageRouter.low(msg);
|
|
612
|
-
} else {
|
|
613
|
-
this.conversation.addSystemMessage(msg);
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
this.requestRender();
|
|
617
|
-
}
|
|
618
|
-
this.followUpRuntime.scheduleFlush();
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
/**
|
|
623
|
-
* Pre-flight context window check.
|
|
624
|
-
*
|
|
625
|
-
* Estimates the token count of the pending request and compares it against
|
|
626
|
-
* the model's context window from the catalog. If the request exceeds the
|
|
627
|
-
* context window:
|
|
628
|
-
* 1. If auto-compact is enabled (threshold configured), compact first.
|
|
629
|
-
* 2. If still exceeds after compact, emit a clear error message with
|
|
630
|
-
* specific token counts and suggest alternatives.
|
|
631
|
-
*
|
|
632
|
-
* @returns 'ok' (within context), 'compacted' (compacted and now OK), or
|
|
633
|
-
* 'error' (still exceeds even after compact, or compact disabled).
|
|
634
|
-
*/
|
|
635
|
-
private async checkContextWindowPreflight(
|
|
636
|
-
turnId: string,
|
|
637
|
-
model: ModelDefinition,
|
|
638
|
-
): Promise<'ok' | 'compacted' | 'error'> {
|
|
639
|
-
const configManager = requireConfigManager(this.coreServices);
|
|
640
|
-
const providerRegistry = requireProviderRegistry(this.coreServices);
|
|
641
|
-
return checkContextWindowPreflight({
|
|
642
|
-
conversation: this.conversation,
|
|
643
|
-
requestRender: this.requestRender,
|
|
644
|
-
hookDispatcher: this.hookDispatcher,
|
|
645
|
-
configManager,
|
|
646
|
-
providerRegistry,
|
|
647
|
-
sessionId: this.sessionId,
|
|
648
|
-
agentManager: this.agentManager,
|
|
649
|
-
wrfcController: this.wrfcController,
|
|
650
|
-
planManager: this.coreServices.planManager ?? null,
|
|
651
|
-
sessionMemoryStore: this.coreServices.sessionMemoryStore ?? null,
|
|
652
|
-
sessionLineageTracker: getSessionLineageTracker(this.coreServices, this.ownedSessionLineageTracker),
|
|
653
|
-
runtimeBus: this.runtimeBus,
|
|
654
|
-
emitterContext: (id) => createEmitterContext(this.sessionId, id),
|
|
655
|
-
isCompacting: this.isCompacting,
|
|
656
|
-
setIsCompacting: (value) => { this.isCompacting = value; },
|
|
657
|
-
}, turnId, model);
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
/**
|
|
661
|
-
* Auto-spawn agents for a list of ready plan items under bounded orchestration policy.
|
|
662
|
-
*/
|
|
663
|
-
private autoSpawnPendingItems(
|
|
664
|
-
turnId: string,
|
|
665
|
-
plan: ExecutionPlan,
|
|
666
|
-
items: PlanItem[],
|
|
667
|
-
): string[] {
|
|
668
|
-
const configManager = requireConfigManager(this.coreServices);
|
|
669
|
-
const providerRegistry = requireProviderRegistry(this.coreServices);
|
|
670
|
-
return autoSpawnPendingItems(
|
|
671
|
-
this.conversation,
|
|
672
|
-
plan,
|
|
673
|
-
items,
|
|
674
|
-
this.agentManager,
|
|
675
|
-
configManager,
|
|
676
|
-
providerRegistry,
|
|
677
|
-
this.runtimeBus,
|
|
678
|
-
createEmitterContext(this.sessionId, turnId),
|
|
679
|
-
this.coreServices.planManager ?? null,
|
|
680
|
-
);
|
|
681
|
-
}
|
|
682
|
-
|
|
683
|
-
/**
|
|
684
|
-
* Returns `true` when the GC-ORCH-015 reconciliation feature is active.
|
|
685
|
-
*
|
|
686
|
-
* Defaults to `true` (flag `defaultState: 'enabled'`) when no flag manager
|
|
687
|
-
* has been wired in — safe for tests that omit the optional constructor arg.
|
|
688
|
-
*/
|
|
689
|
-
private isReconciliationEnabled(): boolean {
|
|
690
|
-
if (this.flagManager === null) return true;
|
|
691
|
-
return this.flagManager.isEnabled('tool-result-reconciliation');
|
|
692
|
-
}
|
|
693
|
-
|
|
694
|
-
/**
|
|
695
|
-
* Reconcile unresolved tool calls at turn end.
|
|
696
|
-
*
|
|
697
|
-
* Called when the turn loop exits while `_pendingToolCalls` is non-empty,
|
|
698
|
-
* or when a malformed provider response is detected. Injects synthetic error
|
|
699
|
-
* results for every unresolved call, adds a system message, and emits a
|
|
700
|
-
* typed `TOOL_RECONCILED` runtime event.
|
|
701
|
-
*
|
|
702
|
-
* When the feature flag is disabled this method logs a warning and returns
|
|
703
|
-
* without taking action.
|
|
704
|
-
*
|
|
705
|
-
* @param resolvedResults - Tool results already collected this iteration.
|
|
706
|
-
* @param reason - Why reconciliation was triggered.
|
|
707
|
-
*/
|
|
708
|
-
private reconcileUnresolvedToolCalls(
|
|
709
|
-
resolvedResults: ToolResult[],
|
|
710
|
-
reason: ReconciliationReason,
|
|
711
|
-
): void {
|
|
712
|
-
reconcileUnresolvedToolCalls({
|
|
713
|
-
conversation: this.conversation,
|
|
714
|
-
runtimeBus: this.runtimeBus,
|
|
715
|
-
emitterContext: (id) => createEmitterContext(this.sessionId, id),
|
|
716
|
-
isReconciliationEnabled: () => this.isReconciliationEnabled(),
|
|
717
|
-
currentSubmissionKey: this.currentSubmissionKey,
|
|
718
|
-
pendingToolCalls: this._pendingToolCalls,
|
|
719
|
-
setPendingToolCalls: (calls) => { this._pendingToolCalls = calls; },
|
|
720
|
-
}, resolvedResults, reason);
|
|
721
|
-
}
|
|
722
|
-
|
|
723
|
-
private async executeToolCalls(turnId: string, calls: ToolCall[]): Promise<ToolResult[]> {
|
|
724
|
-
return executeToolCalls({
|
|
725
|
-
toolRegistry: this.toolRegistry,
|
|
726
|
-
permissionManager: this.permissionManager,
|
|
727
|
-
hookDispatcher: this.hookDispatcher,
|
|
728
|
-
runtimeBus: this.runtimeBus,
|
|
729
|
-
sessionId: this.sessionId,
|
|
730
|
-
emitterContext: (id) => createEmitterContext(this.sessionId, id),
|
|
731
|
-
}, turnId, calls);
|
|
732
|
-
}
|
|
733
|
-
}
|
|
1
|
+
// Thin TUI wrapper — re-exports the SDK Orchestrator unchanged.
|
|
2
|
+
// The SDK class already contains all behaviour including getSpinner().
|
|
3
|
+
export { Orchestrator } from '@pellux/goodvibes-sdk/platform/core/orchestrator';
|