@pellux/goodvibes-tui 0.18.4
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/.goodvibes/GOODVIBES.md +35 -0
- package/.goodvibes/agents/reviewer.md +89 -0
- package/.goodvibes/skills/add-provider/SKILL.md +199 -0
- package/CHANGELOG.md +1681 -0
- package/README.md +1607 -0
- package/bin/goodvibes +66 -0
- package/docs/README.md +32 -0
- package/docs/foundation-artifacts/README.md +16 -0
- package/docs/foundation-artifacts/knowledge-graphql.graphql +397 -0
- package/docs/foundation-artifacts/knowledge-store.sql +183 -0
- package/docs/foundation-artifacts/operator-contract.json +55157 -0
- package/docs/foundation-artifacts/peer-contract.json +2384 -0
- package/package.json +114 -0
- package/scripts/postinstall.mjs +203 -0
- package/src/acp/connection.ts +447 -0
- package/src/acp/index.ts +7 -0
- package/src/acp/manager.ts +133 -0
- package/src/adapters/bluebubbles/index.ts +127 -0
- package/src/adapters/discord/index.ts +297 -0
- package/src/adapters/github/index.ts +73 -0
- package/src/adapters/google-chat/index.ts +119 -0
- package/src/adapters/imessage/index.ts +92 -0
- package/src/adapters/index.ts +15 -0
- package/src/adapters/matrix/index.ts +116 -0
- package/src/adapters/mattermost/index.ts +151 -0
- package/src/adapters/msteams/index.ts +180 -0
- package/src/adapters/ntfy/index.ts +118 -0
- package/src/adapters/signal/index.ts +92 -0
- package/src/adapters/slack/index.ts +323 -0
- package/src/adapters/telegram/index.ts +160 -0
- package/src/adapters/types.ts +97 -0
- package/src/adapters/webhook/index.ts +178 -0
- package/src/adapters/whatsapp/index.ts +135 -0
- package/src/agents/message-bus-core.ts +312 -0
- package/src/agents/message-bus.ts +2 -0
- package/src/agents/orchestrator-prompts.ts +351 -0
- package/src/agents/orchestrator-runner.ts +668 -0
- package/src/agents/orchestrator.ts +437 -0
- package/src/agents/session.ts +108 -0
- package/src/agents/worktree.ts +153 -0
- package/src/agents/wrfc-config.ts +47 -0
- package/src/agents/wrfc-controller.ts +747 -0
- package/src/agents/wrfc-gate-runtime.ts +75 -0
- package/src/agents/wrfc-reporting.ts +284 -0
- package/src/agents/wrfc-runtime-events.ts +150 -0
- package/src/agents/wrfc-types.ts +67 -0
- package/src/automation/delivery-manager.ts +368 -0
- package/src/automation/index.ts +72 -0
- package/src/automation/manager-runtime-delivery.ts +139 -0
- package/src/automation/manager-runtime-events.ts +131 -0
- package/src/automation/manager-runtime-execution.ts +511 -0
- package/src/automation/manager-runtime-helpers.ts +433 -0
- package/src/automation/manager-runtime-job-mutations.ts +175 -0
- package/src/automation/manager-runtime-reconcile.ts +148 -0
- package/src/automation/manager-runtime-scheduling.ts +189 -0
- package/src/automation/manager-runtime-sync.ts +54 -0
- package/src/automation/manager-runtime.ts +721 -0
- package/src/automation/manager.ts +10 -0
- package/src/automation/service.ts +242 -0
- package/src/channels/builtin/account-actions.ts +490 -0
- package/src/channels/builtin/accounts.ts +433 -0
- package/src/channels/builtin/contracts.ts +405 -0
- package/src/channels/builtin/plugins.ts +308 -0
- package/src/channels/builtin/rendering.ts +174 -0
- package/src/channels/builtin/setup-schema.ts +504 -0
- package/src/channels/builtin/shared.ts +96 -0
- package/src/channels/builtin/surfaces.ts +57 -0
- package/src/channels/builtin/targets.ts +693 -0
- package/src/channels/builtin-runtime.ts +443 -0
- package/src/channels/delivery/shared.ts +199 -0
- package/src/channels/delivery/strategies-bridge.ts +246 -0
- package/src/channels/delivery/strategies-core.ts +299 -0
- package/src/channels/delivery/strategies-enterprise.ts +178 -0
- package/src/channels/delivery/types.ts +59 -0
- package/src/channels/delivery-router.ts +127 -0
- package/src/channels/index.ts +77 -0
- package/src/channels/plugin-registry.ts +551 -0
- package/src/channels/provider-runtime.ts +330 -0
- package/src/channels/reply-pipeline.ts +522 -0
- package/src/channels/route-manager.ts +340 -0
- package/src/channels/surface-registry.ts +186 -0
- package/src/config/helper-model.ts +233 -0
- package/src/config/index.ts +193 -0
- package/src/config/manager.ts +404 -0
- package/src/config/secrets.ts +547 -0
- package/src/config/service-registry.ts +329 -0
- package/src/config/subscription-auth.ts +31 -0
- package/src/config/subscription-providers.ts +127 -0
- package/src/config/tool-llm.ts +110 -0
- package/src/control-plane/approval-broker.ts +351 -0
- package/src/control-plane/gateway.ts +713 -0
- package/src/control-plane/index.ts +54 -0
- package/src/control-plane/media-contract-schemas.ts +208 -0
- package/src/control-plane/method-catalog-admin.ts +136 -0
- package/src/control-plane/method-catalog-channels.ts +591 -0
- package/src/control-plane/method-catalog-control-automation.ts +475 -0
- package/src/control-plane/method-catalog-control-core.ts +594 -0
- package/src/control-plane/method-catalog-control.ts +8 -0
- package/src/control-plane/method-catalog-events.ts +74 -0
- package/src/control-plane/method-catalog-knowledge.ts +531 -0
- package/src/control-plane/method-catalog-media.ts +279 -0
- package/src/control-plane/method-catalog-runtime.ts +304 -0
- package/src/control-plane/method-catalog-shared.ts +223 -0
- package/src/control-plane/method-catalog.ts +242 -0
- package/src/control-plane/operator-contract-schemas-admin.ts +639 -0
- package/src/control-plane/operator-contract-schemas-channels.ts +375 -0
- package/src/control-plane/operator-contract-schemas-control.ts +226 -0
- package/src/control-plane/operator-contract-schemas-domains.ts +4 -0
- package/src/control-plane/operator-contract-schemas-knowledge.ts +582 -0
- package/src/control-plane/operator-contract-schemas-media.ts +297 -0
- package/src/control-plane/operator-contract-schemas-permissions.ts +100 -0
- package/src/control-plane/operator-contract-schemas-remote.ts +38 -0
- package/src/control-plane/operator-contract-schemas-runtime.ts +563 -0
- package/src/control-plane/operator-contract-schemas-shared.ts +85 -0
- package/src/control-plane/operator-contract-schemas-telemetry.ts +349 -0
- package/src/control-plane/operator-contract-schemas.ts +6 -0
- package/src/control-plane/operator-contract.ts +163 -0
- package/src/control-plane/session-broker.ts +780 -0
- package/src/core/compaction-sections.ts +492 -0
- package/src/core/compaction-types.ts +147 -0
- package/src/core/composer-state.ts +59 -0
- package/src/core/context-compaction.ts +542 -0
- package/src/core/conversation-compaction.ts +68 -0
- package/src/core/conversation-diff.ts +55 -0
- package/src/core/conversation-rendering.ts +343 -0
- package/src/core/conversation-utils.ts +72 -0
- package/src/core/conversation.ts +775 -0
- package/src/core/event-replay.ts +287 -0
- package/src/core/orchestrator-context-runtime.ts +407 -0
- package/src/core/orchestrator-follow-up-runtime.ts +134 -0
- package/src/core/orchestrator-runtime.ts +132 -0
- package/src/core/orchestrator-tool-runtime.ts +468 -0
- package/src/core/orchestrator-turn-helpers.ts +355 -0
- package/src/core/orchestrator-turn-loop.ts +443 -0
- package/src/core/orchestrator.ts +733 -0
- package/src/core/plan-command-handler.ts +169 -0
- package/src/core/system-message-router.ts +210 -0
- package/src/core/transcript-events/classify.ts +95 -0
- package/src/core/transcript-events/index.ts +15 -0
- package/src/daemon/cli.ts +88 -0
- package/src/daemon/control-plane.ts +522 -0
- package/src/daemon/facade-composition.ts +397 -0
- package/src/daemon/facade.ts +638 -0
- package/src/daemon/helpers.ts +74 -0
- package/src/daemon/http/router-route-contexts.ts +370 -0
- package/src/daemon/http/router.ts +531 -0
- package/src/daemon/http-listener.ts +301 -0
- package/src/daemon/index.ts +3 -0
- package/src/daemon/server.ts +1 -0
- package/src/daemon/service-manager.ts +413 -0
- package/src/daemon/surface-actions.ts +183 -0
- package/src/daemon/surface-delivery.ts +530 -0
- package/src/daemon/surface-policy.ts +60 -0
- package/src/daemon/transport-events.ts +110 -0
- package/src/daemon/types.ts +191 -0
- package/src/export/markdown.ts +213 -0
- package/src/export/session-export.ts +633 -0
- package/src/git/index.ts +1 -0
- package/src/git/service.ts +414 -0
- package/src/hooks/chain-engine.ts +414 -0
- package/src/hooks/dispatcher.ts +414 -0
- package/src/hooks/hook-api.ts +170 -0
- package/src/hooks/index.ts +48 -0
- package/src/hooks/runners/agent.ts +93 -0
- package/src/hooks/runners/prompt.ts +69 -0
- package/src/hooks/workbench.ts +360 -0
- package/src/input/autocomplete.ts +96 -0
- package/src/input/bookmark-modal.ts +115 -0
- package/src/input/command-registry.ts +300 -0
- package/src/input/commands/branch-runtime.ts +72 -0
- package/src/input/commands/config.ts +515 -0
- package/src/input/commands/control-room-runtime.ts +255 -0
- package/src/input/commands/conversation-runtime.ts +207 -0
- package/src/input/commands/diff-runtime.ts +161 -0
- package/src/input/commands/discovery-runtime.ts +45 -0
- package/src/input/commands/eval.ts +204 -0
- package/src/input/commands/experience-runtime.ts +278 -0
- package/src/input/commands/git-runtime.ts +81 -0
- package/src/input/commands/guidance-runtime.ts +101 -0
- package/src/input/commands/health-runtime.ts +434 -0
- package/src/input/commands/hooks-runtime.ts +148 -0
- package/src/input/commands/incident-runtime.ts +95 -0
- package/src/input/commands/integration-runtime.ts +394 -0
- package/src/input/commands/intelligence-runtime.ts +223 -0
- package/src/input/commands/knowledge.ts +368 -0
- package/src/input/commands/local-auth-runtime.ts +105 -0
- package/src/input/commands/local-provider-runtime.ts +170 -0
- package/src/input/commands/local-runtime.ts +458 -0
- package/src/input/commands/local-setup-review.ts +192 -0
- package/src/input/commands/local-setup-transfer.ts +134 -0
- package/src/input/commands/local-setup.ts +292 -0
- package/src/input/commands/managed-runtime.ts +208 -0
- package/src/input/commands/marketplace-runtime.ts +290 -0
- package/src/input/commands/mcp-runtime.ts +202 -0
- package/src/input/commands/memory-product-runtime.ts +111 -0
- package/src/input/commands/memory.ts +151 -0
- package/src/input/commands/notify-runtime.ts +83 -0
- package/src/input/commands/operator-panel-runtime.ts +141 -0
- package/src/input/commands/operator-runtime.ts +392 -0
- package/src/input/commands/permissions-runtime.ts +104 -0
- package/src/input/commands/planning-runtime.ts +97 -0
- package/src/input/commands/platform-access-runtime.ts +422 -0
- package/src/input/commands/platform-runtime.ts +6 -0
- package/src/input/commands/platform-sandbox-qemu.ts +137 -0
- package/src/input/commands/platform-sandbox-runtime.ts +406 -0
- package/src/input/commands/platform-sandbox-session.ts +128 -0
- package/src/input/commands/platform-services-runtime.ts +246 -0
- package/src/input/commands/policy-dispatch.ts +339 -0
- package/src/input/commands/policy.ts +17 -0
- package/src/input/commands/product-runtime.ts +351 -0
- package/src/input/commands/profile-sync-runtime.ts +99 -0
- package/src/input/commands/provider-accounts-runtime.ts +113 -0
- package/src/input/commands/provider.ts +363 -0
- package/src/input/commands/quit-shared.ts +162 -0
- package/src/input/commands/recall-bundle.ts +132 -0
- package/src/input/commands/recall-capture.ts +152 -0
- package/src/input/commands/recall-query.ts +229 -0
- package/src/input/commands/recall-review.ts +98 -0
- package/src/input/commands/recall-shared.ts +22 -0
- package/src/input/commands/remote-runtime-pool.ts +106 -0
- package/src/input/commands/remote-runtime-setup.ts +199 -0
- package/src/input/commands/remote-runtime.ts +531 -0
- package/src/input/commands/replay-runtime.ts +18 -0
- package/src/input/commands/runtime-services.ts +279 -0
- package/src/input/commands/schedule-runtime.ts +332 -0
- package/src/input/commands/services-runtime.ts +207 -0
- package/src/input/commands/session-content.ts +408 -0
- package/src/input/commands/session-workflow.ts +464 -0
- package/src/input/commands/session.ts +376 -0
- package/src/input/commands/settings-sync-runtime.ts +173 -0
- package/src/input/commands/share-runtime.ts +114 -0
- package/src/input/commands/shell-core.ts +320 -0
- package/src/input/commands/skills-runtime.ts +221 -0
- package/src/input/commands/subscription-runtime.ts +434 -0
- package/src/input/commands/tasks-runtime.ts +230 -0
- package/src/input/commands/teamwork-runtime.ts +374 -0
- package/src/input/commands/teleport-runtime.ts +57 -0
- package/src/input/commands/worktree-runtime.ts +137 -0
- package/src/input/commands.ts +127 -0
- package/src/input/file-picker.ts +192 -0
- package/src/input/handler-command-route.ts +106 -0
- package/src/input/handler-content-actions.ts +465 -0
- package/src/input/handler-feed-routes.ts +541 -0
- package/src/input/handler-feed.ts +361 -0
- package/src/input/handler-modal-routes.ts +335 -0
- package/src/input/handler-modal-stack.ts +237 -0
- package/src/input/handler-modal-token-routes.ts +272 -0
- package/src/input/handler-picker-routes.ts +416 -0
- package/src/input/handler-prompt-buffer.ts +320 -0
- package/src/input/handler-shortcuts.ts +195 -0
- package/src/input/handler-ui-state.ts +294 -0
- package/src/input/handler.ts +798 -0
- package/src/input/input-history.ts +267 -0
- package/src/input/keybindings.ts +256 -0
- package/src/input/model-picker.ts +730 -0
- package/src/input/panel-integration-actions.ts +77 -0
- package/src/input/profile-picker-modal.ts +222 -0
- package/src/input/search.ts +100 -0
- package/src/input/selection-modal.ts +163 -0
- package/src/input/selection.ts +135 -0
- package/src/input/session-picker-modal.ts +136 -0
- package/src/input/settings-modal.ts +718 -0
- package/src/input/submission-intent.ts +18 -0
- package/src/input/submission-router.ts +64 -0
- package/src/integrations/index.ts +42 -0
- package/src/integrations/notifier.ts +206 -0
- package/src/integrations/webhooks.ts +177 -0
- package/src/knowledge/consolidation.ts +346 -0
- package/src/knowledge/graphql.ts +324 -0
- package/src/knowledge/index.ts +60 -0
- package/src/knowledge/ingest-compile.ts +386 -0
- package/src/knowledge/ingest-context.ts +18 -0
- package/src/knowledge/ingest-inputs.ts +387 -0
- package/src/knowledge/ingest.ts +20 -0
- package/src/knowledge/internal.ts +257 -0
- package/src/knowledge/knowledge-api.ts +432 -0
- package/src/knowledge/lint.ts +121 -0
- package/src/knowledge/memory-sync.ts +62 -0
- package/src/knowledge/packet.ts +370 -0
- package/src/knowledge/scheduling.ts +283 -0
- package/src/knowledge/service.ts +715 -0
- package/src/main.ts +798 -0
- package/src/mcp/client.ts +383 -0
- package/src/mcp/index.ts +12 -0
- package/src/mcp/mcp-api.ts +90 -0
- package/src/mcp/registry.ts +508 -0
- package/src/media/builtin-image-understanding.ts +303 -0
- package/src/media/builtin-providers.ts +26 -0
- package/src/media/index.ts +18 -0
- package/src/multimodal/index.ts +13 -0
- package/src/multimodal/service.ts +492 -0
- package/src/panels/agent-inspector-panel.ts +515 -0
- package/src/panels/agent-inspector-shared.ts +94 -0
- package/src/panels/agent-logs-panel.ts +539 -0
- package/src/panels/agent-logs-shared.ts +129 -0
- package/src/panels/approval-panel.ts +169 -0
- package/src/panels/automation-control-panel.ts +253 -0
- package/src/panels/base-panel.ts +72 -0
- package/src/panels/builtin/agent.ts +88 -0
- package/src/panels/builtin/development.ts +111 -0
- package/src/panels/builtin/knowledge.ts +26 -0
- package/src/panels/builtin/operations.ts +385 -0
- package/src/panels/builtin/session.ts +61 -0
- package/src/panels/builtin/shared.ts +240 -0
- package/src/panels/builtin-panels.ts +23 -0
- package/src/panels/cockpit-panel.ts +183 -0
- package/src/panels/communication-panel.ts +191 -0
- package/src/panels/context-visualizer-panel.ts +199 -0
- package/src/panels/control-plane-panel.ts +266 -0
- package/src/panels/cost-tracker-panel.ts +444 -0
- package/src/panels/debug-panel.ts +432 -0
- package/src/panels/diff-panel.ts +518 -0
- package/src/panels/docs-panel.ts +283 -0
- package/src/panels/eval-panel.ts +399 -0
- package/src/panels/file-explorer-panel.ts +556 -0
- package/src/panels/file-preview-panel.ts +412 -0
- package/src/panels/forensics-panel.ts +364 -0
- package/src/panels/git-panel.ts +630 -0
- package/src/panels/hooks-panel.ts +274 -0
- package/src/panels/incident-review-panel.ts +247 -0
- package/src/panels/index.ts +48 -0
- package/src/panels/intelligence-panel.ts +176 -0
- package/src/panels/knowledge-panel.ts +328 -0
- package/src/panels/local-auth-panel.ts +146 -0
- package/src/panels/marketplace-panel.ts +223 -0
- package/src/panels/mcp-panel.ts +260 -0
- package/src/panels/memory-panel.ts +293 -0
- package/src/panels/ops-control-panel.ts +184 -0
- package/src/panels/ops-strategy-panel.ts +235 -0
- package/src/panels/orchestration-panel.ts +254 -0
- package/src/panels/panel-list-panel.ts +508 -0
- package/src/panels/panel-manager.ts +538 -0
- package/src/panels/panel-picker.ts +106 -0
- package/src/panels/plan-dashboard-panel.ts +272 -0
- package/src/panels/plugins-panel.ts +201 -0
- package/src/panels/policy-panel.ts +308 -0
- package/src/panels/polish.ts +668 -0
- package/src/panels/provider-account-snapshot.ts +259 -0
- package/src/panels/provider-accounts-panel.ts +221 -0
- package/src/panels/provider-health-domains.ts +211 -0
- package/src/panels/provider-health-panel.ts +725 -0
- package/src/panels/provider-health-tracker.ts +115 -0
- package/src/panels/provider-stats-panel.ts +366 -0
- package/src/panels/remote-panel.ts +449 -0
- package/src/panels/routes-panel.ts +228 -0
- package/src/panels/sandbox-panel.ts +289 -0
- package/src/panels/schedule-panel.ts +344 -0
- package/src/panels/search-focus.ts +32 -0
- package/src/panels/security-panel.ts +329 -0
- package/src/panels/services-panel.ts +271 -0
- package/src/panels/session-browser-panel.ts +399 -0
- package/src/panels/session-maintenance.ts +125 -0
- package/src/panels/settings-sync-panel.ts +164 -0
- package/src/panels/skills-panel.ts +475 -0
- package/src/panels/subscription-panel.ts +273 -0
- package/src/panels/symbol-outline-panel.ts +486 -0
- package/src/panels/system-messages-panel.ts +224 -0
- package/src/panels/tasks-panel.ts +448 -0
- package/src/panels/thinking-panel.ts +304 -0
- package/src/panels/token-budget-panel.ts +469 -0
- package/src/panels/tool-inspector-panel.ts +434 -0
- package/src/panels/types.ts +44 -0
- package/src/panels/watchers-panel.ts +241 -0
- package/src/panels/welcome-panel.ts +64 -0
- package/src/panels/worktree-panel.ts +180 -0
- package/src/panels/wrfc-panel.ts +480 -0
- package/src/permissions/briefs/build.ts +88 -0
- package/src/permissions/manager.ts +356 -0
- package/src/permissions/prompt.ts +184 -0
- package/src/plugins/api.ts +383 -0
- package/src/plugins/loader.ts +304 -0
- package/src/plugins/manager.ts +481 -0
- package/src/profiles/shape.ts +58 -0
- package/src/providers/amazon-bedrock-mantle.ts +50 -0
- package/src/providers/amazon-bedrock.ts +61 -0
- package/src/providers/anthropic-compat.ts +373 -0
- package/src/providers/anthropic-sdk-provider.ts +230 -0
- package/src/providers/anthropic-vertex.ts +59 -0
- package/src/providers/anthropic.ts +469 -0
- package/src/providers/auto-register.ts +417 -0
- package/src/providers/builtin-catalog.ts +326 -0
- package/src/providers/builtin-registry.ts +575 -0
- package/src/providers/cache-planner.ts +258 -0
- package/src/providers/capabilities.ts +601 -0
- package/src/providers/custom-loader.ts +425 -0
- package/src/providers/discovered-compat.ts +18 -0
- package/src/providers/discovered-factory.ts +61 -0
- package/src/providers/discovered-traits.ts +138 -0
- package/src/providers/gemini.ts +462 -0
- package/src/providers/github-copilot.ts +254 -0
- package/src/providers/index.ts +47 -0
- package/src/providers/interface.ts +185 -0
- package/src/providers/llama-cpp.ts +402 -0
- package/src/providers/lm-studio-helpers.ts +367 -0
- package/src/providers/lm-studio.ts +484 -0
- package/src/providers/model-catalog-cache.ts +221 -0
- package/src/providers/model-catalog-notifications.ts +97 -0
- package/src/providers/model-catalog-synthetic.ts +202 -0
- package/src/providers/model-catalog.ts +211 -0
- package/src/providers/model-limits.ts +280 -0
- package/src/providers/ollama.ts +469 -0
- package/src/providers/openai-codex.ts +472 -0
- package/src/providers/openai-compat.ts +615 -0
- package/src/providers/openai.ts +231 -0
- package/src/providers/optimizer.ts +381 -0
- package/src/providers/provider-api.ts +553 -0
- package/src/providers/registry-helpers.ts +34 -0
- package/src/providers/registry-models.ts +77 -0
- package/src/providers/registry-types.ts +67 -0
- package/src/providers/registry.ts +729 -0
- package/src/providers/runtime-metadata.ts +149 -0
- package/src/providers/runtime-snapshot.ts +130 -0
- package/src/providers/synthetic.ts +561 -0
- package/src/providers/tier-prompts.ts +84 -0
- package/src/providers/tool-formats.ts +414 -0
- package/src/renderer/agent-detail-modal.ts +285 -0
- package/src/renderer/autocomplete-overlay.ts +154 -0
- package/src/renderer/block-actions.ts +76 -0
- package/src/renderer/bookmark-modal.ts +101 -0
- package/src/renderer/bottom-bar.ts +58 -0
- package/src/renderer/buffer.ts +34 -0
- package/src/renderer/code-block.ts +373 -0
- package/src/renderer/compositor.ts +261 -0
- package/src/renderer/context-inspector.ts +219 -0
- package/src/renderer/conversation-layout.ts +67 -0
- package/src/renderer/conversation-overlays.ts +123 -0
- package/src/renderer/conversation-surface.ts +260 -0
- package/src/renderer/diff-view.ts +132 -0
- package/src/renderer/diff.ts +122 -0
- package/src/renderer/file-picker-overlay.ts +101 -0
- package/src/renderer/file-tree.ts +153 -0
- package/src/renderer/git-status.ts +89 -0
- package/src/renderer/help-overlay.ts +247 -0
- package/src/renderer/history-search-overlay.ts +73 -0
- package/src/renderer/layout-engine.ts +97 -0
- package/src/renderer/layout.ts +32 -0
- package/src/renderer/live-tail-modal.ts +156 -0
- package/src/renderer/markdown.ts +777 -0
- package/src/renderer/modal-factory.ts +467 -0
- package/src/renderer/modal-utils.ts +24 -0
- package/src/renderer/model-picker-overlay.ts +396 -0
- package/src/renderer/overlay-box.ts +165 -0
- package/src/renderer/overlay-viewport.ts +104 -0
- package/src/renderer/panel-composite.ts +80 -0
- package/src/renderer/panel-picker-overlay.ts +202 -0
- package/src/renderer/panel-tab-bar.ts +69 -0
- package/src/renderer/panel-workspace-bar.ts +38 -0
- package/src/renderer/process-indicator.ts +96 -0
- package/src/renderer/process-modal.ts +295 -0
- package/src/renderer/profile-picker-modal.ts +129 -0
- package/src/renderer/progress.ts +98 -0
- package/src/renderer/search-overlay.ts +54 -0
- package/src/renderer/selection-modal-overlay.ts +214 -0
- package/src/renderer/semantic-diff.ts +369 -0
- package/src/renderer/session-picker-modal.ts +127 -0
- package/src/renderer/settings-modal.ts +701 -0
- package/src/renderer/shell-surface.ts +88 -0
- package/src/renderer/surface-layout.ts +101 -0
- package/src/renderer/syntax-highlighter.ts +542 -0
- package/src/renderer/system-message.ts +83 -0
- package/src/renderer/tab-strip.ts +108 -0
- package/src/renderer/text-layout.ts +31 -0
- package/src/renderer/thinking.ts +17 -0
- package/src/renderer/tool-call.ts +233 -0
- package/src/renderer/ui-factory.ts +524 -0
- package/src/renderer/ui-primitives.ts +96 -0
- package/src/runtime/auth/inspection.ts +125 -0
- package/src/runtime/bootstrap-background.ts +147 -0
- package/src/runtime/bootstrap-command-context.ts +265 -0
- package/src/runtime/bootstrap-command-parts.ts +357 -0
- package/src/runtime/bootstrap-core.ts +375 -0
- package/src/runtime/bootstrap-helpers.ts +88 -0
- package/src/runtime/bootstrap-hook-bridge.ts +271 -0
- package/src/runtime/bootstrap-runtime-events.ts +254 -0
- package/src/runtime/bootstrap-services.ts +197 -0
- package/src/runtime/bootstrap-shell.ts +262 -0
- package/src/runtime/bootstrap.ts +488 -0
- package/src/runtime/compaction/index.ts +90 -0
- package/src/runtime/compaction/lifecycle.ts +167 -0
- package/src/runtime/compaction/manager.ts +474 -0
- package/src/runtime/compaction/quality-score.ts +279 -0
- package/src/runtime/compaction/resume-repair.ts +183 -0
- package/src/runtime/compaction/strategies/autocompact.ts +65 -0
- package/src/runtime/compaction/strategies/boundary-commit.ts +106 -0
- package/src/runtime/compaction/strategies/collapse.ts +90 -0
- package/src/runtime/compaction/strategies/index.ts +23 -0
- package/src/runtime/compaction/strategies/microcompact.ts +74 -0
- package/src/runtime/compaction/strategies/reactive.ts +89 -0
- package/src/runtime/compaction/types.ts +221 -0
- package/src/runtime/context.ts +158 -0
- package/src/runtime/diagnostics/actions.ts +776 -0
- package/src/runtime/diagnostics/index.ts +99 -0
- package/src/runtime/diagnostics/panels/agents.ts +252 -0
- package/src/runtime/diagnostics/panels/events.ts +188 -0
- package/src/runtime/diagnostics/panels/health.ts +242 -0
- package/src/runtime/diagnostics/panels/index.ts +24 -0
- package/src/runtime/diagnostics/panels/ops.ts +156 -0
- package/src/runtime/diagnostics/panels/policy.ts +176 -0
- package/src/runtime/diagnostics/panels/tasks.ts +251 -0
- package/src/runtime/diagnostics/panels/tool-calls.ts +267 -0
- package/src/runtime/diagnostics/provider.ts +262 -0
- package/src/runtime/ecosystem/catalog.ts +606 -0
- package/src/runtime/ecosystem/recommendations.ts +117 -0
- package/src/runtime/emitters/agents.ts +96 -0
- package/src/runtime/emitters/automation.ts +112 -0
- package/src/runtime/emitters/communication.ts +53 -0
- package/src/runtime/emitters/compaction.ts +161 -0
- package/src/runtime/emitters/control-plane.ts +65 -0
- package/src/runtime/emitters/deliveries.ts +65 -0
- package/src/runtime/emitters/forensics.ts +17 -0
- package/src/runtime/emitters/index.ts +59 -0
- package/src/runtime/emitters/knowledge.ts +129 -0
- package/src/runtime/emitters/mcp.ts +95 -0
- package/src/runtime/emitters/ops.ts +163 -0
- package/src/runtime/emitters/orchestration.ts +87 -0
- package/src/runtime/emitters/permissions.ts +98 -0
- package/src/runtime/emitters/planner.ts +23 -0
- package/src/runtime/emitters/plugins.ts +78 -0
- package/src/runtime/emitters/providers.ts +30 -0
- package/src/runtime/emitters/routes.ts +57 -0
- package/src/runtime/emitters/security.ts +53 -0
- package/src/runtime/emitters/session.ts +93 -0
- package/src/runtime/emitters/surfaces.ts +57 -0
- package/src/runtime/emitters/tasks.ts +69 -0
- package/src/runtime/emitters/tools.ts +140 -0
- package/src/runtime/emitters/transport.ts +78 -0
- package/src/runtime/emitters/turn.ts +155 -0
- package/src/runtime/emitters/ui.ts +57 -0
- package/src/runtime/emitters/watchers.ts +57 -0
- package/src/runtime/emitters/workflows.ts +79 -0
- package/src/runtime/eval/index.ts +48 -0
- package/src/runtime/eval/runner.ts +163 -0
- package/src/runtime/eval/suites.ts +264 -0
- package/src/runtime/events/domain-map.ts +148 -0
- package/src/runtime/events/index.ts +194 -0
- package/src/runtime/events/turn.ts +60 -0
- package/src/runtime/events/workflows.ts +17 -0
- package/src/runtime/forensics/collector.ts +693 -0
- package/src/runtime/forensics/index.ts +23 -0
- package/src/runtime/foundation-clients.ts +78 -0
- package/src/runtime/foundation-services.ts +96 -0
- package/src/runtime/guidance.ts +183 -0
- package/src/runtime/health/effect-handlers.ts +189 -0
- package/src/runtime/health/index.ts +70 -0
- package/src/runtime/health/wiring.ts +115 -0
- package/src/runtime/index.ts +174 -0
- package/src/runtime/integration/helpers.ts +640 -0
- package/src/runtime/lifecycle.ts +107 -0
- package/src/runtime/mcp/index.ts +68 -0
- package/src/runtime/mcp/manager.ts +513 -0
- package/src/runtime/network/inbound.ts +131 -0
- package/src/runtime/network/index.ts +30 -0
- package/src/runtime/network/outbound.ts +292 -0
- package/src/runtime/network/shared.ts +82 -0
- package/src/runtime/operator-client.ts +235 -0
- package/src/runtime/ops/control-plane.ts +363 -0
- package/src/runtime/ops/index.ts +122 -0
- package/src/runtime/ops/playbooks/index.ts +10 -0
- package/src/runtime/ops/playbooks/session-unrecoverable.ts +196 -0
- package/src/runtime/ops/playbooks/stuck-turn.ts +197 -0
- package/src/runtime/ops/runtime-context.ts +100 -0
- package/src/runtime/ops-api.ts +27 -0
- package/src/runtime/orchestration/spawn-policy.ts +83 -0
- package/src/runtime/peer-client.ts +404 -0
- package/src/runtime/perf/index.ts +57 -0
- package/src/runtime/perf/slo-collector.ts +375 -0
- package/src/runtime/permissions/index.ts +190 -0
- package/src/runtime/permissions/policy-runtime.ts +175 -0
- package/src/runtime/permissions/preflight.ts +101 -0
- package/src/runtime/permissions/rule-suggestions.ts +36 -0
- package/src/runtime/plugins/hot-reload.ts +221 -0
- package/src/runtime/plugins/index.ts +84 -0
- package/src/runtime/plugins/lifecycle.ts +95 -0
- package/src/runtime/plugins/manager.ts +474 -0
- package/src/runtime/plugins/manifest.ts +167 -0
- package/src/runtime/plugins/quarantine.ts +202 -0
- package/src/runtime/plugins/trust.ts +291 -0
- package/src/runtime/plugins/types.ts +205 -0
- package/src/runtime/provider-accounts/registry.ts +326 -0
- package/src/runtime/remote/distributed-runtime-contract-schemas.ts +386 -0
- package/src/runtime/remote/index.ts +488 -0
- package/src/runtime/remote/runner-registry.ts +438 -0
- package/src/runtime/remote/supervisor.ts +70 -0
- package/src/runtime/runtime-hook-api.ts +5 -0
- package/src/runtime/runtime-knowledge-api.ts +14 -0
- package/src/runtime/runtime-mcp-api.ts +5 -0
- package/src/runtime/runtime-ops-api.ts +86 -0
- package/src/runtime/runtime-provider-api.ts +18 -0
- package/src/runtime/sandbox/backend.ts +291 -0
- package/src/runtime/sandbox/manager.ts +364 -0
- package/src/runtime/sandbox/provisioning.ts +422 -0
- package/src/runtime/sandbox/session-registry.ts +289 -0
- package/src/runtime/services.ts +541 -0
- package/src/runtime/session-maintenance.ts +188 -0
- package/src/runtime/session-persistence.ts +288 -0
- package/src/runtime/session-return-context.ts +195 -0
- package/src/runtime/settings/control-plane-store.ts +258 -0
- package/src/runtime/settings/control-plane.ts +599 -0
- package/src/runtime/shell-command-extensions.ts +54 -0
- package/src/runtime/shell-command-ops.ts +207 -0
- package/src/runtime/shell-command-platform.ts +47 -0
- package/src/runtime/shell-command-services.ts +143 -0
- package/src/runtime/shell-command-workspace.ts +31 -0
- package/src/runtime/store/domains/conversation.ts +181 -0
- package/src/runtime/store/domains/domain-read-matrix.ts +17 -0
- package/src/runtime/store/domains/index.ts +222 -0
- package/src/runtime/store/domains/panels.ts +117 -0
- package/src/runtime/store/domains/permissions.ts +143 -0
- package/src/runtime/store/domains/ui-perf.ts +103 -0
- package/src/runtime/store/helpers/reducers/conversation.ts +228 -0
- package/src/runtime/store/helpers/reducers/lifecycle.ts +440 -0
- package/src/runtime/store/helpers/reducers/shared.ts +60 -0
- package/src/runtime/store/helpers/reducers/sync.ts +555 -0
- package/src/runtime/store/helpers/reducers.ts +30 -0
- package/src/runtime/store/index.ts +304 -0
- package/src/runtime/store/selectors/index.ts +354 -0
- package/src/runtime/store/state.ts +137 -0
- package/src/runtime/tasks/adapters/acp-adapter.ts +211 -0
- package/src/runtime/tasks/adapters/agent-adapter.ts +208 -0
- package/src/runtime/tasks/adapters/index.ts +16 -0
- package/src/runtime/tasks/adapters/process-adapter.ts +214 -0
- package/src/runtime/tasks/adapters/scheduler-adapter.ts +193 -0
- package/src/runtime/tasks/index.ts +68 -0
- package/src/runtime/tasks/manager.ts +415 -0
- package/src/runtime/telemetry/api-helpers.ts +517 -0
- package/src/runtime/telemetry/api.ts +768 -0
- package/src/runtime/telemetry/index.ts +178 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-agent-session.ts +440 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-plugin-mcp.ts +200 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-shared.ts +18 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge-transport-task.ts +204 -0
- package/src/runtime/telemetry/instrumentation/domain-bridge.ts +125 -0
- package/src/runtime/telemetry/instrumentation/index.ts +67 -0
- package/src/runtime/tools/context.ts +114 -0
- package/src/runtime/tools/index.ts +46 -0
- package/src/runtime/tools/phased-executor.ts +448 -0
- package/src/runtime/tools/phases/budget.ts +130 -0
- package/src/runtime/tools/phases/execute.ts +69 -0
- package/src/runtime/tools/phases/index.ts +13 -0
- package/src/runtime/tools/phases/map-output.ts +98 -0
- package/src/runtime/tools/phases/permission.ts +133 -0
- package/src/runtime/tools/phases/posthook.ts +57 -0
- package/src/runtime/tools/phases/prehook.ts +68 -0
- package/src/runtime/tools/phases/validate.ts +53 -0
- package/src/runtime/transports/direct.ts +73 -0
- package/src/runtime/transports/http-helpers.ts +218 -0
- package/src/runtime/transports/http-types.ts +364 -0
- package/src/runtime/transports/http.ts +629 -0
- package/src/runtime/transports/realtime.ts +50 -0
- package/src/runtime/transports/remote-events.ts +16 -0
- package/src/runtime/transports/shared.ts +39 -0
- package/src/runtime/transports/ui-runtime-events.ts +35 -0
- package/src/runtime/ui/index.ts +39 -0
- package/src/runtime/ui/model-picker/data-provider.ts +182 -0
- package/src/runtime/ui/model-picker/health-enrichment.ts +228 -0
- package/src/runtime/ui/model-picker/index.ts +59 -0
- package/src/runtime/ui/model-picker/types.ts +149 -0
- package/src/runtime/ui/provider-health/data-provider.ts +244 -0
- package/src/runtime/ui/provider-health/fallback-visualizer.ts +69 -0
- package/src/runtime/ui/provider-health/index.ts +46 -0
- package/src/runtime/ui/provider-health/types.ts +146 -0
- package/src/runtime/ui-events.ts +46 -0
- package/src/runtime/ui-read-model-helpers.ts +32 -0
- package/src/runtime/ui-read-models-core.ts +95 -0
- package/src/runtime/ui-read-models-observability-maintenance.ts +81 -0
- package/src/runtime/ui-read-models-observability-options.ts +5 -0
- package/src/runtime/ui-read-models-observability-remote.ts +73 -0
- package/src/runtime/ui-read-models-observability-security.ts +172 -0
- package/src/runtime/ui-read-models-observability-system.ts +217 -0
- package/src/runtime/ui-read-models-observability.ts +59 -0
- package/src/runtime/ui-read-models-operations.ts +203 -0
- package/src/runtime/ui-read-models.ts +61 -0
- package/src/runtime/ui-service-queries.ts +114 -0
- package/src/runtime/ui-services.ts +163 -0
- package/src/runtime/worktree/registry.ts +252 -0
- package/src/scripts/process-messages.ts +42 -0
- package/src/sessions/manager.ts +388 -0
- package/src/shell/blocking-input.ts +89 -0
- package/src/shell/ui-openers.ts +163 -0
- package/src/state/file-watcher.ts +294 -0
- package/src/state/index.ts +56 -0
- package/src/state/knowledge-injection.ts +214 -0
- package/src/state/memory-embedding-http.ts +642 -0
- package/src/state/memory-embeddings.ts +312 -0
- package/src/state/memory-ingest.ts +132 -0
- package/src/state/memory-registry.ts +111 -0
- package/src/state/memory-store-helpers.ts +160 -0
- package/src/state/memory-store.ts +728 -0
- package/src/state/memory-vector-store.ts +418 -0
- package/src/templates/manager.ts +187 -0
- package/src/tools/agent/index.ts +610 -0
- package/src/tools/agent/manager.ts +476 -0
- package/src/tools/analyze/git-modes.ts +380 -0
- package/src/tools/analyze/index.ts +128 -0
- package/src/tools/channel/agent-tools.ts +16 -0
- package/src/tools/channel/index.ts +268 -0
- package/src/tools/control/index.ts +90 -0
- package/src/tools/edit/core.ts +619 -0
- package/src/tools/edit/index.ts +4 -0
- package/src/tools/edit/phased.ts +33 -0
- package/src/tools/fetch/index.ts +3 -0
- package/src/tools/fetch/phased.ts +34 -0
- package/src/tools/fetch/runtime.ts +499 -0
- package/src/tools/index.ts +186 -0
- package/src/tools/mcp/index.ts +190 -0
- package/src/tools/remote-trigger/index.ts +130 -0
- package/src/tools/repl/index.ts +318 -0
- package/src/tools/shared/auto-heal.ts +282 -0
- package/src/tools/state/index.ts +688 -0
- package/src/tools/web-search/index.ts +38 -0
- package/src/tools/write/index.ts +604 -0
- package/src/tools/write/phased.ts +41 -0
- package/src/types/generated/foundation-client-types.ts +22 -0
- package/src/types/sql-js.d.ts +15 -0
- package/src/utils/splash-lines.ts +46 -0
- package/src/version.ts +17 -0
- package/src/watchers/index.ts +11 -0
- package/src/watchers/registry.ts +517 -0
- package/src/web-search/index.ts +26 -0
- package/src/web-search/provider-registry.ts +64 -0
- package/src/web-search/providers/brave.ts +100 -0
- package/src/web-search/providers/duckduckgo.ts +270 -0
- package/src/web-search/providers/exa.ts +77 -0
- package/src/web-search/providers/firecrawl.ts +90 -0
- package/src/web-search/providers/perplexity.ts +86 -0
- package/src/web-search/providers/searxng.ts +88 -0
- package/src/web-search/providers/shared.ts +249 -0
- package/src/web-search/providers/tavily.ts +90 -0
- package/src/web-search/service.ts +142 -0
- package/src/widget/index.ts +2 -0
- package/src/widget/types.ts +9 -0
- package/src/widget/widget.ts +8 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* quality-score.ts
|
|
3
|
+
*
|
|
4
|
+
* Compaction quality scoring — evaluates the output of a compaction strategy
|
|
5
|
+
* by combining compression ratio and semantic retention signals.
|
|
6
|
+
*
|
|
7
|
+
* Score range: 0.0 (worst) → 1.0 (best)
|
|
8
|
+
* Auto-switch threshold: scores below LOW_QUALITY_THRESHOLD trigger a strategy
|
|
9
|
+
* escalation to the next more-aggressive strategy.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { StrategyInput, StrategyOutput, CompactionStrategy } from './types.ts';
|
|
13
|
+
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Constants
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Compaction runs scoring below this value are considered low-quality and
|
|
20
|
+
* trigger an automatic strategy switch.
|
|
21
|
+
*/
|
|
22
|
+
export const LOW_QUALITY_THRESHOLD = 0.4;
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Keywords that indicate a message is a compaction handoff/summary note.
|
|
26
|
+
*/
|
|
27
|
+
const HANDOFF_MARKERS = ['[Session', 'compaction', 'collapsed', 'summarized', 'condensed', 'context window'] as const;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Weight given to compression ratio in the composite score (0–1).
|
|
31
|
+
* The remainder is allocated to semantic retention.
|
|
32
|
+
*/
|
|
33
|
+
const COMPRESSION_WEIGHT = 0.55;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Weight given to semantic retention signals in the composite score (0–1).
|
|
37
|
+
*/
|
|
38
|
+
const RETENTION_WEIGHT = 0.45;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Minimum meaningful compression ratio. A run with zero or negative compression
|
|
42
|
+
* scores 0 on the compression axis.
|
|
43
|
+
*/
|
|
44
|
+
const MIN_COMPRESSION_RATIO = 0;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Compression ratio above which the compression dimension is fully saturated.
|
|
48
|
+
* Anything at or above this (e.g. 80% reduction) receives a perfect compression score.
|
|
49
|
+
*/
|
|
50
|
+
const MAX_COMPRESSION_RATIO = 0.8;
|
|
51
|
+
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Types
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
/** Letter grade derived from the composite quality score. */
|
|
57
|
+
export type CompactionQualityGrade = 'A' | 'B' | 'C' | 'D' | 'F';
|
|
58
|
+
|
|
59
|
+
/** Semantic retention signals evaluated during scoring. */
|
|
60
|
+
export interface SemanticRetentionSignals {
|
|
61
|
+
/** At least one handoff/summary message is present in the output. */
|
|
62
|
+
hasHandoff: boolean;
|
|
63
|
+
/** Output contains non-trivial content (not just a blank handoff note). */
|
|
64
|
+
hasNonTrivialContent: boolean;
|
|
65
|
+
/** The output message count is a reasonable fraction of the input. */
|
|
66
|
+
messageCountSane: boolean;
|
|
67
|
+
/** The output token count is positive. */
|
|
68
|
+
positiveTokenCount: boolean;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Full quality score breakdown for a compaction run. */
|
|
72
|
+
export interface CompactionQualityScore {
|
|
73
|
+
/** Fraction of tokens removed: (tokensBefore - tokensAfter) / tokensBefore. */
|
|
74
|
+
compressionRatio: number;
|
|
75
|
+
/** Normalised compression dimension score (0–1). */
|
|
76
|
+
compressionScore: number;
|
|
77
|
+
/** Semantic retention dimension score (0–1). */
|
|
78
|
+
retentionScore: number;
|
|
79
|
+
/** Composite quality score: weighted sum of compression + retention (0–1). */
|
|
80
|
+
score: number;
|
|
81
|
+
/** Letter grade derived from score. */
|
|
82
|
+
grade: CompactionQualityGrade;
|
|
83
|
+
/** Individual semantic retention signals. */
|
|
84
|
+
signals: SemanticRetentionSignals;
|
|
85
|
+
/** True when score < LOW_QUALITY_THRESHOLD and strategy escalation should occur. */
|
|
86
|
+
isLowQuality: boolean;
|
|
87
|
+
/** Human-readable description of the score for diagnostics. */
|
|
88
|
+
description: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// ---------------------------------------------------------------------------
|
|
92
|
+
// Scoring
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Extracts plain text content from a provider message.
|
|
97
|
+
*/
|
|
98
|
+
function extractTextContent(msg: StrategyOutput['messages'][number]): string {
|
|
99
|
+
if (typeof msg.content === 'string') return msg.content;
|
|
100
|
+
if (Array.isArray(msg.content)) {
|
|
101
|
+
return msg.content
|
|
102
|
+
.filter((b): b is { type: 'text'; text: string } => b.type === 'text')
|
|
103
|
+
.map((b) => b.text)
|
|
104
|
+
.join(' ');
|
|
105
|
+
}
|
|
106
|
+
return '';
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Evaluates the semantic retention signals from a strategy output.
|
|
111
|
+
*
|
|
112
|
+
* These are lightweight structural checks — no LLM call required.
|
|
113
|
+
*/
|
|
114
|
+
function evaluateSemanticRetention(
|
|
115
|
+
input: StrategyInput,
|
|
116
|
+
output: StrategyOutput,
|
|
117
|
+
): SemanticRetentionSignals {
|
|
118
|
+
const hasHandoff = output.messages.some((m) => {
|
|
119
|
+
const content = extractTextContent(m);
|
|
120
|
+
return HANDOFF_MARKERS.some((marker) => content.includes(marker));
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
const hasNonTrivialContent = output.messages.some((m) => {
|
|
124
|
+
const text = extractTextContent(m);
|
|
125
|
+
// Non-trivial means more than just whitespace, and longer than a minimal fragment
|
|
126
|
+
return text.trim().length > 20;
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// Sane if output has at least 1 message and doesn't exceed input count
|
|
130
|
+
const messageCountSane =
|
|
131
|
+
output.messages.length >= 1 &&
|
|
132
|
+
output.messages.length <= input.messages.length;
|
|
133
|
+
|
|
134
|
+
const positiveTokenCount = output.tokensAfter > 0;
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
hasHandoff,
|
|
138
|
+
hasNonTrivialContent,
|
|
139
|
+
messageCountSane,
|
|
140
|
+
positiveTokenCount,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Scores the semantic retention dimension as a 0–1 value.
|
|
146
|
+
*
|
|
147
|
+
* Each signal contributes equally. Missing signals reduce the score.
|
|
148
|
+
*/
|
|
149
|
+
function scoreRetention(signals: SemanticRetentionSignals): number {
|
|
150
|
+
const checks = [
|
|
151
|
+
signals.hasHandoff,
|
|
152
|
+
signals.hasNonTrivialContent,
|
|
153
|
+
signals.messageCountSane,
|
|
154
|
+
signals.positiveTokenCount,
|
|
155
|
+
];
|
|
156
|
+
return checks.filter(Boolean).length / checks.length;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Normalises a raw compression ratio to a 0–1 score.
|
|
161
|
+
*
|
|
162
|
+
* A ratio of 0 (no reduction) → score 0.
|
|
163
|
+
* A ratio at MAX_COMPRESSION_RATIO (e.g. 80%) → score 1.
|
|
164
|
+
* Values above MAX_COMPRESSION_RATIO are clamped at 1.
|
|
165
|
+
* Negative ratios (output larger than input) are clamped at 0.
|
|
166
|
+
*/
|
|
167
|
+
function scoreCompression(ratio: number): number {
|
|
168
|
+
if (ratio <= MIN_COMPRESSION_RATIO) return 0;
|
|
169
|
+
const normalised = (ratio - MIN_COMPRESSION_RATIO) / (MAX_COMPRESSION_RATIO - MIN_COMPRESSION_RATIO);
|
|
170
|
+
return Math.min(1, Math.max(0, normalised));
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Maps a composite score to a letter grade.
|
|
175
|
+
*/
|
|
176
|
+
function gradeScore(score: number): CompactionQualityGrade {
|
|
177
|
+
if (score >= 0.85) return 'A';
|
|
178
|
+
if (score >= 0.70) return 'B';
|
|
179
|
+
if (score >= 0.55) return 'C';
|
|
180
|
+
if (score >= LOW_QUALITY_THRESHOLD) return 'D';
|
|
181
|
+
return 'F';
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Produces a human-readable diagnostic description for a quality score.
|
|
186
|
+
*/
|
|
187
|
+
export function describeScore(score: CompactionQualityScore): string {
|
|
188
|
+
const parts: string[] = [
|
|
189
|
+
`score=${score.score.toFixed(2)} (${score.grade})`,
|
|
190
|
+
`compression=${(score.compressionRatio * 100).toFixed(1)}%`,
|
|
191
|
+
`retention=${(score.retentionScore * 100).toFixed(0)}%`,
|
|
192
|
+
];
|
|
193
|
+
if (score.isLowQuality) {
|
|
194
|
+
parts.push('LOW_QUALITY — strategy switch triggered');
|
|
195
|
+
}
|
|
196
|
+
return parts.join(', ');
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Computes the quality score for a completed compaction strategy run.
|
|
201
|
+
*
|
|
202
|
+
* @param input - The strategy input (pre-compaction state).
|
|
203
|
+
* @param output - The strategy output (post-compaction state).
|
|
204
|
+
* @returns A full CompactionQualityScore breakdown.
|
|
205
|
+
*/
|
|
206
|
+
function scoreCompactionOutput(
|
|
207
|
+
input: StrategyInput,
|
|
208
|
+
output: StrategyOutput,
|
|
209
|
+
): CompactionQualityScore {
|
|
210
|
+
// Compression ratio: fraction of tokens removed
|
|
211
|
+
const compressionRatio =
|
|
212
|
+
input.tokensBefore > 0
|
|
213
|
+
? Math.max(0, (input.tokensBefore - output.tokensAfter) / input.tokensBefore)
|
|
214
|
+
: 0;
|
|
215
|
+
|
|
216
|
+
const compressionScore = scoreCompression(compressionRatio);
|
|
217
|
+
|
|
218
|
+
const signals = evaluateSemanticRetention(input, output);
|
|
219
|
+
const retentionScore = scoreRetention(signals);
|
|
220
|
+
|
|
221
|
+
const score =
|
|
222
|
+
COMPRESSION_WEIGHT * compressionScore + RETENTION_WEIGHT * retentionScore;
|
|
223
|
+
|
|
224
|
+
const grade = gradeScore(score);
|
|
225
|
+
const isLowQuality = score < LOW_QUALITY_THRESHOLD;
|
|
226
|
+
|
|
227
|
+
return {
|
|
228
|
+
compressionRatio,
|
|
229
|
+
compressionScore,
|
|
230
|
+
retentionScore,
|
|
231
|
+
score,
|
|
232
|
+
grade,
|
|
233
|
+
signals,
|
|
234
|
+
isLowQuality,
|
|
235
|
+
description: '', // filled below to avoid circular call
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Computes the quality score with description filled in.
|
|
241
|
+
*
|
|
242
|
+
* Prefer this over `scoreCompactionOutput` for all public use.
|
|
243
|
+
*/
|
|
244
|
+
export function computeQualityScore(
|
|
245
|
+
input: StrategyInput,
|
|
246
|
+
output: StrategyOutput,
|
|
247
|
+
): CompactionQualityScore {
|
|
248
|
+
const partial = scoreCompactionOutput(input, output);
|
|
249
|
+
const full: CompactionQualityScore = { ...partial, description: '' };
|
|
250
|
+
full.description = describeScore(full);
|
|
251
|
+
return full;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
// Strategy escalation
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Returns the next more-aggressive strategy for escalation when quality is low.
|
|
260
|
+
*
|
|
261
|
+
* Escalation path:
|
|
262
|
+
* microcompact → autocompact → collapse → collapse (ceiling)
|
|
263
|
+
* reactive → reactive (already maximum)
|
|
264
|
+
*
|
|
265
|
+
* @param current - The strategy that produced the low-quality result.
|
|
266
|
+
* @returns The escalated strategy to re-run with.
|
|
267
|
+
*/
|
|
268
|
+
export function escalateStrategy(current: CompactionStrategy): CompactionStrategy {
|
|
269
|
+
switch (current) {
|
|
270
|
+
case 'microcompact': return 'autocompact';
|
|
271
|
+
case 'autocompact': return 'collapse';
|
|
272
|
+
case 'collapse': return 'collapse'; // already most aggressive
|
|
273
|
+
case 'reactive': return 'reactive'; // emergency — cannot escalate further
|
|
274
|
+
default: {
|
|
275
|
+
const _exhaustive: never = current;
|
|
276
|
+
throw new Error(`Unknown compaction strategy: ${_exhaustive}`);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* resume-repair.ts
|
|
3
|
+
*
|
|
4
|
+
* Session resume repair pipeline for the compaction engine.
|
|
5
|
+
*
|
|
6
|
+
* When a session is resumed from a saved boundary commit, this pipeline
|
|
7
|
+
* validates and repairs the compacted message list before it is handed
|
|
8
|
+
* to the active conversation context. Repairs are non-destructive and
|
|
9
|
+
* append-only — they never discard information without recording the
|
|
10
|
+
* action in the repair log.
|
|
11
|
+
*
|
|
12
|
+
* Repair checks (in order):
|
|
13
|
+
* 1. Empty message list → inject an empty-state handoff
|
|
14
|
+
* 2. Missing user message at position 0 → prepend synthetic user message
|
|
15
|
+
* 3. Context overflow (tokens > limit) → truncate oldest messages
|
|
16
|
+
* 4. Corrupt content blocks → strip non-serialisable blocks
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import type { ProviderMessage } from '../../providers/interface.ts';
|
|
20
|
+
import { estimateTokens } from '../../core/compaction-types.ts';
|
|
21
|
+
import type { BoundaryCommit } from './types.ts';
|
|
22
|
+
import type { RepairAction, ResumeRepairResult } from './types.ts';
|
|
23
|
+
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Constants
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Maximum tokens allowed in a resumed session before overflow truncation.
|
|
30
|
+
* Set conservatively at 80% of a typical 100K context window.
|
|
31
|
+
*/
|
|
32
|
+
const RESUME_MAX_TOKENS = 80_000;
|
|
33
|
+
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// Public API
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Options for the resume repair pipeline.
|
|
40
|
+
*/
|
|
41
|
+
export interface ResumeRepairOptions {
|
|
42
|
+
/** The boundary commit being resumed. */
|
|
43
|
+
commit: BoundaryCommit;
|
|
44
|
+
/** Maximum tokens allowed in the resumed session (default: RESUME_MAX_TOKENS). */
|
|
45
|
+
maxTokens?: number;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Runs the session resume repair pipeline on a boundary commit.
|
|
50
|
+
*
|
|
51
|
+
* Each check is run in sequence. If a repair is applied, the message list
|
|
52
|
+
* is updated in place for the next check. All repairs are recorded with
|
|
53
|
+
* their severity and description.
|
|
54
|
+
*
|
|
55
|
+
* @param options - Repair options.
|
|
56
|
+
* @returns A ResumeRepairResult with the (possibly repaired) messages and repair log.
|
|
57
|
+
*/
|
|
58
|
+
export function runResumeRepair(options: ResumeRepairOptions): ResumeRepairResult {
|
|
59
|
+
const { commit, maxTokens = RESUME_MAX_TOKENS } = options;
|
|
60
|
+
const { sessionId } = commit;
|
|
61
|
+
const actions: RepairAction[] = [];
|
|
62
|
+
|
|
63
|
+
// Work on a mutable copy
|
|
64
|
+
let messages: ProviderMessage[] = [...commit.messages] as ProviderMessage[];
|
|
65
|
+
|
|
66
|
+
// ── Check 1: Empty message list ───────────────────────────────────────────
|
|
67
|
+
if (messages.length === 0) {
|
|
68
|
+
actions.push({
|
|
69
|
+
kind: 'inject_empty_state_handoff',
|
|
70
|
+
description: 'Message list was empty; injected an empty-state handoff message.',
|
|
71
|
+
severity: 'warn',
|
|
72
|
+
});
|
|
73
|
+
messages = [
|
|
74
|
+
{
|
|
75
|
+
role: 'user',
|
|
76
|
+
content: [
|
|
77
|
+
{
|
|
78
|
+
type: 'text',
|
|
79
|
+
text: [
|
|
80
|
+
'[Session Resume — Empty State]',
|
|
81
|
+
`Session ${sessionId} was resumed with no prior messages.`,
|
|
82
|
+
'Starting fresh with no context.',
|
|
83
|
+
].join('\n'),
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// ── Check 2: First message must be from 'user' ────────────────────────────
|
|
91
|
+
if (messages[0].role !== 'user') {
|
|
92
|
+
actions.push({
|
|
93
|
+
kind: 'prepend_user_message',
|
|
94
|
+
description: `First message had role '${messages[0].role}'; prepended synthetic user message.`,
|
|
95
|
+
severity: 'warn',
|
|
96
|
+
meta: { originalFirstRole: messages[0].role },
|
|
97
|
+
});
|
|
98
|
+
const synthetic: ProviderMessage = {
|
|
99
|
+
role: 'user',
|
|
100
|
+
content: [
|
|
101
|
+
{
|
|
102
|
+
type: 'text',
|
|
103
|
+
text: '[Session Resume] Continuing from a prior compacted session.',
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
};
|
|
107
|
+
messages = [synthetic, ...messages];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// ── Check 3: Overflow truncation ─────────────────────────────────────────
|
|
111
|
+
let estimate = estimateTokens(JSON.stringify(messages));
|
|
112
|
+
if (estimate > maxTokens) {
|
|
113
|
+
const originalCount = messages.length;
|
|
114
|
+
while (messages.length > 1 && estimate > maxTokens) {
|
|
115
|
+
// Drop from position 1 (preserve the handoff at [0])
|
|
116
|
+
messages = [messages[0], ...messages.slice(2)];
|
|
117
|
+
estimate = estimateTokens(JSON.stringify(messages));
|
|
118
|
+
}
|
|
119
|
+
const dropped = originalCount - messages.length;
|
|
120
|
+
actions.push({
|
|
121
|
+
kind: 'truncate_overflow',
|
|
122
|
+
description: `Token estimate exceeded limit (${estimate}/${maxTokens}); dropped ${dropped} message(s).`,
|
|
123
|
+
severity: 'warn',
|
|
124
|
+
meta: { originalCount, droppedCount: dropped, tokenEstimate: estimate, maxTokens },
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ── Check 4: Strip non-serialisable content blocks ───────────────────────
|
|
129
|
+
const strippedCount = stripNonSerializableBlocks(messages);
|
|
130
|
+
if (strippedCount > 0) {
|
|
131
|
+
actions.push({
|
|
132
|
+
kind: 'strip_non_serializable',
|
|
133
|
+
description: `Stripped ${strippedCount} non-serialisable content block(s) from resumed messages.`,
|
|
134
|
+
severity: 'warn',
|
|
135
|
+
meta: { strippedCount },
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const repaired = actions.length > 0;
|
|
140
|
+
const hasFatal = actions.some((a) => a.severity === 'error');
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
sessionId,
|
|
144
|
+
repaired,
|
|
145
|
+
actions,
|
|
146
|
+
messages,
|
|
147
|
+
safeToResume: !hasFatal,
|
|
148
|
+
failReason: hasFatal
|
|
149
|
+
? actions.find((a) => a.severity === 'error')?.description
|
|
150
|
+
: undefined,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// ---------------------------------------------------------------------------
|
|
155
|
+
// Repair helpers
|
|
156
|
+
// ---------------------------------------------------------------------------
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Strips content blocks that cannot be safely serialised to JSON.
|
|
160
|
+
*
|
|
161
|
+
* Returns the count of blocks stripped.
|
|
162
|
+
*/
|
|
163
|
+
function stripNonSerializableBlocks(messages: ProviderMessage[]): number {
|
|
164
|
+
let stripped = 0;
|
|
165
|
+
for (const msg of messages) {
|
|
166
|
+
// Check all roles for array content with non-serializable blocks
|
|
167
|
+
if (!Array.isArray(msg.content)) continue;
|
|
168
|
+
const before = msg.content.length;
|
|
169
|
+
const filtered = msg.content.filter((block) => {
|
|
170
|
+
try {
|
|
171
|
+
JSON.stringify(block);
|
|
172
|
+
return true;
|
|
173
|
+
} catch {
|
|
174
|
+
// Non-serialisable block — strip it
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
// Re-assign through a type-compatible user message mutation
|
|
179
|
+
(msg as { content: typeof filtered }).content = filtered;
|
|
180
|
+
stripped += before - filtered.length;
|
|
181
|
+
}
|
|
182
|
+
return stripped;
|
|
183
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* strategies/autocompact.ts
|
|
3
|
+
*
|
|
4
|
+
* Auto-compaction strategy for the session compaction pipeline.
|
|
5
|
+
*
|
|
6
|
+
* This strategy is used when token pressure is in the 50–85% range. It runs
|
|
7
|
+
* the full semantic compaction pipeline including section-based extraction,
|
|
8
|
+
* lineage tracking, and post-compaction validation.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { ProviderMessage } from '../../../providers/interface.ts';
|
|
12
|
+
import { estimateTokens } from '../../../core/compaction-types.ts';
|
|
13
|
+
import type { StrategyInput, StrategyOutput } from '../types.ts';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Applies automatic threshold-based compaction.
|
|
17
|
+
*
|
|
18
|
+
* This uses the standard compaction pipeline. If a registry-backed context
|
|
19
|
+
* summary is unavailable, it falls back to a structural compaction that keeps
|
|
20
|
+
* a wider recent-message window than microcompact.
|
|
21
|
+
*
|
|
22
|
+
* @param input - Strategy input.
|
|
23
|
+
* @returns Strategy output.
|
|
24
|
+
*/
|
|
25
|
+
export function runAutocompact(input: StrategyInput): StrategyOutput {
|
|
26
|
+
const startMs = Date.now();
|
|
27
|
+
const { messages, tokensBefore, strategy } = input;
|
|
28
|
+
const warnings: string[] = [];
|
|
29
|
+
|
|
30
|
+
// Keep the most recent 60% of messages by count, drop the oldest 40%
|
|
31
|
+
const keepCount = Math.max(1, Math.ceil(messages.length * 0.6));
|
|
32
|
+
const dropped = messages.length - keepCount;
|
|
33
|
+
const kept = messages.slice(-keepCount) as ProviderMessage[];
|
|
34
|
+
|
|
35
|
+
const handoff: ProviderMessage = {
|
|
36
|
+
role: 'user',
|
|
37
|
+
content: [
|
|
38
|
+
{
|
|
39
|
+
type: 'text',
|
|
40
|
+
text: [
|
|
41
|
+
'[Session Auto-Compaction]',
|
|
42
|
+
`${dropped} earlier message(s) compacted to reduce context size.`,
|
|
43
|
+
`Retaining the ${keepCount} most recent messages.`,
|
|
44
|
+
'Context window pressure was above threshold — automatic compaction applied.',
|
|
45
|
+
].join('\n'),
|
|
46
|
+
},
|
|
47
|
+
],
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const compacted: ProviderMessage[] = [handoff, ...kept];
|
|
51
|
+
const tokensAfter = estimateTokens(JSON.stringify(compacted));
|
|
52
|
+
|
|
53
|
+
if (dropped === 0) {
|
|
54
|
+
warnings.push('autocompact: no messages were dropped; context may still be near limit');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
messages: compacted,
|
|
59
|
+
tokensAfter,
|
|
60
|
+
summary: `Auto-compaction: dropped ${dropped} messages (~${Math.round((1 - tokensAfter / tokensBefore) * 100)}% reduction).`,
|
|
61
|
+
strategy,
|
|
62
|
+
durationMs: Date.now() - startMs,
|
|
63
|
+
warnings,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* strategies/boundary-commit.ts
|
|
3
|
+
*
|
|
4
|
+
* Boundary commit — persists a compacted snapshot as a named checkpoint with
|
|
5
|
+
* full lineage tracking for replay-safe session resumption.
|
|
6
|
+
*
|
|
7
|
+
* A boundary commit is always created after a successful compaction strategy
|
|
8
|
+
* run (microcompact, collapse, autocompact, or reactive). It forms the
|
|
9
|
+
* persistent anchor point that the resume-repair pipeline uses to restore
|
|
10
|
+
* a session from a corrupted or partial state.
|
|
11
|
+
*
|
|
12
|
+
* Lineage is append-only: each commit appends its own checkpointId to the
|
|
13
|
+
* parent's lineage array. This means any checkpoint can be sliced from any
|
|
14
|
+
* earlier commit without re-ordering.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { BoundaryCommit } from '../types.ts';
|
|
18
|
+
import type { StrategyOutput } from '../types.ts';
|
|
19
|
+
|
|
20
|
+
/** Simple prefix for generated checkpoint IDs. */
|
|
21
|
+
const CHECKPOINT_PREFIX = 'cpt';
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Generates a checkpoint ID using the current timestamp and a random suffix.
|
|
25
|
+
* Format: `cpt_<timestamp>_<random>`
|
|
26
|
+
*/
|
|
27
|
+
function generateCheckpointId(): string {
|
|
28
|
+
const ts = Date.now().toString(36);
|
|
29
|
+
const rand = Math.random().toString(36).slice(2, 8);
|
|
30
|
+
return `${CHECKPOINT_PREFIX}_${ts}_${rand}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Options for creating a boundary commit.
|
|
35
|
+
*/
|
|
36
|
+
export interface BoundaryCommitOptions {
|
|
37
|
+
/** Session ID this commit belongs to. */
|
|
38
|
+
sessionId: string;
|
|
39
|
+
/** The compaction strategy output to commit. */
|
|
40
|
+
strategyOutput: StrategyOutput;
|
|
41
|
+
/** Parent boundary commit, or null for the first commit. */
|
|
42
|
+
parent: BoundaryCommit | null;
|
|
43
|
+
/** Estimated token count before compaction (for audit). */
|
|
44
|
+
tokensBefore: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Creates a new BoundaryCommit from a strategy output.
|
|
49
|
+
*
|
|
50
|
+
* The new commit's lineage is derived by appending its own checkpointId
|
|
51
|
+
* to the parent's lineage (or starting a fresh lineage if `parent` is null).
|
|
52
|
+
*
|
|
53
|
+
* @param options - Commit options.
|
|
54
|
+
* @returns A fully populated BoundaryCommit.
|
|
55
|
+
*/
|
|
56
|
+
export function createBoundaryCommit(
|
|
57
|
+
options: BoundaryCommitOptions,
|
|
58
|
+
): BoundaryCommit {
|
|
59
|
+
const { sessionId, strategyOutput, parent, tokensBefore } = options;
|
|
60
|
+
const checkpointId = generateCheckpointId();
|
|
61
|
+
|
|
62
|
+
const parentLineage: readonly string[] = parent?.lineage ?? [];
|
|
63
|
+
const lineage: readonly string[] = [...parentLineage, checkpointId];
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
checkpointId,
|
|
67
|
+
sessionId,
|
|
68
|
+
createdAt: Date.now(),
|
|
69
|
+
strategy: strategyOutput.strategy,
|
|
70
|
+
parentCheckpointId: parent?.checkpointId ?? null,
|
|
71
|
+
lineage,
|
|
72
|
+
messages: strategyOutput.messages,
|
|
73
|
+
tokenCount: strategyOutput.tokensAfter,
|
|
74
|
+
tokensBefore,
|
|
75
|
+
summary: strategyOutput.summary,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Validates a BoundaryCommit for replay-safety.
|
|
81
|
+
*
|
|
82
|
+
* A commit is replay-safe if:
|
|
83
|
+
* - It has at least one message
|
|
84
|
+
* - Its lineage is ordered and contains its own checkpointId
|
|
85
|
+
* - Its tokenCount is positive
|
|
86
|
+
*
|
|
87
|
+
* @returns An array of validation error strings (empty = valid).
|
|
88
|
+
*/
|
|
89
|
+
export function validateBoundaryCommit(commit: BoundaryCommit): string[] {
|
|
90
|
+
const errors: string[] = [];
|
|
91
|
+
|
|
92
|
+
if (commit.messages.length === 0) {
|
|
93
|
+
errors.push('boundary_commit: no messages in checkpoint');
|
|
94
|
+
}
|
|
95
|
+
if (commit.tokenCount <= 0) {
|
|
96
|
+
errors.push('boundary_commit: tokenCount must be positive');
|
|
97
|
+
}
|
|
98
|
+
if (!commit.lineage.includes(commit.checkpointId)) {
|
|
99
|
+
errors.push('boundary_commit: checkpointId not found in lineage (lineage is corrupted)');
|
|
100
|
+
}
|
|
101
|
+
if (commit.lineage.length === 0) {
|
|
102
|
+
errors.push('boundary_commit: lineage is empty');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return errors;
|
|
106
|
+
}
|