@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
@@ -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 = loadOrCreateSigningKey();
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
- // If Logfire observability is not explicitly enabled, disable it so
377
- // wrapWithLogfire() calls during provider setup become no-ops. Logfire
378
- // is initialized eagerly (before config loads) for the same reason as
379
- // Sentry but the feature flag gates whether it actually traces.
380
- const logfireEnabled = isAssistantFeatureFlagEnabled(
381
- "feature_flags.logfire.enabled",
382
- config,
383
- );
384
- if (!logfireEnabled) {
385
- disableLogfire();
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
- try {
418
- await manager.start();
419
- const embeddingSelection = await selectEmbeddingBackend(config);
420
- const embeddingModel = embeddingSelection.backend
421
- ? `${embeddingSelection.backend.provider}:${embeddingSelection.backend.model}:sparse-v${SPARSE_EMBEDDING_VERSION}`
422
- : undefined;
423
- const qdrantClient = initQdrantClient({
424
- url: qdrantUrl,
425
- collection: config.memory.qdrant.collection,
426
- vectorSize: config.memory.qdrant.vectorSize,
427
- onDisk: config.memory.qdrant.onDisk,
428
- quantization: config.memory.qdrant.quantization,
429
- embeddingModel,
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
- // Eagerly ensure the collection exists so we detect migrations
433
- // (unnamed→named vectors, dimension/model changes) at startup.
434
- // If a destructive migration occurred, enqueue a rebuild_index job
435
- // to re-embed all memory items from the SQLite cache.
436
- const { migrated } = await qdrantClient.ensureCollection();
437
- if (migrated) {
438
- enqueueMemoryJob("rebuild_index", {});
439
- log.info(
440
- "Qdrant collection was migrated — enqueued rebuild_index job",
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.setHttpPort(httpPort);
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 DaemonStatusMessage {
225
- type: "daemon_status";
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
- | DaemonStatusMessage
421
+ | AssistantStatusMessage
423
422
  | GenerationCancelled
424
423
  | GenerationHandoff
425
424
  | ModelInfo
@@ -1,15 +1,9 @@
1
- // Diagnostics, environment, blob probe, and dictation types.
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;