@vellumai/assistant 0.5.5 → 0.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +16 -2
- package/ARCHITECTURE.md +6 -75
- package/Dockerfile +4 -5
- package/README.md +0 -2
- package/bun.lock +0 -414
- package/docs/architecture/keychain-broker.md +45 -240
- package/docs/architecture/security.md +0 -17
- package/docs/credential-execution-service.md +2 -2
- package/node_modules/@vellumai/ces-contracts/package.json +1 -0
- package/node_modules/@vellumai/ces-contracts/src/rpc.ts +119 -0
- package/node_modules/@vellumai/credential-storage/package.json +1 -0
- package/node_modules/@vellumai/egress-proxy/package.json +1 -0
- package/package.json +2 -3
- package/src/__tests__/actor-token-service.test.ts +1 -2
- package/src/__tests__/assistant-feature-flags-integration.test.ts +30 -29
- package/src/__tests__/browser-skill-endstate.test.ts +6 -5
- package/src/__tests__/btw-routes.test.ts +0 -39
- package/src/__tests__/call-domain.test.ts +0 -128
- package/src/__tests__/ces-rpc-credential-backend.test.ts +199 -0
- package/src/__tests__/channel-approval-routes.test.ts +0 -5
- package/src/__tests__/channel-readiness-service.test.ts +1 -60
- package/src/__tests__/checker.test.ts +4 -2
- package/src/__tests__/cli-command-risk-guard.test.ts +112 -0
- package/src/__tests__/config-schema-cmd.test.ts +0 -1
- package/src/__tests__/config-schema.test.ts +3 -3
- package/src/__tests__/context-window-manager.test.ts +78 -0
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -5
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-skill-tools.test.ts +0 -54
- package/src/__tests__/conversation-title-service.test.ts +117 -1
- package/src/__tests__/credential-execution-feature-gates.test.ts +28 -14
- package/src/__tests__/credential-execution-managed-contract.test.ts +33 -18
- package/src/__tests__/credential-security-e2e.test.ts +0 -66
- package/src/__tests__/credential-security-invariants.test.ts +4 -45
- package/src/__tests__/credentials-cli.test.ts +78 -0
- package/src/__tests__/db-migration-rollback.test.ts +2015 -1
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +98 -0
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +6 -4
- package/src/__tests__/guardian-routing-state.test.ts +0 -5
- package/src/__tests__/host-shell-tool.test.ts +6 -7
- package/src/__tests__/http-user-message-parity.test.ts +3 -103
- package/src/__tests__/inbound-invite-redemption.test.ts +0 -4
- package/src/__tests__/inline-skill-load-permissions.test.ts +6 -8
- package/src/__tests__/intent-routing.test.ts +0 -13
- package/src/__tests__/jobs-store-qdrant-breaker.test.ts +178 -0
- package/src/__tests__/keychain-broker-client.test.ts +161 -22
- package/src/__tests__/memory-jobs-worker-backoff.test.ts +150 -0
- package/src/__tests__/memory-regressions.test.ts +8 -30
- package/src/__tests__/migration-export-http.test.ts +2 -2
- package/src/__tests__/migration-import-commit-http.test.ts +2 -2
- package/src/__tests__/migration-import-preflight-http.test.ts +2 -2
- package/src/__tests__/migration-validate-http.test.ts +2 -2
- package/src/__tests__/non-member-access-request.test.ts +0 -5
- package/src/__tests__/notification-decision-fallback.test.ts +4 -0
- package/src/__tests__/notification-decision-identity.test.ts +4 -0
- package/src/__tests__/permission-types.test.ts +1 -0
- package/src/__tests__/provider-managed-proxy-integration.test.ts +5 -6
- package/src/__tests__/qdrant-manager.test.ts +28 -2
- package/src/__tests__/registry.test.ts +0 -6
- package/src/__tests__/require-fresh-approval.test.ts +4 -0
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -4
- package/src/__tests__/secret-routes-managed-proxy.test.ts +0 -4
- package/src/__tests__/secure-keys.test.ts +83 -263
- package/src/__tests__/shell-identity.test.ts +96 -6
- package/src/__tests__/skill-feature-flags-integration.test.ts +22 -14
- package/src/__tests__/skill-feature-flags.test.ts +46 -45
- package/src/__tests__/skill-load-feature-flag.test.ts +7 -10
- package/src/__tests__/skill-load-inline-command.test.ts +8 -12
- package/src/__tests__/skill-load-inline-includes.test.ts +6 -10
- package/src/__tests__/skill-load-tool.test.ts +0 -2
- package/src/__tests__/skill-projection-feature-flag.test.ts +33 -29
- package/src/__tests__/skills.test.ts +0 -2
- package/src/__tests__/slack-inbound-verification.test.ts +0 -4
- package/src/__tests__/suggestion-routes.test.ts +1 -32
- package/src/__tests__/system-prompt.test.ts +0 -1
- package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -0
- package/src/__tests__/tool-executor-shell-integration.test.ts +5 -3
- package/src/__tests__/tool-executor.test.ts +4 -0
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -5
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -4
- package/src/__tests__/update-bulletin.test.ts +0 -2
- package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +6 -9
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -6
- package/src/__tests__/workspace-migration-015-migrate-credentials-to-keychain.test.ts +252 -0
- package/src/__tests__/workspace-migration-016-migrate-credentials-from-keychain.test.ts +218 -0
- package/src/__tests__/workspace-migration-down-functions.test.ts +1009 -0
- package/src/__tests__/workspace-migrations-runner.test.ts +114 -0
- package/src/calls/audio-store.test.ts +97 -0
- package/src/calls/audio-store.ts +205 -0
- package/src/calls/call-controller.ts +85 -7
- package/src/calls/call-domain.ts +3 -0
- package/src/calls/call-store.ts +10 -3
- package/src/calls/fish-audio-client.ts +117 -0
- package/src/calls/relay-server.ts +27 -0
- package/src/calls/twilio-routes.ts +2 -1
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-ingress-preflight.ts +0 -42
- package/src/calls/voice-quality.ts +26 -5
- package/src/calls/voice-session-bridge.ts +6 -12
- package/src/cli/commands/config.ts +1 -4
- package/src/cli/commands/conversations.ts +0 -18
- package/src/cli/commands/credentials.ts +34 -4
- package/src/cli/commands/oauth/index.ts +7 -0
- package/src/cli/commands/oauth/platform.ts +179 -0
- package/src/cli/commands/platform.ts +3 -3
- package/src/config/assistant-feature-flags.ts +186 -5
- package/src/config/bundled-skills/messaging/SKILL.md +5 -5
- package/src/config/bundled-skills/phone-calls/TOOLS.json +4 -0
- package/src/config/bundled-skills/settings/TOOLS.json +2 -2
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +42 -0
- package/src/config/bundled-tool-registry.ts +1 -11
- package/src/config/env-registry.ts +1 -1
- package/src/config/env.ts +16 -16
- package/src/config/feature-flag-registry.json +48 -16
- package/src/config/loader.ts +98 -31
- package/src/config/schema.ts +4 -25
- package/src/config/schemas/calls.ts +13 -0
- package/src/config/schemas/fish-audio.ts +39 -0
- package/src/config/schemas/memory.ts +0 -4
- package/src/config/schemas/platform.ts +1 -1
- package/src/config/schemas/security.ts +4 -4
- package/src/config/types.ts +0 -1
- package/src/contacts/contact-store.ts +39 -0
- package/src/contacts/types.ts +2 -0
- package/src/context/window-manager.ts +53 -2
- package/src/credential-execution/approval-bridge.ts +1 -0
- package/src/credential-execution/executable-discovery.ts +28 -4
- package/src/credential-execution/feature-gates.ts +16 -0
- package/src/credential-execution/process-manager.ts +38 -0
- package/src/daemon/assistant-attachments.ts +9 -0
- package/src/daemon/config-watcher.ts +6 -4
- package/src/daemon/conversation-agent-loop.ts +0 -60
- package/src/daemon/conversation-memory.ts +0 -117
- package/src/daemon/conversation-runtime-assembly.ts +0 -2
- package/src/daemon/conversation-tool-setup.ts +0 -105
- package/src/daemon/conversation.ts +10 -1
- package/src/daemon/handlers/config-vercel.ts +92 -0
- package/src/daemon/handlers/conversations.ts +0 -11
- package/src/daemon/handlers/skills.ts +2 -15
- package/src/daemon/install-symlink.ts +195 -0
- package/src/daemon/lifecycle.ts +229 -96
- package/src/daemon/message-types/conversations.ts +3 -4
- package/src/daemon/message-types/diagnostics.ts +3 -22
- package/src/daemon/message-types/messages.ts +0 -2
- package/src/daemon/message-types/upgrades.ts +8 -0
- package/src/daemon/server.ts +30 -92
- package/src/events/domain-events.ts +2 -1
- package/src/followups/followup-store.ts +5 -2
- package/src/inbound/platform-callback-registration.ts +3 -3
- package/src/instrument.ts +8 -5
- package/src/memory/conversation-crud.ts +0 -236
- package/src/memory/conversation-title-service.ts +76 -11
- package/src/memory/db-init.ts +15 -11
- package/src/memory/indexer.ts +15 -106
- package/src/memory/items-extractor.ts +15 -1
- package/src/memory/job-handlers/conversation-starters.ts +4 -1
- package/src/memory/job-handlers/embedding.ts +0 -79
- package/src/memory/job-utils.ts +1 -1
- package/src/memory/jobs-store.ts +30 -13
- package/src/memory/jobs-worker.ts +31 -27
- package/src/memory/migrations/001-job-deferrals.ts +19 -0
- package/src/memory/migrations/004-entity-relation-dedup.ts +10 -0
- package/src/memory/migrations/005-fingerprint-scope-unique.ts +76 -0
- package/src/memory/migrations/006-scope-salted-fingerprints.ts +50 -0
- package/src/memory/migrations/007-assistant-id-to-self.ts +10 -0
- package/src/memory/migrations/008-remove-assistant-id-columns.ts +34 -0
- package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +26 -0
- package/src/memory/migrations/014-backfill-inbox-thread-state.ts +10 -0
- package/src/memory/migrations/015-drop-active-search-index.ts +17 -0
- package/src/memory/migrations/019-notification-tables-schema-migration.ts +12 -0
- package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +121 -0
- package/src/memory/migrations/024-embedding-vector-blob.ts +74 -0
- package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +82 -0
- package/src/memory/migrations/036-normalize-phone-identities.ts +11 -0
- package/src/memory/migrations/116-messages-fts.ts +106 -1
- package/src/memory/migrations/126-backfill-guardian-principal-id.ts +52 -0
- package/src/memory/migrations/127-guardian-principal-id-not-null.ts +77 -0
- package/src/memory/migrations/134-contacts-notes-column.ts +13 -0
- package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +20 -0
- package/src/memory/migrations/136-drop-assistant-id-columns.ts +52 -0
- package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +13 -0
- package/src/memory/migrations/141-rename-verification-table.ts +54 -0
- package/src/memory/migrations/142-rename-verification-session-id-column.ts +25 -0
- package/src/memory/migrations/143-rename-guardian-verification-values.ts +35 -0
- package/src/memory/migrations/144-rename-voice-to-phone.ts +136 -0
- package/src/memory/migrations/145-drop-accounts-table.ts +32 -0
- package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +14 -1
- package/src/memory/migrations/148-drop-reminders-table.ts +35 -1
- package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +69 -1
- package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +290 -0
- package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +51 -1
- package/src/memory/migrations/174-rename-thread-starters-table.ts +47 -1
- package/src/memory/migrations/176-drop-capability-card-state.ts +13 -0
- package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +16 -0
- package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +28 -1
- package/src/memory/migrations/189-drop-simplified-memory.ts +42 -0
- package/src/memory/migrations/190-call-session-skip-disclosure.ts +15 -0
- package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +64 -0
- package/src/memory/migrations/192-contacts-user-file-column.ts +15 -0
- package/src/memory/migrations/index.ts +5 -3
- package/src/memory/migrations/registry.ts +90 -0
- package/src/memory/migrations/validate-migration-state.ts +137 -11
- package/src/memory/qdrant-circuit-breaker.ts +9 -0
- package/src/memory/qdrant-client.ts +4 -6
- package/src/memory/qdrant-manager.ts +64 -7
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/contacts.ts +1 -0
- package/src/memory/schema/conversations.ts +0 -3
- package/src/memory/schema/index.ts +0 -2
- package/src/messaging/draft-store.ts +2 -2
- package/src/notifications/decision-engine.ts +4 -1
- package/src/oauth/connection-resolver.ts +6 -4
- package/src/permissions/checker.ts +0 -38
- package/src/permissions/defaults.ts +3 -3
- package/src/permissions/shell-identity.ts +76 -22
- package/src/permissions/trust-client.ts +2 -13
- package/src/permissions/trust-store.ts +8 -3
- package/src/permissions/types.ts +4 -2
- package/src/platform/client.ts +35 -7
- package/src/prompts/persona-resolver.ts +138 -0
- package/src/prompts/system-prompt.ts +36 -4
- package/src/prompts/templates/users/default.md +1 -0
- package/src/providers/registry.ts +27 -40
- package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
- package/src/runtime/auth/__tests__/external-assistant-id.test.ts +13 -68
- package/src/runtime/auth/external-assistant-id.ts +13 -59
- package/src/runtime/auth/route-policy.ts +29 -1
- package/src/runtime/auth/token-service.ts +53 -15
- package/src/runtime/channel-readiness-service.ts +1 -16
- package/src/runtime/http-server.ts +29 -2
- package/src/runtime/middleware/error-handler.ts +1 -9
- package/src/runtime/routes/audio-routes.ts +40 -0
- package/src/runtime/routes/btw-routes.ts +0 -17
- package/src/runtime/routes/conversation-management-routes.ts +0 -36
- package/src/runtime/routes/conversation-query-routes.ts +106 -2
- package/src/runtime/routes/conversation-routes.ts +4 -43
- package/src/runtime/routes/diagnostics-routes.ts +1 -477
- package/src/runtime/routes/identity-routes.ts +18 -29
- package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -33
- package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +1 -1
- package/src/runtime/routes/integrations/vercel.ts +89 -0
- package/src/runtime/routes/log-export-routes.ts +5 -0
- package/src/runtime/routes/memory-item-routes.test.ts +221 -3
- package/src/runtime/routes/memory-item-routes.ts +144 -4
- package/src/runtime/routes/migration-rollback-routes.ts +209 -0
- package/src/runtime/routes/migration-routes.ts +17 -1
- package/src/runtime/routes/notification-routes.ts +58 -0
- package/src/runtime/routes/schedule-routes.ts +65 -0
- package/src/runtime/routes/settings-routes.ts +41 -1
- package/src/runtime/routes/tts-routes.ts +86 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +175 -0
- package/src/runtime/routes/workspace-commit-routes.ts +62 -0
- package/src/runtime/routes/workspace-routes.test.ts +22 -1
- package/src/runtime/routes/workspace-routes.ts +1 -1
- package/src/runtime/routes/workspace-utils.ts +86 -2
- package/src/schedule/schedule-store.ts +0 -21
- package/src/security/ces-credential-client.ts +59 -22
- package/src/security/ces-rpc-credential-backend.ts +85 -0
- package/src/security/credential-backend.ts +12 -88
- package/src/security/keychain-broker-client.ts +10 -2
- package/src/security/secure-keys.ts +94 -113
- package/src/skills/catalog-install.ts +13 -7
- package/src/skills/inline-command-render.ts +5 -1
- package/src/skills/inline-command-runner.ts +30 -2
- package/src/telemetry/usage-telemetry-reporter.ts +4 -2
- package/src/tools/calls/call-start.ts +1 -0
- package/src/tools/executor.ts +0 -4
- package/src/tools/memory/handlers.ts +1 -129
- package/src/tools/network/script-proxy/session-manager.ts +19 -4
- package/src/tools/network/web-fetch.ts +3 -1
- package/src/tools/permission-checker.ts +18 -0
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/skills/load.ts +9 -2
- package/src/tools/types.ts +0 -8
- package/src/util/errors.ts +0 -12
- package/src/util/platform.ts +8 -55
- package/src/util/xml.ts +8 -0
- package/src/workspace/git-service.ts +5 -2
- package/src/workspace/heartbeat-service.ts +5 -24
- package/src/workspace/migrations/001-avatar-rename.ts +15 -0
- package/src/workspace/migrations/003-seed-device-id.ts +17 -1
- package/src/workspace/migrations/004-extract-collect-usage-data.ts +33 -0
- package/src/workspace/migrations/005-add-send-diagnostics.ts +3 -0
- package/src/workspace/migrations/006-services-config.ts +49 -0
- package/src/workspace/migrations/007-web-search-provider-rename.ts +27 -0
- package/src/workspace/migrations/008-voice-timeout-and-max-steps.ts +3 -0
- package/src/workspace/migrations/009-backfill-conversation-disk-view.ts +4 -0
- package/src/workspace/migrations/010-app-dir-rename.ts +78 -0
- package/src/workspace/migrations/011-backfill-installation-id.ts +11 -0
- package/src/workspace/migrations/012-rename-conversation-disk-view-dirs.ts +44 -0
- package/src/workspace/migrations/013-repair-conversation-disk-view.ts +5 -0
- package/src/workspace/migrations/015-migrate-credentials-to-keychain.ts +153 -0
- package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +156 -0
- package/src/workspace/migrations/016-migrate-credentials-from-keychain.ts +150 -0
- package/src/workspace/migrations/017-seed-persona-dirs.ts +95 -0
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +23 -1
- package/src/workspace/migrations/registry.ts +8 -0
- package/src/workspace/migrations/runner.ts +106 -2
- package/src/workspace/migrations/types.ts +4 -0
- package/src/__tests__/archive-recall.test.ts +0 -560
- package/src/__tests__/claude-code-skill-regression.test.ts +0 -206
- package/src/__tests__/claude-code-tool-profiles.test.ts +0 -99
- package/src/__tests__/conversation-memory-dirty-tail.test.ts +0 -150
- package/src/__tests__/conversation-switch-memory-reduction.test.ts +0 -474
- package/src/__tests__/db-memory-archive-migration.test.ts +0 -372
- package/src/__tests__/db-memory-brief-state-migration.test.ts +0 -213
- package/src/__tests__/db-memory-reducer-checkpoints.test.ts +0 -273
- package/src/__tests__/diagnostics-export.test.ts +0 -288
- package/src/__tests__/local-gateway-health.test.ts +0 -209
- package/src/__tests__/memory-brief-open-loops.test.ts +0 -530
- package/src/__tests__/memory-brief-time.test.ts +0 -285
- package/src/__tests__/memory-brief-wrapper.test.ts +0 -311
- package/src/__tests__/memory-chunk-archive.test.ts +0 -400
- package/src/__tests__/memory-chunk-dual-write.test.ts +0 -453
- package/src/__tests__/memory-episode-archive.test.ts +0 -370
- package/src/__tests__/memory-episode-dual-write.test.ts +0 -626
- package/src/__tests__/memory-observation-archive.test.ts +0 -375
- package/src/__tests__/memory-observation-dual-write.test.ts +0 -318
- package/src/__tests__/memory-reducer-job.test.ts +0 -538
- package/src/__tests__/memory-reducer-scheduling.test.ts +0 -473
- package/src/__tests__/memory-reducer-store.test.ts +0 -728
- package/src/__tests__/memory-reducer-types.test.ts +0 -707
- package/src/__tests__/memory-reducer.test.ts +0 -704
- package/src/__tests__/memory-simplified-config.test.ts +0 -281
- package/src/__tests__/secret-ingress-handler.test.ts +0 -120
- package/src/__tests__/simplified-memory-e2e.test.ts +0 -666
- package/src/__tests__/simplified-memory-runtime.test.ts +0 -616
- package/src/__tests__/swarm-conversation-integration.test.ts +0 -358
- package/src/__tests__/swarm-dag-pathological.test.ts +0 -547
- package/src/__tests__/swarm-orchestrator.test.ts +0 -463
- package/src/__tests__/swarm-plan-validator.test.ts +0 -384
- package/src/__tests__/swarm-recursion.test.ts +0 -197
- package/src/__tests__/swarm-router-planner.test.ts +0 -234
- package/src/__tests__/swarm-tool.test.ts +0 -185
- package/src/__tests__/swarm-worker-backend.test.ts +0 -144
- package/src/__tests__/swarm-worker-runner.test.ts +0 -288
- package/src/commands/__tests__/cc-command-registry.test.ts +0 -396
- package/src/commands/cc-command-registry.ts +0 -248
- package/src/config/bundled-skills/claude-code/SKILL.md +0 -53
- package/src/config/bundled-skills/claude-code/TOOLS.json +0 -47
- package/src/config/bundled-skills/claude-code/tools/claude-code.ts +0 -12
- package/src/config/bundled-skills/orchestration/SKILL.md +0 -33
- package/src/config/bundled-skills/orchestration/TOOLS.json +0 -35
- package/src/config/bundled-skills/orchestration/tools/swarm-delegate.ts +0 -12
- package/src/config/schemas/memory-simplified.ts +0 -101
- package/src/config/schemas/swarm.ts +0 -82
- package/src/logfire.ts +0 -135
- package/src/memory/archive-recall.ts +0 -516
- package/src/memory/archive-store.ts +0 -400
- package/src/memory/brief-formatting.ts +0 -33
- package/src/memory/brief-open-loops.ts +0 -266
- package/src/memory/brief-time.ts +0 -162
- package/src/memory/brief.ts +0 -75
- package/src/memory/job-handlers/backfill-simplified-memory.ts +0 -462
- package/src/memory/job-handlers/reduce-conversation-memory.ts +0 -229
- package/src/memory/migrations/185-memory-brief-state.ts +0 -52
- package/src/memory/migrations/186-memory-archive.ts +0 -109
- package/src/memory/migrations/187-memory-reducer-checkpoints.ts +0 -19
- package/src/memory/reducer-scheduler.ts +0 -242
- package/src/memory/reducer-store.ts +0 -271
- package/src/memory/reducer-types.ts +0 -106
- package/src/memory/reducer.ts +0 -467
- package/src/memory/schema/memory-archive.ts +0 -121
- package/src/memory/schema/memory-brief.ts +0 -55
- package/src/runtime/local-gateway-health.ts +0 -275
- package/src/security/secret-ingress.ts +0 -68
- package/src/swarm/backend-claude-code.ts +0 -225
- package/src/swarm/checkpoint.ts +0 -137
- package/src/swarm/graph-utils.ts +0 -53
- package/src/swarm/index.ts +0 -55
- package/src/swarm/limits.ts +0 -66
- package/src/swarm/orchestrator.ts +0 -424
- package/src/swarm/plan-validator.ts +0 -117
- package/src/swarm/router-planner.ts +0 -162
- package/src/swarm/router-prompts.ts +0 -39
- package/src/swarm/synthesizer.ts +0 -81
- package/src/swarm/types.ts +0 -72
- package/src/swarm/worker-backend.ts +0 -131
- package/src/swarm/worker-prompts.ts +0 -80
- package/src/swarm/worker-runner.ts +0 -170
- package/src/tools/claude-code/claude-code.ts +0 -610
- package/src/tools/swarm/delegate.ts +0 -205
package/src/config/env.ts
CHANGED
|
@@ -51,9 +51,15 @@ export function getGatewayPort(): number {
|
|
|
51
51
|
return int("GATEWAY_PORT", DEFAULT_GATEWAY_PORT);
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
/**
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the gateway base URL for internal service-to-service calls.
|
|
56
|
+
*
|
|
57
|
+
* In containerized deployments the gateway runs in a separate container,
|
|
58
|
+
* reachable via `GATEWAY_INTERNAL_URL` (e.g. `http://gateway:7822`).
|
|
59
|
+
* Falls back to `http://127.0.0.1:<GATEWAY_PORT>` for local deployments.
|
|
60
|
+
*/
|
|
55
61
|
export function getGatewayInternalBaseUrl(): string {
|
|
56
|
-
return `http://127.0.0.1:${getGatewayPort()}`;
|
|
62
|
+
return str("GATEWAY_INTERNAL_URL") ?? `http://127.0.0.1:${getGatewayPort()}`;
|
|
57
63
|
}
|
|
58
64
|
|
|
59
65
|
// ── Ingress ──────────────────────────────────────────────────────────────────
|
|
@@ -105,15 +111,8 @@ export function hasUngatedHttpAuthDisabled(): boolean {
|
|
|
105
111
|
|
|
106
112
|
// ── Monitoring ───────────────────────────────────────────────────────────────
|
|
107
113
|
|
|
108
|
-
export function getLogfireToken(): string | undefined {
|
|
109
|
-
return str("LOGFIRE_TOKEN");
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const DEFAULT_SENTRY_DSN =
|
|
113
|
-
"https://db2d38a082e4ee35eeaea08c44b376ec@o4504590528675840.ingest.us.sentry.io/4510874712276992";
|
|
114
|
-
|
|
115
114
|
export function getSentryDsn(): string {
|
|
116
|
-
return str("
|
|
115
|
+
return str("SENTRY_DSN_ASSISTANT") ?? "";
|
|
117
116
|
}
|
|
118
117
|
|
|
119
118
|
// ── Qdrant ───────────────────────────────────────────────────────────────────
|
|
@@ -126,6 +125,10 @@ export function getQdrantHttpPortEnv(): number | undefined {
|
|
|
126
125
|
return int("QDRANT_HTTP_PORT");
|
|
127
126
|
}
|
|
128
127
|
|
|
128
|
+
export function getQdrantReadyzTimeoutMs(): number | undefined {
|
|
129
|
+
return int("QDRANT_READYZ_TIMEOUT_MS");
|
|
130
|
+
}
|
|
131
|
+
|
|
129
132
|
// ── Ollama ───────────────────────────────────────────────────────────────────
|
|
130
133
|
|
|
131
134
|
export function getOllamaBaseUrlEnv(): string | undefined {
|
|
@@ -141,7 +144,7 @@ export function setPlatformBaseUrl(value: string | undefined): void {
|
|
|
141
144
|
}
|
|
142
145
|
|
|
143
146
|
export function getPlatformBaseUrl(): string {
|
|
144
|
-
return str("
|
|
147
|
+
return str("VELLUM_PLATFORM_URL") ?? _platformBaseUrlOverride ?? "";
|
|
145
148
|
}
|
|
146
149
|
|
|
147
150
|
let _platformAssistantIdOverride: string | undefined;
|
|
@@ -199,14 +202,11 @@ export function getPlatformInternalApiKey(): string {
|
|
|
199
202
|
// ── Telemetry ──────────────────────────────────────────────────────────────────
|
|
200
203
|
|
|
201
204
|
export function getTelemetryPlatformUrl(): string {
|
|
202
|
-
return str("TELEMETRY_PLATFORM_URL") ?? "
|
|
205
|
+
return str("TELEMETRY_PLATFORM_URL") ?? "";
|
|
203
206
|
}
|
|
204
207
|
|
|
205
208
|
export function getTelemetryAppToken(): string {
|
|
206
|
-
return (
|
|
207
|
-
str("TELEMETRY_APP_TOKEN") ??
|
|
208
|
-
"e01cf85768cc3617e986f0a7f1966b72e25316526c5db54c8b94a9c3c5c9eaed"
|
|
209
|
-
);
|
|
209
|
+
return str("TELEMETRY_APP_TOKEN") ?? "";
|
|
210
210
|
}
|
|
211
211
|
|
|
212
212
|
// ── Startup validation ──────────────────────────────────────────────────────
|
|
@@ -17,6 +17,14 @@
|
|
|
17
17
|
"description": "Enable user-hosted onboarding flow",
|
|
18
18
|
"defaultEnabled": false
|
|
19
19
|
},
|
|
20
|
+
{
|
|
21
|
+
"id": "platform-hosted-enabled",
|
|
22
|
+
"scope": "macos",
|
|
23
|
+
"key": "platform_hosted_enabled",
|
|
24
|
+
"label": "Platform Hosted Assistants",
|
|
25
|
+
"description": "Enable the Vellum Cloud hosting option on the Hosting screen",
|
|
26
|
+
"defaultEnabled": false
|
|
27
|
+
},
|
|
20
28
|
{
|
|
21
29
|
"id": "contacts",
|
|
22
30
|
"scope": "assistant",
|
|
@@ -25,14 +33,6 @@
|
|
|
25
33
|
"description": "Show the Contacts tab in Settings for viewing and managing contacts",
|
|
26
34
|
"defaultEnabled": true
|
|
27
35
|
},
|
|
28
|
-
{
|
|
29
|
-
"id": "custom-inference-provider",
|
|
30
|
-
"scope": "macos",
|
|
31
|
-
"key": "custom_inference_provider_enabled",
|
|
32
|
-
"label": "Custom Inference Provider",
|
|
33
|
-
"description": "Allow selecting a specific LLM provider and model for inference in Your Own mode",
|
|
34
|
-
"defaultEnabled": false
|
|
35
|
-
},
|
|
36
36
|
{
|
|
37
37
|
"id": "email-channel",
|
|
38
38
|
"scope": "assistant",
|
|
@@ -73,14 +73,6 @@
|
|
|
73
73
|
"description": "Show Component Gallery and Replay Onboarding in the menu bar",
|
|
74
74
|
"defaultEnabled": false
|
|
75
75
|
},
|
|
76
|
-
{
|
|
77
|
-
"id": "logfire",
|
|
78
|
-
"scope": "assistant",
|
|
79
|
-
"key": "feature_flags.logfire.enabled",
|
|
80
|
-
"label": "Logfire LLM Observability",
|
|
81
|
-
"description": "Enable Logfire tracing for LLM request/response telemetry when LOGFIRE_TOKEN is set",
|
|
82
|
-
"defaultEnabled": false
|
|
83
|
-
},
|
|
84
76
|
{
|
|
85
77
|
"id": "ces-tools",
|
|
86
78
|
"scope": "assistant",
|
|
@@ -121,6 +113,14 @@
|
|
|
121
113
|
"description": "Use managed sidecar transport for CES communication when running in a containerized environment",
|
|
122
114
|
"defaultEnabled": false
|
|
123
115
|
},
|
|
116
|
+
{
|
|
117
|
+
"id": "ces-credential-backend",
|
|
118
|
+
"scope": "assistant",
|
|
119
|
+
"key": "feature_flags.ces-credential-backend.enabled",
|
|
120
|
+
"label": "CES Credential Backend",
|
|
121
|
+
"description": "Route credential reads and writes through the CES process instead of accessing the encrypted store directly",
|
|
122
|
+
"defaultEnabled": true
|
|
123
|
+
},
|
|
124
124
|
{
|
|
125
125
|
"id": "settings-billing",
|
|
126
126
|
"scope": "macos",
|
|
@@ -265,6 +265,14 @@
|
|
|
265
265
|
"description": "Show the Embedding service card in Models & Services settings",
|
|
266
266
|
"defaultEnabled": false
|
|
267
267
|
},
|
|
268
|
+
{
|
|
269
|
+
"id": "settings-schedules",
|
|
270
|
+
"scope": "assistant",
|
|
271
|
+
"key": "feature_flags.settings-schedules.enabled",
|
|
272
|
+
"label": "Schedules Settings Tab",
|
|
273
|
+
"description": "Show the Schedules tab in Settings for viewing and managing schedules",
|
|
274
|
+
"defaultEnabled": false
|
|
275
|
+
},
|
|
268
276
|
{
|
|
269
277
|
"id": "quick-input",
|
|
270
278
|
"scope": "macos",
|
|
@@ -296,6 +304,30 @@
|
|
|
296
304
|
"label": "Channel Voice Transcription",
|
|
297
305
|
"description": "Auto-transcribe voice/audio messages received from channels (Telegram, WhatsApp) before processing",
|
|
298
306
|
"defaultEnabled": true
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"id": "sounds",
|
|
310
|
+
"scope": "assistant",
|
|
311
|
+
"key": "feature_flags.sounds.enabled",
|
|
312
|
+
"label": "Sounds",
|
|
313
|
+
"description": "Enable the Sounds tab in Settings and all app sound playback (event sounds, random ambient sounds)",
|
|
314
|
+
"defaultEnabled": true
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
"id": "message-tts",
|
|
318
|
+
"scope": "assistant",
|
|
319
|
+
"key": "feature_flags.message-tts.enabled",
|
|
320
|
+
"label": "Message Text-to-Speech",
|
|
321
|
+
"description": "Show a speaker button on assistant messages to generate and play the message as audio via Fish Audio TTS",
|
|
322
|
+
"defaultEnabled": false
|
|
323
|
+
},
|
|
324
|
+
{
|
|
325
|
+
"id": "backward-releases",
|
|
326
|
+
"scope": "assistant",
|
|
327
|
+
"key": "feature_flags.backward-releases.enabled",
|
|
328
|
+
"label": "Backward Releases",
|
|
329
|
+
"description": "Show older versions in the version picker, allowing rollback to previous releases",
|
|
330
|
+
"defaultEnabled": true
|
|
299
331
|
}
|
|
300
332
|
]
|
|
301
333
|
}
|
package/src/config/loader.ts
CHANGED
|
@@ -2,19 +2,15 @@ import {
|
|
|
2
2
|
existsSync,
|
|
3
3
|
mkdirSync,
|
|
4
4
|
readFileSync,
|
|
5
|
+
renameSync,
|
|
5
6
|
statSync,
|
|
6
7
|
writeFileSync,
|
|
7
8
|
} from "node:fs";
|
|
8
|
-
import { dirname } from "node:path";
|
|
9
|
+
import { dirname, join } from "node:path";
|
|
9
10
|
|
|
10
11
|
import { ConfigError } from "../util/errors.js";
|
|
11
12
|
import { getLogger } from "../util/logger.js";
|
|
12
|
-
import {
|
|
13
|
-
ensureDataDir,
|
|
14
|
-
getWorkspaceConfigPath,
|
|
15
|
-
readLockfile,
|
|
16
|
-
writeLockfile,
|
|
17
|
-
} from "../util/platform.js";
|
|
13
|
+
import { ensureDataDir, getWorkspaceConfigPath } from "../util/platform.js";
|
|
18
14
|
import { AssistantConfigSchema } from "./schema.js";
|
|
19
15
|
import type { AssistantConfig } from "./types.js";
|
|
20
16
|
|
|
@@ -214,6 +210,35 @@ export function deepMergeMissing(
|
|
|
214
210
|
return changed;
|
|
215
211
|
}
|
|
216
212
|
|
|
213
|
+
/**
|
|
214
|
+
* Deep-merge `overrides` into `target`, overwriting leaf values.
|
|
215
|
+
* Recursively merges nested objects; scalars and arrays from `overrides`
|
|
216
|
+
* replace corresponding values in `target`.
|
|
217
|
+
*/
|
|
218
|
+
export function deepMergeOverwrite(
|
|
219
|
+
target: Record<string, unknown>,
|
|
220
|
+
overrides: Record<string, unknown>,
|
|
221
|
+
): void {
|
|
222
|
+
for (const key of Object.keys(overrides)) {
|
|
223
|
+
const ov = overrides[key];
|
|
224
|
+
if (
|
|
225
|
+
ov != null &&
|
|
226
|
+
typeof ov === "object" &&
|
|
227
|
+
!Array.isArray(ov) &&
|
|
228
|
+
target[key] != null &&
|
|
229
|
+
typeof target[key] === "object" &&
|
|
230
|
+
!Array.isArray(target[key])
|
|
231
|
+
) {
|
|
232
|
+
deepMergeOverwrite(
|
|
233
|
+
target[key] as Record<string, unknown>,
|
|
234
|
+
ov as Record<string, unknown>,
|
|
235
|
+
);
|
|
236
|
+
} else {
|
|
237
|
+
target[key] = ov;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
217
242
|
/**
|
|
218
243
|
* Read the existing config.json from disk, merge any missing schema-default
|
|
219
244
|
* keys, and rewrite only when there is an effective change.
|
|
@@ -248,6 +273,72 @@ function backfillConfigDefaults(
|
|
|
248
273
|
}
|
|
249
274
|
}
|
|
250
275
|
|
|
276
|
+
/**
|
|
277
|
+
* Merge default workspace config from the file referenced by
|
|
278
|
+
* VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH into the workspace config on disk.
|
|
279
|
+
*
|
|
280
|
+
* Called once at daemon startup (before the first loadConfig()) so the
|
|
281
|
+
* defaults are persisted to the workspace config file alongside any
|
|
282
|
+
* schema-level defaults that loadConfig() backfills.
|
|
283
|
+
*/
|
|
284
|
+
export function mergeDefaultWorkspaceConfig(): void {
|
|
285
|
+
const defaultConfigPath = process.env.VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH;
|
|
286
|
+
if (!defaultConfigPath || !existsSync(defaultConfigPath)) return;
|
|
287
|
+
|
|
288
|
+
let defaults: unknown;
|
|
289
|
+
try {
|
|
290
|
+
defaults = JSON.parse(readFileSync(defaultConfigPath, "utf-8"));
|
|
291
|
+
} catch (err) {
|
|
292
|
+
log.warn(
|
|
293
|
+
{ err },
|
|
294
|
+
"Failed to read default workspace config from %s",
|
|
295
|
+
defaultConfigPath,
|
|
296
|
+
);
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
if (
|
|
301
|
+
defaults == null ||
|
|
302
|
+
typeof defaults !== "object" ||
|
|
303
|
+
Array.isArray(defaults)
|
|
304
|
+
) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const configPath = getConfigPath();
|
|
309
|
+
let existing: Record<string, unknown> = {};
|
|
310
|
+
if (existsSync(configPath)) {
|
|
311
|
+
try {
|
|
312
|
+
existing = JSON.parse(readFileSync(configPath, "utf-8"));
|
|
313
|
+
} catch {
|
|
314
|
+
// If existing config is corrupt, start fresh
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
deepMergeOverwrite(existing, defaults as Record<string, unknown>);
|
|
319
|
+
|
|
320
|
+
const dir = dirname(configPath);
|
|
321
|
+
if (!existsSync(dir)) {
|
|
322
|
+
mkdirSync(dir, { recursive: true });
|
|
323
|
+
}
|
|
324
|
+
writeFileSync(configPath, JSON.stringify(existing, null, 2) + "\n");
|
|
325
|
+
|
|
326
|
+
// Move the temp file into the workspace directory as a permanent record.
|
|
327
|
+
// This prevents re-application on daemon restart (the env var still points
|
|
328
|
+
// at the old /tmp path which no longer exists).
|
|
329
|
+
try {
|
|
330
|
+
const dest = join(dir, "default-config.json");
|
|
331
|
+
renameSync(defaultConfigPath, dest);
|
|
332
|
+
log.info(
|
|
333
|
+
"Merged default workspace config from %s (archived to %s)",
|
|
334
|
+
defaultConfigPath,
|
|
335
|
+
dest,
|
|
336
|
+
);
|
|
337
|
+
} catch {
|
|
338
|
+
log.info("Merged default workspace config from %s", defaultConfigPath);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
251
342
|
export function loadConfig(): AssistantConfig {
|
|
252
343
|
if (cached) return cached;
|
|
253
344
|
|
|
@@ -375,30 +466,6 @@ export function saveRawConfig(config: Record<string, unknown>): void {
|
|
|
375
466
|
cached = null; // invalidate cache
|
|
376
467
|
}
|
|
377
468
|
|
|
378
|
-
/**
|
|
379
|
-
* Sync client-relevant config values (e.g. platform.baseUrl) to the lockfile
|
|
380
|
-
* so external tools (e.g. vel) can discover them without importing the full
|
|
381
|
-
* config schema. Mirrors the behaviour of `syncConfigToLockfile` in the
|
|
382
|
-
* lightweight CLI (`cli/src/lib/assistant-config.ts`).
|
|
383
|
-
*/
|
|
384
|
-
export function syncConfigToLockfile(): void {
|
|
385
|
-
const configPath = getWorkspaceConfigPath();
|
|
386
|
-
if (!existsSync(configPath)) return;
|
|
387
|
-
|
|
388
|
-
try {
|
|
389
|
-
const raw = JSON.parse(readFileSync(configPath, "utf-8")) as Record<
|
|
390
|
-
string,
|
|
391
|
-
unknown
|
|
392
|
-
>;
|
|
393
|
-
const platform = raw.platform as Record<string, unknown> | undefined;
|
|
394
|
-
const data = readLockfile() ?? {};
|
|
395
|
-
data.platformBaseUrl = (platform?.baseUrl as string) || undefined;
|
|
396
|
-
writeLockfile(data);
|
|
397
|
-
} catch {
|
|
398
|
-
// Config file unreadable — skip sync
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
469
|
export function getNestedValue(
|
|
403
470
|
obj: Record<string, unknown>,
|
|
404
471
|
path: string,
|
package/src/config/schema.ts
CHANGED
|
@@ -40,6 +40,8 @@ export {
|
|
|
40
40
|
ElevenLabsConfigSchema,
|
|
41
41
|
VALID_CONVERSATION_TIMEOUTS,
|
|
42
42
|
} from "./schemas/elevenlabs.js";
|
|
43
|
+
export type { FishAudioConfig } from "./schemas/fish-audio.js";
|
|
44
|
+
export { FishAudioConfigSchema } from "./schemas/fish-audio.js";
|
|
43
45
|
export type { HeartbeatConfig } from "./schemas/heartbeat.js";
|
|
44
46
|
export { HeartbeatConfigSchema } from "./schemas/heartbeat.js";
|
|
45
47
|
export type {
|
|
@@ -106,18 +108,6 @@ export {
|
|
|
106
108
|
MemoryDynamicBudgetConfigSchema,
|
|
107
109
|
MemoryRetrievalConfigSchema,
|
|
108
110
|
} from "./schemas/memory-retrieval.js";
|
|
109
|
-
export type {
|
|
110
|
-
MemorySimplifiedArchiveRecallConfig,
|
|
111
|
-
MemorySimplifiedBriefConfig,
|
|
112
|
-
MemorySimplifiedConfig,
|
|
113
|
-
MemorySimplifiedReducerConfig,
|
|
114
|
-
} from "./schemas/memory-simplified.js";
|
|
115
|
-
export {
|
|
116
|
-
MemorySimplifiedArchiveRecallConfigSchema,
|
|
117
|
-
MemorySimplifiedBriefConfigSchema,
|
|
118
|
-
MemorySimplifiedConfigSchema,
|
|
119
|
-
MemorySimplifiedReducerConfigSchema,
|
|
120
|
-
} from "./schemas/memory-simplified.js";
|
|
121
111
|
export type {
|
|
122
112
|
MemoryEmbeddingsConfig,
|
|
123
113
|
MemorySegmentationConfig,
|
|
@@ -185,8 +175,6 @@ export {
|
|
|
185
175
|
SkillsInstallConfigSchema,
|
|
186
176
|
SkillsLoadConfigSchema,
|
|
187
177
|
} from "./schemas/skills.js";
|
|
188
|
-
export type { SwarmConfig } from "./schemas/swarm.js";
|
|
189
|
-
export { SwarmConfigSchema } from "./schemas/swarm.js";
|
|
190
178
|
export type { RateLimitConfig, TimeoutConfig } from "./schemas/timeouts.js";
|
|
191
179
|
export {
|
|
192
180
|
RateLimitConfigSchema,
|
|
@@ -205,6 +193,7 @@ import {
|
|
|
205
193
|
WhatsAppConfigSchema,
|
|
206
194
|
} from "./schemas/channels.js";
|
|
207
195
|
import { ElevenLabsConfigSchema } from "./schemas/elevenlabs.js";
|
|
196
|
+
import { FishAudioConfigSchema } from "./schemas/fish-audio.js";
|
|
208
197
|
import { HeartbeatConfigSchema } from "./schemas/heartbeat.js";
|
|
209
198
|
import {
|
|
210
199
|
ContextWindowConfigSchema,
|
|
@@ -235,7 +224,6 @@ import {
|
|
|
235
224
|
VALID_INFERENCE_PROVIDERS,
|
|
236
225
|
} from "./schemas/services.js";
|
|
237
226
|
import { SkillsConfigSchema } from "./schemas/skills.js";
|
|
238
|
-
import { SwarmConfigSchema } from "./schemas/swarm.js";
|
|
239
227
|
import {
|
|
240
228
|
RateLimitConfigSchema,
|
|
241
229
|
TimeoutConfigSchema,
|
|
@@ -293,7 +281,6 @@ export const AssistantConfigSchema = z
|
|
|
293
281
|
"Custom pricing overrides for specific provider/model combinations",
|
|
294
282
|
),
|
|
295
283
|
heartbeat: HeartbeatConfigSchema.default(HeartbeatConfigSchema.parse({})),
|
|
296
|
-
swarm: SwarmConfigSchema.default(SwarmConfigSchema.parse({})),
|
|
297
284
|
mcp: McpConfigSchema.default(McpConfigSchema.parse({})),
|
|
298
285
|
acp: AcpConfigSchema.default(AcpConfigSchema.parse({})),
|
|
299
286
|
skills: SkillsConfigSchema.default(SkillsConfigSchema.parse({})),
|
|
@@ -305,6 +292,7 @@ export const AssistantConfigSchema = z
|
|
|
305
292
|
elevenlabs: ElevenLabsConfigSchema.default(
|
|
306
293
|
ElevenLabsConfigSchema.parse({}),
|
|
307
294
|
),
|
|
295
|
+
fishAudio: FishAudioConfigSchema.default(FishAudioConfigSchema.parse({})),
|
|
308
296
|
whatsapp: WhatsAppConfigSchema.default(WhatsAppConfigSchema.parse({})),
|
|
309
297
|
telegram: TelegramConfigSchema.default(TelegramConfigSchema.parse({})),
|
|
310
298
|
slack: SlackConfigSchema.default(SlackConfigSchema.parse({})),
|
|
@@ -315,15 +303,6 @@ export const AssistantConfigSchema = z
|
|
|
315
303
|
NotificationsConfigSchema.parse({}),
|
|
316
304
|
),
|
|
317
305
|
ui: UiConfigSchema.default(UiConfigSchema.parse({})),
|
|
318
|
-
assistantFeatureFlagValues: z
|
|
319
|
-
.record(
|
|
320
|
-
z.string(),
|
|
321
|
-
z.boolean({
|
|
322
|
-
error: "assistantFeatureFlagValues values must be booleans",
|
|
323
|
-
}),
|
|
324
|
-
)
|
|
325
|
-
.optional()
|
|
326
|
-
.describe("Feature flag overrides — map of flag names to boolean values"),
|
|
327
306
|
collectUsageData: z
|
|
328
307
|
.boolean()
|
|
329
308
|
.default(true)
|
|
@@ -6,6 +6,7 @@ export const VALID_CALLER_IDENTITY_MODES = [
|
|
|
6
6
|
"user_number",
|
|
7
7
|
] as const;
|
|
8
8
|
const VALID_CALL_TRANSCRIPTION_PROVIDERS = ["Deepgram", "Google"] as const;
|
|
9
|
+
export const VALID_TTS_PROVIDERS = ["elevenlabs", "fish-audio"] as const;
|
|
9
10
|
|
|
10
11
|
export const CallsDisclosureConfigSchema = z
|
|
11
12
|
.object({
|
|
@@ -57,6 +58,18 @@ export const CallsVoiceConfigSchema = z
|
|
|
57
58
|
})
|
|
58
59
|
.default("Deepgram")
|
|
59
60
|
.describe("Speech-to-text provider used for call transcription"),
|
|
61
|
+
speechModel: z
|
|
62
|
+
.string({ error: "calls.voice.speechModel must be a string" })
|
|
63
|
+
.optional()
|
|
64
|
+
.describe(
|
|
65
|
+
"ASR model to use for speech recognition (e.g. nova-3, nova-2-phonecall for Deepgram; telephony, long for Google)",
|
|
66
|
+
),
|
|
67
|
+
ttsProvider: z
|
|
68
|
+
.enum(VALID_TTS_PROVIDERS, {
|
|
69
|
+
error: `calls.voice.ttsProvider must be one of: ${VALID_TTS_PROVIDERS.join(", ")}`,
|
|
70
|
+
})
|
|
71
|
+
.default("elevenlabs")
|
|
72
|
+
.describe("Text-to-speech provider for phone calls"),
|
|
60
73
|
})
|
|
61
74
|
.describe("Voice and speech settings for phone calls");
|
|
62
75
|
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
export const FishAudioConfigSchema = z
|
|
4
|
+
.object({
|
|
5
|
+
referenceId: z
|
|
6
|
+
.string({ error: "fishAudio.referenceId must be a string" })
|
|
7
|
+
.default("")
|
|
8
|
+
.describe("Fish Audio voice/clone reference ID"),
|
|
9
|
+
chunkLength: z
|
|
10
|
+
.number({ error: "fishAudio.chunkLength must be a number" })
|
|
11
|
+
.int("fishAudio.chunkLength must be an integer")
|
|
12
|
+
.min(100, "fishAudio.chunkLength must be >= 100")
|
|
13
|
+
.max(300, "fishAudio.chunkLength must be <= 300")
|
|
14
|
+
.default(200)
|
|
15
|
+
.describe("Text chunk size for streaming synthesis"),
|
|
16
|
+
format: z
|
|
17
|
+
.enum(["mp3", "wav", "opus"], {
|
|
18
|
+
error: "fishAudio.format must be one of: mp3, wav, opus",
|
|
19
|
+
})
|
|
20
|
+
.default("mp3")
|
|
21
|
+
.describe("Output audio format"),
|
|
22
|
+
latency: z
|
|
23
|
+
.enum(["normal", "balanced"], {
|
|
24
|
+
error: "fishAudio.latency must be one of: normal, balanced",
|
|
25
|
+
})
|
|
26
|
+
.default("normal")
|
|
27
|
+
.describe(
|
|
28
|
+
"Latency/quality tradeoff for Fish Audio S2 synthesis. 'normal' prioritizes lower latency; 'balanced' trades latency for higher quality.",
|
|
29
|
+
),
|
|
30
|
+
speed: z
|
|
31
|
+
.number({ error: "fishAudio.speed must be a number" })
|
|
32
|
+
.min(0.5, "fishAudio.speed must be >= 0.5")
|
|
33
|
+
.max(2.0, "fishAudio.speed must be <= 2.0")
|
|
34
|
+
.default(1.0)
|
|
35
|
+
.describe("Playback speed multiplier (0.5 = slower, 2.0 = faster)"),
|
|
36
|
+
})
|
|
37
|
+
.describe("Fish Audio text-to-speech configuration");
|
|
38
|
+
|
|
39
|
+
export type FishAudioConfig = z.infer<typeof FishAudioConfigSchema>;
|
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
MemorySummarizationConfigSchema,
|
|
11
11
|
} from "./memory-processing.js";
|
|
12
12
|
import { MemoryRetrievalConfigSchema } from "./memory-retrieval.js";
|
|
13
|
-
import { MemorySimplifiedConfigSchema } from "./memory-simplified.js";
|
|
14
13
|
import {
|
|
15
14
|
MemoryEmbeddingsConfigSchema,
|
|
16
15
|
MemorySegmentationConfigSchema,
|
|
@@ -46,9 +45,6 @@ export const MemoryConfigSchema = z
|
|
|
46
45
|
summarization: MemorySummarizationConfigSchema.default(
|
|
47
46
|
MemorySummarizationConfigSchema.parse({}),
|
|
48
47
|
),
|
|
49
|
-
simplified: MemorySimplifiedConfigSchema.default(
|
|
50
|
-
MemorySimplifiedConfigSchema.parse({}),
|
|
51
|
-
),
|
|
52
48
|
})
|
|
53
49
|
.describe(
|
|
54
50
|
"Long-term memory system — stores, retrieves, and manages persistent knowledge across conversations",
|
|
@@ -43,7 +43,7 @@ export const DaemonConfigSchema = z
|
|
|
43
43
|
.number({ error: "daemon.titleGenerationMaxTokens must be a number" })
|
|
44
44
|
.int("daemon.titleGenerationMaxTokens must be an integer")
|
|
45
45
|
.positive("daemon.titleGenerationMaxTokens must be a positive integer")
|
|
46
|
-
.default(
|
|
46
|
+
.default(50)
|
|
47
47
|
.describe(
|
|
48
48
|
"Maximum number of tokens for auto-generated conversation titles",
|
|
49
49
|
),
|
|
@@ -50,10 +50,6 @@ export const SecretDetectionConfigSchema = z
|
|
|
50
50
|
.describe(
|
|
51
51
|
"Whether to allow sending a detected secret once (with user confirmation) before redacting future occurrences",
|
|
52
52
|
),
|
|
53
|
-
blockIngress: z
|
|
54
|
-
.boolean({ error: "secretDetection.blockIngress must be a boolean" })
|
|
55
|
-
.default(true)
|
|
56
|
-
.describe("Whether to block secrets in incoming ingress messages"),
|
|
57
53
|
customPatterns: z
|
|
58
54
|
.array(CustomSecretPatternSchema)
|
|
59
55
|
.optional()
|
|
@@ -77,6 +73,10 @@ export const PermissionsConfigSchema = z
|
|
|
77
73
|
.describe(
|
|
78
74
|
"Permission mode — 'strict' requires explicit approval for all operations, 'workspace' allows operations within the workspace",
|
|
79
75
|
),
|
|
76
|
+
dangerouslySkipPermissions: z
|
|
77
|
+
.boolean({ error: "permissions.dangerouslySkipPermissions must be a boolean" })
|
|
78
|
+
.default(false)
|
|
79
|
+
.describe("Auto-accept all permission prompts without asking"),
|
|
80
80
|
})
|
|
81
81
|
.describe("Permission enforcement mode for tool operations");
|
|
82
82
|
|
package/src/config/types.ts
CHANGED
|
@@ -28,6 +28,36 @@ function escapeLike(value: string): string {
|
|
|
28
28
|
return value.replace(/%/g, "").replace(/_/g, "");
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
/**
|
|
32
|
+
* Generate a collision-free slugified filename for a contact's per-user persona file.
|
|
33
|
+
* Produces filenames like "alice.md", "alice-2.md", "alice-3.md", etc.
|
|
34
|
+
*/
|
|
35
|
+
export function generateUserFileSlug(displayName: string): string {
|
|
36
|
+
const slug =
|
|
37
|
+
displayName
|
|
38
|
+
.toLowerCase()
|
|
39
|
+
.replace(/[^a-z0-9]+/g, "-")
|
|
40
|
+
.replace(/^-+|-+$/g, "")
|
|
41
|
+
.slice(0, 50) || "user";
|
|
42
|
+
|
|
43
|
+
const db = getDb();
|
|
44
|
+
const rows = db
|
|
45
|
+
.select({ userFile: contacts.userFile })
|
|
46
|
+
.from(contacts)
|
|
47
|
+
.where(like(contacts.userFile, `${escapeLike(slug)}%`))
|
|
48
|
+
.all();
|
|
49
|
+
|
|
50
|
+
const taken = new Set(rows.map((r) => r.userFile));
|
|
51
|
+
|
|
52
|
+
const base = `${slug}.md`;
|
|
53
|
+
if (!taken.has(base)) return base;
|
|
54
|
+
|
|
55
|
+
for (let i = 2; ; i++) {
|
|
56
|
+
const candidate = `${slug}-${i}.md`;
|
|
57
|
+
if (!taken.has(candidate)) return candidate;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
31
61
|
function parseContact(row: typeof contacts.$inferSelect): Contact {
|
|
32
62
|
return {
|
|
33
63
|
id: row.id,
|
|
@@ -40,6 +70,7 @@ function parseContact(row: typeof contacts.$inferSelect): Contact {
|
|
|
40
70
|
role: row.role as Contact["role"],
|
|
41
71
|
contactType: (row.contactType as Contact["contactType"]) ?? "human",
|
|
42
72
|
principalId: row.principalId,
|
|
73
|
+
userFile: row.userFile ?? null,
|
|
43
74
|
};
|
|
44
75
|
}
|
|
45
76
|
|
|
@@ -148,6 +179,7 @@ export function upsertContact(params: {
|
|
|
148
179
|
role?: ContactRole;
|
|
149
180
|
contactType?: ContactType;
|
|
150
181
|
principalId?: string | null;
|
|
182
|
+
userFile?: string | null;
|
|
151
183
|
channels?: SyncChannelData[];
|
|
152
184
|
/** When true, conflicting channels on other contacts are reassigned to this
|
|
153
185
|
* contact instead of being skipped. Used by invite redemption to bind a
|
|
@@ -177,6 +209,7 @@ export function upsertContact(params: {
|
|
|
177
209
|
updateSet.contactType = params.contactType;
|
|
178
210
|
if (params.principalId !== undefined)
|
|
179
211
|
updateSet.principalId = params.principalId;
|
|
212
|
+
if (params.userFile !== undefined) updateSet.userFile = params.userFile;
|
|
180
213
|
|
|
181
214
|
db.update(contacts)
|
|
182
215
|
.set(updateSet)
|
|
@@ -224,6 +257,7 @@ export function upsertContact(params: {
|
|
|
224
257
|
updateSet.contactType = params.contactType;
|
|
225
258
|
if (params.principalId !== undefined)
|
|
226
259
|
updateSet.principalId = params.principalId;
|
|
260
|
+
if (params.userFile !== undefined) updateSet.userFile = params.userFile;
|
|
227
261
|
|
|
228
262
|
db.update(contacts)
|
|
229
263
|
.set(updateSet)
|
|
@@ -239,6 +273,10 @@ export function upsertContact(params: {
|
|
|
239
273
|
|
|
240
274
|
// Create new contact
|
|
241
275
|
contactId = contactId ?? uuid();
|
|
276
|
+
const userFileValue =
|
|
277
|
+
params.userFile !== undefined
|
|
278
|
+
? params.userFile
|
|
279
|
+
: generateUserFileSlug(params.displayName);
|
|
242
280
|
db.insert(contacts)
|
|
243
281
|
.values({
|
|
244
282
|
id: contactId,
|
|
@@ -247,6 +285,7 @@ export function upsertContact(params: {
|
|
|
247
285
|
role: params.role ?? "contact",
|
|
248
286
|
contactType: params.contactType ?? "human",
|
|
249
287
|
principalId: params.principalId ?? null,
|
|
288
|
+
userFile: userFileValue ?? null,
|
|
250
289
|
createdAt: now,
|
|
251
290
|
updatedAt: now,
|
|
252
291
|
})
|
package/src/contacts/types.ts
CHANGED