@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/daemon/lifecycle.ts
CHANGED
|
@@ -7,7 +7,6 @@ import { reconcileCallsOnStartup } from "../calls/call-recovery.js";
|
|
|
7
7
|
import { setRelayBroadcast } from "../calls/relay-server.js";
|
|
8
8
|
import { TwilioConversationRelayProvider } from "../calls/twilio-provider.js";
|
|
9
9
|
import { setVoiceBridgeDeps } from "../calls/voice-session-bridge.js";
|
|
10
|
-
import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
|
|
11
10
|
import {
|
|
12
11
|
getQdrantHttpPortEnv,
|
|
13
12
|
getQdrantUrlEnv,
|
|
@@ -16,12 +15,23 @@ import {
|
|
|
16
15
|
setIngressPublicBaseUrl,
|
|
17
16
|
validateEnv,
|
|
18
17
|
} from "../config/env.js";
|
|
19
|
-
import { loadConfig } from "../config/loader.js";
|
|
18
|
+
import { loadConfig, mergeDefaultWorkspaceConfig } from "../config/loader.js";
|
|
19
|
+
import type { AssistantConfig } from "../config/schema.js";
|
|
20
|
+
import type { CesClient } from "../credential-execution/client.js";
|
|
21
|
+
import { createCesClient } from "../credential-execution/client.js";
|
|
22
|
+
import {
|
|
23
|
+
isCesCredentialBackendEnabled,
|
|
24
|
+
isCesToolsEnabled,
|
|
25
|
+
} from "../credential-execution/feature-gates.js";
|
|
26
|
+
import {
|
|
27
|
+
type CesProcessManager,
|
|
28
|
+
CesUnavailableError,
|
|
29
|
+
createCesProcessManager,
|
|
30
|
+
} from "../credential-execution/process-manager.js";
|
|
20
31
|
import { HeartbeatService } from "../heartbeat/heartbeat-service.js";
|
|
21
32
|
import { getHookManager } from "../hooks/manager.js";
|
|
22
33
|
import { installTemplates } from "../hooks/templates.js";
|
|
23
34
|
import { closeSentry, initSentry, setSentryDeviceId } from "../instrument.js";
|
|
24
|
-
import { disableLogfire, initLogfire } from "../logfire.js";
|
|
25
35
|
import { getMcpServerManager } from "../mcp/manager.js";
|
|
26
36
|
import * as attachmentsStore from "../memory/attachments-store.js";
|
|
27
37
|
import { expireAllPendingCanonicalRequests } from "../memory/canonical-guardian-store.js";
|
|
@@ -30,7 +40,6 @@ import {
|
|
|
30
40
|
getConversationType,
|
|
31
41
|
getMessages,
|
|
32
42
|
purgePrivateConversations,
|
|
33
|
-
sweepStaleReducerJobs,
|
|
34
43
|
} from "../memory/conversation-crud.js";
|
|
35
44
|
import { resolveConversationId } from "../memory/conversation-key-store.js";
|
|
36
45
|
import { initializeDb } from "../memory/db.js";
|
|
@@ -52,17 +61,19 @@ import { backfillManualTokenConnections } from "../oauth/manual-token-connection
|
|
|
52
61
|
import { seedOAuthProviders } from "../oauth/seed-providers.js";
|
|
53
62
|
import { ensurePromptFiles } from "../prompts/system-prompt.js";
|
|
54
63
|
import { syncUpdateBulletinOnStartup } from "../prompts/update-bulletin.js";
|
|
64
|
+
import { resolveManagedProxyContext } from "../providers/managed-proxy/context.js";
|
|
55
65
|
import { buildAssistantEvent } from "../runtime/assistant-event.js";
|
|
56
66
|
import { assistantEventHub } from "../runtime/assistant-event-hub.js";
|
|
57
67
|
import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
|
|
58
68
|
import {
|
|
59
69
|
initAuthSigningKey,
|
|
60
|
-
loadOrCreateSigningKey,
|
|
61
70
|
mintPairingBearerToken,
|
|
71
|
+
resolveSigningKey,
|
|
62
72
|
} from "../runtime/auth/token-service.js";
|
|
63
73
|
import { ensureVellumGuardianBinding } from "../runtime/guardian-vellum-migration.js";
|
|
64
74
|
import { RuntimeHttpServer } from "../runtime/http-server.js";
|
|
65
75
|
import { startScheduler } from "../schedule/scheduler.js";
|
|
76
|
+
import { setCesClient } from "../security/secure-keys.js";
|
|
66
77
|
import { seedCatalogSkillMemories } from "../skills/skill-memory.js";
|
|
67
78
|
import { UsageTelemetryReporter } from "../telemetry/usage-telemetry-reporter.js";
|
|
68
79
|
import { getDeviceId } from "../util/device-id.js";
|
|
@@ -102,6 +113,7 @@ import {
|
|
|
102
113
|
switchConversation,
|
|
103
114
|
undoLastMessage,
|
|
104
115
|
} from "./handlers/conversations.js";
|
|
116
|
+
import { installAssistantSymlink } from "./install-symlink.js";
|
|
105
117
|
import type { ServerMessage } from "./message-protocol.js";
|
|
106
118
|
import {
|
|
107
119
|
initializeProvidersAndTools,
|
|
@@ -130,6 +142,103 @@ function loadDotEnv(): void {
|
|
|
130
142
|
dotenvConfig({ path: join(getRootDir(), ".env"), quiet: true });
|
|
131
143
|
}
|
|
132
144
|
|
|
145
|
+
export interface CesStartupResult {
|
|
146
|
+
client: CesClient | undefined;
|
|
147
|
+
processManager: CesProcessManager | undefined;
|
|
148
|
+
clientPromise: Promise<CesClient | undefined> | undefined;
|
|
149
|
+
abortController: AbortController | undefined;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Start the CES (Credential Execution Service) process and perform the RPC
|
|
154
|
+
* handshake. Returns a promise that resolves with the CES client and process
|
|
155
|
+
* manager. Callers can fire-and-forget — the daemon does not need to await
|
|
156
|
+
* this for startup to continue.
|
|
157
|
+
*
|
|
158
|
+
* The managed sidecar accepts exactly one bootstrap connection, so this must
|
|
159
|
+
* be called at the process level (not per-conversation).
|
|
160
|
+
*/
|
|
161
|
+
export async function startCesProcess(
|
|
162
|
+
config: AssistantConfig,
|
|
163
|
+
): Promise<CesStartupResult> {
|
|
164
|
+
const shouldStartCes = isCesToolsEnabled(config) || isCesCredentialBackendEnabled(config);
|
|
165
|
+
if (!shouldStartCes) {
|
|
166
|
+
return {
|
|
167
|
+
client: undefined,
|
|
168
|
+
processManager: undefined,
|
|
169
|
+
clientPromise: undefined,
|
|
170
|
+
abortController: undefined,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const pm = createCesProcessManager({ assistantConfig: config });
|
|
175
|
+
const abortController = new AbortController();
|
|
176
|
+
let clientRef: CesClient | undefined;
|
|
177
|
+
|
|
178
|
+
const clientPromise = (async (): Promise<CesClient | undefined> => {
|
|
179
|
+
try {
|
|
180
|
+
const transport = await pm.start();
|
|
181
|
+
if (abortController.signal.aborted) {
|
|
182
|
+
throw new Error("CES initialization aborted during shutdown");
|
|
183
|
+
}
|
|
184
|
+
const client = createCesClient(transport);
|
|
185
|
+
clientRef = client;
|
|
186
|
+
// Resolve the assistant API key so CES can use it for platform
|
|
187
|
+
// credential materialisation. In managed mode the key is provisioned
|
|
188
|
+
// after hatch and stored in the credential store — CES can't read
|
|
189
|
+
// the env var, so we pass it via the handshake.
|
|
190
|
+
const proxyCtx = await resolveManagedProxyContext();
|
|
191
|
+
const { accepted, reason } = await client.handshake(
|
|
192
|
+
proxyCtx.assistantApiKey
|
|
193
|
+
? { assistantApiKey: proxyCtx.assistantApiKey }
|
|
194
|
+
: undefined,
|
|
195
|
+
);
|
|
196
|
+
if (abortController.signal.aborted) {
|
|
197
|
+
client.close();
|
|
198
|
+
throw new Error("CES initialization aborted during shutdown");
|
|
199
|
+
}
|
|
200
|
+
if (accepted) {
|
|
201
|
+
log.info(
|
|
202
|
+
"CES client initialized and handshake accepted (server-level)",
|
|
203
|
+
);
|
|
204
|
+
return client;
|
|
205
|
+
}
|
|
206
|
+
log.warn(
|
|
207
|
+
{ reason },
|
|
208
|
+
"CES handshake rejected — CES tools will be unavailable",
|
|
209
|
+
);
|
|
210
|
+
client.close();
|
|
211
|
+
clientRef = undefined;
|
|
212
|
+
await pm.stop();
|
|
213
|
+
return undefined;
|
|
214
|
+
} catch (err) {
|
|
215
|
+
if (err instanceof CesUnavailableError) {
|
|
216
|
+
log.info(
|
|
217
|
+
{ reason: err.message },
|
|
218
|
+
"CES is not available — CES tools will be unavailable",
|
|
219
|
+
);
|
|
220
|
+
} else {
|
|
221
|
+
log.warn(
|
|
222
|
+
{ error: err instanceof Error ? err.message : String(err) },
|
|
223
|
+
"Failed to initialize CES client — CES tools will be unavailable",
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
await pm.stop().catch(() => {});
|
|
227
|
+
clientRef = undefined;
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
})();
|
|
231
|
+
|
|
232
|
+
return {
|
|
233
|
+
get client() {
|
|
234
|
+
return clientRef;
|
|
235
|
+
},
|
|
236
|
+
processManager: pm,
|
|
237
|
+
clientPromise,
|
|
238
|
+
abortController,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
|
|
133
242
|
// Entry point for the daemon process itself
|
|
134
243
|
export async function runDaemon(): Promise<void> {
|
|
135
244
|
loadDotEnv();
|
|
@@ -141,14 +250,12 @@ export async function runDaemon(): Promise<void> {
|
|
|
141
250
|
// closeSentry() if the user has disabled it.
|
|
142
251
|
initSentry();
|
|
143
252
|
|
|
144
|
-
await initLogfire();
|
|
145
|
-
|
|
146
253
|
ensureDataDir();
|
|
147
254
|
|
|
148
255
|
// Load (or generate + persist) the auth signing key so tokens survive
|
|
149
256
|
// daemon restarts. Must happen after ensureDataDir() creates the
|
|
150
257
|
// protected directory.
|
|
151
|
-
const signingKey =
|
|
258
|
+
const signingKey = resolveSigningKey();
|
|
152
259
|
initAuthSigningKey(signingKey);
|
|
153
260
|
|
|
154
261
|
seedInterfaceFiles();
|
|
@@ -164,9 +271,19 @@ export async function runDaemon(): Promise<void> {
|
|
|
164
271
|
initializeDb();
|
|
165
272
|
// Seed well-known OAuth provider configurations (insert-if-not-exists)
|
|
166
273
|
seedOAuthProviders();
|
|
274
|
+
log.info("Daemon startup: DB initialized");
|
|
275
|
+
|
|
276
|
+
await runWorkspaceMigrations(getWorkspaceDir(), WORKSPACE_MIGRATIONS);
|
|
277
|
+
log.info("Daemon startup: workspace migrations complete");
|
|
278
|
+
|
|
167
279
|
// Backfill oauth_connection rows for manual-token providers (Telegram,
|
|
168
280
|
// Slack channel) that already have keychain credentials from before the
|
|
169
281
|
// oauth_connection migration. Safe to call on every startup.
|
|
282
|
+
//
|
|
283
|
+
// Must run AFTER workspace migrations so that migration 015 (which copies
|
|
284
|
+
// encrypted-store credentials to the keychain) has already executed.
|
|
285
|
+
// Otherwise syncManualTokenConnection sees no keychain credentials and
|
|
286
|
+
// incorrectly removes existing connection rows.
|
|
170
287
|
try {
|
|
171
288
|
await backfillManualTokenConnections();
|
|
172
289
|
} catch (err) {
|
|
@@ -175,10 +292,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
175
292
|
"Manual-token connection backfill failed — continuing startup",
|
|
176
293
|
);
|
|
177
294
|
}
|
|
178
|
-
log.info("Daemon startup: DB initialized");
|
|
179
|
-
|
|
180
|
-
await runWorkspaceMigrations(getWorkspaceDir(), WORKSPACE_MIGRATIONS);
|
|
181
|
-
log.info("Daemon startup: workspace migrations complete");
|
|
182
295
|
|
|
183
296
|
// Now that workspace migrations have run (including 003-seed-device-id
|
|
184
297
|
// which may copy the legacy installationId into device.json), it is safe
|
|
@@ -213,40 +326,16 @@ export async function runDaemon(): Promise<void> {
|
|
|
213
326
|
targetId: summaryId,
|
|
214
327
|
});
|
|
215
328
|
}
|
|
216
|
-
for (const obsId of deletedMemory.deletedObservationIds) {
|
|
217
|
-
enqueueMemoryJob("delete_qdrant_vectors", {
|
|
218
|
-
targetType: "observation",
|
|
219
|
-
targetId: obsId,
|
|
220
|
-
});
|
|
221
|
-
}
|
|
222
|
-
for (const chunkId of deletedMemory.deletedChunkIds) {
|
|
223
|
-
enqueueMemoryJob("delete_qdrant_vectors", {
|
|
224
|
-
targetType: "chunk",
|
|
225
|
-
targetId: chunkId,
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
for (const episodeId of deletedMemory.deletedEpisodeIds) {
|
|
229
|
-
enqueueMemoryJob("delete_qdrant_vectors", {
|
|
230
|
-
targetType: "episode",
|
|
231
|
-
targetId: episodeId,
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
329
|
if (
|
|
235
330
|
deletedMemory.segmentIds.length > 0 ||
|
|
236
331
|
deletedMemory.orphanedItemIds.length > 0 ||
|
|
237
|
-
deletedMemory.deletedSummaryIds.length > 0
|
|
238
|
-
deletedMemory.deletedObservationIds.length > 0 ||
|
|
239
|
-
deletedMemory.deletedChunkIds.length > 0 ||
|
|
240
|
-
deletedMemory.deletedEpisodeIds.length > 0
|
|
332
|
+
deletedMemory.deletedSummaryIds.length > 0
|
|
241
333
|
) {
|
|
242
334
|
log.info(
|
|
243
335
|
{
|
|
244
336
|
segments: deletedMemory.segmentIds.length,
|
|
245
337
|
orphanedItems: deletedMemory.orphanedItemIds.length,
|
|
246
338
|
deletedSummaries: deletedMemory.deletedSummaryIds.length,
|
|
247
|
-
deletedObservations: deletedMemory.deletedObservationIds.length,
|
|
248
|
-
deletedChunks: deletedMemory.deletedChunkIds.length,
|
|
249
|
-
deletedEpisodes: deletedMemory.deletedEpisodeIds.length,
|
|
250
339
|
},
|
|
251
340
|
"Enqueued Qdrant vector cleanup jobs for purged private conversations",
|
|
252
341
|
);
|
|
@@ -271,24 +360,6 @@ export async function runDaemon(): Promise<void> {
|
|
|
271
360
|
);
|
|
272
361
|
}
|
|
273
362
|
|
|
274
|
-
// Sweep dirty conversations whose tail messages are already past the
|
|
275
|
-
// idle delay — they should have been reduced while the daemon was down.
|
|
276
|
-
// Enqueue immediate reducer jobs so the memory worker picks them up.
|
|
277
|
-
try {
|
|
278
|
-
const sweepCount = sweepStaleReducerJobs();
|
|
279
|
-
if (sweepCount > 0) {
|
|
280
|
-
log.info(
|
|
281
|
-
{ sweepCount },
|
|
282
|
-
`Enqueued reducer jobs for ${sweepCount} stale dirty conversation(s)`,
|
|
283
|
-
);
|
|
284
|
-
}
|
|
285
|
-
} catch (err) {
|
|
286
|
-
log.warn(
|
|
287
|
-
{ err },
|
|
288
|
-
"Startup sweep for stale reducer jobs failed — continuing startup",
|
|
289
|
-
);
|
|
290
|
-
}
|
|
291
|
-
|
|
292
363
|
// Ensure a vellum guardian binding exists so the identity system works
|
|
293
364
|
// without requiring a manual bootstrap step.
|
|
294
365
|
try {
|
|
@@ -333,6 +404,11 @@ export async function runDaemon(): Promise<void> {
|
|
|
333
404
|
log.warn({ err }, "Call recovery failed — continuing startup");
|
|
334
405
|
}
|
|
335
406
|
|
|
407
|
+
// Merge CLI-provided default config (from VELLUM_DEFAULT_WORKSPACE_CONFIG_PATH)
|
|
408
|
+
// into the workspace config file before the first loadConfig() call so
|
|
409
|
+
// onboarding preferences are persisted alongside schema defaults.
|
|
410
|
+
mergeDefaultWorkspaceConfig();
|
|
411
|
+
|
|
336
412
|
log.info("Daemon startup: loading config");
|
|
337
413
|
const config = loadConfig();
|
|
338
414
|
|
|
@@ -373,16 +449,34 @@ export async function runDaemon(): Promise<void> {
|
|
|
373
449
|
log.info("Usage telemetry reporter started");
|
|
374
450
|
}
|
|
375
451
|
|
|
376
|
-
//
|
|
377
|
-
//
|
|
378
|
-
//
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
452
|
+
// CES lifecycle — kick off early so CES handshake runs concurrently with
|
|
453
|
+
// provider/tool initialization. The CES sidecar accepts exactly one
|
|
454
|
+
// bootstrap connection, so startup must happen at the process level.
|
|
455
|
+
const cesStartupPromise = startCesProcess(config);
|
|
456
|
+
|
|
457
|
+
// When the credential backend flag is enabled, CES startup must complete
|
|
458
|
+
// BEFORE provider initialization so credential reads can go through CES.
|
|
459
|
+
// Block with a 3-second timeout — fall back to direct credential store
|
|
460
|
+
// on timeout.
|
|
461
|
+
if (isCesCredentialBackendEnabled(config)) {
|
|
462
|
+
const cesResult = await cesStartupPromise;
|
|
463
|
+
// startCesProcess() returns immediately — the actual handshake runs
|
|
464
|
+
// inside clientPromise. Await it (with a 3s timeout) so the CES client
|
|
465
|
+
// is available before provider initialization.
|
|
466
|
+
if (cesResult.clientPromise) {
|
|
467
|
+
const client = await Promise.race([
|
|
468
|
+
cesResult.clientPromise,
|
|
469
|
+
new Promise<undefined>((resolve) =>
|
|
470
|
+
setTimeout(() => {
|
|
471
|
+
log.warn("CES handshake timed out after 3s — falling back to direct credential store");
|
|
472
|
+
resolve(undefined);
|
|
473
|
+
}, 3000),
|
|
474
|
+
),
|
|
475
|
+
]);
|
|
476
|
+
if (client) {
|
|
477
|
+
setCesClient(client);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
386
480
|
}
|
|
387
481
|
|
|
388
482
|
await initializeProvidersAndTools(config);
|
|
@@ -391,6 +485,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
391
485
|
// routes can begin accepting requests while Qdrant initializes.
|
|
392
486
|
log.info("Daemon startup: starting DaemonServer");
|
|
393
487
|
const server = new DaemonServer();
|
|
488
|
+
server.setCes(await cesStartupPromise);
|
|
394
489
|
await server.start();
|
|
395
490
|
log.info("Daemon startup: DaemonServer started");
|
|
396
491
|
|
|
@@ -414,39 +509,69 @@ export async function runDaemon(): Promise<void> {
|
|
|
414
509
|
log.info({ qdrantUrl }, "Daemon startup: initializing Qdrant");
|
|
415
510
|
const manager = new QdrantManager({ url: qdrantUrl });
|
|
416
511
|
bgRefs.qdrantManager = manager;
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
512
|
+
const QDRANT_START_MAX_ATTEMPTS = 3;
|
|
513
|
+
let qdrantStarted = false;
|
|
514
|
+
for (let attempt = 1; attempt <= QDRANT_START_MAX_ATTEMPTS; attempt++) {
|
|
515
|
+
try {
|
|
516
|
+
await manager.start();
|
|
517
|
+
qdrantStarted = true;
|
|
518
|
+
break;
|
|
519
|
+
} catch (err) {
|
|
520
|
+
if (attempt < QDRANT_START_MAX_ATTEMPTS) {
|
|
521
|
+
const backoffMs = attempt * 5_000; // 5s, 10s
|
|
522
|
+
log.warn(
|
|
523
|
+
{
|
|
524
|
+
err,
|
|
525
|
+
attempt,
|
|
526
|
+
maxAttempts: QDRANT_START_MAX_ATTEMPTS,
|
|
527
|
+
backoffMs,
|
|
528
|
+
},
|
|
529
|
+
"Qdrant startup failed, retrying",
|
|
530
|
+
);
|
|
531
|
+
await Bun.sleep(backoffMs);
|
|
532
|
+
} else {
|
|
533
|
+
log.warn(
|
|
534
|
+
{ err },
|
|
535
|
+
"Qdrant failed to start after all attempts — memory features will be unavailable",
|
|
536
|
+
);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
if (qdrantStarted) {
|
|
542
|
+
try {
|
|
543
|
+
const embeddingSelection = await selectEmbeddingBackend(config);
|
|
544
|
+
const embeddingModel = embeddingSelection.backend
|
|
545
|
+
? `${embeddingSelection.backend.provider}:${embeddingSelection.backend.model}:sparse-v${SPARSE_EMBEDDING_VERSION}`
|
|
546
|
+
: undefined;
|
|
547
|
+
const qdrantClient = initQdrantClient({
|
|
548
|
+
url: qdrantUrl,
|
|
549
|
+
collection: config.memory.qdrant.collection,
|
|
550
|
+
vectorSize: config.memory.qdrant.vectorSize,
|
|
551
|
+
onDisk: config.memory.qdrant.onDisk,
|
|
552
|
+
quantization: config.memory.qdrant.quantization,
|
|
553
|
+
embeddingModel,
|
|
554
|
+
});
|
|
431
555
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
556
|
+
// Eagerly ensure the collection exists so we detect migrations
|
|
557
|
+
// (unnamed→named vectors, dimension/model changes) at startup.
|
|
558
|
+
// If a destructive migration occurred, enqueue a rebuild_index job
|
|
559
|
+
// to re-embed all memory items from the SQLite cache.
|
|
560
|
+
const { migrated } = await qdrantClient.ensureCollection();
|
|
561
|
+
if (migrated) {
|
|
562
|
+
enqueueMemoryJob("rebuild_index", {});
|
|
563
|
+
log.info(
|
|
564
|
+
"Qdrant collection was migrated — enqueued rebuild_index job",
|
|
565
|
+
);
|
|
566
|
+
}
|
|
567
|
+
|
|
568
|
+
log.info("Qdrant vector store initialized");
|
|
569
|
+
} catch (err) {
|
|
570
|
+
log.warn(
|
|
571
|
+
{ err },
|
|
572
|
+
"Qdrant client initialization failed — memory features will be degraded",
|
|
441
573
|
);
|
|
442
574
|
}
|
|
443
|
-
|
|
444
|
-
log.info("Qdrant vector store initialized");
|
|
445
|
-
} catch (err) {
|
|
446
|
-
log.warn(
|
|
447
|
-
{ err },
|
|
448
|
-
"Qdrant failed to start — memory features will be unavailable",
|
|
449
|
-
);
|
|
450
575
|
}
|
|
451
576
|
|
|
452
577
|
log.info("Daemon startup: starting memory worker");
|
|
@@ -876,7 +1001,7 @@ export async function runDaemon(): Promise<void> {
|
|
|
876
1001
|
server.broadcast(msg as ServerMessage),
|
|
877
1002
|
);
|
|
878
1003
|
initSlashPairingContext(runtimeHttp.getPairingStore());
|
|
879
|
-
server.
|
|
1004
|
+
server.broadcastStatus();
|
|
880
1005
|
log.info(
|
|
881
1006
|
{ port: httpPort, hostname },
|
|
882
1007
|
"Daemon startup: runtime HTTP server listening",
|
|
@@ -892,6 +1017,14 @@ export async function runDaemon(): Promise<void> {
|
|
|
892
1017
|
writePid(process.pid);
|
|
893
1018
|
log.info({ pid: process.pid }, "Daemon started");
|
|
894
1019
|
|
|
1020
|
+
// Install the `assistant` CLI symlink idempotently on every daemon start.
|
|
1021
|
+
// Non-blocking — failures are logged but don't affect startup.
|
|
1022
|
+
try {
|
|
1023
|
+
installAssistantSymlink();
|
|
1024
|
+
} catch (err) {
|
|
1025
|
+
log.warn({ err }, "Assistant symlink installation failed — continuing");
|
|
1026
|
+
}
|
|
1027
|
+
|
|
895
1028
|
const hookManager = getHookManager();
|
|
896
1029
|
hookManager.watch();
|
|
897
1030
|
|
|
@@ -221,9 +221,8 @@ export interface PongMessage {
|
|
|
221
221
|
type: "pong";
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
-
export interface
|
|
225
|
-
type: "
|
|
226
|
-
httpPort?: number;
|
|
224
|
+
export interface AssistantStatusMessage {
|
|
225
|
+
type: "assistant_status";
|
|
227
226
|
version?: string;
|
|
228
227
|
keyFingerprint?: string;
|
|
229
228
|
}
|
|
@@ -419,7 +418,7 @@ export type _ConversationsClientMessages =
|
|
|
419
418
|
export type _ConversationsServerMessages =
|
|
420
419
|
| AuthResult
|
|
421
420
|
| PongMessage
|
|
422
|
-
|
|
|
421
|
+
| AssistantStatusMessage
|
|
423
422
|
| GenerationCancelled
|
|
424
423
|
| GenerationHandoff
|
|
425
424
|
| ModelInfo
|
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
// Diagnostics, environment,
|
|
1
|
+
// Diagnostics, environment, and dictation types.
|
|
2
2
|
|
|
3
3
|
import type { DictationContext } from "./shared.js";
|
|
4
4
|
|
|
5
5
|
// === Client → Server ===
|
|
6
6
|
|
|
7
|
-
export interface DiagnosticsExportRequest {
|
|
8
|
-
type: "diagnostics_export_request";
|
|
9
|
-
conversationId: string;
|
|
10
|
-
anchorMessageId?: string; // if omitted, use latest assistant message
|
|
11
|
-
}
|
|
12
|
-
|
|
13
7
|
export interface EnvVarsRequest {
|
|
14
8
|
type: "env_vars_request";
|
|
15
9
|
}
|
|
@@ -23,13 +17,6 @@ export interface DictationRequest {
|
|
|
23
17
|
|
|
24
18
|
// === Server → Client ===
|
|
25
19
|
|
|
26
|
-
export interface DiagnosticsExportResponse {
|
|
27
|
-
type: "diagnostics_export_response";
|
|
28
|
-
success: boolean;
|
|
29
|
-
filePath?: string; // path to the zip file on success
|
|
30
|
-
error?: string; // error message on failure
|
|
31
|
-
}
|
|
32
|
-
|
|
33
20
|
export interface EnvVarsResponse {
|
|
34
21
|
type: "env_vars_response";
|
|
35
22
|
vars: Record<string, string>;
|
|
@@ -46,12 +33,6 @@ export interface DictationResponse {
|
|
|
46
33
|
|
|
47
34
|
// --- Domain-level union aliases (consumed by the barrel file) ---
|
|
48
35
|
|
|
49
|
-
export type _DiagnosticsClientMessages =
|
|
50
|
-
| DiagnosticsExportRequest
|
|
51
|
-
| EnvVarsRequest
|
|
52
|
-
| DictationRequest;
|
|
36
|
+
export type _DiagnosticsClientMessages = EnvVarsRequest | DictationRequest;
|
|
53
37
|
|
|
54
|
-
export type _DiagnosticsServerMessages =
|
|
55
|
-
| DiagnosticsExportResponse
|
|
56
|
-
| EnvVarsResponse
|
|
57
|
-
| DictationResponse;
|
|
38
|
+
export type _DiagnosticsServerMessages = EnvVarsResponse | DictationResponse;
|
|
@@ -13,8 +13,6 @@ export interface UserMessage {
|
|
|
13
13
|
activeSurfaceId?: string;
|
|
14
14
|
/** The page currently displayed in the WebView (e.g. "settings.html"). */
|
|
15
15
|
currentPage?: string;
|
|
16
|
-
/** When true, skip the secret-ingress check. Set by the client when the user clicks "Send Anyway". */
|
|
17
|
-
bypassSecretCheck?: boolean;
|
|
18
16
|
/** Originating channel identifier (e.g. 'vellum'). Defaults to 'vellum' when absent. */
|
|
19
17
|
channel?: ChannelId;
|
|
20
18
|
/** Originating interface identifier (e.g. 'macos'). */
|
|
@@ -7,6 +7,13 @@ export interface ServiceGroupUpdateStarting {
|
|
|
7
7
|
expectedDowntimeSeconds: number;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
/** Broadcast to connected clients with a progress update during an upgrade or rollback. */
|
|
11
|
+
export interface ServiceGroupUpdateProgress {
|
|
12
|
+
type: "service_group_update_progress";
|
|
13
|
+
/** A short, user-friendly status message describing what's happening right now. */
|
|
14
|
+
statusMessage: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
10
17
|
/** Broadcast to connected clients when a service group update has completed. */
|
|
11
18
|
export interface ServiceGroupUpdateComplete {
|
|
12
19
|
type: "service_group_update_complete";
|
|
@@ -20,4 +27,5 @@ export interface ServiceGroupUpdateComplete {
|
|
|
20
27
|
|
|
21
28
|
export type _UpgradesServerMessages =
|
|
22
29
|
| ServiceGroupUpdateStarting
|
|
30
|
+
| ServiceGroupUpdateProgress
|
|
23
31
|
| ServiceGroupUpdateComplete;
|