@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
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Business logic for Vercel API token management.
3
+ *
4
+ * The Vercel token is stored in the secure credential vault under
5
+ * `credential/vercel/api_token`. These functions provide get/set/delete
6
+ * operations that mirror the pattern used by Telegram config handlers.
7
+ */
8
+
9
+ import { credentialKey } from "../../security/credential-key.js";
10
+ import {
11
+ deleteSecureKeyAsync,
12
+ getSecureKeyAsync,
13
+ setSecureKeyAsync,
14
+ } from "../../security/secure-keys.js";
15
+ import {
16
+ deleteCredentialMetadata,
17
+ upsertCredentialMetadata,
18
+ } from "../../tools/credentials/metadata-store.js";
19
+ import { getLogger } from "../../util/logger.js";
20
+
21
+ const log = getLogger("config-vercel");
22
+
23
+ // -- Transport-agnostic result type --
24
+
25
+ export interface VercelConfigResult {
26
+ hasToken: boolean;
27
+ success: boolean;
28
+ error?: string;
29
+ }
30
+
31
+ /**
32
+ * Check whether a Vercel API token is stored in the credential vault.
33
+ */
34
+ export async function getVercelConfig(): Promise<VercelConfigResult> {
35
+ const token = await getSecureKeyAsync(credentialKey("vercel", "api_token"));
36
+ return { hasToken: !!token, success: true };
37
+ }
38
+
39
+ /**
40
+ * Store a Vercel API token in the credential vault.
41
+ */
42
+ export async function setVercelConfig(
43
+ apiToken?: string,
44
+ ): Promise<VercelConfigResult> {
45
+ if (!apiToken) {
46
+ return { hasToken: false, success: false, error: "apiToken is required" };
47
+ }
48
+
49
+ const stored = await setSecureKeyAsync(
50
+ credentialKey("vercel", "api_token"),
51
+ apiToken,
52
+ );
53
+ if (!stored) {
54
+ return {
55
+ hasToken: false,
56
+ success: false,
57
+ error: "Failed to store Vercel API token in secure storage",
58
+ };
59
+ }
60
+
61
+ upsertCredentialMetadata("vercel", "api_token", {
62
+ allowedTools: ["deploy", "publish_page"],
63
+ });
64
+
65
+ log.info("Vercel API token stored successfully");
66
+ return { hasToken: true, success: true };
67
+ }
68
+
69
+ /**
70
+ * Delete the Vercel API token from the credential vault.
71
+ */
72
+ export async function deleteVercelConfig(): Promise<VercelConfigResult> {
73
+ const result = await deleteSecureKeyAsync(
74
+ credentialKey("vercel", "api_token"),
75
+ );
76
+
77
+ if (result === "error") {
78
+ const stillPresent = !!(await getSecureKeyAsync(
79
+ credentialKey("vercel", "api_token"),
80
+ ));
81
+ return {
82
+ hasToken: stillPresent,
83
+ success: false,
84
+ error: "Failed to delete Vercel API token from secure storage",
85
+ };
86
+ }
87
+
88
+ deleteCredentialMetadata("vercel", "api_token");
89
+
90
+ log.info("Vercel API token deleted");
91
+ return { hasToken: false, success: true };
92
+ }
@@ -23,7 +23,6 @@ import {
23
23
  queueGenerateConversationTitle,
24
24
  UNTITLED_FALLBACK,
25
25
  } from "../../memory/conversation-title-service.js";
26
- import { reduceBeforeSwitch } from "../../memory/reducer-scheduler.js";
27
26
  import * as pendingInteractions from "../../runtime/pending-interactions.js";
28
27
  import { getSubagentManager } from "../../subagent/index.js";
29
28
  import { truncate } from "../../util/truncate.js";
@@ -234,12 +233,6 @@ export async function handleConversationCreate(
234
233
  conversationType: normalizeConversationType(conversation.conversationType),
235
234
  });
236
235
 
237
- // Reduce the previous dirty conversation before processing the initial
238
- // message so its memory is fresh for the next read.
239
- if (msg.initialMessage) {
240
- await reduceBeforeSwitch(conversation.id);
241
- }
242
-
243
236
  // Auto-send the initial message if provided, kick-starting the skill.
244
237
  if (msg.initialMessage) {
245
238
  // Queue title generation eagerly — some processMessage paths (guardian
@@ -350,10 +343,6 @@ export async function switchConversation(
350
343
  return null;
351
344
  }
352
345
 
353
- // Reduce the previous dirty conversation before switching so its memory
354
- // is fresh for the next read.
355
- await reduceBeforeSwitch(conversationId);
356
-
357
346
  // If the target conversation is headless-locked (actively executing a task run),
358
347
  // skip rebinding so tool confirmations stay suppressed.
359
348
  const existingConversation = ctx.conversations.get(conversationId);
@@ -24,6 +24,7 @@ import {
24
24
  getConfiguredProvider,
25
25
  userMessage,
26
26
  } from "../../providers/provider-send-message.js";
27
+ import { isTextMimeType as isTextMime } from "../../runtime/routes/workspace-utils.js";
27
28
  import {
28
29
  clawhubCheckUpdates,
29
30
  clawhubInspect,
@@ -49,20 +50,6 @@ import {
49
50
 
50
51
  // ─── MIME detection helpers ───────────────────────────────────────────────────
51
52
 
52
- const TEXT_MIME_PREFIXES = [
53
- "text/",
54
- "application/json",
55
- "application/javascript",
56
- "application/typescript",
57
- "application/xml",
58
- "application/yaml",
59
- "application/x-yaml",
60
- "application/toml",
61
- "application/x-sh",
62
- ];
63
- function isTextMime(mimeType: string): boolean {
64
- return TEXT_MIME_PREFIXES.some((prefix) => mimeType.startsWith(prefix));
65
- }
66
53
  const MAX_INLINE_SIZE = 2 * 1024 * 1024; // 2 MB
67
54
 
68
55
  // ─── Shared context for standalone functions ─────────────────────────────────
@@ -380,7 +367,7 @@ function readDirRecursive(dir: string, rootDir: string): SkillFileEntry[] {
380
367
  try {
381
368
  const stat = statSync(fullPath);
382
369
  const mimeType = Bun.file(fullPath).type;
383
- const isText = isTextMime(mimeType);
370
+ const isText = isTextMime(mimeType, dirent.name);
384
371
  let content: string | null = null;
385
372
  if (isText && stat.size <= MAX_INLINE_SIZE) {
386
373
  content = readFileSync(fullPath, "utf-8");
@@ -0,0 +1,195 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import {
3
+ appendFileSync,
4
+ existsSync,
5
+ lstatSync,
6
+ mkdirSync,
7
+ readFileSync,
8
+ readlinkSync,
9
+ symlinkSync,
10
+ unlinkSync,
11
+ } from "node:fs";
12
+ import { homedir } from "node:os";
13
+ import { dirname, join } from "node:path";
14
+
15
+ import { getLogger } from "../util/logger.js";
16
+
17
+ const log = getLogger("install-symlink");
18
+
19
+ /**
20
+ * Resolves the path to the `vellum-assistant` binary that should be symlinked
21
+ * as `assistant`.
22
+ *
23
+ * - **Bundled (desktop app):** The daemon runs from a compiled binary inside
24
+ * `Vellum.app/Contents/MacOS/`. `process.execPath` is the daemon binary
25
+ * itself — the `vellum-assistant` CLI binary lives alongside it in the same
26
+ * directory.
27
+ *
28
+ * - **Dev (bun):** `process.execPath` is the bun runtime. We resolve the
29
+ * assistant entrypoint relative to this file's location in the source tree
30
+ * and return a wrapper script path that would need bun to run — so we skip
31
+ * symlinking in dev mode since developers manage their own PATH.
32
+ */
33
+ function resolveAssistantBinary(): string | null {
34
+ const execPath = process.execPath;
35
+ // Detect the bundled desktop app case by checking for the app bundle path.
36
+ const isBundled = execPath.includes("/Contents/MacOS/");
37
+
38
+ if (isBundled) {
39
+ // The assistant CLI binary is a sibling of the daemon binary in
40
+ // Contents/MacOS/.
41
+ const macosDir = dirname(execPath);
42
+ const assistantBinary = join(macosDir, "vellum-assistant");
43
+ if (existsSync(assistantBinary)) {
44
+ return assistantBinary;
45
+ }
46
+ log.warn(
47
+ { expected: assistantBinary },
48
+ "Bundled vellum-assistant binary not found alongside daemon",
49
+ );
50
+ return null;
51
+ }
52
+
53
+ // Dev mode: resolve the assistant entrypoint from the source tree.
54
+ // The daemon entry is at assistant/src/daemon/main.ts and the assistant
55
+ // CLI entry is at assistant/src/index.ts.
56
+ const assistantEntry = join(dirname(__filename), "..", "index.ts");
57
+ if (existsSync(assistantEntry)) {
58
+ return assistantEntry;
59
+ }
60
+ return null;
61
+ }
62
+
63
+ /**
64
+ * Attempts to place a symlink at `symlinkPath` pointing to `target`.
65
+ * Returns true if the symlink was created or already points to the target.
66
+ */
67
+ function trySymlink(target: string, symlinkPath: string): boolean {
68
+ try {
69
+ try {
70
+ const stats = lstatSync(symlinkPath);
71
+ if (!stats.isSymbolicLink()) {
72
+ // Real file — don't overwrite (could be a developer's local install)
73
+ return false;
74
+ }
75
+ const dest = readlinkSync(symlinkPath);
76
+ if (dest === target) return true;
77
+ // Stale or dangling symlink — remove before creating new one
78
+ unlinkSync(symlinkPath);
79
+ } catch (e) {
80
+ if ((e as NodeJS.ErrnoException)?.code !== "ENOENT") return false;
81
+ // Path doesn't exist — proceed to create symlink
82
+ }
83
+
84
+ const dir = dirname(symlinkPath);
85
+ if (!existsSync(dir)) {
86
+ mkdirSync(dir, { recursive: true });
87
+ }
88
+ symlinkSync(target, symlinkPath);
89
+ return true;
90
+ } catch {
91
+ return false;
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Ensures ~/.local/bin is present in the user's shell profile so that
97
+ * symlinks placed there are on PATH in new terminal sessions.
98
+ */
99
+ function ensureLocalBinInShellProfile(localBinDir: string): void {
100
+ const shell = process.env.SHELL ?? "";
101
+ const home = homedir();
102
+ const profilePath = shell.endsWith("/zsh")
103
+ ? join(home, ".zshrc")
104
+ : shell.endsWith("/bash")
105
+ ? join(home, ".bash_profile")
106
+ : null;
107
+ if (!profilePath) return;
108
+
109
+ try {
110
+ const contents = existsSync(profilePath)
111
+ ? readFileSync(profilePath, "utf-8")
112
+ : "";
113
+ if (contents.includes(localBinDir)) return;
114
+ const line = `\nexport PATH="${localBinDir}:$PATH"\n`;
115
+ appendFileSync(profilePath, line);
116
+ log.info(
117
+ { profilePath, localBinDir },
118
+ "Added ~/.local/bin to shell profile",
119
+ );
120
+ } catch {
121
+ // Not critical — user can add it manually
122
+ }
123
+ }
124
+
125
+ /**
126
+ * Checks whether `assistant` already resolves on PATH to something other than
127
+ * our candidate symlink locations. If so, we skip symlinking to avoid
128
+ * overwriting a developer's local build.
129
+ */
130
+ function commandResolvesElsewhere(
131
+ commandName: string,
132
+ candidatePaths: Set<string>,
133
+ ): boolean {
134
+ try {
135
+ const resolved = execFileSync("/usr/bin/which", [commandName], {
136
+ encoding: "utf-8",
137
+ stdio: ["ignore", "pipe", "ignore"],
138
+ }).trim();
139
+ return resolved !== "" && !candidatePaths.has(resolved);
140
+ } catch {
141
+ // `which` exited non-zero — command not found, safe to proceed
142
+ return false;
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Idempotent: installs (or verifies) a symlink for the `assistant` command.
148
+ *
149
+ * Called on every daemon startup. Handles two runtime modes:
150
+ * - **Bundled binary** (desktop app): symlinks to the compiled
151
+ * `vellum-assistant` binary in the app bundle.
152
+ * - **Bun dev mode**: symlinks to a small wrapper script that invokes
153
+ * `bun run` on the assistant entrypoint.
154
+ *
155
+ * Tries `/usr/local/bin/assistant` first, then falls back to
156
+ * `~/.local/bin/assistant` (and patches the shell profile if needed).
157
+ *
158
+ * Skipped when VELLUM_DEV=1 (developers manage their own PATH).
159
+ */
160
+ export function installAssistantSymlink(): void {
161
+ if (process.env.VELLUM_DEV === "1") return;
162
+
163
+ const target = resolveAssistantBinary();
164
+ if (!target) return;
165
+
166
+ const localBinDir = join(homedir(), ".local", "bin");
167
+ const candidateDirs = ["/usr/local/bin", localBinDir];
168
+ const candidatePaths = new Set(
169
+ candidateDirs.map((dir) => `${dir}/assistant`),
170
+ );
171
+
172
+ if (commandResolvesElsewhere("assistant", candidatePaths)) {
173
+ log.info(
174
+ "`assistant` already resolves to a non-managed path — skipping symlink",
175
+ );
176
+ return;
177
+ }
178
+
179
+ for (const dir of candidateDirs) {
180
+ const symlinkPath = join(dir, "assistant");
181
+ if (trySymlink(target, symlinkPath)) {
182
+ log.info({ symlinkPath, target }, "Installed assistant symlink");
183
+ if (dir === localBinDir) {
184
+ ensureLocalBinInShellProfile(localBinDir);
185
+ }
186
+ return;
187
+ }
188
+ log.info(
189
+ { symlinkPath },
190
+ "Could not install assistant symlink at candidate — trying next",
191
+ );
192
+ }
193
+
194
+ log.warn("Could not install assistant symlink in any candidate directory");
195
+ }