@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
|
@@ -102,12 +102,13 @@ mock.module("@anthropic-ai/sdk", () => ({
|
|
|
102
102
|
}));
|
|
103
103
|
|
|
104
104
|
// Import after mocking
|
|
105
|
+
import { cachedTextBlock } from "../plugins/defaults/memory-v3-shadow/provider-blocks.js";
|
|
106
|
+
import { AnthropicProvider } from "../providers/anthropic/client.js";
|
|
105
107
|
import {
|
|
106
|
-
AnthropicProvider,
|
|
107
108
|
isPlaceholderSentinelText,
|
|
108
109
|
PLACEHOLDER_BLOCKS_OMITTED,
|
|
109
110
|
PLACEHOLDER_EMPTY_TURN,
|
|
110
|
-
} from "../providers/
|
|
111
|
+
} from "../providers/placeholder-sentinels.js";
|
|
111
112
|
|
|
112
113
|
// ---------------------------------------------------------------------------
|
|
113
114
|
// Helpers
|
|
@@ -180,7 +181,9 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
180
181
|
// System prompt cache control
|
|
181
182
|
// -----------------------------------------------------------------------
|
|
182
183
|
test("system prompt has cache_control ephemeral with 1h TTL", async () => {
|
|
183
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
184
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
185
|
+
systemPrompt: "You are helpful.",
|
|
186
|
+
});
|
|
184
187
|
|
|
185
188
|
const system = lastStreamParams!.system as Array<{
|
|
186
189
|
type: string;
|
|
@@ -198,7 +201,7 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
198
201
|
});
|
|
199
202
|
|
|
200
203
|
test("sends disabled thinking config natively", async () => {
|
|
201
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
204
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
202
205
|
config: { thinking: { type: "disabled" } },
|
|
203
206
|
});
|
|
204
207
|
|
|
@@ -230,7 +233,7 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
230
233
|
test("renders the system prompt as a single 1h-cached block", async () => {
|
|
231
234
|
const prompt = "You are a helpful assistant.";
|
|
232
235
|
|
|
233
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
236
|
+
await provider.sendMessage([userMsg("Hi")], { systemPrompt: prompt });
|
|
234
237
|
|
|
235
238
|
const system = lastStreamParams!.system as Array<{
|
|
236
239
|
type: string;
|
|
@@ -251,7 +254,10 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
251
254
|
toolUseMsg("tu_1", "bash"),
|
|
252
255
|
toolResultMsg("tu_1", "output"),
|
|
253
256
|
];
|
|
254
|
-
await provider.sendMessage(messages,
|
|
257
|
+
await provider.sendMessage(messages, {
|
|
258
|
+
tools: sampleTools,
|
|
259
|
+
systemPrompt: prompt,
|
|
260
|
+
});
|
|
255
261
|
|
|
256
262
|
const system = lastStreamParams!.system as Array<{
|
|
257
263
|
type: string;
|
|
@@ -291,7 +297,7 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
291
297
|
// Tool cache control
|
|
292
298
|
// -----------------------------------------------------------------------
|
|
293
299
|
test("only last tool definition includes cache_control", async () => {
|
|
294
|
-
await provider.sendMessage([userMsg("Hi")], sampleTools);
|
|
300
|
+
await provider.sendMessage([userMsg("Hi")], { tools: sampleTools });
|
|
295
301
|
|
|
296
302
|
const tools = lastStreamParams!.tools as Array<{
|
|
297
303
|
name: string;
|
|
@@ -308,7 +314,7 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
308
314
|
});
|
|
309
315
|
|
|
310
316
|
test("single tool gets cache_control", async () => {
|
|
311
|
-
await provider.sendMessage([userMsg("Hi")], [sampleTools[0]]);
|
|
317
|
+
await provider.sendMessage([userMsg("Hi")], { tools: [sampleTools[0]] });
|
|
312
318
|
|
|
313
319
|
const tools = lastStreamParams!.tools as Array<{
|
|
314
320
|
name: string;
|
|
@@ -318,6 +324,98 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
318
324
|
expect(tools[0].cache_control).toEqual({ type: "ephemeral", ttl: "1h" });
|
|
319
325
|
});
|
|
320
326
|
|
|
327
|
+
test("preserves a caller's 1h block cache_control and sends the extended-cache beta (non-Haiku)", async () => {
|
|
328
|
+
// v3's `cachedTextBlock` stamps a stable prefix block with a 1h TTL; the
|
|
329
|
+
// non-Haiku path must forward it unchanged and send the beta header.
|
|
330
|
+
await provider.sendMessage([
|
|
331
|
+
{
|
|
332
|
+
role: "user",
|
|
333
|
+
content: [
|
|
334
|
+
cachedTextBlock("stable pages block"),
|
|
335
|
+
{ type: "text", text: "volatile current message" },
|
|
336
|
+
],
|
|
337
|
+
},
|
|
338
|
+
]);
|
|
339
|
+
|
|
340
|
+
const messages = lastStreamParams!.messages as Array<{
|
|
341
|
+
content: Array<{ cache_control?: { type: string; ttl?: string } }>;
|
|
342
|
+
}>;
|
|
343
|
+
expect(messages[0].content[0].cache_control).toEqual({
|
|
344
|
+
type: "ephemeral",
|
|
345
|
+
ttl: "1h",
|
|
346
|
+
});
|
|
347
|
+
expect(lastStreamParams!.betas).toContain("extended-cache-ttl-2025-04-11");
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
test("strips ttl from a caller's block cache_control and omits the beta for Haiku", async () => {
|
|
351
|
+
// Haiku doesn't support the extended-cache-ttl beta, so a caller-stamped
|
|
352
|
+
// 1h ttl (e.g. from `cachedTextBlock`) must be stripped before sending.
|
|
353
|
+
const haiku = new AnthropicProvider(
|
|
354
|
+
"sk-ant-test",
|
|
355
|
+
"claude-haiku-4-5-20251001",
|
|
356
|
+
);
|
|
357
|
+
await haiku.sendMessage([
|
|
358
|
+
{
|
|
359
|
+
role: "user",
|
|
360
|
+
content: [
|
|
361
|
+
cachedTextBlock("stable pages block"),
|
|
362
|
+
{ type: "text", text: "volatile current message" },
|
|
363
|
+
],
|
|
364
|
+
},
|
|
365
|
+
]);
|
|
366
|
+
|
|
367
|
+
const messages = lastStreamParams!.messages as Array<{
|
|
368
|
+
content: Array<{ cache_control?: { type: string; ttl?: string } }>;
|
|
369
|
+
}>;
|
|
370
|
+
expect(messages[0].content[0].cache_control).toEqual({ type: "ephemeral" });
|
|
371
|
+
expect(messages[0].content[0].cache_control).not.toHaveProperty("ttl");
|
|
372
|
+
expect(
|
|
373
|
+
(lastStreamParams!.betas as string[] | undefined) ?? [],
|
|
374
|
+
).not.toContain("extended-cache-ttl-2025-04-11");
|
|
375
|
+
});
|
|
376
|
+
|
|
377
|
+
test("v3-shape call (system + tools + cached prefix block) stays within the 4-breakpoint cap", async () => {
|
|
378
|
+
// Mirrors a v3 L2 selector call: a system prompt, a forced tool, and a user
|
|
379
|
+
// message whose stable <pages> block carries a cache_control breakpoint
|
|
380
|
+
// followed by the volatile current-message block. The preserved prefix
|
|
381
|
+
// breakpoint plus the client's system/tools/turn-start anchors must total
|
|
382
|
+
// exactly Anthropic's max of 4.
|
|
383
|
+
await provider.sendMessage(
|
|
384
|
+
[
|
|
385
|
+
{
|
|
386
|
+
role: "user",
|
|
387
|
+
content: [
|
|
388
|
+
cachedTextBlock("stable pages block"),
|
|
389
|
+
{ type: "text", text: "volatile current message" },
|
|
390
|
+
],
|
|
391
|
+
},
|
|
392
|
+
],
|
|
393
|
+
{ systemPrompt: "Select relevant pages.", tools: [sampleTools[0]] },
|
|
394
|
+
);
|
|
395
|
+
|
|
396
|
+
let breakpoints = 0;
|
|
397
|
+
const system = lastStreamParams!.system as
|
|
398
|
+
| Array<{ cache_control?: unknown }>
|
|
399
|
+
| undefined;
|
|
400
|
+
for (const b of system ?? []) if (b.cache_control) breakpoints++;
|
|
401
|
+
const tools = lastStreamParams!.tools as
|
|
402
|
+
| Array<{ cache_control?: unknown }>
|
|
403
|
+
| undefined;
|
|
404
|
+
for (const t of tools ?? []) if (t.cache_control) breakpoints++;
|
|
405
|
+
const messages = lastStreamParams!.messages as Array<{
|
|
406
|
+
content: Array<{ cache_control?: { type: string; ttl?: string } }>;
|
|
407
|
+
}>;
|
|
408
|
+
for (const m of messages)
|
|
409
|
+
for (const b of m.content) if (b.cache_control) breakpoints++;
|
|
410
|
+
|
|
411
|
+
expect(breakpoints).toBe(4);
|
|
412
|
+
// The stable pages block specifically must hold the preserved breakpoint.
|
|
413
|
+
expect(messages[0].content[0].cache_control).toEqual({
|
|
414
|
+
type: "ephemeral",
|
|
415
|
+
ttl: "1h",
|
|
416
|
+
});
|
|
417
|
+
});
|
|
418
|
+
|
|
321
419
|
test("no tools param when tools are omitted", async () => {
|
|
322
420
|
await provider.sendMessage([userMsg("Hi")]);
|
|
323
421
|
|
|
@@ -409,14 +507,9 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
409
507
|
// per call with content that changes every time. Caching the turn-start
|
|
410
508
|
// block would create unused entries — `disableTurnStartCache: true`
|
|
411
509
|
// opts out.
|
|
412
|
-
await provider.sendMessage(
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
undefined,
|
|
416
|
-
{
|
|
417
|
-
config: { disableTurnStartCache: true },
|
|
418
|
-
},
|
|
419
|
-
);
|
|
510
|
+
await provider.sendMessage([userMsg("Pick relevant pages")], {
|
|
511
|
+
config: { disableTurnStartCache: true },
|
|
512
|
+
});
|
|
420
513
|
|
|
421
514
|
const sent = lastStreamParams!.messages as Array<{
|
|
422
515
|
role: string;
|
|
@@ -458,6 +551,128 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
458
551
|
}
|
|
459
552
|
});
|
|
460
553
|
|
|
554
|
+
// -----------------------------------------------------------------------
|
|
555
|
+
// mutableLatestUserMessage — volatile trailing user message cache anchor
|
|
556
|
+
// -----------------------------------------------------------------------
|
|
557
|
+
test("mutableLatestUserMessage: first-of-turn skips the volatile turn-start anchor and anchors the previous stable user message", async () => {
|
|
558
|
+
// The latest user message carries per-turn-volatile content (e.g. an
|
|
559
|
+
// injected memory block). The long-TTL anchor must move off it onto the
|
|
560
|
+
// most recent stable user message so the cached prefix stays reusable.
|
|
561
|
+
const messages: Message[] = [
|
|
562
|
+
userMsg("Turn 1"),
|
|
563
|
+
assistantMsg("Response 1"),
|
|
564
|
+
userMsg("Turn 2 (volatile)"),
|
|
565
|
+
];
|
|
566
|
+
await provider.sendMessage(messages, {
|
|
567
|
+
config: { mutableLatestUserMessage: true },
|
|
568
|
+
});
|
|
569
|
+
|
|
570
|
+
const sent = lastStreamParams!.messages as Array<{
|
|
571
|
+
role: string;
|
|
572
|
+
content: Array<{
|
|
573
|
+
type: string;
|
|
574
|
+
text: string;
|
|
575
|
+
cache_control?: { type: string; ttl?: string };
|
|
576
|
+
}>;
|
|
577
|
+
}>;
|
|
578
|
+
const userMessages = sent.filter((m) => m.role === "user");
|
|
579
|
+
|
|
580
|
+
// Latest (turn-start) user message gets NO long-TTL breakpoint — it's volatile.
|
|
581
|
+
const latest = userMessages[userMessages.length - 1];
|
|
582
|
+
for (const block of latest.content) {
|
|
583
|
+
expect(block.cache_control).toBeUndefined();
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// Previous stable user message (Turn 1) becomes the primary anchor.
|
|
587
|
+
const prev = userMessages[userMessages.length - 2];
|
|
588
|
+
const prevLast = prev.content[prev.content.length - 1];
|
|
589
|
+
expect(prevLast.cache_control).toEqual({ type: "ephemeral", ttl: "1h" });
|
|
590
|
+
});
|
|
591
|
+
|
|
592
|
+
test("mutableLatestUserMessage absent: breakpoint placement is byte-identical to default behavior (v2 regression guard)", async () => {
|
|
593
|
+
const messages: Message[] = [
|
|
594
|
+
userMsg("Turn 1"),
|
|
595
|
+
assistantMsg("Response 1"),
|
|
596
|
+
userMsg("Turn 2"),
|
|
597
|
+
];
|
|
598
|
+
await provider.sendMessage(messages);
|
|
599
|
+
|
|
600
|
+
const sent = lastStreamParams!.messages as Array<{
|
|
601
|
+
role: string;
|
|
602
|
+
content: Array<{
|
|
603
|
+
type: string;
|
|
604
|
+
cache_control?: { type: string; ttl?: string };
|
|
605
|
+
}>;
|
|
606
|
+
}>;
|
|
607
|
+
const userMessages = sent.filter((m) => m.role === "user");
|
|
608
|
+
|
|
609
|
+
// Current-turn (latest) anchor keeps 1h.
|
|
610
|
+
const latest = userMessages[userMessages.length - 1];
|
|
611
|
+
const latestLast = latest.content[latest.content.length - 1];
|
|
612
|
+
expect(latestLast.cache_control).toEqual({ type: "ephemeral", ttl: "1h" });
|
|
613
|
+
// Previous-turn anchor keeps 1h.
|
|
614
|
+
const prev = userMessages[userMessages.length - 2];
|
|
615
|
+
const prevLast = prev.content[prev.content.length - 1];
|
|
616
|
+
expect(prevLast.cache_control).toEqual({ type: "ephemeral", ttl: "1h" });
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
test("mutableLatestUserMessage: during a tool-use loop placement is unchanged (block is fixed within the turn)", async () => {
|
|
620
|
+
// Turn-start is not the last message (tool_result follows), so the
|
|
621
|
+
// turn-start block is fixed for the rest of the turn — the flag must not
|
|
622
|
+
// move the anchor.
|
|
623
|
+
const messages: Message[] = [
|
|
624
|
+
userMsg("Turn 1"),
|
|
625
|
+
assistantMsg("Response 1"),
|
|
626
|
+
userMsg("Turn 2"),
|
|
627
|
+
toolUseMsg("tu_1", "bash"),
|
|
628
|
+
toolResultMsg("tu_1", "output"),
|
|
629
|
+
];
|
|
630
|
+
await provider.sendMessage(messages, {
|
|
631
|
+
config: { mutableLatestUserMessage: true },
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
const sent = lastStreamParams!.messages as Array<{
|
|
635
|
+
role: string;
|
|
636
|
+
content: Array<{
|
|
637
|
+
type: string;
|
|
638
|
+
cache_control?: { type: string; ttl?: string };
|
|
639
|
+
}>;
|
|
640
|
+
}>;
|
|
641
|
+
|
|
642
|
+
// Turn-start (Turn 2, index 2) still gets the 1h anchor — within a tool-use
|
|
643
|
+
// loop the block is fixed, so the volatile-latest flag must not move it.
|
|
644
|
+
const turn2 = sent[2];
|
|
645
|
+
const turn2Last = turn2.content[turn2.content.length - 1];
|
|
646
|
+
expect(turn2Last.cache_control).toEqual({ type: "ephemeral", ttl: "1h" });
|
|
647
|
+
});
|
|
648
|
+
|
|
649
|
+
test("mutableLatestUserMessage: first turn with no previous user message does not throw and applies no long-TTL anchor", async () => {
|
|
650
|
+
await provider.sendMessage([userMsg("First ever turn (volatile)")], {
|
|
651
|
+
config: { mutableLatestUserMessage: true },
|
|
652
|
+
});
|
|
653
|
+
|
|
654
|
+
const sent = lastStreamParams!.messages as Array<{
|
|
655
|
+
role: string;
|
|
656
|
+
content: Array<{
|
|
657
|
+
type: string;
|
|
658
|
+
cache_control?: { type: string; ttl?: string };
|
|
659
|
+
}>;
|
|
660
|
+
}>;
|
|
661
|
+
// Only user message is volatile and there is no prior stable one, so no
|
|
662
|
+
// long-TTL breakpoint lands on any user message — graceful, no throw.
|
|
663
|
+
const lastBlock = sent[0].content[sent[0].content.length - 1];
|
|
664
|
+
expect(lastBlock.cache_control).toBeUndefined();
|
|
665
|
+
});
|
|
666
|
+
|
|
667
|
+
test("mutableLatestUserMessage is not forwarded to the Anthropic API", async () => {
|
|
668
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
669
|
+
config: { mutableLatestUserMessage: true },
|
|
670
|
+
});
|
|
671
|
+
expect(
|
|
672
|
+
(lastStreamParams as Record<string, unknown>).mutableLatestUserMessage,
|
|
673
|
+
).toBeUndefined();
|
|
674
|
+
});
|
|
675
|
+
|
|
461
676
|
// -----------------------------------------------------------------------
|
|
462
677
|
// Negative: assistant messages never get cache_control
|
|
463
678
|
// -----------------------------------------------------------------------
|
|
@@ -1537,7 +1752,7 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
1537
1752
|
{ kind: "blockStop" },
|
|
1538
1753
|
];
|
|
1539
1754
|
const emitted: string[] = [];
|
|
1540
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
1755
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
1541
1756
|
onEvent: (event) => {
|
|
1542
1757
|
if (event.type === "text_delta") emitted.push(event.text);
|
|
1543
1758
|
},
|
|
@@ -1554,7 +1769,7 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
1554
1769
|
{ kind: "blockStop" },
|
|
1555
1770
|
];
|
|
1556
1771
|
const emitted: string[] = [];
|
|
1557
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
1772
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
1558
1773
|
onEvent: (event) => {
|
|
1559
1774
|
if (event.type === "text_delta") emitted.push(event.text);
|
|
1560
1775
|
},
|
|
@@ -1569,7 +1784,7 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
1569
1784
|
{ kind: "blockStop" },
|
|
1570
1785
|
];
|
|
1571
1786
|
const emitted: string[] = [];
|
|
1572
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
1787
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
1573
1788
|
onEvent: (event) => {
|
|
1574
1789
|
if (event.type === "text_delta") emitted.push(event.text);
|
|
1575
1790
|
},
|
|
@@ -1586,7 +1801,7 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
1586
1801
|
{ kind: "blockStop" },
|
|
1587
1802
|
];
|
|
1588
1803
|
const emitted: string[] = [];
|
|
1589
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
1804
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
1590
1805
|
onEvent: (event) => {
|
|
1591
1806
|
if (event.type === "text_delta") emitted.push(event.text);
|
|
1592
1807
|
},
|
|
@@ -1605,7 +1820,7 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
1605
1820
|
{ kind: "blockStop" },
|
|
1606
1821
|
];
|
|
1607
1822
|
const emitted: string[] = [];
|
|
1608
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
1823
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
1609
1824
|
onEvent: (event) => {
|
|
1610
1825
|
if (event.type === "text_delta") emitted.push(event.text);
|
|
1611
1826
|
},
|
|
@@ -1622,7 +1837,7 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
1622
1837
|
{ kind: "blockStop" },
|
|
1623
1838
|
];
|
|
1624
1839
|
const emitted: string[] = [];
|
|
1625
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
1840
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
1626
1841
|
onEvent: (event) => {
|
|
1627
1842
|
if (event.type === "text_delta") emitted.push(event.text);
|
|
1628
1843
|
},
|
|
@@ -1640,7 +1855,7 @@ describe("AnthropicProvider — Cache-Control Characterization", () => {
|
|
|
1640
1855
|
{ kind: "blockStop" },
|
|
1641
1856
|
];
|
|
1642
1857
|
const emitted: string[] = [];
|
|
1643
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
1858
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
1644
1859
|
onEvent: (event) => {
|
|
1645
1860
|
if (event.type === "text_delta") emitted.push(event.text);
|
|
1646
1861
|
},
|
|
@@ -2120,11 +2335,10 @@ describe("AnthropicProvider — Managed Proxy Fallback", () => {
|
|
|
2120
2335
|
baseURL: "https://platform.example.com/v1/runtime-proxy/anthropic",
|
|
2121
2336
|
});
|
|
2122
2337
|
|
|
2123
|
-
await provider.sendMessage(
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
|
|
2127
|
-
);
|
|
2338
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
2339
|
+
tools: sampleTools,
|
|
2340
|
+
systemPrompt: "You are helpful.",
|
|
2341
|
+
});
|
|
2128
2342
|
|
|
2129
2343
|
// System prompt cache control
|
|
2130
2344
|
const system = lastStreamParams!.system as Array<{
|
|
@@ -2224,13 +2438,16 @@ describe("AnthropicProvider — Haiku Model Gating", () => {
|
|
|
2224
2438
|
});
|
|
2225
2439
|
|
|
2226
2440
|
test("max_tokens defaults to 8192 for Haiku", async () => {
|
|
2227
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
2441
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
2442
|
+
systemPrompt: "You are helpful.",
|
|
2443
|
+
});
|
|
2228
2444
|
|
|
2229
2445
|
expect(lastStreamParams!.max_tokens).toBe(8192);
|
|
2230
2446
|
});
|
|
2231
2447
|
|
|
2232
2448
|
test("caller max_tokens is clamped to 8192 for Haiku", async () => {
|
|
2233
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
2449
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
2450
|
+
systemPrompt: "You are helpful.",
|
|
2234
2451
|
config: { max_tokens: 64000 },
|
|
2235
2452
|
});
|
|
2236
2453
|
|
|
@@ -2238,7 +2455,8 @@ describe("AnthropicProvider — Haiku Model Gating", () => {
|
|
|
2238
2455
|
});
|
|
2239
2456
|
|
|
2240
2457
|
test("caller max_tokens below 8192 is preserved for Haiku", async () => {
|
|
2241
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
2458
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
2459
|
+
systemPrompt: "You are helpful.",
|
|
2242
2460
|
config: { max_tokens: 128 },
|
|
2243
2461
|
});
|
|
2244
2462
|
|
|
@@ -2250,18 +2468,18 @@ describe("AnthropicProvider — Haiku Model Gating", () => {
|
|
|
2250
2468
|
"sk-ant-test",
|
|
2251
2469
|
"claude-sonnet-4-6",
|
|
2252
2470
|
);
|
|
2253
|
-
await sonnetProvider.sendMessage(
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
{ config: { max_tokens: 200 } },
|
|
2258
|
-
);
|
|
2471
|
+
await sonnetProvider.sendMessage([userMsg("Hi")], {
|
|
2472
|
+
systemPrompt: "You are helpful.",
|
|
2473
|
+
config: { max_tokens: 200 },
|
|
2474
|
+
});
|
|
2259
2475
|
|
|
2260
2476
|
expect(lastStreamParams!.max_tokens).toBe(200);
|
|
2261
2477
|
});
|
|
2262
2478
|
|
|
2263
2479
|
test("cache_control omits ttl for Haiku", async () => {
|
|
2264
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
2480
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
2481
|
+
systemPrompt: "You are helpful.",
|
|
2482
|
+
});
|
|
2265
2483
|
|
|
2266
2484
|
const system = lastStreamParams!.system as Array<{
|
|
2267
2485
|
cache_control?: { type: string; ttl?: string };
|
|
@@ -2271,7 +2489,9 @@ describe("AnthropicProvider — Haiku Model Gating", () => {
|
|
|
2271
2489
|
});
|
|
2272
2490
|
|
|
2273
2491
|
test("betas array is empty for Haiku (no extended cache TTL)", async () => {
|
|
2274
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
2492
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
2493
|
+
systemPrompt: "You are helpful.",
|
|
2494
|
+
});
|
|
2275
2495
|
|
|
2276
2496
|
// When betas is empty, the non-beta stream path is used, so no betas
|
|
2277
2497
|
// field should appear in lastStreamParams.
|
|
@@ -2279,7 +2499,8 @@ describe("AnthropicProvider — Haiku Model Gating", () => {
|
|
|
2279
2499
|
});
|
|
2280
2500
|
|
|
2281
2501
|
test("effort is stripped for Haiku even when provided in config", async () => {
|
|
2282
|
-
await provider.sendMessage([userMsg("Hi")],
|
|
2502
|
+
await provider.sendMessage([userMsg("Hi")], {
|
|
2503
|
+
systemPrompt: "You are helpful.",
|
|
2283
2504
|
config: { effort: "high" },
|
|
2284
2505
|
});
|
|
2285
2506
|
|
|
@@ -2291,12 +2512,10 @@ describe("AnthropicProvider — Haiku Model Gating", () => {
|
|
|
2291
2512
|
"sk-ant-test",
|
|
2292
2513
|
"claude-sonnet-4-6",
|
|
2293
2514
|
);
|
|
2294
|
-
await sonnetProvider.sendMessage(
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
{ config: { effort: "none" } },
|
|
2299
|
-
);
|
|
2515
|
+
await sonnetProvider.sendMessage([userMsg("Hi")], {
|
|
2516
|
+
systemPrompt: "You are helpful.",
|
|
2517
|
+
config: { effort: "none" },
|
|
2518
|
+
});
|
|
2300
2519
|
|
|
2301
2520
|
// mergedOutputConfig is empty when effort is "none" and no other
|
|
2302
2521
|
// output_config fields were supplied, so output_config is not attached
|
|
@@ -2323,7 +2542,9 @@ describe("OpenRouterProvider — Anthropic dispatch", () => {
|
|
|
2323
2542
|
"or-key",
|
|
2324
2543
|
"anthropic/claude-sonnet-4.6",
|
|
2325
2544
|
);
|
|
2326
|
-
await provider.sendMessage([userMsg("hi")],
|
|
2545
|
+
await provider.sendMessage([userMsg("hi")], {
|
|
2546
|
+
systemPrompt: "You are helpful.",
|
|
2547
|
+
});
|
|
2327
2548
|
|
|
2328
2549
|
expect(lastConstructorArgs).toMatchObject({
|
|
2329
2550
|
apiKey: null,
|
|
@@ -2358,7 +2579,7 @@ describe("OpenRouterProvider — Anthropic dispatch", () => {
|
|
|
2358
2579
|
"or-key",
|
|
2359
2580
|
"anthropic/claude-sonnet-4.6",
|
|
2360
2581
|
);
|
|
2361
|
-
await provider.sendMessage([userMsg("hi")],
|
|
2582
|
+
await provider.sendMessage([userMsg("hi")], {
|
|
2362
2583
|
config: { thinking: { type: "adaptive" } },
|
|
2363
2584
|
});
|
|
2364
2585
|
|
|
@@ -2375,7 +2596,7 @@ describe("OpenRouterProvider — Anthropic dispatch", () => {
|
|
|
2375
2596
|
"or-key",
|
|
2376
2597
|
"anthropic/claude-sonnet-4.6",
|
|
2377
2598
|
);
|
|
2378
|
-
await provider.sendMessage([userMsg("hi")],
|
|
2599
|
+
await provider.sendMessage([userMsg("hi")], {
|
|
2379
2600
|
config: { thinking: { type: "disabled" } },
|
|
2380
2601
|
});
|
|
2381
2602
|
|
|
@@ -2390,7 +2611,7 @@ describe("OpenRouterProvider — Anthropic dispatch", () => {
|
|
|
2390
2611
|
"or-key",
|
|
2391
2612
|
"anthropic/claude-sonnet-4.6",
|
|
2392
2613
|
);
|
|
2393
|
-
await provider.sendMessage([userMsg("hi")],
|
|
2614
|
+
await provider.sendMessage([userMsg("hi")], {
|
|
2394
2615
|
config: {
|
|
2395
2616
|
usageAttributionHeaders: {
|
|
2396
2617
|
"Vellum-Organization-Id": "org-123",
|
|
@@ -2418,7 +2639,7 @@ describe("OpenRouterProvider — Anthropic dispatch", () => {
|
|
|
2418
2639
|
// Default model is non-Anthropic, but the request overrides with an
|
|
2419
2640
|
// Anthropic model — dispatch must honour the request-level model.
|
|
2420
2641
|
const provider = new OpenRouterProvider("or-key", "x-ai/grok-4");
|
|
2421
|
-
await provider.sendMessage([userMsg("hi")],
|
|
2642
|
+
await provider.sendMessage([userMsg("hi")], {
|
|
2422
2643
|
config: { model: "anthropic/claude-haiku-4.5" },
|
|
2423
2644
|
});
|
|
2424
2645
|
|
|
@@ -2488,7 +2709,10 @@ describe("AnthropicProvider — thinking block send-time filtering", () => {
|
|
|
2488
2709
|
userMsg("And what is 3+3?"),
|
|
2489
2710
|
];
|
|
2490
2711
|
|
|
2491
|
-
await provider.sendMessage(messages,
|
|
2712
|
+
await provider.sendMessage(messages, {
|
|
2713
|
+
tools: sampleTools,
|
|
2714
|
+
systemPrompt: "system",
|
|
2715
|
+
});
|
|
2492
2716
|
expect(lastStreamParams).toBeTruthy();
|
|
2493
2717
|
|
|
2494
2718
|
const sent = lastStreamParams!.messages as Anthropic.MessageParam[];
|
|
@@ -2514,7 +2738,10 @@ describe("AnthropicProvider — thinking block send-time filtering", () => {
|
|
|
2514
2738
|
userMsg("And what is 3+3?"),
|
|
2515
2739
|
];
|
|
2516
2740
|
|
|
2517
|
-
await provider.sendMessage(messages,
|
|
2741
|
+
await provider.sendMessage(messages, {
|
|
2742
|
+
tools: sampleTools,
|
|
2743
|
+
systemPrompt: "system",
|
|
2744
|
+
});
|
|
2518
2745
|
expect(lastStreamParams).toBeTruthy();
|
|
2519
2746
|
|
|
2520
2747
|
const sent = lastStreamParams!.messages as Anthropic.MessageParam[];
|
|
@@ -2540,7 +2767,10 @@ describe("AnthropicProvider — thinking block send-time filtering", () => {
|
|
|
2540
2767
|
toolResultMsg("tu-1", "file contents here"),
|
|
2541
2768
|
];
|
|
2542
2769
|
|
|
2543
|
-
await provider.sendMessage(messages,
|
|
2770
|
+
await provider.sendMessage(messages, {
|
|
2771
|
+
tools: sampleTools,
|
|
2772
|
+
systemPrompt: "system",
|
|
2773
|
+
});
|
|
2544
2774
|
expect(lastStreamParams).toBeTruthy();
|
|
2545
2775
|
|
|
2546
2776
|
const sent = lastStreamParams!.messages as Anthropic.MessageParam[];
|
|
@@ -2573,7 +2803,10 @@ describe("AnthropicProvider — thinking block send-time filtering", () => {
|
|
|
2573
2803
|
toolResultMsg("tu-2", "file contents"),
|
|
2574
2804
|
];
|
|
2575
2805
|
|
|
2576
|
-
await provider.sendMessage(messages,
|
|
2806
|
+
await provider.sendMessage(messages, {
|
|
2807
|
+
tools: sampleTools,
|
|
2808
|
+
systemPrompt: "system",
|
|
2809
|
+
});
|
|
2577
2810
|
expect(lastStreamParams).toBeTruthy();
|
|
2578
2811
|
|
|
2579
2812
|
const sent = lastStreamParams!.messages as Anthropic.MessageParam[];
|
|
@@ -2610,7 +2843,10 @@ describe("AnthropicProvider — thinking block send-time filtering", () => {
|
|
|
2610
2843
|
userMsg("What did you conclude?"),
|
|
2611
2844
|
];
|
|
2612
2845
|
|
|
2613
|
-
await provider.sendMessage(messages,
|
|
2846
|
+
await provider.sendMessage(messages, {
|
|
2847
|
+
tools: sampleTools,
|
|
2848
|
+
systemPrompt: "system",
|
|
2849
|
+
});
|
|
2614
2850
|
expect(lastStreamParams).toBeTruthy();
|
|
2615
2851
|
|
|
2616
2852
|
const sent = lastStreamParams!.messages as Anthropic.MessageParam[];
|
|
@@ -2648,7 +2884,10 @@ describe("AnthropicProvider — thinking block send-time filtering", () => {
|
|
|
2648
2884
|
toolResultMsg("tu-b", "result b"),
|
|
2649
2885
|
];
|
|
2650
2886
|
|
|
2651
|
-
await provider.sendMessage(messages,
|
|
2887
|
+
await provider.sendMessage(messages, {
|
|
2888
|
+
tools: sampleTools,
|
|
2889
|
+
systemPrompt: "system",
|
|
2890
|
+
});
|
|
2652
2891
|
expect(lastStreamParams).toBeTruthy();
|
|
2653
2892
|
|
|
2654
2893
|
const sent = lastStreamParams!.messages as Anthropic.MessageParam[];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { describe, expect, test } from "bun:test";
|
|
3
|
+
|
|
4
|
+
describe("app-builder skill instructions", () => {
|
|
5
|
+
test("uses non-CLI UI confirmation for optional profile switch", async () => {
|
|
6
|
+
const skillText = await readFile(
|
|
7
|
+
new URL("../config/bundled-skills/app-builder/SKILL.md", import.meta.url),
|
|
8
|
+
"utf8",
|
|
9
|
+
);
|
|
10
|
+
const preflightStart = skillText.indexOf("### 0. Preflight");
|
|
11
|
+
const preflightEnd = skillText.indexOf("### 1. Gather Requirements");
|
|
12
|
+
const preflight = skillText.slice(preflightStart, preflightEnd);
|
|
13
|
+
|
|
14
|
+
expect(preflight).not.toContain("assistant ui confirm --message");
|
|
15
|
+
expect(preflight).toContain("Use the `ui_show` tool");
|
|
16
|
+
expect(preflight).toContain('surface_type: "confirmation"');
|
|
17
|
+
expect(preflight).toContain("await_action: true");
|
|
18
|
+
expect(preflight).toContain(
|
|
19
|
+
"Do not call the shell command `assistant ui confirm`",
|
|
20
|
+
);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
@@ -103,7 +103,7 @@ const { ROUTES } = await import("../runtime/routes/host-app-control-routes.js");
|
|
|
103
103
|
const { surfaceProxyResolver } =
|
|
104
104
|
await import("../daemon/conversation-surfaces.js");
|
|
105
105
|
const { setConversation, clearConversations } =
|
|
106
|
-
await import("../daemon/conversation-
|
|
106
|
+
await import("../daemon/conversation-registry.js");
|
|
107
107
|
type SurfaceConversationContext =
|
|
108
108
|
import("../daemon/conversation-surfaces.js").SurfaceConversationContext;
|
|
109
109
|
|
|
@@ -131,6 +131,11 @@ function buildContext(
|
|
|
131
131
|
): SurfaceConversationContext {
|
|
132
132
|
return {
|
|
133
133
|
conversationId,
|
|
134
|
+
trustContext: {
|
|
135
|
+
sourceChannel: "vellum",
|
|
136
|
+
trustClass: "guardian",
|
|
137
|
+
guardianPrincipalId: "user-1",
|
|
138
|
+
},
|
|
134
139
|
traceEmitter: { emit: () => {} },
|
|
135
140
|
sendToClient: () => {},
|
|
136
141
|
pendingSurfaceActions: new Map(),
|
|
@@ -19,6 +19,7 @@ const ALLOWLIST = new Set([
|
|
|
19
19
|
"assistant/src/memory/app-store.ts", // defines getAppsDir
|
|
20
20
|
"assistant/src/memory/app-git-service.ts", // uses getAppsDir for git repo root, not per-app paths
|
|
21
21
|
"assistant/src/daemon/app-source-watcher.ts", // uses getAppsDir for recursive fs.watch root, not per-app paths
|
|
22
|
+
"assistant/src/tools/filesystem/write.ts", // uses getAppsDir as an exemption root for the artifact-HTML guard, not per-app paths
|
|
22
23
|
]);
|
|
23
24
|
|
|
24
25
|
function isTestFile(filePath: string): boolean {
|