@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,542 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* context-compaction.ts
|
|
3
|
-
*
|
|
4
|
-
* Context compaction engine for goodvibes-tui.
|
|
5
|
-
*
|
|
6
|
-
* Architecture:
|
|
7
|
-
* - Deterministic structure: fixed sections assembled in order
|
|
8
|
-
* - Targeted LLM calls for: substance filter, tool relevance, resolved problems,
|
|
9
|
-
* older agent summary
|
|
10
|
-
* - Rule-based sections: handoff, memories, current task, running agents,
|
|
11
|
-
* agent activity table, plan progress, session lineage
|
|
12
|
-
* - Post-compaction validation: sanity-checks required sections
|
|
13
|
-
* - Context-window-aware thresholds
|
|
14
|
-
*
|
|
15
|
-
* Public API:
|
|
16
|
-
* estimateConversationTokens(messages) — rough token count for a message array
|
|
17
|
-
* estimateTokens(text) — rough token count for a string
|
|
18
|
-
* shouldAutoCompact(opts) — check if 15k token buffer threshold is exceeded
|
|
19
|
-
* compactSmallWindow(messages, keepRecent) — simplified compaction for small context windows
|
|
20
|
-
* compactMessages(ctx, registry) — structured compaction entry point
|
|
21
|
-
* checkAndCompact(autoOpts, ctx) — check and compact if threshold exceeded
|
|
22
|
-
* getCompactionEvents() — return compaction event log
|
|
23
|
-
* getLastCompactionEvent() — return most recent compaction event
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
import type { ProviderMessage, ContentPart, LLMProvider } from '@pellux/goodvibes-sdk/platform/providers/interface';
|
|
27
|
-
import type { ProviderRegistry } from '@pellux/goodvibes-sdk/platform/providers/registry';
|
|
28
|
-
import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
|
|
29
|
-
import type {
|
|
30
|
-
CompactionSection,
|
|
31
|
-
CompactionContext,
|
|
32
|
-
CompactionResult,
|
|
33
|
-
CompactionEvent,
|
|
34
|
-
CompactionConfig,
|
|
35
|
-
} from '@pellux/goodvibes-sdk/platform/core/compaction-types';
|
|
36
|
-
import { DEFAULT_COMPACTION_CONFIG, estimateTokens } from '@pellux/goodvibes-sdk/platform/core/compaction-types';
|
|
37
|
-
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
38
|
-
import {
|
|
39
|
-
buildHandoffHeader,
|
|
40
|
-
buildSessionMemories,
|
|
41
|
-
buildCurrentTask,
|
|
42
|
-
buildRunningAgents,
|
|
43
|
-
gatherRecentConversation,
|
|
44
|
-
buildConversationFilterPrompt,
|
|
45
|
-
buildToolResultsPrompt,
|
|
46
|
-
buildAgentActivityTable,
|
|
47
|
-
buildOlderAgentSummaryPrompt,
|
|
48
|
-
buildResolvedProblemsPrompt,
|
|
49
|
-
buildPlanProgress,
|
|
50
|
-
buildSessionLineage,
|
|
51
|
-
} from '@pellux/goodvibes-sdk/platform/core/compaction-sections';
|
|
52
|
-
|
|
53
|
-
export type { CompactionEvent, CompactionResult, CompactionContext } from '@pellux/goodvibes-sdk/platform/core/compaction-types';
|
|
54
|
-
|
|
55
|
-
export interface AutoCompactOptions {
|
|
56
|
-
/** Current input token count from last LLM response. */
|
|
57
|
-
currentTokens: number;
|
|
58
|
-
/** Maximum context window for the current model. */
|
|
59
|
-
contextWindow: number;
|
|
60
|
-
/** Whether auto-compact is already in progress (prevent re-entry). */
|
|
61
|
-
isCompacting: boolean;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// ---------------------------------------------------------------------------
|
|
65
|
-
// Compaction trigger constants
|
|
66
|
-
// ---------------------------------------------------------------------------
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Tokens remaining in the context window at which auto-compaction triggers.
|
|
70
|
-
* Compact when contextWindow - currentTokens <= COMPACTION_BUFFER_TOKENS.
|
|
71
|
-
* 15k gives room for the ~6.5k compaction output + LLM extraction calls.
|
|
72
|
-
*/
|
|
73
|
-
export const COMPACTION_BUFFER_TOKENS = 15_000;
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Context windows smaller than this use simplified compaction (summarize last N messages)
|
|
77
|
-
* instead of the full structured output, since there isn't enough room for extraction calls.
|
|
78
|
-
*/
|
|
79
|
-
export const SMALL_WINDOW_THRESHOLD = 12_000;
|
|
80
|
-
|
|
81
|
-
// ---------------------------------------------------------------------------
|
|
82
|
-
// Compaction event log (in-memory, session-scoped)
|
|
83
|
-
// ---------------------------------------------------------------------------
|
|
84
|
-
|
|
85
|
-
const compactionEvents: CompactionEvent[] = [];
|
|
86
|
-
|
|
87
|
-
export function getCompactionEvents(): readonly CompactionEvent[] {
|
|
88
|
-
return compactionEvents;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
export function getLastCompactionEvent(): CompactionEvent | null {
|
|
92
|
-
return compactionEvents.length > 0
|
|
93
|
-
? compactionEvents[compactionEvents.length - 1]
|
|
94
|
-
: null;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
// ---------------------------------------------------------------------------
|
|
98
|
-
// Token estimation
|
|
99
|
-
// ---------------------------------------------------------------------------
|
|
100
|
-
|
|
101
|
-
/** Rough token estimate: 4 chars ≈ 1 token. Used for threshold checks. */
|
|
102
|
-
export function estimateConversationTokens(messages: ProviderMessage[]): number {
|
|
103
|
-
let total = 0;
|
|
104
|
-
for (const msg of messages) {
|
|
105
|
-
if (typeof msg.content === 'string') {
|
|
106
|
-
total += estimateTokens(msg.content);
|
|
107
|
-
} else if (Array.isArray(msg.content)) {
|
|
108
|
-
for (const part of msg.content as ContentPart[]) {
|
|
109
|
-
if (part.type === 'text') {
|
|
110
|
-
total += estimateTokens(part.text);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return total;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
export { estimateTokens } from '@pellux/goodvibes-sdk/platform/core/compaction-types';
|
|
119
|
-
|
|
120
|
-
// ---------------------------------------------------------------------------
|
|
121
|
-
// Should compact?
|
|
122
|
-
// ---------------------------------------------------------------------------
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* Returns true if the remaining context window is within COMPACTION_BUFFER_TOKENS
|
|
126
|
-
* and compaction has not already been triggered.
|
|
127
|
-
*
|
|
128
|
-
* Triggers when: contextWindow - currentTokens <= 15000
|
|
129
|
-
* The 15k buffer gives room for the ~6.5k compaction output + LLM extraction calls
|
|
130
|
-
* + post-compaction work before the window is exhausted.
|
|
131
|
-
*/
|
|
132
|
-
export function shouldAutoCompact(opts: AutoCompactOptions): boolean {
|
|
133
|
-
const { currentTokens, contextWindow, isCompacting } = opts;
|
|
134
|
-
if (isCompacting || contextWindow <= 0) return false;
|
|
135
|
-
return (contextWindow - currentTokens) <= COMPACTION_BUFFER_TOKENS;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
// ---------------------------------------------------------------------------
|
|
139
|
-
// Small-window simplified compaction
|
|
140
|
-
// ---------------------------------------------------------------------------
|
|
141
|
-
|
|
142
|
-
/**
|
|
143
|
-
* Simplified compaction for context windows smaller than SMALL_WINDOW_THRESHOLD (12k).
|
|
144
|
-
* There isn't enough room for LLM extraction calls, so we just keep the last
|
|
145
|
-
* `keepRecent` messages and add a brief summary note.
|
|
146
|
-
*
|
|
147
|
-
* @param messages - Full conversation message array
|
|
148
|
-
* @param keepRecent - Number of recent messages to keep verbatim (default: 10)
|
|
149
|
-
* @returns Truncated message array with a summary pair prepended
|
|
150
|
-
*/
|
|
151
|
-
export function compactSmallWindow(
|
|
152
|
-
messages: ProviderMessage[],
|
|
153
|
-
keepRecent = 10,
|
|
154
|
-
): ProviderMessage[] {
|
|
155
|
-
if (messages.length <= keepRecent) return messages;
|
|
156
|
-
const recentMessages = messages.slice(-keepRecent);
|
|
157
|
-
const omittedCount = messages.length - keepRecent;
|
|
158
|
-
const summaryMsg: ProviderMessage = {
|
|
159
|
-
role: 'user' as const,
|
|
160
|
-
content: `[Context compacted — small window mode, ${omittedCount} messages summarized]`,
|
|
161
|
-
};
|
|
162
|
-
const summaryReply: ProviderMessage = {
|
|
163
|
-
role: 'assistant' as const,
|
|
164
|
-
content: `[${omittedCount} earlier messages omitted to fit context window. Continuing from recent conversation.]`,
|
|
165
|
-
};
|
|
166
|
-
return [summaryMsg, summaryReply, ...recentMessages];
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
// ---------------------------------------------------------------------------
|
|
170
|
-
// LLM extraction helper
|
|
171
|
-
// ---------------------------------------------------------------------------
|
|
172
|
-
|
|
173
|
-
/**
|
|
174
|
-
* Call the LLM with a prompt and return the trimmed response text.
|
|
175
|
-
* Returns null on any failure (compaction should degrade gracefully).
|
|
176
|
-
*/
|
|
177
|
-
async function llmExtract(
|
|
178
|
-
registry: ProviderRegistry,
|
|
179
|
-
modelId: string,
|
|
180
|
-
providerName: string | undefined,
|
|
181
|
-
prompt: string,
|
|
182
|
-
label: string,
|
|
183
|
-
): Promise<string | null> {
|
|
184
|
-
if (!prompt.trim()) return null;
|
|
185
|
-
|
|
186
|
-
let provider: LLMProvider;
|
|
187
|
-
try {
|
|
188
|
-
provider = registry.getForModel(modelId, providerName);
|
|
189
|
-
} catch (err) {
|
|
190
|
-
logger.warn(`Compaction: failed to get provider for ${label}`, {
|
|
191
|
-
modelId,
|
|
192
|
-
err: summarizeError(err),
|
|
193
|
-
});
|
|
194
|
-
return null;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
try {
|
|
198
|
-
const response = await provider.chat({
|
|
199
|
-
messages: [{ role: 'user', content: prompt }],
|
|
200
|
-
model: modelId,
|
|
201
|
-
});
|
|
202
|
-
const text = response.content?.trim() ?? '';
|
|
203
|
-
if (!text) {
|
|
204
|
-
logger.warn(`Compaction: LLM returned empty response for ${label}`);
|
|
205
|
-
return null;
|
|
206
|
-
}
|
|
207
|
-
return text;
|
|
208
|
-
} catch (err) {
|
|
209
|
-
logger.warn(`Compaction: LLM extraction failed for ${label}`, {
|
|
210
|
-
err: summarizeError(err),
|
|
211
|
-
});
|
|
212
|
-
return null;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// ---------------------------------------------------------------------------
|
|
217
|
-
// Post-compaction validation
|
|
218
|
-
// ---------------------------------------------------------------------------
|
|
219
|
-
|
|
220
|
-
function validateCompaction(
|
|
221
|
-
sections: CompactionSection[],
|
|
222
|
-
ctx: CompactionContext,
|
|
223
|
-
totalTokens: number,
|
|
224
|
-
config: CompactionConfig,
|
|
225
|
-
): string[] {
|
|
226
|
-
const warnings: string[] = [];
|
|
227
|
-
const sectionIds = new Set(sections.map((s) => s.id));
|
|
228
|
-
|
|
229
|
-
if (!sectionIds.has('handoff-header')) {
|
|
230
|
-
warnings.push('CRITICAL: handoff-header section is missing');
|
|
231
|
-
}
|
|
232
|
-
if (!sectionIds.has('current-task')) {
|
|
233
|
-
warnings.push('WARNING: current-task section is missing');
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
const hasRunningAgents = ctx.agents.some(
|
|
237
|
-
(a) => a.status === 'running' || a.status === 'pending',
|
|
238
|
-
);
|
|
239
|
-
if (hasRunningAgents && !sectionIds.has('running-agents')) {
|
|
240
|
-
warnings.push('WARNING: running agents exist but running-agents section is missing');
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
if (ctx.sessionMemories.length > 0 && !sectionIds.has('session-memories')) {
|
|
244
|
-
warnings.push('WARNING: session memories exist but session-memories section is missing');
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
if (totalTokens > config.totalCeiling) {
|
|
248
|
-
warnings.push(
|
|
249
|
-
`WARNING: total tokens (${totalTokens}) exceeds ceiling (${config.totalCeiling})`,
|
|
250
|
-
);
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return warnings;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// ---------------------------------------------------------------------------
|
|
257
|
-
// Assemble compacted output
|
|
258
|
-
// ---------------------------------------------------------------------------
|
|
259
|
-
|
|
260
|
-
function assembleSections(sections: CompactionSection[]): string {
|
|
261
|
-
const parts: string[] = [];
|
|
262
|
-
for (const section of sections) {
|
|
263
|
-
if (section.header) {
|
|
264
|
-
parts.push(section.header);
|
|
265
|
-
}
|
|
266
|
-
parts.push(section.content);
|
|
267
|
-
parts.push(''); // blank line between sections
|
|
268
|
-
}
|
|
269
|
-
return parts.join('\n').trimEnd();
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
// ---------------------------------------------------------------------------
|
|
273
|
-
// Core compaction logic
|
|
274
|
-
// ---------------------------------------------------------------------------
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* compactMessages — structured compaction entry point.
|
|
278
|
-
*/
|
|
279
|
-
export async function compactMessages(
|
|
280
|
-
ctx: CompactionContext,
|
|
281
|
-
registry: ProviderRegistry,
|
|
282
|
-
): Promise<CompactionResult> {
|
|
283
|
-
return runCompaction(ctx, registry);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
/**
|
|
287
|
-
* runCompaction — internal implementation for structured compaction.
|
|
288
|
-
*
|
|
289
|
-
* Accepts a CompactionContext containing all data sources. Makes targeted LLM
|
|
290
|
-
* calls for substance filtering and extraction (parallelized), assembles a
|
|
291
|
-
* structured handoff context, validates it, and returns a CompactionResult.
|
|
292
|
-
*/
|
|
293
|
-
async function runCompaction(
|
|
294
|
-
ctx: CompactionContext,
|
|
295
|
-
registry: ProviderRegistry,
|
|
296
|
-
): Promise<CompactionResult> {
|
|
297
|
-
const config = DEFAULT_COMPACTION_CONFIG;
|
|
298
|
-
const tokensBeforeEstimate = estimateConversationTokens(ctx.messages);
|
|
299
|
-
|
|
300
|
-
logger.info('Context compaction: starting', {
|
|
301
|
-
trigger: ctx.trigger,
|
|
302
|
-
messageCount: ctx.messages.length,
|
|
303
|
-
tokensBeforeEstimate,
|
|
304
|
-
agentCount: ctx.agents.length,
|
|
305
|
-
chainCount: ctx.wrfcChains.length,
|
|
306
|
-
});
|
|
307
|
-
|
|
308
|
-
// ---------------------------------------------------------------------------
|
|
309
|
-
// Build rule-based sections (no LLM needed)
|
|
310
|
-
// ---------------------------------------------------------------------------
|
|
311
|
-
const sections: CompactionSection[] = [];
|
|
312
|
-
|
|
313
|
-
// Handoff header (always present)
|
|
314
|
-
sections.push(buildHandoffHeader());
|
|
315
|
-
|
|
316
|
-
// Current task
|
|
317
|
-
const planTitle = ctx.activePlan?.title ?? null;
|
|
318
|
-
const lastUserMsg = (() => {
|
|
319
|
-
for (let i = ctx.messages.length - 1; i >= 0; i--) {
|
|
320
|
-
if (ctx.messages[i].role === 'user') {
|
|
321
|
-
const text = typeof ctx.messages[i].content === 'string'
|
|
322
|
-
? ctx.messages[i].content as string
|
|
323
|
-
: (ctx.messages[i].content as ContentPart[]).filter(
|
|
324
|
-
(p): p is { type: 'text'; text: string } => p.type === 'text'
|
|
325
|
-
).map((p) => p.text).join('');
|
|
326
|
-
if (text.trim()) return text.trim();
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
return null;
|
|
330
|
-
})();
|
|
331
|
-
const currentTaskSection = buildCurrentTask(planTitle, lastUserMsg);
|
|
332
|
-
if (currentTaskSection) sections.push(currentTaskSection);
|
|
333
|
-
|
|
334
|
-
// Session memories
|
|
335
|
-
const memoriesSection = buildSessionMemories([...ctx.sessionMemories]);
|
|
336
|
-
if (memoriesSection) sections.push(memoriesSection);
|
|
337
|
-
|
|
338
|
-
// Running agents
|
|
339
|
-
const runningSection = buildRunningAgents(ctx.agents, ctx.wrfcChains);
|
|
340
|
-
if (runningSection) sections.push(runningSection);
|
|
341
|
-
|
|
342
|
-
// Agent activity table (rule-based, needed before LLM calls to determine remaining)
|
|
343
|
-
const { section: activitySection, remainingChains } = buildAgentActivityTable(
|
|
344
|
-
ctx.wrfcChains,
|
|
345
|
-
config.agentActivityBudget,
|
|
346
|
-
);
|
|
347
|
-
if (activitySection) sections.push(activitySection);
|
|
348
|
-
|
|
349
|
-
// ---------------------------------------------------------------------------
|
|
350
|
-
// Prepare all LLM-assisted prompts
|
|
351
|
-
// ---------------------------------------------------------------------------
|
|
352
|
-
const gatheredMessages = gatherRecentConversation(
|
|
353
|
-
ctx.messages,
|
|
354
|
-
config.recentConversationBudget,
|
|
355
|
-
);
|
|
356
|
-
const filterPrompt = gatheredMessages.length > 0
|
|
357
|
-
? buildConversationFilterPrompt(gatheredMessages)
|
|
358
|
-
: '';
|
|
359
|
-
|
|
360
|
-
const toolMessages = ctx.messages.filter((m) => m.role === 'tool');
|
|
361
|
-
const toolPrompt = toolMessages.length > 0
|
|
362
|
-
? buildToolResultsPrompt(toolMessages)
|
|
363
|
-
: '';
|
|
364
|
-
|
|
365
|
-
const olderPrompt = remainingChains.length > 0
|
|
366
|
-
? buildOlderAgentSummaryPrompt(remainingChains)
|
|
367
|
-
: '';
|
|
368
|
-
|
|
369
|
-
const allUserAssistant = ctx.messages.filter(
|
|
370
|
-
(m) => m.role === 'user' || m.role === 'assistant',
|
|
371
|
-
);
|
|
372
|
-
const problemsPrompt = allUserAssistant.length > 0
|
|
373
|
-
? buildResolvedProblemsPrompt(allUserAssistant)
|
|
374
|
-
: '';
|
|
375
|
-
|
|
376
|
-
// ---------------------------------------------------------------------------
|
|
377
|
-
// Parallelize all 4 independent LLM extraction calls
|
|
378
|
-
// ---------------------------------------------------------------------------
|
|
379
|
-
const [filteredText, toolSummary, olderSummary, problemsText] = await Promise.all([
|
|
380
|
-
llmExtract(registry, ctx.extractionModelId, ctx.extractionProvider, filterPrompt, 'conversation-filter'),
|
|
381
|
-
llmExtract(registry, ctx.extractionModelId, ctx.extractionProvider, toolPrompt, 'tool-results'),
|
|
382
|
-
llmExtract(registry, ctx.extractionModelId, ctx.extractionProvider, olderPrompt, 'older-agent-summary'),
|
|
383
|
-
llmExtract(registry, ctx.extractionModelId, ctx.extractionProvider, problemsPrompt, 'resolved-problems'),
|
|
384
|
-
]);
|
|
385
|
-
|
|
386
|
-
// ---------------------------------------------------------------------------
|
|
387
|
-
// Assemble LLM-assisted sections
|
|
388
|
-
// ---------------------------------------------------------------------------
|
|
389
|
-
|
|
390
|
-
// Recent conversation
|
|
391
|
-
if (gatheredMessages.length > 0) {
|
|
392
|
-
if (filteredText) {
|
|
393
|
-
sections.push({
|
|
394
|
-
id: 'recent-conversation',
|
|
395
|
-
header: '## Recent Conversation',
|
|
396
|
-
content: filteredText,
|
|
397
|
-
tokens: estimateTokens(filteredText),
|
|
398
|
-
});
|
|
399
|
-
} else {
|
|
400
|
-
// Fallback: include raw gathered messages if LLM filter fails
|
|
401
|
-
const fallbackLines = gatheredMessages.map((m) => {
|
|
402
|
-
const text = typeof m.content === 'string'
|
|
403
|
-
? m.content
|
|
404
|
-
: (m.content as ContentPart[])
|
|
405
|
-
.filter((p): p is { type: 'text'; text: string } => p.type === 'text')
|
|
406
|
-
.map((p) => p.text)
|
|
407
|
-
.join('');
|
|
408
|
-
return `[${m.role}]: ${text.trim()}`;
|
|
409
|
-
});
|
|
410
|
-
const fallbackContent = fallbackLines.join('\n\n');
|
|
411
|
-
sections.push({
|
|
412
|
-
id: 'recent-conversation',
|
|
413
|
-
header: '## Recent Conversation',
|
|
414
|
-
content: fallbackContent,
|
|
415
|
-
tokens: estimateTokens(fallbackContent),
|
|
416
|
-
});
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
// Tool results
|
|
421
|
-
if (toolSummary) {
|
|
422
|
-
sections.push({
|
|
423
|
-
id: 'tool-results',
|
|
424
|
-
header: '## Tool Results & Files Modified',
|
|
425
|
-
content: toolSummary,
|
|
426
|
-
tokens: estimateTokens(toolSummary),
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
// Older agent summary
|
|
431
|
-
if (olderSummary) {
|
|
432
|
-
sections.push({
|
|
433
|
-
id: 'older-agent-summary',
|
|
434
|
-
header: '## Older Work Summary',
|
|
435
|
-
content: olderSummary,
|
|
436
|
-
tokens: estimateTokens(olderSummary),
|
|
437
|
-
});
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
// Resolved problems
|
|
441
|
-
if (problemsText && problemsText.toLowerCase().trim() !== 'empty'
|
|
442
|
-
&& !problemsText.toLowerCase().includes('no resolved problems')) {
|
|
443
|
-
sections.push({
|
|
444
|
-
id: 'resolved-problems',
|
|
445
|
-
header: '## Resolved Problems',
|
|
446
|
-
content: problemsText,
|
|
447
|
-
tokens: estimateTokens(problemsText),
|
|
448
|
-
});
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// Plan progress (rule-based)
|
|
452
|
-
const planSection = buildPlanProgress(ctx.activePlan);
|
|
453
|
-
if (planSection) sections.push(planSection);
|
|
454
|
-
|
|
455
|
-
// Session lineage (rule-based, append-only)
|
|
456
|
-
const lineageSection = buildSessionLineage(
|
|
457
|
-
ctx.originalTask ?? lastUserMsg ?? undefined,
|
|
458
|
-
ctx.lineageEntries,
|
|
459
|
-
ctx.compactionCount,
|
|
460
|
-
);
|
|
461
|
-
if (lineageSection) sections.push(lineageSection);
|
|
462
|
-
|
|
463
|
-
// ---------------------------------------------------------------------------
|
|
464
|
-
// Assemble and validate
|
|
465
|
-
// ---------------------------------------------------------------------------
|
|
466
|
-
const compactedText = assembleSections(sections);
|
|
467
|
-
const totalTokens = sections.reduce((sum, s) => sum + s.tokens, 0);
|
|
468
|
-
const validationWarnings = validateCompaction(sections, ctx, totalTokens, config);
|
|
469
|
-
|
|
470
|
-
if (validationWarnings.length > 0) {
|
|
471
|
-
logger.warn('Context compaction: validation warnings', { warnings: validationWarnings });
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
// Build the new message list: a single user message containing the compacted context
|
|
475
|
-
const newMessages: ProviderMessage[] = [
|
|
476
|
-
{
|
|
477
|
-
role: 'user',
|
|
478
|
-
content: compactedText,
|
|
479
|
-
},
|
|
480
|
-
];
|
|
481
|
-
|
|
482
|
-
const tokensAfterEstimate = estimateConversationTokens(newMessages);
|
|
483
|
-
|
|
484
|
-
const event: CompactionEvent = {
|
|
485
|
-
timestamp: Date.now(),
|
|
486
|
-
messagesBeforeCompaction: ctx.messages.length,
|
|
487
|
-
messagesAfterCompaction: newMessages.length,
|
|
488
|
-
tokensBeforeEstimate,
|
|
489
|
-
tokensAfterEstimate,
|
|
490
|
-
modelId: ctx.extractionModelId,
|
|
491
|
-
trigger: ctx.trigger,
|
|
492
|
-
sectionsIncluded: sections.map((s) => s.id),
|
|
493
|
-
validationPassed: validationWarnings.length === 0,
|
|
494
|
-
};
|
|
495
|
-
|
|
496
|
-
compactionEvents.push(event);
|
|
497
|
-
if (compactionEvents.length > 50) compactionEvents.shift();
|
|
498
|
-
|
|
499
|
-
logger.info('Context compaction: complete', {
|
|
500
|
-
trigger: ctx.trigger,
|
|
501
|
-
modelId: ctx.extractionModelId,
|
|
502
|
-
messagesBeforeCompaction: event.messagesBeforeCompaction,
|
|
503
|
-
messagesAfterCompaction: event.messagesAfterCompaction,
|
|
504
|
-
tokensBeforeEstimate: event.tokensBeforeEstimate,
|
|
505
|
-
tokensAfterEstimate: event.tokensAfterEstimate,
|
|
506
|
-
tokensSaved: event.tokensBeforeEstimate - event.tokensAfterEstimate,
|
|
507
|
-
sectionsIncluded: event.sectionsIncluded,
|
|
508
|
-
validationWarnings: validationWarnings.length,
|
|
509
|
-
});
|
|
510
|
-
|
|
511
|
-
return {
|
|
512
|
-
messages: newMessages,
|
|
513
|
-
summary: compactedText,
|
|
514
|
-
tokensBeforeEstimate,
|
|
515
|
-
tokensAfterEstimate,
|
|
516
|
-
event,
|
|
517
|
-
sections,
|
|
518
|
-
validationWarnings,
|
|
519
|
-
};
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
// ---------------------------------------------------------------------------
|
|
523
|
-
// checkAndCompact
|
|
524
|
-
// ---------------------------------------------------------------------------
|
|
525
|
-
|
|
526
|
-
/**
|
|
527
|
-
* checkAndCompact — Check if context usage exceeds threshold and compact if so.
|
|
528
|
-
* Returns the compaction result if compaction was performed, null otherwise.
|
|
529
|
-
*
|
|
530
|
-
*/
|
|
531
|
-
export async function checkAndCompact(
|
|
532
|
-
autoOpts: AutoCompactOptions,
|
|
533
|
-
ctx: CompactionContext,
|
|
534
|
-
registry: ProviderRegistry,
|
|
535
|
-
): Promise<CompactionResult | null> {
|
|
536
|
-
if (!shouldAutoCompact(autoOpts)) return null;
|
|
537
|
-
|
|
538
|
-
return compactMessages(
|
|
539
|
-
{ ...ctx, trigger: 'auto' } as CompactionContext,
|
|
540
|
-
registry,
|
|
541
|
-
);
|
|
542
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import type { ProviderMessage } from '@pellux/goodvibes-sdk/platform/providers/interface';
|
|
2
|
-
import type { ProviderRegistry } from '@pellux/goodvibes-sdk/platform/providers/registry';
|
|
3
|
-
import { logger } from '@pellux/goodvibes-sdk/platform/utils/logger';
|
|
4
|
-
import { compactMessages } from '@pellux/goodvibes-sdk/platform/core/context-compaction';
|
|
5
|
-
import type { CompactionContext } from '@pellux/goodvibes-sdk/platform/core/context-compaction';
|
|
6
|
-
import type { SessionMemoryStore } from '@pellux/goodvibes-sdk/platform/core/session-memory';
|
|
7
|
-
import type { SessionLineageTracker } from '@pellux/goodvibes-sdk/platform/core/session-lineage';
|
|
8
|
-
import { summarizeError } from '@pellux/goodvibes-sdk/platform/utils/error-display';
|
|
9
|
-
|
|
10
|
-
export interface ConversationCompactionHost {
|
|
11
|
-
getMessageCount(): number;
|
|
12
|
-
getMessagesForLLM(): ProviderMessage[];
|
|
13
|
-
replaceMessagesForLLM(newMessages: ProviderMessage[]): void;
|
|
14
|
-
getSessionMemoryStore(): Pick<SessionMemoryStore, 'list'> | null;
|
|
15
|
-
getSessionLineageTracker(): Pick<SessionLineageTracker, 'addCompactionEntry'>;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export async function compactConversation(
|
|
19
|
-
host: ConversationCompactionHost,
|
|
20
|
-
registry: ProviderRegistry,
|
|
21
|
-
modelId: string,
|
|
22
|
-
trigger: 'auto' | 'manual' = 'manual',
|
|
23
|
-
provider?: string,
|
|
24
|
-
context?: CompactionContext,
|
|
25
|
-
): Promise<void> {
|
|
26
|
-
if (host.getMessageCount() === 0) return;
|
|
27
|
-
|
|
28
|
-
try {
|
|
29
|
-
const llmMessages = host.getMessagesForLLM();
|
|
30
|
-
const compactionContext: CompactionContext = context ?? {
|
|
31
|
-
messages: llmMessages,
|
|
32
|
-
trigger,
|
|
33
|
-
extractionModelId: modelId,
|
|
34
|
-
extractionProvider: provider,
|
|
35
|
-
sessionMemories: [],
|
|
36
|
-
agents: [],
|
|
37
|
-
wrfcChains: [],
|
|
38
|
-
activePlan: null,
|
|
39
|
-
lineageEntries: [],
|
|
40
|
-
compactionCount: 0,
|
|
41
|
-
contextWindow: 0,
|
|
42
|
-
};
|
|
43
|
-
const result = await compactMessages(compactionContext, registry);
|
|
44
|
-
|
|
45
|
-
host.replaceMessagesForLLM(result.messages);
|
|
46
|
-
|
|
47
|
-
const memoriesCount = host.getSessionMemoryStore()?.list().length ?? 0;
|
|
48
|
-
const memoriesPart = memoriesCount > 0 ? `, ${memoriesCount} pinned memories` : '';
|
|
49
|
-
const saved = result.tokensBeforeEstimate - result.tokensAfterEstimate;
|
|
50
|
-
const savedKTokens = Math.round(saved / 1000);
|
|
51
|
-
host.getSessionLineageTracker().addCompactionEntry(
|
|
52
|
-
`${trigger} compact, saved ~${savedKTokens}K tokens${memoriesPart}.`,
|
|
53
|
-
);
|
|
54
|
-
|
|
55
|
-
logger.info('Conversation compacted', {
|
|
56
|
-
trigger,
|
|
57
|
-
messagesBeforeCompaction: result.event.messagesBeforeCompaction,
|
|
58
|
-
messagesAfterCompaction: result.event.messagesAfterCompaction,
|
|
59
|
-
tokensBeforeEstimate: result.tokensBeforeEstimate,
|
|
60
|
-
tokensAfterEstimate: result.tokensAfterEstimate,
|
|
61
|
-
tokensSaved: saved,
|
|
62
|
-
});
|
|
63
|
-
} catch (err: unknown) {
|
|
64
|
-
const msg = summarizeError(err);
|
|
65
|
-
logger.error('Compact failed', { error: msg });
|
|
66
|
-
throw err;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import type { BlockMeta } from './conversation';
|
|
2
|
-
|
|
3
|
-
export function parseDiffForApply(diffText: string): Pick<BlockMeta, 'filePath' | 'diffOriginal' | 'diffUpdated'> {
|
|
4
|
-
const lines = diffText.split('\n');
|
|
5
|
-
let filePath: string | undefined;
|
|
6
|
-
|
|
7
|
-
for (const line of lines) {
|
|
8
|
-
if (line.startsWith('+++ ')) {
|
|
9
|
-
const raw = line.slice(4).trim();
|
|
10
|
-
const path = raw.startsWith('b/') ? raw.slice(2) : raw.split(' ')[0];
|
|
11
|
-
if (path && path !== '/dev/null') filePath = path;
|
|
12
|
-
break;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
const originalLines: string[] = [];
|
|
17
|
-
const updatedLines: string[] = [];
|
|
18
|
-
|
|
19
|
-
for (const line of lines) {
|
|
20
|
-
if (line.startsWith('---') || line.startsWith('+++') || line.startsWith('@@')) continue;
|
|
21
|
-
if (line.startsWith('-')) {
|
|
22
|
-
originalLines.push(line.slice(1));
|
|
23
|
-
} else if (line.startsWith('+')) {
|
|
24
|
-
updatedLines.push(line.slice(1));
|
|
25
|
-
} else {
|
|
26
|
-
const content = line.startsWith(' ') ? line.slice(1) : line;
|
|
27
|
-
originalLines.push(content);
|
|
28
|
-
updatedLines.push(content);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
return {
|
|
33
|
-
filePath,
|
|
34
|
-
diffOriginal: originalLines.join('\n'),
|
|
35
|
-
diffUpdated: updatedLines.join('\n'),
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function applyDiffContent(
|
|
40
|
-
fileContent: string,
|
|
41
|
-
original: string,
|
|
42
|
-
updated: string,
|
|
43
|
-
): { ok: true; content: string } | { ok: false; error: string } {
|
|
44
|
-
if (!original) {
|
|
45
|
-
return { ok: false, error: 'empty original pattern' };
|
|
46
|
-
}
|
|
47
|
-
if (!fileContent.includes(original)) {
|
|
48
|
-
return { ok: false, error: 'original text not found in file' };
|
|
49
|
-
}
|
|
50
|
-
const occurrenceCount = fileContent.split(original).length - 1;
|
|
51
|
-
if (occurrenceCount > 1) {
|
|
52
|
-
return { ok: false, error: `ambiguous: pattern found ${occurrenceCount} times` };
|
|
53
|
-
}
|
|
54
|
-
return { ok: true, content: fileContent.replace(original, updated) };
|
|
55
|
-
}
|