@vellumai/assistant 0.8.5 → 0.8.7
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/AGENTS.md +33 -1
- package/ARCHITECTURE.md +1 -1
- package/Dockerfile +1 -0
- package/bun.lock +11 -2
- package/bunfig.toml +6 -1
- package/docker-entrypoint.sh +8 -6
- package/docs/credential-execution-service.md +6 -6
- package/docs/plugins.md +67 -31
- package/examples/plugins/echo/register.ts +4 -7
- package/knip.json +1 -0
- package/node_modules/@vellumai/environments/bun.lock +24 -0
- package/node_modules/@vellumai/environments/package.json +18 -0
- package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
- package/node_modules/@vellumai/environments/src/index.ts +11 -0
- package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
- package/node_modules/@vellumai/environments/src/types.ts +70 -0
- package/node_modules/@vellumai/environments/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +15 -17
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +10 -3
- package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +16 -14
- package/openapi.yaml +5585 -469
- package/package.json +7 -3
- package/scripts/generate-openapi.ts +20 -13
- package/src/__tests__/actor-token-service.test.ts +3 -2
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +336 -42
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +21 -33
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +6 -4
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +207 -341
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +5 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +23 -40
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -2
- package/src/__tests__/annotate-risk-options.test.ts +1 -0
- package/src/__tests__/anthropic-provider.test.ts +201 -55
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +5 -0
- package/src/__tests__/approval-cascade.test.ts +5 -11
- package/src/__tests__/approval-routes-http.test.ts +13 -15
- package/src/__tests__/assert-not-live-db.ts +79 -0
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +11 -27
- package/src/__tests__/audit-log-rotation.test.ts +2 -2
- package/src/__tests__/auto-analysis-end-to-end.test.ts +6 -6
- package/src/__tests__/avatar-e2e.test.ts +7 -37
- package/src/__tests__/avatar-generator.test.ts +12 -42
- package/src/__tests__/avatar-identity-sync.test.ts +28 -3
- package/src/__tests__/background-shell-bash.test.ts +3 -7
- package/src/__tests__/background-workers-disk-pressure.test.ts +5 -8
- package/src/__tests__/browser-skill-endstate.test.ts +3 -3
- package/src/__tests__/btw-routes.test.ts +10 -14
- package/src/__tests__/call-controller.test.ts +3 -2
- package/src/__tests__/call-pointer-messages.test.ts +5 -3
- package/src/__tests__/call-site-routing-provider.test.ts +22 -40
- package/src/__tests__/catalog-files.test.ts +1 -0
- package/src/__tests__/channel-approval-routes.test.ts +51 -22
- package/src/__tests__/channel-approvals.test.ts +3 -1
- package/src/__tests__/channel-guardian.test.ts +3 -2
- package/src/__tests__/channel-invite-transport.test.ts +1 -5
- package/src/__tests__/channel-readiness-routes.test.ts +0 -4
- package/src/__tests__/channel-readiness-slack-remote.test.ts +170 -0
- package/src/__tests__/channel-reply-delivery.test.ts +35 -0
- package/src/__tests__/channel-retry-sweep.test.ts +388 -79
- package/src/__tests__/checker.test.ts +12 -12
- package/src/__tests__/circuit-breaker-pipeline.test.ts +3 -3
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-events.test.ts +6 -17
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
- package/src/__tests__/compaction-trail-store.test.ts +186 -0
- package/src/__tests__/compactor-call-site-logging.test.ts +1 -0
- package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
- package/src/__tests__/compactor-preserved-tail-count.test.ts +1 -0
- package/src/__tests__/computer-use-skill-manifest-regression.test.ts +7 -5
- package/src/__tests__/computer-use-tools.test.ts +14 -16
- package/src/__tests__/config-loader-backfill.test.ts +13 -28
- package/src/__tests__/config-loader-corrupt.test.ts +5 -5
- package/src/__tests__/config-loader-platform-defaults.test.ts +93 -26
- package/src/__tests__/config-loader-quarantine-bulletin.test.ts +3 -3
- package/src/__tests__/config-managed-gemini-defaults.test.ts +3 -4
- package/src/__tests__/config-schema.test.ts +10 -10
- package/src/__tests__/config-watcher.test.ts +28 -0
- package/src/__tests__/connection-model-compat.test.ts +83 -0
- package/src/__tests__/contacts-tools.test.ts +3 -2
- package/src/__tests__/context-search-agent-runner.test.ts +6 -3
- package/src/__tests__/context-token-estimator.test.ts +56 -0
- package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +19 -7
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +4 -2
- package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +55 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +13 -27
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +464 -90
- package/src/__tests__/conversation-agent-loop.test.ts +1069 -64
- package/src/__tests__/conversation-analysis-routes.test.ts +2 -3
- package/src/__tests__/conversation-app-control-instantiation.test.ts +29 -19
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +2 -1
- package/src/__tests__/conversation-attention-store.test.ts +101 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +3 -2
- package/src/__tests__/conversation-clear-safety.test.ts +20 -10
- package/src/__tests__/conversation-confirmation-signals.test.ts +16 -45
- package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
- package/src/__tests__/conversation-disk-view.test.ts +10 -17
- package/src/__tests__/conversation-error.test.ts +30 -0
- package/src/__tests__/conversation-fork-crud.test.ts +132 -157
- package/src/__tests__/conversation-fork-route.test.ts +19 -16
- package/src/__tests__/conversation-history-web-search.test.ts +1 -0
- package/src/__tests__/conversation-inference-profile-list.test.ts +3 -2
- package/src/__tests__/conversation-inference-profile-route.test.ts +3 -2
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
- package/src/__tests__/conversation-lifecycle.test.ts +4 -2
- package/src/__tests__/conversation-list-source.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +5 -3
- package/src/__tests__/conversation-load-history-stripped.test.ts +2 -1
- package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
- package/src/__tests__/conversation-pairing.test.ts +87 -4
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +30 -7
- package/src/__tests__/conversation-process-callsite.test.ts +28 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +58 -44
- package/src/__tests__/conversation-queue.test.ts +603 -455
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -20
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +35 -10
- package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -4
- package/src/__tests__/conversation-runtime-assembly.test.ts +98 -22
- package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
- package/src/__tests__/conversation-skill-tools.test.ts +38 -142
- package/src/__tests__/conversation-slash-queue.test.ts +120 -62
- package/src/__tests__/conversation-slash-unknown.test.ts +18 -15
- package/src/__tests__/conversation-speed-override.test.ts +9 -22
- package/src/__tests__/conversation-stream-state.test.ts +484 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +52 -15
- package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -0
- package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-standalone.test.ts +6 -3
- package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
- package/src/__tests__/conversation-surfaces-table-action.test.ts +13 -32
- package/src/__tests__/conversation-sync-tags.test.ts +128 -12
- package/src/__tests__/conversation-title-service.test.ts +1 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +53 -11
- package/src/__tests__/conversation-unread-route.test.ts +14 -2
- package/src/__tests__/conversation-usage.test.ts +1 -2
- package/src/__tests__/conversation-wipe.test.ts +1 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +4 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +53 -22
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +32 -7
- package/src/__tests__/credential-broker-browser-fill.test.ts +3 -3
- package/src/__tests__/credential-broker-server-use.test.ts +5 -5
- package/src/__tests__/credential-execution-client.test.ts +72 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +10 -12
- package/src/__tests__/credential-execution-tools.test.ts +1 -2
- package/src/__tests__/credential-health-service.test.ts +252 -3
- package/src/__tests__/credential-security-invariants.test.ts +5 -6
- package/src/__tests__/credential-vault-unit.test.ts +19 -19
- package/src/__tests__/credential-vault.test.ts +5 -5
- package/src/__tests__/cross-provider-web-search.test.ts +61 -3
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-connection-isolation.test.ts +7 -6
- package/src/__tests__/db-conversation-fork-lineage-migration.test.ts +8 -10
- package/src/__tests__/db-conversation-inference-profile-migration.test.ts +7 -10
- package/src/__tests__/db-llm-request-log-provider-migration.test.ts +9 -15
- package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -0
- package/src/__tests__/db-test-helpers.ts +58 -0
- package/src/__tests__/disk-pressure-guard.test.ts +119 -36
- package/src/__tests__/disk-pressure-lifecycle.test.ts +13 -10
- package/src/__tests__/disk-pressure-routes.test.ts +9 -35
- package/src/__tests__/disk-pressure-tools.test.ts +0 -4
- package/src/__tests__/dm-persistence.test.ts +33 -42
- package/src/__tests__/document-create-dedupe.test.ts +189 -0
- package/src/__tests__/document-find-replace.test.ts +3 -2
- package/src/__tests__/document-tool-security.test.ts +81 -2
- package/src/__tests__/dynamic-page-surface.test.ts +68 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +5 -4
- package/src/__tests__/edit-propagation.test.ts +1 -2
- package/src/__tests__/empty-response-pipeline.test.ts +127 -5
- package/src/__tests__/encrypted-store-test-helpers.ts +56 -0
- package/src/__tests__/encrypted-store.test.ts +11 -9
- package/src/__tests__/feature-flag-test-helpers.ts +53 -0
- package/src/__tests__/filing-service.test.ts +3 -2
- package/src/__tests__/first-greeting.test.ts +103 -12
- package/src/__tests__/gateway-flag-listener.test.ts +0 -1
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +375 -26
- package/src/__tests__/guardian-action-sweep.test.ts +3 -2
- package/src/__tests__/guardian-outbound-http.test.ts +3 -2
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +48 -3
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +10 -7
- package/src/__tests__/heartbeat-disk-pressure.test.ts +2 -0
- package/src/__tests__/heartbeat-service.test.ts +3 -1
- package/src/__tests__/helpers/mock-logger.ts +26 -0
- package/src/__tests__/history-repair-hook.test.ts +161 -0
- package/src/__tests__/history-repair-observability.test.ts +1 -1
- package/src/__tests__/history-repair.test.ts +2 -1
- package/src/__tests__/host-app-control-proxy.test.ts +2 -0
- package/src/__tests__/host-bash-routes.test.ts +1 -0
- package/src/__tests__/host-cu-proxy.test.ts +2 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-edit-tool.test.ts +4 -2
- package/src/__tests__/host-file-proxy.test.ts +31 -0
- package/src/__tests__/host-file-read-tool.test.ts +4 -2
- package/src/__tests__/host-file-routes-targeted.test.ts +1 -0
- package/src/__tests__/host-file-write-tool.test.ts +9 -3
- package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
- package/src/__tests__/host-shell-tool.test.ts +11 -5
- package/src/__tests__/host-transfer-routes-targeted.test.ts +1 -0
- package/src/__tests__/http-conversation-lineage.test.ts +3 -2
- package/src/__tests__/http-user-message-parity.test.ts +31 -9
- package/src/__tests__/identity-intro-cache.test.ts +154 -22
- package/src/__tests__/inbound-slack-persistence.test.ts +51 -74
- package/src/__tests__/inference-profile-reaper.test.ts +3 -2
- package/src/__tests__/inference-profile-session-ipc.test.ts +3 -2
- package/src/__tests__/injector-background-turn.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +4 -18
- package/src/__tests__/injector-document-comments.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/injector-v3-suppression.test.ts +220 -0
- package/src/__tests__/inline-skill-load-permissions.test.ts +4 -4
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +93 -11
- package/src/__tests__/list-messages-page-latest.test.ts +0 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
- package/src/__tests__/llm-call-pipeline.test.ts +21 -15
- package/src/__tests__/llm-context-normalization.test.ts +42 -0
- package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
- package/src/__tests__/llm-resolver.test.ts +346 -39
- package/src/__tests__/llm-schema.test.ts +1 -1
- package/src/__tests__/llm-usage-store.test.ts +45 -0
- package/src/__tests__/log-export-routes.test.ts +59 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
- package/src/__tests__/manual-token-reconciliation.test.ts +76 -1
- package/src/__tests__/mcp-abort-signal.test.ts +14 -0
- package/src/__tests__/mcp-auth-routes.test.ts +15 -10
- package/src/__tests__/mcp-client-auth.test.ts +14 -0
- package/src/__tests__/mcp-health-check.test.ts +18 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messaging-send-tool.test.ts +9 -4
- package/src/__tests__/migration-export-http.test.ts +12 -12
- package/src/__tests__/migration-import-commit-http.test.ts +8 -8
- package/src/__tests__/migration-import-from-url.test.ts +3 -3
- package/src/__tests__/migration-import-preflight-http.test.ts +7 -7
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/mock-gateway-ipc.ts +18 -2
- package/src/__tests__/model-intents.test.ts +3 -3
- package/src/__tests__/native-web-search.test.ts +44 -22
- package/src/__tests__/notification-decision-identity.test.ts +9 -18
- package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
- package/src/__tests__/notification-deep-link.test.ts +62 -0
- package/src/__tests__/oauth-commands-routes.test.ts +38 -1
- package/src/__tests__/oauth-provider-visibility.test.ts +8 -8
- package/src/__tests__/oauth-store.test.ts +3 -2
- package/src/__tests__/onboarding-template-contract.test.ts +13 -2
- package/src/__tests__/openai-provider.test.ts +74 -79
- package/src/__tests__/openai-responses-provider.test.ts +90 -86
- package/src/__tests__/openrouter-provider-only.test.ts +27 -5
- package/src/__tests__/outbound-slack-persistence.test.ts +48 -2
- package/src/__tests__/overflow-reduce-pipeline.test.ts +2 -4
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persistence-pipeline.test.ts +154 -27
- package/src/__tests__/persistence-secret-redaction.test.ts +85 -13
- package/src/__tests__/pipeline-runner.test.ts +2 -3
- package/src/__tests__/plugin-bootstrap.test.ts +60 -36
- package/src/__tests__/plugin-route-contribution.test.ts +6 -16
- package/src/__tests__/plugin-skill-contribution.test.ts +7 -17
- package/src/__tests__/plugin-tool-contribution.test.ts +51 -64
- package/src/__tests__/plugin-types.test.ts +7 -14
- package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
- package/src/__tests__/process-message-background-slack.test.ts +38 -32
- package/src/__tests__/process-message-display-content.test.ts +49 -64
- package/src/__tests__/provider-catalog-visibility.test.ts +9 -9
- package/src/__tests__/provider-commit-message-generator.test.ts +19 -14
- package/src/__tests__/provider-error-scenarios.test.ts +7 -6
- package/src/__tests__/provider-platform-proxy-integration.test.ts +215 -8
- package/src/__tests__/provider-registry-ollama.test.ts +45 -22
- package/src/__tests__/provider-send-message-override-profile.test.ts +9 -25
- package/src/__tests__/provider-streaming.benchmark.test.ts +12 -22
- package/src/__tests__/provider-usage-tracking.test.ts +0 -6
- package/src/__tests__/ratelimit.test.ts +9 -4
- package/src/__tests__/recording-handler.test.ts +1 -0
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +1 -0
- package/src/__tests__/registry.test.ts +82 -76
- package/src/__tests__/relay-server.test.ts +30 -23
- package/src/__tests__/retry-openrouter-only-normalization.test.ts +5 -8
- package/src/__tests__/retry-thinking-tool-choice.test.ts +10 -13
- package/src/__tests__/retry-verbosity-normalization.test.ts +5 -8
- package/src/__tests__/runtime-attachment-metadata.test.ts +3 -2
- package/src/__tests__/runtime-events-sse-reconnect.test.ts +353 -0
- package/src/__tests__/schedule-routes.test.ts +80 -10
- package/src/__tests__/schedule-store.test.ts +83 -1
- package/src/__tests__/schedule-tools.test.ts +125 -0
- package/src/__tests__/scheduler-reuse-conversation.test.ts +48 -3
- package/src/__tests__/secret-ingress-http.test.ts +7 -3
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +11 -7
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +11 -9
- package/src/__tests__/secret-response-routing.test.ts +13 -11
- package/src/__tests__/secure-keys.test.ts +3 -3
- package/src/__tests__/send-endpoint-busy.test.ts +83 -43
- package/src/__tests__/server-history-render.test.ts +4 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +19 -21
- package/src/__tests__/skill-feature-flags.test.ts +20 -22
- package/src/__tests__/skill-load-feature-flag.test.ts +15 -15
- package/src/__tests__/skill-projection-feature-flag.test.ts +44 -30
- package/src/__tests__/skill-projection.benchmark.test.ts +5 -7
- package/src/__tests__/skill-tool-factory.test.ts +96 -95
- package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
- package/src/__tests__/skillssh-files.test.ts +1 -0
- package/src/__tests__/slack-channel-config.test.ts +3 -3
- package/src/__tests__/starter-task-flow.test.ts +6 -6
- package/src/__tests__/strip-memory-injections.test.ts +102 -14
- package/src/__tests__/subagent-call-site-routing.test.ts +13 -5
- package/src/__tests__/subagent-disposal.test.ts +27 -8
- package/src/__tests__/subagent-fork-notifications.test.ts +24 -9
- package/src/__tests__/subagent-fork-spawn.test.ts +13 -4
- package/src/__tests__/subagent-manager-notify.test.ts +20 -8
- package/src/__tests__/subagent-notify-parent.test.ts +5 -4
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +58 -0
- package/src/__tests__/subagent-tools.test.ts +2 -1
- package/src/__tests__/suggestion-routes.test.ts +4 -3
- package/src/__tests__/sync-message-contract.test.ts +19 -16
- package/src/__tests__/system-prompt.test.ts +92 -0
- package/src/__tests__/terminal-tools.test.ts +3 -24
- package/src/__tests__/test-preload-verifier.ts +68 -0
- package/src/__tests__/test-preload.ts +32 -39
- package/src/__tests__/thread-backfill.test.ts +4 -9
- package/src/__tests__/title-generate-pipeline.test.ts +1 -1
- package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
- package/src/__tests__/tool-error-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +20 -7
- package/src/__tests__/tool-executor.test.ts +55 -10
- package/src/__tests__/tool-preview-lifecycle.test.ts +14 -11
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
- package/src/__tests__/tool-result-truncation.test.ts +3 -1
- package/src/__tests__/tools-audio-read.test.ts +113 -0
- package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
- package/src/__tests__/turn-events-store.test.ts +11 -7
- package/src/__tests__/twilio-routes.test.ts +3 -2
- package/src/__tests__/validate-input.test.ts +381 -0
- package/src/__tests__/verification-control-plane-policy.test.ts +1 -0
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +10 -7
- package/src/__tests__/voice-session-bridge.test.ts +50 -35
- package/src/__tests__/workspace-migration-090-memory-router-cost-optimized-profile.test.ts +326 -0
- package/src/__tests__/workspace-migration-091-retighten-migration-onboarding-thread.test.ts +166 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
- package/src/acp/prepare-agent-env.ts +52 -11
- package/src/acp/session-manager.ts +5 -6
- package/src/agent/compaction-circuit.ts +140 -0
- package/src/agent/loop.ts +489 -85
- package/src/api/README.md +126 -2
- package/src/api/constants/call-sites.ts +27 -0
- package/src/api/constants/tool-execution.ts +21 -0
- package/src/api/events/assistant-activity-state.ts +75 -0
- package/src/api/events/assistant-outbound-attachment.ts +49 -0
- package/src/api/events/assistant-text-delta.ts +30 -0
- package/src/api/events/assistant-turn-start.ts +31 -0
- package/src/api/events/avatar-updated.ts +24 -0
- package/src/api/events/compaction-circuit-closed.ts +26 -0
- package/src/api/events/compaction-circuit-open.ts +28 -0
- package/src/api/events/confirmation-request.ts +114 -0
- package/src/api/events/contact-request.ts +33 -0
- package/src/api/events/conversation-error.ts +77 -0
- package/src/api/events/conversation-list-invalidated.ts +38 -0
- package/src/api/events/conversation-title-updated.ts +24 -0
- package/src/api/events/disk-pressure-status-changed.ts +61 -0
- package/src/api/events/document-comment-created.ts +44 -0
- package/src/api/events/document-comment-deleted.ts +22 -0
- package/src/api/events/document-comment-reopened.ts +23 -0
- package/src/api/events/document-comment-resolved.ts +25 -0
- package/src/api/events/document-editor-update.ts +27 -0
- package/src/api/events/error.ts +32 -0
- package/src/api/events/generation-cancelled.ts +22 -0
- package/src/api/events/generation-handoff.ts +39 -0
- package/src/api/events/home-feed-updated.ts +26 -0
- package/src/api/events/identity-changed.ts +32 -0
- package/src/api/events/interaction-resolved.ts +50 -0
- package/src/api/events/message-complete.ts +40 -0
- package/src/api/events/message-dequeued.ts +21 -0
- package/src/api/events/message-queued-deleted.ts +23 -0
- package/src/api/events/message-queued.ts +22 -0
- package/src/api/events/message-request-complete.ts +29 -0
- package/src/api/events/navigate-settings.ts +20 -0
- package/src/api/events/notification-intent.ts +33 -0
- package/src/api/events/open-url.ts +28 -0
- package/src/api/events/question-request.ts +67 -0
- package/src/{events → api/events}/relationship-state-updated.ts +6 -8
- package/src/api/events/secret-request.ts +42 -0
- package/src/api/events/subagent-event.ts +79 -0
- package/src/api/events/subagent-spawned.ts +40 -0
- package/src/api/events/subagent-status-changed.ts +65 -0
- package/src/api/events/sync-changed.ts +29 -0
- package/src/api/events/tool-result.ts +129 -0
- package/src/api/events/tool-use-start.ts +30 -0
- package/src/api/events/turn-profile-auto-routed.ts +28 -0
- package/src/api/events/ui-surface-complete.ts +30 -0
- package/src/api/events/ui-surface-dismiss.ts +22 -0
- package/src/api/events/ui-surface-show.ts +67 -0
- package/src/api/events/ui-surface-update.ts +26 -0
- package/src/api/events/usage-update.ts +34 -0
- package/src/api/events/user-message-echo.ts +35 -0
- package/src/api/index.ts +482 -3
- package/src/api/requests/dictation.ts +45 -0
- package/src/api/responses/disk-pressure-status.ts +26 -0
- package/src/api/responses/home.ts +217 -0
- package/src/api/responses/llm-context-response.ts +41 -0
- package/src/api/responses/llm-request-log-entry.ts +93 -0
- package/src/api/responses/memory-recall-log.ts +65 -0
- package/src/api/responses/memory-v2-activation-log.ts +78 -0
- package/src/api/responses/memory-v3-selection-log.ts +50 -0
- package/src/api/responses/subagent-detail.ts +48 -0
- package/src/approvals/guardian-decision-primitive.ts +7 -15
- package/src/approvals/guardian-request-resolvers.ts +6 -9
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +193 -0
- package/src/avatar/avatar-manifest.ts +195 -0
- package/src/avatar/avatar-store.ts +113 -0
- package/src/avatar/traits-png-sync.ts +8 -2
- package/src/background-wake/background-wake-routes.test.ts +687 -52
- package/src/background-wake/next-wake.test.ts +31 -1
- package/src/background-wake/next-wake.ts +4 -1
- package/src/background-wake/platform-client.test.ts +308 -0
- package/src/background-wake/platform-client.ts +167 -0
- package/src/background-wake/publisher.ts +91 -0
- package/src/background-wake/runtime-registry.ts +2 -2
- package/src/background-wake/wake-intent-hooks.test.ts +282 -0
- package/src/calls/call-conversation-messages.ts +6 -4
- package/src/calls/guardian-action-sweep.ts +6 -4
- package/src/calls/guardian-dispatch.ts +1 -0
- package/src/calls/relay-server.ts +12 -8
- package/src/calls/voice-session-bridge.ts +17 -31
- package/src/cli/commands/__tests__/conversations-slack.test.ts +16 -0
- package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
- package/src/cli/commands/__tests__/notifications.test.ts +184 -40
- package/src/cli/commands/avatar.ts +17 -11
- package/src/cli/commands/channels/__tests__/channels.test.ts +143 -0
- package/src/cli/commands/channels/index.ts +229 -0
- package/src/cli/commands/conversations.ts +15 -1
- package/src/cli/commands/db/__tests__/repair.test.ts +540 -0
- package/src/cli/commands/db/__tests__/status.test.ts +253 -0
- package/src/cli/commands/db/format.ts +48 -0
- package/src/cli/commands/db/index.ts +29 -0
- package/src/cli/commands/db/repair-step-conversation-backfill.ts +345 -0
- package/src/cli/commands/db/repair-step-integrity.ts +146 -0
- package/src/cli/commands/db/repair-steps.ts +164 -0
- package/src/cli/commands/db/repair.ts +141 -0
- package/src/cli/commands/db/status.ts +366 -0
- package/src/cli/commands/memory-v3.ts +168 -203
- package/src/cli/commands/notifications.ts +365 -55
- package/src/cli/lib/cli-colors.ts +24 -6
- package/src/cli/lib/open-browser.ts +7 -2
- package/src/cli/program.ts +6 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +25 -44
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
- package/src/config/bundled-skills/document-editor/SKILL.md +5 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +2 -2
- package/src/config/bundled-skills/schedule/TOOLS.json +10 -2
- package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -0
- package/src/config/call-site-defaults.ts +3 -8
- package/src/config/feature-flag-cache.ts +86 -0
- package/src/config/feature-flag-registry.json +42 -26
- package/src/config/llm-context-resolution.ts +10 -1
- package/src/config/llm-resolver.ts +121 -15
- package/src/config/loader.ts +4 -5
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -211
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/heartbeat.ts +1 -1
- package/src/config/schemas/llm.ts +92 -4
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +0 -227
- package/src/config/schemas/memory-v3.ts +39 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/services.ts +6 -2
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/config/seed-inference-profiles.ts +36 -16
- package/src/context/compactor.ts +54 -31
- package/src/context/token-estimator.ts +29 -5
- package/src/context/tool-result-truncation.ts +1 -43
- package/src/context/window-manager.ts +138 -20
- package/src/credential-execution/executable-discovery.ts +40 -0
- package/src/credential-execution/process-manager.ts +6 -2
- package/src/credential-health/credential-health-service.ts +125 -40
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -6
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +15 -17
- package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -2
- package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -0
- package/src/daemon/__tests__/meet-manifest-loader.test.ts +25 -12
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +1 -0
- package/src/daemon/__tests__/switch-inference-profile-tool.test.ts +107 -0
- package/src/daemon/__tests__/web-search-status-text.test.ts +11 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +613 -155
- package/src/daemon/conversation-agent-loop.ts +409 -605
- package/src/daemon/conversation-error.ts +40 -12
- package/src/daemon/conversation-history.ts +22 -6
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +10 -38
- package/src/daemon/conversation-messaging.ts +83 -44
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +174 -116
- package/src/daemon/conversation-runtime-assembly.ts +76 -30
- package/src/daemon/conversation-skill-tools.ts +14 -30
- package/src/daemon/conversation-store.ts +6 -5
- package/src/daemon/conversation-surfaces.ts +124 -103
- package/src/daemon/conversation-tool-setup.ts +36 -48
- package/src/daemon/conversation.ts +111 -166
- package/src/daemon/daemon-control.ts +1 -1
- package/src/daemon/daemon-skill-host.ts +7 -4
- package/src/daemon/disk-pressure-guard.ts +54 -50
- package/src/daemon/external-plugins-bootstrap.ts +46 -24
- package/src/daemon/first-greeting.ts +53 -13
- package/src/daemon/guardian-action-generators.ts +2 -2
- package/src/daemon/handlers/conversations.ts +6 -22
- package/src/daemon/handlers/shared.ts +10 -1
- package/src/daemon/handlers/skills.ts +15 -14
- package/src/daemon/host-app-control-proxy.ts +54 -1
- package/src/daemon/host-cu-proxy.ts +46 -22
- package/src/daemon/host-file-proxy.ts +25 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -6
- package/src/daemon/lifecycle.ts +40 -67
- package/src/daemon/mcp-reload-service.ts +1 -1
- package/src/daemon/meet-manifest-loader.ts +10 -17
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- package/src/daemon/message-types/contacts.ts +3 -20
- package/src/daemon/message-types/conversations.ts +25 -125
- package/src/daemon/message-types/document-comments.ts +8 -44
- package/src/daemon/message-types/documents.ts +3 -9
- package/src/daemon/message-types/home.ts +5 -18
- package/src/daemon/message-types/integrations.ts +4 -13
- package/src/daemon/message-types/messages.ts +47 -377
- package/src/daemon/message-types/notifications.ts +2 -32
- package/src/daemon/message-types/settings.ts +3 -8
- package/src/daemon/message-types/skills.ts +2 -0
- package/src/daemon/message-types/subagents.ts +6 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- package/src/daemon/process-message.ts +58 -55
- package/src/daemon/providers-setup.ts +1 -1
- package/src/daemon/server.ts +28 -0
- package/src/daemon/switch-inference-profile-tool.ts +13 -3
- package/src/daemon/tool-setup-types.ts +0 -6
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +21 -1
- package/src/documents/document-store.ts +38 -0
- package/src/export/__tests__/transcript-formatter.test.ts +1 -0
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +31 -0
- package/src/heartbeat/heartbeat-run-store.ts +31 -0
- package/src/heartbeat/heartbeat-service.ts +79 -0
- package/src/home/__tests__/feed-writer.test.ts +161 -0
- package/src/home/__tests__/post-connect-feed.test.ts +1 -0
- package/src/home/__tests__/suggested-prompts.test.ts +55 -59
- package/src/home/feature-gate.ts +22 -0
- package/src/home/feed-types.ts +36 -221
- package/src/home/feed-writer.ts +146 -7
- package/src/home/suggested-prompts.ts +27 -145
- package/src/ipc/__tests__/cli-ipc.test.ts +1 -0
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- package/src/ipc/gateway-client.test.ts +4 -1
- package/src/ipc/routes/__tests__/route-adapter.test.ts +244 -0
- package/src/ipc/routes/route-adapter.ts +45 -6
- package/src/ipc/skill-routes/__tests__/memory.test.ts +19 -9
- package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
- package/src/ipc/skill-routes/__tests__/registries.test.ts +59 -20
- package/src/ipc/skill-routes/memory.ts +27 -13
- package/src/ipc/skill-routes/providers.ts +5 -6
- package/src/ipc/skill-routes/registries.ts +39 -88
- package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
- package/src/memory/__tests__/conversation-queries.test.ts +192 -8
- package/src/memory/__tests__/db-maintenance.test.ts +128 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +1 -0
- package/src/memory/__tests__/jobs-store-job-classes.test.ts +5 -4
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +26 -5
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +1 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +11 -6
- package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +1 -0
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +31 -0
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/memory/context-search/agent-runner.ts +2 -4
- package/src/memory/conversation-attention-store.ts +17 -3
- package/src/memory/conversation-crud.ts +386 -115
- package/src/memory/conversation-queries.ts +78 -22
- package/src/memory/db-connection.ts +29 -19
- package/src/memory/db-init.ts +12 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/db-singleton.ts +77 -0
- package/src/memory/delivery-channels.ts +82 -0
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +2 -4
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +41 -8
- package/src/memory/graph/extraction.ts +6 -9
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.test.ts +3 -3
- package/src/memory/graph/retriever.ts +20 -26
- package/src/memory/graph/tools.ts +4 -4
- package/src/memory/job-handlers/conversation-starters.ts +32 -32
- package/src/memory/job-handlers/embedding.test.ts +3 -2
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +5 -2
- package/src/memory/jobs-store.ts +3 -1
- package/src/memory/jobs-worker.ts +63 -40
- package/src/memory/llm-request-log-source-clickhouse.ts +55 -1
- package/src/memory/llm-request-log-source-local.ts +13 -0
- package/src/memory/llm-request-log-source.ts +21 -6
- package/src/memory/llm-request-log-store.ts +147 -3
- package/src/memory/llm-usage-store.ts +10 -0
- package/src/memory/memory-marker.ts +17 -0
- package/src/memory/memory-retrospective-job.ts +6 -2
- package/src/memory/memory-v2-activation-log-store.ts +13 -1
- package/src/memory/migrations/265-drop-provider-connection-status.ts +26 -0
- package/src/memory/migrations/266-messages-client-message-id.ts +43 -0
- package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
- package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
- package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
- package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
- package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/schema/conversations.ts +9 -1
- package/src/memory/schema/inference.ts +0 -1
- package/src/memory/schema/infrastructure.ts +11 -0
- package/src/memory/v2/__tests__/backfill-jobs.test.ts +5 -2
- package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
- package/src/memory/v2/__tests__/harness-metrics.test.ts +9 -0
- package/src/memory/v2/__tests__/harness-replay-input.test.ts +9 -4
- package/src/memory/v2/__tests__/harness-runner.test.ts +26 -0
- package/src/memory/v2/__tests__/migration.test.ts +11 -3
- package/src/memory/v2/__tests__/page-index.test.ts +37 -1
- package/src/memory/v2/__tests__/router.test.ts +14 -4
- package/src/memory/v2/__tests__/sweep-job.test.ts +9 -5
- package/src/memory/v2/backfill-jobs.ts +6 -0
- package/src/memory/v2/consolidation-job.ts +89 -9
- package/src/memory/v2/harness/metrics.ts +5 -1
- package/src/memory/v2/harness/replay-input.ts +19 -3
- package/src/memory/v2/harness/runner.ts +6 -0
- package/src/memory/v2/harness/trace.ts +6 -0
- package/src/memory/v2/migration.ts +5 -3
- package/src/memory/v2/page-index.ts +11 -0
- package/src/memory/v2/router.ts +8 -11
- package/src/memory/v2/sweep-job.ts +8 -11
- package/src/memory/v2/types.ts +1 -0
- package/src/memory/v3/__tests__/assign.test.ts +242 -0
- package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
- package/src/memory/v3/__tests__/core.test.ts +39 -0
- package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
- package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
- package/src/memory/v3/__tests__/health.test.ts +203 -0
- package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
- package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
- package/src/memory/v3/__tests__/needle.test.ts +107 -0
- package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
- package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
- package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
- package/src/memory/v3/__tests__/router.test.ts +260 -0
- package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
- package/src/memory/v3/__tests__/selector.test.ts +404 -0
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
- package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
- package/src/memory/v3/__tests__/tree.test.ts +192 -0
- package/src/memory/v3/__tests__/types.test.ts +54 -0
- package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
- package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/memory/v3/assign.ts +268 -0
- package/src/memory/v3/capabilities.ts +124 -0
- package/src/memory/v3/core.ts +26 -0
- package/src/memory/v3/data/README.md +84 -0
- package/src/memory/v3/data/assignments.json +5 -0
- package/src/memory/v3/data/core.json +1 -0
- package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
- package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
- package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +314 -0
- package/src/memory/v3/needle.ts +115 -0
- package/src/memory/v3/orchestrate.ts +114 -0
- package/src/memory/v3/page-content.ts +34 -0
- package/src/memory/v3/provider-blocks.ts +16 -0
- package/src/memory/v3/reconcile.ts +523 -0
- package/src/memory/v3/render-injection.ts +32 -0
- package/src/memory/v3/router.ts +184 -0
- package/src/memory/v3/selection-log-store.ts +84 -0
- package/src/memory/v3/selector.ts +211 -0
- package/src/memory/v3/shadow-plugin.ts +379 -0
- package/src/memory/v3/snapshot.ts +209 -0
- package/src/memory/v3/tree.ts +174 -0
- package/src/memory/v3/types.ts +46 -60
- package/src/memory/v3/working-set.ts +88 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
- package/src/messaging/providers/slack/render-transcript.ts +2 -2
- package/src/messaging/style-analyzer.ts +8 -11
- package/src/notifications/__tests__/emit-signal-home-feed.test.ts +1 -0
- package/src/notifications/__tests__/home-feed-side-effect.test.ts +1 -0
- package/src/notifications/adapters/slack.ts +45 -11
- package/src/notifications/broadcaster.ts +114 -63
- package/src/notifications/conversation-pairing.ts +30 -8
- package/src/notifications/decision-engine.ts +10 -13
- package/src/notifications/decisions-store.ts +32 -1
- package/src/notifications/deliveries-store.ts +45 -0
- package/src/notifications/edit-notification.ts +201 -0
- package/src/notifications/emit-signal.ts +11 -1
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/notifications/signal.ts +10 -0
- package/src/notifications/types.ts +37 -0
- package/src/oauth/byo-connection.test.ts +67 -3
- package/src/oauth/byo-connection.ts +32 -5
- package/src/oauth/connect-orchestrator.ts +9 -0
- package/src/oauth/connection-resolver.test.ts +76 -0
- package/src/oauth/connection-resolver.ts +49 -10
- package/src/oauth/manual-token-connection.ts +51 -3
- package/src/oauth/seed-providers.ts +3 -0
- package/src/permissions/approval-policy.test.ts +19 -5
- package/src/permissions/approval-policy.ts +14 -3
- package/src/permissions/checker.ts +21 -8
- package/src/permissions/prompter.ts +42 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/platform/client.test.ts +24 -1
- package/src/platform/client.ts +8 -0
- package/src/platform/feature-gate.ts +15 -0
- package/src/plugin-api/index.ts +2 -0
- package/src/plugin-api/types.ts +25 -3
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
- package/src/plugins/defaults/circuit-breaker/package.json +15 -0
- package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +35 -0
- package/src/plugins/defaults/compaction/terminal.ts +73 -0
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +28 -0
- package/src/plugins/defaults/empty-response/terminal.ts +106 -0
- package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/history-repair/package.json +15 -0
- package/src/plugins/defaults/history-repair/register.ts +24 -0
- package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
- package/src/plugins/defaults/index.ts +29 -40
- package/src/plugins/defaults/injectors/package.json +15 -0
- package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +16 -46
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
- package/src/plugins/defaults/llm-call/package.json +15 -0
- package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
- package/src/plugins/defaults/memory-retrieval/package.json +15 -0
- package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
- package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
- package/src/plugins/defaults/overflow-reduce/package.json +15 -0
- package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
- package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
- package/src/plugins/defaults/persistence/package.json +15 -0
- package/src/plugins/defaults/persistence/register.ts +38 -0
- package/src/plugins/defaults/persistence/terminal.ts +83 -0
- package/src/plugins/defaults/title-generate/package.json +15 -0
- package/src/plugins/defaults/title-generate/register.ts +35 -0
- package/src/plugins/defaults/title-generate/terminal.ts +31 -0
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
- package/src/plugins/defaults/token-estimate/package.json +15 -0
- package/src/plugins/defaults/token-estimate/register.ts +34 -0
- package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +35 -0
- package/src/plugins/defaults/tool-error/terminal.ts +47 -0
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
- package/src/plugins/defaults/tool-execute/package.json +15 -0
- package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
- package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +0 -12
- package/src/plugins/types.ts +107 -102
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +0 -1
- package/src/proactive-artifact/job.test.ts +21 -8
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/__tests__/system-prompt.test.ts +4 -4
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/system-prompt.ts +38 -40
- package/src/prompts/template-detection.ts +10 -4
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +10 -10
- package/src/prompts/templates/IDENTITY.md +0 -2
- package/src/prompts/templates/system-sections.ts +6 -0
- package/src/providers/__tests__/connection-model-compat.test.ts +3 -4
- package/src/providers/__tests__/registry-native-web-search.test.ts +122 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -25
- package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
- package/src/providers/anthropic/client.ts +24 -5
- package/src/providers/call-site-routing.ts +34 -18
- package/src/providers/connection-model-compat.ts +23 -0
- package/src/providers/connection-resolution.ts +39 -20
- package/src/providers/fireworks/client.ts +1 -0
- package/src/providers/gemini/client.ts +176 -37
- package/src/providers/gemini/inline-media.ts +74 -0
- package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +0 -2
- package/src/providers/inference/__tests__/base-url-security.test.ts +2 -3
- package/src/providers/inference/__tests__/{connections-status-label.test.ts → connections-label.test.ts} +12 -111
- package/src/providers/inference/auth.ts +0 -8
- package/src/providers/inference/connections.ts +3 -66
- package/src/providers/inference/resolve-auth.ts +2 -3
- package/src/providers/model-catalog.ts +35 -1
- package/src/providers/model-intents.ts +3 -3
- package/src/providers/openai/__tests__/api-error-detail.test.ts +120 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +157 -7
- package/src/providers/openai/chat-completions-provider.ts +111 -16
- package/src/providers/openai/codex-models.ts +2 -0
- package/src/providers/openai/responses-provider.ts +54 -57
- package/src/providers/openrouter/client.ts +14 -14
- package/src/providers/provider-send-message.ts +23 -14
- package/src/providers/ratelimit.ts +1 -9
- package/src/providers/registry.ts +48 -8
- package/src/providers/retry.ts +16 -9
- package/src/providers/search-provider-catalog.ts +17 -9
- package/src/providers/types.ts +20 -2
- package/src/providers/usage-tracking.ts +1 -9
- package/src/runtime/__tests__/agent-wake.test.ts +132 -26
- package/src/runtime/__tests__/background-job-runner.test.ts +2 -3
- package/src/runtime/access-request-helper.ts +1 -0
- package/src/runtime/agent-wake.ts +93 -18
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
- package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
- package/src/runtime/auth/route-policy.ts +42 -1069
- package/src/runtime/background-job-runner.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -1
- package/src/runtime/channel-approvals.ts +3 -14
- package/src/runtime/channel-invite-transport.ts +5 -6
- package/src/runtime/channel-readiness-service.ts +70 -5
- package/src/runtime/channel-reply-delivery.ts +23 -0
- package/src/runtime/channel-retry-sweep.ts +59 -30
- package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
- package/src/runtime/conversation-stream-state.ts +294 -0
- package/src/runtime/http-router.ts +19 -22
- package/src/runtime/http-types.ts +12 -6
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/migrations/vbundle-builder.ts +3 -2
- package/src/runtime/pending-interactions.ts +2 -2
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- package/src/runtime/routes/__tests__/bookmark-routes.test.ts +1 -0
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +436 -0
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -0
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/home-feed-routes.test.ts +209 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +26 -72
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +58 -5
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
- package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +3 -2
- package/src/runtime/routes/__tests__/stt-routes.test.ts +3 -3
- package/src/runtime/routes/__tests__/suggest-trust-rule-routes.test.ts +5 -2
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +294 -0
- package/src/runtime/routes/__tests__/task-routes.test.ts +48 -3
- package/src/runtime/routes/__tests__/tts-routes.test.ts +3 -3
- package/src/runtime/routes/acp-routes-list.test.ts +3 -0
- package/src/runtime/routes/acp-routes.test.ts +97 -75
- package/src/runtime/routes/acp-routes.ts +29 -6
- package/src/runtime/routes/app-management-routes.ts +208 -28
- package/src/runtime/routes/app-routes.ts +25 -5
- package/src/runtime/routes/approval-routes.ts +16 -4
- package/src/runtime/routes/attachment-routes.ts +25 -1
- package/src/runtime/routes/audio-routes.ts +1 -0
- package/src/runtime/routes/audit-routes.ts +5 -0
- package/src/runtime/routes/auth-routes.ts +5 -0
- package/src/runtime/routes/avatar-routes.ts +238 -59
- package/src/runtime/routes/background-tool-routes.ts +9 -0
- package/src/runtime/routes/background-wake-routes.ts +201 -23
- package/src/runtime/routes/backup-routes.ts +45 -0
- package/src/runtime/routes/bookmark-routes.ts +13 -0
- package/src/runtime/routes/brain-graph-routes.ts +9 -0
- package/src/runtime/routes/browser-routes.ts +5 -0
- package/src/runtime/routes/browser-tabs-routes.ts +5 -0
- package/src/runtime/routes/btw-routes.ts +9 -5
- package/src/runtime/routes/cache-routes.ts +13 -0
- package/src/runtime/routes/call-routes.ts +21 -10
- package/src/runtime/routes/channel-availability-routes.ts +5 -1
- package/src/runtime/routes/channel-readiness-routes.ts +37 -4
- package/src/runtime/routes/channel-route-definitions.ts +21 -0
- package/src/runtime/routes/channel-verification-routes.ts +21 -0
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
- package/src/runtime/routes/client-routes.ts +9 -0
- package/src/runtime/routes/consolidation-routes.ts +13 -5
- package/src/runtime/routes/contact-prompt-routes.ts +9 -0
- package/src/runtime/routes/contact-routes.ts +90 -23
- package/src/runtime/routes/content-source-routes.ts +5 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +11 -1
- package/src/runtime/routes/conversation-attention-routes.ts +5 -0
- package/src/runtime/routes/conversation-cli-routes.ts +54 -7
- package/src/runtime/routes/conversation-compaction-routes.ts +292 -0
- package/src/runtime/routes/conversation-list-routes.ts +225 -9
- package/src/runtime/routes/conversation-management-routes.ts +96 -28
- package/src/runtime/routes/conversation-query-routes.ts +148 -51
- package/src/runtime/routes/conversation-routes.ts +259 -158
- package/src/runtime/routes/conversation-starter-routes.ts +22 -13
- package/src/runtime/routes/conversations-import-routes.ts +25 -7
- package/src/runtime/routes/credential-prompt-routes.ts +5 -0
- package/src/runtime/routes/credential-routes.ts +25 -6
- package/src/runtime/routes/debug-bash-routes.ts +5 -0
- package/src/runtime/routes/debug-routes.ts +11 -2
- package/src/runtime/routes/defer-routes.ts +13 -0
- package/src/runtime/routes/diagnostics-routes.ts +37 -46
- package/src/runtime/routes/disk-pressure-routes.ts +17 -31
- package/src/runtime/routes/document-comments-routes.ts +46 -27
- package/src/runtime/routes/documents-routes.ts +31 -11
- package/src/runtime/routes/domain-routes.ts +61 -28
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/events-routes.ts +114 -9
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +5 -0
- package/src/runtime/routes/global-search-routes.ts +53 -50
- package/src/runtime/routes/group-routes.ts +32 -5
- package/src/runtime/routes/guardian-action-routes.ts +9 -0
- package/src/runtime/routes/guardian-approval-interception.ts +0 -31
- package/src/runtime/routes/heartbeat-routes.ts +25 -9
- package/src/runtime/routes/home-feed-routes.ts +149 -16
- package/src/runtime/routes/home-state-routes.ts +8 -40
- package/src/runtime/routes/host-app-control-routes.ts +5 -0
- package/src/runtime/routes/host-bash-routes.ts +5 -0
- package/src/runtime/routes/host-browser-routes.ts +13 -0
- package/src/runtime/routes/host-cu-routes.ts +5 -0
- package/src/runtime/routes/host-file-routes.ts +26 -6
- package/src/runtime/routes/host-transfer-routes.ts +13 -2
- package/src/runtime/routes/http-adapter.ts +1 -2
- package/src/runtime/routes/identity-intro-cache.ts +72 -16
- package/src/runtime/routes/identity-routes.ts +42 -11
- package/src/runtime/routes/image-generation-routes.ts +5 -0
- package/src/runtime/routes/inbound-message-handler.ts +15 -11
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +524 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +72 -27
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/inference-profile-session-routes.ts +13 -3
- package/src/runtime/routes/inference-provider-connection-routes.ts +26 -31
- package/src/runtime/routes/inference-send-routes.ts +11 -11
- package/src/runtime/routes/integrations/a2a.ts +30 -7
- package/src/runtime/routes/integrations/slack/channel.ts +19 -3
- package/src/runtime/routes/integrations/slack/share.ts +9 -2
- package/src/runtime/routes/integrations/telegram.ts +28 -9
- package/src/runtime/routes/integrations/twilio.ts +35 -7
- package/src/runtime/routes/integrations/vercel.ts +18 -3
- package/src/runtime/routes/internal-oauth-routes.ts +5 -0
- package/src/runtime/routes/internal-twilio-routes.ts +13 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
- package/src/runtime/routes/llm-context-normalization.ts +7 -2
- package/src/runtime/routes/log-export-routes.ts +28 -10
- package/src/runtime/routes/mcp-auth-routes.ts +25 -0
- package/src/runtime/routes/memory-item-routes.ts +21 -10
- package/src/runtime/routes/memory-v2-routes.ts +90 -36
- package/src/runtime/routes/memory-v3-routes.ts +283 -259
- package/src/runtime/routes/migration-rollback-routes.ts +5 -1
- package/src/runtime/routes/migration-routes.ts +49 -13
- package/src/runtime/routes/notification-routes.ts +80 -2
- package/src/runtime/routes/oauth-apps.ts +33 -11
- package/src/runtime/routes/oauth-commands-routes.ts +43 -15
- package/src/runtime/routes/oauth-connect-routes.ts +9 -0
- package/src/runtime/routes/oauth-lifecycle-routes.ts +5 -1
- package/src/runtime/routes/oauth-providers.ts +35 -10
- package/src/runtime/routes/platform-routes.ts +21 -0
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
- package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
- package/src/runtime/routes/playground/force-compact.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +0 -1
- package/src/runtime/routes/playground/inject-failures.ts +13 -8
- package/src/runtime/routes/playground/reset-circuit.ts +14 -9
- package/src/runtime/routes/playground/seed-conversation.ts +1 -1
- package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
- package/src/runtime/routes/playground/state.ts +4 -3
- package/src/runtime/routes/plugins-routes.ts +22 -19
- package/src/runtime/routes/profiler-routes.ts +17 -4
- package/src/runtime/routes/ps-routes.ts +5 -0
- package/src/runtime/routes/publish-routes.ts +13 -3
- package/src/runtime/routes/question-routes.ts +5 -0
- package/src/runtime/routes/recording-routes.ts +25 -12
- package/src/runtime/routes/rename-conversation-routes.ts +5 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +137 -47
- package/src/runtime/routes/secret-routes.ts +17 -4
- package/src/runtime/routes/sequence-routes.ts +33 -0
- package/src/runtime/routes/settings-routes.ts +65 -19
- package/src/runtime/routes/skills-routes.ts +133 -69
- package/src/runtime/routes/slack-channel-routes.ts +5 -0
- package/src/runtime/routes/stt-routes.ts +13 -6
- package/src/runtime/routes/subagents-routes.ts +24 -18
- package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
- package/src/runtime/routes/surface-action-routes.ts +10 -38
- package/src/runtime/routes/surface-content-routes.ts +21 -6
- package/src/runtime/routes/surface-conversation-resolver.ts +65 -0
- package/src/runtime/routes/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- package/src/runtime/routes/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +5 -0
- package/src/runtime/routes/tts-routes.ts +13 -6
- package/src/runtime/routes/types.ts +17 -8
- package/src/runtime/routes/ui-request-routes.ts +5 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
- package/src/runtime/routes/usage-routes.ts +71 -3
- package/src/runtime/routes/user-routes-cli.ts +9 -0
- package/src/runtime/routes/user-routes.ts +5 -1
- package/src/runtime/routes/wake-conversation-routes.ts +5 -0
- package/src/runtime/routes/watcher-routes.ts +21 -0
- package/src/runtime/routes/webhook-routes.ts +9 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +8 -0
- package/src/runtime/routes/work-items-routes.ts +47 -19
- package/src/runtime/routes/workspace-commit-routes.ts +5 -0
- package/src/runtime/routes/workspace-routes.test.ts +42 -0
- package/src/runtime/routes/workspace-routes.ts +120 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +4 -4
- package/src/runtime/services/analyze-conversation.ts +3 -6
- package/src/runtime/services/conversation-serializer.ts +24 -2
- package/src/runtime/slack-dm-text-delivery.ts +177 -0
- package/src/runtime/sync/resource-sync-events.ts +17 -3
- package/src/runtime/sync/sync-publisher.ts +2 -2
- package/src/runtime/tool-grant-request-helper.ts +1 -0
- package/src/schedule/run-script.ts +28 -3
- package/src/schedule/schedule-store.ts +16 -1
- package/src/schedule/scheduler.ts +114 -16
- package/src/security/__tests__/provider-key-env-fallback.test.ts +3 -3
- package/src/security/encrypted-store.ts +7 -16
- package/src/security/store-path-override.ts +61 -0
- package/src/signals/user-message.ts +10 -16
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/clawhub-files.ts +2 -0
- package/src/skills/skillssh-files.ts +2 -0
- package/src/skills/validate-input.ts +177 -0
- package/src/subagent/manager.ts +16 -19
- package/src/subagent/types.ts +6 -0
- package/src/tasks/tool-sanitizer.ts +2 -2
- package/src/telemetry/types.ts +26 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
- package/src/telemetry/usage-telemetry-reporter.ts +31 -0
- package/src/tools/acp/spawn.test.ts +88 -38
- package/src/tools/apps/definitions.ts +42 -24
- package/src/tools/ask-question/ask-question-tool.test.ts +120 -105
- package/src/tools/ask-question/ask-question-tool.ts +85 -90
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +2 -8
- package/src/tools/computer-use/definitions.ts +295 -289
- package/src/tools/credential-execution/make-authenticated-request.ts +56 -51
- package/src/tools/credential-execution/manage-secure-command-tool.ts +2 -2
- package/src/tools/credential-execution/run-authenticated-command.ts +82 -77
- package/src/tools/credentials/vault.ts +112 -111
- package/src/tools/document/document-tool.ts +131 -8
- package/src/tools/execution-target.ts +3 -6
- package/src/tools/execution-timeout.ts +3 -4
- package/src/tools/executor.ts +18 -55
- package/src/tools/filesystem/edit.ts +45 -42
- package/src/tools/filesystem/list.ts +33 -30
- package/src/tools/filesystem/read.ts +54 -35
- package/src/tools/filesystem/write.ts +34 -31
- package/src/tools/host-filesystem/edit.test.ts +1 -0
- package/src/tools/host-filesystem/edit.ts +44 -42
- package/src/tools/host-filesystem/read.test.ts +1 -0
- package/src/tools/host-filesystem/read.ts +49 -35
- package/src/tools/host-filesystem/transfer.test.ts +31 -6
- package/src/tools/host-filesystem/transfer.ts +121 -108
- package/src/tools/host-filesystem/write.test.ts +1 -0
- package/src/tools/host-filesystem/write.ts +33 -31
- package/src/tools/host-terminal/host-shell.ts +50 -48
- package/src/tools/mcp/mcp-tool-factory.ts +0 -2
- package/src/tools/memory/register.ts +23 -24
- package/src/tools/network/__tests__/managed-search-proxy.test.ts +282 -0
- package/src/tools/network/__tests__/web-search.test.ts +211 -3
- package/src/tools/network/managed-search-proxy.ts +183 -0
- package/src/tools/network/web-fetch.ts +49 -46
- package/src/tools/network/web-search.ts +215 -57
- package/src/tools/policy-context.ts +3 -1
- package/src/tools/registry.ts +184 -118
- package/src/tools/schedule/create.ts +12 -1
- package/src/tools/schedule/update.ts +16 -0
- package/src/tools/shared/filesystem/audio-read.ts +122 -0
- package/src/tools/shared/filesystem/image-read.ts +1 -1
- package/src/tools/skills/execute.ts +34 -31
- package/src/tools/skills/load.ts +29 -23
- package/src/tools/skills/skill-tool-factory.ts +17 -36
- package/src/tools/subagent/notify-parent.ts +35 -32
- package/src/tools/subagent/spawn.ts +3 -0
- package/src/tools/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- package/src/tools/terminal/shell.ts +190 -61
- package/src/tools/tool-approval-handler.ts +10 -4
- package/src/tools/tool-defaults.ts +20 -9
- package/src/tools/tool-manifest.ts +4 -4
- package/src/tools/tool-name-aliases.ts +72 -14
- package/src/tools/types.ts +86 -33
- package/src/tools/ui-surface/definitions.ts +166 -94
- package/src/types/onboarding-context.ts +6 -0
- package/src/usage/attribution.ts +32 -1
- package/src/usage/types.ts +10 -0
- package/src/util/browser.ts +7 -2
- package/src/util/errors.ts +2 -2
- package/src/util/map-limit.ts +27 -0
- package/src/util/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
- package/src/workspace/migrations/090-memory-router-cost-optimized-profile.ts +109 -0
- package/src/workspace/migrations/091-retighten-migration-onboarding-thread.ts +41 -0
- package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
- package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
- package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
- package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
- package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
- package/src/workspace/migrations/registry.ts +10 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
- package/src/cli/commands/memory-v3-render.ts +0 -344
- package/src/daemon/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
- package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -468
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
- package/src/memory/v3/__tests__/edges.test.ts +0 -563
- package/src/memory/v3/__tests__/filter.test.ts +0 -512
- package/src/memory/v3/__tests__/gate.test.ts +0 -574
- package/src/memory/v3/__tests__/index-composition.test.ts +0 -233
- package/src/memory/v3/__tests__/loop.test.ts +0 -530
- package/src/memory/v3/__tests__/retriever.test.ts +0 -226
- package/src/memory/v3/__tests__/scouts.test.ts +0 -440
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -312
- package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
- package/src/memory/v3/__tests__/traversal.test.ts +0 -469
- package/src/memory/v3/__tests__/tree-index.test.ts +0 -280
- package/src/memory/v3/__tests__/tree-store.test.ts +0 -529
- package/src/memory/v3/__tests__/tree-walk.test.ts +0 -707
- package/src/memory/v3/__tests__/validate.test.ts +0 -245
- package/src/memory/v3/auto-edges.ts +0 -223
- package/src/memory/v3/coactivation-store.ts +0 -124
- package/src/memory/v3/consolidation-job.ts +0 -323
- package/src/memory/v3/edge-learning-job.ts +0 -160
- package/src/memory/v3/edges.ts +0 -249
- package/src/memory/v3/filter.ts +0 -281
- package/src/memory/v3/gate.ts +0 -334
- package/src/memory/v3/index-composition.ts +0 -113
- package/src/memory/v3/llm-capture.ts +0 -46
- package/src/memory/v3/loop.ts +0 -382
- package/src/memory/v3/maintenance.ts +0 -144
- package/src/memory/v3/prompt-context.ts +0 -33
- package/src/memory/v3/prompts/consolidation.ts +0 -458
- package/src/memory/v3/prompts/system-prompts.ts +0 -196
- package/src/memory/v3/retriever.ts +0 -33
- package/src/memory/v3/scouts.ts +0 -420
- package/src/memory/v3/shadow-middleware.ts +0 -305
- package/src/memory/v3/traversal.ts +0 -206
- package/src/memory/v3/tree-index.ts +0 -237
- package/src/memory/v3/tree-store.ts +0 -394
- package/src/memory/v3/tree-walk.ts +0 -351
- package/src/memory/v3/validate.ts +0 -300
- package/src/plugins/defaults/circuit-breaker.ts +0 -141
- package/src/plugins/defaults/compaction.ts +0 -141
- package/src/plugins/defaults/empty-response.ts +0 -124
- package/src/plugins/defaults/history-repair.ts +0 -83
- package/src/plugins/defaults/persistence.ts +0 -127
- package/src/plugins/defaults/title-generate.ts +0 -90
- package/src/plugins/defaults/token-estimate.ts +0 -101
- package/src/plugins/defaults/tool-error.ts +0 -119
- package/src/plugins/defaults/tool-result-truncate.ts +0 -84
|
@@ -14,14 +14,26 @@
|
|
|
14
14
|
import { createRequire } from "node:module";
|
|
15
15
|
import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
16
16
|
|
|
17
|
+
import { CompactionCircuit } from "../agent/compaction-circuit.js";
|
|
17
18
|
import type {
|
|
18
19
|
AgentEvent,
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
AgentLoopRunOptions,
|
|
21
|
+
AgentLoopRunResult,
|
|
22
|
+
MidLoopCompaction,
|
|
21
23
|
} from "../agent/loop.js";
|
|
22
24
|
import type { LLMConfig } from "../config/schemas/llm.js";
|
|
25
|
+
import type { ContextWindowResult } from "../context/window-manager.js";
|
|
23
26
|
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
27
|
+
import { defaultCompactionTerminal } from "../plugins/defaults/compaction/terminal.js";
|
|
24
28
|
import { resetPluginRegistryAndRegisterDefaults } from "../plugins/defaults/index.js";
|
|
29
|
+
import { DEFAULT_TIMEOUTS, runPipeline } from "../plugins/pipeline.js";
|
|
30
|
+
import { getMiddlewaresFor } from "../plugins/registry.js";
|
|
31
|
+
import type {
|
|
32
|
+
CompactionArgs,
|
|
33
|
+
CompactionResult,
|
|
34
|
+
TurnContext,
|
|
35
|
+
} from "../plugins/types.js";
|
|
36
|
+
import { PluginTimeoutError } from "../plugins/types.js";
|
|
25
37
|
import type { ContentBlock, Message } from "../providers/types.js";
|
|
26
38
|
|
|
27
39
|
const conversationCrudRealSnapshot = {
|
|
@@ -198,6 +210,7 @@ mock.module("../memory/conversation-crud.js", () => ({
|
|
|
198
210
|
setLastNotifiedInferenceProfile: () => {},
|
|
199
211
|
getLastUserTimestampBefore: () => 0,
|
|
200
212
|
getConversationOverrideProfileFromRow: () => undefined,
|
|
213
|
+
reserveMessage: mock(async () => ({ id: "msg-reserve" })),
|
|
201
214
|
}));
|
|
202
215
|
|
|
203
216
|
afterAll(() => {
|
|
@@ -290,7 +303,7 @@ mock.module("../daemon/date-context.js", () => ({
|
|
|
290
303
|
formatTurnTimestamp: () => "2026-01-01 (Thursday) 00:00:00 +00:00 (UTC)",
|
|
291
304
|
}));
|
|
292
305
|
|
|
293
|
-
mock.module("../
|
|
306
|
+
mock.module("../plugins/defaults/history-repair/terminal.js", () => ({
|
|
294
307
|
repairHistory: (msgs: Message[]) => ({
|
|
295
308
|
messages: msgs,
|
|
296
309
|
stats: {
|
|
@@ -434,13 +447,153 @@ import {
|
|
|
434
447
|
type AgentLoopRun = (
|
|
435
448
|
messages: Message[],
|
|
436
449
|
onEvent: (event: AgentEvent) => void,
|
|
437
|
-
|
|
438
|
-
requestId?: string,
|
|
439
|
-
onCheckpoint?: (
|
|
440
|
-
checkpoint: CheckpointInfo,
|
|
441
|
-
) => CheckpointDecision | Promise<CheckpointDecision>,
|
|
450
|
+
options?: AgentLoopRunOptions,
|
|
442
451
|
) => Promise<Message[]>;
|
|
443
452
|
|
|
453
|
+
/**
|
|
454
|
+
* Faithful re-implementation of `AgentLoop.compact()` for the mock loop: run
|
|
455
|
+
* the compaction pipeline against the supplied turn context (which carries the
|
|
456
|
+
* test's `contextWindowManager`), invoke the orchestrator-supplied hooks, and
|
|
457
|
+
* return the continuation history — or `null` on timeout/exhaustion so the
|
|
458
|
+
* caller yields "budget".
|
|
459
|
+
*/
|
|
460
|
+
async function simulateInlineCompaction(
|
|
461
|
+
compaction: MidLoopCompaction,
|
|
462
|
+
history: Message[],
|
|
463
|
+
turnContext: TurnContext | undefined,
|
|
464
|
+
signal: AbortSignal | undefined,
|
|
465
|
+
onEvent: (event: AgentEvent) => void | Promise<void>,
|
|
466
|
+
compactionCircuit: CompactionCircuit,
|
|
467
|
+
): Promise<Message[] | null> {
|
|
468
|
+
await onEvent({ type: "context_compacting" });
|
|
469
|
+
const { rawHistory, options } = compaction.prepare(history);
|
|
470
|
+
let result: CompactionResult;
|
|
471
|
+
try {
|
|
472
|
+
result = await runPipeline<CompactionArgs, CompactionResult>(
|
|
473
|
+
"compaction",
|
|
474
|
+
getMiddlewaresFor("compaction"),
|
|
475
|
+
(args) => defaultCompactionTerminal(args, turnContext as TurnContext),
|
|
476
|
+
{ messages: rawHistory, signal, options },
|
|
477
|
+
turnContext as TurnContext,
|
|
478
|
+
DEFAULT_TIMEOUTS.compaction,
|
|
479
|
+
);
|
|
480
|
+
} catch (error) {
|
|
481
|
+
if (error instanceof PluginTimeoutError) {
|
|
482
|
+
await compactionCircuit.recordOutcome(
|
|
483
|
+
{
|
|
484
|
+
currentRequestId: turnContext?.requestId,
|
|
485
|
+
currentTurnTrustContext: turnContext?.trust,
|
|
486
|
+
turnCount: turnContext?.turnIndex ?? 0,
|
|
487
|
+
},
|
|
488
|
+
true,
|
|
489
|
+
onEvent,
|
|
490
|
+
);
|
|
491
|
+
return null;
|
|
492
|
+
}
|
|
493
|
+
throw error;
|
|
494
|
+
}
|
|
495
|
+
const compactResult = result as ContextWindowResult;
|
|
496
|
+
if (compactResult.summaryFailed !== undefined) {
|
|
497
|
+
await compactionCircuit.recordOutcome(
|
|
498
|
+
{
|
|
499
|
+
currentRequestId: turnContext?.requestId,
|
|
500
|
+
currentTurnTrustContext: turnContext?.trust,
|
|
501
|
+
turnCount: turnContext?.turnIndex ?? 0,
|
|
502
|
+
},
|
|
503
|
+
compactResult.summaryFailed,
|
|
504
|
+
onEvent,
|
|
505
|
+
);
|
|
506
|
+
}
|
|
507
|
+
if (compactResult.compacted) {
|
|
508
|
+
await compaction.applyResult(compactResult, rawHistory);
|
|
509
|
+
}
|
|
510
|
+
if (compactResult.exhausted ?? false) {
|
|
511
|
+
return null;
|
|
512
|
+
}
|
|
513
|
+
return compaction.reinject();
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
/**
|
|
517
|
+
* Adapt a `Message[]`-returning mock loop body into `run()`'s real result
|
|
518
|
+
* shape. Mirrors the production loop: the pause-reason carried back is
|
|
519
|
+
* whatever the most recent `onCheckpoint` call yielded with (null when it
|
|
520
|
+
* never yielded), so the orchestrator derives its yield bookkeeping the same
|
|
521
|
+
* way it does against the real loop.
|
|
522
|
+
*/
|
|
523
|
+
const asAgentLoopRun = (
|
|
524
|
+
fn: AgentLoopRun,
|
|
525
|
+
compactionCircuit: CompactionCircuit,
|
|
526
|
+
): ((
|
|
527
|
+
messages: Message[],
|
|
528
|
+
onEvent: (event: AgentEvent) => void | Promise<void>,
|
|
529
|
+
options?: AgentLoopRunOptions,
|
|
530
|
+
) => Promise<AgentLoopRunResult>) => {
|
|
531
|
+
return async (messages, onEvent, options) => {
|
|
532
|
+
let exitReason: AgentLoopRunResult["exitReason"] = null;
|
|
533
|
+
let wrapped = options;
|
|
534
|
+
if (options?.onCheckpoint) {
|
|
535
|
+
const inner = options.onCheckpoint;
|
|
536
|
+
wrapped = {
|
|
537
|
+
...options,
|
|
538
|
+
onCheckpoint: async (info) => {
|
|
539
|
+
// Handoff is offered first, mirroring the loop's ordering.
|
|
540
|
+
const decision = await inner(info);
|
|
541
|
+
if (decision !== "continue") {
|
|
542
|
+
exitReason = decision;
|
|
543
|
+
return decision;
|
|
544
|
+
}
|
|
545
|
+
// The mid-loop budget gate and inline compaction both live inside
|
|
546
|
+
// `AgentLoop.run`. Replicate them here — same formula, stubbed
|
|
547
|
+
// estimator, and the loop's own `compact()` ceremony — so these
|
|
548
|
+
// orchestrator tests drive the real escalation path now that the
|
|
549
|
+
// orchestrator's `onCheckpoint` is handoff-only and compaction
|
|
550
|
+
// runs inline rather than via an orchestrator re-entry loop.
|
|
551
|
+
const contextWindow = options.resolveContextWindow?.();
|
|
552
|
+
if (contextWindow?.overflowRecovery.enabled) {
|
|
553
|
+
const { maxInputTokens, overflowRecovery } = contextWindow;
|
|
554
|
+
const safetyMargin =
|
|
555
|
+
info.history.length > 50
|
|
556
|
+
? Math.max(overflowRecovery.safetyMarginRatio, 0.15)
|
|
557
|
+
: overflowRecovery.safetyMarginRatio;
|
|
558
|
+
const preflightBudget = Math.floor(
|
|
559
|
+
maxInputTokens * (1 - safetyMargin),
|
|
560
|
+
);
|
|
561
|
+
const estimated =
|
|
562
|
+
typeof mockEstimateTokens === "function"
|
|
563
|
+
? mockEstimateTokens(info.history)
|
|
564
|
+
: mockEstimateTokens;
|
|
565
|
+
if (estimated > preflightBudget * 0.85) {
|
|
566
|
+
// Mirror `AgentLoop.compact()`: when a compaction path is
|
|
567
|
+
// supplied, run it in place and continue; on timeout or
|
|
568
|
+
// exhaustion it returns null, so the loop yields "budget".
|
|
569
|
+
const compacted = options.compaction
|
|
570
|
+
? await simulateInlineCompaction(
|
|
571
|
+
options.compaction,
|
|
572
|
+
info.history,
|
|
573
|
+
options.turnContext,
|
|
574
|
+
options.signal,
|
|
575
|
+
onEvent,
|
|
576
|
+
compactionCircuit,
|
|
577
|
+
)
|
|
578
|
+
: null;
|
|
579
|
+
if (compacted) {
|
|
580
|
+
exitReason = null;
|
|
581
|
+
return "continue";
|
|
582
|
+
}
|
|
583
|
+
exitReason = "budget";
|
|
584
|
+
return "budget";
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
exitReason = null;
|
|
588
|
+
return "continue";
|
|
589
|
+
},
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
const history = await fn(messages, onEvent, wrapped);
|
|
593
|
+
return { history, exitReason };
|
|
594
|
+
};
|
|
595
|
+
};
|
|
596
|
+
|
|
444
597
|
function makeCtx(
|
|
445
598
|
overrides?: Partial<AgentLoopConversationContext> & {
|
|
446
599
|
agentLoopRun?: AgentLoopRun;
|
|
@@ -456,6 +609,8 @@ function makeCtx(
|
|
|
456
609
|
},
|
|
457
610
|
]);
|
|
458
611
|
|
|
612
|
+
const compactionCircuit = new CompactionCircuit("test-conv");
|
|
613
|
+
|
|
459
614
|
return {
|
|
460
615
|
conversationId: "test-conv",
|
|
461
616
|
messages: [
|
|
@@ -466,13 +621,14 @@ function makeCtx(
|
|
|
466
621
|
currentRequestId: "test-req",
|
|
467
622
|
|
|
468
623
|
agentLoop: {
|
|
469
|
-
run: agentLoopRun,
|
|
624
|
+
run: asAgentLoopRun(agentLoopRun, compactionCircuit),
|
|
470
625
|
getToolTokenBudget: () => 0,
|
|
471
626
|
getResolvedTools: () => [],
|
|
472
627
|
// Tests in this file don't exercise calibration, so returning
|
|
473
628
|
// undefined is fine — the estimator falls back to the per-provider
|
|
474
629
|
// aggregate key.
|
|
475
630
|
getActiveModel: () => undefined,
|
|
631
|
+
compactionCircuit,
|
|
476
632
|
} as unknown as AgentLoopConversationContext["agentLoop"],
|
|
477
633
|
provider: {
|
|
478
634
|
name: "mock-provider",
|
|
@@ -735,6 +891,9 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
735
891
|
|
|
736
892
|
let agentLoopCallCount = 0;
|
|
737
893
|
const agentLoopRun: AgentLoopRun = async (messages, onEvent) => {
|
|
894
|
+
// Prime the assistant row anchor — production code emits this from
|
|
895
|
+
// `AgentLoop.run` just before `provider.sendMessage`.
|
|
896
|
+
await onEvent({ type: "llm_call_started" });
|
|
738
897
|
agentLoopCallCount++;
|
|
739
898
|
if (agentLoopCallCount === 1) {
|
|
740
899
|
// Simulate: agent makes progress (tool calls + results added)
|
|
@@ -914,6 +1073,9 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
914
1073
|
};
|
|
915
1074
|
|
|
916
1075
|
const agentLoopRun: AgentLoopRun = async (messages, onEvent) => {
|
|
1076
|
+
// Prime the assistant row anchor — production code emits this from
|
|
1077
|
+
// `AgentLoop.run` just before `provider.sendMessage`.
|
|
1078
|
+
await onEvent({ type: "llm_call_started" });
|
|
917
1079
|
callCount++;
|
|
918
1080
|
if (callCount === 1) {
|
|
919
1081
|
// Provider rejects with "prompt is too long: 242201 tokens > 200000"
|
|
@@ -1036,6 +1198,9 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1036
1198
|
};
|
|
1037
1199
|
|
|
1038
1200
|
const agentLoopRun: AgentLoopRun = async (messages, onEvent) => {
|
|
1201
|
+
// Prime the assistant row anchor — production code emits this from
|
|
1202
|
+
// `AgentLoop.run` just before `provider.sendMessage`.
|
|
1203
|
+
await onEvent({ type: "llm_call_started" });
|
|
1039
1204
|
callCount++;
|
|
1040
1205
|
if (callCount === 1) {
|
|
1041
1206
|
// Provider rejects: actual tokens 242201, way above estimate of 185k
|
|
@@ -1161,6 +1326,9 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1161
1326
|
};
|
|
1162
1327
|
|
|
1163
1328
|
const agentLoopRun: AgentLoopRun = async (messages, onEvent) => {
|
|
1329
|
+
// Prime the assistant row anchor — production code emits this from
|
|
1330
|
+
// `AgentLoop.run` just before `provider.sendMessage`.
|
|
1331
|
+
await onEvent({ type: "llm_call_started" });
|
|
1164
1332
|
callCount++;
|
|
1165
1333
|
onEvent({
|
|
1166
1334
|
type: "message_complete",
|
|
@@ -1249,6 +1417,9 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1249
1417
|
|
|
1250
1418
|
let agentLoopCallCount = 0;
|
|
1251
1419
|
const agentLoopRun: AgentLoopRun = async (messages, onEvent) => {
|
|
1420
|
+
// Prime the assistant row anchor — production code emits this from
|
|
1421
|
+
// `AgentLoop.run` just before `provider.sendMessage`.
|
|
1422
|
+
await onEvent({ type: "llm_call_started" });
|
|
1252
1423
|
agentLoopCallCount++;
|
|
1253
1424
|
if (agentLoopCallCount === 1) {
|
|
1254
1425
|
// Agent makes progress (tool calls succeed, messages grow)
|
|
@@ -1433,13 +1604,10 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1433
1604
|
};
|
|
1434
1605
|
|
|
1435
1606
|
let agentLoopCallCount = 0;
|
|
1436
|
-
const agentLoopRun: AgentLoopRun = async (
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
_requestId,
|
|
1441
|
-
onCheckpoint,
|
|
1442
|
-
) => {
|
|
1607
|
+
const agentLoopRun: AgentLoopRun = async (messages, onEvent, options) => {
|
|
1608
|
+
// Prime the assistant row anchor — production code emits this from
|
|
1609
|
+
// `AgentLoop.run` just before `provider.sendMessage`.
|
|
1610
|
+
await onEvent({ type: "llm_call_started" });
|
|
1443
1611
|
agentLoopCallCount++;
|
|
1444
1612
|
|
|
1445
1613
|
if (agentLoopCallCount === 1) {
|
|
@@ -1496,14 +1664,14 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1496
1664
|
|
|
1497
1665
|
// Call onCheckpoint — this should trigger the mid-loop budget check
|
|
1498
1666
|
// which sees 170_000 > 161_500 and returns "yield"
|
|
1499
|
-
if (onCheckpoint) {
|
|
1500
|
-
const decision = await onCheckpoint({
|
|
1667
|
+
if (options?.onCheckpoint) {
|
|
1668
|
+
const decision = await options.onCheckpoint({
|
|
1501
1669
|
turnIndex: 0,
|
|
1502
1670
|
toolCount: 1,
|
|
1503
1671
|
hasToolUse: true,
|
|
1504
1672
|
history: withProgress,
|
|
1505
1673
|
});
|
|
1506
|
-
if (decision
|
|
1674
|
+
if (decision !== "continue") {
|
|
1507
1675
|
// Agent loop stops when checkpoint yields
|
|
1508
1676
|
return withProgress;
|
|
1509
1677
|
}
|
|
@@ -1618,13 +1786,10 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1618
1786
|
let agentLoopCallCount = 0;
|
|
1619
1787
|
let contextTooLargeEmitted = false;
|
|
1620
1788
|
|
|
1621
|
-
const agentLoopRun: AgentLoopRun = async (
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
_requestId,
|
|
1626
|
-
onCheckpoint,
|
|
1627
|
-
) => {
|
|
1789
|
+
const agentLoopRun: AgentLoopRun = async (messages, onEvent, options) => {
|
|
1790
|
+
// Prime the assistant row anchor — production code emits this from
|
|
1791
|
+
// `AgentLoop.run` just before `provider.sendMessage`.
|
|
1792
|
+
await onEvent({ type: "llm_call_started" });
|
|
1628
1793
|
agentLoopCallCount++;
|
|
1629
1794
|
|
|
1630
1795
|
if (agentLoopCallCount === 1) {
|
|
@@ -1670,14 +1835,14 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1670
1835
|
providerDurationMs: 100,
|
|
1671
1836
|
});
|
|
1672
1837
|
|
|
1673
|
-
if (onCheckpoint) {
|
|
1674
|
-
const decision = await onCheckpoint({
|
|
1838
|
+
if (options?.onCheckpoint) {
|
|
1839
|
+
const decision = await options.onCheckpoint({
|
|
1675
1840
|
turnIndex: i,
|
|
1676
1841
|
toolCount: 1,
|
|
1677
1842
|
hasToolUse: true,
|
|
1678
1843
|
history: currentHistory,
|
|
1679
1844
|
});
|
|
1680
|
-
if (decision
|
|
1845
|
+
if (decision !== "continue") {
|
|
1681
1846
|
return currentHistory;
|
|
1682
1847
|
}
|
|
1683
1848
|
}
|
|
@@ -1793,13 +1958,10 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1793
1958
|
};
|
|
1794
1959
|
|
|
1795
1960
|
let agentLoopCallCount = 0;
|
|
1796
|
-
const agentLoopRun: AgentLoopRun = async (
|
|
1797
|
-
|
|
1798
|
-
|
|
1799
|
-
|
|
1800
|
-
_requestId,
|
|
1801
|
-
onCheckpoint,
|
|
1802
|
-
) => {
|
|
1961
|
+
const agentLoopRun: AgentLoopRun = async (messages, onEvent, options) => {
|
|
1962
|
+
// Prime the assistant row anchor — production code emits this from
|
|
1963
|
+
// `AgentLoop.run` just before `provider.sendMessage`.
|
|
1964
|
+
await onEvent({ type: "llm_call_started" });
|
|
1803
1965
|
agentLoopCallCount++;
|
|
1804
1966
|
|
|
1805
1967
|
// Every call: simulate tool progress then yield at checkpoint
|
|
@@ -1854,14 +2016,14 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1854
2016
|
});
|
|
1855
2017
|
|
|
1856
2018
|
// Always yield at checkpoint — simulates compaction not helping
|
|
1857
|
-
if (onCheckpoint) {
|
|
1858
|
-
const decision = await onCheckpoint({
|
|
2019
|
+
if (options?.onCheckpoint) {
|
|
2020
|
+
const decision = await options.onCheckpoint({
|
|
1859
2021
|
turnIndex: 0,
|
|
1860
2022
|
toolCount: 1,
|
|
1861
2023
|
hasToolUse: true,
|
|
1862
2024
|
history: withProgress,
|
|
1863
2025
|
});
|
|
1864
|
-
if (decision
|
|
2026
|
+
if (decision !== "continue") {
|
|
1865
2027
|
return withProgress;
|
|
1866
2028
|
}
|
|
1867
2029
|
}
|
|
@@ -1892,9 +2054,15 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1892
2054
|
shouldCompact: () => ({ needed: false, estimatedTokens: 0 }),
|
|
1893
2055
|
maybeCompact: async () => {
|
|
1894
2056
|
compactionCallCount++;
|
|
1895
|
-
// Compaction
|
|
2057
|
+
// Compaction's internal retry budget is exhausted — the
|
|
2058
|
+
// compactor itself ran maxAttempts passes and still couldn't
|
|
2059
|
+
// drop below the auto-threshold. `maybeCompact` surfaces this
|
|
2060
|
+
// via `exhausted: true` so the orchestrator escalates
|
|
2061
|
+
// straight to the convergence loop instead of looping on a
|
|
2062
|
+
// stuck compactor.
|
|
1896
2063
|
return {
|
|
1897
2064
|
compacted: true,
|
|
2065
|
+
exhausted: true,
|
|
1898
2066
|
messages: [
|
|
1899
2067
|
{
|
|
1900
2068
|
role: "user" as const,
|
|
@@ -1919,14 +2087,20 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1919
2087
|
|
|
1920
2088
|
await runAgentLoopImpl(ctx, "hello", "msg-1", (msg) => events.push(msg));
|
|
1921
2089
|
|
|
1922
|
-
// 1 initial auto-compact +
|
|
1923
|
-
|
|
2090
|
+
// 1 initial auto-compact + 1 mid-loop compaction = 2 total. The
|
|
2091
|
+
// first mid-loop call surfaces `exhausted: true`, so the
|
|
2092
|
+
// orchestrator escalates immediately without retrying maybeCompact
|
|
2093
|
+
// — the retry budget for the compactor itself lives inside
|
|
2094
|
+
// `ContextWindowManager.maybeCompact`.
|
|
2095
|
+
expect(compactionCallCount).toBe(2);
|
|
1924
2096
|
|
|
1925
|
-
// Agent loop: 1 initial +
|
|
1926
|
-
|
|
2097
|
+
// Agent loop: 1 initial + 1 convergence re-run = 2 calls. No
|
|
2098
|
+
// mid-loop re-entries because the orchestrator broke out on
|
|
2099
|
+
// `exhausted` before re-invoking the agent loop.
|
|
2100
|
+
expect(agentLoopCallCount).toBe(2);
|
|
1927
2101
|
|
|
1928
|
-
// After
|
|
1929
|
-
// have been triggered (contextTooLargeDetected set to true)
|
|
2102
|
+
// After the compactor exhausted itself, the convergence loop
|
|
2103
|
+
// should have been triggered (contextTooLargeDetected set to true)
|
|
1930
2104
|
expect(convergenceReducerCalled).toBe(true);
|
|
1931
2105
|
expect(setAgentLoopExitReasonOnLatestLogMock).toHaveBeenCalledWith(
|
|
1932
2106
|
"test-conv",
|
|
@@ -1934,6 +2108,151 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1934
2108
|
);
|
|
1935
2109
|
});
|
|
1936
2110
|
|
|
2111
|
+
// ── Test 8b ───────────────────────────────────────────────────────
|
|
2112
|
+
// Counterpart to Test 8: when a mid-loop `maybeCompact` returns
|
|
2113
|
+
// productive (`compacted: true`, no `exhausted` flag), the loop
|
|
2114
|
+
// compacts in place and continues the run itself — it never yields
|
|
2115
|
+
// "budget", so the orchestrator does not escalate to the convergence
|
|
2116
|
+
// loop. Mid-loop iteration is now wholly internal to `AgentLoop.run`;
|
|
2117
|
+
// the orchestrator only reacts to the binary `exhausted`/timeout
|
|
2118
|
+
// signal carried back as a "budget" exit.
|
|
2119
|
+
test("productive mid-loop compaction continues in place without escalating", async () => {
|
|
2120
|
+
const events: ServerMessage[] = [];
|
|
2121
|
+
|
|
2122
|
+
// Budget = 200_000 * 0.95 = 190_000
|
|
2123
|
+
// Mid-loop threshold = 190_000 * 0.85 = 161_500
|
|
2124
|
+
let estimateCallCount = 0;
|
|
2125
|
+
mockEstimateTokens = () => {
|
|
2126
|
+
estimateCallCount++;
|
|
2127
|
+
// Preflight: below budget.
|
|
2128
|
+
if (estimateCallCount === 1) return 100_000;
|
|
2129
|
+
// Every checkpoint estimate: above threshold — always trips the
|
|
2130
|
+
// yield. Simulates a long turn where each tool call's result
|
|
2131
|
+
// inflates the context past 85% even after a successful compaction.
|
|
2132
|
+
return 170_000;
|
|
2133
|
+
};
|
|
2134
|
+
|
|
2135
|
+
// A single tool round reaches one checkpoint; the in-loop budget
|
|
2136
|
+
// gate trips there and compaction runs in place. The loop continues
|
|
2137
|
+
// the run itself rather than handing control back, so the
|
|
2138
|
+
// orchestrator invokes `run()` exactly once.
|
|
2139
|
+
let agentLoopCallCount = 0;
|
|
2140
|
+
const agentLoopRun: AgentLoopRun = async (messages, onEvent, options) => {
|
|
2141
|
+
await onEvent({ type: "llm_call_started" });
|
|
2142
|
+
agentLoopCallCount++;
|
|
2143
|
+
|
|
2144
|
+
const withProgress: Message[] = [
|
|
2145
|
+
...messages,
|
|
2146
|
+
{
|
|
2147
|
+
role: "assistant" as const,
|
|
2148
|
+
content: [
|
|
2149
|
+
{ type: "text", text: `Tool call ${agentLoopCallCount}` },
|
|
2150
|
+
{
|
|
2151
|
+
type: "tool_use",
|
|
2152
|
+
id: `tu-${agentLoopCallCount}`,
|
|
2153
|
+
name: "bash",
|
|
2154
|
+
input: { command: "ls" },
|
|
2155
|
+
},
|
|
2156
|
+
] as ContentBlock[],
|
|
2157
|
+
},
|
|
2158
|
+
{
|
|
2159
|
+
role: "user" as const,
|
|
2160
|
+
content: [
|
|
2161
|
+
{
|
|
2162
|
+
type: "tool_result",
|
|
2163
|
+
tool_use_id: `tu-${agentLoopCallCount}`,
|
|
2164
|
+
content: "output",
|
|
2165
|
+
is_error: false,
|
|
2166
|
+
},
|
|
2167
|
+
] as ContentBlock[],
|
|
2168
|
+
},
|
|
2169
|
+
];
|
|
2170
|
+
|
|
2171
|
+
onEvent({
|
|
2172
|
+
type: "message_complete",
|
|
2173
|
+
message: {
|
|
2174
|
+
role: "assistant",
|
|
2175
|
+
content: [
|
|
2176
|
+
{ type: "text", text: `Tool call ${agentLoopCallCount}` },
|
|
2177
|
+
{
|
|
2178
|
+
type: "tool_use",
|
|
2179
|
+
id: `tu-${agentLoopCallCount}`,
|
|
2180
|
+
name: "bash",
|
|
2181
|
+
input: { command: "ls" },
|
|
2182
|
+
},
|
|
2183
|
+
],
|
|
2184
|
+
},
|
|
2185
|
+
});
|
|
2186
|
+
onEvent({
|
|
2187
|
+
type: "usage",
|
|
2188
|
+
inputTokens: 100,
|
|
2189
|
+
outputTokens: 50,
|
|
2190
|
+
model: "test-model",
|
|
2191
|
+
providerDurationMs: 100,
|
|
2192
|
+
});
|
|
2193
|
+
|
|
2194
|
+
if (options?.onCheckpoint) {
|
|
2195
|
+
await options.onCheckpoint({
|
|
2196
|
+
turnIndex: 0,
|
|
2197
|
+
toolCount: 1,
|
|
2198
|
+
hasToolUse: true,
|
|
2199
|
+
history: withProgress,
|
|
2200
|
+
});
|
|
2201
|
+
}
|
|
2202
|
+
|
|
2203
|
+
return withProgress;
|
|
2204
|
+
};
|
|
2205
|
+
|
|
2206
|
+
// Compaction reports `estimatedInputTokens` well below the 161_500
|
|
2207
|
+
// threshold — the "compaction is productive" signal (no `exhausted`
|
|
2208
|
+
// flag) that lets the loop continue in place.
|
|
2209
|
+
let compactionCallCount = 0;
|
|
2210
|
+
const ctx = makeCtx({
|
|
2211
|
+
agentLoopRun,
|
|
2212
|
+
contextWindowManager: {
|
|
2213
|
+
shouldCompact: () => ({ needed: false, estimatedTokens: 0 }),
|
|
2214
|
+
maybeCompact: async () => {
|
|
2215
|
+
compactionCallCount++;
|
|
2216
|
+
return {
|
|
2217
|
+
compacted: true,
|
|
2218
|
+
messages: [
|
|
2219
|
+
{
|
|
2220
|
+
role: "user" as const,
|
|
2221
|
+
content: [{ type: "text", text: "Hello" }],
|
|
2222
|
+
},
|
|
2223
|
+
] as Message[],
|
|
2224
|
+
compactedPersistedMessages: 5,
|
|
2225
|
+
summaryText: "Compaction summary",
|
|
2226
|
+
previousEstimatedInputTokens: 170_000,
|
|
2227
|
+
estimatedInputTokens: 100_000,
|
|
2228
|
+
maxInputTokens: 200_000,
|
|
2229
|
+
thresholdTokens: 160_000,
|
|
2230
|
+
compactedMessages: 10,
|
|
2231
|
+
summaryCalls: 1,
|
|
2232
|
+
summaryInputTokens: 500,
|
|
2233
|
+
summaryOutputTokens: 200,
|
|
2234
|
+
summaryModel: "mock-model",
|
|
2235
|
+
};
|
|
2236
|
+
},
|
|
2237
|
+
} as unknown as AgentLoopConversationContext["contextWindowManager"],
|
|
2238
|
+
});
|
|
2239
|
+
|
|
2240
|
+
await runAgentLoopImpl(ctx, "hello", "msg-1", (msg) => events.push(msg));
|
|
2241
|
+
|
|
2242
|
+
// 1 initial auto-compact + 1 productive mid-loop compaction. The
|
|
2243
|
+
// loop continues in place after compacting, so the orchestrator
|
|
2244
|
+
// never re-enters `run()` — it is invoked exactly once.
|
|
2245
|
+
expect(compactionCallCount).toBe(2);
|
|
2246
|
+
expect(agentLoopCallCount).toBe(1);
|
|
2247
|
+
|
|
2248
|
+
// No escalation to the convergence loop because the mid-loop
|
|
2249
|
+
// `maybeCompact` returned productive (no `exhausted` flag).
|
|
2250
|
+
expect(setAgentLoopExitReasonOnLatestLogMock).not.toHaveBeenCalledWith(
|
|
2251
|
+
"test-conv",
|
|
2252
|
+
"context_too_large",
|
|
2253
|
+
);
|
|
2254
|
+
});
|
|
2255
|
+
|
|
1937
2256
|
// ── Test 9 ────────────────────────────────────────────────────────
|
|
1938
2257
|
// When the convergence loop reruns the agent loop and it still yields
|
|
1939
2258
|
// at checkpoint (yieldedForBudget), the loop must continue reducing
|
|
@@ -1954,13 +2273,10 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
1954
2273
|
};
|
|
1955
2274
|
|
|
1956
2275
|
let agentLoopCallCount = 0;
|
|
1957
|
-
const agentLoopRun: AgentLoopRun = async (
|
|
1958
|
-
|
|
1959
|
-
|
|
1960
|
-
|
|
1961
|
-
_requestId,
|
|
1962
|
-
onCheckpoint,
|
|
1963
|
-
) => {
|
|
2276
|
+
const agentLoopRun: AgentLoopRun = async (messages, onEvent, options) => {
|
|
2277
|
+
// Prime the assistant row anchor — production code emits this from
|
|
2278
|
+
// `AgentLoop.run` just before `provider.sendMessage`.
|
|
2279
|
+
await onEvent({ type: "llm_call_started" });
|
|
1964
2280
|
agentLoopCallCount++;
|
|
1965
2281
|
|
|
1966
2282
|
const withProgress: Message[] = [
|
|
@@ -2014,14 +2330,14 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
2014
2330
|
});
|
|
2015
2331
|
|
|
2016
2332
|
// Always yield at checkpoint — simulates reduction not helping enough
|
|
2017
|
-
if (onCheckpoint) {
|
|
2018
|
-
const decision = await onCheckpoint({
|
|
2333
|
+
if (options?.onCheckpoint) {
|
|
2334
|
+
const decision = await options.onCheckpoint({
|
|
2019
2335
|
turnIndex: 0,
|
|
2020
2336
|
toolCount: 1,
|
|
2021
2337
|
hasToolUse: true,
|
|
2022
2338
|
history: withProgress,
|
|
2023
2339
|
});
|
|
2024
|
-
if (decision
|
|
2340
|
+
if (decision !== "continue") {
|
|
2025
2341
|
return withProgress;
|
|
2026
2342
|
}
|
|
2027
2343
|
}
|
|
@@ -2062,6 +2378,11 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
2062
2378
|
agentLoopRun,
|
|
2063
2379
|
contextWindowManager: {
|
|
2064
2380
|
shouldCompact: () => ({ needed: false, estimatedTokens: 0 }),
|
|
2381
|
+
// Under the new architecture (Compaction Re-homing Arc, Bullet 1)
|
|
2382
|
+
// the retry budget lives inside `ContextWindowManager._maybeCompact`,
|
|
2383
|
+
// so a single daemon-level call represents the full manager retry
|
|
2384
|
+
// sequence. Signal `exhausted: true` immediately to escalate the
|
|
2385
|
+
// mid-loop to the convergence reducer.
|
|
2065
2386
|
maybeCompact: async () => ({
|
|
2066
2387
|
compacted: true,
|
|
2067
2388
|
messages: [
|
|
@@ -2081,6 +2402,7 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
2081
2402
|
summaryInputTokens: 500,
|
|
2082
2403
|
summaryOutputTokens: 200,
|
|
2083
2404
|
summaryModel: "mock-model",
|
|
2405
|
+
exhausted: true,
|
|
2084
2406
|
}),
|
|
2085
2407
|
} as unknown as AgentLoopConversationContext["contextWindowManager"],
|
|
2086
2408
|
});
|
|
@@ -2091,8 +2413,10 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
2091
2413
|
// once more after yieldedForBudget triggered re-entry
|
|
2092
2414
|
expect(reducerCallCount).toBe(2);
|
|
2093
2415
|
|
|
2094
|
-
// Agent loop: 1 initial +
|
|
2095
|
-
|
|
2416
|
+
// Agent loop: 1 initial + 2 convergence re-runs = 3 calls. The mid-loop
|
|
2417
|
+
// no longer drives daemon-level retries — the manager owns its retry
|
|
2418
|
+
// budget and signals exhaustion via the `exhausted` flag.
|
|
2419
|
+
expect(agentLoopCallCount).toBe(3);
|
|
2096
2420
|
expect(setAgentLoopExitReasonOnLatestLogMock).toHaveBeenCalledWith(
|
|
2097
2421
|
"test-conv",
|
|
2098
2422
|
"context_too_large",
|
|
@@ -2193,6 +2517,9 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
2193
2517
|
};
|
|
2194
2518
|
|
|
2195
2519
|
const agentLoopRun: AgentLoopRun = async (messages, onEvent) => {
|
|
2520
|
+
// Prime the assistant row anchor — production code emits this from
|
|
2521
|
+
// `AgentLoop.run` just before `provider.sendMessage`.
|
|
2522
|
+
await onEvent({ type: "llm_call_started" });
|
|
2196
2523
|
onEvent({
|
|
2197
2524
|
type: "message_complete",
|
|
2198
2525
|
message: {
|
|
@@ -2289,13 +2616,10 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
2289
2616
|
mockOverflowAction = "auto_compress_latest_turn";
|
|
2290
2617
|
|
|
2291
2618
|
let agentLoopCallCount = 0;
|
|
2292
|
-
const agentLoopRun: AgentLoopRun = async (
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
_requestId,
|
|
2297
|
-
onCheckpoint,
|
|
2298
|
-
) => {
|
|
2619
|
+
const agentLoopRun: AgentLoopRun = async (messages, onEvent, options) => {
|
|
2620
|
+
// Prime the assistant row anchor — production code emits this from
|
|
2621
|
+
// `AgentLoop.run` just before `provider.sendMessage`.
|
|
2622
|
+
await onEvent({ type: "llm_call_started" });
|
|
2299
2623
|
agentLoopCallCount++;
|
|
2300
2624
|
|
|
2301
2625
|
const withProgress: Message[] = [
|
|
@@ -2349,14 +2673,14 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
2349
2673
|
});
|
|
2350
2674
|
|
|
2351
2675
|
// Every checkpoint yields — including the final auto_compress rerun.
|
|
2352
|
-
if (onCheckpoint) {
|
|
2353
|
-
const decision = await onCheckpoint({
|
|
2676
|
+
if (options?.onCheckpoint) {
|
|
2677
|
+
const decision = await options.onCheckpoint({
|
|
2354
2678
|
turnIndex: 0,
|
|
2355
2679
|
toolCount: 1,
|
|
2356
2680
|
hasToolUse: true,
|
|
2357
2681
|
history: withProgress,
|
|
2358
2682
|
});
|
|
2359
|
-
if (decision
|
|
2683
|
+
if (decision !== "continue") {
|
|
2360
2684
|
return withProgress;
|
|
2361
2685
|
}
|
|
2362
2686
|
}
|
|
@@ -2364,32 +2688,82 @@ describe("session-agent-loop overflow recovery (JARVIS-110)", () => {
|
|
|
2364
2688
|
return withProgress;
|
|
2365
2689
|
};
|
|
2366
2690
|
|
|
2691
|
+
// `maybeCompact` is invoked through three distinct call sites:
|
|
2692
|
+
// 1. Start-of-turn compaction (no `force` option) — return a no-op
|
|
2693
|
+
// so the start-of-turn pass doesn't perturb state. The mock's
|
|
2694
|
+
// `shouldCompact` already returns `needed: false`, but the
|
|
2695
|
+
// orchestrator still invokes the compaction pipeline.
|
|
2696
|
+
// 2. Mid-loop after the initial agent-loop yield (`force: true`) —
|
|
2697
|
+
// must signal `exhausted: true` so the daemon escalates to the
|
|
2698
|
+
// convergence reducer instead of looping forever.
|
|
2699
|
+
// 3. auto_compress_latest_turn emergency compaction (`force: true`,
|
|
2700
|
+
// `minKeepRecentUserTurns: 0`) — succeeds and drops tokens below
|
|
2701
|
+
// threshold; the subsequent rerun yields again and is classified
|
|
2702
|
+
// as BUDGET_YIELD_UNRECOVERED.
|
|
2703
|
+
let forcedMaybeCompactCallCount = 0;
|
|
2367
2704
|
const ctx = makeCtx({
|
|
2368
2705
|
agentLoopRun,
|
|
2369
2706
|
contextWindowManager: {
|
|
2370
2707
|
shouldCompact: () => ({ needed: false, estimatedTokens: 0 }),
|
|
2371
|
-
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
}
|
|
2380
|
-
|
|
2381
|
-
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2708
|
+
maybeCompact: async (
|
|
2709
|
+
_msgs: Message[],
|
|
2710
|
+
_signal: AbortSignal,
|
|
2711
|
+
opts?: { force?: boolean },
|
|
2712
|
+
) => {
|
|
2713
|
+
// Start-of-turn calls pass no `force` option; route them to a
|
|
2714
|
+
// no-op so only the mid-loop and emergency paths drive the test.
|
|
2715
|
+
if (!opts?.force) {
|
|
2716
|
+
return { compacted: false };
|
|
2717
|
+
}
|
|
2718
|
+
forcedMaybeCompactCallCount++;
|
|
2719
|
+
if (forcedMaybeCompactCallCount === 1) {
|
|
2720
|
+
// Mid-loop call — under the new architecture (Compaction
|
|
2721
|
+
// Re-homing Arc, Bullet 1) the manager owns its own retry
|
|
2722
|
+
// budget; signal exhaustion to escalate to convergence.
|
|
2723
|
+
return {
|
|
2724
|
+
compacted: true,
|
|
2725
|
+
messages: [
|
|
2726
|
+
{
|
|
2727
|
+
role: "user" as const,
|
|
2728
|
+
content: [{ type: "text", text: "mid-loop compacted" }],
|
|
2729
|
+
},
|
|
2730
|
+
] as Message[],
|
|
2731
|
+
compactedPersistedMessages: 5,
|
|
2732
|
+
summaryText: "Mid-loop summary",
|
|
2733
|
+
previousEstimatedInputTokens: 170_000,
|
|
2734
|
+
estimatedInputTokens: 165_000,
|
|
2735
|
+
maxInputTokens: 200_000,
|
|
2736
|
+
thresholdTokens: 160_000,
|
|
2737
|
+
compactedMessages: 10,
|
|
2738
|
+
summaryCalls: 1,
|
|
2739
|
+
summaryInputTokens: 500,
|
|
2740
|
+
summaryOutputTokens: 200,
|
|
2741
|
+
summaryModel: "mock-model",
|
|
2742
|
+
exhausted: true,
|
|
2743
|
+
};
|
|
2744
|
+
}
|
|
2745
|
+
// Emergency compaction call from auto_compress_latest_turn.
|
|
2746
|
+
return {
|
|
2747
|
+
compacted: true,
|
|
2748
|
+
messages: [
|
|
2749
|
+
{
|
|
2750
|
+
role: "user" as const,
|
|
2751
|
+
content: [{ type: "text", text: "compacted" }],
|
|
2752
|
+
},
|
|
2753
|
+
] as Message[],
|
|
2754
|
+
compactedPersistedMessages: 5,
|
|
2755
|
+
summaryText: "Emergency summary",
|
|
2756
|
+
previousEstimatedInputTokens: 170_000,
|
|
2757
|
+
estimatedInputTokens: 90_000,
|
|
2758
|
+
maxInputTokens: 200_000,
|
|
2759
|
+
thresholdTokens: 160_000,
|
|
2760
|
+
compactedMessages: 10,
|
|
2761
|
+
summaryCalls: 1,
|
|
2762
|
+
summaryInputTokens: 500,
|
|
2763
|
+
summaryOutputTokens: 200,
|
|
2764
|
+
summaryModel: "mock-model",
|
|
2765
|
+
};
|
|
2766
|
+
},
|
|
2393
2767
|
} as unknown as AgentLoopConversationContext["contextWindowManager"],
|
|
2394
2768
|
});
|
|
2395
2769
|
|