@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
@@ -1,666 +0,0 @@
1
- /**
2
- * End-to-end tests for the simplified memory system.
3
- *
4
- * Covers the must-have scenarios:
5
- * 1. Backfill: legacy segments, summaries, and items migrate to simplified tables
6
- * 2. Simplified memory is enabled by default after backfill
7
- * 3. Memory tools use simplified path when enabled
8
- * 4. Legacy tables remain available as rollback support
9
- */
10
- import { mkdtempSync, rmSync } from "node:fs";
11
- import { tmpdir } from "node:os";
12
- import { join } from "node:path";
13
- import {
14
- afterAll,
15
- beforeAll,
16
- beforeEach,
17
- describe,
18
- expect,
19
- mock,
20
- test,
21
- } from "bun:test";
22
-
23
- const testDir = mkdtempSync(join(tmpdir(), "simplified-memory-e2e-test-"));
24
- const dbPath = join(testDir, "test.db");
25
-
26
- // ── Platform mock (must come before any module imports) ──────────────
27
-
28
- mock.module("../util/platform.js", () => ({
29
- getDataDir: () => testDir,
30
- getRootDir: () => testDir,
31
- isMacOS: () => process.platform === "darwin",
32
- isLinux: () => process.platform === "linux",
33
- isWindows: () => process.platform === "win32",
34
- getPidPath: () => join(testDir, "test.pid"),
35
- getDbPath: () => dbPath,
36
- getLogPath: () => join(testDir, "test.log"),
37
- ensureDataDir: () => {},
38
- }));
39
-
40
- mock.module("../util/logger.js", () => ({
41
- getLogger: () =>
42
- new Proxy({} as Record<string, unknown>, {
43
- get: () => () => {},
44
- }),
45
- truncateForLog: (value: string) => value,
46
- }));
47
-
48
- // Stub the Qdrant and embedding backends since we don't need vectors
49
- mock.module("../memory/qdrant-client.js", () => ({
50
- getQdrantClient: () => ({
51
- searchWithFilter: async () => [],
52
- hybridSearch: async () => [],
53
- upsertPoints: async () => {},
54
- deletePoints: async () => {},
55
- upsert: async () => {},
56
- }),
57
- initQdrantClient: () => {},
58
- }));
59
-
60
- mock.module("../memory/embedding-backend.js", () => ({
61
- getMemoryBackendStatus: async () => ({
62
- provider: null,
63
- reason: "test-stub",
64
- }),
65
- embedWithBackend: async () => ({
66
- vectors: [[]],
67
- provider: "test",
68
- model: "test",
69
- }),
70
- generateSparseEmbedding: () => undefined,
71
- selectEmbeddingBackend: async () => null,
72
- }));
73
-
74
- mock.module("../memory/qdrant-circuit-breaker.js", () => ({
75
- withQdrantBreaker: async (fn: () => Promise<unknown>) => fn(),
76
- QdrantCircuitOpenError: class extends Error {},
77
- }));
78
-
79
- // ── Configurable config mock ────────────────────────────────────────
80
-
81
- import { DEFAULT_CONFIG } from "../config/defaults.js";
82
- import type { AssistantConfig } from "../config/types.js";
83
-
84
- let testConfig: AssistantConfig = {
85
- ...DEFAULT_CONFIG,
86
- memory: {
87
- ...DEFAULT_CONFIG.memory,
88
- enabled: true,
89
- simplified: {
90
- ...DEFAULT_CONFIG.memory.simplified,
91
- enabled: true,
92
- },
93
- },
94
- };
95
-
96
- mock.module("../config/loader.js", () => ({
97
- loadConfig: () => testConfig,
98
- getConfig: () => testConfig,
99
- loadRawConfig: () => ({}),
100
- saveRawConfig: () => {},
101
- invalidateConfigCache: () => {},
102
- }));
103
-
104
- // ── Now import modules under test ────────────────────────────────────
105
-
106
- import { v4 as uuid } from "uuid";
107
-
108
- import { insertObservation } from "../memory/archive-store.js";
109
- import { getDb, initializeDb, resetDb } from "../memory/db.js";
110
- import { getSqlite } from "../memory/db-connection.js";
111
- import { backfillSimplifiedMemoryJob } from "../memory/job-handlers/backfill-simplified-memory.js";
112
- import type { MemoryJob } from "../memory/jobs-store.js";
113
- import { conversations, memoryItems, messages } from "../memory/schema.js";
114
- import {
115
- handleMemoryRecall,
116
- handleMemorySave,
117
- } from "../tools/memory/handlers.js";
118
-
119
- // ── Helpers ─────────────────────────────────────────────────────────
120
-
121
- function removeTestDbFiles(): void {
122
- rmSync(dbPath, { force: true });
123
- rmSync(`${dbPath}-shm`, { force: true });
124
- rmSync(`${dbPath}-wal`, { force: true });
125
- }
126
-
127
- function getRawDb(): import("bun:sqlite").Database {
128
- return getSqlite();
129
- }
130
-
131
- function makeJob(overrides: Partial<MemoryJob> = {}): MemoryJob {
132
- return {
133
- id: uuid(),
134
- type: "backfill_simplified_memory",
135
- payload: {},
136
- status: "running",
137
- attempts: 0,
138
- deferrals: 0,
139
- runAfter: 0,
140
- lastError: null,
141
- startedAt: Date.now(),
142
- createdAt: Date.now(),
143
- updatedAt: Date.now(),
144
- ...overrides,
145
- };
146
- }
147
-
148
- function createConversation(id: string, title: string | null = null): void {
149
- const db = getDb();
150
- const now = Date.now();
151
- db.insert(conversations)
152
- .values({
153
- id,
154
- title,
155
- createdAt: now,
156
- updatedAt: now,
157
- })
158
- .run();
159
- }
160
-
161
- let segmentIndexCounter = 0;
162
-
163
- function insertLegacySegment(opts: {
164
- id: string;
165
- messageId: string;
166
- conversationId: string;
167
- role: string;
168
- text: string;
169
- scopeId?: string;
170
- segmentIndex?: number;
171
- }): void {
172
- const now = Date.now();
173
- const idx = opts.segmentIndex ?? segmentIndexCounter++;
174
- getRawDb().run(
175
- `INSERT INTO memory_segments (id, message_id, conversation_id, role, segment_index, text, token_estimate, scope_id, created_at, updated_at)
176
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
177
- [
178
- opts.id,
179
- opts.messageId,
180
- opts.conversationId,
181
- opts.role,
182
- idx,
183
- opts.text,
184
- Math.ceil(opts.text.length / 4),
185
- opts.scopeId ?? "default",
186
- now,
187
- now,
188
- ],
189
- );
190
- }
191
-
192
- function insertLegacySummary(opts: {
193
- id: string;
194
- scope: string;
195
- scopeKey: string;
196
- summary: string;
197
- scopeId?: string;
198
- startAt?: number;
199
- endAt?: number;
200
- }): void {
201
- const now = Date.now();
202
- getRawDb().run(
203
- `INSERT INTO memory_summaries (id, scope, scope_key, summary, token_estimate, version, scope_id, start_at, end_at, created_at, updated_at)
204
- VALUES (?, ?, ?, ?, ?, 1, ?, ?, ?, ?, ?)`,
205
- [
206
- opts.id,
207
- opts.scope,
208
- opts.scopeKey,
209
- opts.summary,
210
- Math.ceil(opts.summary.length / 4),
211
- opts.scopeId ?? "default",
212
- opts.startAt ?? now - 3600000,
213
- opts.endAt ?? now,
214
- now,
215
- now,
216
- ],
217
- );
218
- }
219
-
220
- function insertLegacyItem(opts: {
221
- id: string;
222
- kind: string;
223
- subject: string;
224
- statement: string;
225
- scopeId?: string;
226
- confidence?: number;
227
- status?: string;
228
- validFrom?: number | null;
229
- invalidAt?: number | null;
230
- }): void {
231
- const now = Date.now();
232
- getRawDb().run(
233
- `INSERT INTO memory_items (id, kind, subject, statement, status, confidence, importance, fingerprint, verification_state, scope_id, first_seen_at, last_seen_at)
234
- VALUES (?, ?, ?, ?, ?, ?, 0.8, ?, 'assistant_inferred', ?, ?, ?)`,
235
- [
236
- opts.id,
237
- opts.kind,
238
- opts.subject,
239
- opts.statement,
240
- opts.status ?? "active",
241
- opts.confidence ?? 0.9,
242
- `fp-${opts.id}`,
243
- opts.scopeId ?? "default",
244
- now,
245
- now,
246
- ],
247
- );
248
- // Set validFrom/invalidAt if provided
249
- if (opts.validFrom != null || opts.invalidAt != null) {
250
- getRawDb().run(
251
- `UPDATE memory_items SET valid_from = ?, invalid_at = ? WHERE id = ?`,
252
- [opts.validFrom ?? null, opts.invalidAt ?? null, opts.id],
253
- );
254
- }
255
- }
256
-
257
- function insertMessage(
258
- id: string,
259
- conversationId: string,
260
- role: string = "user",
261
- content: string = "test message",
262
- ): void {
263
- const db = getDb();
264
- const now = Date.now();
265
- db.insert(messages)
266
- .values({
267
- id,
268
- conversationId,
269
- role,
270
- content,
271
- createdAt: now,
272
- })
273
- .run();
274
- }
275
-
276
- function countRows(table: string): number {
277
- const result = getRawDb()
278
- .query<{ c: number }, []>(`SELECT COUNT(*) as c FROM ${table}`)
279
- .get();
280
- return result?.c ?? 0;
281
- }
282
-
283
- // ── Setup / Teardown ────────────────────────────────────────────────
284
-
285
- describe("Simplified Memory E2E", () => {
286
- beforeAll(() => {
287
- initializeDb();
288
- });
289
-
290
- beforeEach(() => {
291
- segmentIndexCounter = 0;
292
- resetDb();
293
- removeTestDbFiles();
294
- initializeDb();
295
- testConfig = {
296
- ...DEFAULT_CONFIG,
297
- memory: {
298
- ...DEFAULT_CONFIG.memory,
299
- enabled: true,
300
- simplified: {
301
- ...DEFAULT_CONFIG.memory.simplified,
302
- enabled: true,
303
- },
304
- },
305
- };
306
- });
307
-
308
- afterAll(() => {
309
- resetDb();
310
- rmSync(testDir, { recursive: true, force: true });
311
- });
312
-
313
- // ── 1. Backfill tests ──────────────────────────────────────────────
314
-
315
- describe("backfill: legacy data migration", () => {
316
- test("migrates legacy segments to observations and chunks", async () => {
317
- const convId = uuid();
318
- createConversation(convId);
319
- const msgId = uuid();
320
- insertMessage(msgId, convId, "user", "I like TypeScript");
321
-
322
- insertLegacySegment({
323
- id: "seg-1",
324
- messageId: msgId,
325
- conversationId: convId,
326
- role: "user",
327
- text: "I like TypeScript and prefer it over JavaScript",
328
- });
329
- insertLegacySegment({
330
- id: "seg-2",
331
- messageId: msgId,
332
- conversationId: convId,
333
- role: "user",
334
- text: "My favorite editor is VS Code",
335
- });
336
-
337
- expect(countRows("memory_segments")).toBe(2);
338
- expect(countRows("memory_observations")).toBe(0);
339
-
340
- await backfillSimplifiedMemoryJob(makeJob());
341
-
342
- // Segments should have been migrated to observations
343
- expect(countRows("memory_observations")).toBeGreaterThanOrEqual(2);
344
- // Chunks should have been created for each observation
345
- expect(countRows("memory_chunks")).toBeGreaterThanOrEqual(2);
346
- // Original segments remain untouched
347
- expect(countRows("memory_segments")).toBe(2);
348
- });
349
-
350
- test("migrates legacy summaries to episodes", async () => {
351
- const convId = uuid();
352
- createConversation(convId);
353
-
354
- insertLegacySummary({
355
- id: "sum-1",
356
- scope: "conversation",
357
- scopeKey: convId,
358
- summary: "User discussed TypeScript preferences and project setup",
359
- });
360
-
361
- expect(countRows("memory_summaries")).toBe(1);
362
- expect(countRows("memory_episodes")).toBe(0);
363
-
364
- await backfillSimplifiedMemoryJob(makeJob());
365
-
366
- expect(countRows("memory_episodes")).toBeGreaterThanOrEqual(1);
367
- // Original summaries remain untouched
368
- expect(countRows("memory_summaries")).toBe(1);
369
- });
370
-
371
- test("migrates active legacy items to observations", async () => {
372
- insertLegacyItem({
373
- id: "item-1",
374
- kind: "preference",
375
- subject: "Editor",
376
- statement: "Prefers VS Code with vim keybindings",
377
- });
378
- insertLegacyItem({
379
- id: "item-2",
380
- kind: "identity",
381
- subject: "Name",
382
- statement: "User's name is Alice",
383
- });
384
- // Low-confidence item should be skipped
385
- insertLegacyItem({
386
- id: "item-3",
387
- kind: "event",
388
- subject: "Meeting",
389
- statement: "Had a meeting yesterday",
390
- confidence: 0.3,
391
- });
392
-
393
- expect(countRows("memory_items")).toBe(3);
394
- expect(countRows("memory_observations")).toBe(0);
395
-
396
- await backfillSimplifiedMemoryJob(makeJob());
397
-
398
- // Only the 2 active, high-confidence items should be migrated
399
- expect(countRows("memory_observations")).toBeGreaterThanOrEqual(2);
400
- // Original items remain untouched
401
- expect(countRows("memory_items")).toBe(3);
402
- });
403
-
404
- test("backfill is idempotent — running twice does not duplicate", async () => {
405
- const convId = uuid();
406
- createConversation(convId);
407
- const msgId = uuid();
408
- insertMessage(msgId, convId, "user", "Hello");
409
-
410
- insertLegacySegment({
411
- id: "seg-idem-1",
412
- messageId: msgId,
413
- conversationId: convId,
414
- role: "user",
415
- text: "This is an idempotency test segment",
416
- });
417
-
418
- await backfillSimplifiedMemoryJob(makeJob());
419
- const firstRunObservations = countRows("memory_observations");
420
-
421
- // Run again — should not create duplicates because content-hash dedup
422
- // and checkpoint tracking prevent it
423
- await backfillSimplifiedMemoryJob(makeJob());
424
- const secondRunObservations = countRows("memory_observations");
425
-
426
- expect(secondRunObservations).toBe(firstRunObservations);
427
- });
428
-
429
- test("backfill skips non-conversation summaries", async () => {
430
- insertLegacySummary({
431
- id: "sum-skip-1",
432
- scope: "weekly",
433
- scopeKey: "2024-W01",
434
- summary: "A weekly summary that does not link to a conversation",
435
- });
436
-
437
- await backfillSimplifiedMemoryJob(makeJob());
438
-
439
- // Non-conversation summaries should be skipped (no episode created)
440
- // The summary has scope "weekly" with a non-conversation-id scope_key
441
- // so it should be skipped by the extractConversationId check.
442
- // (Weekly summaries have no valid conversation to link to.)
443
- expect(countRows("memory_episodes")).toBe(0);
444
- });
445
- });
446
-
447
- // ── 2. Default flag state ─────────────────────────────────────────
448
-
449
- describe("simplified memory enabled by default", () => {
450
- test("config defaults to simplified.enabled = true", () => {
451
- expect(testConfig.memory.simplified.enabled).toBe(true);
452
- });
453
-
454
- test("can be disabled for rollback via config override", () => {
455
- testConfig = {
456
- ...testConfig,
457
- memory: {
458
- ...testConfig.memory,
459
- simplified: {
460
- ...testConfig.memory.simplified,
461
- enabled: false,
462
- },
463
- },
464
- };
465
- expect(testConfig.memory.simplified.enabled).toBe(false);
466
- });
467
- });
468
-
469
- // ── 3. Memory tools use simplified path ────────────────────────────
470
-
471
- describe("memory tools use simplified system when enabled", () => {
472
- test("memory_save writes to observations when simplified is enabled", async () => {
473
- const convId = uuid();
474
- createConversation(convId);
475
-
476
- const result = await handleMemorySave(
477
- {
478
- statement: "User prefers dark mode",
479
- kind: "preference",
480
- subject: "UI theme",
481
- },
482
- testConfig,
483
- convId,
484
- undefined,
485
- "default",
486
- );
487
-
488
- expect(result.isError).toBe(false);
489
- expect(result.content).toContain("Saved to memory");
490
-
491
- // Should have written to observations, not memory_items
492
- expect(countRows("memory_observations")).toBeGreaterThanOrEqual(1);
493
- });
494
-
495
- test("memory_save writes to memory_items when simplified is disabled", async () => {
496
- testConfig = {
497
- ...testConfig,
498
- memory: {
499
- ...testConfig.memory,
500
- simplified: {
501
- ...testConfig.memory.simplified,
502
- enabled: false,
503
- },
504
- },
505
- };
506
-
507
- const convId = uuid();
508
- createConversation(convId);
509
-
510
- const result = await handleMemorySave(
511
- {
512
- statement: "User prefers light mode",
513
- kind: "preference",
514
- subject: "UI theme",
515
- },
516
- testConfig,
517
- convId,
518
- undefined,
519
- "default",
520
- );
521
-
522
- expect(result.isError).toBe(false);
523
- expect(result.content).toContain("Saved to memory");
524
-
525
- // Should have written to legacy memory_items
526
- expect(countRows("memory_items")).toBeGreaterThanOrEqual(1);
527
- });
528
-
529
- test("memory_recall uses archive recall when simplified is enabled", async () => {
530
- // Insert some archive data that the recall can find
531
- const convId = uuid();
532
- createConversation(convId);
533
-
534
- insertObservation({
535
- conversationId: convId,
536
- role: "user",
537
- content:
538
- "User mentioned that their favorite programming language is TypeScript",
539
- scopeId: "default",
540
- modality: "text",
541
- source: "test",
542
- });
543
-
544
- const result = await handleMemoryRecall(
545
- { query: "programming language TypeScript" },
546
- testConfig,
547
- "default",
548
- convId,
549
- );
550
-
551
- expect(result.isError).toBe(false);
552
- // The result should be valid JSON
553
- const parsed = JSON.parse(result.content);
554
- expect(parsed).toBeDefined();
555
- expect(typeof parsed.text).toBe("string");
556
- expect(typeof parsed.resultCount).toBe("number");
557
- });
558
- });
559
-
560
- // ── 4. Legacy tables remain available ──────────────────────────────
561
-
562
- describe("legacy tables remain for rollback", () => {
563
- test("legacy memory_items table still exists and is writable", () => {
564
- const db = getDb();
565
- const now = Date.now();
566
-
567
- // Write to the legacy table should succeed
568
- db.insert(memoryItems)
569
- .values({
570
- id: uuid(),
571
- kind: "preference",
572
- subject: "Test",
573
- statement: "Test statement",
574
- status: "active",
575
- confidence: 0.9,
576
- importance: 0.8,
577
- fingerprint: `fp-${uuid()}`,
578
- verificationState: "assistant_inferred",
579
- scopeId: "default",
580
- firstSeenAt: now,
581
- lastSeenAt: now,
582
- })
583
- .run();
584
-
585
- expect(countRows("memory_items")).toBe(1);
586
- });
587
-
588
- test("legacy memory_segments table still exists and is writable", () => {
589
- const convId = uuid();
590
- createConversation(convId);
591
- const msgId = uuid();
592
- insertMessage(msgId, convId, "user", "test");
593
-
594
- insertLegacySegment({
595
- id: uuid(),
596
- messageId: msgId,
597
- conversationId: convId,
598
- role: "user",
599
- text: "Test legacy segment",
600
- });
601
-
602
- expect(countRows("memory_segments")).toBe(1);
603
- });
604
-
605
- test("legacy memory_summaries table still exists and is writable", () => {
606
- const convId = uuid();
607
- createConversation(convId);
608
-
609
- insertLegacySummary({
610
- id: uuid(),
611
- scope: "conversation",
612
- scopeKey: convId,
613
- summary: "Test legacy summary",
614
- });
615
-
616
- expect(countRows("memory_summaries")).toBe(1);
617
- });
618
-
619
- test("switching to legacy mode by disabling simplified flag works", async () => {
620
- // First save with simplified enabled
621
- const convId = uuid();
622
- createConversation(convId);
623
-
624
- await handleMemorySave(
625
- {
626
- statement: "User likes coffee",
627
- kind: "preference",
628
- subject: "Beverage",
629
- },
630
- testConfig,
631
- convId,
632
- undefined,
633
- "default",
634
- );
635
-
636
- const simplifiedObs = countRows("memory_observations");
637
- expect(simplifiedObs).toBeGreaterThanOrEqual(1);
638
-
639
- // Now disable simplified and save — should go to legacy table
640
- testConfig = {
641
- ...testConfig,
642
- memory: {
643
- ...testConfig.memory,
644
- simplified: {
645
- ...testConfig.memory.simplified,
646
- enabled: false,
647
- },
648
- },
649
- };
650
-
651
- await handleMemorySave(
652
- {
653
- statement: "User likes tea",
654
- kind: "preference",
655
- subject: "Beverage",
656
- },
657
- testConfig,
658
- convId,
659
- undefined,
660
- "default",
661
- );
662
-
663
- expect(countRows("memory_items")).toBeGreaterThanOrEqual(1);
664
- });
665
- });
666
- });