@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.
Files changed (382) hide show
  1. package/.env.example +16 -2
  2. package/ARCHITECTURE.md +6 -75
  3. package/Dockerfile +4 -5
  4. package/README.md +0 -2
  5. package/bun.lock +0 -414
  6. package/docs/architecture/keychain-broker.md +45 -240
  7. package/docs/architecture/security.md +0 -17
  8. package/docs/credential-execution-service.md +2 -2
  9. package/node_modules/@vellumai/ces-contracts/package.json +1 -0
  10. package/node_modules/@vellumai/ces-contracts/src/rpc.ts +119 -0
  11. package/node_modules/@vellumai/credential-storage/package.json +1 -0
  12. package/node_modules/@vellumai/egress-proxy/package.json +1 -0
  13. package/package.json +2 -3
  14. package/src/__tests__/actor-token-service.test.ts +1 -2
  15. package/src/__tests__/assistant-feature-flags-integration.test.ts +30 -29
  16. package/src/__tests__/browser-skill-endstate.test.ts +6 -5
  17. package/src/__tests__/btw-routes.test.ts +0 -39
  18. package/src/__tests__/call-domain.test.ts +0 -128
  19. package/src/__tests__/ces-rpc-credential-backend.test.ts +199 -0
  20. package/src/__tests__/channel-approval-routes.test.ts +0 -5
  21. package/src/__tests__/channel-readiness-service.test.ts +1 -60
  22. package/src/__tests__/checker.test.ts +4 -2
  23. package/src/__tests__/cli-command-risk-guard.test.ts +112 -0
  24. package/src/__tests__/config-schema-cmd.test.ts +0 -1
  25. package/src/__tests__/config-schema.test.ts +3 -3
  26. package/src/__tests__/context-window-manager.test.ts +78 -0
  27. package/src/__tests__/conversation-attention-telegram.test.ts +0 -5
  28. package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
  29. package/src/__tests__/conversation-skill-tools.test.ts +0 -54
  30. package/src/__tests__/conversation-title-service.test.ts +117 -1
  31. package/src/__tests__/credential-execution-feature-gates.test.ts +28 -14
  32. package/src/__tests__/credential-execution-managed-contract.test.ts +33 -18
  33. package/src/__tests__/credential-security-e2e.test.ts +0 -66
  34. package/src/__tests__/credential-security-invariants.test.ts +4 -45
  35. package/src/__tests__/credentials-cli.test.ts +78 -0
  36. package/src/__tests__/db-migration-rollback.test.ts +2015 -1
  37. package/src/__tests__/docker-signing-key-bootstrap.test.ts +98 -0
  38. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +6 -4
  39. package/src/__tests__/guardian-routing-state.test.ts +0 -5
  40. package/src/__tests__/host-shell-tool.test.ts +6 -7
  41. package/src/__tests__/http-user-message-parity.test.ts +3 -103
  42. package/src/__tests__/inbound-invite-redemption.test.ts +0 -4
  43. package/src/__tests__/inline-skill-load-permissions.test.ts +6 -8
  44. package/src/__tests__/intent-routing.test.ts +0 -13
  45. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +178 -0
  46. package/src/__tests__/keychain-broker-client.test.ts +161 -22
  47. package/src/__tests__/memory-jobs-worker-backoff.test.ts +150 -0
  48. package/src/__tests__/memory-regressions.test.ts +8 -30
  49. package/src/__tests__/migration-export-http.test.ts +2 -2
  50. package/src/__tests__/migration-import-commit-http.test.ts +2 -2
  51. package/src/__tests__/migration-import-preflight-http.test.ts +2 -2
  52. package/src/__tests__/migration-validate-http.test.ts +2 -2
  53. package/src/__tests__/non-member-access-request.test.ts +0 -5
  54. package/src/__tests__/notification-decision-fallback.test.ts +4 -0
  55. package/src/__tests__/notification-decision-identity.test.ts +4 -0
  56. package/src/__tests__/permission-types.test.ts +1 -0
  57. package/src/__tests__/provider-managed-proxy-integration.test.ts +5 -6
  58. package/src/__tests__/qdrant-manager.test.ts +28 -2
  59. package/src/__tests__/registry.test.ts +0 -6
  60. package/src/__tests__/require-fresh-approval.test.ts +4 -0
  61. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -4
  62. package/src/__tests__/secret-routes-managed-proxy.test.ts +0 -4
  63. package/src/__tests__/secure-keys.test.ts +83 -263
  64. package/src/__tests__/shell-identity.test.ts +96 -6
  65. package/src/__tests__/skill-feature-flags-integration.test.ts +22 -14
  66. package/src/__tests__/skill-feature-flags.test.ts +46 -45
  67. package/src/__tests__/skill-load-feature-flag.test.ts +7 -10
  68. package/src/__tests__/skill-load-inline-command.test.ts +8 -12
  69. package/src/__tests__/skill-load-inline-includes.test.ts +6 -10
  70. package/src/__tests__/skill-load-tool.test.ts +0 -2
  71. package/src/__tests__/skill-projection-feature-flag.test.ts +33 -29
  72. package/src/__tests__/skills.test.ts +0 -2
  73. package/src/__tests__/slack-inbound-verification.test.ts +0 -4
  74. package/src/__tests__/suggestion-routes.test.ts +1 -32
  75. package/src/__tests__/system-prompt.test.ts +0 -1
  76. package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -0
  77. package/src/__tests__/tool-executor-shell-integration.test.ts +5 -3
  78. package/src/__tests__/tool-executor.test.ts +4 -0
  79. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -5
  80. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -4
  81. package/src/__tests__/update-bulletin.test.ts +0 -2
  82. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +6 -9
  83. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -6
  84. package/src/__tests__/workspace-migration-015-migrate-credentials-to-keychain.test.ts +252 -0
  85. package/src/__tests__/workspace-migration-016-migrate-credentials-from-keychain.test.ts +218 -0
  86. package/src/__tests__/workspace-migration-down-functions.test.ts +1009 -0
  87. package/src/__tests__/workspace-migrations-runner.test.ts +114 -0
  88. package/src/calls/audio-store.test.ts +97 -0
  89. package/src/calls/audio-store.ts +205 -0
  90. package/src/calls/call-controller.ts +85 -7
  91. package/src/calls/call-domain.ts +3 -0
  92. package/src/calls/call-store.ts +10 -3
  93. package/src/calls/fish-audio-client.ts +117 -0
  94. package/src/calls/relay-server.ts +27 -0
  95. package/src/calls/twilio-routes.ts +2 -1
  96. package/src/calls/types.ts +1 -0
  97. package/src/calls/voice-ingress-preflight.ts +0 -42
  98. package/src/calls/voice-quality.ts +26 -5
  99. package/src/calls/voice-session-bridge.ts +6 -12
  100. package/src/cli/commands/config.ts +1 -4
  101. package/src/cli/commands/conversations.ts +0 -18
  102. package/src/cli/commands/credentials.ts +34 -4
  103. package/src/cli/commands/oauth/index.ts +7 -0
  104. package/src/cli/commands/oauth/platform.ts +179 -0
  105. package/src/cli/commands/platform.ts +3 -3
  106. package/src/config/assistant-feature-flags.ts +186 -5
  107. package/src/config/bundled-skills/messaging/SKILL.md +5 -5
  108. package/src/config/bundled-skills/phone-calls/TOOLS.json +4 -0
  109. package/src/config/bundled-skills/settings/TOOLS.json +2 -2
  110. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +42 -0
  111. package/src/config/bundled-tool-registry.ts +1 -11
  112. package/src/config/env-registry.ts +1 -1
  113. package/src/config/env.ts +16 -16
  114. package/src/config/feature-flag-registry.json +48 -16
  115. package/src/config/loader.ts +98 -31
  116. package/src/config/schema.ts +4 -25
  117. package/src/config/schemas/calls.ts +13 -0
  118. package/src/config/schemas/fish-audio.ts +39 -0
  119. package/src/config/schemas/memory.ts +0 -4
  120. package/src/config/schemas/platform.ts +1 -1
  121. package/src/config/schemas/security.ts +4 -4
  122. package/src/config/types.ts +0 -1
  123. package/src/contacts/contact-store.ts +39 -0
  124. package/src/contacts/types.ts +2 -0
  125. package/src/context/window-manager.ts +53 -2
  126. package/src/credential-execution/approval-bridge.ts +1 -0
  127. package/src/credential-execution/executable-discovery.ts +28 -4
  128. package/src/credential-execution/feature-gates.ts +16 -0
  129. package/src/credential-execution/process-manager.ts +38 -0
  130. package/src/daemon/assistant-attachments.ts +9 -0
  131. package/src/daemon/config-watcher.ts +6 -4
  132. package/src/daemon/conversation-agent-loop.ts +0 -60
  133. package/src/daemon/conversation-memory.ts +0 -117
  134. package/src/daemon/conversation-runtime-assembly.ts +0 -2
  135. package/src/daemon/conversation-tool-setup.ts +0 -105
  136. package/src/daemon/conversation.ts +10 -1
  137. package/src/daemon/handlers/config-vercel.ts +92 -0
  138. package/src/daemon/handlers/conversations.ts +0 -11
  139. package/src/daemon/handlers/skills.ts +2 -15
  140. package/src/daemon/install-symlink.ts +195 -0
  141. package/src/daemon/lifecycle.ts +229 -96
  142. package/src/daemon/message-types/conversations.ts +3 -4
  143. package/src/daemon/message-types/diagnostics.ts +3 -22
  144. package/src/daemon/message-types/messages.ts +0 -2
  145. package/src/daemon/message-types/upgrades.ts +8 -0
  146. package/src/daemon/server.ts +30 -92
  147. package/src/events/domain-events.ts +2 -1
  148. package/src/followups/followup-store.ts +5 -2
  149. package/src/inbound/platform-callback-registration.ts +3 -3
  150. package/src/instrument.ts +8 -5
  151. package/src/memory/conversation-crud.ts +0 -236
  152. package/src/memory/conversation-title-service.ts +76 -11
  153. package/src/memory/db-init.ts +15 -11
  154. package/src/memory/indexer.ts +15 -106
  155. package/src/memory/items-extractor.ts +15 -1
  156. package/src/memory/job-handlers/conversation-starters.ts +4 -1
  157. package/src/memory/job-handlers/embedding.ts +0 -79
  158. package/src/memory/job-utils.ts +1 -1
  159. package/src/memory/jobs-store.ts +30 -13
  160. package/src/memory/jobs-worker.ts +31 -27
  161. package/src/memory/migrations/001-job-deferrals.ts +19 -0
  162. package/src/memory/migrations/004-entity-relation-dedup.ts +10 -0
  163. package/src/memory/migrations/005-fingerprint-scope-unique.ts +76 -0
  164. package/src/memory/migrations/006-scope-salted-fingerprints.ts +50 -0
  165. package/src/memory/migrations/007-assistant-id-to-self.ts +10 -0
  166. package/src/memory/migrations/008-remove-assistant-id-columns.ts +34 -0
  167. package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +26 -0
  168. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +10 -0
  169. package/src/memory/migrations/015-drop-active-search-index.ts +17 -0
  170. package/src/memory/migrations/019-notification-tables-schema-migration.ts +12 -0
  171. package/src/memory/migrations/020-rename-macos-ios-channel-to-vellum.ts +121 -0
  172. package/src/memory/migrations/024-embedding-vector-blob.ts +74 -0
  173. package/src/memory/migrations/026a-embeddings-nullable-vector-json.ts +82 -0
  174. package/src/memory/migrations/036-normalize-phone-identities.ts +11 -0
  175. package/src/memory/migrations/116-messages-fts.ts +106 -1
  176. package/src/memory/migrations/126-backfill-guardian-principal-id.ts +52 -0
  177. package/src/memory/migrations/127-guardian-principal-id-not-null.ts +77 -0
  178. package/src/memory/migrations/134-contacts-notes-column.ts +13 -0
  179. package/src/memory/migrations/135-backfill-contact-interaction-stats.ts +20 -0
  180. package/src/memory/migrations/136-drop-assistant-id-columns.ts +52 -0
  181. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +13 -0
  182. package/src/memory/migrations/141-rename-verification-table.ts +54 -0
  183. package/src/memory/migrations/142-rename-verification-session-id-column.ts +25 -0
  184. package/src/memory/migrations/143-rename-guardian-verification-values.ts +35 -0
  185. package/src/memory/migrations/144-rename-voice-to-phone.ts +136 -0
  186. package/src/memory/migrations/145-drop-accounts-table.ts +32 -0
  187. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +14 -1
  188. package/src/memory/migrations/148-drop-reminders-table.ts +35 -1
  189. package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +69 -1
  190. package/src/memory/migrations/162-guardian-timestamps-epoch-ms.ts +290 -0
  191. package/src/memory/migrations/169-rename-gmail-provider-key-to-google.ts +51 -1
  192. package/src/memory/migrations/174-rename-thread-starters-table.ts +47 -1
  193. package/src/memory/migrations/176-drop-capability-card-state.ts +13 -0
  194. package/src/memory/migrations/180-backfill-inline-attachments-to-disk.ts +16 -0
  195. package/src/memory/migrations/181-rename-thread-starters-checkpoints.ts +28 -1
  196. package/src/memory/migrations/189-drop-simplified-memory.ts +42 -0
  197. package/src/memory/migrations/190-call-session-skip-disclosure.ts +15 -0
  198. package/src/memory/migrations/191-backfill-audio-attachment-mime-types.ts +64 -0
  199. package/src/memory/migrations/192-contacts-user-file-column.ts +15 -0
  200. package/src/memory/migrations/index.ts +5 -3
  201. package/src/memory/migrations/registry.ts +90 -0
  202. package/src/memory/migrations/validate-migration-state.ts +137 -11
  203. package/src/memory/qdrant-circuit-breaker.ts +9 -0
  204. package/src/memory/qdrant-client.ts +4 -6
  205. package/src/memory/qdrant-manager.ts +64 -7
  206. package/src/memory/schema/calls.ts +1 -0
  207. package/src/memory/schema/contacts.ts +1 -0
  208. package/src/memory/schema/conversations.ts +0 -3
  209. package/src/memory/schema/index.ts +0 -2
  210. package/src/messaging/draft-store.ts +2 -2
  211. package/src/notifications/decision-engine.ts +4 -1
  212. package/src/oauth/connection-resolver.ts +6 -4
  213. package/src/permissions/checker.ts +0 -38
  214. package/src/permissions/defaults.ts +3 -3
  215. package/src/permissions/shell-identity.ts +76 -22
  216. package/src/permissions/trust-client.ts +2 -13
  217. package/src/permissions/trust-store.ts +8 -3
  218. package/src/permissions/types.ts +4 -2
  219. package/src/platform/client.ts +35 -7
  220. package/src/prompts/persona-resolver.ts +138 -0
  221. package/src/prompts/system-prompt.ts +36 -4
  222. package/src/prompts/templates/users/default.md +1 -0
  223. package/src/providers/registry.ts +27 -40
  224. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  225. package/src/runtime/auth/__tests__/external-assistant-id.test.ts +13 -68
  226. package/src/runtime/auth/external-assistant-id.ts +13 -59
  227. package/src/runtime/auth/route-policy.ts +29 -1
  228. package/src/runtime/auth/token-service.ts +53 -15
  229. package/src/runtime/channel-readiness-service.ts +1 -16
  230. package/src/runtime/http-server.ts +29 -2
  231. package/src/runtime/middleware/error-handler.ts +1 -9
  232. package/src/runtime/routes/audio-routes.ts +40 -0
  233. package/src/runtime/routes/btw-routes.ts +0 -17
  234. package/src/runtime/routes/conversation-management-routes.ts +0 -36
  235. package/src/runtime/routes/conversation-query-routes.ts +106 -2
  236. package/src/runtime/routes/conversation-routes.ts +4 -43
  237. package/src/runtime/routes/diagnostics-routes.ts +1 -477
  238. package/src/runtime/routes/identity-routes.ts +18 -29
  239. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -33
  240. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +1 -1
  241. package/src/runtime/routes/integrations/vercel.ts +89 -0
  242. package/src/runtime/routes/log-export-routes.ts +5 -0
  243. package/src/runtime/routes/memory-item-routes.test.ts +221 -3
  244. package/src/runtime/routes/memory-item-routes.ts +144 -4
  245. package/src/runtime/routes/migration-rollback-routes.ts +209 -0
  246. package/src/runtime/routes/migration-routes.ts +17 -1
  247. package/src/runtime/routes/notification-routes.ts +58 -0
  248. package/src/runtime/routes/schedule-routes.ts +65 -0
  249. package/src/runtime/routes/settings-routes.ts +41 -1
  250. package/src/runtime/routes/tts-routes.ts +86 -0
  251. package/src/runtime/routes/upgrade-broadcast-routes.ts +175 -0
  252. package/src/runtime/routes/workspace-commit-routes.ts +62 -0
  253. package/src/runtime/routes/workspace-routes.test.ts +22 -1
  254. package/src/runtime/routes/workspace-routes.ts +1 -1
  255. package/src/runtime/routes/workspace-utils.ts +86 -2
  256. package/src/schedule/schedule-store.ts +0 -21
  257. package/src/security/ces-credential-client.ts +59 -22
  258. package/src/security/ces-rpc-credential-backend.ts +85 -0
  259. package/src/security/credential-backend.ts +12 -88
  260. package/src/security/keychain-broker-client.ts +10 -2
  261. package/src/security/secure-keys.ts +94 -113
  262. package/src/skills/catalog-install.ts +13 -7
  263. package/src/skills/inline-command-render.ts +5 -1
  264. package/src/skills/inline-command-runner.ts +30 -2
  265. package/src/telemetry/usage-telemetry-reporter.ts +4 -2
  266. package/src/tools/calls/call-start.ts +1 -0
  267. package/src/tools/executor.ts +0 -4
  268. package/src/tools/memory/handlers.ts +1 -129
  269. package/src/tools/network/script-proxy/session-manager.ts +19 -4
  270. package/src/tools/network/web-fetch.ts +3 -1
  271. package/src/tools/permission-checker.ts +18 -0
  272. package/src/tools/skills/execute.ts +1 -1
  273. package/src/tools/skills/load.ts +9 -2
  274. package/src/tools/types.ts +0 -8
  275. package/src/util/errors.ts +0 -12
  276. package/src/util/platform.ts +8 -55
  277. package/src/util/xml.ts +8 -0
  278. package/src/workspace/git-service.ts +5 -2
  279. package/src/workspace/heartbeat-service.ts +5 -24
  280. package/src/workspace/migrations/001-avatar-rename.ts +15 -0
  281. package/src/workspace/migrations/003-seed-device-id.ts +17 -1
  282. package/src/workspace/migrations/004-extract-collect-usage-data.ts +33 -0
  283. package/src/workspace/migrations/005-add-send-diagnostics.ts +3 -0
  284. package/src/workspace/migrations/006-services-config.ts +49 -0
  285. package/src/workspace/migrations/007-web-search-provider-rename.ts +27 -0
  286. package/src/workspace/migrations/008-voice-timeout-and-max-steps.ts +3 -0
  287. package/src/workspace/migrations/009-backfill-conversation-disk-view.ts +4 -0
  288. package/src/workspace/migrations/010-app-dir-rename.ts +78 -0
  289. package/src/workspace/migrations/011-backfill-installation-id.ts +11 -0
  290. package/src/workspace/migrations/012-rename-conversation-disk-view-dirs.ts +44 -0
  291. package/src/workspace/migrations/013-repair-conversation-disk-view.ts +5 -0
  292. package/src/workspace/migrations/015-migrate-credentials-to-keychain.ts +153 -0
  293. package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +156 -0
  294. package/src/workspace/migrations/016-migrate-credentials-from-keychain.ts +150 -0
  295. package/src/workspace/migrations/017-seed-persona-dirs.ts +95 -0
  296. package/src/workspace/migrations/migrate-to-workspace-volume.ts +23 -1
  297. package/src/workspace/migrations/registry.ts +8 -0
  298. package/src/workspace/migrations/runner.ts +106 -2
  299. package/src/workspace/migrations/types.ts +4 -0
  300. package/src/__tests__/archive-recall.test.ts +0 -560
  301. package/src/__tests__/claude-code-skill-regression.test.ts +0 -206
  302. package/src/__tests__/claude-code-tool-profiles.test.ts +0 -99
  303. package/src/__tests__/conversation-memory-dirty-tail.test.ts +0 -150
  304. package/src/__tests__/conversation-switch-memory-reduction.test.ts +0 -474
  305. package/src/__tests__/db-memory-archive-migration.test.ts +0 -372
  306. package/src/__tests__/db-memory-brief-state-migration.test.ts +0 -213
  307. package/src/__tests__/db-memory-reducer-checkpoints.test.ts +0 -273
  308. package/src/__tests__/diagnostics-export.test.ts +0 -288
  309. package/src/__tests__/local-gateway-health.test.ts +0 -209
  310. package/src/__tests__/memory-brief-open-loops.test.ts +0 -530
  311. package/src/__tests__/memory-brief-time.test.ts +0 -285
  312. package/src/__tests__/memory-brief-wrapper.test.ts +0 -311
  313. package/src/__tests__/memory-chunk-archive.test.ts +0 -400
  314. package/src/__tests__/memory-chunk-dual-write.test.ts +0 -453
  315. package/src/__tests__/memory-episode-archive.test.ts +0 -370
  316. package/src/__tests__/memory-episode-dual-write.test.ts +0 -626
  317. package/src/__tests__/memory-observation-archive.test.ts +0 -375
  318. package/src/__tests__/memory-observation-dual-write.test.ts +0 -318
  319. package/src/__tests__/memory-reducer-job.test.ts +0 -538
  320. package/src/__tests__/memory-reducer-scheduling.test.ts +0 -473
  321. package/src/__tests__/memory-reducer-store.test.ts +0 -728
  322. package/src/__tests__/memory-reducer-types.test.ts +0 -707
  323. package/src/__tests__/memory-reducer.test.ts +0 -704
  324. package/src/__tests__/memory-simplified-config.test.ts +0 -281
  325. package/src/__tests__/secret-ingress-handler.test.ts +0 -120
  326. package/src/__tests__/simplified-memory-e2e.test.ts +0 -666
  327. package/src/__tests__/simplified-memory-runtime.test.ts +0 -616
  328. package/src/__tests__/swarm-conversation-integration.test.ts +0 -358
  329. package/src/__tests__/swarm-dag-pathological.test.ts +0 -547
  330. package/src/__tests__/swarm-orchestrator.test.ts +0 -463
  331. package/src/__tests__/swarm-plan-validator.test.ts +0 -384
  332. package/src/__tests__/swarm-recursion.test.ts +0 -197
  333. package/src/__tests__/swarm-router-planner.test.ts +0 -234
  334. package/src/__tests__/swarm-tool.test.ts +0 -185
  335. package/src/__tests__/swarm-worker-backend.test.ts +0 -144
  336. package/src/__tests__/swarm-worker-runner.test.ts +0 -288
  337. package/src/commands/__tests__/cc-command-registry.test.ts +0 -396
  338. package/src/commands/cc-command-registry.ts +0 -248
  339. package/src/config/bundled-skills/claude-code/SKILL.md +0 -53
  340. package/src/config/bundled-skills/claude-code/TOOLS.json +0 -47
  341. package/src/config/bundled-skills/claude-code/tools/claude-code.ts +0 -12
  342. package/src/config/bundled-skills/orchestration/SKILL.md +0 -33
  343. package/src/config/bundled-skills/orchestration/TOOLS.json +0 -35
  344. package/src/config/bundled-skills/orchestration/tools/swarm-delegate.ts +0 -12
  345. package/src/config/schemas/memory-simplified.ts +0 -101
  346. package/src/config/schemas/swarm.ts +0 -82
  347. package/src/logfire.ts +0 -135
  348. package/src/memory/archive-recall.ts +0 -516
  349. package/src/memory/archive-store.ts +0 -400
  350. package/src/memory/brief-formatting.ts +0 -33
  351. package/src/memory/brief-open-loops.ts +0 -266
  352. package/src/memory/brief-time.ts +0 -162
  353. package/src/memory/brief.ts +0 -75
  354. package/src/memory/job-handlers/backfill-simplified-memory.ts +0 -462
  355. package/src/memory/job-handlers/reduce-conversation-memory.ts +0 -229
  356. package/src/memory/migrations/185-memory-brief-state.ts +0 -52
  357. package/src/memory/migrations/186-memory-archive.ts +0 -109
  358. package/src/memory/migrations/187-memory-reducer-checkpoints.ts +0 -19
  359. package/src/memory/reducer-scheduler.ts +0 -242
  360. package/src/memory/reducer-store.ts +0 -271
  361. package/src/memory/reducer-types.ts +0 -106
  362. package/src/memory/reducer.ts +0 -467
  363. package/src/memory/schema/memory-archive.ts +0 -121
  364. package/src/memory/schema/memory-brief.ts +0 -55
  365. package/src/runtime/local-gateway-health.ts +0 -275
  366. package/src/security/secret-ingress.ts +0 -68
  367. package/src/swarm/backend-claude-code.ts +0 -225
  368. package/src/swarm/checkpoint.ts +0 -137
  369. package/src/swarm/graph-utils.ts +0 -53
  370. package/src/swarm/index.ts +0 -55
  371. package/src/swarm/limits.ts +0 -66
  372. package/src/swarm/orchestrator.ts +0 -424
  373. package/src/swarm/plan-validator.ts +0 -117
  374. package/src/swarm/router-planner.ts +0 -162
  375. package/src/swarm/router-prompts.ts +0 -39
  376. package/src/swarm/synthesizer.ts +0 -81
  377. package/src/swarm/types.ts +0 -72
  378. package/src/swarm/worker-backend.ts +0 -131
  379. package/src/swarm/worker-prompts.ts +0 -80
  380. package/src/swarm/worker-runner.ts +0 -170
  381. package/src/tools/claude-code/claude-code.ts +0 -610
  382. 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
- /** Resolve the gateway base URL for internal service-to-service calls. */
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("SENTRY_DSN") ?? DEFAULT_SENTRY_DSN;
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("PLATFORM_BASE_URL") ?? _platformBaseUrlOverride ?? "";
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") ?? "https://platform.vellum.ai";
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
  }
@@ -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,
@@ -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(30)
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
 
@@ -35,7 +35,6 @@ export type {
35
35
  SkillsInstallConfig,
36
36
  SkillsLoadConfig,
37
37
  SlackConfig,
38
- SwarmConfig,
39
38
  ThinkingConfig,
40
39
  TimeoutConfig,
41
40
  UiConfig,
@@ -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
  })
@@ -44,6 +44,8 @@ export interface Contact {
44
44
  * identified by channel address instead.
45
45
  */
46
46
  principalId: string | null;
47
+ /** Workspace-relative path to a per-user persona file for this contact. */
48
+ userFile: string | null;
47
49
  }
48
50
 
49
51
  export type ChannelStatus =