@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,248 +0,0 @@
1
- import {
2
- closeSync,
3
- existsSync,
4
- openSync,
5
- readdirSync,
6
- readFileSync,
7
- readSync,
8
- } from "node:fs";
9
- import { basename, dirname, join, resolve } from "node:path";
10
-
11
- import { FRONTMATTER_REGEX } from "../skills/frontmatter.js";
12
- import { getLogger } from "../util/logger.js";
13
-
14
- const log = getLogger("cc-commands");
15
-
16
- // ─── Types ───────────────────────────────────────────────────────────────────
17
-
18
- export interface CCCommandEntry {
19
- /** Command name: basename without .md extension. */
20
- name: string;
21
- /** First non-empty line after frontmatter, stripped of heading markers. */
22
- summary: string;
23
- /** Absolute path to the .md file. */
24
- filePath: string;
25
- /** Directory containing the `.claude/commands/` folder. */
26
- source: string;
27
- }
28
-
29
- export interface CCCommandRegistry {
30
- /** Commands keyed by lowercase name. */
31
- entries: Map<string, CCCommandEntry>;
32
- /** Timestamp (ms) when discovery was performed. */
33
- discoveredAt: number;
34
- }
35
-
36
- // ─── Constants ───────────────────────────────────────────────────────────────
37
-
38
- const COMMAND_NAME_REGEX = /^[A-Za-z0-9][A-Za-z0-9._-]*$/;
39
- const DEFAULT_CACHE_TTL_MS = 30_000;
40
- const MAX_SUMMARY_LENGTH = 100;
41
-
42
- /**
43
- * Maximum bytes to read from each command file during discovery.
44
- * 1 KiB is enough for frontmatter (typically < 200 B) plus several content
45
- * lines, which is all we need to extract a one-line summary.
46
- */
47
- const SUMMARY_READ_BYTES = 1024;
48
-
49
- // ─── Cache ───────────────────────────────────────────────────────────────────
50
-
51
- const cache = new Map<string, CCCommandRegistry>();
52
-
53
- /** Clear all cached registries. */
54
- export function invalidateCCCommandCache(): void {
55
- cache.clear();
56
- log.debug("CC command cache invalidated");
57
- }
58
-
59
- // ─── Partial I/O ─────────────────────────────────────────────────────────────
60
-
61
- /**
62
- * Read at most `maxBytes` from the beginning of a file.
63
- * Uses low-level `openSync`/`readSync` so we never pull the entire file into
64
- * memory — important when command templates are large but we only need the
65
- * first few lines for summary extraction.
66
- */
67
- function readFileHead(filePath: string, maxBytes: number): string {
68
- const fd = openSync(filePath, "r");
69
- try {
70
- const buf = Buffer.alloc(maxBytes);
71
- const bytesRead = readSync(fd, buf, 0, maxBytes, 0);
72
- return buf.toString("utf-8", 0, bytesRead);
73
- } finally {
74
- closeSync(fd);
75
- }
76
- }
77
-
78
- // ─── Summary extraction ──────────────────────────────────────────────────────
79
-
80
- /**
81
- * Extract a one-line summary from the beginning of a markdown file.
82
- * Skips YAML frontmatter if present, then returns the first non-empty line
83
- * with leading `#` heading markers stripped. Truncates to 100 chars.
84
- */
85
- function extractSummary(content: string): string {
86
- // Strip frontmatter if present
87
- let body = content;
88
- const fmMatch = content.match(FRONTMATTER_REGEX);
89
- if (fmMatch) {
90
- body = content.slice(fmMatch[0].length);
91
- } else if (/^---\r?\n/.test(content)) {
92
- if (Buffer.byteLength(content, "utf-8") >= SUMMARY_READ_BYTES) {
93
- // Content starts with a frontmatter opening delimiter but the closing
94
- // delimiter was not found. The content length reached SUMMARY_READ_BYTES,
95
- // so the read was likely truncated — the missing closing `---` is
96
- // probably just beyond the read boundary. Return empty rather than
97
- // surfacing partial frontmatter fields as a summary.
98
- return "";
99
- }
100
- // Small file that starts with `---` (thematic break or unclosed
101
- // frontmatter opener). Skip the leading `---` line and extract the
102
- // first real content line from the remainder.
103
- body = content.replace(/^---\r?\n/, "");
104
- }
105
-
106
- // Find first non-empty line
107
- const lines = body.split(/\r?\n/);
108
- for (const line of lines) {
109
- const trimmed = line.trim();
110
- if (!trimmed) continue;
111
-
112
- // Strip leading # heading markers
113
- const stripped = trimmed.replace(/^#+\s*/, "");
114
- if (!stripped) continue;
115
-
116
- // Truncate if needed
117
- if (stripped.length > MAX_SUMMARY_LENGTH) {
118
- return stripped.slice(0, MAX_SUMMARY_LENGTH);
119
- }
120
- return stripped;
121
- }
122
-
123
- return "";
124
- }
125
-
126
- // ─── Discovery ───────────────────────────────────────────────────────────────
127
-
128
- /**
129
- * Discover `.claude/commands/*.md` files by walking up from `cwd`.
130
- * Nearest directory wins on name collisions (child overrides parent).
131
- * Results are cached per cwd with a 30-second TTL.
132
- */
133
- export function discoverCCCommands(
134
- cwd: string,
135
- ttlMs: number = DEFAULT_CACHE_TTL_MS,
136
- ): CCCommandRegistry {
137
- const resolvedCwd = resolve(cwd);
138
-
139
- // Check cache
140
- const cached = cache.get(resolvedCwd);
141
- if (cached && Date.now() - cached.discoveredAt < ttlMs) {
142
- log.debug({ cwd: resolvedCwd }, "CC command cache hit");
143
- return cached;
144
- }
145
-
146
- log.debug(
147
- { cwd: resolvedCwd },
148
- "CC command cache miss, discovering commands",
149
- );
150
-
151
- const entries = new Map<string, CCCommandEntry>();
152
- let current = resolvedCwd;
153
-
154
- // Walk up the directory tree; collect commands from each level.
155
- // Since child directories should win on name collisions, we only add entries
156
- // that haven't been seen yet (first occurrence = nearest ancestor).
157
- while (true) {
158
- const commandsDir = join(current, ".claude", "commands");
159
-
160
- if (existsSync(commandsDir)) {
161
- try {
162
- const files = readdirSync(commandsDir, { withFileTypes: true });
163
- for (const file of files) {
164
- if (!file.isFile()) continue;
165
- if (!file.name.endsWith(".md")) continue;
166
-
167
- const nameWithoutExt = basename(file.name, ".md");
168
-
169
- // Validate command name
170
- if (!COMMAND_NAME_REGEX.test(nameWithoutExt)) {
171
- log.warn(
172
- { fileName: file.name, dir: commandsDir },
173
- "Skipping invalid CC command filename",
174
- );
175
- continue;
176
- }
177
-
178
- const key = nameWithoutExt.toLowerCase();
179
-
180
- // Child directories win — skip if already discovered from a closer ancestor
181
- if (entries.has(key)) continue;
182
-
183
- const filePath = join(commandsDir, file.name);
184
-
185
- let summary = "";
186
- try {
187
- const head = readFileHead(filePath, SUMMARY_READ_BYTES);
188
- summary = extractSummary(head);
189
- } catch (err) {
190
- log.warn(
191
- { err, filePath },
192
- "Failed to read CC command file for summary extraction",
193
- );
194
- }
195
-
196
- entries.set(key, {
197
- name: nameWithoutExt,
198
- summary,
199
- filePath,
200
- source: current,
201
- });
202
- }
203
- } catch (err) {
204
- log.warn({ err, commandsDir }, "Failed to read CC commands directory");
205
- }
206
- }
207
-
208
- const parent = dirname(current);
209
- if (parent === current) break; // reached filesystem root
210
- current = parent;
211
- }
212
-
213
- log.debug(
214
- { cwd: resolvedCwd, count: entries.size },
215
- "CC command discovery complete",
216
- );
217
-
218
- const registry: CCCommandRegistry = {
219
- entries,
220
- discoveredAt: Date.now(),
221
- };
222
-
223
- cache.set(resolvedCwd, registry);
224
- return registry;
225
- }
226
-
227
- // ─── Lookup ──────────────────────────────────────────────────────────────────
228
-
229
- /**
230
- * Look up a single CC command by name (case-insensitive).
231
- */
232
- export function getCCCommand(
233
- cwd: string,
234
- name: string,
235
- ): CCCommandEntry | undefined {
236
- const registry = discoverCCCommands(cwd);
237
- return registry.entries.get(name.toLowerCase());
238
- }
239
-
240
- // ─── Template loading ────────────────────────────────────────────────────────
241
-
242
- /**
243
- * Load the full markdown content of a CC command file.
244
- * This is deferred to execution time to avoid reading full files during discovery.
245
- */
246
- export function loadCCCommandTemplate(entry: CCCommandEntry): string {
247
- return readFileSync(entry.filePath, "utf-8");
248
- }
@@ -1,53 +0,0 @@
1
- ---
2
- name: claude-code
3
- description: Delegate coding tasks to Claude Code
4
- compatibility: "Designed for Vellum personal assistants"
5
- metadata:
6
- emoji: "💻"
7
- vellum:
8
- display-name: "Claude Code"
9
- ---
10
-
11
- You are delegating a coding task to Claude Code, an autonomous AI coding agent. Use this skill when the user needs hands-on software engineering work done.
12
-
13
- ## Capabilities
14
-
15
- Claude Code can:
16
- - Read, write, and edit files across a codebase
17
- - Run shell commands (build, test, lint, deploy scripts)
18
- - Perform multi-step engineering tasks autonomously (refactoring, implementing features, debugging)
19
- - Search codebases for patterns, definitions, and usage
20
- - Work with git repositories (commits, branches, diffs)
21
-
22
- ## When to Delegate
23
-
24
- Delegate to Claude Code when the task involves:
25
- - Writing or modifying source code
26
- - Running build/test/lint commands and iterating on failures
27
- - Exploring a codebase to answer architectural questions
28
- - Multi-file refactors or migrations
29
- - Debugging issues that require reading code and running tests
30
- - Any task that benefits from direct filesystem and shell access
31
-
32
- Do NOT delegate when:
33
- - The user just wants a conversational answer or explanation
34
- - The task is pure information retrieval with no code changes needed
35
- - The user explicitly wants to discuss an approach before implementation
36
-
37
- ## Guardrails
38
-
39
- - Claude Code runs in a sandboxed environment with approval flows for destructive actions
40
- - File writes, edits, and shell commands that modify state require user confirmation (unless auto-approved by trust rules)
41
- - Read-only operations (file reads, searches, web fetches) are auto-approved
42
- - The working directory defaults to the current conversation's working directory but can be overridden
43
-
44
- ## Worker Profiles
45
-
46
- Claude Code supports scoped worker profiles that restrict tool access:
47
-
48
- - **general** (default) - Full access to all tools.
49
- - **researcher** - Read-only access. Can search, read files, and browse the web but cannot write or execute commands.
50
- - **coder** - Full read/write/execute access optimized for implementation tasks.
51
- - **reviewer** - Read-only access tailored for code review, with emphasis on analysis and feedback.
52
-
53
- Select the profile that best matches the task to enforce least-privilege access.
@@ -1,47 +0,0 @@
1
- {
2
- "version": 1,
3
- "tools": [
4
- {
5
- "name": "claude_code",
6
- "description": "Delegate a coding task to Claude Code, an AI-powered coding agent that can read, write, and edit files, run shell commands, and perform complex multi-step software engineering tasks autonomously.",
7
- "category": "coding",
8
- "risk": "medium",
9
- "input_schema": {
10
- "type": "object",
11
- "properties": {
12
- "prompt": {
13
- "type": "string",
14
- "description": "The coding task or question for Claude Code to work on. Use this for free-form tasks. Mutually exclusive with command."
15
- },
16
- "command": {
17
- "type": "string",
18
- "description": "Name of a .claude/commands/*.md command template to execute. The template will be loaded and $ARGUMENTS substituted before execution. Use this instead of prompt when invoking a named CC command."
19
- },
20
- "arguments": {
21
- "type": "string",
22
- "description": "Arguments to substitute into the command template ($ARGUMENTS placeholder). Only used with the command input."
23
- },
24
- "working_dir": {
25
- "type": "string",
26
- "description": "Working directory for Claude Code (defaults to conversation working directory)"
27
- },
28
- "resume": {
29
- "type": "string",
30
- "description": "Claude Code session ID to resume a previous session"
31
- },
32
- "model": {
33
- "type": "string",
34
- "description": "Model to use (defaults to claude-sonnet-4-6)"
35
- },
36
- "profile": {
37
- "type": "string",
38
- "enum": ["general", "researcher", "coder", "reviewer"],
39
- "description": "Worker profile that scopes tool access. Defaults to general."
40
- }
41
- }
42
- },
43
- "executor": "tools/claude-code.ts",
44
- "execution_target": "host"
45
- }
46
- ]
47
- }
@@ -1,12 +0,0 @@
1
- import { claudeCodeTool } from "../../../../tools/claude-code/claude-code.js";
2
- import type {
3
- ToolContext,
4
- ToolExecutionResult,
5
- } from "../../../../tools/types.js";
6
-
7
- export async function run(
8
- input: Record<string, unknown>,
9
- context: ToolContext,
10
- ): Promise<ToolExecutionResult> {
11
- return claudeCodeTool.execute(input, context);
12
- }
@@ -1,33 +0,0 @@
1
- ---
2
- name: orchestration
3
- description: Decompose complex tasks into parallel specialist subtasks
4
- compatibility: "Designed for Vellum personal assistants"
5
- metadata:
6
- emoji: "\U0001F500"
7
- vellum:
8
- display-name: "Orchestration"
9
- activation-hints:
10
- - "Multiple independent work streams that benefit from parallel execution"
11
- avoid-when:
12
- - "Single-focus tasks -- work directly"
13
- ---
14
-
15
- Use `swarm_delegate` when facing complex multi-part tasks that benefit from parallel execution. The tool decomposes an objective into independent specialist subtasks, runs them concurrently, and synthesises the results.
16
-
17
- ## When to use
18
-
19
- - The request involves **multiple independent work streams** (e.g. research + coding + review).
20
- - Tasks can run in parallel without sequential dependencies.
21
- - The combined work would take significantly longer if done serially.
22
-
23
- ## When NOT to use
24
-
25
- - Simple single-step requests - just do them directly.
26
- - Tasks that are inherently sequential (each step depends on the previous result).
27
- - Requests where the user is asking for a quick answer, not a deep workflow.
28
-
29
- ## Tips
30
-
31
- - Provide a clear, specific `objective`. The planner uses it to decompose the work.
32
- - Pass relevant `context` about the codebase or project when available.
33
- - The `max_workers` parameter caps concurrency (1-6); the default comes from config.
@@ -1,35 +0,0 @@
1
- {
2
- "version": 1,
3
- "tools": [
4
- {
5
- "name": "swarm_delegate",
6
- "description": "Decompose a complex task into parallel specialist subtasks and execute them concurrently. Use this for multi-part tasks that benefit from parallel research, coding, and review.",
7
- "category": "orchestration",
8
- "risk": "medium",
9
- "input_schema": {
10
- "type": "object",
11
- "properties": {
12
- "objective": {
13
- "type": "string",
14
- "description": "The complex task to decompose and execute in parallel"
15
- },
16
- "context": {
17
- "type": "string",
18
- "description": "Optional additional context about the task or codebase"
19
- },
20
- "max_workers": {
21
- "type": "number",
22
- "description": "Maximum concurrent workers (1-6, default from config)"
23
- },
24
- "activity": {
25
- "type": "string",
26
- "description": "Brief non-technical explanation of what you are doing and why, shown to the user as a status update. Use simple language a non-technical person would understand."
27
- }
28
- },
29
- "required": ["objective"]
30
- },
31
- "executor": "tools/swarm-delegate.ts",
32
- "execution_target": "host"
33
- }
34
- ]
35
- }
@@ -1,12 +0,0 @@
1
- import { swarmDelegateTool } from "../../../../tools/swarm/delegate.js";
2
- import type {
3
- ToolContext,
4
- ToolExecutionResult,
5
- } from "../../../../tools/types.js";
6
-
7
- export async function run(
8
- input: Record<string, unknown>,
9
- context: ToolContext,
10
- ): Promise<ToolExecutionResult> {
11
- return swarmDelegateTool.execute(input, context);
12
- }
@@ -1,101 +0,0 @@
1
- import { z } from "zod";
2
-
3
- export const MemorySimplifiedBriefConfigSchema = z
4
- .object({
5
- maxTokens: z
6
- .number({
7
- error: "memory.simplified.brief.maxTokens must be a number",
8
- })
9
- .int("memory.simplified.brief.maxTokens must be an integer")
10
- .positive("memory.simplified.brief.maxTokens must be a positive integer")
11
- .default(4000)
12
- .describe(
13
- "Maximum token budget for the memory brief injected into conversation context",
14
- ),
15
- })
16
- .describe("Controls the memory brief that is injected into conversations");
17
-
18
- export const MemorySimplifiedReducerConfigSchema = z
19
- .object({
20
- idleDelayMs: z
21
- .number({
22
- error: "memory.simplified.reducer.idleDelayMs must be a number",
23
- })
24
- .int("memory.simplified.reducer.idleDelayMs must be an integer")
25
- .positive(
26
- "memory.simplified.reducer.idleDelayMs must be a positive integer",
27
- )
28
- .default(30_000)
29
- .describe(
30
- "Milliseconds of idle time before the reducer processes new conversation turns into memory",
31
- ),
32
- switchWaitMs: z
33
- .number({
34
- error: "memory.simplified.reducer.switchWaitMs must be a number",
35
- })
36
- .int("memory.simplified.reducer.switchWaitMs must be an integer")
37
- .positive(
38
- "memory.simplified.reducer.switchWaitMs must be a positive integer",
39
- )
40
- .default(5_000)
41
- .describe(
42
- "Milliseconds to wait after a conversation switch before running the reducer",
43
- ),
44
- })
45
- .describe(
46
- "Controls when the memory reducer runs to process conversation turns into persistent memory",
47
- );
48
-
49
- export const MemorySimplifiedArchiveRecallConfigSchema = z
50
- .object({
51
- maxSnippets: z
52
- .number({
53
- error: "memory.simplified.archiveRecall.maxSnippets must be a number",
54
- })
55
- .int("memory.simplified.archiveRecall.maxSnippets must be an integer")
56
- .positive(
57
- "memory.simplified.archiveRecall.maxSnippets must be a positive integer",
58
- )
59
- .default(10)
60
- .describe(
61
- "Maximum number of archive snippets to recall when supplementing the brief with semantic search",
62
- ),
63
- })
64
- .describe(
65
- "Controls how archived memory snippets are recalled via semantic search",
66
- );
67
-
68
- export const MemorySimplifiedConfigSchema = z
69
- .object({
70
- enabled: z
71
- .boolean({
72
- error: "memory.simplified.enabled must be a boolean",
73
- })
74
- .default(true)
75
- .describe("Whether the simplified memory system is enabled"),
76
- brief: MemorySimplifiedBriefConfigSchema.default(
77
- MemorySimplifiedBriefConfigSchema.parse({}),
78
- ),
79
- reducer: MemorySimplifiedReducerConfigSchema.default(
80
- MemorySimplifiedReducerConfigSchema.parse({}),
81
- ),
82
- archiveRecall: MemorySimplifiedArchiveRecallConfigSchema.default(
83
- MemorySimplifiedArchiveRecallConfigSchema.parse({}),
84
- ),
85
- })
86
- .describe(
87
- "Simplified two-layer memory system — a brief plus archive recall, replacing the legacy item/tier/staleness model",
88
- );
89
-
90
- export type MemorySimplifiedConfig = z.infer<
91
- typeof MemorySimplifiedConfigSchema
92
- >;
93
- export type MemorySimplifiedBriefConfig = z.infer<
94
- typeof MemorySimplifiedBriefConfigSchema
95
- >;
96
- export type MemorySimplifiedReducerConfig = z.infer<
97
- typeof MemorySimplifiedReducerConfigSchema
98
- >;
99
- export type MemorySimplifiedArchiveRecallConfig = z.infer<
100
- typeof MemorySimplifiedArchiveRecallConfigSchema
101
- >;
@@ -1,82 +0,0 @@
1
- import { z } from "zod";
2
-
3
- export const SwarmConfigSchema = z
4
- .object({
5
- enabled: z
6
- .boolean({ error: "swarm.enabled must be a boolean" })
7
- .default(true)
8
- .describe("Whether swarm (parallel multi-agent) execution is enabled"),
9
- maxWorkers: z
10
- .number({ error: "swarm.maxWorkers must be a number" })
11
- .int("swarm.maxWorkers must be an integer")
12
- .positive("swarm.maxWorkers must be a positive integer")
13
- .max(6, "swarm.maxWorkers must be at most 6")
14
- .default(3)
15
- .describe("Maximum number of concurrent swarm workers"),
16
- maxTasks: z
17
- .number({ error: "swarm.maxTasks must be a number" })
18
- .int("swarm.maxTasks must be an integer")
19
- .positive("swarm.maxTasks must be a positive integer")
20
- .max(20, "swarm.maxTasks must be at most 20")
21
- .default(8)
22
- .describe("Maximum number of tasks a single swarm can execute"),
23
- maxRetriesPerTask: z
24
- .number({ error: "swarm.maxRetriesPerTask must be a number" })
25
- .int("swarm.maxRetriesPerTask must be an integer")
26
- .nonnegative("swarm.maxRetriesPerTask must be a non-negative integer")
27
- .max(3, "swarm.maxRetriesPerTask must be at most 3")
28
- .default(1)
29
- .describe("Maximum number of retries for a failed swarm task"),
30
- workerTimeoutSec: z
31
- .number({ error: "swarm.workerTimeoutSec must be a number" })
32
- .int("swarm.workerTimeoutSec must be an integer")
33
- .positive("swarm.workerTimeoutSec must be a positive integer")
34
- .default(900)
35
- .describe("Timeout for a single swarm worker in seconds"),
36
- roleTimeoutsSec: z
37
- .object({
38
- router: z
39
- .number()
40
- .int()
41
- .positive()
42
- .optional()
43
- .describe("Timeout override for router workers (seconds)"),
44
- researcher: z
45
- .number()
46
- .int()
47
- .positive()
48
- .optional()
49
- .describe("Timeout override for researcher workers (seconds)"),
50
- coder: z
51
- .number()
52
- .int()
53
- .positive()
54
- .optional()
55
- .describe("Timeout override for coder workers (seconds)"),
56
- reviewer: z
57
- .number()
58
- .int()
59
- .positive()
60
- .optional()
61
- .describe("Timeout override for reviewer workers (seconds)"),
62
- })
63
- .default({})
64
- .describe("Per-role timeout overrides for swarm workers"),
65
- plannerModelIntent: z
66
- .enum(["latency-optimized", "quality-optimized", "vision-optimized"], {
67
- error: "swarm.plannerModelIntent must be a valid model intent",
68
- })
69
- .default("latency-optimized")
70
- .describe("Model selection strategy for the swarm planning phase"),
71
- synthesizerModelIntent: z
72
- .enum(["latency-optimized", "quality-optimized", "vision-optimized"], {
73
- error: "swarm.synthesizerModelIntent must be a valid model intent",
74
- })
75
- .default("quality-optimized")
76
- .describe(
77
- "Model selection strategy for the swarm synthesis (result-combining) phase",
78
- ),
79
- })
80
- .describe("Swarm configuration — parallel multi-agent task execution");
81
-
82
- export type SwarmConfig = z.infer<typeof SwarmConfigSchema>;