@vellumai/assistant 0.5.6 → 0.5.8
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 +3 -2
- package/README.md +0 -2
- package/bun.lock +0 -414
- package/docker-entrypoint.sh +9 -0
- package/docs/architecture/keychain-broker.md +45 -240
- package/docs/architecture/memory.md +13 -11
- 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/error.ts +1 -1
- package/node_modules/@vellumai/ces-contracts/src/grants.ts +1 -1
- package/node_modules/@vellumai/ces-contracts/src/handles.ts +1 -1
- package/node_modules/@vellumai/ces-contracts/src/index.ts +1 -1
- package/node_modules/@vellumai/ces-contracts/src/rpc.ts +120 -1
- 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 +0 -114
- package/src/__tests__/approval-cascade.test.ts +0 -1
- package/src/__tests__/assistant-feature-flags-integration.test.ts +30 -29
- package/src/__tests__/browser-fill-credential.test.ts +1 -1
- package/src/__tests__/browser-skill-endstate.test.ts +6 -5
- package/src/__tests__/btw-routes.test.ts +0 -39
- package/src/__tests__/call-controller.test.ts +0 -1
- package/src/__tests__/call-domain.test.ts +0 -128
- package/src/__tests__/ces-rpc-credential-backend.test.ts +199 -0
- package/src/__tests__/ces-startup-timeout.test.ts +40 -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 -2
- package/src/__tests__/config-schema.test.ts +3 -1
- package/src/__tests__/conversation-abort-tool-results.test.ts +0 -1
- package/src/__tests__/conversation-agent-loop-overflow.test.ts +0 -2
- package/src/__tests__/conversation-agent-loop.test.ts +2 -4
- package/src/__tests__/conversation-attention-telegram.test.ts +0 -5
- package/src/__tests__/conversation-confirmation-signals.test.ts +0 -1
- package/src/__tests__/conversation-error.test.ts +15 -1
- package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
- package/src/__tests__/conversation-messaging-secret-redirect.test.ts +1 -1
- package/src/__tests__/conversation-pre-run-repair.test.ts +0 -1
- package/src/__tests__/conversation-provider-retry-repair.test.ts +0 -1
- package/src/__tests__/conversation-queue.test.ts +0 -1
- package/src/__tests__/conversation-skill-tools.test.ts +0 -54
- package/src/__tests__/conversation-slash-queue.test.ts +0 -1
- package/src/__tests__/conversation-slash-unknown.test.ts +0 -1
- package/src/__tests__/conversation-title-service.test.ts +87 -0
- package/src/__tests__/conversation-workspace-injection.test.ts +0 -1
- package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -1
- package/src/__tests__/credential-execution-client.test.ts +5 -2
- package/src/__tests__/credential-execution-feature-gates.test.ts +59 -30
- package/src/__tests__/credential-execution-managed-contract.test.ts +35 -20
- package/src/__tests__/credential-security-e2e.test.ts +1 -67
- package/src/__tests__/credential-security-invariants.test.ts +6 -50
- package/src/__tests__/credentials-cli.test.ts +82 -3
- package/src/__tests__/daemon-credential-client.test.ts +123 -0
- package/src/__tests__/db-migration-rollback.test.ts +2015 -1
- package/src/__tests__/deterministic-verification-control-plane.test.ts +1 -0
- package/src/__tests__/docker-signing-key-bootstrap.test.ts +34 -143
- package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +6 -4
- package/src/__tests__/gateway-client-managed-outbound.test.ts +79 -1
- 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__/journal-context.test.ts +335 -0
- package/src/__tests__/keychain-broker-client.test.ts +161 -22
- package/src/__tests__/memory-context-benchmark.benchmark.test.ts +0 -3
- package/src/__tests__/memory-jobs-worker-backoff.test.ts +150 -0
- package/src/__tests__/memory-lifecycle-e2e.test.ts +70 -25
- package/src/__tests__/memory-recall-quality.test.ts +48 -17
- package/src/__tests__/memory-regressions.test.ts +408 -363
- package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -3
- 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 +2 -7
- package/src/__tests__/notification-decision-fallback.test.ts +4 -0
- package/src/__tests__/notification-decision-identity.test.ts +4 -0
- package/src/__tests__/notification-decision-strategy.test.ts +71 -0
- package/src/__tests__/oauth-cli.test.ts +5 -1
- package/src/__tests__/permission-types.test.ts +1 -0
- package/src/__tests__/provider-commit-message-generator.test.ts +0 -37
- package/src/__tests__/provider-error-scenarios.test.ts +0 -267
- package/src/__tests__/provider-managed-proxy-integration.test.ts +5 -6
- package/src/__tests__/provider-streaming.benchmark.test.ts +2 -81
- package/src/__tests__/qdrant-manager.test.ts +28 -2
- package/src/__tests__/registry.test.ts +0 -6
- package/src/__tests__/relay-server.test.ts +1 -2
- package/src/__tests__/runtime-attachment-metadata.test.ts +0 -4
- package/src/__tests__/script-proxy-injection-runtime.test.ts +1 -1
- package/src/__tests__/secret-onetime-send.test.ts +1 -1
- package/src/__tests__/secret-routes-managed-proxy.test.ts +0 -4
- package/src/__tests__/secure-keys.test.ts +95 -272
- 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-memory.test.ts +17 -3
- 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__/stale-approval-dedup.test.ts +171 -0
- package/src/__tests__/stt-hints.test.ts +437 -0
- package/src/__tests__/suggestion-routes.test.ts +1 -32
- package/src/__tests__/system-prompt.test.ts +0 -1
- package/src/__tests__/task-memory-cleanup.test.ts +14 -0
- package/src/__tests__/tool-executor-shell-integration.test.ts +5 -3
- package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -5
- package/src/__tests__/trusted-contact-multichannel.test.ts +0 -4
- package/src/__tests__/twilio-routes-twiml.test.ts +139 -1
- 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-quality.test.ts +58 -0
- package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -7
- 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 +220 -0
- package/src/__tests__/workspace-migration-down-functions.test.ts +1009 -0
- package/src/__tests__/workspace-migrations-runner.test.ts +114 -0
- package/src/acp/agent-process.ts +9 -1
- package/src/agent/loop.ts +1 -1
- package/src/approvals/guardian-request-resolvers.ts +164 -38
- package/src/calls/__tests__/tts-text-sanitizer.test.ts +254 -0
- package/src/calls/audio-store.test.ts +97 -0
- package/src/calls/audio-store.ts +205 -0
- package/src/calls/call-controller.ts +90 -8
- package/src/calls/call-domain.ts +3 -0
- package/src/calls/call-store.ts +10 -3
- package/src/calls/fish-audio-client.ts +129 -0
- package/src/calls/relay-server.ts +27 -0
- package/src/calls/stt-hints.ts +189 -0
- package/src/calls/tts-text-sanitizer.ts +61 -0
- package/src/calls/twilio-routes.ts +34 -5
- package/src/calls/types.ts +1 -0
- package/src/calls/voice-ingress-preflight.ts +0 -42
- package/src/calls/voice-quality.ts +38 -5
- package/src/calls/voice-session-bridge.ts +7 -12
- package/src/cli/commands/avatar.ts +2 -2
- package/src/cli/commands/config.ts +1 -4
- package/src/cli/commands/credentials.ts +128 -82
- package/src/cli/commands/doctor.ts +2 -2
- package/src/cli/commands/keys.ts +7 -7
- package/src/cli/commands/memory.ts +1 -1
- package/src/cli/commands/oauth/connections.ts +11 -29
- package/src/cli/commands/oauth/index.ts +7 -0
- package/src/cli/commands/oauth/platform.ts +525 -0
- package/src/cli/commands/platform.ts +3 -3
- package/src/cli/lib/daemon-credential-client.ts +284 -0
- package/src/cli.ts +1 -1
- package/src/config/assistant-feature-flags.ts +186 -5
- package/src/config/bundled-skills/AGENTS.md +34 -0
- package/src/config/bundled-skills/acp/SKILL.md +10 -0
- package/src/config/bundled-skills/app-builder/SKILL.md +0 -4
- package/src/config/bundled-skills/messaging/SKILL.md +5 -5
- package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +2 -2
- package/src/config/bundled-skills/phone-calls/TOOLS.json +4 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +1 -0
- package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +1 -0
- package/src/config/bundled-skills/settings/SKILL.md +15 -2
- package/src/config/bundled-skills/settings/TOOLS.json +47 -2
- package/src/config/bundled-skills/settings/tools/avatar-remove.ts +59 -0
- package/src/config/bundled-skills/settings/tools/avatar-update.ts +80 -0
- package/src/config/bundled-skills/settings/tools/voice-config-update.ts +42 -0
- package/src/config/bundled-skills/slack/SKILL.md +1 -1
- package/src/config/bundled-tool-registry.ts +5 -11
- package/src/config/defaults.ts +0 -2
- package/src/config/env-registry.ts +5 -5
- package/src/config/env.ts +21 -14
- package/src/config/feature-flag-registry.json +49 -9
- package/src/config/loader.ts +106 -42
- package/src/config/schema.ts +9 -29
- package/src/config/schemas/calls.ts +30 -0
- package/src/config/schemas/fish-audio.ts +39 -0
- package/src/config/schemas/inference.ts +2 -2
- package/src/config/schemas/journal.ts +16 -0
- package/src/config/schemas/memory-processing.ts +2 -2
- package/src/config/schemas/security.ts +0 -4
- package/src/config/types.ts +1 -1
- package/src/contacts/contact-store.ts +39 -0
- package/src/contacts/types.ts +2 -0
- 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/credential-execution/startup-timeout.ts +36 -0
- package/src/daemon/approval-generators.ts +3 -9
- package/src/daemon/assistant-attachments.ts +9 -0
- package/src/daemon/config-watcher.ts +5 -0
- package/src/daemon/conversation-error.ts +13 -1
- package/src/daemon/conversation-memory.ts +1 -2
- package/src/daemon/conversation-process.ts +18 -1
- package/src/daemon/conversation-surfaces.ts +30 -1
- package/src/daemon/conversation-tool-setup.ts +0 -105
- package/src/daemon/conversation.ts +21 -1
- package/src/daemon/guardian-action-generators.ts +3 -9
- package/src/daemon/handlers/config-vercel.ts +92 -0
- package/src/daemon/handlers/skills.ts +2 -15
- package/src/daemon/install-symlink.ts +195 -0
- package/src/daemon/lifecycle.ts +234 -51
- package/src/daemon/message-types/conversations.ts +4 -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 +32 -95
- package/src/events/domain-events.ts +2 -1
- package/src/inbound/platform-callback-registration.ts +3 -3
- package/src/instrument.ts +8 -5
- package/src/memory/app-store.ts +31 -0
- package/src/memory/conversation-title-service.ts +50 -1
- package/src/memory/db-init.ts +16 -0
- package/src/memory/indexer.ts +19 -10
- package/src/memory/items-extractor.ts +328 -321
- package/src/memory/job-handlers/conversation-starters.ts +4 -1
- package/src/memory/job-handlers/summarization.ts +26 -16
- package/src/memory/jobs-store.ts +63 -6
- package/src/memory/jobs-worker.ts +31 -7
- package/src/memory/journal-memory.ts +214 -0
- 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/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/193-add-source-type-columns.ts +81 -0
- package/src/memory/migrations/index.ts +5 -0
- package/src/memory/migrations/registry.ts +98 -0
- package/src/memory/migrations/validate-migration-state.ts +137 -11
- package/src/memory/qdrant-circuit-breaker.ts +9 -0
- package/src/memory/qdrant-manager.ts +64 -7
- package/src/memory/retriever.test.ts +37 -25
- package/src/memory/retriever.ts +24 -49
- package/src/memory/schema/calls.ts +1 -0
- package/src/memory/schema/contacts.ts +1 -0
- package/src/memory/schema/memory-core.ts +2 -0
- package/src/memory/search/formatting.ts +7 -44
- package/src/memory/search/staleness.ts +4 -0
- package/src/memory/search/tier-classifier.ts +10 -2
- package/src/memory/search/types.ts +2 -5
- package/src/memory/task-memory-cleanup.ts +4 -3
- package/src/notifications/adapters/slack.ts +168 -6
- package/src/notifications/broadcaster.ts +1 -0
- package/src/notifications/copy-composer.ts +59 -2
- package/src/notifications/decision-engine.ts +4 -1
- package/src/notifications/signal.ts +2 -0
- package/src/notifications/types.ts +2 -0
- package/src/oauth/connection-resolver.ts +6 -4
- package/src/permissions/checker.ts +0 -38
- package/src/permissions/shell-identity.ts +76 -22
- package/src/permissions/types.ts +4 -2
- package/src/platform/client.ts +35 -7
- package/src/prompts/journal-context.ts +133 -0
- package/src/prompts/persona-resolver.ts +194 -0
- package/src/prompts/system-prompt.ts +44 -4
- package/src/prompts/templates/SOUL.md +10 -0
- package/src/prompts/templates/users/default.md +1 -0
- package/src/providers/provider-send-message.ts +3 -32
- package/src/providers/registry.ts +29 -179
- package/src/providers/types.ts +1 -1
- package/src/runtime/access-request-helper.ts +4 -0
- 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/__tests__/guard-tests.test.ts +9 -50
- package/src/runtime/auth/external-assistant-id.ts +13 -59
- package/src/runtime/auth/route-policy.ts +17 -1
- package/src/runtime/auth/token-service.ts +43 -138
- package/src/runtime/channel-readiness-service.ts +1 -16
- package/src/runtime/gateway-client.ts +47 -4
- package/src/runtime/guardian-decision-types.ts +45 -4
- package/src/runtime/http-server.ts +31 -3
- package/src/runtime/middleware/error-handler.ts +1 -9
- package/src/runtime/routes/access-request-decision.ts +2 -2
- package/src/runtime/routes/app-management-routes.ts +2 -1
- package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +219 -30
- package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +37 -14
- package/src/runtime/routes/audio-routes.ts +40 -0
- package/src/runtime/routes/btw-routes.ts +0 -17
- package/src/runtime/routes/channel-readiness-routes.ts +9 -4
- package/src/runtime/routes/conversation-query-routes.ts +63 -1
- package/src/runtime/routes/conversation-routes.ts +4 -44
- package/src/runtime/routes/debug-routes.ts +12 -9
- package/src/runtime/routes/diagnostics-routes.ts +1 -477
- package/src/runtime/routes/guardian-approval-interception.ts +168 -11
- package/src/runtime/routes/guardian-approval-prompt.ts +6 -1
- package/src/runtime/routes/guardian-approval-reply-helpers.ts +103 -21
- package/src/runtime/routes/identity-routes.ts +19 -30
- package/src/runtime/routes/inbound-message-handler.ts +31 -1
- package/src/runtime/routes/inbound-stages/acl-enforcement.ts +64 -5
- package/src/runtime/routes/inbound-stages/background-dispatch.ts +52 -40
- 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/twilio.ts +52 -10
- 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 +3 -3
- package/src/runtime/routes/memory-item-routes.ts +46 -14
- 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/secret-routes.ts +141 -10
- package/src/runtime/routes/settings-routes.ts +41 -1
- package/src/runtime/routes/tts-routes.ts +96 -0
- package/src/runtime/routes/upgrade-broadcast-routes.ts +26 -2
- 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/security/ces-credential-client.ts +75 -29
- package/src/security/ces-rpc-credential-backend.ts +86 -0
- package/src/security/credential-backend.ts +22 -92
- package/src/security/keychain-broker-client.ts +10 -2
- package/src/security/secure-keys.ts +113 -115
- package/src/skills/catalog-install.ts +6 -32
- package/src/skills/skill-memory.ts +1 -0
- package/src/subagent/manager.ts +2 -5
- package/src/telemetry/usage-telemetry-reporter.ts +4 -2
- package/src/tools/acp/spawn.ts +78 -1
- package/src/tools/calls/call-start.ts +1 -0
- package/src/tools/credentials/vault.ts +5 -3
- package/src/tools/executor.ts +0 -4
- package/src/tools/memory/definitions.ts +3 -2
- package/src/tools/memory/handlers.ts +10 -7
- package/src/tools/network/script-proxy/session-manager.ts +19 -4
- package/src/tools/network/web-fetch.ts +3 -1
- package/src/tools/skills/execute.ts +1 -1
- package/src/tools/terminal/safe-env.ts +1 -0
- package/src/tools/types.ts +0 -8
- package/src/util/browser.ts +15 -0
- package/src/util/errors.ts +0 -12
- package/src/util/platform.ts +4 -51
- package/src/workspace/git-service.ts +5 -2
- 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 +96 -0
- package/src/workspace/migrations/018-rekey-compound-credential-keys.ts +184 -0
- package/src/workspace/migrations/019-scope-journal-to-guardian.ts +103 -0
- package/src/workspace/migrations/migrate-to-workspace-volume.ts +27 -5
- package/src/workspace/migrations/registry.ts +12 -0
- package/src/workspace/migrations/runner.ts +106 -2
- package/src/workspace/migrations/types.ts +4 -0
- package/src/workspace/provider-commit-message-generator.ts +12 -21
- 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__/diagnostics-export.test.ts +0 -288
- package/src/__tests__/local-gateway-health.test.ts +0 -209
- package/src/__tests__/provider-fail-open-selection.test.ts +0 -271
- package/src/__tests__/provider-failover-actual-provider.test.ts +0 -66
- package/src/__tests__/secret-ingress-handler.test.ts +0 -120
- 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/swarm.ts +0 -82
- package/src/logfire.ts +0 -135
- package/src/memory/search/lexical.ts +0 -48
- package/src/providers/failover.ts +0 -186
- 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
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitizes text for TTS synthesis by stripping markdown formatting and emojis.
|
|
3
|
+
*
|
|
4
|
+
* Preserves arithmetic expressions (e.g. `5 * 3`), identifiers with underscores
|
|
5
|
+
* (e.g. `my_var`), and Fish Audio S2 bracket annotations (e.g. `[laughter]`).
|
|
6
|
+
*/
|
|
7
|
+
export function sanitizeForTts(text: string): string {
|
|
8
|
+
let result = text;
|
|
9
|
+
|
|
10
|
+
// 1. Markdown links: [text](url) → text
|
|
11
|
+
// Only matches the full [...](...) pattern — plain brackets like
|
|
12
|
+
// Fish Audio S2 annotations ([laughter], [breath]) pass through.
|
|
13
|
+
// Handles one level of balanced parentheses in URLs (e.g. Wikipedia links).
|
|
14
|
+
result = result.replace(
|
|
15
|
+
/\[([^\]]+)\]\([^()]*(?:\([^()]*\))*[^()]*\)/g,
|
|
16
|
+
"$1",
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
// 2. Bold+italic: ***text*** or ___text___ → text
|
|
20
|
+
result = result.replace(/\*{3}(.+?)\*{3}/g, "$1");
|
|
21
|
+
result = result.replace(/_{3}(.+?)_{3}/g, "$1");
|
|
22
|
+
|
|
23
|
+
// 3. Bold: **text** or __text__ → text
|
|
24
|
+
result = result.replace(/\*{2}(.+?)\*{2}/g, "$1");
|
|
25
|
+
result = result.replace(/_{2}(.+?)_{2}/g, "$1");
|
|
26
|
+
|
|
27
|
+
// 4. Code fences: strip ```...``` fences but keep content
|
|
28
|
+
// Must run before header stripping so # comments inside code blocks are preserved.
|
|
29
|
+
result = result.replace(/```[^\n]*\n([\s\S]*?)```\n?/g, "$1");
|
|
30
|
+
|
|
31
|
+
// 5. Headers: strip leading # characters at line starts
|
|
32
|
+
result = result.replace(/^#{1,6}\s+/gm, "");
|
|
33
|
+
|
|
34
|
+
// 6. Inline code: strip single backticks
|
|
35
|
+
result = result.replace(/`([^`]+)`/g, "$1");
|
|
36
|
+
|
|
37
|
+
// 7. Bullet markers: strip `- ` or `* ` at line starts
|
|
38
|
+
// Must run before italic stripping so `* item` is treated as a bullet.
|
|
39
|
+
result = result.replace(/^[-*]\s+/gm, "");
|
|
40
|
+
|
|
41
|
+
// 8. Italic: *text* or _text_ → text
|
|
42
|
+
// Word-boundary-aware to preserve arithmetic like `5 * 3` and identifiers like `my_var`.
|
|
43
|
+
result = result.replace(/(?<!\w)\*([^*]+)\*(?!\w)/g, "$1");
|
|
44
|
+
result = result.replace(/(?<!\w)_([^_]+)_(?!\w)/g, "$1");
|
|
45
|
+
|
|
46
|
+
// 9. Emojis: strip extended pictographic characters, variation selectors,
|
|
47
|
+
// zero-width joiners, skin tone modifiers, and regional indicator symbols (flags).
|
|
48
|
+
result = result.replace(/[\u200D\uFE00-\uFE0F]/gu, "");
|
|
49
|
+
result = result.replace(/[\u{1F3FB}-\u{1F3FF}]/gu, "");
|
|
50
|
+
result = result.replace(/\p{Extended_Pictographic}/gu, "");
|
|
51
|
+
result = result.replace(/[\u{1F1E6}-\u{1F1FF}]/gu, "");
|
|
52
|
+
|
|
53
|
+
// 10. Collapse whitespace: multiple spaces → single space,
|
|
54
|
+
// multiple blank lines → single newline.
|
|
55
|
+
// Does NOT trim trailing whitespace — callers handle trimming so that
|
|
56
|
+
// streaming chunks preserve inter-word spaces (e.g. "Hello " + "world").
|
|
57
|
+
result = result.replace(/ {2,}/g, " ");
|
|
58
|
+
result = result.replace(/\n{3,}/g, "\n\n");
|
|
59
|
+
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
@@ -26,6 +26,7 @@ import {
|
|
|
26
26
|
releaseCallbackClaim,
|
|
27
27
|
updateCallSession,
|
|
28
28
|
} from "./call-store.js";
|
|
29
|
+
import { resolveCallHints } from "./stt-hints.js";
|
|
29
30
|
import type { CallStatus } from "./types.js";
|
|
30
31
|
import { resolveVoiceQualityProfile } from "./voice-quality.js";
|
|
31
32
|
|
|
@@ -49,11 +50,14 @@ export function generateTwiML(
|
|
|
49
50
|
profile: {
|
|
50
51
|
language: string;
|
|
51
52
|
transcriptionProvider: string;
|
|
53
|
+
speechModel?: string;
|
|
52
54
|
ttsProvider: string;
|
|
53
55
|
voice: string;
|
|
56
|
+
interruptSensitivity: string;
|
|
54
57
|
},
|
|
55
58
|
relayToken?: string,
|
|
56
59
|
customParameters?: Record<string, string>,
|
|
60
|
+
hints?: string,
|
|
57
61
|
): string {
|
|
58
62
|
const greetingAttr =
|
|
59
63
|
welcomeGreeting && welcomeGreeting.trim().length > 0
|
|
@@ -91,10 +95,11 @@ export function generateTwiML(
|
|
|
91
95
|
${greetingAttr}
|
|
92
96
|
voice="${escapeXml(profile.voice)}"
|
|
93
97
|
language="${escapeXml(profile.language)}"
|
|
94
|
-
transcriptionProvider="${escapeXml(profile.transcriptionProvider)}"
|
|
98
|
+
transcriptionProvider="${escapeXml(profile.transcriptionProvider)}"${profile.speechModel ? `\n speechModel="${escapeXml(profile.speechModel)}"` : ""}
|
|
95
99
|
ttsProvider="${escapeXml(profile.ttsProvider)}"
|
|
96
100
|
interruptible="true"
|
|
97
101
|
dtmfDetection="true"
|
|
102
|
+
interruptSensitivity="${escapeXml(profile.interruptSensitivity)}"${hints ? `\n hints="${escapeXml(hints)}"` : ""}
|
|
98
103
|
${relayClose}
|
|
99
104
|
</Connect>
|
|
100
105
|
</Response>`;
|
|
@@ -179,7 +184,14 @@ export async function handleVoiceWebhook(req: Request): Promise<Response> {
|
|
|
179
184
|
|
|
180
185
|
return buildVoiceWebhookTwiml(
|
|
181
186
|
session.id,
|
|
182
|
-
|
|
187
|
+
{
|
|
188
|
+
task: session.task,
|
|
189
|
+
toNumber: callerTo,
|
|
190
|
+
fromNumber: callerFrom,
|
|
191
|
+
direction: "inbound",
|
|
192
|
+
inviteFriendName: null,
|
|
193
|
+
inviteGuardianName: null,
|
|
194
|
+
},
|
|
183
195
|
session.verificationSessionId,
|
|
184
196
|
);
|
|
185
197
|
}
|
|
@@ -207,7 +219,14 @@ export async function handleVoiceWebhook(req: Request): Promise<Response> {
|
|
|
207
219
|
|
|
208
220
|
return buildVoiceWebhookTwiml(
|
|
209
221
|
callSessionId,
|
|
210
|
-
|
|
222
|
+
{
|
|
223
|
+
task: session.task,
|
|
224
|
+
toNumber: session.toNumber,
|
|
225
|
+
fromNumber: session.fromNumber,
|
|
226
|
+
direction: "outbound",
|
|
227
|
+
inviteFriendName: session.inviteFriendName,
|
|
228
|
+
inviteGuardianName: session.inviteGuardianName,
|
|
229
|
+
},
|
|
211
230
|
session.verificationSessionId,
|
|
212
231
|
);
|
|
213
232
|
}
|
|
@@ -224,18 +243,27 @@ export async function handleVoiceWebhook(req: Request): Promise<Response> {
|
|
|
224
243
|
*/
|
|
225
244
|
function buildVoiceWebhookTwiml(
|
|
226
245
|
callSessionId: string,
|
|
227
|
-
|
|
246
|
+
sessionContext: {
|
|
247
|
+
task: string | null;
|
|
248
|
+
toNumber: string;
|
|
249
|
+
fromNumber: string;
|
|
250
|
+
direction: "inbound" | "outbound";
|
|
251
|
+
inviteFriendName: string | null;
|
|
252
|
+
inviteGuardianName: string | null;
|
|
253
|
+
} | null,
|
|
228
254
|
verificationSessionId?: string | null,
|
|
229
255
|
): Response {
|
|
230
256
|
const profile = resolveVoiceQualityProfile(loadConfig());
|
|
231
257
|
|
|
258
|
+
const hints = resolveCallHints(sessionContext, profile.hints);
|
|
259
|
+
|
|
232
260
|
log.info(
|
|
233
261
|
{ callSessionId, ttsProvider: profile.ttsProvider, voice: profile.voice },
|
|
234
262
|
"Voice quality profile resolved",
|
|
235
263
|
);
|
|
236
264
|
|
|
237
265
|
const relayUrl = getTwilioRelayUrl(loadConfig());
|
|
238
|
-
const welcomeGreeting = buildWelcomeGreeting(task);
|
|
266
|
+
const welcomeGreeting = buildWelcomeGreeting(sessionContext?.task ?? null);
|
|
239
267
|
|
|
240
268
|
const relayToken = mintEdgeRelayToken();
|
|
241
269
|
|
|
@@ -252,6 +280,7 @@ function buildVoiceWebhookTwiml(
|
|
|
252
280
|
profile,
|
|
253
281
|
relayToken,
|
|
254
282
|
customParameters,
|
|
283
|
+
hints || undefined,
|
|
255
284
|
);
|
|
256
285
|
|
|
257
286
|
log.info({ callSessionId }, "Returning ConversationRelay TwiML");
|
package/src/calls/types.ts
CHANGED
|
@@ -75,6 +75,7 @@ export interface CallSession {
|
|
|
75
75
|
inviteGuardianName: string | null;
|
|
76
76
|
callerIdentityMode: string | null;
|
|
77
77
|
callerIdentitySource: string | null;
|
|
78
|
+
skipDisclosure: boolean;
|
|
78
79
|
initiatedFromConversationId?: string | null;
|
|
79
80
|
startedAt: number | null;
|
|
80
81
|
endedAt: number | null;
|
|
@@ -29,18 +29,6 @@ function fail(error: string): VoiceIngressPreflightFailure {
|
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
function buildGatewayUnhealthyMessage(
|
|
33
|
-
target: string,
|
|
34
|
-
error: string | undefined,
|
|
35
|
-
afterRecoveryAttempt: boolean,
|
|
36
|
-
): string {
|
|
37
|
-
const detail = error ?? "Unknown gateway health check failure";
|
|
38
|
-
if (afterRecoveryAttempt) {
|
|
39
|
-
return `Voice callback gateway is still unhealthy at ${target} after a local recovery attempt: ${detail}`;
|
|
40
|
-
}
|
|
41
|
-
return `Voice callback gateway is unhealthy at ${target}: ${detail}`;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
32
|
export async function preflightVoiceIngress(): Promise<VoiceIngressPreflightResult> {
|
|
45
33
|
const ingressConfig = loadConfig();
|
|
46
34
|
|
|
@@ -65,36 +53,6 @@ export async function preflightVoiceIngress(): Promise<VoiceIngressPreflightResu
|
|
|
65
53
|
);
|
|
66
54
|
}
|
|
67
55
|
|
|
68
|
-
const { ensureLocalGatewayReady, probeLocalGatewayHealth } =
|
|
69
|
-
await import("../runtime/local-gateway-health.js");
|
|
70
|
-
|
|
71
|
-
const initialHealth = await probeLocalGatewayHealth();
|
|
72
|
-
if (!initialHealth.healthy && !initialHealth.localDeployment) {
|
|
73
|
-
return fail(
|
|
74
|
-
buildGatewayUnhealthyMessage(
|
|
75
|
-
initialHealth.target,
|
|
76
|
-
initialHealth.error,
|
|
77
|
-
false,
|
|
78
|
-
),
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (initialHealth.localDeployment) {
|
|
83
|
-
const recovery = await ensureLocalGatewayReady();
|
|
84
|
-
// Re-probe after the wake flow so the dial path only continues when the
|
|
85
|
-
// current gateway process is demonstrably serving the callback stack.
|
|
86
|
-
const confirmedHealth = await probeLocalGatewayHealth();
|
|
87
|
-
if (!confirmedHealth.healthy) {
|
|
88
|
-
return fail(
|
|
89
|
-
buildGatewayUnhealthyMessage(
|
|
90
|
-
confirmedHealth.target,
|
|
91
|
-
confirmedHealth.error ?? recovery.error,
|
|
92
|
-
recovery.recoveryAttempted,
|
|
93
|
-
),
|
|
94
|
-
);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
56
|
return {
|
|
99
57
|
ok: true,
|
|
100
58
|
ingressConfig: {
|
|
@@ -3,8 +3,11 @@ import { loadConfig } from "../config/loader.js";
|
|
|
3
3
|
export interface VoiceQualityProfile {
|
|
4
4
|
language: string;
|
|
5
5
|
transcriptionProvider: string;
|
|
6
|
+
speechModel?: string;
|
|
6
7
|
ttsProvider: string;
|
|
7
8
|
voice: string;
|
|
9
|
+
interruptSensitivity: string;
|
|
10
|
+
hints: string[];
|
|
8
11
|
}
|
|
9
12
|
|
|
10
13
|
/**
|
|
@@ -42,19 +45,49 @@ export function buildElevenLabsVoiceSpec(config: {
|
|
|
42
45
|
/**
|
|
43
46
|
* Resolve the effective voice quality profile from config.
|
|
44
47
|
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
+
* Supports ElevenLabs (default) and Fish Audio TTS providers.
|
|
49
|
+
* When Fish Audio is selected, `ttsProvider` is set to `"Google"` as a
|
|
50
|
+
* placeholder — ConversationRelay requires a valid provider in TwiML, but
|
|
51
|
+
* actual audio is delivered via `play` messages from the call-controller.
|
|
52
|
+
* The voice string is left empty since it is unused in that mode.
|
|
53
|
+
*
|
|
54
|
+
* For ElevenLabs, the voice ID comes from the shared `elevenlabs.voiceId`
|
|
55
|
+
* config (defaults to Amelia — ZF6FPAbjXT4488VcRRnw).
|
|
48
56
|
*/
|
|
49
57
|
export function resolveVoiceQualityProfile(
|
|
50
58
|
config?: ReturnType<typeof loadConfig>,
|
|
51
59
|
): VoiceQualityProfile {
|
|
52
60
|
const cfg = config ?? loadConfig();
|
|
53
61
|
const voice = cfg.calls.voice;
|
|
62
|
+
const configuredTts = voice.ttsProvider ?? "elevenlabs";
|
|
63
|
+
const fishAudio = configuredTts === "fish-audio";
|
|
64
|
+
const isGoogle = voice.transcriptionProvider === "Google";
|
|
65
|
+
// Treat the legacy Deepgram default ("nova-3") as unset when provider is
|
|
66
|
+
// Google — upgraded workspaces may still have it persisted from prior defaults.
|
|
67
|
+
const effectiveSpeechModel =
|
|
68
|
+
voice.speechModel == null ||
|
|
69
|
+
(voice.speechModel === "nova-3" && isGoogle)
|
|
70
|
+
? isGoogle
|
|
71
|
+
? undefined
|
|
72
|
+
: "nova-3"
|
|
73
|
+
: voice.speechModel;
|
|
54
74
|
return {
|
|
55
75
|
language: voice.language,
|
|
56
76
|
transcriptionProvider: voice.transcriptionProvider,
|
|
57
|
-
|
|
58
|
-
|
|
77
|
+
speechModel: effectiveSpeechModel,
|
|
78
|
+
ttsProvider: fishAudio ? "Google" : "ElevenLabs",
|
|
79
|
+
voice: fishAudio ? "" : buildElevenLabsVoiceSpec(cfg.elevenlabs),
|
|
80
|
+
interruptSensitivity: voice.interruptSensitivity ?? "low",
|
|
81
|
+
hints: voice.hints ?? [],
|
|
59
82
|
};
|
|
60
83
|
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Check whether Fish Audio TTS is configured for phone calls.
|
|
87
|
+
*/
|
|
88
|
+
export function isFishAudioTts(
|
|
89
|
+
config?: ReturnType<typeof loadConfig>,
|
|
90
|
+
): boolean {
|
|
91
|
+
const cfg = config ?? loadConfig();
|
|
92
|
+
return cfg.calls.voice?.ttsProvider === "fish-audio";
|
|
93
|
+
}
|
|
@@ -20,9 +20,7 @@ import type { ServerMessage } from "../daemon/message-protocol.js";
|
|
|
20
20
|
import { buildAssistantEvent } from "../runtime/assistant-event.js";
|
|
21
21
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
22
22
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
|
|
23
|
-
import { checkIngressForSecrets } from "../security/secret-ingress.js";
|
|
24
23
|
import { computeToolApprovalDigest } from "../security/tool-approval-digest.js";
|
|
25
|
-
import { IngressBlockedError } from "../util/errors.js";
|
|
26
24
|
import { getLogger } from "../util/logger.js";
|
|
27
25
|
import {
|
|
28
26
|
CALL_OPENING_MARKER,
|
|
@@ -95,6 +93,8 @@ export interface VoiceTurnOptions {
|
|
|
95
93
|
isInbound: boolean;
|
|
96
94
|
/** The outbound call task, if any. */
|
|
97
95
|
task?: string | null;
|
|
96
|
+
/** When true, skip the disclosure announcement for this call. */
|
|
97
|
+
skipDisclosure?: boolean;
|
|
98
98
|
/** Called for each streaming text token from the agent loop. */
|
|
99
99
|
onTextDelta: (text: string) => void;
|
|
100
100
|
/** Called when the agent loop completes a full response. */
|
|
@@ -128,9 +128,11 @@ function buildVoiceCallControlPrompt(opts: {
|
|
|
128
128
|
isInbound: boolean;
|
|
129
129
|
task?: string | null;
|
|
130
130
|
isCallerGuardian?: boolean;
|
|
131
|
+
skipDisclosure?: boolean;
|
|
131
132
|
}): string {
|
|
132
133
|
const config = getConfig();
|
|
133
|
-
const disclosureEnabled =
|
|
134
|
+
const disclosureEnabled =
|
|
135
|
+
config.calls?.disclosure?.enabled === true && !opts.skipDisclosure;
|
|
134
136
|
const disclosureText = config.calls?.disclosure?.text?.trim();
|
|
135
137
|
const disclosureRule =
|
|
136
138
|
disclosureEnabled && disclosureText
|
|
@@ -210,6 +212,7 @@ function buildVoiceCallControlPrompt(opts: {
|
|
|
210
212
|
lines.push(
|
|
211
213
|
"9. After the opening greeting turn, treat the Task field as background context only — do not re-execute its instructions on subsequent turns.",
|
|
212
214
|
'10. Do not make up information. If you are unsure, use [ASK_GUARDIAN: your question] to consult your guardian. For tool permission requests, use [ASK_GUARDIAN_APPROVAL: {"question":"...","toolName":"...","input":{...}}].',
|
|
215
|
+
`11. Your text is sent directly to a text-to-speech engine. Never use markdown formatting (asterisks, headers, backticks, links) or emojis in your spoken responses. Write plain conversational text only. Protocol markers like ${opts.isCallerGuardian ? "[END_CALL]" : "[ASK_GUARDIAN: ...] and [END_CALL]"} are not spoken text and should still be used normally.`,
|
|
213
216
|
"</voice_call_control>",
|
|
214
217
|
);
|
|
215
218
|
|
|
@@ -240,15 +243,6 @@ export async function startVoiceTurn(
|
|
|
240
243
|
);
|
|
241
244
|
}
|
|
242
245
|
|
|
243
|
-
// Block inbound content that contains secrets
|
|
244
|
-
const ingressCheck = checkIngressForSecrets(opts.content);
|
|
245
|
-
if (ingressCheck.blocked) {
|
|
246
|
-
throw new IngressBlockedError(
|
|
247
|
-
ingressCheck.userNotice!,
|
|
248
|
-
ingressCheck.detectedTypes,
|
|
249
|
-
);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
246
|
const eventSink: VoiceRunEventSink = {
|
|
253
247
|
onTextDelta: opts.onTextDelta,
|
|
254
248
|
onMessageComplete: opts.onComplete,
|
|
@@ -286,6 +280,7 @@ export async function startVoiceTurn(
|
|
|
286
280
|
isInbound: opts.isInbound,
|
|
287
281
|
task: opts.task,
|
|
288
282
|
isCallerGuardian,
|
|
283
|
+
skipDisclosure: opts.skipDisclosure,
|
|
289
284
|
});
|
|
290
285
|
|
|
291
286
|
// Get or create the conversation
|
|
@@ -11,9 +11,9 @@ import {
|
|
|
11
11
|
} from "../../avatar/traits-png-sync.js";
|
|
12
12
|
import { setPlatformBaseUrl } from "../../config/env.js";
|
|
13
13
|
import { credentialKey } from "../../security/credential-key.js";
|
|
14
|
-
import { getSecureKeyAsync } from "../../security/secure-keys.js";
|
|
15
14
|
import { generateAndSaveAvatar } from "../../tools/system/avatar-generator.js";
|
|
16
15
|
import { getWorkspaceDir } from "../../util/platform.js";
|
|
16
|
+
import { getSecureKeyViaDaemon } from "../lib/daemon-credential-client.js";
|
|
17
17
|
import { log } from "../logger.js";
|
|
18
18
|
import { writeOutput } from "../output.js";
|
|
19
19
|
|
|
@@ -74,7 +74,7 @@ Examples:
|
|
|
74
74
|
// without the daemon's in-memory state.
|
|
75
75
|
try {
|
|
76
76
|
const key = credentialKey("vellum", "platform_base_url");
|
|
77
|
-
const persisted = await
|
|
77
|
+
const persisted = await getSecureKeyViaDaemon(key);
|
|
78
78
|
if (persisted) {
|
|
79
79
|
setPlatformBaseUrl(persisted);
|
|
80
80
|
}
|
|
@@ -6,7 +6,6 @@ import {
|
|
|
6
6
|
loadRawConfig,
|
|
7
7
|
saveRawConfig,
|
|
8
8
|
setNestedValue,
|
|
9
|
-
syncConfigToLockfile,
|
|
10
9
|
} from "../../config/loader.js";
|
|
11
10
|
import { AssistantConfigSchema } from "../../config/schema.js";
|
|
12
11
|
import { getSchemaAtPath } from "../../config/schema-utils.js";
|
|
@@ -73,8 +72,7 @@ Arguments:
|
|
|
73
72
|
true, "42" becomes number 42). Falls back to plain string if JSON
|
|
74
73
|
parsing fails.
|
|
75
74
|
|
|
76
|
-
After writing the value to config.json, the
|
|
77
|
-
to reflect the updated configuration.
|
|
75
|
+
After writing the value to config.json, the change takes effect immediately.
|
|
78
76
|
|
|
79
77
|
To manage API keys, use "assistant keys set <provider> <key>" instead.
|
|
80
78
|
|
|
@@ -93,7 +91,6 @@ Examples:
|
|
|
93
91
|
}
|
|
94
92
|
setNestedValue(raw, key, parsed);
|
|
95
93
|
saveRawConfig(raw);
|
|
96
|
-
syncConfigToLockfile();
|
|
97
94
|
log.info(`Set ${key} = ${JSON.stringify(parsed)}`);
|
|
98
95
|
});
|
|
99
96
|
|