@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,453 +0,0 @@
1
- /**
2
- * Tests for the chunk dual-write path in the memory indexer.
3
- *
4
- * The indexer now writes both legacy memory_segments AND archive
5
- * memory_chunks using the same segmentation boundaries. These tests
6
- * verify:
7
- *
8
- * 1. Chunks are created alongside segments with matching boundaries.
9
- * 2. Unchanged chunk content does not enqueue duplicate embed_chunk jobs.
10
- * 3. Changed chunk content enqueues an embed_chunk job.
11
- * 4. The legacy memory_segments path remains intact.
12
- */
13
-
14
- import { mkdtempSync, rmSync } from "node:fs";
15
- import { tmpdir } from "node:os";
16
- import { join } from "node:path";
17
- import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
18
-
19
- import { eq } from "drizzle-orm";
20
-
21
- const testDir = mkdtempSync(join(tmpdir(), "memory-chunk-dual-write-"));
22
-
23
- mock.module("../util/platform.js", () => ({
24
- getDataDir: () => testDir,
25
- isMacOS: () => process.platform === "darwin",
26
- isLinux: () => process.platform === "linux",
27
- isWindows: () => process.platform === "win32",
28
- getPidPath: () => join(testDir, "test.pid"),
29
- getDbPath: () => join(testDir, "test.db"),
30
- getLogPath: () => join(testDir, "test.log"),
31
- ensureDataDir: () => {},
32
- }));
33
-
34
- mock.module("../util/logger.js", () => ({
35
- getLogger: () =>
36
- new Proxy({} as Record<string, unknown>, {
37
- get: () => () => {},
38
- }),
39
- }));
40
-
41
- mock.module("../memory/qdrant-client.js", () => ({
42
- getQdrantClient: () => ({
43
- searchWithFilter: async () => [],
44
- hybridSearch: async () => [],
45
- upsertPoints: async () => {},
46
- deletePoints: async () => {},
47
- }),
48
- initQdrantClient: () => {},
49
- }));
50
-
51
- import { DEFAULT_CONFIG } from "../config/defaults.js";
52
-
53
- const TEST_CONFIG = {
54
- ...DEFAULT_CONFIG,
55
- memory: {
56
- ...DEFAULT_CONFIG.memory,
57
- enabled: true,
58
- extraction: {
59
- ...DEFAULT_CONFIG.memory.extraction,
60
- useLLM: false,
61
- },
62
- },
63
- };
64
-
65
- mock.module("../config/loader.js", () => ({
66
- loadConfig: () => TEST_CONFIG,
67
- getConfig: () => TEST_CONFIG,
68
- loadRawConfig: () => ({}),
69
- saveRawConfig: () => {},
70
- invalidateConfigCache: () => {},
71
- }));
72
-
73
- import { getDb, initializeDb, resetDb, resetTestTables } from "../memory/db.js";
74
- import { indexMessageNow } from "../memory/indexer.js";
75
- import {
76
- conversations,
77
- memoryChunks,
78
- memoryJobs,
79
- memoryObservations,
80
- memorySegments,
81
- messages,
82
- } from "../memory/schema.js";
83
-
84
- // Initialize DB once for the entire file. Each test cleans its own tables.
85
- initializeDb();
86
-
87
- afterAll(() => {
88
- resetDb();
89
- try {
90
- rmSync(testDir, { recursive: true });
91
- } catch {
92
- // best effort cleanup
93
- }
94
- });
95
-
96
- function resetTables() {
97
- resetTestTables(
98
- "memory_chunks",
99
- "memory_observations",
100
- "memory_segments",
101
- "memory_jobs",
102
- "messages",
103
- "conversations",
104
- );
105
- }
106
-
107
- /** Insert a minimal conversation + message row for FK references. */
108
- function seedConversationAndMessage(
109
- conversationId: string,
110
- messageId: string,
111
- text: string,
112
- ): void {
113
- const db = getDb();
114
- const now = Date.now();
115
- db.insert(conversations)
116
- .values({
117
- id: conversationId,
118
- title: null,
119
- createdAt: now,
120
- updatedAt: now,
121
- })
122
- .onConflictDoNothing()
123
- .run();
124
-
125
- db.insert(messages)
126
- .values({
127
- id: messageId,
128
- conversationId,
129
- role: "user",
130
- content: JSON.stringify([{ type: "text", text }]),
131
- createdAt: now,
132
- })
133
- .onConflictDoNothing()
134
- .run();
135
- }
136
-
137
- // ─────────────────────────────────────────────────────────────────────────────
138
- // Test suite: chunk dual-write alongside legacy segments
139
- // ─────────────────────────────────────────────────────────────────────────────
140
-
141
- describe("chunk dual-write from the memory indexer", () => {
142
- beforeEach(() => {
143
- resetTables();
144
- });
145
-
146
- test("indexing a message creates chunks alongside segments with matching boundaries", async () => {
147
- const conversationId = "conv-dual-write-basic";
148
- const messageId = "msg-dual-write-basic";
149
- const text =
150
- "I prefer TypeScript for large projects and always use strict mode.";
151
-
152
- seedConversationAndMessage(conversationId, messageId, text);
153
-
154
- const config = TEST_CONFIG.memory;
155
- const result = await indexMessageNow(
156
- {
157
- messageId,
158
- conversationId,
159
- role: "user",
160
- content: JSON.stringify([{ type: "text", text }]),
161
- createdAt: Date.now(),
162
- },
163
- config,
164
- );
165
-
166
- expect(result.indexedSegments).toBeGreaterThanOrEqual(1);
167
-
168
- const db = getDb();
169
-
170
- // Verify segments were created (legacy path)
171
- const segments = db
172
- .select()
173
- .from(memorySegments)
174
- .where(eq(memorySegments.messageId, messageId))
175
- .all();
176
- expect(segments.length).toBeGreaterThanOrEqual(1);
177
-
178
- // Verify chunks were created (dual-write path)
179
- const observationId = `obs:${messageId}`;
180
- const chunks = db
181
- .select()
182
- .from(memoryChunks)
183
- .where(eq(memoryChunks.observationId, observationId))
184
- .all();
185
- expect(chunks.length).toBe(segments.length);
186
-
187
- // Verify the observation was created
188
- const observation = db
189
- .select()
190
- .from(memoryObservations)
191
- .where(eq(memoryObservations.id, observationId))
192
- .get();
193
- expect(observation).toBeDefined();
194
- expect(observation!.conversationId).toBe(conversationId);
195
- expect(observation!.messageId).toBe(messageId);
196
- expect(observation!.role).toBe("user");
197
-
198
- // Verify chunk content matches segment content (same boundaries)
199
- for (let i = 0; i < segments.length; i++) {
200
- const chunkId = `chunk:${messageId}:${i}`;
201
- const chunk = chunks.find((c) => c.id === chunkId);
202
- expect(chunk).toBeDefined();
203
- expect(chunk!.content).toBe(segments[i].text);
204
- expect(chunk!.tokenEstimate).toBe(segments[i].tokenEstimate);
205
- expect(chunk!.scopeId).toBe(segments[i].scopeId);
206
- }
207
- });
208
-
209
- test("unchanged chunk content does not enqueue duplicate embed_chunk jobs", async () => {
210
- const conversationId = "conv-unchanged-chunk";
211
- const messageId = "msg-unchanged-chunk";
212
- const text =
213
- "My preferred timezone is America/Los_Angeles and I work remotely.";
214
-
215
- seedConversationAndMessage(conversationId, messageId, text);
216
-
217
- const config = TEST_CONFIG.memory;
218
- const content = JSON.stringify([{ type: "text", text }]);
219
-
220
- // First indexing — should enqueue embed_chunk jobs
221
- await indexMessageNow(
222
- {
223
- messageId,
224
- conversationId,
225
- role: "user",
226
- content,
227
- createdAt: Date.now(),
228
- },
229
- config,
230
- );
231
-
232
- const db = getDb();
233
- const jobsAfterFirst = db
234
- .select()
235
- .from(memoryJobs)
236
- .where(eq(memoryJobs.type, "embed_chunk"))
237
- .all();
238
- const firstChunkJobCount = jobsAfterFirst.length;
239
- expect(firstChunkJobCount).toBeGreaterThanOrEqual(1);
240
-
241
- // Second indexing with identical content — should NOT enqueue more embed_chunk jobs
242
- await indexMessageNow(
243
- {
244
- messageId,
245
- conversationId,
246
- role: "user",
247
- content,
248
- createdAt: Date.now(),
249
- },
250
- config,
251
- );
252
-
253
- const jobsAfterSecond = db
254
- .select()
255
- .from(memoryJobs)
256
- .where(eq(memoryJobs.type, "embed_chunk"))
257
- .all();
258
-
259
- // No new embed_chunk jobs should have been enqueued
260
- expect(jobsAfterSecond.length).toBe(firstChunkJobCount);
261
- });
262
-
263
- test("changed chunk content enqueues new embed_chunk jobs", async () => {
264
- const conversationId = "conv-changed-chunk";
265
- const messageId = "msg-changed-chunk";
266
- const textV1 = "I prefer React for frontend development work.";
267
- const textV2 =
268
- "I prefer Vue for frontend development work on large projects instead.";
269
-
270
- seedConversationAndMessage(conversationId, messageId, textV1);
271
-
272
- const config = TEST_CONFIG.memory;
273
-
274
- // First indexing
275
- await indexMessageNow(
276
- {
277
- messageId,
278
- conversationId,
279
- role: "user",
280
- content: JSON.stringify([{ type: "text", text: textV1 }]),
281
- createdAt: Date.now(),
282
- },
283
- config,
284
- );
285
-
286
- const db = getDb();
287
- const jobsAfterFirst = db
288
- .select()
289
- .from(memoryJobs)
290
- .where(eq(memoryJobs.type, "embed_chunk"))
291
- .all();
292
- const firstChunkJobCount = jobsAfterFirst.length;
293
- expect(firstChunkJobCount).toBeGreaterThanOrEqual(1);
294
-
295
- // Second indexing with DIFFERENT content — should enqueue new embed_chunk jobs
296
- await indexMessageNow(
297
- {
298
- messageId,
299
- conversationId,
300
- role: "user",
301
- content: JSON.stringify([{ type: "text", text: textV2 }]),
302
- createdAt: Date.now(),
303
- },
304
- config,
305
- );
306
-
307
- const jobsAfterSecond = db
308
- .select()
309
- .from(memoryJobs)
310
- .where(eq(memoryJobs.type, "embed_chunk"))
311
- .all();
312
-
313
- // New embed_chunk jobs should have been enqueued for the changed content
314
- expect(jobsAfterSecond.length).toBeGreaterThan(firstChunkJobCount);
315
- });
316
-
317
- test("legacy memory_segments path remains intact", async () => {
318
- const conversationId = "conv-legacy-compat";
319
- const messageId = "msg-legacy-compat";
320
- const text =
321
- "I always prefer concise code reviews and I work in a distributed team.";
322
-
323
- seedConversationAndMessage(conversationId, messageId, text);
324
-
325
- const config = TEST_CONFIG.memory;
326
- const result = await indexMessageNow(
327
- {
328
- messageId,
329
- conversationId,
330
- role: "user",
331
- content: JSON.stringify([{ type: "text", text }]),
332
- createdAt: Date.now(),
333
- },
334
- config,
335
- );
336
-
337
- const db = getDb();
338
-
339
- // Legacy segments must be present and correctly formed
340
- const segments = db
341
- .select()
342
- .from(memorySegments)
343
- .where(eq(memorySegments.messageId, messageId))
344
- .all();
345
- expect(segments.length).toBe(result.indexedSegments);
346
-
347
- for (const seg of segments) {
348
- expect(seg.id.startsWith(messageId + ":")).toBe(true);
349
- expect(seg.conversationId).toBe(conversationId);
350
- expect(seg.role).toBe("user");
351
- expect(seg.text.length).toBeGreaterThan(0);
352
- expect(seg.contentHash).toBeTruthy();
353
- }
354
-
355
- // Legacy embed_segment jobs must be enqueued
356
- const segmentJobs = db
357
- .select()
358
- .from(memoryJobs)
359
- .where(eq(memoryJobs.type, "embed_segment"))
360
- .all();
361
- expect(segmentJobs.length).toBeGreaterThanOrEqual(1);
362
- });
363
-
364
- test("repeated indexing produces exactly one chunk per segment boundary", async () => {
365
- const conversationId = "conv-chunk-dedup";
366
- const messageId = "msg-chunk-dedup";
367
- const text =
368
- "I prefer TypeScript over plain JavaScript for large projects.";
369
-
370
- seedConversationAndMessage(conversationId, messageId, text);
371
-
372
- const config = TEST_CONFIG.memory;
373
- const content = JSON.stringify([{ type: "text", text }]);
374
-
375
- // Index the same message multiple times
376
- for (let i = 0; i < 5; i++) {
377
- await indexMessageNow(
378
- {
379
- messageId,
380
- conversationId,
381
- role: "user",
382
- content,
383
- createdAt: Date.now(),
384
- },
385
- config,
386
- );
387
- }
388
-
389
- const db = getDb();
390
- const observationId = `obs:${messageId}`;
391
-
392
- // Verify no duplicate chunks — one chunk per segment boundary
393
- const chunks = db
394
- .select()
395
- .from(memoryChunks)
396
- .where(eq(memoryChunks.observationId, observationId))
397
- .all();
398
- const segments = db
399
- .select()
400
- .from(memorySegments)
401
- .where(eq(memorySegments.messageId, messageId))
402
- .all();
403
-
404
- expect(chunks.length).toBe(segments.length);
405
-
406
- // Verify chunk IDs are unique
407
- const chunkIds = chunks.map((c) => c.id);
408
- const uniqueChunkIds = new Set(chunkIds);
409
- expect(uniqueChunkIds.size).toBe(chunkIds.length);
410
- });
411
-
412
- test("chunk dual-write respects custom scopeId", async () => {
413
- const conversationId = "conv-scope";
414
- const messageId = "msg-scope";
415
- const text = "Custom scoped message content.";
416
- const scopeId = "custom-scope-42";
417
-
418
- seedConversationAndMessage(conversationId, messageId, text);
419
-
420
- const config = TEST_CONFIG.memory;
421
- await indexMessageNow(
422
- {
423
- messageId,
424
- conversationId,
425
- role: "user",
426
- content: JSON.stringify([{ type: "text", text }]),
427
- createdAt: Date.now(),
428
- scopeId,
429
- },
430
- config,
431
- );
432
-
433
- const db = getDb();
434
- const observationId = `obs:${messageId}`;
435
-
436
- const observation = db
437
- .select()
438
- .from(memoryObservations)
439
- .where(eq(memoryObservations.id, observationId))
440
- .get();
441
- expect(observation!.scopeId).toBe(scopeId);
442
-
443
- const chunks = db
444
- .select()
445
- .from(memoryChunks)
446
- .where(eq(memoryChunks.observationId, observationId))
447
- .all();
448
- expect(chunks.length).toBeGreaterThanOrEqual(1);
449
- for (const chunk of chunks) {
450
- expect(chunk.scopeId).toBe(scopeId);
451
- }
452
- });
453
- });