@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,234 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
-
3
- import type { Provider, ProviderResponse } from "../providers/types.js";
4
- import { resolveSwarmLimits } from "../swarm/limits.js";
5
- import {
6
- generatePlan,
7
- makeFallbackPlan,
8
- parsePlanJSON,
9
- } from "../swarm/router-planner.js";
10
-
11
- const DEFAULT_LIMITS = resolveSwarmLimits({
12
- maxWorkers: 3,
13
- maxTasks: 8,
14
- maxRetriesPerTask: 1,
15
- workerTimeoutSec: 900,
16
- });
17
-
18
- function makeProvider(responseText: string): Provider {
19
- return {
20
- name: "test",
21
- async sendMessage(): Promise<ProviderResponse> {
22
- return {
23
- content: [{ type: "text", text: responseText }],
24
- model: "test-model",
25
- usage: { inputTokens: 100, outputTokens: 50 },
26
- stopReason: "end_turn",
27
- };
28
- },
29
- };
30
- }
31
-
32
- function makeFailingProvider(): Provider {
33
- return {
34
- name: "test",
35
- async sendMessage(): Promise<ProviderResponse> {
36
- throw new Error("API error");
37
- },
38
- };
39
- }
40
-
41
- describe("parsePlanJSON", () => {
42
- test("parses bare JSON", () => {
43
- const result = parsePlanJSON(
44
- '{"tasks":[{"id":"a","role":"coder","objective":"do stuff","dependencies":[]}]}',
45
- );
46
- expect(result).not.toBeNull();
47
- expect(result!.tasks).toHaveLength(1);
48
- expect(result!.tasks[0].id).toBe("a");
49
- });
50
-
51
- test("parses fenced JSON", () => {
52
- const raw =
53
- '```json\n{"tasks":[{"id":"a","role":"coder","objective":"do stuff","dependencies":[]}]}\n```';
54
- const result = parsePlanJSON(raw);
55
- expect(result).not.toBeNull();
56
- expect(result!.tasks).toHaveLength(1);
57
- });
58
-
59
- test("parses fenced code block without json tag", () => {
60
- const raw =
61
- '```\n{"tasks":[{"id":"a","role":"coder","objective":"do stuff","dependencies":[]}]}\n```';
62
- const result = parsePlanJSON(raw);
63
- expect(result).not.toBeNull();
64
- });
65
-
66
- test("returns null for invalid JSON", () => {
67
- expect(parsePlanJSON("this is not json")).toBeNull();
68
- });
69
-
70
- test("returns null for JSON without tasks array", () => {
71
- expect(parsePlanJSON('{"plan":"something"}')).toBeNull();
72
- });
73
-
74
- test("returns null for empty string", () => {
75
- expect(parsePlanJSON("")).toBeNull();
76
- });
77
-
78
- test("finds plan JSON in second fenced block when first is not valid JSON", () => {
79
- const raw =
80
- '```\nHere is my thinking about the plan\n```\n\n```json\n{"tasks":[{"id":"a","role":"coder","objective":"do stuff","dependencies":[]}]}\n```';
81
- const result = parsePlanJSON(raw);
82
- expect(result).not.toBeNull();
83
- expect(result!.tasks).toHaveLength(1);
84
- expect(result!.tasks[0].id).toBe("a");
85
- });
86
-
87
- test("finds plan JSON in second fenced block when first has no tasks array", () => {
88
- const raw =
89
- '```json\n{"note":"not a plan"}\n```\n\n```json\n{"tasks":[{"id":"b","role":"researcher","objective":"research","dependencies":[]}]}\n```';
90
- const result = parsePlanJSON(raw);
91
- expect(result).not.toBeNull();
92
- expect(result!.tasks[0].id).toBe("b");
93
- });
94
- });
95
-
96
- describe("makeFallbackPlan", () => {
97
- test("creates single coder task", () => {
98
- const plan = makeFallbackPlan("Build a feature");
99
- expect(plan.objective).toBe("Build a feature");
100
- expect(plan.tasks).toHaveLength(1);
101
- expect(plan.tasks[0].role).toBe("coder");
102
- expect(plan.tasks[0].id).toBe("fallback-coder");
103
- expect(plan.tasks[0].dependencies).toEqual([]);
104
- });
105
- });
106
-
107
- describe("generatePlan", () => {
108
- test("generates a valid plan from LLM response", async () => {
109
- const responseText = JSON.stringify({
110
- tasks: [
111
- {
112
- id: "research",
113
- role: "researcher",
114
- objective: "Find docs",
115
- dependencies: [],
116
- },
117
- {
118
- id: "code",
119
- role: "coder",
120
- objective: "Implement",
121
- dependencies: ["research"],
122
- },
123
- ],
124
- });
125
- const plan = await generatePlan({
126
- objective: "Build feature X",
127
- provider: makeProvider(responseText),
128
- modelIntent: "latency-optimized",
129
- limits: DEFAULT_LIMITS,
130
- });
131
- expect(plan.tasks).toHaveLength(2);
132
- expect(plan.tasks[0].id).toBe("research");
133
- expect(plan.tasks[1].dependencies).toContain("research");
134
- });
135
-
136
- test("falls back on invalid LLM JSON", async () => {
137
- const plan = await generatePlan({
138
- objective: "Build feature X",
139
- provider: makeProvider("Sorry, I cannot help with that."),
140
- modelIntent: "latency-optimized",
141
- limits: DEFAULT_LIMITS,
142
- });
143
- expect(plan.tasks).toHaveLength(1);
144
- expect(plan.tasks[0].id).toBe("fallback-coder");
145
- });
146
-
147
- test("falls back when provider throws", async () => {
148
- const plan = await generatePlan({
149
- objective: "Build feature X",
150
- provider: makeFailingProvider(),
151
- modelIntent: "latency-optimized",
152
- limits: DEFAULT_LIMITS,
153
- });
154
- expect(plan.tasks).toHaveLength(1);
155
- expect(plan.tasks[0].id).toBe("fallback-coder");
156
- });
157
-
158
- test("falls back when LLM plan has invalid roles", async () => {
159
- const responseText = JSON.stringify({
160
- tasks: [
161
- {
162
- id: "hack",
163
- role: "hacker",
164
- objective: "Hack stuff",
165
- dependencies: [],
166
- },
167
- ],
168
- });
169
- const plan = await generatePlan({
170
- objective: "Build feature X",
171
- provider: makeProvider(responseText),
172
- modelIntent: "latency-optimized",
173
- limits: DEFAULT_LIMITS,
174
- });
175
- // Plan validator rejects invalid roles, so generatePlan catches and falls back
176
- expect(plan.tasks).toHaveLength(1);
177
- expect(plan.tasks[0].id).toBe("fallback-coder");
178
- });
179
-
180
- test("falls back when LLM plan has cycles", async () => {
181
- const responseText = JSON.stringify({
182
- tasks: [
183
- { id: "a", role: "coder", objective: "A", dependencies: ["b"] },
184
- { id: "b", role: "coder", objective: "B", dependencies: ["a"] },
185
- ],
186
- });
187
- const plan = await generatePlan({
188
- objective: "Build feature X",
189
- provider: makeProvider(responseText),
190
- modelIntent: "latency-optimized",
191
- limits: DEFAULT_LIMITS,
192
- });
193
- expect(plan.tasks).toHaveLength(1);
194
- expect(plan.tasks[0].id).toBe("fallback-coder");
195
- });
196
-
197
- test("truncates plans exceeding maxTasks", async () => {
198
- const tasks = Array.from({ length: 15 }, (_, i) => ({
199
- id: `t${i}`,
200
- role: "coder",
201
- objective: `Task ${i}`,
202
- dependencies: [],
203
- }));
204
- const plan = await generatePlan({
205
- objective: "Big feature",
206
- provider: makeProvider(JSON.stringify({ tasks })),
207
- modelIntent: "latency-optimized",
208
- limits: DEFAULT_LIMITS,
209
- });
210
- expect(plan.tasks.length).toBeLessThanOrEqual(DEFAULT_LIMITS.maxTasks);
211
- });
212
-
213
- test("handles response with no text content", async () => {
214
- const provider: Provider = {
215
- name: "test",
216
- async sendMessage(): Promise<ProviderResponse> {
217
- return {
218
- content: [],
219
- model: "test-model",
220
- usage: { inputTokens: 0, outputTokens: 0 },
221
- stopReason: "end_turn",
222
- };
223
- },
224
- };
225
- const plan = await generatePlan({
226
- objective: "Build feature",
227
- provider,
228
- modelIntent: "latency-optimized",
229
- limits: DEFAULT_LIMITS,
230
- });
231
- expect(plan.tasks).toHaveLength(1);
232
- expect(plan.tasks[0].id).toBe("fallback-coder");
233
- });
234
- });
@@ -1,185 +0,0 @@
1
- import { beforeEach, describe, expect, mock, test } from "bun:test";
2
-
3
- // ---------------------------------------------------------------------------
4
- // Mocks — declared before imports that depend on them
5
- // ---------------------------------------------------------------------------
6
-
7
- mock.module("../util/logger.js", () => ({
8
- getLogger: () =>
9
- new Proxy({} as Record<string, unknown>, {
10
- get: () => () => {},
11
- }),
12
- }));
13
-
14
- mock.module("../config/loader.js", () => ({
15
- getConfig: () => ({
16
- ui: {},
17
-
18
- provider: "anthropic",
19
- providerOrder: ["anthropic"],
20
- swarm: {
21
- enabled: true,
22
- maxWorkers: 3,
23
- maxTasks: 8,
24
- maxRetriesPerTask: 1,
25
- workerTimeoutSec: 900,
26
- roleTimeoutsSec: {},
27
- plannerModelIntent: "latency-optimized",
28
- synthesizerModelIntent: "quality-optimized",
29
- },
30
- services: {
31
- inference: {
32
- mode: "your-own",
33
- provider: "anthropic",
34
- model: "claude-opus-4-6",
35
- },
36
- "image-generation": {
37
- mode: "your-own",
38
- provider: "gemini",
39
- model: "gemini-3.1-flash-image-preview",
40
- },
41
- "web-search": { mode: "your-own", provider: "inference-provider-native" },
42
- },
43
- }),
44
- getSwarmDisabledConfig: () => ({
45
- provider: "anthropic",
46
- providerOrder: ["anthropic"],
47
- swarm: {
48
- enabled: false,
49
- maxWorkers: 3,
50
- maxTasks: 8,
51
- maxRetriesPerTask: 1,
52
- workerTimeoutSec: 900,
53
- roleTimeoutsSec: {},
54
- plannerModelIntent: "latency-optimized",
55
- synthesizerModelIntent: "quality-optimized",
56
- },
57
- }),
58
- }));
59
-
60
- // Mock provider registry — returns a mock provider
61
- const mockProvider = {
62
- name: "test",
63
- async sendMessage() {
64
- return {
65
- content: [
66
- {
67
- type: "text",
68
- text: '{"tasks":[{"id":"t1","role":"coder","objective":"Do it","dependencies":[]}]}',
69
- },
70
- ],
71
- model: "test",
72
- usage: { inputTokens: 10, outputTokens: 10 },
73
- stopReason: "end_turn",
74
- };
75
- },
76
- };
77
- mock.module("../security/secure-keys.js", () => ({
78
- getSecureKeyAsync: async () => "test-api-key",
79
- getProviderKeyAsync: async () => "test-api-key",
80
- }));
81
-
82
- mock.module("../providers/registry.js", () => ({
83
- getProvider: () => mockProvider,
84
- getFailoverProvider: () => mockProvider,
85
- }));
86
-
87
- // Mock the Agent SDK to prevent real subprocess spawning
88
- mock.module("@anthropic-ai/claude-agent-sdk", () => ({
89
- query: () => ({
90
- async *[Symbol.asyncIterator]() {
91
- yield {
92
- type: "result" as const,
93
- session_id: "test-session",
94
- subtype: "success" as const,
95
- result:
96
- '```json\n{"summary":"Done","artifacts":[],"issues":[],"nextSteps":[]}\n```',
97
- };
98
- },
99
- }),
100
- }));
101
-
102
- import {
103
- _resetSwarmActive,
104
- swarmDelegateTool,
105
- } from "../tools/swarm/delegate.js";
106
- import type { ToolContext } from "../tools/types.js";
107
-
108
- function makeContext(overrides?: Partial<ToolContext>): ToolContext {
109
- return {
110
- conversationId: "test-session",
111
- workingDir: "/tmp/test",
112
- trustClass: "guardian",
113
- onOutput: () => {},
114
- ...overrides,
115
- } as ToolContext;
116
- }
117
-
118
- describe("swarm_delegate tool", () => {
119
- beforeEach(() => {
120
- _resetSwarmActive();
121
- });
122
-
123
- test("getDefinition returns valid schema", () => {
124
- const def = swarmDelegateTool.getDefinition();
125
- expect(def.name).toBe("swarm_delegate");
126
- const props = (def.input_schema as Record<string, unknown>)
127
- .properties as Record<string, unknown>;
128
- expect(props.objective).toBeDefined();
129
- expect(props.context).toBeDefined();
130
- expect(props.max_workers).toBeDefined();
131
- });
132
-
133
- test("executes successfully with a simple objective", async () => {
134
- const outputs: string[] = [];
135
- const result = await swarmDelegateTool.execute(
136
- { objective: "Build a simple feature" },
137
- makeContext({ onOutput: (text: string) => outputs.push(text) }),
138
- );
139
-
140
- expect(result.isError).toBeFalsy();
141
- expect(result.content).toBeTruthy();
142
- expect(outputs.length).toBeGreaterThan(0);
143
- });
144
-
145
- test("blocks nested swarm invocation", async () => {
146
- // Simulate active swarm by calling _resetSwarmActive then manually setting it
147
- // We test this by running two sequential calls where the first doesn't finish
148
- // Actually, we can test by checking the recursion guard directly
149
- const result1Promise = swarmDelegateTool.execute(
150
- { objective: "First task" },
151
- makeContext(),
152
- );
153
-
154
- // While first is running, try a second
155
- // Since the mock backend resolves instantly, we need to be creative
156
- // Let's just verify the guard works by testing post-execution
157
- await result1Promise;
158
-
159
- // After completion, the flag should be reset
160
- const result2 = await swarmDelegateTool.execute(
161
- { objective: "Second task" },
162
- makeContext(),
163
- );
164
- expect(result2.isError).toBeFalsy();
165
- });
166
-
167
- test("handles objective with context", async () => {
168
- const result = await swarmDelegateTool.execute(
169
- { objective: "Build feature", context: "This is a React project" },
170
- makeContext(),
171
- );
172
- expect(result.isError).toBeFalsy();
173
- });
174
-
175
- test("short-circuits when signal is already aborted", async () => {
176
- const controller = new AbortController();
177
- controller.abort();
178
- const result = await swarmDelegateTool.execute(
179
- { objective: "Should not run" },
180
- makeContext({ signal: controller.signal }),
181
- );
182
- expect(result.isError).toBe(true);
183
- expect(result.content).toBe("Cancelled");
184
- });
185
- });
@@ -1,144 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
-
3
- import type { WorkerProfile } from "../swarm/worker-backend.js";
4
- import { getProfilePolicy, roleToProfile } from "../swarm/worker-backend.js";
5
-
6
- describe("roleToProfile", () => {
7
- test("maps researcher role to researcher profile", () => {
8
- expect(roleToProfile("researcher")).toBe("researcher");
9
- });
10
-
11
- test("maps coder role to coder profile", () => {
12
- expect(roleToProfile("coder")).toBe("coder");
13
- });
14
-
15
- test("maps reviewer role to reviewer profile", () => {
16
- expect(roleToProfile("reviewer")).toBe("reviewer");
17
- });
18
-
19
- test("maps router role to general profile", () => {
20
- expect(roleToProfile("router")).toBe("general");
21
- });
22
- });
23
-
24
- describe("getProfilePolicy", () => {
25
- const READ_ONLY_TOOLS = [
26
- "Read",
27
- "Glob",
28
- "Grep",
29
- "WebSearch",
30
- "WebFetch",
31
- "LS",
32
- "Bash(grep *)",
33
- "Bash(rg *)",
34
- "Bash(find *)",
35
- ];
36
-
37
- const WRITE_TOOLS = ["Edit", "Write", "MultiEdit", "NotebookEdit"];
38
-
39
- describe("general profile", () => {
40
- const policy = getProfilePolicy("general");
41
-
42
- test("allows read-only tools", () => {
43
- for (const tool of READ_ONLY_TOOLS) {
44
- expect(policy.allow.has(tool)).toBe(true);
45
- }
46
- });
47
-
48
- test("has no hard denies", () => {
49
- expect(policy.deny.size).toBe(0);
50
- });
51
-
52
- test("requires approval for write tools and Bash", () => {
53
- for (const tool of WRITE_TOOLS) {
54
- expect(policy.approvalRequired.has(tool)).toBe(true);
55
- }
56
- expect(policy.approvalRequired.has("Bash")).toBe(true);
57
- });
58
- });
59
-
60
- describe("researcher profile", () => {
61
- const policy = getProfilePolicy("researcher");
62
-
63
- test("allows read-only tools", () => {
64
- for (const tool of READ_ONLY_TOOLS) {
65
- expect(policy.allow.has(tool)).toBe(true);
66
- }
67
- });
68
-
69
- test("denies write tools and Bash", () => {
70
- for (const tool of WRITE_TOOLS) {
71
- expect(policy.deny.has(tool)).toBe(true);
72
- }
73
- expect(policy.deny.has("Bash")).toBe(true);
74
- });
75
- });
76
-
77
- describe("coder profile", () => {
78
- const policy = getProfilePolicy("coder");
79
-
80
- test("allows read-only tools", () => {
81
- for (const tool of READ_ONLY_TOOLS) {
82
- expect(policy.allow.has(tool)).toBe(true);
83
- }
84
- });
85
-
86
- test("has no hard denies", () => {
87
- expect(policy.deny.size).toBe(0);
88
- });
89
-
90
- test("requires approval for write tools and Bash", () => {
91
- for (const tool of WRITE_TOOLS) {
92
- expect(policy.approvalRequired.has(tool)).toBe(true);
93
- }
94
- expect(policy.approvalRequired.has("Bash")).toBe(true);
95
- });
96
- });
97
-
98
- describe("reviewer profile", () => {
99
- const policy = getProfilePolicy("reviewer");
100
-
101
- test("allows read-only tools", () => {
102
- for (const tool of READ_ONLY_TOOLS) {
103
- expect(policy.allow.has(tool)).toBe(true);
104
- }
105
- });
106
-
107
- test("denies write tools and Bash", () => {
108
- for (const tool of WRITE_TOOLS) {
109
- expect(policy.deny.has(tool)).toBe(true);
110
- }
111
- expect(policy.deny.has("Bash")).toBe(true);
112
- });
113
- });
114
-
115
- test("all profiles allow the same read-only tool set", () => {
116
- const profiles: WorkerProfile[] = [
117
- "general",
118
- "researcher",
119
- "coder",
120
- "reviewer",
121
- ];
122
- for (const profile of profiles) {
123
- const policy = getProfilePolicy(profile);
124
- for (const tool of READ_ONLY_TOOLS) {
125
- expect(policy.allow.has(tool)).toBe(true);
126
- }
127
- }
128
- });
129
-
130
- test("denied tools are never also in allow set", () => {
131
- const profiles: WorkerProfile[] = [
132
- "general",
133
- "researcher",
134
- "coder",
135
- "reviewer",
136
- ];
137
- for (const profile of profiles) {
138
- const policy = getProfilePolicy(profile);
139
- for (const tool of policy.deny) {
140
- expect(policy.allow.has(tool)).toBe(false);
141
- }
142
- }
143
- });
144
- });