@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,285 +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-time-test-"));
7
-
8
- mock.module("../util/platform.js", () => ({
9
- getDataDir: () => testDir,
10
- isMacOS: () => process.platform === "darwin",
11
- isLinux: () => process.platform === "linux",
12
- isWindows: () => process.platform === "win32",
13
- getPidPath: () => join(testDir, "test.pid"),
14
- getDbPath: () => join(testDir, "test.db"),
15
- getLogPath: () => join(testDir, "test.log"),
16
- ensureDataDir: () => {},
17
- }));
18
-
19
- mock.module("../util/logger.js", () => ({
20
- getLogger: () =>
21
- new Proxy({} as Record<string, unknown>, {
22
- get: () => () => {},
23
- }),
24
- truncateForLog: (value: string) => value,
25
- }));
26
-
27
- import { compileTimeBrief } from "../memory/brief-time.js";
28
- import { getDb, initializeDb, resetDb } from "../memory/db.js";
29
- import { createSchedule } from "../schedule/schedule-store.js";
30
-
31
- initializeDb();
32
-
33
- const SCOPE_ID = "default";
34
- const HOUR = 60 * 60 * 1000;
35
- const DAY = 24 * HOUR;
36
-
37
- function getRawDb(): import("bun:sqlite").Database {
38
- return (getDb() as unknown as { $client: import("bun:sqlite").Database })
39
- .$client;
40
- }
41
-
42
- function insertTimeContext(opts: {
43
- id: string;
44
- summary: string;
45
- source?: string;
46
- activeFrom: number;
47
- activeUntil: number;
48
- scopeId?: string;
49
- }): void {
50
- const now = Date.now();
51
- getRawDb().run(
52
- `INSERT INTO time_contexts (id, scope_id, summary, source, active_from, active_until, created_at, updated_at)
53
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
54
- [
55
- opts.id,
56
- opts.scopeId ?? SCOPE_ID,
57
- opts.summary,
58
- opts.source ?? "conversation",
59
- opts.activeFrom,
60
- opts.activeUntil,
61
- now,
62
- now,
63
- ],
64
- );
65
- }
66
-
67
- afterAll(() => {
68
- resetDb();
69
- try {
70
- rmSync(testDir, { recursive: true });
71
- } catch {
72
- /* best effort */
73
- }
74
- });
75
-
76
- beforeEach(() => {
77
- getRawDb().run("DELETE FROM time_contexts");
78
- getRawDb().run("DELETE FROM cron_runs");
79
- getRawDb().run("DELETE FROM cron_jobs");
80
- });
81
-
82
- // ────────────────────────────────────────────────────────────────────
83
- // Tests
84
- // ────────────────────────────────────────────────────────────────────
85
-
86
- describe("compileTimeBrief", () => {
87
- test("returns null when nothing qualifies", () => {
88
- const now = Date.now();
89
- const result = compileTimeBrief(getDb(), SCOPE_ID, now);
90
- expect(result).toBeNull();
91
- });
92
-
93
- test("surfaces a tomorrow-morning event from time_contexts", () => {
94
- const now = Date.now();
95
- // Active window that starts before now and ends tomorrow
96
- insertTimeContext({
97
- id: "tc-morning",
98
- summary: "Team standup tomorrow at 9am",
99
- activeFrom: now - HOUR,
100
- activeUntil: now + DAY,
101
- });
102
-
103
- const result = compileTimeBrief(getDb(), SCOPE_ID, now);
104
- expect(result).not.toBeNull();
105
- expect(result).toContain("### Time-Relevant Context");
106
- expect(result).toContain("Team standup tomorrow at 9am");
107
- });
108
-
109
- test("surfaces a temporary situation (currently happening)", () => {
110
- const now = Date.now();
111
- // Active for the next 2 hours
112
- insertTimeContext({
113
- id: "tc-situation",
114
- summary: "User is in a meeting until 3pm",
115
- activeFrom: now - 30 * 60 * 1000,
116
- activeUntil: now + 2 * HOUR,
117
- });
118
-
119
- const result = compileTimeBrief(getDb(), SCOPE_ID, now);
120
- expect(result).not.toBeNull();
121
- expect(result).toContain("User is in a meeting until 3pm");
122
- });
123
-
124
- test("expired time_contexts are not surfaced", () => {
125
- const now = Date.now();
126
- // Expired yesterday
127
- insertTimeContext({
128
- id: "tc-expired",
129
- summary: "Dentist appointment yesterday",
130
- activeFrom: now - 2 * DAY,
131
- activeUntil: now - DAY,
132
- });
133
-
134
- const result = compileTimeBrief(getDb(), SCOPE_ID, now);
135
- expect(result).toBeNull();
136
- });
137
-
138
- test("future time_contexts not yet active are not surfaced", () => {
139
- const now = Date.now();
140
- // Starts tomorrow
141
- insertTimeContext({
142
- id: "tc-future",
143
- summary: "Vacation starts next week",
144
- activeFrom: now + DAY,
145
- activeUntil: now + 8 * DAY,
146
- });
147
-
148
- const result = compileTimeBrief(getDb(), SCOPE_ID, now);
149
- expect(result).toBeNull();
150
- });
151
-
152
- test("includes due-soon schedule jobs", () => {
153
- const now = Date.now();
154
- // Create a one-shot schedule due in 2 hours
155
- createSchedule({
156
- name: "Send weekly report",
157
- message: "Time to send the weekly report",
158
- nextRunAt: now + 2 * HOUR,
159
- });
160
-
161
- const result = compileTimeBrief(getDb(), SCOPE_ID, now);
162
- expect(result).not.toBeNull();
163
- expect(result).toContain("### Time-Relevant Context");
164
- expect(result).toContain('Scheduled: "Send weekly report"');
165
- expect(result).toContain("in 2 hours");
166
- });
167
-
168
- test("sorts by urgency: happening now > overdue > within 24h > within 7d", () => {
169
- const now = Date.now();
170
-
171
- // Within 7 days (lower priority)
172
- insertTimeContext({
173
- id: "tc-week",
174
- summary: "Quarterly review ends Friday",
175
- activeFrom: now - DAY,
176
- activeUntil: now + 5 * DAY,
177
- });
178
-
179
- // Happening now (expiring in 6 hours — highest priority)
180
- insertTimeContext({
181
- id: "tc-now",
182
- summary: "User traveling today",
183
- activeFrom: now - 2 * HOUR,
184
- activeUntil: now + 6 * HOUR,
185
- });
186
-
187
- // Within 24h (ending tomorrow — medium priority)
188
- insertTimeContext({
189
- id: "tc-24h",
190
- summary: "Project deadline tomorrow morning",
191
- activeFrom: now - DAY,
192
- activeUntil: now + 20 * HOUR,
193
- });
194
-
195
- const result = compileTimeBrief(getDb(), SCOPE_ID, now);
196
- expect(result).not.toBeNull();
197
-
198
- const lines = result!.split("\n").filter((l) => l.startsWith("- "));
199
- expect(lines.length).toBe(3);
200
- // Happening now (remaining <= 24h) comes first
201
- expect(lines[0]).toContain("User traveling today");
202
- // Within 24h comes second
203
- expect(lines[1]).toContain("Project deadline tomorrow morning");
204
- // Within 7d comes last
205
- expect(lines[2]).toContain("Quarterly review ends Friday");
206
- });
207
-
208
- test("caps at 3 entries", () => {
209
- const now = Date.now();
210
-
211
- insertTimeContext({
212
- id: "tc-1",
213
- summary: "Context one",
214
- activeFrom: now - HOUR,
215
- activeUntil: now + 2 * HOUR,
216
- });
217
- insertTimeContext({
218
- id: "tc-2",
219
- summary: "Context two",
220
- activeFrom: now - HOUR,
221
- activeUntil: now + 3 * HOUR,
222
- });
223
- insertTimeContext({
224
- id: "tc-3",
225
- summary: "Context three",
226
- activeFrom: now - HOUR,
227
- activeUntil: now + 4 * HOUR,
228
- });
229
- insertTimeContext({
230
- id: "tc-4",
231
- summary: "Context four (should be dropped)",
232
- activeFrom: now - HOUR,
233
- activeUntil: now + 5 * HOUR,
234
- });
235
-
236
- const result = compileTimeBrief(getDb(), SCOPE_ID, now);
237
- expect(result).not.toBeNull();
238
-
239
- const lines = result!.split("\n").filter((l) => l.startsWith("- "));
240
- expect(lines.length).toBe(3);
241
- expect(result).not.toContain("Context four");
242
- });
243
-
244
- test("filters by scopeId — ignores other scopes", () => {
245
- const now = Date.now();
246
- insertTimeContext({
247
- id: "tc-other",
248
- summary: "Other scope context",
249
- activeFrom: now - HOUR,
250
- activeUntil: now + DAY,
251
- scopeId: "other-scope",
252
- });
253
-
254
- const result = compileTimeBrief(getDb(), SCOPE_ID, now);
255
- expect(result).toBeNull();
256
- });
257
-
258
- test("mixes time_contexts and schedules in deterministic order", () => {
259
- const now = Date.now();
260
-
261
- // A schedule due in 30 minutes (within 24h bucket)
262
- createSchedule({
263
- name: "Daily standup reminder",
264
- message: "Standup time",
265
- nextRunAt: now + 30 * 60 * 1000,
266
- });
267
-
268
- // A time context happening now (remaining 3 hours)
269
- insertTimeContext({
270
- id: "tc-active",
271
- summary: "Focus time until noon",
272
- activeFrom: now - HOUR,
273
- activeUntil: now + 3 * HOUR,
274
- });
275
-
276
- const result = compileTimeBrief(getDb(), SCOPE_ID, now);
277
- expect(result).not.toBeNull();
278
-
279
- const lines = result!.split("\n").filter((l) => l.startsWith("- "));
280
- expect(lines.length).toBe(2);
281
- // Both happening-now time context and within-24h schedule should appear
282
- expect(result).toContain("Focus time until noon");
283
- expect(result).toContain("Daily standup reminder");
284
- });
285
- });
@@ -1,311 +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-wrapper-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
- truncateForLog: (value: string) => value,
26
- }));
27
-
28
- import {
29
- stripInjectedContext,
30
- stripUserTextBlocksByPrefix,
31
- } from "../daemon/conversation-runtime-assembly.js";
32
- import { compileMemoryBrief } from "../memory/brief.js";
33
- import { getDb, initializeDb, resetDb } from "../memory/db.js";
34
- import { getSqlite } from "../memory/db-connection.js";
35
- import { resetTestTables } from "../memory/raw-query.js";
36
- import type { Message } from "../providers/types.js";
37
-
38
- initializeDb();
39
-
40
- // ── Constants ──────────────────────────────────────────────────────────
41
-
42
- const SCOPE_ID = "default";
43
- const HOUR = 60 * 60 * 1000;
44
- const DAY = 24 * HOUR;
45
-
46
- // ── Helpers ────────────────────────────────────────────────────────────
47
-
48
- function getRawDb(): import("bun:sqlite").Database {
49
- return getSqlite();
50
- }
51
-
52
- function insertTimeContext(opts: {
53
- id: string;
54
- summary: string;
55
- activeFrom: number;
56
- activeUntil: number;
57
- scopeId?: string;
58
- }): void {
59
- const now = Date.now();
60
- getRawDb().run(
61
- `INSERT INTO time_contexts (id, scope_id, summary, source, active_from, active_until, created_at, updated_at)
62
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
63
- [
64
- opts.id,
65
- opts.scopeId ?? SCOPE_ID,
66
- opts.summary,
67
- "conversation",
68
- opts.activeFrom,
69
- opts.activeUntil,
70
- now,
71
- now,
72
- ],
73
- );
74
- }
75
-
76
- function insertOpenLoop(opts: {
77
- id: string;
78
- summary: string;
79
- dueAt?: number | null;
80
- updatedAt?: number;
81
- }): void {
82
- const now = Date.now();
83
- getRawDb().run(
84
- `INSERT INTO open_loops (id, scope_id, summary, status, source, due_at, surfaced_at, created_at, updated_at)
85
- VALUES (?, ?, ?, ?, 'conversation', ?, ?, ?, ?)`,
86
- [
87
- opts.id,
88
- SCOPE_ID,
89
- opts.summary,
90
- "open",
91
- opts.dueAt ?? null,
92
- null,
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
- "time_contexts",
113
- "open_loops",
114
- "work_items",
115
- "tasks",
116
- "task_runs",
117
- "followups",
118
- "cron_runs",
119
- "cron_jobs",
120
- );
121
- });
122
-
123
- // ── Tests ──────────────────────────────────────────────────────────────
124
-
125
- describe("compileMemoryBrief", () => {
126
- test("returns empty string when neither section has content", () => {
127
- const now = Date.now();
128
- const result = compileMemoryBrief(getDb(), SCOPE_ID, "msg-1", now);
129
- expect(result.text).toBe("");
130
- expect(result.resurfacedLoopId).toBeNull();
131
- });
132
-
133
- test("renders only the time section when open loops are empty", () => {
134
- const now = Date.now();
135
- insertTimeContext({
136
- id: "tc-1",
137
- summary: "Meeting with Alice in 2 hours",
138
- activeFrom: now - HOUR,
139
- activeUntil: now + 2 * HOUR,
140
- });
141
-
142
- const result = compileMemoryBrief(getDb(), SCOPE_ID, "msg-1", now);
143
-
144
- expect(result.text).toContain("<memory_brief>");
145
- expect(result.text).toContain("</memory_brief>");
146
- expect(result.text).toContain("### Time-Relevant Context");
147
- expect(result.text).toContain("Meeting with Alice in 2 hours");
148
- // Should NOT contain Open Loops section
149
- expect(result.text).not.toContain("### Open Loops");
150
- });
151
-
152
- test("renders only the open loops section when time context is empty", () => {
153
- const now = Date.now();
154
- insertOpenLoop({
155
- id: "ol-1",
156
- summary: "Fix the login bug",
157
- dueAt: now + 12 * HOUR,
158
- updatedAt: now - DAY * 10,
159
- });
160
-
161
- const result = compileMemoryBrief(getDb(), SCOPE_ID, "msg-1", now);
162
-
163
- expect(result.text).toContain("<memory_brief>");
164
- expect(result.text).toContain("</memory_brief>");
165
- expect(result.text).toContain("### Open Loops");
166
- expect(result.text).toContain("Fix the login bug");
167
- // Should NOT contain Time-Relevant Context section
168
- expect(result.text).not.toContain("### Time-Relevant Context");
169
- });
170
-
171
- test("renders both sections when both have content", () => {
172
- const now = Date.now();
173
-
174
- insertTimeContext({
175
- id: "tc-1",
176
- summary: "Quarterly review deadline tomorrow",
177
- activeFrom: now - HOUR,
178
- activeUntil: now + DAY,
179
- });
180
-
181
- insertOpenLoop({
182
- id: "ol-1",
183
- summary: "Reply to vendor email",
184
- dueAt: now + 6 * HOUR,
185
- updatedAt: now - DAY * 10,
186
- });
187
-
188
- const result = compileMemoryBrief(getDb(), SCOPE_ID, "msg-1", now);
189
-
190
- expect(result.text).toContain("<memory_brief>");
191
- expect(result.text).toContain("</memory_brief>");
192
- expect(result.text).toContain("### Time-Relevant Context");
193
- expect(result.text).toContain("Quarterly review deadline tomorrow");
194
- expect(result.text).toContain("### Open Loops");
195
- expect(result.text).toContain("Reply to vendor email");
196
-
197
- // Sections should be separated by a blank line
198
- expect(result.text).toContain(
199
- "### Time-Relevant Context\n- Quarterly review deadline tomorrow\n\n### Open Loops",
200
- );
201
- });
202
-
203
- test("wraps content in <memory_brief> tags", () => {
204
- const now = Date.now();
205
- insertTimeContext({
206
- id: "tc-1",
207
- summary: "Something happening",
208
- activeFrom: now - HOUR,
209
- activeUntil: now + HOUR,
210
- });
211
-
212
- const result = compileMemoryBrief(getDb(), SCOPE_ID, "msg-1", now);
213
-
214
- expect(result.text.startsWith("<memory_brief>\n")).toBe(true);
215
- expect(result.text.endsWith("\n</memory_brief>")).toBe(true);
216
- });
217
-
218
- test("forwards resurfacedLoopId from open-loop compiler", () => {
219
- const now = Date.now();
220
- // Insert a low-salience loop (no dueAt, updated long ago) to trigger resurfacing
221
- insertOpenLoop({
222
- id: "ol-stale",
223
- summary: "Old forgotten task",
224
- updatedAt: now - DAY * 30,
225
- });
226
-
227
- const result = compileMemoryBrief(getDb(), SCOPE_ID, "msg-1", now);
228
- // The stale loop should be resurfaced
229
- expect(result.resurfacedLoopId).toBe("ol-stale");
230
- });
231
- });
232
-
233
- // ── Strip tests ────────────────────────────────────────────────────────
234
-
235
- describe("memory_brief strip support", () => {
236
- test("stripInjectedContext removes <memory_brief> blocks", () => {
237
- const briefText = `<memory_brief>\n### Time-Relevant Context\n- Meeting in 2 hours\n</memory_brief>`;
238
- const messages: Message[] = [
239
- {
240
- role: "user",
241
- content: [
242
- { type: "text", text: briefText },
243
- { type: "text", text: "What's on my calendar?" },
244
- ],
245
- },
246
- ];
247
-
248
- const stripped = stripInjectedContext(messages);
249
- expect(stripped).toHaveLength(1);
250
- expect(stripped[0].content).toHaveLength(1);
251
- expect(stripped[0].content[0]).toEqual({
252
- type: "text",
253
- text: "What's on my calendar?",
254
- });
255
- });
256
-
257
- test("stripUserTextBlocksByPrefix removes <memory_brief> by prefix", () => {
258
- const briefText = `<memory_brief>\n### Open Loops\n- Fix the bug\n</memory_brief>`;
259
- const messages: Message[] = [
260
- {
261
- role: "user",
262
- content: [
263
- { type: "text", text: briefText },
264
- { type: "text", text: "Hello" },
265
- ],
266
- },
267
- ];
268
-
269
- const stripped = stripUserTextBlocksByPrefix(messages, ["<memory_brief>"]);
270
- expect(stripped).toHaveLength(1);
271
- expect(stripped[0].content).toHaveLength(1);
272
- expect(stripped[0].content[0]).toEqual({ type: "text", text: "Hello" });
273
- });
274
-
275
- test("drops entire message when only a <memory_brief> block remains", () => {
276
- const briefText = `<memory_brief>\n### Time-Relevant Context\n- Deadline today\n</memory_brief>`;
277
- const messages: Message[] = [
278
- {
279
- role: "user",
280
- content: [{ type: "text", text: briefText }],
281
- },
282
- {
283
- role: "assistant",
284
- content: [{ type: "text", text: "Got it." }],
285
- },
286
- ];
287
-
288
- const stripped = stripInjectedContext(messages);
289
- // The user message with only the brief block should be dropped entirely
290
- expect(stripped).toHaveLength(1);
291
- expect(stripped[0].role).toBe("assistant");
292
- });
293
-
294
- test("preserves user-authored text that does not start with <memory_brief>", () => {
295
- const messages: Message[] = [
296
- {
297
- role: "user",
298
- content: [
299
- { type: "text", text: "I was thinking about <memory_brief> tags" },
300
- ],
301
- },
302
- ];
303
-
304
- const stripped = stripInjectedContext(messages);
305
- expect(stripped).toHaveLength(1);
306
- expect(stripped[0].content[0]).toEqual({
307
- type: "text",
308
- text: "I was thinking about <memory_brief> tags",
309
- });
310
- });
311
- });