@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,530 +0,0 @@
1
- import { mkdtempSync, rmSync } from "node:fs";
2
- import { tmpdir } from "node:os";
3
- import { join } from "node:path";
4
- import { afterAll, beforeEach, describe, expect, mock, test } from "bun:test";
5
-
6
- const testDir = mkdtempSync(join(tmpdir(), "brief-open-loops-test-"));
7
-
8
- mock.module("../util/platform.js", () => ({
9
- getDataDir: () => testDir,
10
- getRootDir: () => testDir,
11
- isMacOS: () => process.platform === "darwin",
12
- isLinux: () => process.platform === "linux",
13
- isWindows: () => process.platform === "win32",
14
- getPidPath: () => join(testDir, "test.pid"),
15
- getDbPath: () => join(testDir, "test.db"),
16
- getLogPath: () => join(testDir, "test.log"),
17
- ensureDataDir: () => {},
18
- }));
19
-
20
- mock.module("../util/logger.js", () => ({
21
- getLogger: () =>
22
- new Proxy({} as Record<string, unknown>, {
23
- get: () => () => {},
24
- }),
25
- }));
26
-
27
- import { createFollowUp } from "../followups/followup-store.js";
28
- import { compileOpenLoopBrief } from "../memory/brief-open-loops.js";
29
- import { initializeDb, resetDb } from "../memory/db.js";
30
- import { getSqlite } from "../memory/db-connection.js";
31
- import { resetTestTables } from "../memory/raw-query.js";
32
- import { createTask } from "../tasks/task-store.js";
33
-
34
- initializeDb();
35
-
36
- // ── Helpers ──────────────────────────────────────────────────────────
37
-
38
- const SCOPE = "test-scope";
39
- const MS_HOUR = 60 * 60 * 1000;
40
- const MS_DAY = 24 * MS_HOUR;
41
-
42
- /** Get the raw bun:sqlite Database for parameterized inserts. */
43
- function getRawDb(): import("bun:sqlite").Database {
44
- return getSqlite();
45
- }
46
-
47
- function insertOpenLoop(opts: {
48
- id: string;
49
- summary: string;
50
- dueAt?: number | null;
51
- surfacedAt?: number | null;
52
- status?: string;
53
- updatedAt?: number;
54
- createdAt?: number;
55
- }): void {
56
- const raw = getRawDb();
57
- const now = Date.now();
58
- raw.run(
59
- `INSERT INTO open_loops (id, scope_id, summary, status, source, due_at, surfaced_at, created_at, updated_at)
60
- VALUES (?, ?, ?, ?, 'conversation', ?, ?, ?, ?)`,
61
- [
62
- opts.id,
63
- SCOPE,
64
- opts.summary,
65
- opts.status ?? "open",
66
- opts.dueAt ?? null,
67
- opts.surfacedAt ?? null,
68
- opts.createdAt ?? now,
69
- opts.updatedAt ?? now,
70
- ],
71
- );
72
- }
73
-
74
- function insertWorkItem(opts: {
75
- id: string;
76
- taskId: string;
77
- title: string;
78
- status?: string;
79
- priorityTier?: number;
80
- updatedAt?: number;
81
- }): void {
82
- const raw = getRawDb();
83
- const now = Date.now();
84
- raw.run(
85
- `INSERT INTO work_items (id, task_id, title, status, priority_tier, sort_index, created_at, updated_at)
86
- VALUES (?, ?, ?, ?, ?, 0, ?, ?)`,
87
- [
88
- opts.id,
89
- opts.taskId,
90
- opts.title,
91
- opts.status ?? "queued",
92
- opts.priorityTier ?? 1,
93
- now,
94
- opts.updatedAt ?? now,
95
- ],
96
- );
97
- }
98
-
99
- // ── Teardown ─────────────────────────────────────────────────────────
100
-
101
- afterAll(() => {
102
- resetDb();
103
- try {
104
- rmSync(testDir, { recursive: true });
105
- } catch {
106
- /* best effort */
107
- }
108
- });
109
-
110
- beforeEach(() => {
111
- resetTestTables(
112
- "open_loops",
113
- "work_items",
114
- "tasks",
115
- "task_runs",
116
- "followups",
117
- );
118
- });
119
-
120
- // ── Tests ────────────────────────────────────────────────────────────
121
-
122
- describe("compileOpenLoopBrief", () => {
123
- test("returns empty when no data exists", () => {
124
- const result = compileOpenLoopBrief(SCOPE, "msg-1");
125
- expect(result.bullets).toEqual([]);
126
- expect(result.resurfacedLoopId).toBeNull();
127
- });
128
-
129
- // ── Tier ranking ──────────────────────────────────────────────────
130
-
131
- describe("tier ranking", () => {
132
- test("overdue loops are tier 1", () => {
133
- const now = Date.now();
134
- insertOpenLoop({
135
- id: "ol-overdue",
136
- summary: "Overdue task",
137
- dueAt: now - MS_HOUR,
138
- updatedAt: now - MS_DAY * 10,
139
- });
140
-
141
- const result = compileOpenLoopBrief(SCOPE, "msg-1", now);
142
- expect(result.bullets).toHaveLength(1);
143
- expect(result.bullets[0].tier).toBe(1);
144
- expect(result.bullets[0].summary).toBe("Overdue task");
145
- });
146
-
147
- test("loops due within 24h are tier 2", () => {
148
- const now = Date.now();
149
- insertOpenLoop({
150
- id: "ol-24h",
151
- summary: "Due soon",
152
- dueAt: now + 12 * MS_HOUR,
153
- updatedAt: now - MS_DAY * 10,
154
- });
155
-
156
- const result = compileOpenLoopBrief(SCOPE, "msg-1", now);
157
- expect(result.bullets).toHaveLength(1);
158
- expect(result.bullets[0].tier).toBe(2);
159
- });
160
-
161
- test("loops due within 7d are tier 3", () => {
162
- const now = Date.now();
163
- insertOpenLoop({
164
- id: "ol-7d",
165
- summary: "Due this week",
166
- dueAt: now + 3 * MS_DAY,
167
- updatedAt: now - MS_DAY * 10,
168
- });
169
-
170
- const result = compileOpenLoopBrief(SCOPE, "msg-1", now);
171
- expect(result.bullets).toHaveLength(1);
172
- expect(result.bullets[0].tier).toBe(3);
173
- });
174
-
175
- test("high-priority work items are tier 4", () => {
176
- const now = Date.now();
177
- const task = createTask({ title: "t", template: "t" });
178
- insertWorkItem({
179
- id: "wi-high",
180
- taskId: task.id,
181
- title: "High priority item",
182
- priorityTier: 0,
183
- updatedAt: now - MS_DAY * 10,
184
- });
185
-
186
- const result = compileOpenLoopBrief(SCOPE, "msg-1", now);
187
- const wiBullet = result.bullets.find((b) => b.source === "work_item");
188
- expect(wiBullet).toBeDefined();
189
- expect(wiBullet!.tier).toBe(4);
190
- });
191
-
192
- test("recently touched loops are tier 5", () => {
193
- const now = Date.now();
194
- insertOpenLoop({
195
- id: "ol-recent",
196
- summary: "Just updated",
197
- updatedAt: now - MS_HOUR,
198
- });
199
-
200
- const result = compileOpenLoopBrief(SCOPE, "msg-1", now);
201
- expect(result.bullets).toHaveLength(1);
202
- expect(result.bullets[0].tier).toBe(5);
203
- });
204
-
205
- test("bullets are sorted by tier ascending", () => {
206
- const now = Date.now();
207
- insertOpenLoop({
208
- id: "ol-tier3",
209
- summary: "Due this week",
210
- dueAt: now + 3 * MS_DAY,
211
- updatedAt: now - MS_DAY * 10,
212
- });
213
- insertOpenLoop({
214
- id: "ol-tier1",
215
- summary: "Overdue",
216
- dueAt: now - MS_HOUR,
217
- updatedAt: now - MS_DAY * 10,
218
- });
219
- insertOpenLoop({
220
- id: "ol-tier5",
221
- summary: "Recent",
222
- updatedAt: now - MS_HOUR,
223
- });
224
-
225
- const result = compileOpenLoopBrief(SCOPE, "msg-1", now);
226
- const tiers = result.bullets.map((b) => b.tier);
227
- expect(tiers).toEqual([...tiers].sort((a, b) => a - b));
228
- expect(tiers[0]).toBe(1);
229
- });
230
- });
231
-
232
- // ── Deduplication ─────────────────────────────────────────────────
233
-
234
- describe("deduplication", () => {
235
- test("work items with the same summary as an open loop are deduplicated", () => {
236
- const now = Date.now();
237
- const task = createTask({ title: "t", template: "t" });
238
-
239
- insertOpenLoop({
240
- id: "ol-dup",
241
- summary: "Review PR",
242
- dueAt: now + MS_HOUR,
243
- updatedAt: now,
244
- });
245
- insertWorkItem({
246
- id: "wi-dup",
247
- taskId: task.id,
248
- title: "Review PR",
249
- updatedAt: now,
250
- });
251
-
252
- const result = compileOpenLoopBrief(SCOPE, "msg-1", now);
253
- const summaries = result.bullets.map((b) => b.summary);
254
- // Should only appear once (from the loop)
255
- expect(summaries.filter((s) => s === "Review PR")).toHaveLength(1);
256
- expect(
257
- result.bullets.find((b) => b.summary === "Review PR")!.source,
258
- ).toBe("loop");
259
- });
260
-
261
- test("case-insensitive deduplication", () => {
262
- const now = Date.now();
263
- const task = createTask({ title: "t", template: "t" });
264
-
265
- insertOpenLoop({
266
- id: "ol-case",
267
- summary: "deploy release",
268
- dueAt: now + MS_HOUR,
269
- updatedAt: now,
270
- });
271
- insertWorkItem({
272
- id: "wi-case",
273
- taskId: task.id,
274
- title: "Deploy Release",
275
- updatedAt: now,
276
- });
277
-
278
- const result = compileOpenLoopBrief(SCOPE, "msg-1", now);
279
- const matching = result.bullets.filter(
280
- (b) => b.summary.toLowerCase() === "deploy release",
281
- );
282
- expect(matching).toHaveLength(1);
283
- });
284
-
285
- test("unique keys are not deduplicated", () => {
286
- const now = Date.now();
287
- const task = createTask({ title: "t", template: "t" });
288
-
289
- insertOpenLoop({
290
- id: "ol-a",
291
- summary: "Fix bug",
292
- dueAt: now + MS_HOUR,
293
- updatedAt: now,
294
- });
295
- insertWorkItem({
296
- id: "wi-b",
297
- taskId: task.id,
298
- title: "Write tests",
299
- updatedAt: now,
300
- });
301
-
302
- const result = compileOpenLoopBrief(SCOPE, "msg-1", now);
303
- expect(result.bullets).toHaveLength(2);
304
- });
305
- });
306
-
307
- // ── Follow-up integration ────────────────────────────────────────
308
-
309
- describe("follow-ups", () => {
310
- test("overdue follow-ups appear as tier 1", () => {
311
- const now = Date.now();
312
- createFollowUp({
313
- channel: "email",
314
- conversationId: "conv-1",
315
- expectedResponseBy: now - MS_HOUR,
316
- });
317
-
318
- const result = compileOpenLoopBrief(SCOPE, "msg-1", now);
319
- const fuBullet = result.bullets.find((b) => b.source === "followup");
320
- expect(fuBullet).toBeDefined();
321
- expect(fuBullet!.tier).toBe(1);
322
- });
323
-
324
- test("pending follow-ups due within 24h are tier 2", () => {
325
- const now = Date.now();
326
- createFollowUp({
327
- channel: "slack",
328
- conversationId: "conv-2",
329
- expectedResponseBy: now + 12 * MS_HOUR,
330
- });
331
-
332
- const result = compileOpenLoopBrief(SCOPE, "msg-1", now);
333
- const fuBullet = result.bullets.find((b) => b.source === "followup");
334
- expect(fuBullet).toBeDefined();
335
- expect(fuBullet!.tier).toBe(2);
336
- });
337
- });
338
-
339
- // ── Deterministic resurfacing ────────────────────────────────────
340
-
341
- describe("deterministic resurfacing", () => {
342
- test("resurfaces one low-salience loop from open_loops", () => {
343
- const now = Date.now();
344
- // Create loops that are old and have no due date → tier 6 (low salience)
345
- insertOpenLoop({
346
- id: "ol-old-1",
347
- summary: "Old loop 1",
348
- updatedAt: now - MS_DAY * 30,
349
- createdAt: now - MS_DAY * 30,
350
- });
351
- insertOpenLoop({
352
- id: "ol-old-2",
353
- summary: "Old loop 2",
354
- updatedAt: now - MS_DAY * 30,
355
- createdAt: now - MS_DAY * 30,
356
- });
357
- insertOpenLoop({
358
- id: "ol-old-3",
359
- summary: "Old loop 3",
360
- updatedAt: now - MS_DAY * 30,
361
- createdAt: now - MS_DAY * 30,
362
- });
363
-
364
- const result = compileOpenLoopBrief(SCOPE, "msg-resurface", now);
365
-
366
- // Exactly one should be resurfaced
367
- expect(result.resurfacedLoopId).not.toBeNull();
368
- expect(result.bullets).toHaveLength(1);
369
- expect(result.bullets[0].tier).toBe(5);
370
- });
371
-
372
- test("resurfacing is deterministic for the same seed", () => {
373
- const now = Date.now();
374
- for (let i = 1; i <= 5; i++) {
375
- insertOpenLoop({
376
- id: `ol-det-${i}`,
377
- summary: `Deterministic loop ${i}`,
378
- updatedAt: now - MS_DAY * 30,
379
- createdAt: now - MS_DAY * 30,
380
- });
381
- }
382
-
383
- const r1 = compileOpenLoopBrief(SCOPE, "msg-det", now);
384
-
385
- // Reset surfacedAt and updatedAt so the second call has same candidates
386
- // (updateLastSurfacedAt also writes updatedAt, which would change tier)
387
- const oldUpdatedAt = now - MS_DAY * 30;
388
- getRawDb().run(
389
- `UPDATE open_loops SET surfaced_at = NULL, updated_at = ?`,
390
- [oldUpdatedAt],
391
- );
392
-
393
- const r2 = compileOpenLoopBrief(SCOPE, "msg-det", now);
394
-
395
- expect(r1.resurfacedLoopId).toBe(r2.resurfacedLoopId);
396
- });
397
-
398
- test("different userMessageId produces different selection", () => {
399
- const now = Date.now();
400
- // Need enough loops that different seeds are likely to pick different ones
401
- for (let i = 1; i <= 20; i++) {
402
- insertOpenLoop({
403
- id: `ol-vary-${i}`,
404
- summary: `Varying loop ${i}`,
405
- updatedAt: now - MS_DAY * 30,
406
- createdAt: now - MS_DAY * 30,
407
- });
408
- }
409
-
410
- const selections = new Set<string | null>();
411
- const oldUpdatedAt = now - MS_DAY * 30;
412
- for (let i = 0; i < 10; i++) {
413
- // Reset surfacedAt and updatedAt between calls so all loops stay low-salience
414
- getRawDb().run(
415
- `UPDATE open_loops SET surfaced_at = NULL, updated_at = ?`,
416
- [oldUpdatedAt],
417
- );
418
- const r = compileOpenLoopBrief(SCOPE, `msg-vary-${i}`, now);
419
- selections.add(r.resurfacedLoopId);
420
- }
421
-
422
- // With 20 candidates and 10 different seeds, we should see at least 2
423
- // different selections (overwhelmingly likely)
424
- expect(selections.size).toBeGreaterThanOrEqual(2);
425
- });
426
-
427
- test("updates surfacedAt on the resurfaced loop", () => {
428
- const now = Date.now();
429
- insertOpenLoop({
430
- id: "ol-surf",
431
- summary: "Will be surfaced",
432
- updatedAt: now - MS_DAY * 30,
433
- createdAt: now - MS_DAY * 30,
434
- });
435
-
436
- const result = compileOpenLoopBrief(SCOPE, "msg-surf", now);
437
- expect(result.resurfacedLoopId).toBe("ol-surf");
438
-
439
- // Verify surfacedAt was written
440
- const surfaced = getRawDb()
441
- .query(`SELECT surfaced_at FROM open_loops WHERE id = 'ol-surf'`)
442
- .get() as { surfaced_at: number } | null;
443
- expect(surfaced).not.toBeNull();
444
- expect(surfaced!.surfaced_at).toBe(now);
445
- });
446
-
447
- test("low-salience work items are not resurfaced", () => {
448
- const now = Date.now();
449
- const task = createTask({ title: "t", template: "t" });
450
-
451
- // Only work items, no loops — should not resurface
452
- insertWorkItem({
453
- id: "wi-old",
454
- taskId: task.id,
455
- title: "Old work item",
456
- updatedAt: now - MS_DAY * 30,
457
- });
458
-
459
- const result = compileOpenLoopBrief(SCOPE, "msg-no-resurface", now);
460
- expect(result.resurfacedLoopId).toBeNull();
461
- // Work item is tier 6, so it should not appear in ranked output
462
- expect(result.bullets).toHaveLength(0);
463
- });
464
- });
465
-
466
- // ── Scope isolation ──────────────────────────────────────────────
467
-
468
- describe("scope isolation", () => {
469
- test("only includes loops from the specified scope", () => {
470
- const now = Date.now();
471
- insertOpenLoop({
472
- id: "ol-scope-a",
473
- summary: "In scope",
474
- dueAt: now + MS_HOUR,
475
- updatedAt: now,
476
- });
477
-
478
- // Insert loop for a different scope directly
479
- getRawDb().run(
480
- `INSERT INTO open_loops (id, scope_id, summary, status, source, due_at, created_at, updated_at)
481
- VALUES ('ol-scope-b', 'other-scope', 'Out of scope', 'open', 'conversation', ?, ?, ?)`,
482
- [now + MS_HOUR, now, now],
483
- );
484
-
485
- const result = compileOpenLoopBrief(SCOPE, "msg-scope", now);
486
- expect(result.bullets).toHaveLength(1);
487
- expect(result.bullets[0].summary).toBe("In scope");
488
- });
489
- });
490
-
491
- // ── Mixed sources ────────────────────────────────────────────────
492
-
493
- describe("mixed sources", () => {
494
- test("merges loops, work items, and follow-ups without duplicates", () => {
495
- const now = Date.now();
496
- const task = createTask({ title: "t", template: "t" });
497
-
498
- insertOpenLoop({
499
- id: "ol-mix",
500
- summary: "Loop item",
501
- dueAt: now - MS_HOUR,
502
- updatedAt: now,
503
- });
504
- insertWorkItem({
505
- id: "wi-mix",
506
- taskId: task.id,
507
- title: "Work item",
508
- priorityTier: 0,
509
- updatedAt: now,
510
- });
511
- createFollowUp({
512
- channel: "email",
513
- conversationId: "conv-mix",
514
- expectedResponseBy: now + 6 * MS_HOUR,
515
- });
516
-
517
- const result = compileOpenLoopBrief(SCOPE, "msg-mix", now);
518
- expect(result.bullets).toHaveLength(3);
519
-
520
- const sources = result.bullets.map((b) => b.source);
521
- expect(sources).toContain("loop");
522
- expect(sources).toContain("work_item");
523
- expect(sources).toContain("followup");
524
-
525
- // All keys are unique
526
- const keys = result.bullets.map((b) => b.key);
527
- expect(new Set(keys).size).toBe(keys.length);
528
- });
529
- });
530
- });