@vellumai/assistant 0.8.6 → 0.8.7-dev.202606052118.34cd356
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 +4 -4
- package/Dockerfile +21 -4
- package/bun.lock +13 -4
- package/docker-entrypoint.sh +12 -8
- package/docker-init-apt-root.sh +3 -1
- package/docker-kata-apt-env.sh +3 -1
- package/docker-kata-runtime-family.sh +12 -0
- package/docs/architecture/memory.md +1 -1
- package/docs/plugins.md +110 -83
- package/examples/plugins/echo/README.md +13 -12
- package/examples/plugins/echo/register.ts +0 -54
- 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 +3 -4
- package/node_modules/@vellumai/skill-host-contracts/src/server-message.ts +3 -3
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +13 -8
- package/openapi.yaml +6964 -539
- package/package.json +8 -4
- package/scripts/generate-openapi.ts +88 -54
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +188 -45
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +141 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +19 -32
- package/src/__tests__/agent-loop-provider-error-recording.test.ts +7 -5
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +238 -422
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +6 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
- package/src/__tests__/annotate-activity-metadata.test.ts +262 -0
- package/src/__tests__/annotate-risk-options.test.ts +2 -3
- package/src/__tests__/anthropic-provider.test.ts +296 -57
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +6 -1
- package/src/__tests__/app-dir-path-guard.test.ts +1 -0
- package/src/__tests__/approval-cascade.test.ts +4 -11
- package/src/__tests__/approval-routes-http.test.ts +8 -3
- package/src/__tests__/assistant-event-hub.test.ts +25 -0
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-events-sse-shed.test.ts +8 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
- package/src/__tests__/assistant-stream-state.test.ts +645 -0
- package/src/__tests__/auth-fallback-events-store.test.ts +116 -0
- 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 +6 -0
- package/src/__tests__/btw-routes.test.ts +69 -15
- package/src/__tests__/build-persisted-content.test.ts +184 -0
- 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 +49 -21
- package/src/__tests__/channel-approvals.test.ts +4 -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 +2 -7
- package/src/__tests__/channel-retry-sweep.test.ts +71 -79
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-circuit.test.ts +258 -0
- package/src/__tests__/compaction-direct.test.ts +132 -0
- package/src/__tests__/compaction-events.test.ts +5 -17
- package/src/__tests__/compaction-trail-store.test.ts +1 -79
- package/src/__tests__/compaction.benchmark.test.ts +0 -30
- package/src/__tests__/compactor-image-manifest-trust.test.ts +112 -0
- package/src/__tests__/computer-use-tools.test.ts +2 -2
- package/src/__tests__/config-watcher.test.ts +28 -0
- package/src/__tests__/context-search-agent-runner.test.ts +6 -3
- package/src/__tests__/context-token-estimator.test.ts +34 -0
- package/src/__tests__/context-window-manager-compact-retry.test.ts +291 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +70 -25
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +9 -7
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +22 -34
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +476 -963
- package/src/__tests__/conversation-agent-loop.test.ts +823 -1321
- package/src/__tests__/conversation-analysis-routes.test.ts +7 -3
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- package/src/__tests__/conversation-clean-command.test.ts +5 -2
- package/src/__tests__/conversation-clear-safety.test.ts +20 -10
- package/src/__tests__/conversation-confirmation-signals.test.ts +15 -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-fork-crud.test.ts +86 -172
- package/src/__tests__/conversation-fork-route.test.ts +16 -14
- package/src/__tests__/conversation-history-web-search.test.ts +11 -1
- package/src/__tests__/conversation-init.benchmark.test.ts +6 -6
- package/src/__tests__/conversation-lifecycle.test.ts +3 -2
- package/src/__tests__/conversation-load-history-repair.test.ts +3 -2
- package/src/__tests__/conversation-load-history-stripped.test.ts +1 -1
- package/src/__tests__/conversation-message-sync-tags.test.ts +3 -4
- package/src/__tests__/conversation-pairing.test.ts +10 -7
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -0
- package/src/__tests__/conversation-process-callsite.test.ts +27 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +80 -51
- package/src/__tests__/conversation-queue.test.ts +272 -164
- package/src/__tests__/conversation-routes-disk-view.test.ts +6 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
- package/src/__tests__/conversation-routes-slash-commands.test.ts +8 -7
- package/src/__tests__/conversation-runtime-assembly.test.ts +317 -313
- package/src/__tests__/conversation-runtime-workspace.test.ts +114 -36
- package/src/__tests__/conversation-slash-commands.test.ts +8 -42
- package/src/__tests__/conversation-slash-queue.test.ts +42 -31
- package/src/__tests__/conversation-slash-unknown.test.ts +13 -15
- package/src/__tests__/conversation-speed-override.test.ts +8 -22
- package/src/__tests__/conversation-starter-routes.test.ts +14 -6
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +90 -15
- package/src/__tests__/conversation-surfaces-app-control.test.ts +32 -4
- package/src/__tests__/conversation-surfaces-state-update.test.ts +5 -2
- package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -15
- package/src/__tests__/conversation-sync-tags.test.ts +27 -15
- package/src/__tests__/conversation-title-service.test.ts +135 -2
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +23 -11
- package/src/__tests__/conversation-unread-route.test.ts +14 -2
- package/src/__tests__/conversation-usage.test.ts +0 -2
- package/src/__tests__/conversation-wipe.test.ts +1 -1
- package/src/__tests__/conversation-workspace-cache-state.test.ts +20 -17
- package/src/__tests__/conversation-workspace-injection.test.ts +114 -23
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +34 -13
- package/src/__tests__/conversations-import-system-filter.test.ts +101 -0
- package/src/__tests__/credential-execution-tools.test.ts +1 -2
- package/src/__tests__/credential-security-invariants.test.ts +0 -1
- package/src/__tests__/cross-provider-web-search.test.ts +220 -3
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-acp-history.test.ts +101 -0
- package/src/__tests__/db-schedule-syntax-migration.test.ts +16 -0
- package/src/__tests__/disk-pressure-guard.test.ts +66 -0
- package/src/__tests__/disk-pressure-routes.test.ts +9 -2
- package/src/__tests__/dm-persistence.test.ts +12 -3
- package/src/__tests__/dynamic-page-surface.test.ts +99 -0
- package/src/__tests__/edit-propagation.test.ts +1 -2
- package/src/__tests__/empty-response-hook.test.ts +304 -0
- package/src/__tests__/feature-flag-test-helpers.ts +2 -2
- package/src/__tests__/file-write-tool.test.ts +63 -0
- package/src/__tests__/filing-service.test.ts +2 -2
- package/src/__tests__/first-greeting.test.ts +55 -14
- package/src/__tests__/gemini-image-service.test.ts +13 -0
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +351 -28
- package/src/__tests__/guardian-grant-minting.test.ts +1 -1
- package/src/__tests__/guardian-routing-invariants.test.ts +2 -4
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +10 -8
- package/src/__tests__/heartbeat-disk-pressure.test.ts +2 -0
- package/src/__tests__/heartbeat-service.test.ts +3 -1
- package/src/__tests__/helpers/mock-provider.ts +110 -0
- package/src/__tests__/helpers/native-web-search-harness.ts +129 -0
- package/src/__tests__/history-repair-hook.test.ts +162 -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-app-control-routes.test.ts +1 -1
- package/src/__tests__/host-cu-proxy.test.ts +2 -0
- package/src/__tests__/host-cu-routes-targeted.test.ts +3 -3
- 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-write-tool.test.ts +9 -3
- package/src/__tests__/host-proxy-preactivation.test.ts +53 -14
- package/src/__tests__/host-shell-tool.test.ts +9 -4
- package/src/__tests__/http-user-message-parity.test.ts +2 -2
- package/src/__tests__/identity-intro-cache.test.ts +47 -114
- package/src/__tests__/identity-routes.test.ts +248 -7
- package/src/__tests__/inbound-slack-persistence.test.ts +12 -3
- package/src/__tests__/injector-background-turn.test.ts +3 -9
- package/src/__tests__/injector-chain.test.ts +139 -275
- package/src/__tests__/injector-disk-pressure.test.ts +75 -41
- package/src/__tests__/injector-document-comments.test.ts +3 -3
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +30 -22
- package/src/__tests__/injector-v3-suppression.test.ts +214 -0
- package/src/__tests__/internal-telemetry-routes.test.ts +109 -0
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +55 -15
- package/src/__tests__/list-messages-page-latest.test.ts +60 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +56 -6
- package/src/__tests__/llm-request-log-turn-query.test.ts +42 -86
- package/src/__tests__/llm-resolver.test.ts +23 -47
- package/src/__tests__/llm-usage-store.test.ts +268 -1
- package/src/__tests__/log-export-routes.test.ts +59 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
- package/src/__tests__/mcp-auth-routes.test.ts +15 -10
- package/src/__tests__/mcp-health-check.test.ts +18 -13
- package/src/__tests__/memory-retrieval-hook.test.ts +297 -0
- package/src/__tests__/memory-v2-static-injector.test.ts +103 -35
- package/src/__tests__/messaging-send-tool.test.ts +8 -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-preflight-http.test.ts +7 -7
- package/src/__tests__/migration-validate-http.test.ts +3 -3
- package/src/__tests__/native-web-search.test.ts +205 -20
- package/src/__tests__/notification-decision-identity.test.ts +9 -18
- package/src/__tests__/notification-decision-recipient-context.test.ts +3 -6
- package/src/__tests__/oauth-commands-routes.test.ts +1 -1
- package/src/__tests__/onboarding-template-contract.test.ts +12 -0
- package/src/__tests__/openai-image-service.test.ts +17 -0
- package/src/__tests__/openai-provider.test.ts +97 -71
- package/src/__tests__/openai-responses-provider.test.ts +21 -77
- package/src/__tests__/outbound-slack-persistence.test.ts +2 -1
- package/src/__tests__/{overflow-reduce-pipeline.test.ts → overflow-reduction-loop.test.ts} +64 -286
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persist-unsendable-image.test.ts +215 -0
- package/src/__tests__/persistence-secret-redaction.test.ts +3 -1
- package/src/__tests__/pipeline-runner.test.ts +31 -43
- package/src/__tests__/pkb-autoinject.test.ts +2 -5
- package/src/__tests__/plugin-bootstrap.test.ts +62 -51
- package/src/__tests__/plugin-registry.test.ts +0 -27
- 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 +10 -26
- package/src/__tests__/plugin-types.test.ts +8 -173
- package/src/__tests__/prechat-onboarding-contract.test.ts +23 -0
- package/src/__tests__/process-message-background-slack.test.ts +17 -16
- package/src/__tests__/process-message-display-content.test.ts +36 -44
- 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 +3 -8
- 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__/reaction-persistence.test.ts +1 -1
- package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +5 -1
- package/src/__tests__/relay-server.test.ts +20 -13
- package/src/__tests__/resolve-trust-class.test.ts +4 -4
- 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-events-sse-reconnect.test.ts +390 -0
- package/src/__tests__/schedule-routes.test.ts +683 -12
- package/src/__tests__/schedule-store.test.ts +108 -0
- package/src/__tests__/schedule-tools.test.ts +160 -0
- package/src/__tests__/secret-ingress-http.test.ts +2 -2
- 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__/send-endpoint-busy.test.ts +6 -2
- package/src/__tests__/server-history-render.test.ts +314 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +44 -11
- package/src/__tests__/skill-feature-flags.test.ts +6 -6
- package/src/__tests__/skill-load-feature-flag.test.ts +10 -10
- package/src/__tests__/skills-files-catalog-fallback.test.ts +10 -0
- package/src/__tests__/skillssh-files.test.ts +1 -0
- 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 +3 -3
- package/src/__tests__/subagent-fork-notifications.test.ts +1 -3
- package/src/__tests__/subagent-fork-spawn.test.ts +1 -1
- package/src/__tests__/subagent-manager-notify.test.ts +1 -3
- package/src/__tests__/subagent-notify-parent.test.ts +1 -3
- package/src/__tests__/subagent-spawn-tool-fork.test.ts +1 -1
- package/src/__tests__/suggestion-routes.test.ts +3 -3
- package/src/__tests__/sync-message-contract.test.ts +19 -16
- package/src/__tests__/system-prompt.test.ts +74 -0
- package/src/__tests__/task-scheduler.test.ts +162 -1
- package/src/__tests__/terminal-tools.test.ts +9 -25
- package/src/__tests__/thread-backfill.test.ts +4 -9
- package/src/__tests__/title-generate-hook.test.ts +319 -0
- package/src/__tests__/tool-error-hook.test.ts +278 -0
- package/src/__tests__/tool-preview-lifecycle.test.ts +481 -16
- package/src/__tests__/tool-result-metadata-plumbing.test.ts +1 -0
- package/src/__tests__/tool-result-truncate-hook.test.ts +127 -0
- package/src/__tests__/tool-result-truncation.test.ts +1 -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__/ui-choice-copy-surfaces.test.ts +254 -0
- package/src/__tests__/ui-work-result-surface.test.ts +159 -0
- package/src/__tests__/usage-routes.test.ts +285 -1
- package/src/__tests__/user-plugin-loader.test.ts +2 -2
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
- package/src/__tests__/voice-session-bridge.test.ts +19 -10
- package/src/__tests__/web-search-backend-failure.test.ts +166 -0
- package/src/acp/__tests__/agent-process.test.ts +161 -0
- package/src/acp/__tests__/client-handler.test.ts +40 -0
- package/src/acp/__tests__/helpers/acp-history-db.ts +82 -0
- package/src/acp/__tests__/helpers/exec-file-stub.ts +101 -0
- package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
- package/src/acp/__tests__/session-manager-persistence.test.ts +95 -28
- package/src/acp/__tests__/session-manager-resume.test.ts +695 -0
- package/src/acp/agent-process.ts +61 -1
- package/src/acp/auto-install.test.ts +125 -0
- package/src/acp/auto-install.ts +174 -0
- package/src/acp/client-handler.ts +31 -0
- package/src/acp/feature-gate.test.ts +48 -0
- package/src/acp/feature-gate.ts +34 -0
- package/src/acp/prepare-agent-env.ts +52 -11
- package/src/acp/resolve-agent.test.ts +147 -6
- package/src/acp/resolve-agent.ts +81 -7
- package/src/acp/resume-hint.ts +22 -0
- package/src/acp/session-manager.ts +487 -71
- package/src/agent/compaction-circuit.ts +98 -0
- package/src/agent/loop.ts +651 -450
- package/src/api/README.md +19 -17
- 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 +25 -27
- package/src/api/events/assistant-text-delta.ts +6 -8
- package/src/api/events/assistant-thinking-delta.ts +33 -0
- package/src/api/events/assistant-turn-start.ts +5 -7
- 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 +24 -28
- package/src/api/events/document-comment-deleted.ts +6 -8
- package/src/api/events/document-comment-reopened.ts +6 -8
- package/src/api/events/document-comment-resolved.ts +8 -10
- 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 +4 -6
- package/src/api/events/generation-handoff.ts +13 -15
- 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 +10 -12
- 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 +6 -8
- package/src/api/events/question-request.ts +67 -0
- package/src/api/events/relationship-state-updated.ts +4 -6
- 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-output-chunk.ts +45 -0
- package/src/api/events/tool-result.ts +129 -0
- package/src/api/events/tool-use-preview-start.ts +32 -0
- package/src/api/events/tool-use-start.ts +8 -10
- package/src/api/events/trace-event.ts +69 -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 +389 -0
- package/src/api/requests/dictation.ts +45 -0
- package/src/api/responses/conversation-message.ts +374 -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 +2 -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 +7 -10
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +198 -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/next-wake.test.ts +31 -1
- package/src/background-wake/next-wake.ts +5 -1
- package/src/calls/call-conversation-messages.ts +6 -4
- package/src/calls/guardian-action-sweep.ts +6 -4
- package/src/calls/relay-server.ts +12 -8
- package/src/calls/voice-session-bridge.ts +13 -27
- package/src/cli/commands/__tests__/memory-v3.test.ts +245 -0
- package/src/cli/commands/__tests__/notifications.test.ts +58 -14
- package/src/cli/commands/avatar.ts +17 -11
- 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 +159 -445
- package/src/cli/commands/notifications.ts +112 -60
- package/src/cli/lib/cli-colors.ts +24 -6
- package/src/cli/program.ts +4 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +4 -4
- package/src/config/acp-defaults.test.ts +10 -0
- package/src/config/acp-defaults.ts +6 -0
- package/src/config/assistant-feature-flags.ts +24 -13
- package/src/config/bundled-skills/acp/SKILL.md +64 -30
- package/src/config/bundled-skills/acp/TOOLS.json +4 -4
- package/src/config/bundled-skills/app-builder/SKILL.md +224 -387
- package/src/config/bundled-skills/app-builder/TOOLS.json +29 -0
- package/src/config/bundled-skills/app-builder/references/DESIGN_SYSTEM.md +48 -0
- package/src/config/bundled-skills/app-builder/references/RESPONSIVE.md +57 -0
- package/src/config/bundled-skills/app-builder/references/SLIDES.md +38 -0
- package/src/config/bundled-skills/app-builder/references/examples/README.md +17 -0
- package/src/config/bundled-skills/app-builder/references/examples/expense-tracker.md +515 -0
- package/src/config/bundled-skills/app-builder/references/examples/focus-timer.md +342 -0
- package/src/config/bundled-skills/app-builder/references/examples/habit-tracker.md +490 -0
- package/src/config/bundled-skills/app-builder/tools/app-list.ts +62 -0
- package/src/config/bundled-skills/document-editor/SKILL.md +28 -23
- package/src/config/bundled-skills/document-editor/TOOLS.json +1 -1
- package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
- package/src/config/bundled-skills/messaging/SKILL.md +0 -7
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
- package/src/config/bundled-tool-registry.ts +2 -0
- package/src/config/call-site-defaults.ts +2 -7
- package/src/config/feature-flag-cache.ts +3 -3
- package/src/config/feature-flag-registry.json +68 -12
- package/src/config/schemas/__tests__/memory-v2.test.ts +2 -226
- package/src/config/schemas/__tests__/memory-v3.test.ts +25 -0
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/heartbeat.ts +9 -0
- package/src/config/schemas/llm.ts +3 -3
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +8 -253
- package/src/config/schemas/memory-v3.ts +47 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/platform.ts +8 -0
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/config/seed-inference-profiles.ts +2 -2
- package/src/config/skills.ts +13 -0
- package/src/context/compactor.ts +55 -32
- package/src/context/strip-injections.ts +128 -0
- package/src/context/token-estimator.ts +42 -0
- package/src/context/tool-result-truncation.ts +1 -66
- package/src/context/window-manager.ts +141 -26
- package/src/credential-execution/executable-discovery.ts +16 -0
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +6 -0
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
- package/src/daemon/__tests__/inference-profile-notification.test.ts +153 -0
- package/src/daemon/__tests__/native-web-search-metadata.test.ts +10 -8
- package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/assistant-attachments.ts +1 -1
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/context-overflow-reducer.ts +0 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +793 -215
- package/src/daemon/conversation-agent-loop.ts +487 -1478
- package/src/daemon/conversation-error.ts +7 -7
- package/src/daemon/conversation-history.ts +27 -10
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +13 -42
- package/src/daemon/conversation-messaging.ts +8 -9
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +109 -93
- package/src/daemon/conversation-registry.ts +159 -0
- package/src/daemon/conversation-runtime-assembly.ts +209 -382
- package/src/daemon/conversation-slash.ts +6 -25
- package/src/daemon/conversation-store.ts +15 -95
- package/src/daemon/conversation-surfaces.ts +277 -73
- package/src/daemon/conversation-tool-setup.ts +5 -29
- package/src/daemon/conversation-workspace.ts +17 -0
- package/src/daemon/conversation.ts +123 -146
- package/src/daemon/daemon-skill-host.ts +2 -6
- package/src/daemon/disk-pressure-guard.ts +35 -29
- package/src/daemon/external-plugins-bootstrap.ts +53 -32
- package/src/daemon/first-greeting.ts +26 -4
- package/src/daemon/guardian-action-generators.ts +2 -2
- package/src/daemon/handlers/config-a2a.ts +51 -36
- package/src/daemon/handlers/config-slack-channel.ts +20 -14
- package/src/daemon/handlers/config-telegram.ts +16 -2
- package/src/daemon/handlers/conversations.ts +9 -23
- package/src/daemon/handlers/shared.ts +158 -82
- package/src/daemon/handlers/skills.ts +53 -20
- 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 +53 -55
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- package/src/daemon/message-types/apps.ts +1 -29
- package/src/daemon/message-types/contacts.ts +3 -20
- package/src/daemon/message-types/conversations.ts +13 -111
- package/src/daemon/message-types/documents.ts +3 -9
- package/src/daemon/message-types/home.ts +4 -17
- package/src/daemon/message-types/integrations.ts +2 -6
- package/src/daemon/message-types/messages.ts +37 -400
- 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 +4 -0
- package/src/daemon/message-types/surfaces.ts +138 -3
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- package/src/daemon/now-scratchpad.ts +21 -0
- package/src/daemon/orphan-reaper.test.ts +210 -0
- package/src/daemon/orphan-reaper.ts +240 -0
- package/src/daemon/overflow-reduction-loop.ts +230 -0
- package/src/daemon/persist-unsendable-image.ts +117 -0
- package/src/daemon/process-message.ts +50 -49
- package/src/daemon/server.ts +14 -0
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trace-emitter.ts +6 -4
- package/src/daemon/trust-context.ts +32 -0
- package/src/daemon/wake-target-adapter.ts +14 -2
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +6 -1
- package/src/heartbeat/heartbeat-run-store.ts +54 -1
- package/src/heartbeat/heartbeat-service.ts +42 -0
- package/src/home/feed-types.ts +36 -221
- package/src/home/home-greeting-cache.ts +24 -1
- package/src/ipc/__tests__/browser-ipc.test.ts +1 -1
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- package/src/ipc/__tests__/ui-request-route.test.ts +3 -3
- package/src/ipc/gateway-client.test.ts +2 -2
- package/src/ipc/gateway-client.ts +3 -3
- 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 +33 -9
- package/src/ipc/skill-routes/__tests__/providers.test.ts +10 -10
- package/src/ipc/skill-routes/__tests__/registries.test.ts +28 -18
- package/src/ipc/skill-routes/memory.ts +29 -14
- package/src/ipc/skill-routes/providers.ts +5 -6
- package/src/ipc/skill-routes/registries.ts +13 -61
- package/src/live-voice/__tests__/live-voice-archive.test.ts +24 -11
- package/src/media/gemini-image-service.ts +15 -0
- package/src/media/openai-image-service.ts +14 -0
- package/src/media/types.ts +34 -0
- 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-job-classes.test.ts +5 -4
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +56 -0
- package/src/memory/__tests__/memory-retrospective-job.test.ts +10 -6
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/memory/auth-fallback-events-store.ts +94 -0
- package/src/memory/context-search/agent-runner.ts +2 -4
- package/src/memory/conversation-crud.ts +39 -8
- package/src/memory/conversation-queries.ts +78 -22
- package/src/memory/conversation-starter-checkpoints.ts +1 -0
- package/src/memory/conversation-title-service.ts +65 -41
- package/src/memory/db-init.ts +14 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/graph/__tests__/conversation-graph-memory-registry.test.ts +119 -0
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +106 -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.ts +20 -26
- package/src/memory/graph/tools.ts +4 -4
- package/src/memory/job-handlers/conversation-starters.ts +45 -34
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs-store.ts +36 -1
- package/src/memory/jobs-worker.ts +82 -43
- package/src/memory/llm-request-log-source-clickhouse.ts +5 -31
- package/src/memory/llm-request-log-source-local.ts +0 -11
- package/src/memory/llm-request-log-source.ts +9 -25
- package/src/memory/llm-request-log-store.ts +0 -41
- package/src/memory/llm-usage-store.ts +234 -50
- 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 +1 -83
- package/src/memory/migrations/222-strip-placeholder-sentinels-from-messages.ts +6 -5
- 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/270-schedule-source-conversation.ts +13 -0
- package/src/memory/migrations/271-create-auth-fallback-events.ts +21 -0
- package/src/memory/migrations/272-acp-session-history-cwd.ts +36 -0
- package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +7 -0
- package/src/memory/pkb/autoinject.ts +61 -0
- package/src/memory/pkb/context.ts +50 -0
- package/src/memory/pkb/types.ts +14 -0
- package/src/memory/schedule-attribution-sql.ts +104 -0
- package/src/memory/schema/acp.ts +4 -0
- package/src/memory/schema/infrastructure.ts +27 -0
- package/src/memory/usage-grouped-buckets.ts +6 -1
- package/src/memory/v2/__tests__/consolidation-job.test.ts +125 -1
- 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 +6 -5
- package/src/memory/v2/backfill-jobs.ts +6 -0
- package/src/memory/v2/consolidation-job.ts +99 -10
- 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/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/conversation-pairing.ts +8 -13
- package/src/notifications/decision-engine.ts +16 -16
- package/src/notifications/home-feed-side-effect.ts +12 -1
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/permissions/prompter.ts +46 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/plugin-api/constants.ts +4 -0
- package/src/plugin-api/index.ts +10 -1
- package/src/plugin-api/types.ts +176 -4
- package/src/plugins/defaults/compaction/compact.ts +59 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +24 -0
- package/src/plugins/defaults/empty-response/hooks/stop.ts +126 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +23 -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 +22 -49
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +95 -0
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit-temp.ts +216 -0
- package/src/plugins/defaults/memory-retrieval/injector-chain.ts +35 -0
- package/src/plugins/defaults/{injectors.ts → memory-retrieval/injectors.ts} +295 -112
- package/src/plugins/defaults/memory-v3-shadow/__tests__/assign.test.ts +242 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/capabilities.test.ts +118 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/core.test.ts +39 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/eval-turns.json +36 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/fixtures/live-turns.json +37 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/health.test.ts +219 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/live-integration.test.ts +330 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +288 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/needle.test.ts +107 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +436 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/provider-blocks.test.ts +13 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/reconcile.test.ts +274 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/render-injection.test.ts +61 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/router.test.ts +332 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +179 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selector.test.ts +470 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +432 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/snapshot.test.ts +168 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/tree.test.ts +192 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/types.test.ts +54 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-eviction.test.ts +106 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/plugins/defaults/memory-v3-shadow/assign.ts +268 -0
- package/src/plugins/defaults/memory-v3-shadow/capabilities.ts +124 -0
- package/src/plugins/defaults/memory-v3-shadow/core.ts +26 -0
- package/src/plugins/defaults/memory-v3-shadow/data/README.md +84 -0
- package/src/plugins/defaults/memory-v3-shadow/data/assignments.json +5 -0
- package/src/plugins/defaults/memory-v3-shadow/data/core.json +1 -0
- package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-a/topic-x.md +9 -0
- package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-a/topic-y.md +9 -0
- package/src/plugins/defaults/memory-v3-shadow/data/leaves/domain-b/topic-z.md +9 -0
- package/src/plugins/defaults/memory-v3-shadow/health.ts +0 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/post-compact.ts +14 -0
- package/src/plugins/defaults/memory-v3-shadow/hooks/user-prompt-submit.ts +19 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +75 -0
- package/src/plugins/defaults/memory-v3-shadow/llm-retry.ts +32 -0
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +314 -0
- package/src/plugins/defaults/memory-v3-shadow/needle.ts +115 -0
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +126 -0
- package/src/plugins/defaults/memory-v3-shadow/package.json +15 -0
- package/src/plugins/defaults/memory-v3-shadow/page-content.ts +34 -0
- package/src/plugins/defaults/memory-v3-shadow/provider-blocks.ts +26 -0
- package/src/plugins/defaults/memory-v3-shadow/reconcile.ts +523 -0
- package/src/plugins/defaults/memory-v3-shadow/register.ts +26 -0
- package/src/plugins/defaults/memory-v3-shadow/render-injection.ts +32 -0
- package/src/plugins/defaults/memory-v3-shadow/router.ts +190 -0
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +84 -0
- package/src/plugins/defaults/memory-v3-shadow/selector.ts +226 -0
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +349 -0
- package/src/plugins/defaults/memory-v3-shadow/snapshot.ts +209 -0
- package/src/plugins/defaults/memory-v3-shadow/tree.ts +174 -0
- package/src/plugins/defaults/memory-v3-shadow/types.ts +59 -0
- package/src/plugins/defaults/memory-v3-shadow/working-set.ts +88 -0
- package/src/plugins/defaults/title-generate/hooks/stop.ts +75 -0
- package/src/plugins/defaults/title-generate/hooks/user-prompt-submit.ts +35 -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/tool-error/hooks/post-tool-use.ts +118 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/hooks/post-tool-use.ts +32 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +24 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +132 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +8 -35
- package/src/plugins/registry.ts +8 -25
- package/src/plugins/types.ts +62 -721
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +4 -5
- package/src/proactive-artifact/job.test.ts +28 -21
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/__tests__/system-prompt.test.ts +42 -0
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +64 -0
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +7 -3
- package/src/prompts/templates/system-sections.ts +21 -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 +61 -34
- package/src/providers/call-site-routing.ts +1 -9
- package/src/providers/gemini/client.ts +152 -34
- package/src/providers/gemini/inline-media.ts +74 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +112 -2
- package/src/providers/openai/chat-completions-provider.ts +45 -4
- package/src/providers/openai/responses-provider.ts +1 -4
- package/src/providers/openrouter/client.ts +2 -6
- package/src/providers/placeholder-sentinels.ts +35 -0
- package/src/providers/provider-send-message.ts +6 -6
- package/src/providers/ratelimit.ts +1 -9
- package/src/providers/retry.ts +0 -5
- package/src/providers/types.ts +11 -2
- package/src/providers/usage-tracking.ts +1 -9
- package/src/runtime/__tests__/agent-wake.test.ts +141 -32
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
- package/src/runtime/__tests__/interactive-ui.test.ts +1 -1
- package/src/runtime/agent-wake.ts +95 -23
- package/src/runtime/assistant-event-hub.ts +38 -8
- package/src/runtime/assistant-stream-state.ts +368 -0
- 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 -1079
- package/src/runtime/background-job-runner.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -1
- package/src/runtime/channel-approvals.ts +4 -15
- package/src/runtime/channel-invite-transport.ts +5 -6
- package/src/runtime/channel-readiness-service.ts +2 -5
- package/src/runtime/channel-retry-sweep.ts +12 -16
- package/src/runtime/http-router.ts +35 -43
- package/src/runtime/http-types.ts +23 -71
- package/src/runtime/interactive-ui.ts +1 -1
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/pending-interactions.ts +3 -2
- package/src/runtime/routes/__tests__/acp-routes.test.ts +253 -55
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- package/src/runtime/routes/__tests__/consolidation-routes.test.ts +265 -2
- package/src/runtime/routes/__tests__/content-source-routes.test.ts +4 -4
- package/src/runtime/routes/__tests__/conversation-compaction-routes.test.ts +62 -32
- package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +237 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +31 -1
- package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +13 -22
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +6 -2
- package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +7 -2
- package/src/runtime/routes/__tests__/sanity-routes.test.ts +6 -6
- 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-action-routes.test.ts +5 -4
- package/src/runtime/routes/__tests__/surface-content-routes.test.ts +4 -1
- package/src/runtime/routes/__tests__/tts-routes.test.ts +9 -5
- package/src/runtime/routes/acp-routes.test.ts +186 -100
- package/src/runtime/routes/acp-routes.ts +110 -35
- package/src/runtime/routes/app-management-routes.ts +93 -131
- package/src/runtime/routes/app-routes.ts +38 -20
- package/src/runtime/routes/approval-routes.ts +17 -5
- package/src/runtime/routes/attachment-routes.ts +51 -16
- 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 +264 -59
- package/src/runtime/routes/background-tool-routes.ts +9 -0
- package/src/runtime/routes/background-wake-routes.ts +13 -3
- 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 +6 -1
- package/src/runtime/routes/browser-tabs-routes.ts +11 -10
- package/src/runtime/routes/btw-routes.ts +34 -24
- 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 +133 -25
- 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 +5 -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 +54 -25
- package/src/runtime/routes/conversation-list-routes.ts +81 -12
- package/src/runtime/routes/conversation-management-routes.ts +57 -14
- package/src/runtime/routes/conversation-query-routes.ts +90 -41
- package/src/runtime/routes/conversation-routes.ts +446 -204
- package/src/runtime/routes/conversation-starter-routes.ts +35 -20
- package/src/runtime/routes/conversations-import-routes.ts +30 -8
- 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 +25 -10
- package/src/runtime/routes/domain-routes.ts +98 -51
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/epoch-millis-range.ts +34 -0
- package/src/runtime/routes/events-routes.ts +107 -8
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +31 -4
- package/src/runtime/routes/global-search-routes.ts +53 -50
- package/src/runtime/routes/group-routes.ts +21 -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 +57 -21
- package/src/runtime/routes/home-feed-routes.ts +23 -19
- package/src/runtime/routes/home-state-routes.ts +8 -40
- package/src/runtime/routes/host-app-control-routes.ts +6 -1
- 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 +6 -1
- 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 +28 -40
- package/src/runtime/routes/identity-routes.ts +236 -20
- package/src/runtime/routes/image-generation-routes.ts +45 -2
- package/src/runtime/routes/inbound-message-handler.ts +16 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
- 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 +21 -5
- package/src/runtime/routes/inference-send-routes.ts +11 -11
- package/src/runtime/routes/integrations/a2a.ts +32 -7
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +16 -0
- package/src/runtime/routes/integrations/slack/channel.ts +23 -3
- package/src/runtime/routes/integrations/slack/share.ts +36 -8
- package/src/runtime/routes/integrations/telegram.ts +34 -9
- package/src/runtime/routes/integrations/twilio.ts +77 -7
- package/src/runtime/routes/integrations/vercel.ts +3 -3
- package/src/runtime/routes/internal-oauth-routes.ts +5 -0
- package/src/runtime/routes/internal-telemetry-routes.ts +88 -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/log-export-routes.ts +36 -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 +105 -44
- package/src/runtime/routes/memory-v3-routes.ts +306 -408
- package/src/runtime/routes/migration-rollback-routes.ts +5 -1
- package/src/runtime/routes/migration-routes.ts +29 -0
- package/src/runtime/routes/notification-routes.ts +17 -1
- package/src/runtime/routes/oauth-apps.ts +99 -23
- package/src/runtime/routes/oauth-commands-routes.ts +37 -14
- 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 +79 -15
- package/src/runtime/routes/platform-routes.ts +102 -5
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +9 -6
- 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 +2 -2
- package/src/runtime/routes/playground/helpers.ts +1 -2
- 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 +10 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +288 -88
- package/src/runtime/routes/secret-routes.ts +31 -6
- 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 +166 -73
- 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 +9 -0
- package/src/runtime/routes/surface-content-routes.ts +10 -2
- package/src/runtime/routes/surface-conversation-resolver.ts +4 -3
- package/src/runtime/routes/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- package/src/runtime/routes/tool-call-confirmation-enrichment.test.ts +161 -0
- package/src/runtime/routes/tool-call-confirmation-enrichment.ts +107 -0
- package/src/runtime/routes/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +31 -2
- package/src/runtime/routes/tts-routes.ts +48 -6
- package/src/runtime/routes/types.ts +83 -16
- 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 +118 -42
- 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 +50 -2
- package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
- package/src/runtime/routes/work-items-routes.ts +49 -23
- 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 +124 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +8 -4
- package/src/runtime/services/analyze-conversation.ts +5 -8
- package/src/runtime/services/conversation-serializer.ts +24 -2
- package/src/runtime/sync/resource-sync-events.ts +16 -2
- package/src/runtime/sync/sync-publisher.ts +2 -2
- package/src/schedule/run-script.ts +28 -3
- package/src/schedule/schedule-store.ts +28 -1
- package/src/schedule/schedule-usage-store.ts +83 -0
- package/src/schedule/scheduler.ts +15 -6
- package/src/signals/cancel.ts +2 -4
- package/src/signals/user-message.ts +5 -8
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/catalog-install.ts +3 -0
- package/src/skills/categories-cache.ts +118 -0
- package/src/skills/clawhub-files.ts +1 -0
- package/src/skills/skillssh-files.ts +1 -0
- package/src/subagent/manager.ts +20 -11
- package/src/telemetry/types.ts +55 -1
- package/src/telemetry/usage-telemetry-reporter.test.ts +250 -4
- package/src/telemetry/usage-telemetry-reporter.ts +88 -2
- package/src/tools/acp/context.ts +20 -0
- package/src/tools/acp/list-agents.test.ts +7 -1
- package/src/tools/acp/spawn.test.ts +198 -93
- package/src/tools/acp/spawn.ts +32 -70
- package/src/tools/acp/steer.test.ts +105 -8
- package/src/tools/acp/steer.ts +48 -17
- package/src/tools/apps/definitions.ts +8 -4
- package/src/tools/apps/executors.ts +13 -8
- 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/computer-use/definitions.ts +28 -24
- 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/execution-target.ts +1 -1
- package/src/tools/execution-timeout.ts +3 -4
- package/src/tools/executor.ts +1 -53
- 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 +69 -32
- package/src/tools/host-filesystem/edit.ts +44 -42
- package/src/tools/host-filesystem/read.ts +49 -35
- package/src/tools/host-filesystem/transfer.ts +121 -108
- package/src/tools/host-filesystem/write.ts +33 -31
- package/src/tools/host-terminal/host-shell.ts +50 -48
- package/src/tools/memory/register.ts +23 -24
- package/src/tools/network/__tests__/web-search-metadata.test.ts +7 -1
- package/src/tools/network/__tests__/web-search.test.ts +11 -3
- package/src/tools/network/web-fetch.ts +49 -46
- package/src/tools/network/web-search-error.test.ts +248 -0
- package/src/tools/network/web-search-error.ts +267 -0
- package/src/tools/network/web-search.ts +223 -61
- package/src/tools/registry.ts +39 -16
- package/src/tools/schedule/create.ts +13 -0
- 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/subagent/notify-parent.ts +35 -32
- package/src/tools/subagent/spawn.ts +2 -4
- package/src/tools/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- package/src/tools/terminal/safe-env.ts +10 -1
- package/src/tools/terminal/shell.ts +190 -61
- package/src/tools/tool-defaults.ts +20 -9
- package/src/tools/tool-manifest.ts +4 -4
- package/src/tools/types.ts +74 -23
- package/src/tools/ui-surface/definitions.ts +99 -10
- package/src/tts/__tests__/provider-catalog-consistency.test.ts +85 -1
- package/src/tts/provider-catalog.ts +76 -1
- package/src/usage/types.ts +10 -0
- package/src/util/errors.ts +2 -2
- package/src/util/map-limit.ts +27 -0
- package/src/util/mutex.ts +47 -0
- package/src/util/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- package/src/workspace/git-service.ts +1 -42
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
- 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/095-bump-heartbeat-interval-30m-to-60m.ts +51 -0
- package/src/workspace/migrations/096-reduce-quality-profile-effort.ts +72 -0
- package/src/workspace/migrations/097-enable-adaptive-thinking-managed-profiles.ts +117 -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 +12 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- package/src/__tests__/bootstrap-turn-cleanup.test.ts +0 -44
- package/src/__tests__/circuit-breaker-pipeline.test.ts +0 -405
- package/src/__tests__/compaction-pipeline.test.ts +0 -210
- package/src/__tests__/compaction-timeout-recovery.test.ts +0 -262
- package/src/__tests__/empty-response-pipeline.test.ts +0 -301
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- package/src/__tests__/llm-call-pipeline.test.ts +0 -281
- package/src/__tests__/memory-retrieval-pipeline.test.ts +0 -418
- package/src/__tests__/persistence-pipeline.test.ts +0 -514
- package/src/__tests__/title-generate-pipeline.test.ts +0 -211
- package/src/__tests__/token-estimate-pipeline.test.ts +0 -481
- package/src/__tests__/tool-error-pipeline.test.ts +0 -241
- package/src/__tests__/tool-execute-pipeline.test.ts +0 -417
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +0 -344
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
- package/src/cli/commands/memory-v3-render.ts +0 -491
- package/src/daemon/bootstrap-turn-cleanup.ts +0 -45
- package/src/daemon/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- package/src/gallery/default-gallery.ts +0 -1359
- package/src/gallery/gallery-manifest.ts +0 -28
- package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
- package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -466
- package/src/memory/v3/__tests__/coretrieval-seed.test.ts +0 -270
- package/src/memory/v3/__tests__/edge-learning-job.test.ts +0 -324
- package/src/memory/v3/__tests__/edges.test.ts +0 -706
- package/src/memory/v3/__tests__/filter.test.ts +0 -560
- package/src/memory/v3/__tests__/gate.test.ts +0 -637
- package/src/memory/v3/__tests__/index-composition.test.ts +0 -291
- package/src/memory/v3/__tests__/loop.test.ts +0 -775
- package/src/memory/v3/__tests__/retriever.test.ts +0 -226
- package/src/memory/v3/__tests__/scouts.test.ts +0 -489
- package/src/memory/v3/__tests__/shadow-diff.test.ts +0 -225
- package/src/memory/v3/__tests__/shadow-middleware.test.ts +0 -398
- package/src/memory/v3/__tests__/system-prompts.test.ts +0 -154
- package/src/memory/v3/__tests__/traversal.test.ts +0 -508
- 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 -784
- package/src/memory/v3/__tests__/validate.test.ts +0 -277
- 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/coretrieval-seed.ts +0 -240
- package/src/memory/v3/edge-learning-job.ts +0 -160
- package/src/memory/v3/edges.ts +0 -286
- package/src/memory/v3/filter.ts +0 -286
- package/src/memory/v3/gate.ts +0 -349
- package/src/memory/v3/index-composition.ts +0 -126
- package/src/memory/v3/llm-capture.ts +0 -46
- package/src/memory/v3/loop.ts +0 -430
- 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 -431
- package/src/memory/v3/shadow-diff.ts +0 -287
- package/src/memory/v3/shadow-middleware.ts +0 -347
- package/src/memory/v3/traversal.ts +0 -211
- 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 -356
- package/src/memory/v3/types.ts +0 -65
- package/src/memory/v3/validate.ts +0 -323
- 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/llm-call.ts +0 -77
- package/src/plugins/defaults/memory-retrieval.ts +0 -219
- package/src/plugins/defaults/overflow-reduce.ts +0 -185
- package/src/plugins/defaults/persistence.ts +0 -146
- 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-execute.ts +0 -87
- package/src/plugins/defaults/tool-result-truncate.ts +0 -84
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
- package/src/skills/category-inference.ts +0 -111
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { rmSync, writeFileSync } from "node:fs";
|
|
2
2
|
import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
3
3
|
|
|
4
|
+
import { CompactionCircuit } from "../agent/compaction-circuit.js";
|
|
4
5
|
import type {
|
|
5
6
|
AgentEvent,
|
|
7
|
+
AgentLoopRunResult,
|
|
6
8
|
CheckpointDecision,
|
|
7
9
|
CheckpointInfo,
|
|
10
|
+
ExitReason,
|
|
8
11
|
} from "../agent/loop.js";
|
|
9
12
|
import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
10
13
|
import type { Message, ProviderResponse } from "../providers/types.js";
|
|
@@ -175,7 +178,7 @@ mock.module("../memory/conversation-crud.js", () => ({
|
|
|
175
178
|
_convId: string,
|
|
176
179
|
role: string,
|
|
177
180
|
content: string,
|
|
178
|
-
metadata?: Record<string, unknown
|
|
181
|
+
options?: { metadata?: Record<string, unknown> },
|
|
179
182
|
) => {
|
|
180
183
|
// Simulate a persist failure for tests that need to exercise the
|
|
181
184
|
// tail-persist-failed path in drainBatch. Triggered by matching any
|
|
@@ -186,7 +189,12 @@ mock.module("../memory/conversation-crud.js", () => ({
|
|
|
186
189
|
}
|
|
187
190
|
}
|
|
188
191
|
const id = `msg-${Date.now()}-${capturedAddMessages.length}`;
|
|
189
|
-
capturedAddMessages.push({
|
|
192
|
+
capturedAddMessages.push({
|
|
193
|
+
id,
|
|
194
|
+
role,
|
|
195
|
+
content,
|
|
196
|
+
metadata: options?.metadata,
|
|
197
|
+
});
|
|
190
198
|
return { id };
|
|
191
199
|
},
|
|
192
200
|
updateConversationUsage: () => {},
|
|
@@ -321,12 +329,20 @@ interface PendingRun {
|
|
|
321
329
|
onCheckpoint?: (
|
|
322
330
|
checkpoint: CheckpointInfo,
|
|
323
331
|
) => CheckpointDecision | Promise<CheckpointDecision>;
|
|
332
|
+
/**
|
|
333
|
+
* Pause-reason recorded from the most recent `onCheckpoint` call, mirroring
|
|
334
|
+
* how the production loop carries it back via {@link AgentLoopRunResult}.
|
|
335
|
+
* `resolve(history)` packages this into the run result so the orchestrator
|
|
336
|
+
* derives its handoff bookkeeping the same way it does against the real loop.
|
|
337
|
+
*/
|
|
338
|
+
exitReason: ExitReason | null;
|
|
324
339
|
}
|
|
325
340
|
|
|
326
341
|
let pendingRuns: PendingRun[] = [];
|
|
327
342
|
|
|
328
343
|
mock.module("../agent/loop.js", () => ({
|
|
329
344
|
AgentLoop: class {
|
|
345
|
+
compactionCircuit = new CompactionCircuit("test-conv");
|
|
330
346
|
constructor() {}
|
|
331
347
|
getToolTokenBudget() {
|
|
332
348
|
return 0;
|
|
@@ -340,14 +356,34 @@ mock.module("../agent/loop.js", () => ({
|
|
|
340
356
|
async run(
|
|
341
357
|
messages: Message[],
|
|
342
358
|
onEvent: (event: AgentEvent) => void | Promise<void>,
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
): Promise<
|
|
349
|
-
return new Promise<
|
|
350
|
-
|
|
359
|
+
options?: {
|
|
360
|
+
onCheckpoint?: (
|
|
361
|
+
checkpoint: CheckpointInfo,
|
|
362
|
+
) => CheckpointDecision | Promise<CheckpointDecision>;
|
|
363
|
+
},
|
|
364
|
+
): Promise<AgentLoopRunResult> {
|
|
365
|
+
return new Promise<AgentLoopRunResult>((resolveResult, reject) => {
|
|
366
|
+
const pending: PendingRun = {
|
|
367
|
+
resolve: (history: Message[]) =>
|
|
368
|
+
resolveResult({
|
|
369
|
+
history,
|
|
370
|
+
exitReason: pending.exitReason,
|
|
371
|
+
appendedNewMessages: history.length > messages.length,
|
|
372
|
+
newMessages: history.slice(messages.length),
|
|
373
|
+
}),
|
|
374
|
+
reject,
|
|
375
|
+
messages,
|
|
376
|
+
onEvent,
|
|
377
|
+
exitReason: null,
|
|
378
|
+
onCheckpoint: options?.onCheckpoint
|
|
379
|
+
? async (checkpoint) => {
|
|
380
|
+
const decision = await options.onCheckpoint!(checkpoint);
|
|
381
|
+
pending.exitReason = decision === "continue" ? null : decision;
|
|
382
|
+
return decision;
|
|
383
|
+
}
|
|
384
|
+
: undefined,
|
|
385
|
+
};
|
|
386
|
+
pendingRuns.push(pending);
|
|
351
387
|
});
|
|
352
388
|
}
|
|
353
389
|
},
|
|
@@ -411,9 +447,9 @@ function makeConversation(
|
|
|
411
447
|
"conv-1",
|
|
412
448
|
provider,
|
|
413
449
|
"system prompt",
|
|
414
|
-
4096,
|
|
415
450
|
sendToClient ?? (() => {}),
|
|
416
451
|
"/tmp",
|
|
452
|
+
{ maxTokens: 4096 },
|
|
417
453
|
);
|
|
418
454
|
const conversationWithWorkspaceDeps =
|
|
419
455
|
conversationObj as ConversationWithWorkspaceDeps;
|
|
@@ -524,12 +560,12 @@ describe("Conversation message queue", () => {
|
|
|
524
560
|
const events2: ServerMessage[] = [];
|
|
525
561
|
|
|
526
562
|
// Start first message — this will block on AgentLoop.run
|
|
527
|
-
const p1 = conversation.processMessage(
|
|
528
|
-
"msg-1",
|
|
529
|
-
[],
|
|
530
|
-
(e) => events1.push(e),
|
|
531
|
-
"req-1",
|
|
532
|
-
);
|
|
563
|
+
const p1 = conversation.processMessage({
|
|
564
|
+
content: "msg-1",
|
|
565
|
+
attachments: [],
|
|
566
|
+
onEvent: (e) => events1.push(e),
|
|
567
|
+
requestId: "req-1",
|
|
568
|
+
});
|
|
533
569
|
|
|
534
570
|
// Wait for the first AgentLoop.run to be registered
|
|
535
571
|
await waitForPendingRun(1);
|
|
@@ -574,12 +610,12 @@ describe("Conversation message queue", () => {
|
|
|
574
610
|
const events3: ServerMessage[] = [];
|
|
575
611
|
|
|
576
612
|
// Start first message
|
|
577
|
-
const p1 = conversation.processMessage(
|
|
578
|
-
"msg-1",
|
|
579
|
-
[],
|
|
580
|
-
(e) => events1.push(e),
|
|
581
|
-
"req-1",
|
|
582
|
-
);
|
|
613
|
+
const p1 = conversation.processMessage({
|
|
614
|
+
content: "msg-1",
|
|
615
|
+
attachments: [],
|
|
616
|
+
onEvent: (e) => events1.push(e),
|
|
617
|
+
requestId: "req-1",
|
|
618
|
+
});
|
|
583
619
|
await waitForPendingRun(1);
|
|
584
620
|
|
|
585
621
|
// Enqueue two more sibling passthrough messages
|
|
@@ -649,7 +685,11 @@ describe("Conversation message queue", () => {
|
|
|
649
685
|
const events2: ServerMessage[] = [];
|
|
650
686
|
|
|
651
687
|
// Start first message
|
|
652
|
-
const p1 = conversation.processMessage(
|
|
688
|
+
const p1 = conversation.processMessage({
|
|
689
|
+
content: "msg-1",
|
|
690
|
+
attachments: [],
|
|
691
|
+
requestId: "req-1",
|
|
692
|
+
});
|
|
653
693
|
await waitForPendingRun(1);
|
|
654
694
|
|
|
655
695
|
// Enqueue second — simulating what handleUserMessage does
|
|
@@ -687,7 +727,11 @@ describe("Conversation message queue", () => {
|
|
|
687
727
|
const events3: ServerMessage[] = [];
|
|
688
728
|
|
|
689
729
|
// Start first message
|
|
690
|
-
conversation.processMessage(
|
|
730
|
+
conversation.processMessage({
|
|
731
|
+
content: "msg-1",
|
|
732
|
+
attachments: [],
|
|
733
|
+
requestId: "req-1",
|
|
734
|
+
});
|
|
691
735
|
await waitForPendingRun(1);
|
|
692
736
|
|
|
693
737
|
// Enqueue two more
|
|
@@ -746,12 +790,12 @@ describe("Conversation message queue", () => {
|
|
|
746
790
|
const events: ServerMessage[] = [];
|
|
747
791
|
|
|
748
792
|
// Start a message — blocks on AgentLoop.run
|
|
749
|
-
const p1 = conversation.processMessage(
|
|
750
|
-
"msg-1",
|
|
751
|
-
[],
|
|
752
|
-
(e) => events.push(e),
|
|
753
|
-
"req-1",
|
|
754
|
-
);
|
|
793
|
+
const p1 = conversation.processMessage({
|
|
794
|
+
content: "msg-1",
|
|
795
|
+
attachments: [],
|
|
796
|
+
onEvent: (e) => events.push(e),
|
|
797
|
+
requestId: "req-1",
|
|
798
|
+
});
|
|
755
799
|
await waitForPendingRun(1);
|
|
756
800
|
|
|
757
801
|
// Reject the AgentLoop.run() with a provider error to trigger the
|
|
@@ -773,7 +817,11 @@ describe("Conversation message queue", () => {
|
|
|
773
817
|
await conversation.loadFromDb();
|
|
774
818
|
|
|
775
819
|
// Start first message
|
|
776
|
-
const p1 = conversation.processMessage(
|
|
820
|
+
const p1 = conversation.processMessage({
|
|
821
|
+
content: "msg-1",
|
|
822
|
+
attachments: [],
|
|
823
|
+
requestId: "req-1",
|
|
824
|
+
});
|
|
777
825
|
await waitForPendingRun(1);
|
|
778
826
|
|
|
779
827
|
expect(conversation.getQueueDepth()).toBe(0);
|
|
@@ -810,12 +858,12 @@ describe("Conversation message queue", () => {
|
|
|
810
858
|
const events3: ServerMessage[] = [];
|
|
811
859
|
|
|
812
860
|
// Start first message — blocks on AgentLoop.run
|
|
813
|
-
const p1 = conversation.processMessage(
|
|
814
|
-
"msg-1",
|
|
815
|
-
[],
|
|
816
|
-
(e) => events1.push(e),
|
|
817
|
-
"req-1",
|
|
818
|
-
);
|
|
861
|
+
const p1 = conversation.processMessage({
|
|
862
|
+
content: "msg-1",
|
|
863
|
+
attachments: [],
|
|
864
|
+
onEvent: (e) => events1.push(e),
|
|
865
|
+
requestId: "req-1",
|
|
866
|
+
});
|
|
819
867
|
await waitForPendingRun(1);
|
|
820
868
|
|
|
821
869
|
// Enqueue a message with empty content (will fail persistUserMessage)
|
|
@@ -878,7 +926,11 @@ describe("Batched drain", () => {
|
|
|
878
926
|
const events5: ServerMessage[] = [];
|
|
879
927
|
|
|
880
928
|
// Start in-flight message (msg-1)
|
|
881
|
-
const p1 = conversation.processMessage(
|
|
929
|
+
const p1 = conversation.processMessage({
|
|
930
|
+
content: "msg-1",
|
|
931
|
+
attachments: [],
|
|
932
|
+
requestId: "req-1",
|
|
933
|
+
});
|
|
882
934
|
await waitForPendingRun(1);
|
|
883
935
|
|
|
884
936
|
// Enqueue 4 messages with interfaces [macos, macos, cli, macos].
|
|
@@ -985,7 +1037,11 @@ describe("Batched drain", () => {
|
|
|
985
1037
|
const eventsWorld: ServerMessage[] = [];
|
|
986
1038
|
|
|
987
1039
|
// Start in-flight message
|
|
988
|
-
const p1 = conversation.processMessage(
|
|
1040
|
+
const p1 = conversation.processMessage({
|
|
1041
|
+
content: "msg-1",
|
|
1042
|
+
attachments: [],
|
|
1043
|
+
requestId: "req-1",
|
|
1044
|
+
});
|
|
989
1045
|
await waitForPendingRun(1);
|
|
990
1046
|
|
|
991
1047
|
// Enqueue ["hello", "/compact", "world"]. /compact resolves to a non-
|
|
@@ -1054,7 +1110,11 @@ describe("Batched drain", () => {
|
|
|
1054
1110
|
const eventsPlainB: ServerMessage[] = [];
|
|
1055
1111
|
|
|
1056
1112
|
// Start in-flight message
|
|
1057
|
-
const p1 = conversation.processMessage(
|
|
1113
|
+
const p1 = conversation.processMessage({
|
|
1114
|
+
content: "msg-1",
|
|
1115
|
+
attachments: [],
|
|
1116
|
+
requestId: "req-1",
|
|
1117
|
+
});
|
|
1058
1118
|
await waitForPendingRun(1);
|
|
1059
1119
|
|
|
1060
1120
|
// Enqueue ["plain-a", "/status", "plain-b"]. /status resolves to a non-
|
|
@@ -1119,7 +1179,11 @@ describe("Batched drain", () => {
|
|
|
1119
1179
|
await conversation.loadFromDb();
|
|
1120
1180
|
|
|
1121
1181
|
// Start in-flight message
|
|
1122
|
-
const p1 = conversation.processMessage(
|
|
1182
|
+
const p1 = conversation.processMessage({
|
|
1183
|
+
content: "msg-1",
|
|
1184
|
+
attachments: [],
|
|
1185
|
+
requestId: "req-1",
|
|
1186
|
+
});
|
|
1123
1187
|
await waitForPendingRun(1);
|
|
1124
1188
|
|
|
1125
1189
|
// Two sibling messages, each with a distinct image attachment.
|
|
@@ -1202,7 +1266,11 @@ describe("Batched drain", () => {
|
|
|
1202
1266
|
new MessageQueue(budget);
|
|
1203
1267
|
|
|
1204
1268
|
// Start in-flight so subsequent enqueues are queued (not processed).
|
|
1205
|
-
const p1 = conversation.processMessage(
|
|
1269
|
+
const p1 = conversation.processMessage({
|
|
1270
|
+
content: "msg-1",
|
|
1271
|
+
attachments: [],
|
|
1272
|
+
requestId: "req-1",
|
|
1273
|
+
});
|
|
1206
1274
|
await waitForPendingRun(1);
|
|
1207
1275
|
|
|
1208
1276
|
// Fill to just-under budget: two ~500-char messages (1512+1512 = 3024 bytes).
|
|
@@ -1255,7 +1323,11 @@ describe("Batched drain", () => {
|
|
|
1255
1323
|
// After the full drain, the byte budget must be fully reclaimed — a fresh
|
|
1256
1324
|
// round of enqueues up to the budget should succeed again. Spin up another
|
|
1257
1325
|
// in-flight message to reach the queueing state.
|
|
1258
|
-
const p2 = conversation.processMessage(
|
|
1326
|
+
const p2 = conversation.processMessage({
|
|
1327
|
+
content: "msg-2",
|
|
1328
|
+
attachments: [],
|
|
1329
|
+
requestId: "req-2",
|
|
1330
|
+
});
|
|
1259
1331
|
await waitForPendingRun(3);
|
|
1260
1332
|
expect(
|
|
1261
1333
|
conversation.enqueueMessage({
|
|
@@ -1297,7 +1369,11 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1297
1369
|
const eventsRegular: ServerMessage[] = [];
|
|
1298
1370
|
|
|
1299
1371
|
// Start in-flight message
|
|
1300
|
-
const p1 = conversation.processMessage(
|
|
1372
|
+
const p1 = conversation.processMessage({
|
|
1373
|
+
content: "msg-1",
|
|
1374
|
+
attachments: [],
|
|
1375
|
+
requestId: "req-1",
|
|
1376
|
+
});
|
|
1301
1377
|
await waitForPendingRun(1);
|
|
1302
1378
|
|
|
1303
1379
|
// Enqueue a surface-action message (activeSurfaceId set + tracked in
|
|
@@ -1359,12 +1435,12 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1359
1435
|
const events4: ServerMessage[] = [];
|
|
1360
1436
|
|
|
1361
1437
|
// Start in-flight message
|
|
1362
|
-
const p1 = conversation.processMessage(
|
|
1363
|
-
"msg-1",
|
|
1364
|
-
[],
|
|
1365
|
-
(e) => events1.push(e),
|
|
1366
|
-
"req-1",
|
|
1367
|
-
);
|
|
1438
|
+
const p1 = conversation.processMessage({
|
|
1439
|
+
content: "msg-1",
|
|
1440
|
+
attachments: [],
|
|
1441
|
+
onEvent: (e) => events1.push(e),
|
|
1442
|
+
requestId: "req-1",
|
|
1443
|
+
});
|
|
1368
1444
|
await waitForPendingRun(1);
|
|
1369
1445
|
|
|
1370
1446
|
// Enqueue three sibling passthroughs (msg-2 = head, msg-3 = mid,
|
|
@@ -1438,12 +1514,12 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1438
1514
|
const events4: ServerMessage[] = [];
|
|
1439
1515
|
|
|
1440
1516
|
// Start in-flight message
|
|
1441
|
-
const p1 = conversation.processMessage(
|
|
1442
|
-
"msg-1",
|
|
1443
|
-
[],
|
|
1444
|
-
(e) => events1.push(e),
|
|
1445
|
-
"req-1",
|
|
1446
|
-
);
|
|
1517
|
+
const p1 = conversation.processMessage({
|
|
1518
|
+
content: "msg-1",
|
|
1519
|
+
attachments: [],
|
|
1520
|
+
onEvent: (e) => events1.push(e),
|
|
1521
|
+
requestId: "req-1",
|
|
1522
|
+
});
|
|
1447
1523
|
await waitForPendingRun(1);
|
|
1448
1524
|
|
|
1449
1525
|
// Enqueue three siblings. Configure addMessage to throw for the second
|
|
@@ -1500,12 +1576,12 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1500
1576
|
const events3: ServerMessage[] = [];
|
|
1501
1577
|
const events4: ServerMessage[] = [];
|
|
1502
1578
|
|
|
1503
|
-
const p1 = conversation.processMessage(
|
|
1504
|
-
"msg-1",
|
|
1505
|
-
[],
|
|
1506
|
-
(e) => events1.push(e),
|
|
1507
|
-
"req-1",
|
|
1508
|
-
);
|
|
1579
|
+
const p1 = conversation.processMessage({
|
|
1580
|
+
content: "msg-1",
|
|
1581
|
+
attachments: [],
|
|
1582
|
+
onEvent: (e) => events1.push(e),
|
|
1583
|
+
requestId: "req-1",
|
|
1584
|
+
});
|
|
1509
1585
|
await waitForPendingRun(1);
|
|
1510
1586
|
|
|
1511
1587
|
// Mid tail will fail to persist. After the batched run resolves,
|
|
@@ -1556,7 +1632,11 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1556
1632
|
await conversation.loadFromDb();
|
|
1557
1633
|
|
|
1558
1634
|
// Start in-flight message
|
|
1559
|
-
const p1 = conversation.processMessage(
|
|
1635
|
+
const p1 = conversation.processMessage({
|
|
1636
|
+
content: "msg-1",
|
|
1637
|
+
attachments: [],
|
|
1638
|
+
requestId: "req-1",
|
|
1639
|
+
});
|
|
1560
1640
|
await waitForPendingRun(1);
|
|
1561
1641
|
|
|
1562
1642
|
// Snapshot the count before drain so we only compare batch-emitted
|
|
@@ -1630,7 +1710,11 @@ describe("Conversation queue policy helpers", () => {
|
|
|
1630
1710
|
await conversation.loadFromDb();
|
|
1631
1711
|
|
|
1632
1712
|
// Start processing to make the session busy
|
|
1633
|
-
conversation.processMessage(
|
|
1713
|
+
conversation.processMessage({
|
|
1714
|
+
content: "msg-1",
|
|
1715
|
+
attachments: [],
|
|
1716
|
+
requestId: "req-1",
|
|
1717
|
+
});
|
|
1634
1718
|
await waitForPendingRun(1);
|
|
1635
1719
|
|
|
1636
1720
|
// Enqueue a message while processing
|
|
@@ -1657,7 +1741,11 @@ describe("Conversation queue policy helpers", () => {
|
|
|
1657
1741
|
await conversation.loadFromDb();
|
|
1658
1742
|
|
|
1659
1743
|
// Start processing — but don't enqueue anything
|
|
1660
|
-
conversation.processMessage(
|
|
1744
|
+
conversation.processMessage({
|
|
1745
|
+
content: "msg-1",
|
|
1746
|
+
attachments: [],
|
|
1747
|
+
requestId: "req-1",
|
|
1748
|
+
});
|
|
1661
1749
|
await waitForPendingRun(1);
|
|
1662
1750
|
|
|
1663
1751
|
expect(conversation.isProcessing()).toBe(true);
|
|
@@ -1674,7 +1762,11 @@ describe("Conversation queue policy helpers", () => {
|
|
|
1674
1762
|
await conversation.loadFromDb();
|
|
1675
1763
|
|
|
1676
1764
|
// Start processing
|
|
1677
|
-
conversation.processMessage(
|
|
1765
|
+
conversation.processMessage({
|
|
1766
|
+
content: "msg-1",
|
|
1767
|
+
attachments: [],
|
|
1768
|
+
requestId: "req-1",
|
|
1769
|
+
});
|
|
1678
1770
|
await waitForPendingRun(1);
|
|
1679
1771
|
|
|
1680
1772
|
// Enqueue a message
|
|
@@ -1725,12 +1817,12 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1725
1817
|
const events1: ServerMessage[] = [];
|
|
1726
1818
|
|
|
1727
1819
|
// Start processing first message
|
|
1728
|
-
const p1 = conversation.processMessage(
|
|
1729
|
-
"msg-1",
|
|
1730
|
-
[],
|
|
1731
|
-
(e) => events1.push(e),
|
|
1732
|
-
"req-1",
|
|
1733
|
-
);
|
|
1820
|
+
const p1 = conversation.processMessage({
|
|
1821
|
+
content: "msg-1",
|
|
1822
|
+
attachments: [],
|
|
1823
|
+
onEvent: (e) => events1.push(e),
|
|
1824
|
+
requestId: "req-1",
|
|
1825
|
+
});
|
|
1734
1826
|
await waitForPendingRun(1);
|
|
1735
1827
|
|
|
1736
1828
|
// Enqueue a second message while the first is processing
|
|
@@ -1748,8 +1840,8 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1748
1840
|
history: [],
|
|
1749
1841
|
});
|
|
1750
1842
|
|
|
1751
|
-
// Because there is a queued message, the callback should
|
|
1752
|
-
expect(decision).
|
|
1843
|
+
// Because there is a queued message, the callback should yield for handoff
|
|
1844
|
+
expect(decision).toEqual("handoff");
|
|
1753
1845
|
|
|
1754
1846
|
// Complete the run so the conversation finishes cleanly
|
|
1755
1847
|
await resolveRun(0);
|
|
@@ -1776,7 +1868,11 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1776
1868
|
await conversation.loadFromDb();
|
|
1777
1869
|
|
|
1778
1870
|
// Start processing — no enqueued messages
|
|
1779
|
-
const p1 = conversation.processMessage(
|
|
1871
|
+
const p1 = conversation.processMessage({
|
|
1872
|
+
content: "msg-1",
|
|
1873
|
+
attachments: [],
|
|
1874
|
+
requestId: "req-1",
|
|
1875
|
+
});
|
|
1780
1876
|
await waitForPendingRun(1);
|
|
1781
1877
|
|
|
1782
1878
|
expect(conversation.hasQueuedMessages()).toBe(false);
|
|
@@ -1809,12 +1905,12 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1809
1905
|
const events4: ServerMessage[] = [];
|
|
1810
1906
|
|
|
1811
1907
|
// Start first message (mid-tool-use — will yield at the next checkpoint)
|
|
1812
|
-
const p1 = conversation.processMessage(
|
|
1813
|
-
"msg-1",
|
|
1814
|
-
[],
|
|
1815
|
-
(e) => events1.push(e),
|
|
1816
|
-
"req-1",
|
|
1817
|
-
);
|
|
1908
|
+
const p1 = conversation.processMessage({
|
|
1909
|
+
content: "msg-1",
|
|
1910
|
+
attachments: [],
|
|
1911
|
+
onEvent: (e) => events1.push(e),
|
|
1912
|
+
requestId: "req-1",
|
|
1913
|
+
});
|
|
1818
1914
|
await waitForPendingRun(1);
|
|
1819
1915
|
|
|
1820
1916
|
// Enqueue three sibling passthroughs while msg-1 is mid-turn
|
|
@@ -1844,7 +1940,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1844
1940
|
hasToolUse: true,
|
|
1845
1941
|
history: [],
|
|
1846
1942
|
});
|
|
1847
|
-
expect(decision).
|
|
1943
|
+
expect(decision).toEqual("handoff");
|
|
1848
1944
|
|
|
1849
1945
|
// Complete first run
|
|
1850
1946
|
await resolveRun(0);
|
|
@@ -1877,12 +1973,12 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1877
1973
|
const events2: ServerMessage[] = [];
|
|
1878
1974
|
|
|
1879
1975
|
// Start processing first message
|
|
1880
|
-
const p1 = conversation.processMessage(
|
|
1881
|
-
"msg-1",
|
|
1882
|
-
[],
|
|
1883
|
-
(e) => events1.push(e),
|
|
1884
|
-
"req-1",
|
|
1885
|
-
);
|
|
1976
|
+
const p1 = conversation.processMessage({
|
|
1977
|
+
content: "msg-1",
|
|
1978
|
+
attachments: [],
|
|
1979
|
+
onEvent: (e) => events1.push(e),
|
|
1980
|
+
requestId: "req-1",
|
|
1981
|
+
});
|
|
1886
1982
|
await waitForPendingRun(1);
|
|
1887
1983
|
|
|
1888
1984
|
// Enqueue a second message while the first is processing
|
|
@@ -1894,7 +1990,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1894
1990
|
expect(conversation.hasQueuedMessages()).toBe(true);
|
|
1895
1991
|
|
|
1896
1992
|
// Simulate tool-use turns: the agent loop calls onCheckpoint at each turn boundary.
|
|
1897
|
-
// Because there is a queued message, the callback should
|
|
1993
|
+
// Because there is a queued message, the callback should yield for handoff.
|
|
1898
1994
|
const run = pendingRuns[0];
|
|
1899
1995
|
expect(run.onCheckpoint).toBeDefined();
|
|
1900
1996
|
|
|
@@ -1906,7 +2002,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1906
2002
|
hasToolUse: true,
|
|
1907
2003
|
history: [],
|
|
1908
2004
|
});
|
|
1909
|
-
expect(decision).
|
|
2005
|
+
expect(decision).toEqual("handoff");
|
|
1910
2006
|
|
|
1911
2007
|
// Complete the run (AgentLoop resolves after yielding)
|
|
1912
2008
|
await resolveRun(0);
|
|
@@ -1948,12 +2044,12 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1948
2044
|
};
|
|
1949
2045
|
|
|
1950
2046
|
// Start processing message A
|
|
1951
|
-
const pA = conversation.processMessage(
|
|
1952
|
-
"msg-A",
|
|
1953
|
-
[],
|
|
1954
|
-
(e) => eventsA.push(e),
|
|
1955
|
-
"req-A",
|
|
1956
|
-
);
|
|
2047
|
+
const pA = conversation.processMessage({
|
|
2048
|
+
content: "msg-A",
|
|
2049
|
+
attachments: [],
|
|
2050
|
+
onEvent: (e) => eventsA.push(e),
|
|
2051
|
+
requestId: "req-A",
|
|
2052
|
+
});
|
|
1957
2053
|
await waitForPendingRun(1);
|
|
1958
2054
|
|
|
1959
2055
|
// Enqueue messages B, C, D — each on a distinct userMessageInterface so the
|
|
@@ -1992,7 +2088,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1992
2088
|
hasToolUse: true,
|
|
1993
2089
|
history: [],
|
|
1994
2090
|
}),
|
|
1995
|
-
).
|
|
2091
|
+
).toEqual("handoff");
|
|
1996
2092
|
await resolveRun(0);
|
|
1997
2093
|
await pA;
|
|
1998
2094
|
|
|
@@ -2009,7 +2105,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
2009
2105
|
hasToolUse: true,
|
|
2010
2106
|
history: [],
|
|
2011
2107
|
}),
|
|
2012
|
-
).
|
|
2108
|
+
).toEqual("handoff");
|
|
2013
2109
|
await resolveRun(1);
|
|
2014
2110
|
await waitForPendingRun(3);
|
|
2015
2111
|
|
|
@@ -2024,7 +2120,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
2024
2120
|
hasToolUse: true,
|
|
2025
2121
|
history: [],
|
|
2026
2122
|
}),
|
|
2027
|
-
).
|
|
2123
|
+
).toEqual("handoff");
|
|
2028
2124
|
await resolveRun(2);
|
|
2029
2125
|
await waitForPendingRun(4);
|
|
2030
2126
|
|
|
@@ -2056,12 +2152,12 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
2056
2152
|
const eventsC: ServerMessage[] = [];
|
|
2057
2153
|
|
|
2058
2154
|
// Start processing message A
|
|
2059
|
-
const pA = conversation.processMessage(
|
|
2060
|
-
"msg-A",
|
|
2061
|
-
[],
|
|
2062
|
-
(e) => eventsA.push(e),
|
|
2063
|
-
"req-A",
|
|
2064
|
-
);
|
|
2155
|
+
const pA = conversation.processMessage({
|
|
2156
|
+
content: "msg-A",
|
|
2157
|
+
attachments: [],
|
|
2158
|
+
onEvent: (e) => eventsA.push(e),
|
|
2159
|
+
requestId: "req-A",
|
|
2160
|
+
});
|
|
2065
2161
|
await waitForPendingRun(1);
|
|
2066
2162
|
|
|
2067
2163
|
// Enqueue B (empty content — will fail to persist) and C (valid)
|
|
@@ -2107,7 +2203,11 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
2107
2203
|
await conversation.loadFromDb();
|
|
2108
2204
|
|
|
2109
2205
|
// Start processing
|
|
2110
|
-
const p1 = conversation.processMessage(
|
|
2206
|
+
const p1 = conversation.processMessage({
|
|
2207
|
+
content: "msg-1",
|
|
2208
|
+
attachments: [],
|
|
2209
|
+
requestId: "req-1",
|
|
2210
|
+
});
|
|
2111
2211
|
await waitForPendingRun(1);
|
|
2112
2212
|
|
|
2113
2213
|
// The first run should have onCheckpoint
|
|
@@ -2151,7 +2251,11 @@ describe("Conversation usage requestId correlation", () => {
|
|
|
2151
2251
|
const conversation = makeConversation();
|
|
2152
2252
|
await conversation.loadFromDb();
|
|
2153
2253
|
|
|
2154
|
-
const p1 = conversation.processMessage(
|
|
2254
|
+
const p1 = conversation.processMessage({
|
|
2255
|
+
content: "msg-1",
|
|
2256
|
+
attachments: [],
|
|
2257
|
+
requestId: "req-42",
|
|
2258
|
+
});
|
|
2155
2259
|
await waitForPendingRun(1);
|
|
2156
2260
|
|
|
2157
2261
|
// Complete the run — this triggers recordUsage with the request's ID
|
|
@@ -2184,7 +2288,11 @@ describe("Terminal trace events on rejection/failure", () => {
|
|
|
2184
2288
|
await conversation.loadFromDb();
|
|
2185
2289
|
|
|
2186
2290
|
// Start first message
|
|
2187
|
-
const p1 = conversation.processMessage(
|
|
2291
|
+
const p1 = conversation.processMessage({
|
|
2292
|
+
content: "msg-1",
|
|
2293
|
+
attachments: [],
|
|
2294
|
+
requestId: "req-1",
|
|
2295
|
+
});
|
|
2188
2296
|
await waitForPendingRun(1);
|
|
2189
2297
|
|
|
2190
2298
|
// Enqueue empty content (will fail persistUserMessage)
|
|
@@ -2232,12 +2340,12 @@ describe("Conversation host attachment directives", () => {
|
|
|
2232
2340
|
const conversation = makeConversation((msg) => clientEvents.push(msg));
|
|
2233
2341
|
await conversation.loadFromDb();
|
|
2234
2342
|
|
|
2235
|
-
const p1 = conversation.processMessage(
|
|
2236
|
-
"msg-1",
|
|
2237
|
-
[],
|
|
2238
|
-
(e) => events.push(e),
|
|
2239
|
-
"req-1",
|
|
2240
|
-
);
|
|
2343
|
+
const p1 = conversation.processMessage({
|
|
2344
|
+
content: "msg-1",
|
|
2345
|
+
attachments: [],
|
|
2346
|
+
onEvent: (e) => events.push(e),
|
|
2347
|
+
requestId: "req-1",
|
|
2348
|
+
});
|
|
2241
2349
|
await waitForPendingRun(1);
|
|
2242
2350
|
|
|
2243
2351
|
const run = pendingRuns[0];
|
|
@@ -2302,12 +2410,12 @@ describe("Conversation host attachment directives", () => {
|
|
|
2302
2410
|
const conversation = makeConversation((msg) => clientEvents.push(msg));
|
|
2303
2411
|
await conversation.loadFromDb();
|
|
2304
2412
|
|
|
2305
|
-
const p1 = conversation.processMessage(
|
|
2306
|
-
"msg-1",
|
|
2307
|
-
[],
|
|
2308
|
-
(e) => events.push(e),
|
|
2309
|
-
"req-1",
|
|
2310
|
-
);
|
|
2413
|
+
const p1 = conversation.processMessage({
|
|
2414
|
+
content: "msg-1",
|
|
2415
|
+
attachments: [],
|
|
2416
|
+
onEvent: (e) => events.push(e),
|
|
2417
|
+
requestId: "req-1",
|
|
2418
|
+
});
|
|
2311
2419
|
await waitForPendingRun(1);
|
|
2312
2420
|
|
|
2313
2421
|
const run = pendingRuns[0];
|
|
@@ -2389,12 +2497,12 @@ describe("Conversation attachment event payloads", () => {
|
|
|
2389
2497
|
const conversation = makeConversation();
|
|
2390
2498
|
await conversation.loadFromDb();
|
|
2391
2499
|
|
|
2392
|
-
const p1 = conversation.processMessage(
|
|
2393
|
-
"msg-1",
|
|
2394
|
-
[],
|
|
2395
|
-
(e) => events.push(e),
|
|
2396
|
-
"req-1",
|
|
2397
|
-
);
|
|
2500
|
+
const p1 = conversation.processMessage({
|
|
2501
|
+
content: "msg-1",
|
|
2502
|
+
attachments: [],
|
|
2503
|
+
onEvent: (e) => events.push(e),
|
|
2504
|
+
requestId: "req-1",
|
|
2505
|
+
});
|
|
2398
2506
|
await waitForPendingRun(1);
|
|
2399
2507
|
|
|
2400
2508
|
const run = pendingRuns[0];
|
|
@@ -2452,12 +2560,12 @@ describe("Conversation attachment event payloads", () => {
|
|
|
2452
2560
|
const conversation = makeConversation();
|
|
2453
2561
|
await conversation.loadFromDb();
|
|
2454
2562
|
|
|
2455
|
-
const p1 = conversation.processMessage(
|
|
2456
|
-
"msg-1",
|
|
2457
|
-
[],
|
|
2458
|
-
(e) => events1.push(e),
|
|
2459
|
-
"req-1",
|
|
2460
|
-
);
|
|
2563
|
+
const p1 = conversation.processMessage({
|
|
2564
|
+
content: "msg-1",
|
|
2565
|
+
attachments: [],
|
|
2566
|
+
onEvent: (e) => events1.push(e),
|
|
2567
|
+
requestId: "req-1",
|
|
2568
|
+
});
|
|
2461
2569
|
await waitForPendingRun(1);
|
|
2462
2570
|
|
|
2463
2571
|
// Queue a second message so the first run yields via checkpoint handoff.
|
|
@@ -2472,7 +2580,7 @@ describe("Conversation attachment event payloads", () => {
|
|
|
2472
2580
|
hasToolUse: true,
|
|
2473
2581
|
history: [],
|
|
2474
2582
|
}),
|
|
2475
|
-
).
|
|
2583
|
+
).toEqual("handoff");
|
|
2476
2584
|
|
|
2477
2585
|
const assistantMsg: Message = {
|
|
2478
2586
|
role: "assistant",
|
|
@@ -2537,12 +2645,12 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2537
2645
|
await conversation.loadFromDb();
|
|
2538
2646
|
|
|
2539
2647
|
// Start processing a message — collect events from the per-message callback
|
|
2540
|
-
const p1 = conversation.processMessage(
|
|
2541
|
-
"msg-1",
|
|
2542
|
-
[],
|
|
2543
|
-
(e) => msgEvents.push(e),
|
|
2544
|
-
"req-1",
|
|
2545
|
-
);
|
|
2648
|
+
const p1 = conversation.processMessage({
|
|
2649
|
+
content: "msg-1",
|
|
2650
|
+
attachments: [],
|
|
2651
|
+
onEvent: (e) => msgEvents.push(e),
|
|
2652
|
+
requestId: "req-1",
|
|
2653
|
+
});
|
|
2546
2654
|
await waitForPendingRun(1);
|
|
2547
2655
|
|
|
2548
2656
|
// User cancels — sets the abort signal
|
|
@@ -2571,12 +2679,12 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2571
2679
|
await conversation.loadFromDb();
|
|
2572
2680
|
linkAttachmentShouldThrow = true;
|
|
2573
2681
|
|
|
2574
|
-
const p1 = conversation.processMessage(
|
|
2575
|
-
"msg-1",
|
|
2576
|
-
[],
|
|
2577
|
-
(e) => events.push(e),
|
|
2578
|
-
"req-1",
|
|
2579
|
-
);
|
|
2682
|
+
const p1 = conversation.processMessage({
|
|
2683
|
+
content: "msg-1",
|
|
2684
|
+
attachments: [],
|
|
2685
|
+
onEvent: (e) => events.push(e),
|
|
2686
|
+
requestId: "req-1",
|
|
2687
|
+
});
|
|
2580
2688
|
await waitForPendingRun(1);
|
|
2581
2689
|
const run = pendingRuns[0];
|
|
2582
2690
|
const assistantMsg: Message = {
|
|
@@ -2625,12 +2733,12 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2625
2733
|
const conversation = makeConversation();
|
|
2626
2734
|
await conversation.loadFromDb();
|
|
2627
2735
|
|
|
2628
|
-
const p1 = conversation.processMessage(
|
|
2629
|
-
"msg-1",
|
|
2630
|
-
[],
|
|
2631
|
-
(e) => allEvents.push(e),
|
|
2632
|
-
"req-1",
|
|
2633
|
-
);
|
|
2736
|
+
const p1 = conversation.processMessage({
|
|
2737
|
+
content: "msg-1",
|
|
2738
|
+
attachments: [],
|
|
2739
|
+
onEvent: (e) => allEvents.push(e),
|
|
2740
|
+
requestId: "req-1",
|
|
2741
|
+
});
|
|
2634
2742
|
await waitForPendingRun(1);
|
|
2635
2743
|
|
|
2636
2744
|
// Simulate a provider failure
|
|
@@ -2654,12 +2762,12 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2654
2762
|
|
|
2655
2763
|
const eventsPerMsg: ServerMessage[][] = [[], [], []];
|
|
2656
2764
|
|
|
2657
|
-
conversation.processMessage(
|
|
2658
|
-
"msg-1",
|
|
2659
|
-
[],
|
|
2660
|
-
(e) => eventsPerMsg[0].push(e),
|
|
2661
|
-
"req-1",
|
|
2662
|
-
);
|
|
2765
|
+
conversation.processMessage({
|
|
2766
|
+
content: "msg-1",
|
|
2767
|
+
attachments: [],
|
|
2768
|
+
onEvent: (e) => eventsPerMsg[0].push(e),
|
|
2769
|
+
requestId: "req-1",
|
|
2770
|
+
});
|
|
2663
2771
|
await waitForPendingRun(1);
|
|
2664
2772
|
|
|
2665
2773
|
conversation.enqueueMessage({
|
|
@@ -2706,12 +2814,12 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2706
2814
|
const events2: ServerMessage[] = [];
|
|
2707
2815
|
|
|
2708
2816
|
// Start first message (promise intentionally not awaited — we test queue drain behavior)
|
|
2709
|
-
const _p1 = conversation.processMessage(
|
|
2710
|
-
"msg-1",
|
|
2711
|
-
[],
|
|
2712
|
-
(e) => events1.push(e),
|
|
2713
|
-
"req-1",
|
|
2714
|
-
);
|
|
2817
|
+
const _p1 = conversation.processMessage({
|
|
2818
|
+
content: "msg-1",
|
|
2819
|
+
attachments: [],
|
|
2820
|
+
onEvent: (e) => events1.push(e),
|
|
2821
|
+
requestId: "req-1",
|
|
2822
|
+
});
|
|
2715
2823
|
await waitForPendingRun(1);
|
|
2716
2824
|
|
|
2717
2825
|
// Enqueue a second message while the first is processing
|