@vellumai/assistant 0.8.6 → 0.8.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +4 -4
- package/Dockerfile +1 -0
- package/bun.lock +11 -2
- package/docker-entrypoint.sh +8 -6
- package/docs/plugins.md +63 -28
- package/examples/plugins/echo/register.ts +4 -7
- package/knip.json +1 -0
- package/node_modules/@vellumai/environments/bun.lock +24 -0
- package/node_modules/@vellumai/environments/package.json +18 -0
- package/node_modules/@vellumai/environments/src/__tests__/package-boundary.test.ts +95 -0
- package/node_modules/@vellumai/environments/src/index.ts +11 -0
- package/node_modules/@vellumai/environments/src/seeds.ts +73 -0
- package/node_modules/@vellumai/environments/src/types.ts +70 -0
- package/node_modules/@vellumai/environments/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +11 -0
- package/node_modules/@vellumai/skill-host-contracts/src/client.ts +3 -4
- package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +6 -2
- package/openapi.yaml +3735 -353
- package/package.json +7 -3
- package/scripts/generate-openapi.ts +20 -13
- package/src/__tests__/agent-loop-callsite-precedence.test.ts +42 -80
- package/src/__tests__/agent-loop-exit-reason.test.ts +240 -39
- 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 +6 -4
- package/src/__tests__/agent-loop-thinking.test.ts +17 -12
- package/src/__tests__/agent-loop.test.ts +207 -341
- package/src/__tests__/agent-wake-disk-pressure-callsite.test.ts +4 -2
- package/src/__tests__/agent-wake-override-profile.test.ts +22 -40
- package/src/__tests__/anthropic-provider.test.ts +201 -55
- package/src/__tests__/app-builder-skill-instructions.test.ts +22 -0
- package/src/__tests__/app-control-flow.test.ts +5 -0
- package/src/__tests__/approval-cascade.test.ts +4 -11
- package/src/__tests__/approval-routes-http.test.ts +4 -2
- package/src/__tests__/assistant-event.test.ts +15 -0
- package/src/__tests__/assistant-feature-flags-integration.test.ts +2 -2
- 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__/btw-routes.test.ts +7 -12
- 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 +48 -20
- package/src/__tests__/channel-approvals.test.ts +3 -1
- 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__/circuit-breaker-pipeline.test.ts +3 -3
- package/src/__tests__/clawhub-files.test.ts +1 -0
- package/src/__tests__/compaction-events.test.ts +5 -17
- package/src/__tests__/compaction-pipeline.test.ts +1 -1
- package/src/__tests__/compaction-timeout-recovery.test.ts +37 -48
- package/src/__tests__/compaction-trail-store.test.ts +1 -79
- 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 +14 -7
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +3 -2
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +12 -27
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +430 -90
- package/src/__tests__/conversation-agent-loop.test.ts +581 -62
- package/src/__tests__/conversation-analysis-routes.test.ts +1 -3
- package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
- 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-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 +34 -4
- package/src/__tests__/conversation-pre-run-repair.test.ts +1 -1
- package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -0
- package/src/__tests__/conversation-process-callsite.test.ts +27 -30
- package/src/__tests__/conversation-provider-retry-repair.test.ts +53 -44
- package/src/__tests__/conversation-queue.test.ts +270 -164
- package/src/__tests__/conversation-routes-disk-view.test.ts +3 -2
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +2 -2
- package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -2
- package/src/__tests__/conversation-runtime-assembly.test.ts +20 -22
- package/src/__tests__/conversation-runtime-workspace.test.ts +19 -1
- package/src/__tests__/conversation-slash-queue.test.ts +37 -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-stream-state.test.ts +484 -0
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +6 -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-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 +3 -1
- package/src/__tests__/conversation-workspace-injection.test.ts +48 -22
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +27 -7
- 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 +6 -2
- package/src/__tests__/cu-unified-flow.test.ts +26 -1
- package/src/__tests__/db-schedule-syntax-migration.test.ts +11 -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 +7 -2
- package/src/__tests__/dynamic-page-surface.test.ts +68 -0
- package/src/__tests__/edit-propagation.test.ts +1 -2
- package/src/__tests__/empty-response-pipeline.test.ts +127 -5
- package/src/__tests__/filing-service.test.ts +2 -2
- package/src/__tests__/first-greeting.test.ts +55 -14
- package/src/__tests__/gemini-inline-media.test.ts +78 -0
- package/src/__tests__/gemini-provider.test.ts +351 -28
- package/src/__tests__/guardian-routing-state.test.ts +60 -71
- package/src/__tests__/handlers-user-message-approval-consumption.test.ts +9 -7
- package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
- package/src/__tests__/heartbeat-service.test.ts +2 -1
- package/src/__tests__/history-repair-hook.test.ts +161 -0
- package/src/__tests__/history-repair-observability.test.ts +1 -1
- package/src/__tests__/history-repair.test.ts +2 -1
- package/src/__tests__/host-app-control-proxy.test.ts +2 -0
- package/src/__tests__/host-cu-proxy.test.ts +2 -0
- package/src/__tests__/host-file-edit-tool.test.ts +4 -2
- package/src/__tests__/host-file-proxy.test.ts +31 -0
- package/src/__tests__/host-file-read-tool.test.ts +4 -2
- package/src/__tests__/host-file-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 +35 -14
- package/src/__tests__/inbound-slack-persistence.test.ts +7 -2
- package/src/__tests__/injector-background-turn.test.ts +1 -1
- package/src/__tests__/injector-chain.test.ts +1 -1
- package/src/__tests__/injector-disk-pressure.test.ts +1 -1
- package/src/__tests__/injector-document-comments.test.ts +1 -1
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +1 -1
- package/src/__tests__/injector-v3-suppression.test.ts +220 -0
- package/src/__tests__/list-messages-attachments.test.ts +7 -8
- package/src/__tests__/list-messages-hidden-metadata.test.ts +17 -15
- package/src/__tests__/list-messages-page-latest.test.ts +0 -1
- package/src/__tests__/list-messages-tool-merge.test.ts +36 -6
- package/src/__tests__/llm-call-pipeline.test.ts +21 -15
- package/src/__tests__/llm-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 +45 -0
- package/src/__tests__/log-export-routes.test.ts +59 -0
- package/src/__tests__/managed-skill-lifecycle.test.ts +1 -8
- package/src/__tests__/mcp-auth-routes.test.ts +15 -10
- package/src/__tests__/mcp-health-check.test.ts +18 -13
- package/src/__tests__/memory-retrieval-pipeline.test.ts +1 -1
- package/src/__tests__/memory-v2-static-injector.test.ts +1 -1
- package/src/__tests__/messaging-send-tool.test.ts +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 +14 -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 +10 -0
- package/src/__tests__/openai-provider.test.ts +66 -70
- 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 +2 -4
- package/src/__tests__/parallel-tool.benchmark.test.ts +24 -36
- package/src/__tests__/persistence-pipeline.test.ts +15 -26
- package/src/__tests__/persistence-secret-redaction.test.ts +2 -1
- package/src/__tests__/pipeline-runner.test.ts +2 -3
- package/src/__tests__/plugin-bootstrap.test.ts +51 -25
- 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 +7 -14
- 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 +30 -42
- 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__/relay-server.test.ts +20 -13
- 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 +353 -0
- package/src/__tests__/schedule-routes.test.ts +80 -10
- package/src/__tests__/schedule-store.test.ts +67 -0
- package/src/__tests__/schedule-tools.test.ts +125 -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 +2 -1
- package/src/__tests__/shell-observability.test.ts +249 -0
- package/src/__tests__/skill-feature-flags-integration.test.ts +11 -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 +2 -2
- 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 +54 -0
- package/src/__tests__/terminal-tools.test.ts +3 -24
- package/src/__tests__/thread-backfill.test.ts +4 -9
- package/src/__tests__/title-generate-pipeline.test.ts +1 -1
- package/src/__tests__/token-estimate-pipeline.test.ts +2 -4
- package/src/__tests__/tool-error-pipeline.test.ts +2 -2
- package/src/__tests__/tool-execute-pipeline.test.ts +1 -1
- package/src/__tests__/tool-preview-lifecycle.test.ts +13 -11
- package/src/__tests__/tool-result-truncate-pipeline.test.ts +9 -12
- package/src/__tests__/tool-result-truncation.test.ts +3 -1
- package/src/__tests__/tools-audio-read.test.ts +113 -0
- package/src/__tests__/turn-boundary-resolution.test.ts +44 -84
- package/src/__tests__/turn-events-store.test.ts +11 -7
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +8 -6
- package/src/__tests__/voice-session-bridge.test.ts +13 -7
- package/src/acp/__tests__/prepare-agent-env.test.ts +143 -31
- package/src/acp/prepare-agent-env.ts +52 -11
- package/src/agent/compaction-circuit.ts +140 -0
- package/src/agent/loop.ts +409 -85
- 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-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-result.ts +129 -0
- package/src/api/events/tool-use-start.ts +8 -10
- 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 +354 -0
- package/src/api/requests/dictation.ts +45 -0
- package/src/api/responses/disk-pressure-status.ts +26 -0
- package/src/api/responses/home.ts +217 -0
- package/src/api/responses/llm-context-response.ts +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 +6 -9
- package/src/avatar/__tests__/avatar-manifest.test.ts +236 -0
- package/src/avatar/__tests__/avatar-store.test.ts +193 -0
- package/src/avatar/avatar-manifest.ts +195 -0
- package/src/avatar/avatar-store.ts +113 -0
- package/src/avatar/traits-png-sync.ts +8 -2
- package/src/background-wake/next-wake.test.ts +31 -1
- package/src/background-wake/next-wake.ts +4 -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/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/lib/cli-colors.ts +24 -6
- package/src/cli/program.ts +4 -5
- package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
- package/src/config/assistant-feature-flags.ts +2 -2
- package/src/config/bundled-skills/app-builder/SKILL.md +14 -3
- package/src/config/bundled-skills/media-processing/services/reduce.ts +6 -9
- package/src/config/bundled-skills/messaging/tools/messaging-send.ts +7 -2
- package/src/config/bundled-skills/schedule/SKILL.md +1 -1
- package/src/config/bundled-skills/schedule/TOOLS.json +8 -0
- package/src/config/call-site-defaults.ts +2 -7
- package/src/config/feature-flag-registry.json +25 -9
- package/src/config/schemas/__tests__/memory-v2.test.ts +1 -226
- package/src/config/schemas/call-site-catalog.ts +8 -15
- package/src/config/schemas/llm.ts +2 -3
- package/src/config/schemas/memory-lifecycle.ts +24 -0
- package/src/config/schemas/memory-v2.ts +0 -253
- package/src/config/schemas/memory-v3.ts +39 -0
- package/src/config/schemas/memory.ts +6 -1
- package/src/config/schemas/timeouts.ts +3 -1
- package/src/context/compactor.ts +54 -31
- package/src/context/token-estimator.ts +19 -0
- package/src/context/tool-result-truncation.ts +1 -43
- package/src/context/window-manager.ts +138 -20
- package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +2 -2
- package/src/daemon/__tests__/web-search-status-text.test.ts +10 -6
- package/src/daemon/approval-generators.ts +4 -4
- package/src/daemon/config-watcher.ts +7 -1
- package/src/daemon/conversation-agent-loop-handlers.ts +225 -88
- package/src/daemon/conversation-agent-loop.ts +284 -584
- package/src/daemon/conversation-error.ts +7 -7
- package/src/daemon/conversation-history.ts +22 -6
- package/src/daemon/conversation-launch.ts +4 -8
- package/src/daemon/conversation-lifecycle.ts +10 -38
- package/src/daemon/conversation-messaging.ts +1 -3
- package/src/daemon/conversation-notifiers.ts +7 -5
- package/src/daemon/conversation-process.ts +100 -79
- package/src/daemon/conversation-runtime-assembly.ts +47 -21
- package/src/daemon/conversation-store.ts +6 -5
- package/src/daemon/conversation-surfaces.ts +55 -69
- package/src/daemon/conversation-tool-setup.ts +3 -0
- package/src/daemon/conversation.ts +91 -126
- 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 +46 -24
- package/src/daemon/first-greeting.ts +26 -4
- package/src/daemon/guardian-action-generators.ts +2 -2
- package/src/daemon/handlers/conversations.ts +6 -22
- package/src/daemon/handlers/shared.ts +4 -0
- package/src/daemon/handlers/skills.ts +15 -14
- package/src/daemon/host-app-control-proxy.ts +54 -1
- package/src/daemon/host-cu-proxy.ts +46 -22
- package/src/daemon/host-file-proxy.ts +25 -1
- package/src/daemon/host-proxy-preactivation.ts +25 -6
- package/src/daemon/lifecycle.ts +28 -55
- package/src/daemon/message-protocol.ts +2 -3
- package/src/daemon/message-provenance.ts +49 -0
- package/src/daemon/message-types/contacts.ts +3 -20
- package/src/daemon/message-types/conversations.ts +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 +28 -343
- package/src/daemon/message-types/notifications.ts +2 -32
- package/src/daemon/message-types/settings.ts +3 -8
- package/src/daemon/message-types/skills.ts +2 -0
- package/src/daemon/message-types/surfaces.ts +2 -0
- package/src/daemon/message-types/sync.ts +12 -25
- package/src/daemon/message-types/workspace.ts +3 -11
- package/src/daemon/process-message.ts +49 -46
- package/src/daemon/server.ts +12 -0
- package/src/daemon/tool-side-effects.ts +10 -7
- package/src/daemon/trust-context.ts +13 -0
- package/src/daemon/wake-target-adapter.ts +11 -1
- package/src/heartbeat/__tests__/heartbeat-service.test.ts +3 -1
- package/src/heartbeat/heartbeat-run-store.ts +31 -0
- package/src/heartbeat/heartbeat-service.ts +16 -0
- package/src/home/feature-gate.ts +22 -0
- package/src/home/feed-types.ts +36 -221
- package/src/ipc/__tests__/email-ipc.test.ts +0 -9
- 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 +18 -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 +26 -13
- 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/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__/memory-retrospective-job.test.ts +10 -6
- package/src/memory/__tests__/memory-v3-selections-migration.test.ts +103 -0
- package/src/memory/context-search/agent-runner.ts +2 -4
- package/src/memory/conversation-crud.ts +39 -8
- package/src/memory/conversation-queries.ts +78 -22
- package/src/memory/db-init.ts +8 -0
- package/src/memory/db-maintenance.ts +18 -2
- package/src/memory/graph/consolidation.ts +8 -11
- package/src/memory/graph/conversation-graph-memory.ts +41 -8
- package/src/memory/graph/extraction.ts +6 -9
- package/src/memory/graph/narrative.ts +2 -2
- package/src/memory/graph/pattern-scan.ts +2 -2
- package/src/memory/graph/retriever.ts +20 -26
- package/src/memory/graph/tools.ts +4 -4
- package/src/memory/job-handlers/conversation-starters.ts +32 -32
- package/src/memory/job-handlers/summarization.ts +1 -2
- package/src/memory/jobs-store.ts +3 -1
- package/src/memory/jobs-worker.ts +51 -39
- 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 +10 -0
- package/src/memory/memory-marker.ts +17 -0
- package/src/memory/memory-retrospective-job.ts +6 -2
- package/src/memory/memory-v2-activation-log-store.ts +1 -83
- package/src/memory/migrations/267-llm-usage-events-add-assistant-version.ts +46 -0
- package/src/memory/migrations/268-add-memory-v3-selections.ts +28 -0
- package/src/memory/migrations/269-schedule-script-timeout.ts +11 -0
- package/src/memory/migrations/270-messages-role-created-at-index.ts +18 -0
- package/src/memory/migrations/__tests__/267-llm-usage-events-add-assistant-version.test.ts +117 -0
- package/src/memory/migrations/index.ts +4 -0
- package/src/memory/schema/infrastructure.ts +11 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +124 -0
- package/src/memory/v2/__tests__/migration.test.ts +11 -3
- package/src/memory/v2/__tests__/page-index.test.ts +37 -1
- package/src/memory/v2/__tests__/router.test.ts +14 -4
- package/src/memory/v2/__tests__/sweep-job.test.ts +6 -5
- package/src/memory/v2/backfill-jobs.ts +6 -0
- package/src/memory/v2/consolidation-job.ts +89 -9
- package/src/memory/v2/migration.ts +5 -3
- package/src/memory/v2/page-index.ts +11 -0
- package/src/memory/v2/router.ts +8 -11
- package/src/memory/v2/sweep-job.ts +8 -11
- package/src/memory/v2/types.ts +1 -0
- package/src/memory/v3/__tests__/assign.test.ts +242 -0
- package/src/memory/v3/__tests__/capabilities.test.ts +118 -0
- package/src/memory/v3/__tests__/core.test.ts +39 -0
- package/src/memory/v3/__tests__/fixtures/eval-turns.json +36 -0
- package/src/memory/v3/__tests__/fixtures/live-turns.json +37 -0
- package/src/memory/v3/__tests__/health.test.ts +203 -0
- package/src/memory/v3/__tests__/live-integration.test.ts +330 -0
- package/src/memory/v3/__tests__/maintain-job.test.ts +288 -0
- package/src/memory/v3/__tests__/needle.test.ts +107 -0
- package/src/memory/v3/__tests__/orchestrate.test.ts +400 -0
- package/src/memory/v3/__tests__/reconcile.test.ts +274 -0
- package/src/memory/v3/__tests__/render-injection.test.ts +61 -0
- package/src/memory/v3/__tests__/router.test.ts +260 -0
- package/src/memory/v3/__tests__/selection-log-store.test.ts +179 -0
- package/src/memory/v3/__tests__/selector.test.ts +404 -0
- package/src/memory/v3/__tests__/shadow-plugin.test.ts +414 -0
- package/src/memory/v3/__tests__/snapshot.test.ts +168 -0
- package/src/memory/v3/__tests__/tree.test.ts +192 -0
- package/src/memory/v3/__tests__/types.test.ts +54 -0
- package/src/memory/v3/__tests__/working-set-eviction.test.ts +106 -0
- package/src/memory/v3/__tests__/working-set-skeleton.test.ts +44 -0
- package/src/memory/v3/assign.ts +268 -0
- package/src/memory/v3/capabilities.ts +124 -0
- package/src/memory/v3/core.ts +26 -0
- package/src/memory/v3/data/README.md +84 -0
- package/src/memory/v3/data/assignments.json +5 -0
- package/src/memory/v3/data/core.json +1 -0
- package/src/memory/v3/data/leaves/domain-a/topic-x.md +9 -0
- package/src/memory/v3/data/leaves/domain-a/topic-y.md +9 -0
- package/src/memory/v3/data/leaves/domain-b/topic-z.md +9 -0
- package/src/memory/v3/health.ts +0 -0
- package/src/memory/v3/maintain-job.ts +314 -0
- package/src/memory/v3/needle.ts +115 -0
- package/src/memory/v3/orchestrate.ts +114 -0
- package/src/memory/v3/page-content.ts +34 -0
- package/src/memory/v3/provider-blocks.ts +16 -0
- package/src/memory/v3/reconcile.ts +523 -0
- package/src/memory/v3/render-injection.ts +32 -0
- package/src/memory/v3/router.ts +184 -0
- package/src/memory/v3/selection-log-store.ts +84 -0
- package/src/memory/v3/selector.ts +211 -0
- package/src/memory/v3/shadow-plugin.ts +379 -0
- package/src/memory/v3/snapshot.ts +209 -0
- package/src/memory/v3/tree.ts +174 -0
- package/src/memory/v3/types.ts +46 -60
- package/src/memory/v3/working-set.ts +88 -0
- package/src/messaging/providers/slack/render-transcript.test.ts +1 -1
- package/src/messaging/providers/slack/render-transcript.ts +2 -2
- package/src/messaging/style-analyzer.ts +8 -11
- package/src/notifications/conversation-pairing.ts +8 -6
- package/src/notifications/decision-engine.ts +10 -13
- package/src/notifications/preference-extractor.ts +11 -14
- package/src/permissions/prompter.ts +42 -36
- package/src/permissions/question-prompter.test.ts +35 -26
- package/src/permissions/question-prompter.ts +6 -10
- package/src/plugin-api/index.ts +2 -0
- package/src/plugin-api/types.ts +25 -3
- package/src/plugins/defaults/circuit-breaker/middlewares/circuitBreaker.ts +93 -0
- package/src/plugins/defaults/circuit-breaker/package.json +15 -0
- package/src/plugins/defaults/circuit-breaker/register.ts +39 -0
- package/src/plugins/defaults/compaction/middlewares/compaction.ts +25 -0
- package/src/plugins/defaults/compaction/package.json +15 -0
- package/src/plugins/defaults/compaction/register.ts +35 -0
- package/src/plugins/defaults/compaction/terminal.ts +73 -0
- package/src/plugins/defaults/empty-response/middlewares/emptyResponse.ts +22 -0
- package/src/plugins/defaults/empty-response/package.json +15 -0
- package/src/plugins/defaults/empty-response/register.ts +28 -0
- package/src/plugins/defaults/empty-response/terminal.ts +106 -0
- package/src/plugins/defaults/history-repair/hooks/user-prompt-submit.ts +35 -0
- package/src/plugins/defaults/history-repair/package.json +15 -0
- package/src/plugins/defaults/history-repair/register.ts +24 -0
- package/src/{daemon/history-repair.ts → plugins/defaults/history-repair/terminal.ts} +48 -35
- package/src/plugins/defaults/index.ts +29 -40
- package/src/plugins/defaults/injectors/package.json +15 -0
- package/src/plugins/defaults/{injectors.ts → injectors/register.ts} +14 -38
- package/src/plugins/defaults/llm-call/middlewares/llmCall.ts +17 -0
- package/src/plugins/defaults/llm-call/package.json +15 -0
- package/src/plugins/defaults/{llm-call.ts → llm-call/register.ts} +6 -38
- package/src/plugins/defaults/memory-retrieval/middlewares/memoryRetrieval.ts +17 -0
- package/src/plugins/defaults/memory-retrieval/package.json +15 -0
- package/src/plugins/defaults/{memory-retrieval.ts → memory-retrieval/register.ts} +10 -48
- package/src/plugins/defaults/{overflow-reduce.ts → overflow-reduce/middlewares/overflowReduce.ts} +18 -77
- package/src/plugins/defaults/overflow-reduce/package.json +15 -0
- package/src/plugins/defaults/overflow-reduce/register.ts +42 -0
- package/src/plugins/defaults/persistence/middlewares/persistence.ts +19 -0
- package/src/plugins/defaults/persistence/package.json +15 -0
- package/src/plugins/defaults/persistence/register.ts +38 -0
- package/src/plugins/defaults/persistence/terminal.ts +83 -0
- package/src/plugins/defaults/title-generate/package.json +15 -0
- package/src/plugins/defaults/title-generate/register.ts +35 -0
- package/src/plugins/defaults/title-generate/terminal.ts +31 -0
- package/src/plugins/defaults/token-estimate/middlewares/tokenEstimate.ts +23 -0
- package/src/plugins/defaults/token-estimate/package.json +15 -0
- package/src/plugins/defaults/token-estimate/register.ts +34 -0
- package/src/plugins/defaults/token-estimate/terminal.ts +40 -0
- package/src/plugins/defaults/tool-error/middlewares/toolError.ts +21 -0
- package/src/plugins/defaults/tool-error/package.json +15 -0
- package/src/plugins/defaults/tool-error/register.ts +35 -0
- package/src/plugins/defaults/tool-error/terminal.ts +47 -0
- package/src/plugins/defaults/tool-execute/middlewares/toolExecute.ts +23 -0
- package/src/plugins/defaults/tool-execute/package.json +15 -0
- package/src/plugins/defaults/{tool-execute.ts → tool-execute/register.ts} +8 -46
- package/src/plugins/defaults/tool-result-truncate/middlewares/toolResultTruncate.ts +23 -0
- package/src/plugins/defaults/tool-result-truncate/package.json +15 -0
- package/src/plugins/defaults/tool-result-truncate/register.ts +35 -0
- package/src/plugins/defaults/tool-result-truncate/terminal.ts +113 -0
- package/src/plugins/defaults/tool-result-truncate/types.ts +22 -0
- package/src/plugins/external-plugin-loader.ts +2 -2
- package/src/plugins/pipeline.ts +0 -12
- package/src/plugins/types.ts +51 -90
- package/src/plugins/user-loader.ts +4 -3
- package/src/proactive-artifact/aux-message-injector.ts +0 -1
- package/src/proactive-artifact/job.test.ts +20 -8
- package/src/proactive-artifact/job.ts +3 -1
- package/src/prompts/sections.ts +20 -7
- package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +2 -2
- package/src/prompts/templates/BOOTSTRAP.md +5 -1
- package/src/prompts/templates/system-sections.ts +6 -0
- package/src/providers/__tests__/retry-callsite.test.ts +25 -25
- package/src/providers/__tests__/satellite-connection-routing.test.ts +7 -21
- package/src/providers/anthropic/client.ts +24 -5
- package/src/providers/call-site-routing.ts +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 +0 -2
- package/src/providers/openai/chat-completions-provider.ts +1 -4
- package/src/providers/openai/responses-provider.ts +1 -4
- package/src/providers/openrouter/client.ts +1 -6
- 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 +131 -26
- package/src/runtime/__tests__/background-job-runner.test.ts +1 -3
- package/src/runtime/agent-wake.ts +93 -18
- package/src/runtime/assistant-event-hub.ts +2 -2
- package/src/runtime/auth/__tests__/guard-tests.test.ts +75 -109
- package/src/runtime/auth/__tests__/route-policy.test.ts +153 -170
- package/src/runtime/auth/route-policy.ts +42 -1079
- package/src/runtime/background-job-runner.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -1
- package/src/runtime/channel-approvals.ts +3 -14
- package/src/runtime/channel-invite-transport.ts +5 -6
- package/src/runtime/channel-readiness-service.ts +2 -5
- package/src/runtime/channel-retry-sweep.ts +12 -16
- package/src/runtime/conversation-stream-state.ts +294 -0
- package/src/runtime/http-router.ts +19 -22
- package/src/runtime/http-types.ts +12 -6
- package/src/runtime/invite-instruction-generator.ts +3 -3
- package/src/runtime/pending-interactions.ts +2 -2
- package/src/runtime/routes/__tests__/avatar-state-routes.test.ts +565 -0
- 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__/inference-provider-connection-routes.test.ts +13 -22
- 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__/tts-routes.test.ts +3 -3
- package/src/runtime/routes/acp-routes.test.ts +97 -75
- package/src/runtime/routes/acp-routes.ts +29 -6
- package/src/runtime/routes/app-management-routes.ts +97 -24
- package/src/runtime/routes/app-routes.ts +25 -5
- package/src/runtime/routes/approval-routes.ts +16 -4
- package/src/runtime/routes/attachment-routes.ts +25 -1
- package/src/runtime/routes/audio-routes.ts +1 -0
- package/src/runtime/routes/audit-routes.ts +5 -0
- package/src/runtime/routes/auth-routes.ts +5 -0
- package/src/runtime/routes/avatar-routes.ts +238 -59
- package/src/runtime/routes/background-tool-routes.ts +9 -0
- package/src/runtime/routes/background-wake-routes.ts +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 +5 -0
- package/src/runtime/routes/browser-tabs-routes.ts +5 -0
- package/src/runtime/routes/btw-routes.ts +5 -1
- package/src/runtime/routes/cache-routes.ts +13 -0
- package/src/runtime/routes/call-routes.ts +21 -10
- package/src/runtime/routes/channel-availability-routes.ts +5 -1
- package/src/runtime/routes/channel-readiness-routes.ts +37 -4
- package/src/runtime/routes/channel-route-definitions.ts +21 -0
- package/src/runtime/routes/channel-verification-routes.ts +21 -0
- package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +9 -2
- package/src/runtime/routes/client-routes.ts +9 -0
- package/src/runtime/routes/consolidation-routes.ts +13 -5
- package/src/runtime/routes/contact-prompt-routes.ts +9 -0
- package/src/runtime/routes/contact-routes.ts +90 -23
- package/src/runtime/routes/content-source-routes.ts +5 -1
- package/src/runtime/routes/conversation-analysis-routes.ts +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 +88 -41
- package/src/runtime/routes/conversation-routes.ts +74 -19
- package/src/runtime/routes/conversation-starter-routes.ts +22 -13
- package/src/runtime/routes/conversations-import-routes.ts +6 -1
- 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 +21 -10
- package/src/runtime/routes/domain-routes.ts +61 -28
- package/src/runtime/routes/email-routes.ts +33 -0
- package/src/runtime/routes/events-routes.ts +114 -9
- package/src/runtime/routes/filing-routes.ts +9 -4
- package/src/runtime/routes/gateway-log-routes.ts +5 -0
- package/src/runtime/routes/global-search-routes.ts +53 -50
- package/src/runtime/routes/group-routes.ts +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 +25 -9
- 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 +5 -0
- package/src/runtime/routes/host-bash-routes.ts +5 -0
- package/src/runtime/routes/host-browser-routes.ts +13 -0
- package/src/runtime/routes/host-cu-routes.ts +5 -0
- package/src/runtime/routes/host-file-routes.ts +26 -6
- package/src/runtime/routes/host-transfer-routes.ts +13 -2
- package/src/runtime/routes/http-adapter.ts +1 -2
- package/src/runtime/routes/identity-intro-cache.ts +17 -6
- package/src/runtime/routes/identity-routes.ts +12 -2
- package/src/runtime/routes/image-generation-routes.ts +5 -0
- package/src/runtime/routes/inbound-message-handler.ts +15 -11
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +0 -12
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +15 -19
- 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 +30 -7
- package/src/runtime/routes/integrations/slack/channel.ts +19 -3
- package/src/runtime/routes/integrations/slack/share.ts +9 -2
- package/src/runtime/routes/integrations/telegram.ts +28 -9
- package/src/runtime/routes/integrations/twilio.ts +35 -7
- package/src/runtime/routes/integrations/vercel.ts +3 -3
- package/src/runtime/routes/internal-oauth-routes.ts +5 -0
- package/src/runtime/routes/internal-twilio-routes.ts +13 -0
- package/src/runtime/routes/llm-call-sites-routes.ts +39 -4
- package/src/runtime/routes/log-export-routes.ts +28 -10
- package/src/runtime/routes/mcp-auth-routes.ts +25 -0
- package/src/runtime/routes/memory-item-routes.ts +21 -10
- package/src/runtime/routes/memory-v2-routes.ts +90 -36
- package/src/runtime/routes/memory-v3-routes.ts +273 -407
- 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 +33 -11
- 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 +35 -10
- package/src/runtime/routes/platform-routes.ts +21 -0
- package/src/runtime/routes/playground/__tests__/force-compact.test.ts +3 -2
- package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +37 -16
- package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +7 -3
- package/src/runtime/routes/playground/__tests__/state.test.ts +10 -3
- package/src/runtime/routes/playground/force-compact.ts +1 -1
- package/src/runtime/routes/playground/helpers.ts +0 -1
- package/src/runtime/routes/playground/inject-failures.ts +13 -8
- package/src/runtime/routes/playground/reset-circuit.ts +14 -9
- package/src/runtime/routes/playground/seed-conversation.ts +1 -1
- package/src/runtime/routes/playground/seeded-conversations.ts +3 -3
- package/src/runtime/routes/playground/state.ts +4 -3
- package/src/runtime/routes/plugins-routes.ts +22 -19
- package/src/runtime/routes/profiler-routes.ts +17 -4
- package/src/runtime/routes/ps-routes.ts +5 -0
- package/src/runtime/routes/publish-routes.ts +13 -3
- package/src/runtime/routes/question-routes.ts +5 -0
- package/src/runtime/routes/recording-routes.ts +25 -12
- package/src/runtime/routes/rename-conversation-routes.ts +5 -0
- package/src/runtime/routes/sanity-routes.ts +9 -2
- package/src/runtime/routes/schedule-routes.ts +137 -47
- package/src/runtime/routes/secret-routes.ts +17 -4
- package/src/runtime/routes/sequence-routes.ts +33 -0
- package/src/runtime/routes/settings-routes.ts +65 -19
- package/src/runtime/routes/skills-routes.ts +133 -69
- package/src/runtime/routes/slack-channel-routes.ts +5 -0
- package/src/runtime/routes/stt-routes.ts +13 -6
- package/src/runtime/routes/subagents-routes.ts +24 -18
- package/src/runtime/routes/suggest-trust-rule-routes.ts +7 -2
- package/src/runtime/routes/surface-action-routes.ts +9 -0
- package/src/runtime/routes/surface-content-routes.ts +10 -2
- package/src/runtime/routes/task-routes.ts +37 -0
- package/src/runtime/routes/telemetry-routes.ts +9 -0
- package/src/runtime/routes/trace-event-routes.ts +42 -1
- package/src/runtime/routes/trust-rules-routes.ts +5 -0
- package/src/runtime/routes/tts-routes.ts +13 -6
- package/src/runtime/routes/types.ts +17 -8
- package/src/runtime/routes/ui-request-routes.ts +5 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +5 -0
- package/src/runtime/routes/usage-routes.ts +71 -3
- package/src/runtime/routes/user-routes-cli.ts +9 -0
- package/src/runtime/routes/user-routes.ts +5 -1
- package/src/runtime/routes/wake-conversation-routes.ts +5 -0
- package/src/runtime/routes/watcher-routes.ts +21 -0
- package/src/runtime/routes/webhook-routes.ts +9 -0
- package/src/runtime/routes/wipe-conversation-routes.ts +5 -0
- package/src/runtime/routes/work-items-routes.ts +47 -19
- package/src/runtime/routes/workspace-commit-routes.ts +5 -0
- package/src/runtime/routes/workspace-routes.test.ts +42 -0
- package/src/runtime/routes/workspace-routes.ts +120 -9
- package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -4
- package/src/runtime/services/analyze-conversation.ts +3 -6
- 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 +8 -0
- package/src/schedule/scheduler.ts +3 -1
- package/src/signals/user-message.ts +5 -8
- package/src/skills/catalog-files.ts +4 -1
- package/src/skills/clawhub-files.ts +2 -0
- package/src/skills/skillssh-files.ts +2 -0
- package/src/subagent/manager.ts +3 -6
- package/src/telemetry/types.ts +26 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +138 -1
- package/src/telemetry/usage-telemetry-reporter.ts +31 -0
- package/src/tools/acp/spawn.test.ts +88 -38
- package/src/tools/apps/definitions.ts +8 -4
- 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/filesystem/edit.ts +45 -42
- package/src/tools/filesystem/list.ts +33 -30
- package/src/tools/filesystem/read.ts +54 -35
- package/src/tools/filesystem/write.ts +34 -31
- package/src/tools/host-filesystem/edit.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/web-fetch.ts +49 -46
- package/src/tools/network/web-search.ts +16 -13
- package/src/tools/registry.ts +39 -16
- package/src/tools/schedule/create.ts +11 -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/system/avatar-generator.ts +13 -22
- package/src/tools/system/request-permission.ts +30 -27
- package/src/tools/terminal/shell.ts +190 -61
- package/src/tools/tool-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 +69 -9
- 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/platform.ts +15 -12
- package/src/work-items/work-item-runner.ts +7 -2
- package/src/workspace/migrations/028-recover-conversations-from-disk-view.ts +7 -20
- package/src/workspace/migrations/092-backfill-v3-leaves.ts +169 -0
- package/src/workspace/migrations/093-backfill-leaf-ids.ts +144 -0
- package/src/workspace/migrations/094-seed-avatar-manifest.ts +155 -0
- package/src/workspace/migrations/__tests__/094-seed-avatar-manifest.test.ts +136 -0
- package/src/workspace/migrations/__tests__/backfill-leaf-ids.test.ts +175 -0
- package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +124 -0
- package/src/workspace/migrations/registry.ts +6 -0
- package/src/workspace/provider-commit-message-generator.ts +15 -17
- package/tsconfig.json +4 -1
- package/src/__tests__/history-repair-pipeline.test.ts +0 -396
- package/src/cli/commands/__tests__/memory-v3-render.test.ts +0 -340
- package/src/cli/commands/memory-v3-render.ts +0 -491
- package/src/daemon/message-types/disk-pressure.ts +0 -9
- package/src/email/feature-gate.ts +0 -23
- package/src/memory/v3/__tests__/coactivation-store.test.ts +0 -422
- package/src/memory/v3/__tests__/consolidation-job.test.ts +0 -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/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/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-result-truncate.ts +0 -84
- package/src/runtime/routes/__tests__/memory-v3-simulate-params.test.ts +0 -35
|
@@ -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,32 @@ 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
|
+
}),
|
|
372
|
+
reject,
|
|
373
|
+
messages,
|
|
374
|
+
onEvent,
|
|
375
|
+
exitReason: null,
|
|
376
|
+
onCheckpoint: options?.onCheckpoint
|
|
377
|
+
? async (checkpoint) => {
|
|
378
|
+
const decision = await options.onCheckpoint!(checkpoint);
|
|
379
|
+
pending.exitReason = decision === "continue" ? null : decision;
|
|
380
|
+
return decision;
|
|
381
|
+
}
|
|
382
|
+
: undefined,
|
|
383
|
+
};
|
|
384
|
+
pendingRuns.push(pending);
|
|
351
385
|
});
|
|
352
386
|
}
|
|
353
387
|
},
|
|
@@ -411,9 +445,9 @@ function makeConversation(
|
|
|
411
445
|
"conv-1",
|
|
412
446
|
provider,
|
|
413
447
|
"system prompt",
|
|
414
|
-
4096,
|
|
415
448
|
sendToClient ?? (() => {}),
|
|
416
449
|
"/tmp",
|
|
450
|
+
{ maxTokens: 4096 },
|
|
417
451
|
);
|
|
418
452
|
const conversationWithWorkspaceDeps =
|
|
419
453
|
conversationObj as ConversationWithWorkspaceDeps;
|
|
@@ -524,12 +558,12 @@ describe("Conversation message queue", () => {
|
|
|
524
558
|
const events2: ServerMessage[] = [];
|
|
525
559
|
|
|
526
560
|
// 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
|
-
);
|
|
561
|
+
const p1 = conversation.processMessage({
|
|
562
|
+
content: "msg-1",
|
|
563
|
+
attachments: [],
|
|
564
|
+
onEvent: (e) => events1.push(e),
|
|
565
|
+
requestId: "req-1",
|
|
566
|
+
});
|
|
533
567
|
|
|
534
568
|
// Wait for the first AgentLoop.run to be registered
|
|
535
569
|
await waitForPendingRun(1);
|
|
@@ -574,12 +608,12 @@ describe("Conversation message queue", () => {
|
|
|
574
608
|
const events3: ServerMessage[] = [];
|
|
575
609
|
|
|
576
610
|
// Start first message
|
|
577
|
-
const p1 = conversation.processMessage(
|
|
578
|
-
"msg-1",
|
|
579
|
-
[],
|
|
580
|
-
(e) => events1.push(e),
|
|
581
|
-
"req-1",
|
|
582
|
-
);
|
|
611
|
+
const p1 = conversation.processMessage({
|
|
612
|
+
content: "msg-1",
|
|
613
|
+
attachments: [],
|
|
614
|
+
onEvent: (e) => events1.push(e),
|
|
615
|
+
requestId: "req-1",
|
|
616
|
+
});
|
|
583
617
|
await waitForPendingRun(1);
|
|
584
618
|
|
|
585
619
|
// Enqueue two more sibling passthrough messages
|
|
@@ -649,7 +683,11 @@ describe("Conversation message queue", () => {
|
|
|
649
683
|
const events2: ServerMessage[] = [];
|
|
650
684
|
|
|
651
685
|
// Start first message
|
|
652
|
-
const p1 = conversation.processMessage(
|
|
686
|
+
const p1 = conversation.processMessage({
|
|
687
|
+
content: "msg-1",
|
|
688
|
+
attachments: [],
|
|
689
|
+
requestId: "req-1",
|
|
690
|
+
});
|
|
653
691
|
await waitForPendingRun(1);
|
|
654
692
|
|
|
655
693
|
// Enqueue second — simulating what handleUserMessage does
|
|
@@ -687,7 +725,11 @@ describe("Conversation message queue", () => {
|
|
|
687
725
|
const events3: ServerMessage[] = [];
|
|
688
726
|
|
|
689
727
|
// Start first message
|
|
690
|
-
conversation.processMessage(
|
|
728
|
+
conversation.processMessage({
|
|
729
|
+
content: "msg-1",
|
|
730
|
+
attachments: [],
|
|
731
|
+
requestId: "req-1",
|
|
732
|
+
});
|
|
691
733
|
await waitForPendingRun(1);
|
|
692
734
|
|
|
693
735
|
// Enqueue two more
|
|
@@ -746,12 +788,12 @@ describe("Conversation message queue", () => {
|
|
|
746
788
|
const events: ServerMessage[] = [];
|
|
747
789
|
|
|
748
790
|
// 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
|
-
);
|
|
791
|
+
const p1 = conversation.processMessage({
|
|
792
|
+
content: "msg-1",
|
|
793
|
+
attachments: [],
|
|
794
|
+
onEvent: (e) => events.push(e),
|
|
795
|
+
requestId: "req-1",
|
|
796
|
+
});
|
|
755
797
|
await waitForPendingRun(1);
|
|
756
798
|
|
|
757
799
|
// Reject the AgentLoop.run() with a provider error to trigger the
|
|
@@ -773,7 +815,11 @@ describe("Conversation message queue", () => {
|
|
|
773
815
|
await conversation.loadFromDb();
|
|
774
816
|
|
|
775
817
|
// Start first message
|
|
776
|
-
const p1 = conversation.processMessage(
|
|
818
|
+
const p1 = conversation.processMessage({
|
|
819
|
+
content: "msg-1",
|
|
820
|
+
attachments: [],
|
|
821
|
+
requestId: "req-1",
|
|
822
|
+
});
|
|
777
823
|
await waitForPendingRun(1);
|
|
778
824
|
|
|
779
825
|
expect(conversation.getQueueDepth()).toBe(0);
|
|
@@ -810,12 +856,12 @@ describe("Conversation message queue", () => {
|
|
|
810
856
|
const events3: ServerMessage[] = [];
|
|
811
857
|
|
|
812
858
|
// 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
|
-
);
|
|
859
|
+
const p1 = conversation.processMessage({
|
|
860
|
+
content: "msg-1",
|
|
861
|
+
attachments: [],
|
|
862
|
+
onEvent: (e) => events1.push(e),
|
|
863
|
+
requestId: "req-1",
|
|
864
|
+
});
|
|
819
865
|
await waitForPendingRun(1);
|
|
820
866
|
|
|
821
867
|
// Enqueue a message with empty content (will fail persistUserMessage)
|
|
@@ -878,7 +924,11 @@ describe("Batched drain", () => {
|
|
|
878
924
|
const events5: ServerMessage[] = [];
|
|
879
925
|
|
|
880
926
|
// Start in-flight message (msg-1)
|
|
881
|
-
const p1 = conversation.processMessage(
|
|
927
|
+
const p1 = conversation.processMessage({
|
|
928
|
+
content: "msg-1",
|
|
929
|
+
attachments: [],
|
|
930
|
+
requestId: "req-1",
|
|
931
|
+
});
|
|
882
932
|
await waitForPendingRun(1);
|
|
883
933
|
|
|
884
934
|
// Enqueue 4 messages with interfaces [macos, macos, cli, macos].
|
|
@@ -985,7 +1035,11 @@ describe("Batched drain", () => {
|
|
|
985
1035
|
const eventsWorld: ServerMessage[] = [];
|
|
986
1036
|
|
|
987
1037
|
// Start in-flight message
|
|
988
|
-
const p1 = conversation.processMessage(
|
|
1038
|
+
const p1 = conversation.processMessage({
|
|
1039
|
+
content: "msg-1",
|
|
1040
|
+
attachments: [],
|
|
1041
|
+
requestId: "req-1",
|
|
1042
|
+
});
|
|
989
1043
|
await waitForPendingRun(1);
|
|
990
1044
|
|
|
991
1045
|
// Enqueue ["hello", "/compact", "world"]. /compact resolves to a non-
|
|
@@ -1054,7 +1108,11 @@ describe("Batched drain", () => {
|
|
|
1054
1108
|
const eventsPlainB: ServerMessage[] = [];
|
|
1055
1109
|
|
|
1056
1110
|
// Start in-flight message
|
|
1057
|
-
const p1 = conversation.processMessage(
|
|
1111
|
+
const p1 = conversation.processMessage({
|
|
1112
|
+
content: "msg-1",
|
|
1113
|
+
attachments: [],
|
|
1114
|
+
requestId: "req-1",
|
|
1115
|
+
});
|
|
1058
1116
|
await waitForPendingRun(1);
|
|
1059
1117
|
|
|
1060
1118
|
// Enqueue ["plain-a", "/status", "plain-b"]. /status resolves to a non-
|
|
@@ -1119,7 +1177,11 @@ describe("Batched drain", () => {
|
|
|
1119
1177
|
await conversation.loadFromDb();
|
|
1120
1178
|
|
|
1121
1179
|
// Start in-flight message
|
|
1122
|
-
const p1 = conversation.processMessage(
|
|
1180
|
+
const p1 = conversation.processMessage({
|
|
1181
|
+
content: "msg-1",
|
|
1182
|
+
attachments: [],
|
|
1183
|
+
requestId: "req-1",
|
|
1184
|
+
});
|
|
1123
1185
|
await waitForPendingRun(1);
|
|
1124
1186
|
|
|
1125
1187
|
// Two sibling messages, each with a distinct image attachment.
|
|
@@ -1202,7 +1264,11 @@ describe("Batched drain", () => {
|
|
|
1202
1264
|
new MessageQueue(budget);
|
|
1203
1265
|
|
|
1204
1266
|
// Start in-flight so subsequent enqueues are queued (not processed).
|
|
1205
|
-
const p1 = conversation.processMessage(
|
|
1267
|
+
const p1 = conversation.processMessage({
|
|
1268
|
+
content: "msg-1",
|
|
1269
|
+
attachments: [],
|
|
1270
|
+
requestId: "req-1",
|
|
1271
|
+
});
|
|
1206
1272
|
await waitForPendingRun(1);
|
|
1207
1273
|
|
|
1208
1274
|
// Fill to just-under budget: two ~500-char messages (1512+1512 = 3024 bytes).
|
|
@@ -1255,7 +1321,11 @@ describe("Batched drain", () => {
|
|
|
1255
1321
|
// After the full drain, the byte budget must be fully reclaimed — a fresh
|
|
1256
1322
|
// round of enqueues up to the budget should succeed again. Spin up another
|
|
1257
1323
|
// in-flight message to reach the queueing state.
|
|
1258
|
-
const p2 = conversation.processMessage(
|
|
1324
|
+
const p2 = conversation.processMessage({
|
|
1325
|
+
content: "msg-2",
|
|
1326
|
+
attachments: [],
|
|
1327
|
+
requestId: "req-2",
|
|
1328
|
+
});
|
|
1259
1329
|
await waitForPendingRun(3);
|
|
1260
1330
|
expect(
|
|
1261
1331
|
conversation.enqueueMessage({
|
|
@@ -1297,7 +1367,11 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1297
1367
|
const eventsRegular: ServerMessage[] = [];
|
|
1298
1368
|
|
|
1299
1369
|
// Start in-flight message
|
|
1300
|
-
const p1 = conversation.processMessage(
|
|
1370
|
+
const p1 = conversation.processMessage({
|
|
1371
|
+
content: "msg-1",
|
|
1372
|
+
attachments: [],
|
|
1373
|
+
requestId: "req-1",
|
|
1374
|
+
});
|
|
1301
1375
|
await waitForPendingRun(1);
|
|
1302
1376
|
|
|
1303
1377
|
// Enqueue a surface-action message (activeSurfaceId set + tracked in
|
|
@@ -1359,12 +1433,12 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1359
1433
|
const events4: ServerMessage[] = [];
|
|
1360
1434
|
|
|
1361
1435
|
// Start in-flight message
|
|
1362
|
-
const p1 = conversation.processMessage(
|
|
1363
|
-
"msg-1",
|
|
1364
|
-
[],
|
|
1365
|
-
(e) => events1.push(e),
|
|
1366
|
-
"req-1",
|
|
1367
|
-
);
|
|
1436
|
+
const p1 = conversation.processMessage({
|
|
1437
|
+
content: "msg-1",
|
|
1438
|
+
attachments: [],
|
|
1439
|
+
onEvent: (e) => events1.push(e),
|
|
1440
|
+
requestId: "req-1",
|
|
1441
|
+
});
|
|
1368
1442
|
await waitForPendingRun(1);
|
|
1369
1443
|
|
|
1370
1444
|
// Enqueue three sibling passthroughs (msg-2 = head, msg-3 = mid,
|
|
@@ -1438,12 +1512,12 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1438
1512
|
const events4: ServerMessage[] = [];
|
|
1439
1513
|
|
|
1440
1514
|
// Start in-flight message
|
|
1441
|
-
const p1 = conversation.processMessage(
|
|
1442
|
-
"msg-1",
|
|
1443
|
-
[],
|
|
1444
|
-
(e) => events1.push(e),
|
|
1445
|
-
"req-1",
|
|
1446
|
-
);
|
|
1515
|
+
const p1 = conversation.processMessage({
|
|
1516
|
+
content: "msg-1",
|
|
1517
|
+
attachments: [],
|
|
1518
|
+
onEvent: (e) => events1.push(e),
|
|
1519
|
+
requestId: "req-1",
|
|
1520
|
+
});
|
|
1447
1521
|
await waitForPendingRun(1);
|
|
1448
1522
|
|
|
1449
1523
|
// Enqueue three siblings. Configure addMessage to throw for the second
|
|
@@ -1500,12 +1574,12 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1500
1574
|
const events3: ServerMessage[] = [];
|
|
1501
1575
|
const events4: ServerMessage[] = [];
|
|
1502
1576
|
|
|
1503
|
-
const p1 = conversation.processMessage(
|
|
1504
|
-
"msg-1",
|
|
1505
|
-
[],
|
|
1506
|
-
(e) => events1.push(e),
|
|
1507
|
-
"req-1",
|
|
1508
|
-
);
|
|
1577
|
+
const p1 = conversation.processMessage({
|
|
1578
|
+
content: "msg-1",
|
|
1579
|
+
attachments: [],
|
|
1580
|
+
onEvent: (e) => events1.push(e),
|
|
1581
|
+
requestId: "req-1",
|
|
1582
|
+
});
|
|
1509
1583
|
await waitForPendingRun(1);
|
|
1510
1584
|
|
|
1511
1585
|
// Mid tail will fail to persist. After the batched run resolves,
|
|
@@ -1556,7 +1630,11 @@ describe("Batched drain correctness fixes", () => {
|
|
|
1556
1630
|
await conversation.loadFromDb();
|
|
1557
1631
|
|
|
1558
1632
|
// Start in-flight message
|
|
1559
|
-
const p1 = conversation.processMessage(
|
|
1633
|
+
const p1 = conversation.processMessage({
|
|
1634
|
+
content: "msg-1",
|
|
1635
|
+
attachments: [],
|
|
1636
|
+
requestId: "req-1",
|
|
1637
|
+
});
|
|
1560
1638
|
await waitForPendingRun(1);
|
|
1561
1639
|
|
|
1562
1640
|
// Snapshot the count before drain so we only compare batch-emitted
|
|
@@ -1630,7 +1708,11 @@ describe("Conversation queue policy helpers", () => {
|
|
|
1630
1708
|
await conversation.loadFromDb();
|
|
1631
1709
|
|
|
1632
1710
|
// Start processing to make the session busy
|
|
1633
|
-
conversation.processMessage(
|
|
1711
|
+
conversation.processMessage({
|
|
1712
|
+
content: "msg-1",
|
|
1713
|
+
attachments: [],
|
|
1714
|
+
requestId: "req-1",
|
|
1715
|
+
});
|
|
1634
1716
|
await waitForPendingRun(1);
|
|
1635
1717
|
|
|
1636
1718
|
// Enqueue a message while processing
|
|
@@ -1657,7 +1739,11 @@ describe("Conversation queue policy helpers", () => {
|
|
|
1657
1739
|
await conversation.loadFromDb();
|
|
1658
1740
|
|
|
1659
1741
|
// Start processing — but don't enqueue anything
|
|
1660
|
-
conversation.processMessage(
|
|
1742
|
+
conversation.processMessage({
|
|
1743
|
+
content: "msg-1",
|
|
1744
|
+
attachments: [],
|
|
1745
|
+
requestId: "req-1",
|
|
1746
|
+
});
|
|
1661
1747
|
await waitForPendingRun(1);
|
|
1662
1748
|
|
|
1663
1749
|
expect(conversation.isProcessing()).toBe(true);
|
|
@@ -1674,7 +1760,11 @@ describe("Conversation queue policy helpers", () => {
|
|
|
1674
1760
|
await conversation.loadFromDb();
|
|
1675
1761
|
|
|
1676
1762
|
// Start processing
|
|
1677
|
-
conversation.processMessage(
|
|
1763
|
+
conversation.processMessage({
|
|
1764
|
+
content: "msg-1",
|
|
1765
|
+
attachments: [],
|
|
1766
|
+
requestId: "req-1",
|
|
1767
|
+
});
|
|
1678
1768
|
await waitForPendingRun(1);
|
|
1679
1769
|
|
|
1680
1770
|
// Enqueue a message
|
|
@@ -1725,12 +1815,12 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1725
1815
|
const events1: ServerMessage[] = [];
|
|
1726
1816
|
|
|
1727
1817
|
// Start processing first message
|
|
1728
|
-
const p1 = conversation.processMessage(
|
|
1729
|
-
"msg-1",
|
|
1730
|
-
[],
|
|
1731
|
-
(e) => events1.push(e),
|
|
1732
|
-
"req-1",
|
|
1733
|
-
);
|
|
1818
|
+
const p1 = conversation.processMessage({
|
|
1819
|
+
content: "msg-1",
|
|
1820
|
+
attachments: [],
|
|
1821
|
+
onEvent: (e) => events1.push(e),
|
|
1822
|
+
requestId: "req-1",
|
|
1823
|
+
});
|
|
1734
1824
|
await waitForPendingRun(1);
|
|
1735
1825
|
|
|
1736
1826
|
// Enqueue a second message while the first is processing
|
|
@@ -1748,8 +1838,8 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1748
1838
|
history: [],
|
|
1749
1839
|
});
|
|
1750
1840
|
|
|
1751
|
-
// Because there is a queued message, the callback should
|
|
1752
|
-
expect(decision).
|
|
1841
|
+
// Because there is a queued message, the callback should yield for handoff
|
|
1842
|
+
expect(decision).toEqual("handoff");
|
|
1753
1843
|
|
|
1754
1844
|
// Complete the run so the conversation finishes cleanly
|
|
1755
1845
|
await resolveRun(0);
|
|
@@ -1776,7 +1866,11 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1776
1866
|
await conversation.loadFromDb();
|
|
1777
1867
|
|
|
1778
1868
|
// Start processing — no enqueued messages
|
|
1779
|
-
const p1 = conversation.processMessage(
|
|
1869
|
+
const p1 = conversation.processMessage({
|
|
1870
|
+
content: "msg-1",
|
|
1871
|
+
attachments: [],
|
|
1872
|
+
requestId: "req-1",
|
|
1873
|
+
});
|
|
1780
1874
|
await waitForPendingRun(1);
|
|
1781
1875
|
|
|
1782
1876
|
expect(conversation.hasQueuedMessages()).toBe(false);
|
|
@@ -1809,12 +1903,12 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1809
1903
|
const events4: ServerMessage[] = [];
|
|
1810
1904
|
|
|
1811
1905
|
// 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
|
-
);
|
|
1906
|
+
const p1 = conversation.processMessage({
|
|
1907
|
+
content: "msg-1",
|
|
1908
|
+
attachments: [],
|
|
1909
|
+
onEvent: (e) => events1.push(e),
|
|
1910
|
+
requestId: "req-1",
|
|
1911
|
+
});
|
|
1818
1912
|
await waitForPendingRun(1);
|
|
1819
1913
|
|
|
1820
1914
|
// Enqueue three sibling passthroughs while msg-1 is mid-turn
|
|
@@ -1844,7 +1938,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1844
1938
|
hasToolUse: true,
|
|
1845
1939
|
history: [],
|
|
1846
1940
|
});
|
|
1847
|
-
expect(decision).
|
|
1941
|
+
expect(decision).toEqual("handoff");
|
|
1848
1942
|
|
|
1849
1943
|
// Complete first run
|
|
1850
1944
|
await resolveRun(0);
|
|
@@ -1877,12 +1971,12 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1877
1971
|
const events2: ServerMessage[] = [];
|
|
1878
1972
|
|
|
1879
1973
|
// Start processing first message
|
|
1880
|
-
const p1 = conversation.processMessage(
|
|
1881
|
-
"msg-1",
|
|
1882
|
-
[],
|
|
1883
|
-
(e) => events1.push(e),
|
|
1884
|
-
"req-1",
|
|
1885
|
-
);
|
|
1974
|
+
const p1 = conversation.processMessage({
|
|
1975
|
+
content: "msg-1",
|
|
1976
|
+
attachments: [],
|
|
1977
|
+
onEvent: (e) => events1.push(e),
|
|
1978
|
+
requestId: "req-1",
|
|
1979
|
+
});
|
|
1886
1980
|
await waitForPendingRun(1);
|
|
1887
1981
|
|
|
1888
1982
|
// Enqueue a second message while the first is processing
|
|
@@ -1894,7 +1988,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1894
1988
|
expect(conversation.hasQueuedMessages()).toBe(true);
|
|
1895
1989
|
|
|
1896
1990
|
// Simulate tool-use turns: the agent loop calls onCheckpoint at each turn boundary.
|
|
1897
|
-
// Because there is a queued message, the callback should
|
|
1991
|
+
// Because there is a queued message, the callback should yield for handoff.
|
|
1898
1992
|
const run = pendingRuns[0];
|
|
1899
1993
|
expect(run.onCheckpoint).toBeDefined();
|
|
1900
1994
|
|
|
@@ -1906,7 +2000,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1906
2000
|
hasToolUse: true,
|
|
1907
2001
|
history: [],
|
|
1908
2002
|
});
|
|
1909
|
-
expect(decision).
|
|
2003
|
+
expect(decision).toEqual("handoff");
|
|
1910
2004
|
|
|
1911
2005
|
// Complete the run (AgentLoop resolves after yielding)
|
|
1912
2006
|
await resolveRun(0);
|
|
@@ -1948,12 +2042,12 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1948
2042
|
};
|
|
1949
2043
|
|
|
1950
2044
|
// Start processing message A
|
|
1951
|
-
const pA = conversation.processMessage(
|
|
1952
|
-
"msg-A",
|
|
1953
|
-
[],
|
|
1954
|
-
(e) => eventsA.push(e),
|
|
1955
|
-
"req-A",
|
|
1956
|
-
);
|
|
2045
|
+
const pA = conversation.processMessage({
|
|
2046
|
+
content: "msg-A",
|
|
2047
|
+
attachments: [],
|
|
2048
|
+
onEvent: (e) => eventsA.push(e),
|
|
2049
|
+
requestId: "req-A",
|
|
2050
|
+
});
|
|
1957
2051
|
await waitForPendingRun(1);
|
|
1958
2052
|
|
|
1959
2053
|
// Enqueue messages B, C, D — each on a distinct userMessageInterface so the
|
|
@@ -1992,7 +2086,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
1992
2086
|
hasToolUse: true,
|
|
1993
2087
|
history: [],
|
|
1994
2088
|
}),
|
|
1995
|
-
).
|
|
2089
|
+
).toEqual("handoff");
|
|
1996
2090
|
await resolveRun(0);
|
|
1997
2091
|
await pA;
|
|
1998
2092
|
|
|
@@ -2009,7 +2103,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
2009
2103
|
hasToolUse: true,
|
|
2010
2104
|
history: [],
|
|
2011
2105
|
}),
|
|
2012
|
-
).
|
|
2106
|
+
).toEqual("handoff");
|
|
2013
2107
|
await resolveRun(1);
|
|
2014
2108
|
await waitForPendingRun(3);
|
|
2015
2109
|
|
|
@@ -2024,7 +2118,7 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
2024
2118
|
hasToolUse: true,
|
|
2025
2119
|
history: [],
|
|
2026
2120
|
}),
|
|
2027
|
-
).
|
|
2121
|
+
).toEqual("handoff");
|
|
2028
2122
|
await resolveRun(2);
|
|
2029
2123
|
await waitForPendingRun(4);
|
|
2030
2124
|
|
|
@@ -2056,12 +2150,12 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
2056
2150
|
const eventsC: ServerMessage[] = [];
|
|
2057
2151
|
|
|
2058
2152
|
// Start processing message A
|
|
2059
|
-
const pA = conversation.processMessage(
|
|
2060
|
-
"msg-A",
|
|
2061
|
-
[],
|
|
2062
|
-
(e) => eventsA.push(e),
|
|
2063
|
-
"req-A",
|
|
2064
|
-
);
|
|
2153
|
+
const pA = conversation.processMessage({
|
|
2154
|
+
content: "msg-A",
|
|
2155
|
+
attachments: [],
|
|
2156
|
+
onEvent: (e) => eventsA.push(e),
|
|
2157
|
+
requestId: "req-A",
|
|
2158
|
+
});
|
|
2065
2159
|
await waitForPendingRun(1);
|
|
2066
2160
|
|
|
2067
2161
|
// Enqueue B (empty content — will fail to persist) and C (valid)
|
|
@@ -2107,7 +2201,11 @@ describe("Conversation checkpoint handoff", () => {
|
|
|
2107
2201
|
await conversation.loadFromDb();
|
|
2108
2202
|
|
|
2109
2203
|
// Start processing
|
|
2110
|
-
const p1 = conversation.processMessage(
|
|
2204
|
+
const p1 = conversation.processMessage({
|
|
2205
|
+
content: "msg-1",
|
|
2206
|
+
attachments: [],
|
|
2207
|
+
requestId: "req-1",
|
|
2208
|
+
});
|
|
2111
2209
|
await waitForPendingRun(1);
|
|
2112
2210
|
|
|
2113
2211
|
// The first run should have onCheckpoint
|
|
@@ -2151,7 +2249,11 @@ describe("Conversation usage requestId correlation", () => {
|
|
|
2151
2249
|
const conversation = makeConversation();
|
|
2152
2250
|
await conversation.loadFromDb();
|
|
2153
2251
|
|
|
2154
|
-
const p1 = conversation.processMessage(
|
|
2252
|
+
const p1 = conversation.processMessage({
|
|
2253
|
+
content: "msg-1",
|
|
2254
|
+
attachments: [],
|
|
2255
|
+
requestId: "req-42",
|
|
2256
|
+
});
|
|
2155
2257
|
await waitForPendingRun(1);
|
|
2156
2258
|
|
|
2157
2259
|
// Complete the run — this triggers recordUsage with the request's ID
|
|
@@ -2184,7 +2286,11 @@ describe("Terminal trace events on rejection/failure", () => {
|
|
|
2184
2286
|
await conversation.loadFromDb();
|
|
2185
2287
|
|
|
2186
2288
|
// Start first message
|
|
2187
|
-
const p1 = conversation.processMessage(
|
|
2289
|
+
const p1 = conversation.processMessage({
|
|
2290
|
+
content: "msg-1",
|
|
2291
|
+
attachments: [],
|
|
2292
|
+
requestId: "req-1",
|
|
2293
|
+
});
|
|
2188
2294
|
await waitForPendingRun(1);
|
|
2189
2295
|
|
|
2190
2296
|
// Enqueue empty content (will fail persistUserMessage)
|
|
@@ -2232,12 +2338,12 @@ describe("Conversation host attachment directives", () => {
|
|
|
2232
2338
|
const conversation = makeConversation((msg) => clientEvents.push(msg));
|
|
2233
2339
|
await conversation.loadFromDb();
|
|
2234
2340
|
|
|
2235
|
-
const p1 = conversation.processMessage(
|
|
2236
|
-
"msg-1",
|
|
2237
|
-
[],
|
|
2238
|
-
(e) => events.push(e),
|
|
2239
|
-
"req-1",
|
|
2240
|
-
);
|
|
2341
|
+
const p1 = conversation.processMessage({
|
|
2342
|
+
content: "msg-1",
|
|
2343
|
+
attachments: [],
|
|
2344
|
+
onEvent: (e) => events.push(e),
|
|
2345
|
+
requestId: "req-1",
|
|
2346
|
+
});
|
|
2241
2347
|
await waitForPendingRun(1);
|
|
2242
2348
|
|
|
2243
2349
|
const run = pendingRuns[0];
|
|
@@ -2302,12 +2408,12 @@ describe("Conversation host attachment directives", () => {
|
|
|
2302
2408
|
const conversation = makeConversation((msg) => clientEvents.push(msg));
|
|
2303
2409
|
await conversation.loadFromDb();
|
|
2304
2410
|
|
|
2305
|
-
const p1 = conversation.processMessage(
|
|
2306
|
-
"msg-1",
|
|
2307
|
-
[],
|
|
2308
|
-
(e) => events.push(e),
|
|
2309
|
-
"req-1",
|
|
2310
|
-
);
|
|
2411
|
+
const p1 = conversation.processMessage({
|
|
2412
|
+
content: "msg-1",
|
|
2413
|
+
attachments: [],
|
|
2414
|
+
onEvent: (e) => events.push(e),
|
|
2415
|
+
requestId: "req-1",
|
|
2416
|
+
});
|
|
2311
2417
|
await waitForPendingRun(1);
|
|
2312
2418
|
|
|
2313
2419
|
const run = pendingRuns[0];
|
|
@@ -2389,12 +2495,12 @@ describe("Conversation attachment event payloads", () => {
|
|
|
2389
2495
|
const conversation = makeConversation();
|
|
2390
2496
|
await conversation.loadFromDb();
|
|
2391
2497
|
|
|
2392
|
-
const p1 = conversation.processMessage(
|
|
2393
|
-
"msg-1",
|
|
2394
|
-
[],
|
|
2395
|
-
(e) => events.push(e),
|
|
2396
|
-
"req-1",
|
|
2397
|
-
);
|
|
2498
|
+
const p1 = conversation.processMessage({
|
|
2499
|
+
content: "msg-1",
|
|
2500
|
+
attachments: [],
|
|
2501
|
+
onEvent: (e) => events.push(e),
|
|
2502
|
+
requestId: "req-1",
|
|
2503
|
+
});
|
|
2398
2504
|
await waitForPendingRun(1);
|
|
2399
2505
|
|
|
2400
2506
|
const run = pendingRuns[0];
|
|
@@ -2452,12 +2558,12 @@ describe("Conversation attachment event payloads", () => {
|
|
|
2452
2558
|
const conversation = makeConversation();
|
|
2453
2559
|
await conversation.loadFromDb();
|
|
2454
2560
|
|
|
2455
|
-
const p1 = conversation.processMessage(
|
|
2456
|
-
"msg-1",
|
|
2457
|
-
[],
|
|
2458
|
-
(e) => events1.push(e),
|
|
2459
|
-
"req-1",
|
|
2460
|
-
);
|
|
2561
|
+
const p1 = conversation.processMessage({
|
|
2562
|
+
content: "msg-1",
|
|
2563
|
+
attachments: [],
|
|
2564
|
+
onEvent: (e) => events1.push(e),
|
|
2565
|
+
requestId: "req-1",
|
|
2566
|
+
});
|
|
2461
2567
|
await waitForPendingRun(1);
|
|
2462
2568
|
|
|
2463
2569
|
// Queue a second message so the first run yields via checkpoint handoff.
|
|
@@ -2472,7 +2578,7 @@ describe("Conversation attachment event payloads", () => {
|
|
|
2472
2578
|
hasToolUse: true,
|
|
2473
2579
|
history: [],
|
|
2474
2580
|
}),
|
|
2475
|
-
).
|
|
2581
|
+
).toEqual("handoff");
|
|
2476
2582
|
|
|
2477
2583
|
const assistantMsg: Message = {
|
|
2478
2584
|
role: "assistant",
|
|
@@ -2537,12 +2643,12 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2537
2643
|
await conversation.loadFromDb();
|
|
2538
2644
|
|
|
2539
2645
|
// 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
|
-
);
|
|
2646
|
+
const p1 = conversation.processMessage({
|
|
2647
|
+
content: "msg-1",
|
|
2648
|
+
attachments: [],
|
|
2649
|
+
onEvent: (e) => msgEvents.push(e),
|
|
2650
|
+
requestId: "req-1",
|
|
2651
|
+
});
|
|
2546
2652
|
await waitForPendingRun(1);
|
|
2547
2653
|
|
|
2548
2654
|
// User cancels — sets the abort signal
|
|
@@ -2571,12 +2677,12 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2571
2677
|
await conversation.loadFromDb();
|
|
2572
2678
|
linkAttachmentShouldThrow = true;
|
|
2573
2679
|
|
|
2574
|
-
const p1 = conversation.processMessage(
|
|
2575
|
-
"msg-1",
|
|
2576
|
-
[],
|
|
2577
|
-
(e) => events.push(e),
|
|
2578
|
-
"req-1",
|
|
2579
|
-
);
|
|
2680
|
+
const p1 = conversation.processMessage({
|
|
2681
|
+
content: "msg-1",
|
|
2682
|
+
attachments: [],
|
|
2683
|
+
onEvent: (e) => events.push(e),
|
|
2684
|
+
requestId: "req-1",
|
|
2685
|
+
});
|
|
2580
2686
|
await waitForPendingRun(1);
|
|
2581
2687
|
const run = pendingRuns[0];
|
|
2582
2688
|
const assistantMsg: Message = {
|
|
@@ -2625,12 +2731,12 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2625
2731
|
const conversation = makeConversation();
|
|
2626
2732
|
await conversation.loadFromDb();
|
|
2627
2733
|
|
|
2628
|
-
const p1 = conversation.processMessage(
|
|
2629
|
-
"msg-1",
|
|
2630
|
-
[],
|
|
2631
|
-
(e) => allEvents.push(e),
|
|
2632
|
-
"req-1",
|
|
2633
|
-
);
|
|
2734
|
+
const p1 = conversation.processMessage({
|
|
2735
|
+
content: "msg-1",
|
|
2736
|
+
attachments: [],
|
|
2737
|
+
onEvent: (e) => allEvents.push(e),
|
|
2738
|
+
requestId: "req-1",
|
|
2739
|
+
});
|
|
2634
2740
|
await waitForPendingRun(1);
|
|
2635
2741
|
|
|
2636
2742
|
// Simulate a provider failure
|
|
@@ -2654,12 +2760,12 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2654
2760
|
|
|
2655
2761
|
const eventsPerMsg: ServerMessage[][] = [[], [], []];
|
|
2656
2762
|
|
|
2657
|
-
conversation.processMessage(
|
|
2658
|
-
"msg-1",
|
|
2659
|
-
[],
|
|
2660
|
-
(e) => eventsPerMsg[0].push(e),
|
|
2661
|
-
"req-1",
|
|
2662
|
-
);
|
|
2763
|
+
conversation.processMessage({
|
|
2764
|
+
content: "msg-1",
|
|
2765
|
+
attachments: [],
|
|
2766
|
+
onEvent: (e) => eventsPerMsg[0].push(e),
|
|
2767
|
+
requestId: "req-1",
|
|
2768
|
+
});
|
|
2663
2769
|
await waitForPendingRun(1);
|
|
2664
2770
|
|
|
2665
2771
|
conversation.enqueueMessage({
|
|
@@ -2706,12 +2812,12 @@ describe("Regression: cancel semantics and error channel split", () => {
|
|
|
2706
2812
|
const events2: ServerMessage[] = [];
|
|
2707
2813
|
|
|
2708
2814
|
// 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
|
-
);
|
|
2815
|
+
const _p1 = conversation.processMessage({
|
|
2816
|
+
content: "msg-1",
|
|
2817
|
+
attachments: [],
|
|
2818
|
+
onEvent: (e) => events1.push(e),
|
|
2819
|
+
requestId: "req-1",
|
|
2820
|
+
});
|
|
2715
2821
|
await waitForPendingRun(1);
|
|
2716
2822
|
|
|
2717
2823
|
// Enqueue a second message while the first is processing
|