@vellumai/assistant 0.9.0 → 0.10.0-dev.202606192226.8ed8a6a
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 +19 -35
- package/bun.lock +7 -8
- package/docs/activation-funnel-telemetry.md +28 -22
- package/docs/architecture/security.md +29 -28
- package/docs/stt-provider-onboarding.md +3 -5
- package/docs/workflows-testing.md +13 -44
- package/docs/workflows.md +3 -5
- package/node_modules/@vellumai/ces-client/src/__tests__/ces-client.test.ts +47 -0
- package/node_modules/@vellumai/ces-client/src/rpc-client.ts +28 -5
- package/node_modules/@vellumai/environments/src/seeds.ts +2 -5
- package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +97 -0
- package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +10 -0
- package/node_modules/@vellumai/gateway-client/src/index.ts +32 -6
- package/node_modules/@vellumai/gateway-client/src/outbound-contract.ts +119 -0
- package/node_modules/@vellumai/gateway-client/src/types.ts +15 -84
- package/openapi.yaml +1128 -119
- package/package.json +2 -1
- package/scripts/sync-llm-catalog.ts +6 -15
- package/scripts/sync-web-search-catalog.ts +3 -11
- package/src/__tests__/access-request-card-view.test.ts +98 -0
- package/src/__tests__/access-request-seed-content-blocks.test.ts +2 -4
- package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +72 -32
- package/src/__tests__/agent-loop-compaction-strip.test.ts +241 -0
- package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +16 -13
- package/src/__tests__/agent-loop-output-hooks.test.ts +69 -0
- package/src/__tests__/agent-loop-override-profile.test.ts +25 -0
- package/src/__tests__/agent-loop-pushes-post-hook-prompt.test.ts +306 -0
- package/src/__tests__/always-loaded-tools-guard.test.ts +2 -3
- package/src/__tests__/app-compiler.test.ts +15 -1
- package/src/__tests__/app-dir-path-guard.test.ts +0 -1
- package/src/__tests__/approval-cascade.test.ts +6 -0
- package/src/__tests__/approval-routes-http.test.ts +128 -0
- package/src/__tests__/assistant-feature-flag-guard.test.ts +1 -4
- package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
- package/src/__tests__/auth-fallback-events-store.test.ts +6 -14
- package/src/__tests__/avatar-identity-sync.test.ts +2 -27
- package/src/__tests__/btw-routes.test.ts +6 -8
- package/src/__tests__/call-pointer-messages.test.ts +28 -0
- package/src/__tests__/cancel-clears-processing.test.ts +89 -0
- package/src/__tests__/channel-approval-routes.test.ts +0 -4
- package/src/__tests__/channel-inbound-disk-pressure.test.ts +5 -15
- package/src/__tests__/checker.test.ts +0 -3
- package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +3 -4
- package/src/__tests__/compaction-events.test.ts +6 -0
- package/src/__tests__/compactor-image-manifest-trust.test.ts +21 -1
- package/src/__tests__/compactor-summary-call-truncation.test.ts +223 -0
- package/src/__tests__/config-loader-backfill.test.ts +268 -27
- package/src/__tests__/config-schema.test.ts +35 -0
- package/src/__tests__/config-watcher.test.ts +0 -18
- package/src/__tests__/confirmation-request-guardian-bridge.test.ts +2 -2
- package/src/__tests__/contact-store-user-file.test.ts +0 -6
- package/src/__tests__/contacts-tools.test.ts +29 -0
- package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
- package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +22 -0
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
- package/src/__tests__/conversation-agent-loop.test.ts +58 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
- package/src/__tests__/conversation-confirmation-signals.test.ts +6 -0
- package/src/__tests__/conversation-lifecycle.test.ts +7 -9
- package/src/__tests__/conversation-load-history-repair.test.ts +101 -0
- package/src/__tests__/conversation-process-callsite.test.ts +6 -0
- package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
- package/src/__tests__/conversation-queue.test.ts +6 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +15 -12
- package/src/__tests__/conversation-slash-queue.test.ts +6 -0
- package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
- package/src/__tests__/conversation-speed-override.test.ts +6 -0
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +6 -3
- package/src/__tests__/conversation-title-service.test.ts +62 -0
- package/src/__tests__/conversation-workspace-cache-state.test.ts +6 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
- package/src/__tests__/credential-broker.test.ts +449 -1
- package/src/__tests__/credential-execution-shell-lockdown.test.ts +18 -11
- package/src/__tests__/credential-execution-tools.test.ts +0 -1
- package/src/__tests__/credential-prompt-route.test.ts +4 -4
- package/src/__tests__/credential-routes.test.ts +360 -0
- package/src/__tests__/credential-security-invariants.test.ts +4 -13
- package/src/__tests__/disk-pressure-policy.test.ts +12 -0
- package/src/__tests__/disk-pressure-tools.test.ts +41 -1
- package/src/__tests__/disk-usage.test.ts +65 -0
- package/src/__tests__/document-tool-security.test.ts +9 -6
- package/src/__tests__/document-update-default-surface.test.ts +202 -0
- package/src/__tests__/dynamic-page-surface.test.ts +152 -1
- package/src/__tests__/fixtures/credential-security-fixtures.ts +2 -33
- package/src/__tests__/gateway-flag-listener.test.ts +110 -1
- package/src/__tests__/gateway-only-guard.test.ts +3 -7
- package/src/__tests__/gemini-count-tokens.test.ts +70 -0
- package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
- package/src/__tests__/guardian-card-withdrawal.test.ts +403 -0
- package/src/__tests__/guardian-decision-primitive-canonical.test.ts +5 -3
- package/src/__tests__/guardian-grant-minting.test.ts +3 -35
- package/src/__tests__/guardian-routing-invariants.test.ts +64 -26
- package/src/__tests__/guardian-routing-state.test.ts +0 -1
- package/src/__tests__/headless-browser-mode.test.ts +10 -0
- package/src/__tests__/headless-browser-navigate.test.ts +8 -3
- package/src/__tests__/helpers/create-guardian-binding.ts +0 -1
- package/src/__tests__/host-browser-proxy.test.ts +87 -0
- package/src/__tests__/identity-routes.test.ts +0 -189
- package/src/__tests__/inbound-invite-redemption.test.ts +4 -4
- package/src/__tests__/injector-disk-pressure.test.ts +10 -5
- package/src/__tests__/injector-v3-suppression.test.ts +27 -20
- package/src/__tests__/internal-telemetry-routes.test.ts +6 -14
- package/src/__tests__/invite-redemption-service.test.ts +4 -7
- package/src/__tests__/llm-callsite-catalog.test.ts +5 -6
- package/src/__tests__/llm-catalog-parity.test.ts +30 -23
- package/src/__tests__/llm-resolver.test.ts +70 -24
- package/src/__tests__/llm-schema.test.ts +1 -0
- package/src/__tests__/managed-profile-guard.test.ts +163 -4
- package/src/__tests__/mcp-health-check.test.ts +6 -7
- package/src/__tests__/media-stream-server-integration.test.ts +317 -13
- package/src/__tests__/oauth-provider-seed-logos.test.ts +4 -6
- package/src/__tests__/onboarding-persona-write.test.ts +1 -1
- package/src/__tests__/path-policy.test.ts +34 -0
- package/src/__tests__/persona-resolver.test.ts +49 -14
- package/src/__tests__/plugin-api-model-profiles.test.ts +178 -0
- package/src/__tests__/plugin-api-provider.test.ts +24 -0
- package/src/__tests__/plugin-tool-contribution.test.ts +6 -3
- package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +214 -0
- package/src/__tests__/provider-send-message-override-profile.test.ts +76 -0
- package/src/__tests__/reaction-persistence.test.ts +150 -29
- package/src/__tests__/registry.test.ts +2 -7
- package/src/__tests__/relay-server.test.ts +285 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
- package/src/__tests__/schedule-routes-workflow-validation.test.ts +1 -10
- package/src/__tests__/schedule-routes.test.ts +0 -30
- package/src/__tests__/schedule-tools.test.ts +2 -18
- package/src/__tests__/scheduler-reuse-conversation.test.ts +8 -5
- package/src/__tests__/secret-response-routing.test.ts +35 -0
- package/src/__tests__/secret-routes-platform-proxy.test.ts +16 -2
- package/src/__tests__/skill-execute-input.test.ts +177 -1
- package/src/__tests__/skill-load-tool.test.ts +72 -0
- package/src/__tests__/skill-runtime-path.test.ts +2 -3
- package/src/__tests__/skills.test.ts +51 -0
- package/src/__tests__/slack-notification-approval-card.test.ts +176 -0
- package/src/__tests__/slack-reaction-canonical-approval.test.ts +285 -0
- package/src/__tests__/subagent-tools.test.ts +266 -0
- package/src/__tests__/surface-completion-nudge-hook.test.ts +367 -0
- package/src/__tests__/system-storage-cleanup-skill.test.ts +56 -0
- package/src/__tests__/task-progress-nudge-hook.test.ts +1 -1
- package/src/__tests__/title-generate-hook.test.ts +100 -3
- package/src/__tests__/token-estimator-accuracy.benchmark.test.ts +1 -29
- package/src/__tests__/token-manager.test.ts +519 -0
- package/src/__tests__/tool-approval-seed-content-blocks.test.ts +1 -1
- package/src/__tests__/tool-audit-listener.test.ts +7 -7
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +6 -3
- package/src/__tests__/tool-executor.test.ts +0 -79
- package/src/__tests__/trusted-contact-approval-notifier.test.ts +4 -2
- package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +220 -3
- package/src/__tests__/trusted-contact-multichannel.test.ts +3 -3
- package/src/__tests__/trusted-contact-verification.test.ts +8 -10
- package/src/__tests__/twilio-routes.test.ts +81 -1
- package/src/__tests__/voice-invite-redemption.test.ts +2 -3
- package/src/__tests__/weak-open-model.test.ts +30 -0
- package/src/__tests__/web-search-catalog-parity.test.ts +6 -25
- package/src/__tests__/workspace-greetings.test.ts +152 -0
- package/src/__tests__/workspace-migration-105-enable-memory-v3-live-for-new-workspaces.test.ts +149 -0
- package/src/__tests__/workspace-migration-108-drop-balanced-economy-profile.test.ts +285 -0
- package/src/__tests__/workspace-migration-add-send-diagnostics.test.ts +1 -1
- package/src/__tests__/workspace-migration-drop-collect-usage-data.test.ts +118 -0
- package/src/__tests__/workspace-migration-drop-send-diagnostics.test.ts +118 -0
- package/src/a2a/__tests__/e2e-a2a-channel.test.ts +0 -4
- package/src/agent/loop.ts +75 -29
- package/src/api/README.md +6 -6
- package/src/api/events/tool-result.ts +6 -0
- package/src/api/events/workflow-completed.ts +53 -0
- package/src/api/events/workflow-leaf-finished.ts +38 -0
- package/src/api/events/workflow-leaf-started.ts +35 -0
- package/src/api/events/workflow-progress.ts +32 -0
- package/src/api/events/workflow-started.ts +31 -0
- package/src/api/index.ts +40 -0
- package/src/api/responses/conversation-message.ts +28 -4
- package/src/api/responses/home.ts +26 -4
- package/src/api/responses/workflow-journal.ts +53 -0
- package/src/approvals/guardian-card-withdrawal.ts +145 -0
- package/src/approvals/guardian-decision-primitive.ts +26 -3
- package/src/approvals/guardian-request-resolvers.ts +183 -80
- package/src/calls/__tests__/channel-admission-reader.test.ts +132 -0
- package/src/calls/__tests__/relay-setup-router.test.ts +350 -0
- package/src/calls/call-pointer-messages.ts +10 -4
- package/src/calls/channel-admission-reader.ts +104 -0
- package/src/calls/guardian-dispatch.ts +17 -45
- package/src/calls/media-stream-server.ts +84 -2
- package/src/calls/relay-access-wait.ts +1 -1
- package/src/calls/relay-server.ts +66 -0
- package/src/calls/relay-setup-router.ts +82 -1
- package/src/calls/twilio-routes.ts +17 -8
- package/src/calls/voice-session-bridge.ts +2 -2
- package/src/cli/commands/clients.ts +3 -0
- package/src/cli/commands/db/status.ts +37 -3
- package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v2-compare-render.test.ts +1 -1
- package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v2.test.ts +8 -7
- package/src/cli/commands/{__tests__ → memory/__tests__}/memory-v3.test.ts +5 -4
- package/src/cli/commands/memory/index.ts +30 -0
- package/src/cli/commands/{memory-v2-compare-render.ts → memory/memory-v2-compare-render.ts} +1 -1
- package/src/cli/commands/{memory-v2.ts → memory/memory-v2.ts} +6 -15
- package/src/cli/commands/{memory-v3.ts → memory/memory-v3.ts} +97 -11
- package/src/cli/commands/oauth/status.test.ts +36 -0
- package/src/cli/commands/oauth/status.ts +23 -3
- package/src/cli/commands/plugins.ts +400 -14
- package/src/cli/lib/__tests__/diff-plugin.test.ts +443 -0
- package/src/cli/lib/__tests__/inspect-plugin.test.ts +54 -0
- package/src/cli/lib/__tests__/install-from-github.test.ts +31 -0
- package/src/cli/lib/__tests__/merge-plugin-tree.test.ts +443 -0
- package/src/cli/lib/__tests__/plugin-pin-history.test.ts +162 -0
- package/src/cli/lib/__tests__/plugin-surfaces.test.ts +111 -0
- package/src/cli/lib/__tests__/upgrade-plugin.test.ts +295 -2
- package/src/cli/lib/diff-plugin.ts +346 -0
- package/src/cli/lib/inspect-plugin.ts +12 -1
- package/src/cli/lib/install-from-github.ts +128 -19
- package/src/cli/lib/merge-plugin-tree.ts +328 -0
- package/src/cli/lib/plugin-fingerprint.ts +14 -0
- package/src/cli/lib/plugin-marketplace.ts +11 -0
- package/src/cli/lib/plugin-pin-history.ts +257 -0
- package/src/cli/lib/plugin-surfaces.ts +104 -0
- package/src/cli/lib/upgrade-plugin.ts +298 -10
- package/src/cli/program.ts +2 -6
- package/src/config/__tests__/sync-gated-profiles.test.ts +368 -0
- package/src/config/assistant-feature-flags.ts +22 -7
- package/src/config/bundled-skills/contacts/tools/contact-search.ts +0 -1
- package/src/config/bundled-skills/document-editor/SKILL.md +3 -3
- package/src/config/bundled-skills/document-editor/TOOLS.json +2 -2
- package/src/config/bundled-skills/messaging/SKILL.md +6 -4
- package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +9 -8
- package/src/config/bundled-skills/subagent/SKILL.md +4 -0
- package/src/config/bundled-skills/subagent/TOOLS.json +4 -0
- package/src/config/bundled-skills/system-storage-cleanup/SKILL.md +74 -0
- package/src/config/bundled-skills/workflows/SKILL.md +14 -8
- package/src/config/bundled-tool-registry.ts +2 -7
- package/src/config/call-site-defaults.ts +15 -2
- package/src/config/feature-flag-registry.json +46 -31
- package/src/config/inference-profile-validation.ts +26 -0
- package/src/config/llm-resolver.ts +3 -0
- package/src/config/loader.ts +4 -0
- package/src/config/memory-v3-gate.ts +11 -0
- package/src/config/profile-order.ts +28 -0
- package/src/config/schema.ts +8 -6
- package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
- package/src/config/schemas/call-site-catalog.ts +7 -0
- package/src/config/schemas/channels.ts +11 -0
- package/src/config/schemas/elevenlabs.ts +0 -1
- package/src/config/schemas/llm.ts +31 -0
- package/src/config/schemas/memory-lifecycle.ts +3 -7
- package/src/config/schemas/memory-v3.ts +6 -0
- package/src/config/schemas/platform.ts +0 -8
- package/src/config/schemas/services.ts +18 -0
- package/src/config/seed-inference-profiles.ts +109 -44
- package/src/config/skills.ts +21 -0
- package/src/config/sync-gated-profiles.ts +220 -0
- package/src/contacts/contact-store.ts +89 -106
- package/src/contacts/contacts-write.ts +5 -22
- package/src/contacts/types.ts +0 -1
- package/src/context/compactor.ts +88 -54
- package/src/context/strip-injections.ts +58 -10
- package/src/context/token-estimator.ts +1 -1
- package/src/credential-execution/process-manager.ts +55 -14
- package/src/credential-execution/prompted-credential.ts +2 -3
- package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +3 -2
- package/src/daemon/__tests__/conversation-tool-setup.test.ts +44 -0
- package/src/daemon/config-watcher.ts +0 -4
- package/src/daemon/conversation-agent-loop-handlers.ts +2 -0
- package/src/daemon/conversation-agent-loop.ts +114 -22
- package/src/daemon/conversation-history.ts +1 -1
- package/src/daemon/conversation-lifecycle.ts +3 -5
- package/src/daemon/conversation-process.ts +13 -5
- package/src/daemon/conversation-runtime-assembly.ts +13 -15
- package/src/daemon/conversation-slash.ts +2 -23
- package/src/daemon/conversation-surfaces.ts +26 -0
- package/src/daemon/conversation-tool-setup.ts +53 -19
- package/src/daemon/conversation.ts +131 -20
- package/src/daemon/disk-pressure-policy.ts +5 -3
- package/src/daemon/handlers/__tests__/config-a2a-complete.test.ts +0 -1
- package/src/daemon/handlers/__tests__/config-a2a-redeem.test.ts +0 -1
- package/src/daemon/handlers/config-a2a.ts +0 -2
- package/src/daemon/handlers/config-channels.ts +15 -16
- package/src/daemon/handlers/config-slack-channel.ts +22 -3
- package/src/daemon/handlers/conversations.ts +107 -0
- package/src/daemon/host-browser-proxy.ts +41 -0
- package/src/daemon/lifecycle.ts +55 -27
- package/src/daemon/memory-v2-startup.test.ts +131 -0
- package/src/daemon/memory-v2-startup.ts +100 -1
- package/src/daemon/message-provenance.ts +2 -0
- package/src/daemon/message-types/contacts.ts +0 -1
- package/src/daemon/message-types/conversations.ts +3 -3
- package/src/daemon/message-types/sync.ts +0 -1
- package/src/daemon/message-types/web-activity.ts +7 -1
- package/src/daemon/message-types/workflows.ts +83 -1
- package/src/daemon/orphan-reaper.test.ts +0 -19
- package/src/daemon/orphan-reaper.ts +2 -24
- package/src/daemon/server.ts +0 -10
- package/src/daemon/tool-setup-types.ts +4 -0
- package/src/daemon/trust-context.ts +1 -1
- package/src/daemon/wake-conversation-ops.ts +1 -0
- package/src/events/tool-audit-listener.ts +2 -2
- package/src/home/feed-source-enrichment.test.ts +151 -0
- package/src/home/feed-source-enrichment.ts +176 -0
- package/src/home/relationship-state.ts +2 -4
- package/src/instrument.ts +18 -6
- package/src/ipc/__tests__/binary-result-ipc.test.ts +81 -0
- package/src/ipc/__tests__/clients-list-ipc.test.ts +20 -0
- package/src/ipc/assistant-server.ts +37 -4
- package/src/ipc/gateway-flag-listener.ts +18 -2
- package/src/memory/__tests__/auto-analysis-enqueue.test.ts +5 -16
- package/src/memory/__tests__/db-logs-attach.test.ts +122 -0
- package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +7 -11
- package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +37 -7
- package/src/memory/__tests__/memory-retrospective-job.test.ts +229 -401
- package/src/memory/__tests__/onboarding-events-store.test.ts +7 -7
- package/src/memory/auth-fallback-events-store.ts +2 -2
- package/src/memory/auto-analysis-enqueue.ts +3 -5
- package/src/memory/bookmark-crud.ts +1 -2
- package/src/memory/canonical-guardian-store.ts +39 -1
- package/src/memory/conversation-crud.ts +9 -4
- package/src/memory/conversation-key-store.ts +17 -2
- package/src/memory/conversation-title-service.ts +64 -7
- package/src/memory/db-async-query.ts +20 -2
- package/src/memory/db-connection.ts +49 -5
- package/src/memory/db-init.ts +17 -17
- package/src/memory/embedding-backend.ts +38 -1
- package/src/memory/embedding-billing-breaker.ts +96 -0
- package/src/memory/jobs-store.ts +25 -13
- package/src/memory/jobs-worker.ts +54 -1
- package/src/memory/lifecycle-events-store.ts +2 -2
- package/src/memory/memory-retrospective-constants.ts +4 -4
- package/src/memory/memory-retrospective-enqueue.ts +31 -6
- package/src/memory/memory-retrospective-job.ts +28 -227
- package/src/memory/migrations/129-contact-channels-access-fields.ts +18 -9
- package/src/memory/migrations/131-drop-legacy-member-guardian-tables.ts +14 -2
- package/src/memory/migrations/289-contact-channels-unique-ext-user.ts +10 -0
- package/src/memory/migrations/291-contact-channels-renormalize-addresses.ts +72 -0
- package/src/memory/migrations/292-schedule-default-no-reuse-conversation.test.ts +67 -0
- package/src/memory/migrations/292-schedule-default-no-reuse-conversation.ts +25 -0
- package/src/memory/migrations/293-workflow-journal-leaf-tokens.ts +32 -0
- package/src/memory/migrations/294-drop-external-user-id.ts +31 -0
- package/src/memory/migrations/295-drop-approval-prompt-ts-tracker.ts +20 -0
- package/src/memory/migrations/296-rewrite-balanced-economy-profile-pins.test.ts +110 -0
- package/src/memory/migrations/296-rewrite-balanced-economy-profile-pins.ts +68 -0
- package/src/memory/migrations/__tests__/131-drop-legacy-member-guardian-tables.test.ts +154 -0
- package/src/memory/migrations/__tests__/289-contact-channels-unique-ext-user.test.ts +31 -0
- package/src/memory/migrations/__tests__/291-contact-channels-renormalize-addresses.test.ts +341 -0
- package/src/memory/migrations/__tests__/run-migrations.test.ts +52 -0
- package/src/memory/migrations/index.ts +6 -0
- package/src/memory/migrations/run-migrations.ts +41 -0
- package/src/memory/migrations/validate-migration-state.ts +1 -1
- package/src/memory/onboarding-events-store.ts +3 -3
- package/src/memory/schema/contacts.ts +0 -5
- package/src/memory/skill-loaded-events-store.test.ts +7 -15
- package/src/memory/skill-loaded-events-store.ts +2 -2
- package/src/memory/tool-executed-events-store.test.ts +7 -7
- package/src/memory/turn-trace-store.test.ts +736 -0
- package/src/memory/turn-trace-store.ts +364 -0
- package/src/memory/v2/__tests__/consolidation-job.test.ts +8 -0
- package/src/memory/v2/__tests__/skill-content.test.ts +30 -0
- package/src/memory/v2/consolidation-job.ts +2 -2
- package/src/memory/v2/skill-content.ts +25 -7
- package/src/memory/v2/skill-store.ts +7 -1
- package/src/memory/v3-eval/__tests__/eval-packets.test.ts +248 -0
- package/src/memory/v3-eval/eval-packets.ts +546 -0
- package/src/messaging/providers/slack/adapter.ts +1 -1
- package/src/messaging/providers/slack/api.ts +31 -0
- package/src/messaging/providers/slack/send.test.ts +114 -2
- package/src/messaging/providers/slack/send.ts +30 -7
- package/src/messaging/providers/slack/withdraw.test.ts +200 -0
- package/src/messaging/providers/slack/withdraw.ts +161 -0
- package/src/notifications/AGENTS.md +2 -0
- package/src/notifications/access-request-copy.ts +72 -59
- package/src/notifications/adapters/shared.ts +29 -0
- package/src/notifications/adapters/slack.ts +58 -103
- package/src/notifications/adapters/telegram.ts +2 -20
- package/src/notifications/approval-card-data.ts +333 -0
- package/src/notifications/broadcaster.ts +16 -3
- package/src/notifications/canonical-delivery-recorder.ts +139 -0
- package/src/notifications/copy-composer.ts +3 -3
- package/src/notifications/decision-engine.ts +4 -2
- package/src/notifications/destination-resolver.ts +4 -6
- package/src/notifications/guardian-question-mode.ts +10 -0
- package/src/notifications/home-feed-side-effect.ts +7 -16
- package/src/notifications/notification-utils.ts +19 -20
- package/src/notifications/signal.ts +79 -43
- package/src/notifications/types.ts +98 -121
- package/src/oauth/AGENTS.md +5 -24
- package/src/permissions/checker.test.ts +51 -0
- package/src/permissions/checker.ts +185 -26
- package/src/permissions/ipc-risk-types.ts +24 -0
- package/src/permissions/question-prompter.test.ts +27 -0
- package/src/permissions/question-prompter.ts +4 -0
- package/src/permissions/secret-prompter.ts +15 -1
- package/src/platform/client.test.ts +119 -0
- package/src/platform/client.ts +66 -0
- package/src/platform/consent-cache.test.ts +267 -0
- package/src/platform/consent-cache.ts +174 -0
- package/src/plugin-api/constants.ts +1 -1
- package/src/plugin-api/index.ts +33 -1
- package/src/plugin-api/model-profiles.ts +33 -0
- package/src/plugin-api/types.ts +50 -2
- package/src/plugins/defaults/advisor/__tests__/advisor-gate.test.ts +56 -0
- package/src/plugins/defaults/advisor/__tests__/advisor-state-store.test.ts +43 -0
- package/src/plugins/defaults/advisor/__tests__/agent-loop-integration.test.ts +137 -0
- package/src/plugins/defaults/advisor/__tests__/consult.test.ts +153 -0
- package/src/plugins/defaults/advisor/__tests__/hooks.test.ts +138 -0
- package/src/plugins/defaults/advisor/__tests__/transcript.test.ts +147 -0
- package/src/plugins/defaults/advisor/advisor-gate.ts +29 -0
- package/src/plugins/defaults/advisor/advisor-state-store.ts +94 -0
- package/src/plugins/defaults/advisor/config.ts +21 -0
- package/src/plugins/defaults/advisor/consult.ts +93 -0
- package/src/plugins/defaults/advisor/hooks/post-model-call.ts +34 -0
- package/src/plugins/defaults/advisor/hooks/pre-model-call.ts +30 -0
- package/src/plugins/defaults/advisor/hooks/user-prompt-submit.ts +19 -0
- package/src/plugins/defaults/advisor/package.json +14 -0
- package/src/plugins/defaults/advisor/steering.ts +67 -0
- package/src/plugins/defaults/advisor/tools/advisor.ts +65 -0
- package/src/plugins/defaults/advisor/transcript.ts +76 -0
- package/src/plugins/defaults/compaction/window-manager.ts +18 -0
- package/src/plugins/defaults/index.ts +60 -0
- package/src/plugins/defaults/memory-retrieval/hooks/post-compact.ts +22 -9
- package/src/plugins/defaults/memory-retrieval/hooks/user-prompt-submit.ts +2 -2
- package/src/plugins/defaults/memory-retrieval/injectors.ts +4 -4
- package/src/plugins/defaults/memory-retrieval/tail-reinjection-strip.ts +64 -0
- package/src/plugins/defaults/memory-retrieval/unified-turn-context.ts +29 -21
- package/src/plugins/defaults/memory-v3-shadow/__tests__/carry-integration.test.ts +1 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/injection.test.ts +1 -0
- package/src/plugins/defaults/memory-v3-shadow/__tests__/maintain-job.test.ts +129 -9
- package/src/plugins/defaults/memory-v3-shadow/__tests__/orchestrate.test.ts +31 -4
- package/src/plugins/defaults/memory-v3-shadow/__tests__/selection-log-store.test.ts +77 -2
- package/src/plugins/defaults/memory-v3-shadow/__tests__/shadow-plugin.test.ts +1 -0
- package/src/plugins/defaults/memory-v3-shadow/injector.ts +7 -10
- package/src/plugins/defaults/memory-v3-shadow/maintain-job.ts +144 -11
- package/src/plugins/defaults/memory-v3-shadow/orchestrate.ts +32 -20
- package/src/plugins/defaults/memory-v3-shadow/selection-log-store.ts +56 -3
- package/src/plugins/defaults/memory-v3-shadow/shadow-plugin.ts +23 -2
- package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +276 -0
- package/src/plugins/defaults/surface-completion-nudge/hooks/stop.ts +22 -0
- package/src/plugins/defaults/surface-completion-nudge/nudge-state-store.ts +46 -0
- package/src/plugins/defaults/surface-completion-nudge/package.json +14 -0
- package/src/plugins/defaults/task-progress-nudge/hooks/post-tool-use.ts +3 -13
- package/src/plugins/defaults/title-generate/hooks/stop.ts +56 -21
- package/src/prompts/persona-resolver.ts +14 -4
- package/src/prompts/templates/system-sections.ts +7 -2
- package/src/providers/__tests__/count-tokens-forwarding.test.ts +98 -0
- package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
- package/src/providers/__tests__/provider-secret-catalog.test.ts +1 -0
- package/src/providers/__tests__/retry-callsite.test.ts +176 -0
- package/src/providers/anthropic/client.ts +230 -175
- package/src/providers/atlascloud/client.ts +85 -0
- package/src/providers/call-site-routing.ts +10 -0
- package/src/providers/fetch-provider-catalog.ts +85 -0
- package/src/providers/gemini/client.ts +43 -0
- package/src/providers/inference/adapter-factory.ts +3 -0
- package/src/providers/model-catalog.ts +58 -0
- package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +33 -0
- package/src/providers/openai/chat-completions-provider.ts +7 -0
- package/src/providers/openai/responses-provider.ts +10 -0
- package/src/providers/provider-send-message.ts +11 -3
- package/src/providers/ratelimit.ts +9 -0
- package/src/providers/retry.ts +62 -12
- package/src/providers/search-provider-catalog.ts +10 -0
- package/src/providers/types.ts +16 -0
- package/src/providers/usage-tracking.ts +7 -0
- package/src/providers/weak-open-model.ts +22 -0
- package/src/runtime/AGENTS.md +0 -1
- package/src/runtime/__tests__/agent-wake.test.ts +227 -0
- package/src/runtime/__tests__/client-health.test.ts +44 -0
- package/src/runtime/access-request-helper.ts +21 -53
- package/src/runtime/actor-trust-resolver.ts +59 -63
- package/src/runtime/agent-wake.ts +71 -0
- package/src/runtime/assistant-event-hub.ts +18 -4
- package/src/runtime/auth/__tests__/route-policy.test.ts +12 -0
- package/src/runtime/auth/require-bound-guardian.ts +1 -4
- package/src/runtime/btw-sidechain.ts +3 -6
- package/src/runtime/capabilities.test.ts +120 -0
- package/src/runtime/capabilities.ts +197 -0
- package/src/runtime/channel-approval-types.ts +22 -45
- package/src/runtime/channel-invite-transports/telegram.ts +4 -4
- package/src/runtime/channel-retry-sweep.ts +1 -0
- package/src/runtime/channel-verification-service.ts +3 -3
- package/src/runtime/client-health.ts +26 -0
- package/src/runtime/confirmation-request-guardian-bridge.ts +38 -29
- package/src/runtime/effective-capabilities.test.ts +128 -0
- package/src/runtime/effective-capabilities.ts +84 -0
- package/src/runtime/guardian-reply-router.ts +106 -21
- package/src/runtime/invite-redemption-service.ts +9 -25
- package/src/runtime/migrations/__tests__/vbundle-builder-fd-leak.test.ts +126 -0
- package/src/runtime/migrations/vbundle-builder.ts +49 -20
- package/src/runtime/pending-interactions.ts +35 -0
- package/src/runtime/routes/__tests__/client-routes.test.ts +13 -0
- package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +67 -0
- package/src/runtime/routes/__tests__/plugins-routes.test.ts +383 -1
- package/src/runtime/routes/app-routes.ts +1 -1
- package/src/runtime/routes/approval-routes.ts +40 -9
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +2 -2
- package/src/runtime/routes/assets/vellum-design-system.css +1959 -0
- package/src/runtime/routes/browser-tabs-routes.ts +9 -0
- package/src/runtime/routes/btw-routes.ts +1 -27
- package/src/runtime/routes/canonical-guardian-expiry-sweep.ts +17 -8
- package/src/runtime/routes/client-routes.ts +10 -0
- package/src/runtime/routes/contact-routes.ts +31 -8
- package/src/runtime/routes/conversation-compaction-routes.ts +1 -1
- package/src/runtime/routes/conversation-management-routes.ts +80 -1
- package/src/runtime/routes/conversation-query-routes.ts +68 -22
- package/src/runtime/routes/conversation-routes.ts +39 -14
- package/src/runtime/routes/credential-routes.ts +40 -16
- package/src/runtime/routes/empty-state-greeting-cache.ts +1 -2
- package/src/runtime/routes/events-routes.ts +1 -3
- package/src/runtime/routes/guardian-approval-interception.ts +14 -73
- package/src/runtime/routes/guardian-approval-prompt.ts +22 -4
- package/src/runtime/routes/home-feed-routes.ts +8 -3
- package/src/runtime/routes/identity-routes.ts +1 -296
- package/src/runtime/routes/inbound-message-handler.ts +214 -228
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +89 -7
- package/src/runtime/routes/inbound-stages/admission-policy.test.ts +154 -0
- package/src/runtime/routes/inbound-stages/admission-policy.ts +140 -0
- package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +3 -3
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +11 -6
- package/src/runtime/routes/inbound-stages/escalation-intercept.ts +1 -2
- package/src/runtime/routes/inbound-stages/guardian-activation-intercept.ts +1 -2
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +7 -7
- package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +47 -28
- package/src/runtime/routes/inbound-stages/reaction-intercept.ts +358 -0
- package/src/runtime/routes/index.ts +2 -0
- package/src/runtime/routes/integrations/slack/__tests__/channel.test.ts +8 -0
- package/src/runtime/routes/integrations/slack/channel.ts +36 -0
- package/src/runtime/routes/internal-telemetry-routes.ts +1 -1
- package/src/runtime/routes/mcp-auth-routes.ts +233 -41
- package/src/runtime/routes/memory-eval-routes.ts +87 -0
- package/src/runtime/routes/notification-routes.ts +122 -133
- package/src/runtime/routes/platform-routes.ts +2 -2
- package/src/runtime/routes/plugins-routes.ts +366 -11
- package/src/runtime/routes/schedule-routes.ts +0 -22
- package/src/runtime/routes/secret-routes.ts +15 -0
- package/src/runtime/routes/surface-action-routes.ts +2 -1
- package/src/runtime/routes/tool-call-question-enrichment.test.ts +146 -0
- package/src/runtime/routes/tool-call-question-enrichment.ts +66 -0
- package/src/runtime/routes/workflow-routes.test.ts +229 -44
- package/src/runtime/routes/workflow-routes.ts +131 -29
- package/src/runtime/routes/workspace-greetings.ts +55 -0
- package/src/runtime/sync/resource-sync-events.ts +1 -11
- package/src/runtime/tool-grant-request-helper.ts +18 -16
- package/src/runtime/trust-context-resolver.ts +8 -5
- package/src/schedule/inference-profile.ts +2 -14
- package/src/schedule/schedule-store.ts +1 -1
- package/src/schedule/scheduler-types.ts +5 -1
- package/src/security/__tests__/provider-key-env-fallback.test.ts +6 -0
- package/src/security/secret-patterns.ts +3 -0
- package/src/subagent/manager.ts +17 -4
- package/src/subagent/types.ts +6 -0
- package/src/telemetry/trace-collection-policy.test.ts +28 -0
- package/src/telemetry/trace-collection-policy.ts +30 -0
- package/src/telemetry/types.ts +89 -0
- package/src/telemetry/usage-telemetry-reporter.test.ts +586 -36
- package/src/telemetry/usage-telemetry-reporter.ts +148 -41
- package/src/tools/AGENTS.md +3 -3
- package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +31 -0
- package/src/tools/browser/browser-execution.ts +30 -19
- package/src/tools/document/document-tool.ts +30 -6
- package/src/tools/executor.ts +5 -3
- package/src/tools/host-terminal/host-shell.ts +5 -4
- package/src/tools/memory/register.ts +2 -2
- package/src/tools/network/__tests__/web-fetch-firecrawl.test.ts +360 -0
- package/src/tools/network/__tests__/web-search.test.ts +143 -0
- package/src/tools/network/web-fetch.ts +372 -1
- package/src/tools/network/web-search-error.ts +1 -1
- package/src/tools/network/web-search.ts +213 -10
- package/src/tools/permission-checker.ts +4 -3
- package/src/tools/registry.ts +20 -0
- package/src/tools/schedule/create.ts +7 -12
- package/src/tools/schedule/update.ts +4 -11
- package/src/tools/shared/filesystem/path-policy.ts +39 -13
- package/src/tools/side-effects.ts +2 -17
- package/src/tools/skills/execute.ts +99 -2
- package/src/tools/skills/load.ts +43 -2
- package/src/tools/subagent/spawn.ts +64 -15
- package/src/tools/terminal/shell.ts +10 -4
- package/src/tools/tool-approval-handler.ts +18 -13
- package/src/tools/tool-manifest.ts +0 -2
- package/src/tools/types.ts +10 -0
- package/src/tools/ui-surface/definitions.ts +64 -3
- package/src/tools/verification-control-plane-policy.ts +3 -1
- package/src/tools/workflows/run-workflow.test.ts +8 -18
- package/src/tools/workflows/run-workflow.ts +1 -0
- package/src/util/disk-usage.ts +78 -23
- package/src/util/logs-db-path.ts +22 -0
- package/src/util/platform.ts +10 -3
- package/src/watcher/telemetry.ts +2 -2
- package/src/workflows/capabilities.ts +2 -3
- package/src/workflows/engine.test.ts +175 -1
- package/src/workflows/engine.ts +82 -0
- package/src/workflows/journal-store.test.ts +70 -0
- package/src/workflows/journal-store.ts +18 -3
- package/src/workflows/run-manager.test.ts +171 -28
- package/src/workflows/run-manager.ts +66 -24
- package/src/workspace/migrations/105-enable-memory-v3-live-for-new-workspaces.ts +63 -0
- package/src/workspace/migrations/106-drop-collect-usage-data.ts +47 -0
- package/src/workspace/migrations/107-drop-send-diagnostics.ts +47 -0
- package/src/workspace/migrations/108-drop-balanced-economy-profile.ts +129 -0
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/__tests__/app-control-no-global-cgevent.test.ts +0 -98
- package/src/__tests__/credential-security-e2e.test.ts +0 -362
- package/src/__tests__/credential-vault-unit.test.ts +0 -1528
- package/src/__tests__/credential-vault.test.ts +0 -1706
- package/src/__tests__/identity-intro-cache.test.ts +0 -315
- package/src/__tests__/secret-onetime-send.test.ts +0 -182
- package/src/cli/commands/__tests__/task.test.ts +0 -914
- package/src/cli/commands/task.ts +0 -771
- package/src/config/bundled-skills/personal-page/SKILL.md +0 -57
- package/src/config/bundled-skills/personal-page/TOOLS.json +0 -27
- package/src/config/bundled-skills/personal-page/tools/app-refresh.ts +0 -17
- package/src/config/preloaded-apps/personal-page/src/components/About.tsx +0 -22
- package/src/config/preloaded-apps/personal-page/src/components/App.tsx +0 -16
- package/src/config/preloaded-apps/personal-page/src/components/Features.tsx +0 -77
- package/src/config/preloaded-apps/personal-page/src/components/Hero.tsx +0 -57
- package/src/config/preloaded-apps/personal-page/src/components/Pending.tsx +0 -28
- package/src/config/preloaded-apps/personal-page/src/components/animations.tsx +0 -234
- package/src/config/preloaded-apps/personal-page/src/components/icons.tsx +0 -48
- package/src/config/preloaded-apps/personal-page/src/components/media.ts +0 -16
- package/src/config/preloaded-apps/personal-page/src/index.html +0 -20
- package/src/config/preloaded-apps/personal-page/src/main.tsx +0 -7
- package/src/config/preloaded-apps/personal-page/src/profile-data.ts +0 -82
- package/src/config/preloaded-apps/personal-page/src/styles.css +0 -759
- package/src/memory/__tests__/preloaded-apps.test.ts +0 -85
- package/src/memory/preloaded-apps.ts +0 -116
- package/src/notifications/tool-approval-copy.ts +0 -142
- package/src/runtime/routes/approval-prompt-ts-tracker.ts +0 -78
- package/src/runtime/routes/identity-intro-cache.ts +0 -172
- package/src/tools/credentials/vault.ts +0 -712
|
@@ -677,6 +677,23 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
677
677
|
cacheReadPer1mTokens: 0.16,
|
|
678
678
|
},
|
|
679
679
|
},
|
|
680
|
+
{
|
|
681
|
+
id: "accounts/fireworks/models/glm-5p2",
|
|
682
|
+
displayName: "GLM 5.2",
|
|
683
|
+
// Fireworks serves GLM 5.2 with a 1,040K input window.
|
|
684
|
+
contextWindowTokens: 1040000,
|
|
685
|
+
maxOutputTokens: 131072,
|
|
686
|
+
supportsThinking: true,
|
|
687
|
+
supportsCaching: true,
|
|
688
|
+
supportsVision: false,
|
|
689
|
+
supportsToolUse: true,
|
|
690
|
+
maxEffort: "max",
|
|
691
|
+
pricing: {
|
|
692
|
+
inputPer1mTokens: 1.4,
|
|
693
|
+
outputPer1mTokens: 4.4,
|
|
694
|
+
cacheReadPer1mTokens: 0.26,
|
|
695
|
+
},
|
|
696
|
+
},
|
|
680
697
|
{
|
|
681
698
|
id: "accounts/fireworks/models/kimi-k2p5",
|
|
682
699
|
displayName: "Kimi K2.5",
|
|
@@ -1148,6 +1165,18 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
1148
1165
|
supportsToolUse: false,
|
|
1149
1166
|
pricing: { inputPer1mTokens: 0.2, outputPer1mTokens: 1.1 },
|
|
1150
1167
|
},
|
|
1168
|
+
// Z.ai
|
|
1169
|
+
{
|
|
1170
|
+
id: "z-ai/glm-5.2",
|
|
1171
|
+
displayName: "GLM-5.2",
|
|
1172
|
+
contextWindowTokens: 1048576,
|
|
1173
|
+
maxOutputTokens: 131072,
|
|
1174
|
+
supportsThinking: true,
|
|
1175
|
+
supportsCaching: false,
|
|
1176
|
+
supportsVision: false,
|
|
1177
|
+
supportsToolUse: true,
|
|
1178
|
+
pricing: { inputPer1mTokens: 1.4, outputPer1mTokens: 4.4 },
|
|
1179
|
+
},
|
|
1151
1180
|
// Mistral
|
|
1152
1181
|
{
|
|
1153
1182
|
id: "mistralai/mistral-medium-3",
|
|
@@ -1284,6 +1313,35 @@ const RAW_PROVIDER_CATALOG: ProviderCatalogEntry[] = [
|
|
|
1284
1313
|
apiKeyUrl: "https://platform.minimax.io/",
|
|
1285
1314
|
apiKeyPlaceholder: "sk-cp-...",
|
|
1286
1315
|
},
|
|
1316
|
+
{
|
|
1317
|
+
id: "atlascloud",
|
|
1318
|
+
displayName: "Atlas Cloud",
|
|
1319
|
+
subtitle:
|
|
1320
|
+
"Atlas Cloud AI models (OpenAI-compatible). Requires an Atlas Cloud API key.",
|
|
1321
|
+
setupMode: "api-key",
|
|
1322
|
+
setupHint: "Enter your Atlas Cloud API key to enable Atlas Cloud models.",
|
|
1323
|
+
envVar: "ATLASCLOUD_API_KEY",
|
|
1324
|
+
credentialsGuide: {
|
|
1325
|
+
description: "Sign in to the Atlas Cloud console and create an API key.",
|
|
1326
|
+
url: "https://www.atlascloud.ai/console",
|
|
1327
|
+
linkLabel: "Open Atlas Cloud Console",
|
|
1328
|
+
},
|
|
1329
|
+
models: [
|
|
1330
|
+
{
|
|
1331
|
+
id: "deepseek-ai/deepseek-v4-pro",
|
|
1332
|
+
displayName: "DeepSeek V4 Pro",
|
|
1333
|
+
contextWindowTokens: 128000,
|
|
1334
|
+
maxOutputTokens: 8192,
|
|
1335
|
+
supportsThinking: true,
|
|
1336
|
+
supportsCaching: false,
|
|
1337
|
+
supportsVision: false,
|
|
1338
|
+
supportsToolUse: true,
|
|
1339
|
+
},
|
|
1340
|
+
],
|
|
1341
|
+
defaultModel: "deepseek-ai/deepseek-v4-pro",
|
|
1342
|
+
apiKeyUrl: "https://www.atlascloud.ai/console",
|
|
1343
|
+
apiKeyPlaceholder: "apikey-...",
|
|
1344
|
+
},
|
|
1287
1345
|
];
|
|
1288
1346
|
|
|
1289
1347
|
export const PROVIDER_CATALOG: ProviderCatalogEntry[] =
|
|
@@ -460,6 +460,39 @@ describe("OpenAIChatCompletionsProvider reasoning parsing", () => {
|
|
|
460
460
|
expect(params.messages[0].content).toBeNull();
|
|
461
461
|
});
|
|
462
462
|
|
|
463
|
+
test("forwards config.top_p onto the request body", async () => {
|
|
464
|
+
const { provider, requests } = stubProvider([
|
|
465
|
+
{
|
|
466
|
+
choices: [{ delta: { content: "ok" }, finish_reason: "stop" }],
|
|
467
|
+
usage: { prompt_tokens: 2, completion_tokens: 1 },
|
|
468
|
+
},
|
|
469
|
+
]);
|
|
470
|
+
|
|
471
|
+
await provider.sendMessage(
|
|
472
|
+
[{ role: "user", content: [{ type: "text", text: "hi" }] }],
|
|
473
|
+
{ config: { top_p: 0.95 } },
|
|
474
|
+
);
|
|
475
|
+
|
|
476
|
+
const params = requests[0] as { top_p?: number };
|
|
477
|
+
expect(params.top_p).toBe(0.95);
|
|
478
|
+
});
|
|
479
|
+
|
|
480
|
+
test("omits top_p from the request body when not configured", async () => {
|
|
481
|
+
const { provider, requests } = stubProvider([
|
|
482
|
+
{
|
|
483
|
+
choices: [{ delta: { content: "ok" }, finish_reason: "stop" }],
|
|
484
|
+
usage: { prompt_tokens: 2, completion_tokens: 1 },
|
|
485
|
+
},
|
|
486
|
+
]);
|
|
487
|
+
|
|
488
|
+
await provider.sendMessage([
|
|
489
|
+
{ role: "user", content: [{ type: "text", text: "hi" }] },
|
|
490
|
+
]);
|
|
491
|
+
|
|
492
|
+
const params = requests[0] as { top_p?: number };
|
|
493
|
+
expect(params.top_p).toBeUndefined();
|
|
494
|
+
});
|
|
495
|
+
|
|
463
496
|
test("skips Anthropic-originated thinking blocks (with signatures)", async () => {
|
|
464
497
|
const { provider, requests } = stubProvider(
|
|
465
498
|
[
|
|
@@ -367,6 +367,7 @@ export class OpenAIChatCompletionsProvider implements Provider {
|
|
|
367
367
|
const logitBias = configObj?.logit_bias as
|
|
368
368
|
| Record<string, number>
|
|
369
369
|
| undefined;
|
|
370
|
+
const topP = configObj?.top_p as number | undefined;
|
|
370
371
|
const usageAttributionHeaders = configObj?.usageAttributionHeaders as
|
|
371
372
|
| Record<string, string>
|
|
372
373
|
| undefined;
|
|
@@ -398,6 +399,12 @@ export class OpenAIChatCompletionsProvider implements Provider {
|
|
|
398
399
|
params.logit_bias = logitBias;
|
|
399
400
|
}
|
|
400
401
|
|
|
402
|
+
// `top_p` (nucleus sampling). Forwarded explicitly because this client
|
|
403
|
+
// builds `params` field-by-field rather than spreading the config object.
|
|
404
|
+
if (typeof topP === "number") {
|
|
405
|
+
params.top_p = topP;
|
|
406
|
+
}
|
|
407
|
+
|
|
401
408
|
// Subclasses (OpenRouter) may already have nested effort under
|
|
402
409
|
// `reasoning.effort` via `buildExtraCreateParams`. Skip the flat
|
|
403
410
|
// `reasoning_effort` assignment in that case to avoid sending both forms,
|
|
@@ -243,6 +243,16 @@ export class OpenAIResponsesProvider implements Provider {
|
|
|
243
243
|
params.text = { verbosity };
|
|
244
244
|
}
|
|
245
245
|
|
|
246
|
+
// Sampling params (`top_p`/`temperature`) are intentionally NOT forwarded
|
|
247
|
+
// on the Responses path. OpenAI reasoning models (o-series, GPT-5
|
|
248
|
+
// reasoning) reject them with HTTP 400 when reasoning is active, and the
|
|
249
|
+
// resolved `effort` defaults to a reasoning effort, so `reasoning` is set
|
|
250
|
+
// on essentially every Responses request. The profile editor therefore
|
|
251
|
+
// doesn't surface `topP` for the native `openai` provider (mirroring
|
|
252
|
+
// `temperature`, which is also never offered/forwarded here); OpenAI-
|
|
253
|
+
// compatible connections, which use the chat-completions client, honor
|
|
254
|
+
// `top_p` normally.
|
|
255
|
+
|
|
246
256
|
if (tools && tools.length > 0) {
|
|
247
257
|
if (
|
|
248
258
|
this.useNativeWebSearch &&
|
|
@@ -48,6 +48,7 @@ export class CallSiteConfiguredProvider implements Provider {
|
|
|
48
48
|
private readonly inner: Provider,
|
|
49
49
|
private readonly callSite: LLMCallSite,
|
|
50
50
|
private readonly overrideProfile?: string,
|
|
51
|
+
private readonly forceOverrideProfile?: boolean,
|
|
51
52
|
) {
|
|
52
53
|
this.name = inner.name;
|
|
53
54
|
this.tokenEstimationProvider = inner.tokenEstimationProvider;
|
|
@@ -71,6 +72,10 @@ export class CallSiteConfiguredProvider implements Provider {
|
|
|
71
72
|
this.overrideProfile !== undefined
|
|
72
73
|
? { overrideProfile: this.overrideProfile }
|
|
73
74
|
: {}),
|
|
75
|
+
...(config?.forceOverrideProfile === undefined &&
|
|
76
|
+
this.forceOverrideProfile !== undefined
|
|
77
|
+
? { forceOverrideProfile: this.forceOverrideProfile }
|
|
78
|
+
: {}),
|
|
74
79
|
},
|
|
75
80
|
});
|
|
76
81
|
}
|
|
@@ -88,13 +93,15 @@ export class CallSiteConfiguredProvider implements Provider {
|
|
|
88
93
|
* matching call-site identifier from `LLMCallSiteEnum` when adding a new
|
|
89
94
|
* caller. Pass `opts.overrideProfile` to apply a per-call ad-hoc profile
|
|
90
95
|
* override (e.g. a per-conversation pinned profile) on top of any workspace
|
|
91
|
-
* `activeProfile`.
|
|
96
|
+
* `activeProfile`. Pass `opts.forceOverrideProfile` to float that override
|
|
97
|
+
* above the call-site layers (named site profile + call-site override) for
|
|
98
|
+
* non-main-agent call sites — see `ResolveCallSiteOpts.forceOverrideProfile`.
|
|
92
99
|
*
|
|
93
100
|
* Returns `null` when no providers are available at all.
|
|
94
101
|
*/
|
|
95
102
|
export async function resolveConfiguredProvider(
|
|
96
103
|
callSite: LLMCallSite,
|
|
97
|
-
opts: { overrideProfile?: string } = {},
|
|
104
|
+
opts: { overrideProfile?: string; forceOverrideProfile?: boolean } = {},
|
|
98
105
|
): Promise<ConfiguredProviderResult | null> {
|
|
99
106
|
const config = getConfig();
|
|
100
107
|
|
|
@@ -174,6 +181,7 @@ export async function resolveConfiguredProvider(
|
|
|
174
181
|
connectionProvider,
|
|
175
182
|
callSite,
|
|
176
183
|
opts.overrideProfile,
|
|
184
|
+
opts.forceOverrideProfile,
|
|
177
185
|
),
|
|
178
186
|
configuredProviderName: inferenceProvider,
|
|
179
187
|
};
|
|
@@ -189,7 +197,7 @@ export async function resolveConfiguredProvider(
|
|
|
189
197
|
*/
|
|
190
198
|
export async function getConfiguredProvider(
|
|
191
199
|
callSite: LLMCallSite,
|
|
192
|
-
opts: { overrideProfile?: string } = {},
|
|
200
|
+
opts: { overrideProfile?: string; forceOverrideProfile?: boolean } = {},
|
|
193
201
|
): Promise<Provider | null> {
|
|
194
202
|
const result = await resolveConfiguredProvider(callSite, opts);
|
|
195
203
|
return result?.provider ?? null;
|
|
@@ -25,12 +25,21 @@ export class RateLimitProvider implements Provider {
|
|
|
25
25
|
|
|
26
26
|
private requestTimestamps: number[];
|
|
27
27
|
|
|
28
|
+
// Forward the optional token-counting endpoint so the capability survives
|
|
29
|
+
// the wrapper chain. Bound straight to the inner provider — count_tokens is
|
|
30
|
+
// a cheap separate endpoint outside the message rate budget, and its caller
|
|
31
|
+
// falls back on error.
|
|
32
|
+
public readonly countInputTokens?: NonNullable<Provider["countInputTokens"]>;
|
|
33
|
+
|
|
28
34
|
constructor(
|
|
29
35
|
private readonly inner: Provider,
|
|
30
36
|
private readonly config: RateLimitConfig,
|
|
31
37
|
sharedRequestTimestamps?: number[],
|
|
32
38
|
) {
|
|
33
39
|
this.requestTimestamps = sharedRequestTimestamps ?? [];
|
|
40
|
+
if (inner.countInputTokens) {
|
|
41
|
+
this.countInputTokens = inner.countInputTokens.bind(inner);
|
|
42
|
+
}
|
|
34
43
|
}
|
|
35
44
|
|
|
36
45
|
async sendMessage(
|
package/src/providers/retry.ts
CHANGED
|
@@ -268,6 +268,16 @@ function normalizeSendMessageOptions(
|
|
|
268
268
|
) {
|
|
269
269
|
nextConfig.temperature = resolved.temperature;
|
|
270
270
|
}
|
|
271
|
+
// `topP` (schema, camelCase) maps to the provider wire field `top_p`.
|
|
272
|
+
// Defaults to `null` ("no opinion"); only forward an actual number so we
|
|
273
|
+
// never send `top_p: null`, mirroring the `temperature` handling above.
|
|
274
|
+
if (
|
|
275
|
+
nextConfig.top_p === undefined &&
|
|
276
|
+
resolved.topP !== null &&
|
|
277
|
+
resolved.topP !== undefined
|
|
278
|
+
) {
|
|
279
|
+
nextConfig.top_p = resolved.topP;
|
|
280
|
+
}
|
|
271
281
|
if (nextConfig.thinking === undefined && resolved.thinking !== undefined) {
|
|
272
282
|
nextConfig.thinking = resolved.thinking;
|
|
273
283
|
}
|
|
@@ -428,12 +438,16 @@ function normalizeSendMessageOptions(
|
|
|
428
438
|
// - Other providers: not our problem here (e.g. OpenAI reasoning models
|
|
429
439
|
// strip `temperature` upstream; non-Anthropic OpenRouter reasoning
|
|
430
440
|
// models don't have this exact constraint).
|
|
431
|
-
|
|
441
|
+
//
|
|
442
|
+
// Anthropic applies the same constraint family to `top_p` (see the `top_p`
|
|
443
|
+
// guard below), so the "thinking is enabled on the Anthropic wire" predicate
|
|
444
|
+
// is shared between the two guards.
|
|
445
|
+
const isThinkingEnabledOnAnthropicWire = (() => {
|
|
432
446
|
const model = typeof nextConfig.model === "string" ? nextConfig.model : "";
|
|
433
|
-
// Claude Fable always reasons in adaptive mode, so the
|
|
434
|
-
//
|
|
435
|
-
//
|
|
436
|
-
//
|
|
447
|
+
// Claude Fable always reasons in adaptive mode, so the constraint applies
|
|
448
|
+
// even when no explicit `thinking` config is present (a disabled config was
|
|
449
|
+
// already dropped above). For every other model the constraint only applies
|
|
450
|
+
// when thinking is actually enabled.
|
|
437
451
|
if (!isAdaptiveThinkingOnlyModel(model)) {
|
|
438
452
|
if (nextConfig.thinking == null) {
|
|
439
453
|
return false;
|
|
@@ -442,13 +456,6 @@ function normalizeSendMessageOptions(
|
|
|
442
456
|
return false;
|
|
443
457
|
}
|
|
444
458
|
}
|
|
445
|
-
const temp = nextConfig.temperature;
|
|
446
|
-
if (typeof temp !== "number") {
|
|
447
|
-
return false;
|
|
448
|
-
}
|
|
449
|
-
if (temp === 1) {
|
|
450
|
-
return false;
|
|
451
|
-
}
|
|
452
459
|
if (providerName === "anthropic") {
|
|
453
460
|
return true;
|
|
454
461
|
}
|
|
@@ -457,6 +464,18 @@ function normalizeSendMessageOptions(
|
|
|
457
464
|
}
|
|
458
465
|
return false;
|
|
459
466
|
})();
|
|
467
|
+
const isThinkingTemperatureConflict = (() => {
|
|
468
|
+
if (!isThinkingEnabledOnAnthropicWire) {
|
|
469
|
+
return false;
|
|
470
|
+
}
|
|
471
|
+
const temp = nextConfig.temperature;
|
|
472
|
+
if (typeof temp !== "number") {
|
|
473
|
+
return false;
|
|
474
|
+
}
|
|
475
|
+
// Unlike `top_p`, `temperature: 1` is explicitly accepted alongside
|
|
476
|
+
// thinking, so it's the one value that doesn't conflict.
|
|
477
|
+
return temp !== 1;
|
|
478
|
+
})();
|
|
460
479
|
if (isThinkingTemperatureConflict) {
|
|
461
480
|
log.warn(
|
|
462
481
|
{
|
|
@@ -472,6 +491,28 @@ function normalizeSendMessageOptions(
|
|
|
472
491
|
delete nextConfig.temperature;
|
|
473
492
|
}
|
|
474
493
|
|
|
494
|
+
// Anthropic (and OpenRouter fronting Anthropic) also rejects requests that
|
|
495
|
+
// combine extended thinking with *any* `top_p` modification. Unlike
|
|
496
|
+
// `temperature` there is no "=== 1 is fine" exception — when thinking is
|
|
497
|
+
// enabled the request must not set `top_p` at all. Drop it with a warn log
|
|
498
|
+
// so the request goes through with Anthropic's default, keeping `thinking`
|
|
499
|
+
// (the more deliberate, profile-level choice) for the same reasons as the
|
|
500
|
+
// temperature guard above.
|
|
501
|
+
if (isThinkingEnabledOnAnthropicWire && nextConfig.top_p !== undefined) {
|
|
502
|
+
log.warn(
|
|
503
|
+
{
|
|
504
|
+
providerName,
|
|
505
|
+
callSite: config.callSite,
|
|
506
|
+
droppedTopP: nextConfig.top_p,
|
|
507
|
+
},
|
|
508
|
+
"Dropping `top_p` because thinking is enabled — Anthropic does not " +
|
|
509
|
+
"accept `top_p` modifications when thinking/adaptive mode is on. Set " +
|
|
510
|
+
"`thinking: { type: 'disabled' }` on the call site if you need a " +
|
|
511
|
+
"specific top_p.",
|
|
512
|
+
);
|
|
513
|
+
delete nextConfig.top_p;
|
|
514
|
+
}
|
|
515
|
+
|
|
475
516
|
// effort is supported by Anthropic, OpenAI, and OpenAI-compatible providers; strip for others
|
|
476
517
|
if (
|
|
477
518
|
!EFFORT_SUPPORTED_PROVIDERS.has(providerName) &&
|
|
@@ -576,11 +617,20 @@ export class RetryProvider implements Provider {
|
|
|
576
617
|
return this.inner.tokenEstimationProvider;
|
|
577
618
|
}
|
|
578
619
|
|
|
620
|
+
// Forward the optional token-counting endpoint so the capability survives
|
|
621
|
+
// the wrapper chain (callers gate on its presence). Bound straight to the
|
|
622
|
+
// inner provider — count_tokens is a cheap separate endpoint and its caller
|
|
623
|
+
// already falls back on error, so it needs no retry wrapping.
|
|
624
|
+
public readonly countInputTokens?: NonNullable<Provider["countInputTokens"]>;
|
|
625
|
+
|
|
579
626
|
constructor(
|
|
580
627
|
private readonly inner: Provider,
|
|
581
628
|
private readonly options: { forwardUsageAttributionHeaders?: boolean } = {},
|
|
582
629
|
) {
|
|
583
630
|
this.name = inner.name;
|
|
631
|
+
if (inner.countInputTokens) {
|
|
632
|
+
this.countInputTokens = inner.countInputTokens.bind(inner);
|
|
633
|
+
}
|
|
584
634
|
}
|
|
585
635
|
|
|
586
636
|
async sendMessage(
|
|
@@ -105,6 +105,16 @@ export const SEARCH_PROVIDER_CATALOG: readonly SearchProviderCatalogEntry[] = [
|
|
|
105
105
|
fallbackOrder: 3,
|
|
106
106
|
privacyPolicyUrl: "https://tavily.com/privacy",
|
|
107
107
|
},
|
|
108
|
+
{
|
|
109
|
+
id: "firecrawl",
|
|
110
|
+
displayName: "Firecrawl",
|
|
111
|
+
kind: "byok",
|
|
112
|
+
apiKeyPrefix: "fc-...",
|
|
113
|
+
envVar: "FIRECRAWL_API_KEY",
|
|
114
|
+
secretKey: "firecrawl",
|
|
115
|
+
fallbackOrder: 4,
|
|
116
|
+
privacyPolicyUrl: "https://www.firecrawl.dev/privacy-policy",
|
|
117
|
+
},
|
|
108
118
|
];
|
|
109
119
|
|
|
110
120
|
/** Provider ids accepted by the web-search config schema. */
|
package/src/providers/types.ts
CHANGED
|
@@ -269,6 +269,22 @@ export interface Provider {
|
|
|
269
269
|
messages: Message[],
|
|
270
270
|
options?: SendMessageOptions,
|
|
271
271
|
): Promise<ProviderResponse>;
|
|
272
|
+
/**
|
|
273
|
+
* Exact prompt-token count from the provider's own tokenizer, for the
|
|
274
|
+
* `messages` + `systemPrompt` + `tools` composition the next call would
|
|
275
|
+
* send. Optional: providers without a token-counting endpoint omit it, and
|
|
276
|
+
* callers must fall back to the local estimator (`estimatePromptTokens`).
|
|
277
|
+
*
|
|
278
|
+
* This runs a dedicated counting request (no inference), so it carries a
|
|
279
|
+
* network round-trip and the provider's own rate limit — use it for
|
|
280
|
+
* user-initiated, occasional actions (e.g. `/compact`), never on the
|
|
281
|
+
* per-turn hot path.
|
|
282
|
+
*/
|
|
283
|
+
countInputTokens?(
|
|
284
|
+
messages: Message[],
|
|
285
|
+
systemPrompt: string,
|
|
286
|
+
tools?: ToolDefinition[],
|
|
287
|
+
): Promise<number>;
|
|
272
288
|
}
|
|
273
289
|
|
|
274
290
|
// ── Context-overflow error ────────────────────────────────────────────
|
|
@@ -18,10 +18,17 @@ const log = getLogger("provider-usage-tracking");
|
|
|
18
18
|
export class UsageTrackingProvider implements Provider {
|
|
19
19
|
public readonly name: string;
|
|
20
20
|
public readonly tokenEstimationProvider?: string;
|
|
21
|
+
// Forward the optional token-counting endpoint so the capability survives
|
|
22
|
+
// the wrapper chain. Bound straight to the inner provider — count_tokens is
|
|
23
|
+
// not billed, so there's no usage to track.
|
|
24
|
+
public readonly countInputTokens?: NonNullable<Provider["countInputTokens"]>;
|
|
21
25
|
|
|
22
26
|
constructor(private readonly inner: Provider) {
|
|
23
27
|
this.name = inner.name;
|
|
24
28
|
this.tokenEstimationProvider = inner.tokenEstimationProvider;
|
|
29
|
+
if (inner.countInputTokens) {
|
|
30
|
+
this.countInputTokens = inner.countInputTokens.bind(inner);
|
|
31
|
+
}
|
|
25
32
|
}
|
|
26
33
|
|
|
27
34
|
async sendMessage(
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Family-level classification of "weak open models" — open-weight models
|
|
3
|
+
* (Kimi, DeepSeek, MiniMax, GLM) that disregard static instructions and have
|
|
4
|
+
* capability gaps that capable models (Claude, GPT) do not. Used by harness
|
|
5
|
+
* levers that coach or redirect these models without touching capable-model
|
|
6
|
+
* behavior: the task-progress-nudge plugin and the empty-dynamic_page surface
|
|
7
|
+
* redirect.
|
|
8
|
+
*
|
|
9
|
+
* Family-level matching spans provider naming conventions: OpenRouter
|
|
10
|
+
* `moonshotai/kimi-k2.6`, `deepseek/deepseek-chat`, `minimax/minimax-m3`;
|
|
11
|
+
* Fireworks `accounts/fireworks/models/minimax-m3`, `kimi-k2p6`. Extend the
|
|
12
|
+
* pattern as other open models show the same gaps.
|
|
13
|
+
*
|
|
14
|
+
* Distinct from exploration-drift's narrower `LOOP_PRONE_MODEL_PATTERN`, which
|
|
15
|
+
* targets specific loop-prone versions rather than the whole capability family.
|
|
16
|
+
*/
|
|
17
|
+
export const WEAK_OPEN_MODEL_PATTERN = /kimi|deepseek|minimax|glm/i;
|
|
18
|
+
|
|
19
|
+
/** True when `model` is a weak open model (see {@link WEAK_OPEN_MODEL_PATTERN}). */
|
|
20
|
+
export function isWeakOpenModel(model: string | null | undefined): boolean {
|
|
21
|
+
return typeof model === "string" && WEAK_OPEN_MODEL_PATTERN.test(model);
|
|
22
|
+
}
|
package/src/runtime/AGENTS.md
CHANGED
|
@@ -22,7 +22,6 @@ GET handlers must be safe and side-effect-free — they must not enqueue backgro
|
|
|
22
22
|
|
|
23
23
|
Accepted exceptions (stale-while-revalidate caches): a GET handler may kick off a bounded, fire-and-forget background refresh of a generated-content cache when no fresh cache exists, provided the handler itself stays read-only and returns immediately with cached/fallback copy, the refresh is single-flight (concurrent GETs share one regeneration), and a TTL bounds regeneration frequency. Current instances:
|
|
24
24
|
|
|
25
|
-
- `GET /v1/identity/intro` — refreshes the generated greeting cache; the background prompt may only depend on static identity/soul context plus caller-supplied local hour/minute.
|
|
26
25
|
- `GET /v1/home/feed` — refreshes the personalized home greeting and suggested-prompt caches via `revalidateHomeContentInBackground()`, which publishes `home_feed_updated` when fresh content lands so clients refetch. This is intentional: home content is generated on demand (when a user actually views Home), never at daemon startup or on a timer.
|
|
27
26
|
- `GET /v1/conversation-starters` — enqueues a `generate_conversation_starters` memory job when the starter set is stale, cooldown-gated and deduped against in-flight jobs.
|
|
28
27
|
|