@vellumai/assistant 0.9.0 → 0.10.0-staging.2
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 +18 -34
- 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 +976 -63
- 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__/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__/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__/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-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-lifecycle.test.ts +7 -9
- package/src/__tests__/conversation-load-history-repair.test.ts +101 -0
- package/src/__tests__/conversation-routes-guardian-reply.test.ts +15 -12
- package/src/__tests__/conversation-surfaces-activation-emit.test.ts +6 -3
- package/src/__tests__/conversation-title-service.test.ts +62 -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-usage.test.ts +65 -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__/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-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__/skill-execute-input.test.ts +51 -1
- 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__/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 +49 -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/{__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 +197 -4
- 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__/merge-plugin-tree.test.ts +443 -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 +105 -17
- package/src/cli/lib/merge-plugin-tree.ts +328 -0
- package/src/cli/lib/plugin-fingerprint.ts +14 -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/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/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/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 +27 -14
- package/src/daemon/conversation.ts +66 -14
- 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/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/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__/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-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/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/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/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__/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/atlascloud/client.ts +85 -0
- package/src/providers/fetch-provider-catalog.ts +85 -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/retry.ts +53 -12
- package/src/providers/search-provider-catalog.ts +10 -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 +181 -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 +52 -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 +123 -0
- package/src/runtime/migrations/vbundle-builder.ts +49 -20
- package/src/runtime/pending-interactions.ts +15 -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 +240 -1
- package/src/runtime/routes/app-routes.ts +1 -1
- 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 +202 -3
- package/src/runtime/routes/schedule-routes.ts +0 -22
- package/src/runtime/routes/secret-routes.ts +10 -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 +2 -3
- 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 +33 -0
- package/src/tools/subagent/spawn.ts +61 -12
- 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 +9 -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/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
|
@@ -9,14 +9,6 @@
|
|
|
9
9
|
"description": "Automatically trigger conversation analysis on the same cadence as memory extraction (batch threshold, idle debounce, end-of-conversation). The analysis agent has full tool access and writes back to memory and skills without user approval.",
|
|
10
10
|
"defaultEnabled": false
|
|
11
11
|
},
|
|
12
|
-
{
|
|
13
|
-
"id": "memory-retrospective-fork",
|
|
14
|
-
"scope": "assistant",
|
|
15
|
-
"key": "memory-retrospective-fork",
|
|
16
|
-
"label": "Fork-based memory retrospective",
|
|
17
|
-
"description": "Fork the source conversation through its latest message for memory retrospectives, instead of rendering the slice into a transcript and waking an empty background conversation. The retrospective reads the conversation natively, including any inherited compaction summary and tail messages. Provider prompt-cache reuse additionally requires memory.retrospective.matchConversationProfile.",
|
|
18
|
-
"defaultEnabled": false
|
|
19
|
-
},
|
|
20
12
|
{
|
|
21
13
|
"id": "user-hosted-enabled",
|
|
22
14
|
"scope": "client",
|
|
@@ -32,16 +24,23 @@
|
|
|
32
24
|
"label": "Pre-chat Onboarding Experiment 2026-06-06",
|
|
33
25
|
"description": "Pre-chat onboarding experiment with control and variant-a arms. Control shows the full funnel; variant-a shows the condensed pared-down flow.",
|
|
34
26
|
"defaultEnabled": "control",
|
|
35
|
-
"values": [
|
|
27
|
+
"values": [
|
|
28
|
+
"control",
|
|
29
|
+
"variant-a"
|
|
30
|
+
]
|
|
36
31
|
},
|
|
37
32
|
{
|
|
38
33
|
"id": "experiment-activation-flow-2026-06-03",
|
|
39
34
|
"scope": "both",
|
|
40
35
|
"key": "experiment-activation-flow-2026-06-03",
|
|
41
36
|
"label": "Activation Flow Experiment 2026-06-03",
|
|
42
|
-
"description": "Multivariate activation-flow experiment. control = standard flow; variant-a = activation rail; personal-page =
|
|
37
|
+
"description": "Multivariate activation-flow experiment. control = standard flow; variant-a = activation rail; personal-page = new sign-up-page variant (front-end only). Targeted via LaunchDarkly.",
|
|
43
38
|
"defaultEnabled": "control",
|
|
44
|
-
"values": [
|
|
39
|
+
"values": [
|
|
40
|
+
"control",
|
|
41
|
+
"variant-a",
|
|
42
|
+
"personal-page"
|
|
43
|
+
]
|
|
45
44
|
},
|
|
46
45
|
{
|
|
47
46
|
"id": "local-docker-enabled",
|
|
@@ -59,6 +58,14 @@
|
|
|
59
58
|
"description": "Enable the A2A (Agent-to-Agent) channel for inter-assistant communication via the open A2A protocol",
|
|
60
59
|
"defaultEnabled": false
|
|
61
60
|
},
|
|
61
|
+
{
|
|
62
|
+
"id": "trace-collection",
|
|
63
|
+
"scope": "assistant",
|
|
64
|
+
"key": "trace-collection",
|
|
65
|
+
"label": "Trace Collection",
|
|
66
|
+
"description": "Gate per-turn conversation trace (user/assistant/tool-call/tool-response) collection. The daemon attaches a trace to its turn telemetry only when this flag AND the owner's share_diagnostics consent are both on. Defaults off (fail-closed) — the live value is delivered from LaunchDarkly.",
|
|
67
|
+
"defaultEnabled": false
|
|
68
|
+
},
|
|
62
69
|
{
|
|
63
70
|
"id": "workspace-tools-watcher",
|
|
64
71
|
"scope": "assistant",
|
|
@@ -179,14 +186,6 @@
|
|
|
179
186
|
"description": "Enable Anthropic fast mode for Opus models (4.6, 4.7, 4.8), delivering up to 2.5x higher output tokens per second at premium pricing",
|
|
180
187
|
"defaultEnabled": false
|
|
181
188
|
},
|
|
182
|
-
{
|
|
183
|
-
"id": "conversation-groups-ui",
|
|
184
|
-
"scope": "assistant",
|
|
185
|
-
"key": "conversation-groups-ui",
|
|
186
|
-
"label": "Conversation Groups",
|
|
187
|
-
"description": "Enable custom conversation group creation, move-to-group, and group management in the sidebar",
|
|
188
|
-
"defaultEnabled": false
|
|
189
|
-
},
|
|
190
189
|
{
|
|
191
190
|
"id": "teleport",
|
|
192
191
|
"scope": "client",
|
|
@@ -395,14 +394,6 @@
|
|
|
395
394
|
"description": "When on, runs the new memory-v3 topic-tree retrieval alongside v2 in shadow mode: logs selections to memory_v3_selections, does not modify injected context. Off by default.",
|
|
396
395
|
"defaultEnabled": false
|
|
397
396
|
},
|
|
398
|
-
{
|
|
399
|
-
"id": "memory-v3-live",
|
|
400
|
-
"scope": "assistant",
|
|
401
|
-
"key": "memory-v3-live",
|
|
402
|
-
"label": "Memory v3 Live",
|
|
403
|
-
"description": "When on, memory-v3 topic-tree retrieval becomes the live injected memory source (suppressing v2 injection). Off by default; only enable after shadow telemetry validates the design.",
|
|
404
|
-
"defaultEnabled": false
|
|
405
|
-
},
|
|
406
397
|
{
|
|
407
398
|
"id": "self-intro-greeting",
|
|
408
399
|
"scope": "both",
|
|
@@ -412,11 +403,35 @@
|
|
|
412
403
|
"defaultEnabled": false
|
|
413
404
|
},
|
|
414
405
|
{
|
|
415
|
-
"id": "
|
|
406
|
+
"id": "research-onboarding",
|
|
407
|
+
"scope": "client",
|
|
408
|
+
"key": "research-onboarding",
|
|
409
|
+
"label": "Research onboarding (spike)",
|
|
410
|
+
"description": "Spike: replace pre-chat onboarding with a web-research \"here's what I know about you\" flow, including a Google Calendar \"Let's chat tomorrow\" step shown over the streaming research. Gates the /assistant/onboarding/research route and the research mock harness. Off by default; enable locally via the feature-flags panel.",
|
|
411
|
+
"defaultEnabled": false
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
"id": "channel-trust-floors",
|
|
415
|
+
"scope": "assistant",
|
|
416
|
+
"key": "channel-trust-floors",
|
|
417
|
+
"label": "Channel Trust Floors",
|
|
418
|
+
"description": "Expose the Channel Trust Floors settings card (per-channel inbound admission policy) on the Privacy settings page. When off, the card is hidden and channels fall back to their default admission floors. Off by default while the feature is in development.",
|
|
419
|
+
"defaultEnabled": false
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
"id": "mcp-settings",
|
|
423
|
+
"scope": "assistant",
|
|
424
|
+
"key": "mcp-settings",
|
|
425
|
+
"label": "MCP Settings",
|
|
426
|
+
"description": "Show the MCP page in Settings for managing Model Context Protocol server connections: view status, enable/disable, configure, and inspect registered tools per server.",
|
|
427
|
+
"defaultEnabled": false
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
"id": "os-beta",
|
|
416
431
|
"scope": "assistant",
|
|
417
|
-
"key": "
|
|
418
|
-
"label": "
|
|
419
|
-
"description": "Enable the
|
|
432
|
+
"key": "os-beta",
|
|
433
|
+
"label": "OS Beta",
|
|
434
|
+
"description": "Enable the OS Beta model profile (GLM 5.2 / Fireworks) in the assistant's model profile selection.",
|
|
420
435
|
"defaultEnabled": false
|
|
421
436
|
}
|
|
422
437
|
]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getConfigReadOnly } from "./loader.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Validate an inference-profile key against the configured `llm.profiles`
|
|
5
|
+
* catalog. Returns a user-facing error message when the key is empty or
|
|
6
|
+
* unknown, or `null` when valid.
|
|
7
|
+
*/
|
|
8
|
+
export function validateInferenceProfileKey(profile: string): string | null {
|
|
9
|
+
if (!profile.trim()) {
|
|
10
|
+
return "inferenceProfile must be a non-empty string";
|
|
11
|
+
}
|
|
12
|
+
const profiles = getConfigReadOnly().llm?.profiles ?? {};
|
|
13
|
+
const entry = profiles[profile];
|
|
14
|
+
if (entry === undefined) {
|
|
15
|
+
const available = Object.keys(profiles).sort();
|
|
16
|
+
const hint =
|
|
17
|
+
available.length > 0
|
|
18
|
+
? ` Available profiles: ${available.join(", ")}.`
|
|
19
|
+
: " No profiles defined in llm.profiles.";
|
|
20
|
+
return `Inference profile "${profile}" is not defined in llm.profiles.${hint}`;
|
|
21
|
+
}
|
|
22
|
+
if (entry.status === "disabled") {
|
|
23
|
+
return `Inference profile "${profile}" is disabled.`;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
@@ -366,6 +366,9 @@ function profileConfigFragment(profile: ProfileEntry): Mergeable {
|
|
|
366
366
|
// lower-precedence (e.g. active) profile into one that merely inherited it.
|
|
367
367
|
// `RetryProvider` resolves it from the applied profile, not the merge.
|
|
368
368
|
logitBias: _logitBias,
|
|
369
|
+
// Per-profile advisor toggle is profile identity, not inheritable model
|
|
370
|
+
// config — strip it so it can't leak into the merged `LLMConfigBase`.
|
|
371
|
+
advisorEnabled: _advisorEnabled,
|
|
369
372
|
...config
|
|
370
373
|
} = profile;
|
|
371
374
|
return config as Mergeable;
|
package/src/config/loader.ts
CHANGED
|
@@ -362,6 +362,10 @@ const DEPRECATED_FIELDS: Record<string, string> = {
|
|
|
362
362
|
"per-lane concurrency caps (slowLlmConcurrency, fastConcurrency, " +
|
|
363
363
|
"embedConcurrency) instead of a single batch size. " +
|
|
364
364
|
"The field will be removed from your config file.",
|
|
365
|
+
"daemon.reapOrphanedSubprocesses":
|
|
366
|
+
"daemon.reapOrphanedSubprocesses has been removed. The daemon now reaps " +
|
|
367
|
+
"orphaned subprocesses automatically whenever it runs as PID 1 on Linux. " +
|
|
368
|
+
"The field will be removed from your config file.",
|
|
365
369
|
};
|
|
366
370
|
|
|
367
371
|
/**
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AssistantConfig } from "./schema.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Whether memory-v3 is the live injected memory source for this assistant,
|
|
5
|
+
* suppressing v2 injection. Gated by workspace config (`memory.v3.live`): new
|
|
6
|
+
* assistants are switched on at creation via a workspace migration, while
|
|
7
|
+
* existing assistants stay on v2 until the value is set explicitly.
|
|
8
|
+
*/
|
|
9
|
+
export function isMemoryV3Live(config: AssistantConfig): boolean {
|
|
10
|
+
return config.memory?.v3?.live === true;
|
|
11
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Presentation ordering for inference profiles. `llm.profileOrder` lists the
|
|
3
|
+
* keys a workspace wants surfaced first; the resolver ignores it, so it exists
|
|
4
|
+
* purely to keep profile pickers consistent across surfaces.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Order profile keys for presentation: keys named in `profileOrder` first
|
|
9
|
+
* (deduped, and only those that resolve to a real profile), then the remaining
|
|
10
|
+
* keys alphabetically.
|
|
11
|
+
*/
|
|
12
|
+
export function orderProfileKeys(
|
|
13
|
+
profiles: Record<string, unknown>,
|
|
14
|
+
profileOrder: readonly string[] | undefined,
|
|
15
|
+
): string[] {
|
|
16
|
+
const seen = new Set<string>();
|
|
17
|
+
const ordered: string[] = [];
|
|
18
|
+
for (const name of profileOrder ?? []) {
|
|
19
|
+
if (profiles[name] != null && !seen.has(name)) {
|
|
20
|
+
ordered.push(name);
|
|
21
|
+
seen.add(name);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const tail = Object.keys(profiles)
|
|
25
|
+
.filter((n) => !seen.has(n))
|
|
26
|
+
.sort();
|
|
27
|
+
return [...ordered, ...tail];
|
|
28
|
+
}
|
package/src/config/schema.ts
CHANGED
|
@@ -136,16 +136,18 @@ export const AssistantConfigSchema = z
|
|
|
136
136
|
.describe(
|
|
137
137
|
"Per-plugin configuration keyed by plugin name. Validated downstream by each plugin's manifest.config validator at bootstrap.",
|
|
138
138
|
),
|
|
139
|
-
|
|
139
|
+
legacyTelemetryOptOut: z
|
|
140
140
|
.boolean()
|
|
141
|
-
.
|
|
141
|
+
.optional()
|
|
142
142
|
.describe(
|
|
143
|
-
"
|
|
143
|
+
"Fail-closed telemetry marker: set for a workspace that had an explicit local usage-data opt-out before telemetry moved to platform share_analytics consent. While set, usage telemetry stays disabled regardless of platform consent.",
|
|
144
144
|
),
|
|
145
|
-
|
|
145
|
+
legacyDiagnosticsOptOut: z
|
|
146
146
|
.boolean()
|
|
147
|
-
.
|
|
148
|
-
.describe(
|
|
147
|
+
.optional()
|
|
148
|
+
.describe(
|
|
149
|
+
"Fail-closed diagnostics marker: set for a workspace that had an explicit local sendDiagnostics opt-out before crash reporting moved to platform share_diagnostics consent. While set, Sentry stays disabled regardless of platform consent.",
|
|
150
|
+
),
|
|
149
151
|
maxStepsPerSession: z
|
|
150
152
|
.number({ error: "maxStepsPerSession must be a number" })
|
|
151
153
|
.int("maxStepsPerSession must be an integer")
|
|
@@ -6,6 +6,7 @@ describe("MemoryV3ConfigSchema", () => {
|
|
|
6
6
|
test("parses an empty object to documented defaults", () => {
|
|
7
7
|
const parsed = MemoryV3ConfigSchema.parse({});
|
|
8
8
|
expect(parsed).toEqual({
|
|
9
|
+
live: false,
|
|
9
10
|
prune: { maxResidentBytes: 393216, targetResidentBytes: 262144 },
|
|
10
11
|
hotSet: { k: 40, halfLifeDays: 14 },
|
|
11
12
|
freshSet: { k: 100 },
|
|
@@ -300,6 +300,13 @@ const CATALOG_RECORD: CatalogRecord = {
|
|
|
300
300
|
description: "General-purpose LLM inference call site for skill use.",
|
|
301
301
|
domain: "skills",
|
|
302
302
|
},
|
|
303
|
+
advisor: {
|
|
304
|
+
id: "advisor",
|
|
305
|
+
displayName: "Advisor",
|
|
306
|
+
description:
|
|
307
|
+
"Stronger reviewer model consulted mid-task to shape or pressure-test the plan.",
|
|
308
|
+
domain: "skills",
|
|
309
|
+
},
|
|
303
310
|
homeGreeting: {
|
|
304
311
|
id: "homeGreeting",
|
|
305
312
|
displayName: "Home Greeting",
|
|
@@ -136,5 +136,16 @@ export const SlackConfigSchema = z
|
|
|
136
136
|
.string({ error: "slack.botUsername must be a string" })
|
|
137
137
|
.default("")
|
|
138
138
|
.describe("Slack bot display name"),
|
|
139
|
+
threadMode: z
|
|
140
|
+
.enum(["mention_only", "mention_then_thread"], {
|
|
141
|
+
error:
|
|
142
|
+
"slack.threadMode must be 'mention_only' or 'mention_then_thread'",
|
|
143
|
+
})
|
|
144
|
+
.default("mention_then_thread")
|
|
145
|
+
.describe(
|
|
146
|
+
"Controls whether the bot follows threads after an initial @mention. " +
|
|
147
|
+
"'mention_only' requires every message to @-mention the bot. " +
|
|
148
|
+
"'mention_then_thread' auto-follows the thread after the first mention.",
|
|
149
|
+
),
|
|
139
150
|
})
|
|
140
151
|
.describe("Slack channel configuration");
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// Default ElevenLabs voice — "Amelia" (expressive, enthusiastic, British English).
|
|
2
2
|
// Used by both in-app TTS and phone calls (via Twilio ConversationRelay).
|
|
3
|
-
// Mirrored in: clients/macos/.../OpenAIVoiceService.swift (defaultVoiceId)
|
|
4
3
|
export const DEFAULT_ELEVENLABS_VOICE_ID = "ZF6FPAbjXT4488VcRRnw";
|
|
5
4
|
|
|
6
5
|
/** Valid conversation timeout values (seconds). Shared with voice-config-update tool. */
|
|
@@ -23,6 +23,7 @@ export const LLMProvider = z
|
|
|
23
23
|
"openrouter",
|
|
24
24
|
"openai-compatible",
|
|
25
25
|
"minimax",
|
|
26
|
+
"atlascloud",
|
|
26
27
|
])
|
|
27
28
|
.meta({ id: "LLMProvider" });
|
|
28
29
|
type LLMProvider = z.infer<typeof LLMProvider>;
|
|
@@ -77,6 +78,7 @@ export const LLMCallSiteEnum = z.enum([
|
|
|
77
78
|
"meetConsentMonitor",
|
|
78
79
|
"meetChatOpportunity",
|
|
79
80
|
"inference",
|
|
81
|
+
"advisor",
|
|
80
82
|
"trustRuleSuggestion",
|
|
81
83
|
"homeGreeting",
|
|
82
84
|
"homeSuggestedPrompts",
|
|
@@ -126,6 +128,11 @@ const VerbosityEnum = z.enum(["low", "medium", "high"]);
|
|
|
126
128
|
const ModelSchema = z.string().min(1);
|
|
127
129
|
const MaxTokensSchema = z.number().int().positive();
|
|
128
130
|
const TemperatureSchema = z.number().min(0).max(2).nullable();
|
|
131
|
+
// `top_p` (nucleus sampling). Range 0–1; `null` = "no opinion — let the
|
|
132
|
+
// provider pick its own default" (matches TemperatureSchema's null
|
|
133
|
+
// semantics). `RetryProvider` renames `topP`→`top_p` and only forwards a
|
|
134
|
+
// non-null value, so providers never receive `top_p: null`.
|
|
135
|
+
const TopPSchema = z.number().min(0).max(1).nullable();
|
|
129
136
|
// Named, code-resolved logit-bias preset a profile may opt into. The value is a
|
|
130
137
|
// preset *name*, not an inline token→bias map, so the workspace config stays
|
|
131
138
|
// small. This is profile-identity metadata, not inheritable config: the resolver
|
|
@@ -326,6 +333,7 @@ export const LLMConfigBase = z.object({
|
|
|
326
333
|
speed: SpeedEnum.default("standard"),
|
|
327
334
|
verbosity: VerbosityEnum.default("medium"),
|
|
328
335
|
temperature: TemperatureSchema.default(null),
|
|
336
|
+
topP: TopPSchema.default(null),
|
|
329
337
|
thinking: ThinkingSchema.default(ThinkingSchema.parse({})),
|
|
330
338
|
contextWindow: ContextWindowSchema.default(ContextWindowSchema.parse({})),
|
|
331
339
|
openrouter: OpenRouterSchema.default(OpenRouterSchema.parse({})),
|
|
@@ -361,6 +369,7 @@ export const LLMConfigFragment = z
|
|
|
361
369
|
speed: SpeedEnum.optional(),
|
|
362
370
|
verbosity: VerbosityEnum.optional(),
|
|
363
371
|
temperature: TemperatureSchema.optional(),
|
|
372
|
+
topP: TopPSchema.optional(),
|
|
364
373
|
thinking: ThinkingFragmentSchema.optional(),
|
|
365
374
|
contextWindow: ContextWindowDeepPartialSchema.optional(),
|
|
366
375
|
openrouter: OpenRouterDeepPartialSchema.optional(),
|
|
@@ -431,6 +440,13 @@ export const ProfileEntry = LLMConfigFragment.extend({
|
|
|
431
440
|
* #30362 even though the schema didn't accept it until now.
|
|
432
441
|
*/
|
|
433
442
|
status: ProfileStatusSchema.nullable().optional(),
|
|
443
|
+
/**
|
|
444
|
+
* Whether the advisor is active while this profile is the chat profile.
|
|
445
|
+
* Absent/null means enabled (default on); only an explicit `false` disables
|
|
446
|
+
* it. `.nullable()` matches `status`/`label` so the PUT route's "send null
|
|
447
|
+
* to clear" sentinel resets it back to the default-on state.
|
|
448
|
+
*/
|
|
449
|
+
advisorEnabled: z.boolean().nullable().optional(),
|
|
434
450
|
/**
|
|
435
451
|
* When present, this profile is a "mix": it carries no model config and
|
|
436
452
|
* instead references a weighted list of standard profiles. The resolver
|
|
@@ -474,6 +490,11 @@ export const LLMSchema = z
|
|
|
474
490
|
// schema level, so `LLMSchema.parse({})` yields an empty map.
|
|
475
491
|
callSites: z.partialRecord(LLMCallSiteEnum, LLMCallSiteConfig).default({}),
|
|
476
492
|
activeProfile: z.string().min(1).optional(),
|
|
493
|
+
// The profile the advisor consults (chosen under Models & Services). It is
|
|
494
|
+
// excluded from the chat-profile pickers so it can't be selected as the
|
|
495
|
+
// assistant's chat model. Absent falls back to the `advisor` call-site
|
|
496
|
+
// default (`quality-optimized`).
|
|
497
|
+
advisorProfile: z.string().min(1).optional(),
|
|
477
498
|
// TTL bounds for inference profile sessions. `defaultTtlSeconds` is read by
|
|
478
499
|
// the CLI to apply when `--ttl` is omitted; the daemon handler itself only
|
|
479
500
|
// reads `maxTtlSeconds` (to clamp caller-supplied values).
|
|
@@ -507,6 +528,16 @@ export const LLMSchema = z
|
|
|
507
528
|
message: `Profile "${config.activeProfile}" referenced by llm.activeProfile is not defined in llm.profiles`,
|
|
508
529
|
});
|
|
509
530
|
}
|
|
531
|
+
if (
|
|
532
|
+
config.advisorProfile != null &&
|
|
533
|
+
!profileNames.has(config.advisorProfile)
|
|
534
|
+
) {
|
|
535
|
+
ctx.addIssue({
|
|
536
|
+
code: "custom",
|
|
537
|
+
path: ["advisorProfile"],
|
|
538
|
+
message: `Profile "${config.advisorProfile}" referenced by llm.advisorProfile is not defined in llm.profiles`,
|
|
539
|
+
});
|
|
540
|
+
}
|
|
510
541
|
|
|
511
542
|
// --- Mix profile validation --------------------------------------------
|
|
512
543
|
// Config keys a mix profile must NOT also set (a mix only references other
|
|
@@ -133,13 +133,9 @@ export const MemoryCleanupConfigSchema = z
|
|
|
133
133
|
.nonnegative(
|
|
134
134
|
"memory.cleanup.llmRequestLogRetentionMs must be non-negative",
|
|
135
135
|
)
|
|
136
|
-
//
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
// return it and the macOS picker would snap it to its largest known
|
|
140
|
-
// option, and the next PATCH would silently truncate the value —
|
|
141
|
-
// causing quiet data loss. Enforcing the same cap here prevents the
|
|
142
|
-
// daemon from accepting out-of-range values in the first place.
|
|
136
|
+
// Cap retention at 365 days. Enforced daemon-side only: the cleanup jobs
|
|
137
|
+
// honor this bound, so a manually edited config.json with a larger value
|
|
138
|
+
// is rejected here rather than silently retained.
|
|
143
139
|
.max(
|
|
144
140
|
365 * 24 * 60 * 60 * 1000,
|
|
145
141
|
"memory.cleanup.llmRequestLogRetentionMs must be <= 365 days in ms",
|
|
@@ -220,6 +220,12 @@ export const MemoryV3PruneSchema = z
|
|
|
220
220
|
// so legacy configs keep parsing. Do not make this object `.strict()`.
|
|
221
221
|
export const MemoryV3ConfigSchema = z
|
|
222
222
|
.object({
|
|
223
|
+
live: z
|
|
224
|
+
.boolean({ error: "memory.v3.live must be a boolean" })
|
|
225
|
+
.default(false)
|
|
226
|
+
.describe(
|
|
227
|
+
"Whether memory-v3 is the live injected memory source, suppressing v2 injection. Off by default; brand-new assistants are switched on at creation via a workspace migration, while existing assistants stay on v2 until explicitly enabled.",
|
|
228
|
+
),
|
|
223
229
|
prune: MemoryV3PruneSchema.default(MemoryV3PruneSchema.parse({})),
|
|
224
230
|
hotSet: MemoryV3HotSetSchema.default(MemoryV3HotSetSchema.parse({})),
|
|
225
231
|
freshSet: MemoryV3FreshSetSchema.default(MemoryV3FreshSetSchema.parse({})),
|
|
@@ -87,14 +87,6 @@ export const DaemonConfigSchema = z
|
|
|
87
87
|
.describe(
|
|
88
88
|
"Whether the daemon records conversations even when no client is connected",
|
|
89
89
|
),
|
|
90
|
-
reapOrphanedSubprocesses: z
|
|
91
|
-
.boolean({
|
|
92
|
-
error: "daemon.reapOrphanedSubprocesses must be a boolean",
|
|
93
|
-
})
|
|
94
|
-
.default(false)
|
|
95
|
-
.describe(
|
|
96
|
-
"Whether the daemon, when running as PID 1 in a container, periodically reaps orphaned subprocesses that reparented to it. Off by default while the behavior is being validated.",
|
|
97
|
-
),
|
|
98
90
|
})
|
|
99
91
|
.describe("Background daemon process configuration");
|
|
100
92
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
|
|
3
3
|
import { DEFAULT_IMAGE_MODEL } from "../../media/image-models.js";
|
|
4
|
+
import { FETCH_PROVIDER_IDS } from "../../providers/fetch-provider-catalog.js";
|
|
4
5
|
import { SEARCH_PROVIDER_IDS } from "../../providers/search-provider-catalog.js";
|
|
5
6
|
import { SttServiceSchema } from "./stt.js";
|
|
6
7
|
import { TtsServiceSchema } from "./tts.js";
|
|
@@ -28,6 +29,13 @@ const VALID_IMAGE_GEN_PROVIDERS = ["gemini", "openai"] as const;
|
|
|
28
29
|
*/
|
|
29
30
|
const VALID_WEB_SEARCH_PROVIDERS = SEARCH_PROVIDER_IDS;
|
|
30
31
|
|
|
32
|
+
/**
|
|
33
|
+
* Derived from `FETCH_PROVIDER_CATALOG`. Adding a new web-fetch provider
|
|
34
|
+
* to the catalog automatically extends the config-schema enum — no edit
|
|
35
|
+
* here required.
|
|
36
|
+
*/
|
|
37
|
+
const VALID_WEB_FETCH_PROVIDERS = FETCH_PROVIDER_IDS;
|
|
38
|
+
|
|
31
39
|
const BaseServiceSchema = z.object({
|
|
32
40
|
mode: ServiceModeSchema.default("your-own"),
|
|
33
41
|
});
|
|
@@ -58,6 +66,15 @@ const WebSearchServiceSchema = BaseServiceSchema.extend({
|
|
|
58
66
|
.default("inference-provider-native"),
|
|
59
67
|
});
|
|
60
68
|
|
|
69
|
+
const WebFetchServiceSchema = BaseServiceSchema.extend({
|
|
70
|
+
// Provider that backs the `web_fetch` tool. `default` is the daemon's
|
|
71
|
+
// built-in HTTP fetch + extract path (no key). BYOK providers (e.g.
|
|
72
|
+
// `firecrawl`) scrape via their hosted API and reuse the same stored key as
|
|
73
|
+
// their web-search counterpart. The `mode` field is inherited from
|
|
74
|
+
// `BaseServiceSchema` for symmetry; web-fetch has no managed proxy today.
|
|
75
|
+
provider: z.enum(VALID_WEB_FETCH_PROVIDERS).default("default"),
|
|
76
|
+
});
|
|
77
|
+
|
|
61
78
|
const GoogleOAuthServiceSchema = BaseServiceSchema.extend({
|
|
62
79
|
mode: ServiceModeSchema.default("managed"),
|
|
63
80
|
});
|
|
@@ -142,6 +159,7 @@ export const ServicesSchema = z.object({
|
|
|
142
159
|
"web-search": WebSearchServiceSchema.default(
|
|
143
160
|
WebSearchServiceSchema.parse({}),
|
|
144
161
|
),
|
|
162
|
+
"web-fetch": WebFetchServiceSchema.default(WebFetchServiceSchema.parse({})),
|
|
145
163
|
stt: SttServiceSchema.default({
|
|
146
164
|
mode: "your-own" as const,
|
|
147
165
|
provider: "deepgram" as const,
|