@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,273 +0,0 @@
1
- import { mkdtempSync, rmSync } from "node:fs";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import { Database } from "bun:sqlite";
5
- import {
6
- afterAll,
7
- afterEach,
8
- beforeEach,
9
- describe,
10
- expect,
11
- mock,
12
- test,
13
- } from "bun:test";
14
-
15
- import { drizzle } from "drizzle-orm/bun-sqlite";
16
-
17
- const testDir = mkdtempSync(join(tmpdir(), "memory-reducer-checkpoints-"));
18
- const dbPath = join(testDir, "test.db");
19
- const originalBunTest = process.env.BUN_TEST;
20
-
21
- mock.module("../util/platform.js", () => ({
22
- getDataDir: () => testDir,
23
- isMacOS: () => process.platform === "darwin",
24
- isLinux: () => process.platform === "linux",
25
- isWindows: () => process.platform === "win32",
26
- getPidPath: () => join(testDir, "test.pid"),
27
- getDbPath: () => dbPath,
28
- getLogPath: () => join(testDir, "test.log"),
29
- ensureDataDir: () => {},
30
- getConversationsDir: () => join(testDir, "conversations"),
31
- }));
32
-
33
- mock.module("../util/logger.js", () => ({
34
- getLogger: () =>
35
- new Proxy({} as Record<string, unknown>, {
36
- get: () => () => {},
37
- }),
38
- }));
39
-
40
- import { initializeDb, resetDb } from "../memory/db.js";
41
- import { getSqliteFrom } from "../memory/db-connection.js";
42
- import { migrateMemoryReducerCheckpoints } from "../memory/migrations/187-memory-reducer-checkpoints.js";
43
- import * as schema from "../memory/schema.js";
44
-
45
- function createTestDb() {
46
- const sqlite = new Database(":memory:");
47
- sqlite.exec("PRAGMA journal_mode=WAL");
48
- sqlite.exec("PRAGMA foreign_keys = ON");
49
- return drizzle(sqlite, { schema });
50
- }
51
-
52
- function getColumnInfo(
53
- raw: Database,
54
- ): Array<{ name: string; notnull: number }> {
55
- return raw.query(`PRAGMA table_info(conversations)`).all() as Array<{
56
- name: string;
57
- notnull: number;
58
- }>;
59
- }
60
-
61
- function bootstrapPreCheckpointConversations(raw: Database): void {
62
- raw.exec(/*sql*/ `
63
- CREATE TABLE conversations (
64
- id TEXT PRIMARY KEY,
65
- title TEXT,
66
- created_at INTEGER NOT NULL,
67
- updated_at INTEGER NOT NULL,
68
- total_input_tokens INTEGER NOT NULL DEFAULT 0,
69
- total_output_tokens INTEGER NOT NULL DEFAULT 0,
70
- total_estimated_cost REAL NOT NULL DEFAULT 0,
71
- context_summary TEXT,
72
- context_compacted_message_count INTEGER NOT NULL DEFAULT 0,
73
- context_compacted_at INTEGER,
74
- conversation_type TEXT NOT NULL DEFAULT 'standard',
75
- source TEXT NOT NULL DEFAULT 'user',
76
- memory_scope_id TEXT NOT NULL DEFAULT 'default',
77
- origin_channel TEXT,
78
- origin_interface TEXT,
79
- fork_parent_conversation_id TEXT,
80
- fork_parent_message_id TEXT,
81
- is_auto_title INTEGER NOT NULL DEFAULT 1,
82
- schedule_job_id TEXT
83
- )
84
- `);
85
- }
86
-
87
- function removeTestDbFiles(): void {
88
- rmSync(dbPath, { force: true });
89
- rmSync(`${dbPath}-shm`, { force: true });
90
- rmSync(`${dbPath}-wal`, { force: true });
91
- }
92
-
93
- describe("memory reducer checkpoint columns migration", () => {
94
- beforeEach(() => {
95
- process.env.BUN_TEST = "0";
96
- resetDb();
97
- removeTestDbFiles();
98
- });
99
-
100
- afterEach(() => {
101
- resetDb();
102
- removeTestDbFiles();
103
- });
104
-
105
- afterAll(() => {
106
- if (originalBunTest === undefined) {
107
- delete process.env.BUN_TEST;
108
- } else {
109
- process.env.BUN_TEST = originalBunTest;
110
- }
111
- resetDb();
112
- removeTestDbFiles();
113
- try {
114
- rmSync(testDir, { recursive: true });
115
- } catch {
116
- /* best effort */
117
- }
118
- });
119
-
120
- test("fresh DB initialization includes nullable reducer checkpoint columns", () => {
121
- initializeDb();
122
-
123
- const raw = new Database(dbPath);
124
- const columns = getColumnInfo(raw);
125
-
126
- const checkpointColumns = columns.filter(
127
- (c) =>
128
- c.name === "memory_reduced_through_message_id" ||
129
- c.name === "memory_dirty_tail_since_message_id" ||
130
- c.name === "memory_last_reduced_at",
131
- );
132
-
133
- expect(checkpointColumns).toHaveLength(3);
134
- expect(checkpointColumns.every((c) => c.notnull === 0)).toBe(true);
135
-
136
- raw.close();
137
- });
138
-
139
- test("migration upgrades the pre-checkpoint schema without disturbing existing rows", () => {
140
- const db = createTestDb();
141
- const raw = getSqliteFrom(db);
142
- const now = Date.now();
143
-
144
- bootstrapPreCheckpointConversations(raw);
145
- raw.exec(/*sql*/ `
146
- INSERT INTO conversations (
147
- id,
148
- title,
149
- created_at,
150
- updated_at,
151
- conversation_type,
152
- source,
153
- memory_scope_id,
154
- is_auto_title
155
- ) VALUES (
156
- 'conv-upgrade',
157
- 'Existing conversation',
158
- ${now},
159
- ${now},
160
- 'standard',
161
- 'user',
162
- 'default',
163
- 1
164
- )
165
- `);
166
-
167
- migrateMemoryReducerCheckpoints(db);
168
-
169
- const columnNames = getColumnInfo(raw).map((c) => c.name);
170
- expect(columnNames).toContain("memory_reduced_through_message_id");
171
- expect(columnNames).toContain("memory_dirty_tail_since_message_id");
172
- expect(columnNames).toContain("memory_last_reduced_at");
173
-
174
- const row = raw
175
- .query(
176
- `SELECT id, title, memory_reduced_through_message_id, memory_dirty_tail_since_message_id, memory_last_reduced_at
177
- FROM conversations WHERE id = 'conv-upgrade'`,
178
- )
179
- .get() as {
180
- id: string;
181
- title: string | null;
182
- memory_reduced_through_message_id: string | null;
183
- memory_dirty_tail_since_message_id: string | null;
184
- memory_last_reduced_at: number | null;
185
- } | null;
186
-
187
- expect(row).toEqual({
188
- id: "conv-upgrade",
189
- title: "Existing conversation",
190
- memory_reduced_through_message_id: null,
191
- memory_dirty_tail_since_message_id: null,
192
- memory_last_reduced_at: null,
193
- });
194
-
195
- raw.close();
196
- });
197
-
198
- test("re-running the migration preserves populated checkpoint values", () => {
199
- const db = createTestDb();
200
- const raw = getSqliteFrom(db);
201
- const now = Date.now();
202
-
203
- bootstrapPreCheckpointConversations(raw);
204
- raw.exec(/*sql*/ `
205
- INSERT INTO conversations (
206
- id,
207
- title,
208
- created_at,
209
- updated_at,
210
- conversation_type,
211
- source,
212
- memory_scope_id,
213
- is_auto_title
214
- ) VALUES (
215
- 'conv-rerun',
216
- 'Reduced conversation',
217
- ${now},
218
- ${now},
219
- 'standard',
220
- 'user',
221
- 'default',
222
- 1
223
- )
224
- `);
225
-
226
- migrateMemoryReducerCheckpoints(db);
227
- raw.exec(/*sql*/ `
228
- UPDATE conversations
229
- SET memory_reduced_through_message_id = 'msg-100',
230
- memory_dirty_tail_since_message_id = 'msg-101',
231
- memory_last_reduced_at = ${now}
232
- WHERE id = 'conv-rerun'
233
- `);
234
-
235
- expect(() => migrateMemoryReducerCheckpoints(db)).not.toThrow();
236
-
237
- const row = raw
238
- .query(
239
- `SELECT memory_reduced_through_message_id, memory_dirty_tail_since_message_id, memory_last_reduced_at
240
- FROM conversations WHERE id = 'conv-rerun'`,
241
- )
242
- .get() as {
243
- memory_reduced_through_message_id: string | null;
244
- memory_dirty_tail_since_message_id: string | null;
245
- memory_last_reduced_at: number | null;
246
- } | null;
247
-
248
- expect(row).toEqual({
249
- memory_reduced_through_message_id: "msg-100",
250
- memory_dirty_tail_since_message_id: "msg-101",
251
- memory_last_reduced_at: now,
252
- });
253
-
254
- raw.close();
255
- });
256
-
257
- test("getConversation exposes the new checkpoint fields as null for new rows", async () => {
258
- initializeDb();
259
-
260
- // Dynamic import to avoid circular module init issues — conversation-crud
261
- // depends on getDb being initialized which happens in initializeDb above.
262
- const { createConversation, getConversation } =
263
- await import("../memory/conversation-crud.js");
264
-
265
- const created = createConversation("Test conversation");
266
- const loaded = getConversation(created.id);
267
-
268
- expect(loaded).not.toBeNull();
269
- expect(loaded!.memoryReducedThroughMessageId).toBeNull();
270
- expect(loaded!.memoryDirtyTailSinceMessageId).toBeNull();
271
- expect(loaded!.memoryLastReducedAt).toBeNull();
272
- });
273
- });
@@ -1,288 +0,0 @@
1
- /**
2
- * Tests for the diagnostics export route handler.
3
- *
4
- * Validates anchor message resolution, including the fallback chain
5
- * (specific ID → most recent assistant → any message → empty conversation).
6
- */
7
-
8
- import { mkdtempSync, readFileSync, rmSync } from "node:fs";
9
- import { tmpdir } from "node:os";
10
- import { join } from "node:path";
11
- import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
12
-
13
- import JSZip from "jszip";
14
-
15
- const testDir = mkdtempSync(join(tmpdir(), "diagnostics-export-test-"));
16
-
17
- mock.module("../util/platform.js", () => ({
18
- getDataDir: () => testDir,
19
- isMacOS: () => process.platform === "darwin",
20
- isLinux: () => process.platform === "linux",
21
- isWindows: () => process.platform === "win32",
22
- getPidPath: () => join(testDir, "test.pid"),
23
- getDbPath: () => join(testDir, "test.db"),
24
- getLogPath: () => join(testDir, "test.log"),
25
- ensureDataDir: () => {},
26
- }));
27
-
28
- mock.module("../util/logger.js", () => ({
29
- getLogger: () =>
30
- new Proxy({} as Record<string, unknown>, {
31
- get: () => () => {},
32
- }),
33
- }));
34
-
35
- import { getSqlite, initializeDb, resetDb } from "../memory/db.js";
36
- import { diagnosticsRouteDefinitions } from "../runtime/routes/diagnostics-routes.js";
37
-
38
- initializeDb();
39
-
40
- afterAll(() => {
41
- resetDb();
42
- try {
43
- rmSync(testDir, { recursive: true });
44
- } catch {
45
- /* best effort */
46
- }
47
- });
48
-
49
- // ---------------------------------------------------------------------------
50
- // Helpers
51
- // ---------------------------------------------------------------------------
52
-
53
- const routes = diagnosticsRouteDefinitions();
54
- const exportRoute = routes.find((r) => r.endpoint === "diagnostics/export")!;
55
-
56
- async function callExport(body: Record<string, unknown>): Promise<Response> {
57
- const req = new Request("http://localhost/v1/diagnostics/export", {
58
- method: "POST",
59
- headers: { "Content-Type": "application/json" },
60
- body: JSON.stringify(body),
61
- });
62
- const url = new URL(req.url);
63
- return exportRoute.handler({
64
- req,
65
- url,
66
- server: null as never,
67
- authContext: {} as never,
68
- params: {},
69
- });
70
- }
71
-
72
- const db = () => getSqlite();
73
-
74
- function seedConversation(id: string): void {
75
- const now = Date.now();
76
- db().run(
77
- "INSERT INTO conversations (id, title, created_at, updated_at) VALUES (?, ?, ?, ?)",
78
- [id, "Test", now, now],
79
- );
80
- }
81
-
82
- function seedMessage(
83
- id: string,
84
- conversationId: string,
85
- role: string,
86
- content: string,
87
- createdAt: number,
88
- ): void {
89
- db().run(
90
- "INSERT INTO messages (id, conversation_id, role, content, created_at) VALUES (?, ?, ?, ?, ?)",
91
- [id, conversationId, role, content, createdAt],
92
- );
93
- }
94
-
95
- function seedLlmRequestLog(
96
- id: string,
97
- conversationId: string,
98
- provider: string | null,
99
- requestPayload: unknown,
100
- responsePayload: unknown,
101
- createdAt: number,
102
- ): void {
103
- db().run(
104
- "INSERT INTO llm_request_logs (id, conversation_id, provider, request_payload, response_payload, created_at) VALUES (?, ?, ?, ?, ?, ?)",
105
- [
106
- id,
107
- conversationId,
108
- provider,
109
- JSON.stringify(requestPayload),
110
- JSON.stringify(responsePayload),
111
- createdAt,
112
- ],
113
- );
114
- }
115
-
116
- function seedConversationKey(
117
- conversationKey: string,
118
- conversationId: string,
119
- ): void {
120
- db().run(
121
- "INSERT INTO conversation_keys (id, conversation_key, conversation_id, created_at) VALUES (?, ?, ?, ?)",
122
- [crypto.randomUUID(), conversationKey, conversationId, Date.now()],
123
- );
124
- }
125
-
126
- function cleanDb(): void {
127
- db().run("DELETE FROM messages");
128
- db().run("DELETE FROM llm_request_logs");
129
- db().run("DELETE FROM conversation_keys");
130
- db().run("DELETE FROM conversations");
131
- }
132
-
133
- beforeEach(() => {
134
- cleanDb();
135
- });
136
-
137
- // ---------------------------------------------------------------------------
138
- // Tests
139
- // ---------------------------------------------------------------------------
140
-
141
- describe("diagnostics export", () => {
142
- test("returns 400 when conversationId is missing", async () => {
143
- const res = await callExport({});
144
- expect(res.status).toBe(400);
145
- });
146
-
147
- test("succeeds with specific anchorMessageId", async () => {
148
- const convId = "conv-1";
149
- const msgId = "msg-assistant-1";
150
- const now = Date.now();
151
-
152
- seedConversation(convId);
153
- seedMessage("msg-user-1", convId, "user", "hello", now - 1000);
154
- seedMessage(msgId, convId, "assistant", "world", now);
155
-
156
- const res = await callExport({
157
- conversationId: convId,
158
- anchorMessageId: msgId,
159
- });
160
- expect(res.status).toBe(200);
161
- const json = (await res.json()) as { success: boolean; filePath: string };
162
- expect(json.success).toBe(true);
163
- expect(json.filePath).toContain("diagnostics-");
164
- });
165
-
166
- test("falls back to most recent assistant message when anchorMessageId is omitted", async () => {
167
- const convId = "conv-2";
168
- const now = Date.now();
169
-
170
- seedConversation(convId);
171
- seedMessage("msg-user-1", convId, "user", "hello", now - 1000);
172
- seedMessage("msg-assistant-1", convId, "assistant", "world", now);
173
-
174
- const res = await callExport({ conversationId: convId });
175
- expect(res.status).toBe(200);
176
- const json = (await res.json()) as { success: boolean };
177
- expect(json.success).toBe(true);
178
- });
179
-
180
- test("falls back to any message when no assistant messages exist (race condition fix)", async () => {
181
- const convId = "conv-3";
182
- const now = Date.now();
183
-
184
- seedConversation(convId);
185
- // Only a user message — assistant response hasn't been persisted yet
186
- seedMessage("msg-user-1", convId, "user", "hello", now);
187
-
188
- const res = await callExport({ conversationId: convId });
189
- expect(res.status).toBe(200);
190
- const json = (await res.json()) as { success: boolean; filePath: string };
191
- expect(json.success).toBe(true);
192
- expect(json.filePath).toContain("diagnostics-");
193
- });
194
-
195
- test("succeeds with empty conversation (no messages at all)", async () => {
196
- const convId = "conv-4";
197
-
198
- seedConversation(convId);
199
- // No messages at all — conversation was just created
200
-
201
- const res = await callExport({ conversationId: convId });
202
- expect(res.status).toBe(200);
203
- const json = (await res.json()) as { success: boolean; filePath: string };
204
- expect(json.success).toBe(true);
205
- expect(json.filePath).toContain("diagnostics-");
206
- });
207
-
208
- test("resolves conversation key to daemon conversation ID", async () => {
209
- const daemonConvId = "conv-6-daemon";
210
- const clientKey = "AAAAAAAA-BBBB-CCCC-DDDD-EEEEEEEEEEEE";
211
- const now = Date.now();
212
-
213
- seedConversation(daemonConvId);
214
- seedConversationKey(clientKey, daemonConvId);
215
- seedMessage("msg-user-6", daemonConvId, "user", "hello", now - 1000);
216
- seedMessage("msg-assistant-6", daemonConvId, "assistant", "world", now);
217
-
218
- // Client sends the conversation key (client-side UUID), not the daemon ID
219
- const res = await callExport({ conversationId: clientKey });
220
- expect(res.status).toBe(200);
221
- const json = (await res.json()) as { success: boolean; filePath: string };
222
- expect(json.success).toBe(true);
223
- // The export should find the messages via the resolved daemon ID
224
- expect(json.filePath).toContain("diagnostics-");
225
- });
226
-
227
- test("falls back to any-message when anchorMessageId is provided but not found", async () => {
228
- const convId = "conv-5";
229
- const now = Date.now();
230
-
231
- seedConversation(convId);
232
- seedMessage("msg-user-1", convId, "user", "hello", now);
233
-
234
- // anchorMessageId doesn't exist — should fall through all the way
235
- const res = await callExport({
236
- conversationId: convId,
237
- anchorMessageId: "nonexistent-msg-id",
238
- });
239
- expect(res.status).toBe(200);
240
- const json = (await res.json()) as { success: boolean };
241
- expect(json.success).toBe(true);
242
- });
243
-
244
- test("preserves llm request provider identity in the exported JSONL", async () => {
245
- const convId = "conv-7";
246
- const now = Date.now();
247
-
248
- seedConversation(convId);
249
- seedMessage("msg-user-7", convId, "user", "hello", now - 1000);
250
- seedMessage("msg-assistant-7", convId, "assistant", "world", now);
251
- seedLlmRequestLog(
252
- "log-7",
253
- convId,
254
- "openrouter",
255
- { model: "openai/gpt-4.1-mini", input: "hello" },
256
- { output: "world" },
257
- now,
258
- );
259
-
260
- const res = await callExport({ conversationId: convId });
261
- expect(res.status).toBe(200);
262
- const json = (await res.json()) as { success: boolean; filePath: string };
263
- expect(json.success).toBe(true);
264
-
265
- const zip = await JSZip.loadAsync(readFileSync(json.filePath));
266
- const llmRequests = zip.file("llm_requests.jsonl");
267
- expect(llmRequests).not.toBeNull();
268
-
269
- const lines = (await llmRequests!.async("string")).trim().split("\n");
270
- expect(lines).toHaveLength(1);
271
-
272
- const row = JSON.parse(lines[0]) as {
273
- id: string;
274
- conversationId: string;
275
- provider?: string | null;
276
- request: unknown;
277
- response: unknown;
278
- };
279
-
280
- expect(row).toMatchObject({
281
- id: "log-7",
282
- conversationId: convId,
283
- provider: "openrouter",
284
- });
285
-
286
- rmSync(json.filePath, { force: true });
287
- });
288
- });