@vellumai/assistant 0.7.2 → 0.8.0
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/ARCHITECTURE.md +45 -29
- package/Dockerfile +1 -0
- package/__tests__/permissions/gateway-threshold-reader.test.ts +236 -9
- package/bun.lock +3 -0
- package/docs/architecture/memory.md +5 -2
- package/knip.json +1 -0
- package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +13 -4
- package/node_modules/@vellumai/ipc-server-utils/bun.lock +24 -0
- package/node_modules/@vellumai/ipc-server-utils/package.json +18 -0
- package/node_modules/@vellumai/ipc-server-utils/src/index.ts +6 -0
- package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.test.ts +430 -0
- package/node_modules/@vellumai/ipc-server-utils/src/socket-watchdog.ts +221 -0
- package/node_modules/@vellumai/ipc-server-utils/tsconfig.json +20 -0
- package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -9
- package/node_modules/@vellumai/slack-text/src/index.test.ts +18 -35
- package/node_modules/@vellumai/slack-text/src/index.ts +2 -48
- package/openapi.yaml +470 -25
- package/package.json +3 -1
- package/src/__tests__/annotate-risk-options.test.ts +291 -0
- package/src/__tests__/app-control-flow.test.ts +21 -11
- package/src/__tests__/approval-cascade.test.ts +8 -16
- package/src/__tests__/approval-routes-http.test.ts +6 -0
- package/src/__tests__/assistant-event-hub.test.ts +48 -0
- package/src/__tests__/assistant-event.test.ts +0 -10
- package/src/__tests__/assistant-events-sse-hardening.test.ts +2 -7
- package/src/__tests__/assistant-feature-flags-integration.test.ts +18 -0
- package/src/__tests__/auto-analysis-end-to-end.test.ts +48 -0
- package/src/__tests__/background-workers-disk-pressure.test.ts +268 -0
- package/src/__tests__/call-constants.test.ts +10 -1
- package/src/__tests__/call-controller.test.ts +127 -0
- package/src/__tests__/call-conversation-messages.test.ts +8 -2
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +537 -0
- package/src/__tests__/channel-readiness-service.test.ts +4 -2
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +58 -28
- package/src/__tests__/config-loader-backfill.test.ts +379 -0
- package/src/__tests__/config-loader-platform-defaults.test.ts +284 -1
- package/src/__tests__/config-schema.test.ts +1 -0
- package/src/__tests__/config-watcher-cleanup-throttle.test.ts +18 -9
- package/src/__tests__/config-watcher.test.ts +140 -69
- package/src/__tests__/context-search-agent-runner.test.ts +61 -3
- package/src/__tests__/context-search-conversations-source.test.ts +0 -24
- package/src/__tests__/context-search-fanout.test.ts +0 -1
- package/src/__tests__/context-search-memory-source.test.ts +6 -33
- package/src/__tests__/context-search-memory-v2-source.test.ts +0 -2
- package/src/__tests__/context-search-pkb-source.test.ts +12 -7
- package/src/__tests__/context-search-workspace-source.test.ts +0 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +223 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -1
- package/src/__tests__/conversation-agent-loop.test.ts +457 -8
- package/src/__tests__/conversation-confirmation-signals.test.ts +5 -13
- package/src/__tests__/conversation-error.test.ts +150 -3
- package/src/__tests__/conversation-init.benchmark.test.ts +1 -1
- package/src/__tests__/conversation-process-callsite.test.ts +38 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +1 -0
- package/src/__tests__/conversation-runtime-assembly.test.ts +74 -0
- package/src/__tests__/conversation-slash-unknown.test.ts +1 -0
- package/src/__tests__/conversation-speed-override.test.ts +0 -3
- package/src/__tests__/conversation-store.test.ts +0 -18
- package/src/__tests__/conversation-surfaces-action-delivery.test.ts +170 -9
- package/src/__tests__/conversation-surfaces-app-control.test.ts +15 -4
- package/src/__tests__/conversation-surfaces-data-persist.test.ts +476 -0
- package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +61 -5
- package/src/__tests__/conversation-workspace-injection.test.ts +1 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +1 -1
- package/src/__tests__/credentials-cli.test.ts +7 -0
- package/src/__tests__/cu-unified-flow.test.ts +176 -10
- package/src/__tests__/date-context.test.ts +164 -2
- package/src/__tests__/disk-pressure-guard.test.ts +262 -0
- package/src/__tests__/disk-pressure-lifecycle.test.ts +168 -0
- package/src/__tests__/disk-pressure-policy.test.ts +241 -0
- package/src/__tests__/disk-pressure-routes.test.ts +379 -0
- package/src/__tests__/disk-pressure-tools.test.ts +277 -0
- package/src/__tests__/disk-usage.test.ts +150 -0
- package/src/__tests__/events-client-registration.test.ts +52 -0
- package/src/__tests__/events-dev-bypass-actor.test.ts +162 -0
- package/src/__tests__/file-write-tool.test.ts +4 -10
- package/src/__tests__/filing-service.test.ts +2 -20
- package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +10 -26
- package/src/__tests__/heartbeat-disk-pressure.test.ts +183 -0
- package/src/__tests__/heartbeat-service.test.ts +260 -11
- package/src/__tests__/host-app-control-proxy.test.ts +195 -25
- package/src/__tests__/host-bash-proxy.test.ts +227 -34
- package/src/__tests__/host-bash-routes.test.ts +178 -13
- package/src/__tests__/host-cu-proxy.test.ts +210 -3
- package/src/__tests__/host-cu-routes-targeted.test.ts +141 -12
- package/src/__tests__/host-file-proxy-targeted.test.ts +48 -9
- package/src/__tests__/host-file-proxy.test.ts +268 -6
- package/src/__tests__/host-file-routes-targeted.test.ts +175 -17
- package/src/__tests__/host-transfer-proxy-targeted.test.ts +408 -59
- package/src/__tests__/host-transfer-routes-targeted.test.ts +232 -17
- package/src/__tests__/http-user-message-parity.test.ts +107 -1
- package/src/__tests__/injector-chain.test.ts +36 -16
- package/src/__tests__/injector-disk-pressure.test.ts +224 -0
- package/src/__tests__/injector-pkb-v2-silenced.test.ts +10 -7
- package/src/__tests__/lifecycle-memory-v2-seed.test.ts +154 -67
- package/src/__tests__/managed-profile-guard.test.ts +18 -0
- package/src/__tests__/mcp-abort-signal.test.ts +130 -0
- package/src/__tests__/memory-admin-recall.test.ts +3 -11
- package/src/__tests__/memory-retrieval-pipeline.test.ts +22 -1
- package/src/__tests__/normalize-onboarding.test.ts +180 -0
- package/src/__tests__/notification-decision-fallback.test.ts +91 -0
- package/src/__tests__/notification-decision-strategy.test.ts +22 -0
- package/src/__tests__/oauth-cli.test.ts +121 -0
- package/src/__tests__/oauth-connect-routes.test.ts +316 -0
- package/src/__tests__/oauth-provider-seed-logos.test.ts +24 -2
- package/src/__tests__/onboarding-persona-write.test.ts +308 -0
- package/src/__tests__/openai-provider.test.ts +45 -8
- package/src/__tests__/persist-onboarding-artifacts.test.ts +44 -64
- package/src/__tests__/platform-callback-registration.test.ts +21 -4
- package/src/__tests__/platform.test.ts +2 -1
- package/src/__tests__/playbook-execution.test.ts +0 -43
- package/src/__tests__/plugin-tool-contribution.test.ts +47 -0
- package/src/__tests__/prechat-onboarding-contract.test.ts +214 -27
- package/src/__tests__/provider-tool-name.test.ts +23 -0
- package/src/__tests__/relay-server.test.ts +60 -5
- package/src/__tests__/runtime-events-sse.test.ts +4 -8
- package/src/__tests__/scheduler-disk-pressure.test.ts +148 -0
- package/src/__tests__/secret-ingress-http.test.ts +0 -1
- package/src/__tests__/secret-prompt-log-hygiene.test.ts +7 -5
- package/src/__tests__/secret-prompter-channel-fallback.test.ts +7 -5
- package/src/__tests__/secret-response-routing.test.ts +7 -5
- package/src/__tests__/server-history-render.test.ts +82 -0
- package/src/__tests__/skill-include-graph.test.ts +31 -0
- package/src/__tests__/skill-load-tool.test.ts +44 -16
- package/src/__tests__/skills.test.ts +39 -0
- package/src/__tests__/suggestion-routes.test.ts +46 -0
- package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -42
- package/src/__tests__/tool-executor.test.ts +155 -0
- package/src/__tests__/twilio-validation.test.ts +2 -2
- package/src/__tests__/voice-session-bridge.test.ts +3 -0
- package/src/__tests__/workspace-migration-065-bump-stale-heartbeat-interval.test.ts +122 -0
- package/src/__tests__/workspace-migration-066-seed-heartbeat-callsite-cost-default.test.ts +285 -0
- package/src/__tests__/workspace-migration-068-release-notes-local-timezone.test.ts +90 -0
- package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +120 -0
- package/src/__tests__/workspace-migration-071-remove-safe-storage-release-note.test.ts +206 -0
- package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +78 -0
- package/src/agent/loop.ts +11 -0
- package/src/approvals/guardian-request-resolvers.ts +3 -32
- package/src/backup/snapshot-lock.ts +2 -27
- package/src/bundler/compiler-tools.ts +3 -2
- package/src/calls/call-constants.ts +5 -8
- package/src/calls/call-controller.ts +130 -67
- package/src/calls/call-conversation-messages.ts +46 -10
- package/src/calls/relay-server.ts +7 -1
- package/src/calls/voice-session-bridge.ts +1 -1
- package/src/cli/commands/__tests__/webhooks.test.ts +0 -4
- package/src/cli/commands/bash.ts +35 -108
- package/src/cli/commands/contacts.ts +64 -25
- package/src/cli/commands/credentials.ts +56 -0
- package/src/cli/commands/memory-v2.ts +11 -10
- package/src/cli/commands/oauth/__tests__/connect.test.ts +401 -219
- package/src/cli/commands/oauth/connect.ts +124 -40
- package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -3
- package/src/cli/commands/platform/__tests__/connect.test.ts +7 -1
- package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -1
- package/src/cli/commands/platform/__tests__/status.test.ts +103 -6
- package/src/cli/commands/platform/index.ts +16 -7
- package/src/cli/commands/status.ts +57 -0
- package/src/cli/program.ts +4 -2
- package/src/config/assistant-feature-flags.ts +13 -3
- package/src/config/bundled-skills/app-builder/SKILL.md +1 -3
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -3
- package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +13 -7
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +2 -2
- package/src/config/env.ts +0 -8
- package/src/config/feature-flag-registry.json +13 -5
- package/src/config/loader.ts +199 -27
- package/src/config/schemas/__tests__/memory-v2.test.ts +10 -5
- package/src/config/schemas/call-site-catalog.ts +14 -0
- package/src/config/schemas/channels.ts +0 -5
- package/src/config/schemas/heartbeat.ts +1 -1
- package/src/config/schemas/llm.ts +2 -0
- package/src/config/schemas/memory-lifecycle.ts +13 -0
- package/src/config/schemas/memory-v2.ts +76 -12
- package/src/config/schemas/platform.ts +43 -3
- package/src/config/schemas/services.ts +28 -0
- package/src/config/seed-inference-profiles.ts +230 -33
- package/src/contacts/contact-store.ts +0 -25
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +32 -0
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +86 -25
- package/src/daemon/assistant-attachments.ts +4 -4
- package/src/daemon/config-watcher.ts +85 -57
- package/src/daemon/conversation-agent-loop-handlers.ts +38 -0
- package/src/daemon/conversation-agent-loop.ts +183 -43
- package/src/daemon/conversation-error.ts +87 -15
- package/src/daemon/conversation-lifecycle.ts +22 -10
- package/src/daemon/conversation-process.ts +8 -0
- package/src/daemon/conversation-runtime-assembly.ts +26 -0
- package/src/daemon/conversation-store.ts +2 -2
- package/src/daemon/conversation-surfaces.ts +211 -29
- package/src/daemon/conversation-tool-setup.ts +66 -19
- package/src/daemon/conversation.ts +18 -23
- package/src/daemon/date-context.ts +71 -22
- package/src/daemon/disk-pressure-background-gate.ts +73 -0
- package/src/daemon/disk-pressure-guard.ts +343 -0
- package/src/daemon/disk-pressure-policy.ts +163 -0
- package/src/daemon/handlers/shared.ts +26 -1
- package/src/daemon/handlers/skills.ts +3 -4
- package/src/daemon/host-app-control-proxy.ts +137 -41
- package/src/daemon/host-bash-proxy.ts +47 -22
- package/src/daemon/host-browser-proxy.ts +1 -1
- package/src/daemon/host-cu-proxy.ts +50 -4
- package/src/daemon/host-file-proxy.ts +44 -8
- package/src/daemon/host-transfer-proxy.ts +97 -6
- package/src/daemon/lifecycle.ts +167 -101
- package/src/daemon/meet-host-supervisor.ts +4 -4
- package/src/daemon/meet-manifest-loader.ts +0 -1
- package/src/daemon/memory-v2-startup.ts +66 -15
- package/src/daemon/message-protocol.ts +3 -0
- package/src/daemon/message-types/conversations.ts +4 -0
- package/src/daemon/message-types/disk-pressure.ts +9 -0
- package/src/daemon/message-types/messages.ts +22 -1
- package/src/daemon/profiler-run-store.ts +5 -5
- package/src/daemon/tool-setup-types.ts +2 -2
- package/src/documents/document-store.ts +119 -0
- package/src/filing/filing-service.ts +29 -5
- package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +9 -16
- package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +36 -0
- package/src/heartbeat/heartbeat-run-store.ts +13 -0
- package/src/heartbeat/heartbeat-service.ts +205 -31
- package/src/home/feed-scheduler.ts +18 -0
- package/src/inbound/platform-callback-registration.ts +8 -15
- package/src/ipc/__tests__/clients-list-ipc.test.ts +169 -0
- package/src/ipc/assistant-server.ts +149 -38
- package/src/ipc/gateway-client.ts +37 -3
- package/src/ipc/skill-server.ts +99 -42
- package/src/live-voice/live-voice-archive.ts +4 -4
- package/src/live-voice/protocol.ts +5 -7
- package/src/media/image-service.ts +1 -7
- package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +21 -13
- package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +34 -51
- package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -6
- package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +272 -0
- package/src/memory/admin.ts +5 -9
- package/src/memory/context-search/agent-runner.ts +19 -2
- package/src/memory/context-search/sources/conversations.ts +2 -11
- package/src/memory/context-search/sources/memory-v2.ts +1 -16
- package/src/memory/context-search/sources/memory.ts +2 -3
- package/src/memory/context-search/sources/pkb.ts +2 -3
- package/src/memory/context-search/types.ts +0 -1
- package/src/memory/conversation-crud.ts +4 -12
- package/src/memory/db-init.ts +2 -0
- package/src/memory/embedding-runtime-manager.ts +119 -5
- package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +136 -82
- package/src/memory/graph/__tests__/handle-remember-v2.test.ts +11 -26
- package/src/memory/graph/conversation-graph-memory.ts +72 -61
- package/src/memory/graph/extraction.ts +1 -3
- package/src/memory/graph/graph-search.test.ts +11 -67
- package/src/memory/graph/graph-search.ts +4 -24
- package/src/memory/graph/retriever.test.ts +12 -1
- package/src/memory/graph/retriever.ts +10 -15
- package/src/memory/graph/tool-handlers.ts +3 -4
- package/src/memory/graph/tools.ts +4 -4
- package/src/memory/indexer.ts +53 -45
- package/src/memory/job-handlers/backfill.ts +2 -11
- package/src/memory/job-handlers/cleanup.ts +43 -0
- package/src/memory/job-handlers/embedding.ts +6 -8
- package/src/memory/job-handlers/summarization.ts +2 -7
- package/src/memory/jobs/__tests__/embed-concept-page.test.ts +116 -0
- package/src/memory/jobs/embed-concept-page.ts +223 -87
- package/src/memory/jobs-store.ts +48 -0
- package/src/memory/jobs-worker.ts +85 -43
- package/src/memory/memory-v2-activation-log-store.ts +32 -14
- package/src/memory/memory-v2-concept-frequency.ts +169 -0
- package/src/memory/migrations/239-trace-events-created-at-index.ts +18 -0
- package/src/memory/migrations/index.ts +1 -0
- package/src/memory/pkb/pkb-search.test.ts +7 -0
- package/src/memory/pkb/pkb-search.ts +4 -5
- package/src/memory/qdrant-client.ts +3 -13
- package/src/memory/rerank-local.ts +374 -0
- package/src/memory/search/semantic.ts +10 -72
- package/src/memory/trace-event-store.ts +1 -17
- package/src/memory/v2/__tests__/activation.test.ts +346 -255
- package/src/memory/v2/__tests__/consolidation-job.test.ts +61 -40
- package/src/memory/v2/__tests__/injection.test.ts +297 -190
- package/src/memory/v2/__tests__/prompts-consolidation.test.ts +61 -2
- package/src/memory/v2/__tests__/qdrant.test.ts +326 -9
- package/src/memory/v2/__tests__/reranker.test.ts +338 -0
- package/src/memory/v2/__tests__/sim.test.ts +113 -196
- package/src/memory/v2/__tests__/skill-store.test.ts +71 -65
- package/src/memory/v2/__tests__/static-context.test.ts +77 -14
- package/src/memory/v2/__tests__/sweep-job.test.ts +19 -33
- package/src/memory/v2/activation.ts +149 -156
- package/src/memory/v2/consolidation-job.ts +69 -20
- package/src/memory/v2/injection.ts +75 -68
- package/src/memory/v2/page-store.ts +39 -0
- package/src/memory/v2/prompts/consolidation.ts +41 -1
- package/src/memory/v2/qdrant.ts +306 -46
- package/src/memory/v2/reranker.ts +177 -0
- package/src/memory/v2/sim.ts +77 -110
- package/src/memory/v2/skill-content.ts +4 -3
- package/src/memory/v2/skill-store.ts +82 -59
- package/src/memory/v2/static-context.ts +26 -8
- package/src/memory/v2/sweep-job.ts +5 -6
- package/src/memory/v2/types.ts +17 -10
- package/src/notifications/copy-composer.ts +47 -0
- package/src/notifications/decision-engine.ts +46 -0
- package/src/notifications/signal.ts +4 -0
- package/src/oauth/AGENTS.md +3 -1
- package/src/oauth/__tests__/oauth-connect-state.test.ts +137 -0
- package/src/oauth/connect-orchestrator.ts +2 -0
- package/src/oauth/connection-resolver.test.ts +66 -1
- package/src/oauth/connection-resolver.ts +55 -1
- package/src/oauth/oauth-connect-state.ts +77 -0
- package/src/oauth/seed-providers.ts +58 -1
- package/src/permissions/gateway-threshold-reader.ts +116 -8
- package/src/permissions/prompter.ts +86 -96
- package/src/permissions/secret-prompter.ts +31 -31
- package/src/plugins/defaults/injectors.ts +36 -4
- package/src/plugins/defaults/memory-retrieval.ts +5 -6
- package/src/plugins/types.ts +7 -0
- package/src/proactive-artifact/aux-message-injector.ts +74 -0
- package/src/proactive-artifact/decision.test.ts +226 -0
- package/src/proactive-artifact/decision.ts +165 -0
- package/src/proactive-artifact/index.ts +7 -0
- package/src/proactive-artifact/job.test.ts +914 -0
- package/src/proactive-artifact/job.ts +366 -0
- package/src/proactive-artifact/message-copy.ts +58 -0
- package/src/proactive-artifact/trigger-state.test.ts +277 -0
- package/src/proactive-artifact/trigger-state.ts +119 -0
- package/src/prompts/normalize-onboarding.ts +80 -0
- package/src/prompts/persona-resolver.ts +101 -9
- package/src/prompts/system-prompt.ts +21 -7
- package/src/prompts/templates/BOOTSTRAP.md +13 -5
- package/src/prompts/templates/SOUL.md +13 -28
- package/src/providers/__tests__/retry-callsite.test.ts +222 -1
- package/src/providers/model-intents.ts +7 -0
- package/src/providers/openrouter/client.ts +8 -0
- package/src/providers/retry.ts +50 -0
- package/src/providers/types.ts +1 -0
- package/src/runtime/__tests__/agent-wake.test.ts +456 -3
- package/src/runtime/agent-wake.ts +238 -100
- package/src/runtime/assistant-event-hub.ts +36 -6
- package/src/runtime/assistant-event.ts +0 -1
- package/src/runtime/auth/__tests__/route-policy.test.ts +64 -0
- package/src/runtime/auth/route-policy.ts +15 -1
- package/src/runtime/auth/same-actor.ts +216 -0
- package/src/runtime/channel-approvals.ts +3 -2
- package/src/runtime/channel-retry-sweep.ts +65 -1
- package/src/runtime/local-actor-identity.ts +52 -11
- package/src/runtime/pending-interactions.ts +27 -15
- package/src/runtime/routes/__tests__/client-routes.test.ts +155 -0
- package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +0 -5
- package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +1 -1
- package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +147 -0
- package/src/runtime/routes/approval-routes.ts +7 -3
- package/src/runtime/routes/client-routes.ts +20 -2
- package/src/runtime/routes/consolidation-routes.ts +8 -9
- package/src/runtime/routes/contact-routes.ts +0 -25
- package/src/runtime/routes/conversation-query-routes.ts +44 -1
- package/src/runtime/routes/conversation-routes.ts +35 -26
- package/src/runtime/routes/debug-bash-routes.ts +165 -0
- package/src/runtime/routes/disk-pressure-routes.ts +121 -0
- package/src/runtime/routes/document-pdf-renderer.ts +6 -2
- package/src/runtime/routes/documents-routes.ts +2 -75
- package/src/runtime/routes/events-routes.ts +41 -9
- package/src/runtime/routes/filing-routes.ts +2 -3
- package/src/runtime/routes/host-bash-routes.ts +23 -3
- package/src/runtime/routes/host-cu-routes.ts +33 -6
- package/src/runtime/routes/host-file-routes.ts +32 -6
- package/src/runtime/routes/host-transfer-routes.ts +79 -16
- package/src/runtime/routes/identity-routes.ts +7 -138
- package/src/runtime/routes/inbound-message-handler.ts +77 -12
- package/src/runtime/routes/index.ts +6 -0
- package/src/runtime/routes/memory-item-routes.test.ts +37 -17
- package/src/runtime/routes/memory-item-routes.ts +5 -6
- package/src/runtime/routes/memory-v2-routes.ts +136 -17
- package/src/runtime/routes/oauth-connect-routes.ts +153 -0
- package/src/runtime/verification-outbound-actions.ts +4 -4
- package/src/schedule/run-script.ts +37 -5
- package/src/schedule/scheduler.ts +20 -1
- package/src/security/encrypted-store.ts +2 -0
- package/src/security/secure-keys.ts +55 -0
- package/src/skills/include-graph.ts +35 -13
- package/src/skills/remote-skill-policy.ts +4 -10
- package/src/subagent/index.ts +1 -7
- package/src/subagent/manager.ts +1 -15
- package/src/tasks/task-runner.ts +0 -1
- package/src/tasks/task-store.ts +0 -3
- package/src/tools/background-tool-registry.ts +17 -3
- package/src/tools/document/document-tool.ts +20 -0
- package/src/tools/executor.ts +18 -2
- package/src/tools/host-filesystem/edit.test.ts +151 -0
- package/src/tools/host-filesystem/edit.ts +43 -1
- package/src/tools/host-filesystem/read.test.ts +129 -0
- package/src/tools/host-filesystem/read.ts +43 -1
- package/src/tools/host-filesystem/transfer.test.ts +127 -2
- package/src/tools/host-filesystem/transfer.ts +56 -11
- package/src/tools/host-filesystem/write.test.ts +134 -0
- package/src/tools/host-filesystem/write.ts +43 -1
- package/src/tools/host-terminal/host-shell.ts +13 -6
- package/src/tools/mcp/mcp-tool-factory.ts +2 -1
- package/src/tools/memory/register.test.ts +14 -9
- package/src/tools/memory/register.ts +1 -2
- package/src/tools/permission-checker.ts +15 -0
- package/src/tools/provider-tool-name.ts +28 -0
- package/src/tools/registry.ts +30 -9
- package/src/tools/skills/load.ts +24 -20
- package/src/tools/terminal/shell.ts +9 -1
- package/src/tools/tool-approval-handler.ts +31 -6
- package/src/tools/tool-name-aliases.ts +19 -0
- package/src/tools/types.ts +43 -3
- package/src/tts/provider-catalog.ts +3 -5
- package/src/util/disk-usage.ts +138 -0
- package/src/util/platform.ts +21 -11
- package/src/util/process-liveness.ts +26 -0
- package/src/workspace/heartbeat-service.ts +19 -0
- package/src/workspace/migrations/065-bump-stale-heartbeat-interval.ts +60 -0
- package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +146 -0
- package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +14 -0
- package/src/workspace/migrations/068-release-notes-local-timezone.ts +65 -0
- package/src/workspace/migrations/069-seed-onboarding-threads.ts +28 -0
- package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +31 -0
- package/src/workspace/migrations/071-remove-safe-storage-release-note.ts +111 -0
- package/src/workspace/migrations/registry.ts +14 -0
- package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +0 -167
- package/src/memory/v2/__tests__/skill-qdrant.test.ts +0 -657
- package/src/memory/v2/skill-qdrant.ts +0 -404
- package/src/signals/bash.ts +0 -198
|
@@ -391,7 +391,14 @@ describe("RetryProvider — callSite resolution", () => {
|
|
|
391
391
|
|
|
392
392
|
test("propagates temperature when explicitly set in resolved config", async () => {
|
|
393
393
|
setLlmConfig({
|
|
394
|
-
default: {
|
|
394
|
+
default: {
|
|
395
|
+
provider: "anthropic",
|
|
396
|
+
model: "claude-opus-4-7",
|
|
397
|
+
// Thinking defaults to enabled in the schema. Disable here so the
|
|
398
|
+
// thinking/temperature conflict guard doesn't fire — that guard
|
|
399
|
+
// (Anthropic 400 backstop) has dedicated coverage further down.
|
|
400
|
+
thinking: { enabled: false },
|
|
401
|
+
},
|
|
395
402
|
callSites: {
|
|
396
403
|
mainAgent: { temperature: 0.5 },
|
|
397
404
|
},
|
|
@@ -466,6 +473,220 @@ describe("RetryProvider — callSite resolution", () => {
|
|
|
466
473
|
});
|
|
467
474
|
});
|
|
468
475
|
|
|
476
|
+
// ── RetryProvider — Anthropic thinking + temperature conflict guard ─────────
|
|
477
|
+
//
|
|
478
|
+
// Anthropic 400s with "temperature may only be set to 1 when thinking is
|
|
479
|
+
// enabled or in adaptive mode" if a request combines extended thinking with
|
|
480
|
+
// `temperature` ≠ 1. We had three call sites ship with hardcoded
|
|
481
|
+
// per-call temperatures that exploded for Opus 4.x effort=high/xhigh
|
|
482
|
+
// profiles (PR #29560 fixed the call sites). This guard is a backstop: if a
|
|
483
|
+
// future call site reintroduces the same pattern, retry.ts drops the
|
|
484
|
+
// offending temperature instead of letting the request fail at the wire.
|
|
485
|
+
|
|
486
|
+
describe("RetryProvider — thinking/temperature conflict guard", () => {
|
|
487
|
+
test("drops explicit non-1 temperature when thinking is enabled (Anthropic)", async () => {
|
|
488
|
+
setLlmConfig({
|
|
489
|
+
default: {
|
|
490
|
+
provider: "anthropic",
|
|
491
|
+
model: "claude-opus-4-7",
|
|
492
|
+
thinking: { enabled: true, streamThinking: true },
|
|
493
|
+
},
|
|
494
|
+
callSites: { mainAgent: {} },
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
let seen: SendMessageOptions | undefined;
|
|
498
|
+
const wrapped = new RetryProvider(
|
|
499
|
+
makeProvider("anthropic", (options) => {
|
|
500
|
+
seen = options;
|
|
501
|
+
}),
|
|
502
|
+
);
|
|
503
|
+
|
|
504
|
+
await wrapped.sendMessage(DUMMY_MESSAGES, undefined, undefined, {
|
|
505
|
+
// Hardcoded per-call temperature — the pattern that caused the PR
|
|
506
|
+
// #29560 bug class. Without the guard this would forward to Anthropic
|
|
507
|
+
// and 400.
|
|
508
|
+
config: { callSite: "mainAgent", temperature: 0.7 },
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
const config = seen?.config as Record<string, unknown>;
|
|
512
|
+
expect(config.thinking).toEqual({ type: "adaptive" });
|
|
513
|
+
expect(config.temperature).toBeUndefined();
|
|
514
|
+
expect("temperature" in config).toBe(false);
|
|
515
|
+
});
|
|
516
|
+
|
|
517
|
+
test("drops explicit temperature: 0 when thinking is enabled (Anthropic)", async () => {
|
|
518
|
+
// Mirrors the recall-agent / retriever shape: `temperature: 0` for
|
|
519
|
+
// determinism on a thinking-enabled profile. Same 400 risk, same fix.
|
|
520
|
+
setLlmConfig({
|
|
521
|
+
default: {
|
|
522
|
+
provider: "anthropic",
|
|
523
|
+
model: "claude-opus-4-7",
|
|
524
|
+
thinking: { enabled: true, streamThinking: true },
|
|
525
|
+
},
|
|
526
|
+
callSites: { recall: {} },
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
let seen: SendMessageOptions | undefined;
|
|
530
|
+
const wrapped = new RetryProvider(
|
|
531
|
+
makeProvider("anthropic", (options) => {
|
|
532
|
+
seen = options;
|
|
533
|
+
}),
|
|
534
|
+
);
|
|
535
|
+
|
|
536
|
+
await wrapped.sendMessage(DUMMY_MESSAGES, undefined, undefined, {
|
|
537
|
+
config: { callSite: "recall", temperature: 0 },
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
const config = seen?.config as Record<string, unknown>;
|
|
541
|
+
expect(config.thinking).toEqual({ type: "adaptive" });
|
|
542
|
+
expect(config.temperature).toBeUndefined();
|
|
543
|
+
});
|
|
544
|
+
|
|
545
|
+
test("preserves temperature: 1 when thinking is enabled (Anthropic accepts it)", async () => {
|
|
546
|
+
setLlmConfig({
|
|
547
|
+
default: {
|
|
548
|
+
provider: "anthropic",
|
|
549
|
+
model: "claude-opus-4-7",
|
|
550
|
+
thinking: { enabled: true, streamThinking: true },
|
|
551
|
+
},
|
|
552
|
+
callSites: { mainAgent: {} },
|
|
553
|
+
});
|
|
554
|
+
|
|
555
|
+
let seen: SendMessageOptions | undefined;
|
|
556
|
+
const wrapped = new RetryProvider(
|
|
557
|
+
makeProvider("anthropic", (options) => {
|
|
558
|
+
seen = options;
|
|
559
|
+
}),
|
|
560
|
+
);
|
|
561
|
+
|
|
562
|
+
await wrapped.sendMessage(DUMMY_MESSAGES, undefined, undefined, {
|
|
563
|
+
config: { callSite: "mainAgent", temperature: 1 },
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
const config = seen?.config as Record<string, unknown>;
|
|
567
|
+
expect(config.thinking).toEqual({ type: "adaptive" });
|
|
568
|
+
expect(config.temperature).toBe(1);
|
|
569
|
+
});
|
|
570
|
+
|
|
571
|
+
test("preserves explicit temperature when thinking is disabled (Anthropic)", async () => {
|
|
572
|
+
// The bug class only exists when thinking resolves enabled. With
|
|
573
|
+
// thinking disabled, every temperature value is valid — the guard must
|
|
574
|
+
// not fire.
|
|
575
|
+
setLlmConfig({
|
|
576
|
+
default: {
|
|
577
|
+
provider: "anthropic",
|
|
578
|
+
model: "claude-opus-4-7",
|
|
579
|
+
thinking: { enabled: false, streamThinking: false },
|
|
580
|
+
},
|
|
581
|
+
callSites: { mainAgent: {} },
|
|
582
|
+
});
|
|
583
|
+
|
|
584
|
+
let seen: SendMessageOptions | undefined;
|
|
585
|
+
const wrapped = new RetryProvider(
|
|
586
|
+
makeProvider("anthropic", (options) => {
|
|
587
|
+
seen = options;
|
|
588
|
+
}),
|
|
589
|
+
);
|
|
590
|
+
|
|
591
|
+
await wrapped.sendMessage(DUMMY_MESSAGES, undefined, undefined, {
|
|
592
|
+
config: { callSite: "mainAgent", temperature: 0.7 },
|
|
593
|
+
});
|
|
594
|
+
|
|
595
|
+
const config = seen?.config as Record<string, unknown>;
|
|
596
|
+
expect(config.thinking).toEqual({ type: "disabled" });
|
|
597
|
+
expect(config.temperature).toBe(0.7);
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
test("drops temperature for OpenRouter when fronting an `anthropic/*` model", async () => {
|
|
601
|
+
setLlmConfig({
|
|
602
|
+
default: {
|
|
603
|
+
provider: "openrouter",
|
|
604
|
+
model: "anthropic/claude-opus-4-7",
|
|
605
|
+
thinking: { enabled: true, streamThinking: true },
|
|
606
|
+
},
|
|
607
|
+
callSites: { mainAgent: {} },
|
|
608
|
+
});
|
|
609
|
+
|
|
610
|
+
let seen: SendMessageOptions | undefined;
|
|
611
|
+
const wrapped = new RetryProvider(
|
|
612
|
+
makeProvider("openrouter", (options) => {
|
|
613
|
+
seen = options;
|
|
614
|
+
}),
|
|
615
|
+
);
|
|
616
|
+
|
|
617
|
+
await wrapped.sendMessage(DUMMY_MESSAGES, undefined, undefined, {
|
|
618
|
+
config: { callSite: "mainAgent", temperature: 0.7 },
|
|
619
|
+
});
|
|
620
|
+
|
|
621
|
+
const config = seen?.config as Record<string, unknown>;
|
|
622
|
+
expect(config.model).toBe("anthropic/claude-opus-4-7");
|
|
623
|
+
expect(config.temperature).toBeUndefined();
|
|
624
|
+
});
|
|
625
|
+
|
|
626
|
+
test("preserves temperature for OpenRouter when fronting a non-Anthropic reasoning model", async () => {
|
|
627
|
+
// OpenRouter's other reasoning models (xAI Grok, etc.) translate
|
|
628
|
+
// `thinking` into the `reasoning` parameter via `buildExtraCreateParams`
|
|
629
|
+
// and don't share Anthropic's temperature-must-be-1 constraint. The
|
|
630
|
+
// guard must not over-reach.
|
|
631
|
+
setLlmConfig({
|
|
632
|
+
default: {
|
|
633
|
+
provider: "openrouter",
|
|
634
|
+
model: "x-ai/grok-4",
|
|
635
|
+
thinking: { enabled: true, streamThinking: true },
|
|
636
|
+
},
|
|
637
|
+
callSites: { mainAgent: {} },
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
let seen: SendMessageOptions | undefined;
|
|
641
|
+
const wrapped = new RetryProvider(
|
|
642
|
+
makeProvider("openrouter", (options) => {
|
|
643
|
+
seen = options;
|
|
644
|
+
}),
|
|
645
|
+
);
|
|
646
|
+
|
|
647
|
+
await wrapped.sendMessage(DUMMY_MESSAGES, undefined, undefined, {
|
|
648
|
+
config: { callSite: "mainAgent", temperature: 0.7 },
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
const config = seen?.config as Record<string, unknown>;
|
|
652
|
+
expect(config.model).toBe("x-ai/grok-4");
|
|
653
|
+
expect(config.temperature).toBe(0.7);
|
|
654
|
+
});
|
|
655
|
+
|
|
656
|
+
test("guard does not fire when thinking has already been stripped by forced tool_choice", async () => {
|
|
657
|
+
// `retry.ts` strips `thinking` when forced `tool_choice: { type: "tool" }`
|
|
658
|
+
// is set on Anthropic — the guard runs after that step, so by the time
|
|
659
|
+
// we check, `thinking` is gone and the temperature can stay.
|
|
660
|
+
setLlmConfig({
|
|
661
|
+
default: {
|
|
662
|
+
provider: "anthropic",
|
|
663
|
+
model: "claude-opus-4-7",
|
|
664
|
+
thinking: { enabled: true, streamThinking: true },
|
|
665
|
+
},
|
|
666
|
+
callSites: { trustRuleSuggestion: {} },
|
|
667
|
+
});
|
|
668
|
+
|
|
669
|
+
let seen: SendMessageOptions | undefined;
|
|
670
|
+
const wrapped = new RetryProvider(
|
|
671
|
+
makeProvider("anthropic", (options) => {
|
|
672
|
+
seen = options;
|
|
673
|
+
}),
|
|
674
|
+
);
|
|
675
|
+
|
|
676
|
+
await wrapped.sendMessage(DUMMY_MESSAGES, undefined, undefined, {
|
|
677
|
+
config: {
|
|
678
|
+
callSite: "trustRuleSuggestion",
|
|
679
|
+
temperature: 0.7,
|
|
680
|
+
tool_choice: { type: "tool", name: "suggest_trust_rule" },
|
|
681
|
+
},
|
|
682
|
+
});
|
|
683
|
+
|
|
684
|
+
const config = seen?.config as Record<string, unknown>;
|
|
685
|
+
expect(config.thinking).toBeUndefined();
|
|
686
|
+
expect(config.temperature).toBe(0.7);
|
|
687
|
+
});
|
|
688
|
+
});
|
|
689
|
+
|
|
469
690
|
// ── RetryProvider — pre-resolved model fast-path ────────────────────────────
|
|
470
691
|
|
|
471
692
|
describe("RetryProvider — no callSite (pre-resolved config passes through)", () => {
|
|
@@ -11,31 +11,37 @@ const PROVIDER_DEFAULT_MODELS: Record<string, string> = Object.fromEntries(
|
|
|
11
11
|
|
|
12
12
|
const PROVIDER_MODEL_INTENTS: Record<string, Record<ModelIntent, string>> = {
|
|
13
13
|
anthropic: {
|
|
14
|
+
balanced: "claude-sonnet-4-6",
|
|
14
15
|
"latency-optimized": "claude-haiku-4-5-20251001",
|
|
15
16
|
"quality-optimized": "claude-opus-4-7",
|
|
16
17
|
"vision-optimized": "claude-opus-4-6",
|
|
17
18
|
},
|
|
18
19
|
openai: {
|
|
20
|
+
balanced: "gpt-5.4-mini",
|
|
19
21
|
"latency-optimized": "gpt-5.4-nano",
|
|
20
22
|
"quality-optimized": "gpt-5.4",
|
|
21
23
|
"vision-optimized": "gpt-5.4",
|
|
22
24
|
},
|
|
23
25
|
gemini: {
|
|
26
|
+
balanced: "gemini-3-flash-preview",
|
|
24
27
|
"latency-optimized": "gemini-3.1-flash-lite-preview",
|
|
25
28
|
"quality-optimized": "gemini-3.1-pro-preview",
|
|
26
29
|
"vision-optimized": "gemini-3-flash-preview",
|
|
27
30
|
},
|
|
28
31
|
ollama: {
|
|
32
|
+
balanced: "llama3.2",
|
|
29
33
|
"latency-optimized": "llama3.2",
|
|
30
34
|
"quality-optimized": "llama3.2",
|
|
31
35
|
"vision-optimized": "llama3.2",
|
|
32
36
|
},
|
|
33
37
|
fireworks: {
|
|
38
|
+
balanced: "accounts/fireworks/models/kimi-k2p5",
|
|
34
39
|
"latency-optimized": "accounts/fireworks/models/kimi-k2p5",
|
|
35
40
|
"quality-optimized": "accounts/fireworks/models/kimi-k2p5",
|
|
36
41
|
"vision-optimized": "accounts/fireworks/models/kimi-k2p5",
|
|
37
42
|
},
|
|
38
43
|
openrouter: {
|
|
44
|
+
balanced: "anthropic/claude-sonnet-4.6",
|
|
39
45
|
"latency-optimized": "anthropic/claude-haiku-4.5",
|
|
40
46
|
"quality-optimized": "anthropic/claude-opus-4.7",
|
|
41
47
|
"vision-optimized": "anthropic/claude-opus-4.6",
|
|
@@ -45,6 +51,7 @@ const PROVIDER_MODEL_INTENTS: Record<string, Record<ModelIntent, string>> = {
|
|
|
45
51
|
const FALLBACK_DEFAULT_MODEL = "claude-opus-4-7";
|
|
46
52
|
|
|
47
53
|
const MODEL_INTENTS = new Set<ModelIntent>([
|
|
54
|
+
"balanced",
|
|
48
55
|
"latency-optimized",
|
|
49
56
|
"quality-optimized",
|
|
50
57
|
"vision-optimized",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ProviderError } from "../../util/errors.js";
|
|
1
2
|
import { AnthropicProvider } from "../anthropic/client.js";
|
|
2
3
|
import { OpenAIChatCompletionsProvider } from "../openai/chat-completions-provider.js";
|
|
3
4
|
import { isThinkingConfigEnabled } from "../thinking-config.js";
|
|
@@ -139,6 +140,13 @@ export class OpenRouterProvider extends OpenAIChatCompletionsProvider {
|
|
|
139
140
|
cause: error,
|
|
140
141
|
});
|
|
141
142
|
}
|
|
143
|
+
if (error instanceof ProviderError && error.provider !== this.name) {
|
|
144
|
+
throw new ProviderError(error.message, this.name, error.statusCode, {
|
|
145
|
+
cause: error.cause ?? error,
|
|
146
|
+
retryAfterMs: error.retryAfterMs,
|
|
147
|
+
abortReason: error.abortReason,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
142
150
|
throw error;
|
|
143
151
|
}
|
|
144
152
|
}
|
package/src/providers/retry.ts
CHANGED
|
@@ -273,6 +273,56 @@ function normalizeSendMessageOptions(
|
|
|
273
273
|
delete nextConfig.thinking;
|
|
274
274
|
}
|
|
275
275
|
|
|
276
|
+
// Anthropic (and OpenRouter fronting Anthropic) rejects requests that
|
|
277
|
+
// combine extended thinking with `temperature` ≠ 1. From the API:
|
|
278
|
+
// "`temperature` may only be set to 1 when thinking is enabled or in
|
|
279
|
+
// adaptive mode."
|
|
280
|
+
//
|
|
281
|
+
// Defense-in-depth: callers that hardcode a non-default temperature in
|
|
282
|
+
// their per-call config are easy to miss when reviewing — we already had
|
|
283
|
+
// this bug ship in three places (reply suggestions, recall agent
|
|
284
|
+
// round, recall fallback finalize). Drop the offending temperature with
|
|
285
|
+
// a warn log so the request goes through with Anthropic's default
|
|
286
|
+
// (which is 1 in thinking mode anyway). We keep `thinking` rather than
|
|
287
|
+
// `temperature` because thinking is the more deliberate, profile-level
|
|
288
|
+
// choice — silently downgrading reasoning capacity for an unrelated
|
|
289
|
+
// per-call hint would be the worse failure mode.
|
|
290
|
+
//
|
|
291
|
+
// Scope:
|
|
292
|
+
// - Anthropic: always.
|
|
293
|
+
// - OpenRouter fronting `anthropic/*`: same wire constraint applies.
|
|
294
|
+
// - Other providers: not our problem here (e.g. OpenAI reasoning models
|
|
295
|
+
// strip `temperature` upstream; non-Anthropic OpenRouter reasoning
|
|
296
|
+
// models don't have this exact constraint).
|
|
297
|
+
const isThinkingTemperatureConflict = (() => {
|
|
298
|
+
if (nextConfig.thinking == null) return false;
|
|
299
|
+
if (isThinkingConfigDisabled(nextConfig.thinking)) return false;
|
|
300
|
+
const temp = nextConfig.temperature;
|
|
301
|
+
if (typeof temp !== "number") return false;
|
|
302
|
+
if (temp === 1) return false;
|
|
303
|
+
if (providerName === "anthropic") return true;
|
|
304
|
+
if (providerName === "openrouter") {
|
|
305
|
+
const model =
|
|
306
|
+
typeof nextConfig.model === "string" ? nextConfig.model : "";
|
|
307
|
+
return model.startsWith("anthropic/");
|
|
308
|
+
}
|
|
309
|
+
return false;
|
|
310
|
+
})();
|
|
311
|
+
if (isThinkingTemperatureConflict) {
|
|
312
|
+
log.warn(
|
|
313
|
+
{
|
|
314
|
+
providerName,
|
|
315
|
+
callSite: config.callSite,
|
|
316
|
+
droppedTemperature: nextConfig.temperature,
|
|
317
|
+
},
|
|
318
|
+
"Dropping `temperature` because thinking is enabled — Anthropic only " +
|
|
319
|
+
"accepts `temperature: 1` (or unset) when thinking/adaptive mode is " +
|
|
320
|
+
"on. Set `thinking: { type: 'disabled' }` on the call site if you " +
|
|
321
|
+
"need a specific temperature.",
|
|
322
|
+
);
|
|
323
|
+
delete nextConfig.temperature;
|
|
324
|
+
}
|
|
325
|
+
|
|
276
326
|
// effort is supported by Anthropic, OpenAI, and OpenAI-compatible providers; strip for others
|
|
277
327
|
if (
|
|
278
328
|
!EFFORT_SUPPORTED_PROVIDERS.has(providerName) &&
|