@vellumai/assistant 0.3.4 → 0.3.6

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 (506) hide show
  1. package/Dockerfile +2 -0
  2. package/README.md +88 -2
  3. package/eslint.config.mjs +31 -0
  4. package/package.json +1 -1
  5. package/scripts/ipc/check-swift-decoder-drift.ts +4 -1
  6. package/scripts/ipc/generate-swift.ts +31 -2
  7. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +438 -1
  8. package/src/__tests__/approval-conversation-turn.test.ts +214 -0
  9. package/src/__tests__/approval-hardcoded-copy-guard.test.ts +41 -0
  10. package/src/__tests__/approval-message-composer.test.ts +253 -0
  11. package/src/__tests__/browser-manager.test.ts +1 -0
  12. package/src/__tests__/call-conversation-messages.test.ts +130 -0
  13. package/src/__tests__/call-domain.test.ts +12 -2
  14. package/src/__tests__/call-orchestrator.test.ts +799 -249
  15. package/src/__tests__/call-pointer-messages.test.ts +148 -0
  16. package/src/__tests__/call-recovery.test.ts +3 -0
  17. package/src/__tests__/call-routes-http.test.ts +32 -2
  18. package/src/__tests__/call-store.test.ts +3 -0
  19. package/src/__tests__/channel-approval-routes.test.ts +1277 -98
  20. package/src/__tests__/channel-approval.test.ts +37 -0
  21. package/src/__tests__/channel-approvals.test.ts +36 -50
  22. package/src/__tests__/channel-guardian.test.ts +630 -22
  23. package/src/__tests__/channel-readiness-service.test.ts +324 -0
  24. package/src/__tests__/checker.test.ts +14 -7
  25. package/src/__tests__/clarification-resolver.test.ts +44 -24
  26. package/src/__tests__/commit-message-enrichment-service.test.ts +9 -4
  27. package/src/__tests__/computer-use-session-working-dir.test.ts +8 -0
  28. package/src/__tests__/config-schema.test.ts +14 -8
  29. package/src/__tests__/context-window-manager.test.ts +30 -2
  30. package/src/__tests__/contradiction-checker.test.ts +20 -5
  31. package/src/__tests__/credential-security-invariants.test.ts +7 -2
  32. package/src/__tests__/daemon-lifecycle.test.ts +13 -12
  33. package/src/__tests__/db-migration-rollback.test.ts +752 -0
  34. package/src/__tests__/dictation-mode-detection.test.ts +63 -0
  35. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -0
  36. package/src/__tests__/entity-search.test.ts +615 -0
  37. package/src/__tests__/fuzzy-match-property.test.ts +5 -5
  38. package/src/__tests__/guardian-action-store.test.ts +123 -0
  39. package/src/__tests__/guardian-action-sweep.test.ts +277 -0
  40. package/src/__tests__/guardian-dispatch.test.ts +389 -0
  41. package/src/__tests__/guardian-question-copy.test.ts +47 -0
  42. package/src/__tests__/handlers-telegram-config.test.ts +4 -2
  43. package/src/__tests__/handlers-twilio-config.test.ts +533 -0
  44. package/src/__tests__/intent-routing.test.ts +2 -0
  45. package/src/__tests__/ipc-snapshot.test.ts +291 -1
  46. package/src/__tests__/memory-upsert-concurrency.test.ts +828 -0
  47. package/src/__tests__/messaging-send-tool.test.ts +65 -0
  48. package/src/__tests__/model-intents.test.ts +96 -0
  49. package/src/__tests__/no-direct-anthropic-sdk-imports.test.ts +42 -0
  50. package/src/__tests__/oauth2-gateway-transport.test.ts +130 -0
  51. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -0
  52. package/src/__tests__/provider-commit-message-generator.test.ts +89 -13
  53. package/src/__tests__/provider-error-scenarios.test.ts +621 -0
  54. package/src/__tests__/provider-fail-open-selection.test.ts +119 -0
  55. package/src/__tests__/qdrant-manager.test.ts +27 -20
  56. package/src/__tests__/relay-server.test.ts +779 -40
  57. package/src/__tests__/run-orchestrator-assistant-events.test.ts +6 -0
  58. package/src/__tests__/run-orchestrator.test.ts +42 -4
  59. package/src/__tests__/runtime-runs-http.test.ts +17 -1
  60. package/src/__tests__/runtime-runs.test.ts +16 -0
  61. package/src/__tests__/schedule-store.test.ts +18 -4
  62. package/src/__tests__/scheduler-recurrence.test.ts +13 -4
  63. package/src/__tests__/session-abort-tool-results.test.ts +6 -0
  64. package/src/__tests__/session-agent-loop.test.ts +857 -0
  65. package/src/__tests__/session-conflict-gate.test.ts +6 -0
  66. package/src/__tests__/session-pre-run-repair.test.ts +6 -0
  67. package/src/__tests__/session-profile-injection.test.ts +6 -0
  68. package/src/__tests__/session-provider-retry-repair.test.ts +6 -0
  69. package/src/__tests__/session-queue.test.ts +6 -0
  70. package/src/__tests__/session-runtime-assembly.test.ts +321 -13
  71. package/src/__tests__/session-slash-known.test.ts +6 -0
  72. package/src/__tests__/session-slash-queue.test.ts +6 -0
  73. package/src/__tests__/session-slash-unknown.test.ts +6 -0
  74. package/src/__tests__/session-surfaces-task-progress.test.ts +2 -0
  75. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -0
  76. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -0
  77. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -0
  78. package/src/__tests__/session-workspace-injection.test.ts +6 -0
  79. package/src/__tests__/session-workspace-tool-tracking.test.ts +6 -0
  80. package/src/__tests__/skills.test.ts +2 -0
  81. package/src/__tests__/sms-messaging-provider.test.ts +126 -0
  82. package/src/__tests__/starter-task-flow.test.ts +2 -0
  83. package/src/__tests__/swarm-dag-pathological.test.ts +535 -0
  84. package/src/__tests__/system-prompt.test.ts +2 -0
  85. package/src/__tests__/task-management-tools.test.ts +2 -2
  86. package/src/__tests__/task-runner.test.ts +14 -4
  87. package/src/__tests__/terminal-tools.test.ts +25 -19
  88. package/src/__tests__/tool-execution-abort-cleanup.test.ts +545 -0
  89. package/src/__tests__/tool-executor-shell-integration.test.ts +11 -11
  90. package/src/__tests__/tool-executor.test.ts +23 -24
  91. package/src/__tests__/trust-store.test.ts +3 -3
  92. package/src/__tests__/twilio-rest.test.ts +29 -0
  93. package/src/__tests__/twilio-routes-elevenlabs.test.ts +3 -0
  94. package/src/__tests__/twilio-routes-twiml.test.ts +11 -0
  95. package/src/__tests__/twilio-routes.test.ts +167 -11
  96. package/src/__tests__/twitter-cli-error-shaping.test.ts +2 -2
  97. package/src/__tests__/user-reference.test.ts +2 -0
  98. package/src/__tests__/voice-quality.test.ts +222 -0
  99. package/src/__tests__/web-search.test.ts +46 -30
  100. package/src/__tests__/work-item-output.test.ts +110 -0
  101. package/src/agent/loop.ts +1 -1
  102. package/src/agent-heartbeat/agent-heartbeat-service.ts +2 -10
  103. package/src/amazon/client.ts +1418 -0
  104. package/src/amazon/request-extractor.ts +135 -0
  105. package/src/amazon/session.ts +109 -0
  106. package/src/autonomy/autonomy-store.ts +5 -5
  107. package/src/browser-extension-relay/client.ts +124 -0
  108. package/src/browser-extension-relay/protocol.ts +63 -0
  109. package/src/browser-extension-relay/server.ts +177 -0
  110. package/src/bundler/app-bundler.ts +3 -3
  111. package/src/bundler/bundle-signer.ts +1 -1
  112. package/src/bundler/signature-verifier.ts +1 -1
  113. package/src/calls/call-conversation-messages.ts +33 -0
  114. package/src/calls/call-domain.ts +114 -10
  115. package/src/calls/call-orchestrator.ts +268 -59
  116. package/src/calls/call-pointer-messages.ts +53 -0
  117. package/src/calls/call-recovery.ts +3 -8
  118. package/src/calls/call-store.ts +69 -87
  119. package/src/calls/elevenlabs-config.ts +3 -2
  120. package/src/calls/guardian-action-sweep.ts +105 -0
  121. package/src/calls/guardian-dispatch.ts +203 -0
  122. package/src/calls/guardian-question-copy.ts +133 -0
  123. package/src/calls/relay-server.ts +466 -8
  124. package/src/calls/speaker-identification.ts +1 -1
  125. package/src/calls/twilio-config.ts +22 -14
  126. package/src/calls/twilio-provider.ts +6 -4
  127. package/src/calls/twilio-rest.ts +308 -7
  128. package/src/calls/twilio-routes.ts +65 -12
  129. package/src/calls/types.ts +3 -1
  130. package/src/channels/types.ts +25 -0
  131. package/src/cli/amazon.ts +815 -0
  132. package/src/cli/config-commands.ts +2 -2
  133. package/src/cli/core-commands.ts +4 -3
  134. package/src/cli/influencer.ts +244 -0
  135. package/src/cli/map.ts +89 -6
  136. package/src/cli.ts +1 -1
  137. package/src/config/agent-schema.ts +171 -0
  138. package/src/config/bundled-skills/amazon/SKILL.md +127 -0
  139. package/src/config/bundled-skills/amazon/icon.svg +13 -0
  140. package/src/config/bundled-skills/api-mapping/SKILL.md +78 -0
  141. package/src/config/bundled-skills/browser/SKILL.md +1 -0
  142. package/src/config/bundled-skills/browser/TOOLS.json +17 -0
  143. package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +25 -0
  144. package/src/config/bundled-skills/doordash/SKILL.md +51 -51
  145. package/src/config/bundled-skills/email-setup/SKILL.md +14 -5
  146. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +183 -0
  147. package/src/config/bundled-skills/influencer/SKILL.md +144 -0
  148. package/src/config/bundled-skills/knowledge-graph/SKILL.md +15 -0
  149. package/src/config/bundled-skills/knowledge-graph/TOOLS.json +56 -0
  150. package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +185 -0
  151. package/src/config/bundled-skills/macos-automation/icon.svg +12 -0
  152. package/src/config/bundled-skills/media-processing/SKILL.md +176 -0
  153. package/src/config/bundled-skills/media-processing/TOOLS.json +230 -0
  154. package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +77 -0
  155. package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +69 -0
  156. package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +303 -0
  157. package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +55 -0
  158. package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +86 -0
  159. package/src/config/bundled-skills/media-processing/services/gemini-map.ts +339 -0
  160. package/src/config/bundled-skills/media-processing/services/preprocess.ts +551 -0
  161. package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +259 -0
  162. package/src/config/bundled-skills/media-processing/services/reduce.ts +197 -0
  163. package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +136 -0
  164. package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +59 -0
  165. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +195 -0
  166. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +197 -0
  167. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +143 -0
  168. package/src/config/bundled-skills/media-processing/tools/media-status.ts +75 -0
  169. package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +65 -0
  170. package/src/config/bundled-skills/messaging/SKILL.md +33 -8
  171. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -7
  172. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +2 -1
  173. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +5 -1
  174. package/src/config/bundled-skills/phone-calls/SKILL.md +88 -23
  175. package/src/config/bundled-skills/twitter/SKILL.md +19 -3
  176. package/src/config/bundled-skills/twitter/icon.svg +14 -0
  177. package/src/config/bundled-tool-registry.ts +310 -0
  178. package/src/config/calls-schema.ts +181 -0
  179. package/src/config/core-schema.ts +309 -0
  180. package/src/config/defaults.ts +28 -3
  181. package/src/config/env-registry.ts +162 -0
  182. package/src/config/env.ts +175 -0
  183. package/src/config/loader.ts +6 -6
  184. package/src/config/memory-schema.ts +528 -0
  185. package/src/config/sandbox-schema.ts +55 -0
  186. package/src/config/schema.ts +158 -1133
  187. package/src/config/skill-state.ts +1 -1
  188. package/src/config/skills-schema.ts +32 -0
  189. package/src/config/skills.ts +35 -24
  190. package/src/config/system-prompt.ts +131 -56
  191. package/src/config/templates/IDENTITY.md +2 -2
  192. package/src/config/templates/SOUL.md +1 -1
  193. package/src/config/types.ts +1 -0
  194. package/src/config/user-reference.ts +4 -9
  195. package/src/config/vellum-skills/catalog.json +6 -7
  196. package/src/config/vellum-skills/chatgpt-import/tools/chatgpt-import.ts +5 -1
  197. package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +4 -3
  198. package/src/config/vellum-skills/sms-setup/SKILL.md +216 -0
  199. package/src/config/vellum-skills/twilio-setup/SKILL.md +40 -8
  200. package/src/context/window-manager.ts +27 -7
  201. package/src/daemon/approval-generators.ts +186 -0
  202. package/src/daemon/approved-devices-store.ts +140 -0
  203. package/src/daemon/assistant-attachments.ts +1 -1
  204. package/src/daemon/classifier.ts +35 -32
  205. package/src/daemon/config-watcher.ts +1 -1
  206. package/src/daemon/daemon-control.ts +217 -0
  207. package/src/daemon/handlers/apps.ts +2 -3
  208. package/src/daemon/handlers/config-channels.ts +158 -0
  209. package/src/daemon/handlers/config-inbox.ts +540 -0
  210. package/src/daemon/handlers/config-ingress.ts +231 -0
  211. package/src/daemon/handlers/config-integrations.ts +258 -0
  212. package/src/daemon/handlers/config-model.ts +143 -0
  213. package/src/daemon/handlers/config-parental.ts +163 -0
  214. package/src/daemon/handlers/config-scheduling.ts +172 -0
  215. package/src/daemon/handlers/config-slack.ts +92 -0
  216. package/src/daemon/handlers/config-telegram.ts +301 -0
  217. package/src/daemon/handlers/config-tools.ts +177 -0
  218. package/src/daemon/handlers/config-trust.ts +104 -0
  219. package/src/daemon/handlers/config-twilio.ts +1080 -0
  220. package/src/daemon/handlers/config.ts +53 -1689
  221. package/src/daemon/handlers/diagnostics.ts +1 -1
  222. package/src/daemon/handlers/dictation.ts +180 -0
  223. package/src/daemon/handlers/documents.ts +18 -32
  224. package/src/daemon/handlers/identity.ts +14 -23
  225. package/src/daemon/handlers/index.ts +11 -0
  226. package/src/daemon/handlers/misc.ts +3 -5
  227. package/src/daemon/handlers/pairing.ts +98 -0
  228. package/src/daemon/handlers/sessions.ts +56 -5
  229. package/src/daemon/handlers/shared.ts +6 -1
  230. package/src/daemon/handlers/skills.ts +1 -1
  231. package/src/daemon/handlers/twitter-auth.ts +2 -0
  232. package/src/daemon/handlers/work-items.ts +17 -9
  233. package/src/daemon/handlers/workspace-files.ts +4 -3
  234. package/src/daemon/install-cli-launchers.ts +113 -0
  235. package/src/daemon/ipc-contract/apps.ts +356 -0
  236. package/src/daemon/ipc-contract/browser.ts +74 -0
  237. package/src/daemon/ipc-contract/computer-use.ts +151 -0
  238. package/src/daemon/ipc-contract/diagnostics.ts +56 -0
  239. package/src/daemon/ipc-contract/documents.ts +74 -0
  240. package/src/daemon/ipc-contract/inbox.ts +209 -0
  241. package/src/daemon/ipc-contract/integrations.ts +284 -0
  242. package/src/daemon/ipc-contract/memory.ts +48 -0
  243. package/src/daemon/ipc-contract/messages.ts +211 -0
  244. package/src/daemon/ipc-contract/pairing.ts +45 -0
  245. package/src/daemon/ipc-contract/parental-control.ts +95 -0
  246. package/src/daemon/ipc-contract/schedules.ts +97 -0
  247. package/src/daemon/ipc-contract/sessions.ts +315 -0
  248. package/src/daemon/ipc-contract/shared.ts +42 -0
  249. package/src/daemon/ipc-contract/skills.ts +120 -0
  250. package/src/daemon/ipc-contract/subagents.ts +58 -0
  251. package/src/daemon/ipc-contract/surfaces.ts +250 -0
  252. package/src/daemon/ipc-contract/trust.ts +60 -0
  253. package/src/daemon/ipc-contract/work-items.ts +225 -0
  254. package/src/daemon/ipc-contract/workspace.ts +113 -0
  255. package/src/daemon/ipc-contract-inventory.json +70 -0
  256. package/src/daemon/ipc-contract-inventory.ts +55 -29
  257. package/src/daemon/ipc-contract.ts +229 -2426
  258. package/src/daemon/ipc-protocol.ts +1 -1
  259. package/src/daemon/ipc-validate.ts +7 -0
  260. package/src/daemon/lifecycle.ts +97 -377
  261. package/src/daemon/pairing-store.ts +177 -0
  262. package/src/daemon/providers-setup.ts +43 -0
  263. package/src/daemon/ride-shotgun-handler.ts +68 -3
  264. package/src/daemon/server.ts +66 -46
  265. package/src/daemon/session-agent-loop-handlers.ts +421 -0
  266. package/src/daemon/session-agent-loop.ts +117 -275
  267. package/src/daemon/session-dynamic-profile.ts +1 -1
  268. package/src/daemon/session-history.ts +1 -1
  269. package/src/daemon/session-media-retry.ts +1 -1
  270. package/src/daemon/session-messaging.ts +37 -2
  271. package/src/daemon/session-notifiers.ts +5 -25
  272. package/src/daemon/session-process.ts +99 -59
  273. package/src/daemon/session-queue-manager.ts +96 -4
  274. package/src/daemon/session-runtime-assembly.ts +199 -10
  275. package/src/daemon/session-surfaces.ts +19 -4
  276. package/src/daemon/session-tool-setup.ts +30 -30
  277. package/src/daemon/session-workspace.ts +1 -1
  278. package/src/daemon/session.ts +35 -2
  279. package/src/daemon/shutdown-handlers.ts +122 -0
  280. package/src/daemon/trace-emitter.ts +1 -1
  281. package/src/daemon/watch-handler.ts +36 -33
  282. package/src/doordash/cart-queries.ts +787 -0
  283. package/src/doordash/client.ts +144 -127
  284. package/src/doordash/order-queries.ts +85 -0
  285. package/src/doordash/queries.ts +10 -1308
  286. package/src/doordash/search-queries.ts +203 -0
  287. package/src/doordash/session.ts +3 -2
  288. package/src/doordash/store-queries.ts +246 -0
  289. package/src/doordash/types.ts +367 -0
  290. package/src/email/providers/agentmail.ts +2 -1
  291. package/src/email/providers/index.ts +3 -2
  292. package/src/email/service.ts +3 -2
  293. package/src/errors.ts +43 -0
  294. package/src/home-base/prebuilt/seed.ts +1 -1
  295. package/src/hooks/cli.ts +6 -5
  296. package/src/hooks/config.ts +6 -8
  297. package/src/hooks/discovery.ts +6 -5
  298. package/src/hooks/manager.ts +4 -3
  299. package/src/hooks/runner.ts +2 -2
  300. package/src/hooks/templates.ts +5 -5
  301. package/src/inbound/public-ingress-urls.ts +6 -4
  302. package/src/index.ts +4 -2
  303. package/src/influencer/client.ts +1104 -0
  304. package/src/instrument.ts +4 -3
  305. package/src/logfire.ts +4 -3
  306. package/src/memory/admin.ts +25 -35
  307. package/src/memory/attachments-store.ts +4 -7
  308. package/src/memory/channel-delivery-store.ts +30 -1
  309. package/src/memory/channel-guardian-store.ts +202 -2
  310. package/src/memory/clarification-resolver.ts +37 -33
  311. package/src/memory/conflict-store.ts +67 -61
  312. package/src/memory/contradiction-checker.ts +141 -117
  313. package/src/memory/conversation-store.ts +335 -51
  314. package/src/memory/db-connection.ts +27 -4
  315. package/src/memory/db-init.ts +265 -4
  316. package/src/memory/db.ts +14 -1
  317. package/src/memory/embedding-backend.ts +27 -5
  318. package/src/memory/embedding-ollama.ts +2 -1
  319. package/src/memory/entity-extractor.ts +38 -35
  320. package/src/memory/guardian-action-store.ts +430 -0
  321. package/src/memory/inbox-escalation-projection.ts +59 -0
  322. package/src/memory/inbox-thread-store.ts +218 -0
  323. package/src/memory/ingress-invite-store.ts +338 -0
  324. package/src/memory/ingress-member-store.ts +350 -0
  325. package/src/memory/items-extractor.ts +91 -97
  326. package/src/memory/job-handlers/index-maintenance.ts +3 -3
  327. package/src/memory/job-handlers/media-processing.ts +69 -0
  328. package/src/memory/job-handlers/summarization.ts +32 -26
  329. package/src/memory/job-utils.ts +3 -10
  330. package/src/memory/jobs-store.ts +8 -10
  331. package/src/memory/jobs-worker.ts +55 -36
  332. package/src/memory/media-store.ts +759 -0
  333. package/src/memory/migrations/001-job-deferrals.ts +45 -0
  334. package/src/memory/migrations/002-tool-invocations-fk.ts +43 -0
  335. package/src/memory/migrations/003-memory-fts-backfill.ts +24 -0
  336. package/src/memory/migrations/004-entity-relation-dedup.ts +87 -0
  337. package/src/memory/migrations/005-fingerprint-scope-unique.ts +80 -0
  338. package/src/memory/migrations/006-scope-salted-fingerprints.ts +62 -0
  339. package/src/memory/migrations/007-assistant-id-to-self.ts +254 -0
  340. package/src/memory/migrations/008-remove-assistant-id-columns.ts +208 -0
  341. package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +83 -0
  342. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +56 -0
  343. package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +63 -0
  344. package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +19 -0
  345. package/src/memory/migrations/013-guardian-action-tables.ts +68 -0
  346. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +76 -0
  347. package/src/memory/migrations/015-drop-active-search-index.ts +27 -0
  348. package/src/memory/migrations/016-memory-segments-indexes.ts +11 -0
  349. package/src/memory/migrations/017-memory-items-indexes.ts +10 -0
  350. package/src/memory/migrations/018-remaining-table-indexes.ts +13 -0
  351. package/src/memory/migrations/index.ts +24 -0
  352. package/src/memory/migrations/registry.ts +79 -0
  353. package/src/memory/migrations/validate-migration-state.ts +69 -0
  354. package/src/memory/qdrant-manager.ts +49 -8
  355. package/src/memory/query-builder.ts +1 -1
  356. package/src/memory/raw-query.ts +119 -0
  357. package/src/memory/recall-cache.ts +4 -1
  358. package/src/memory/retriever.ts +165 -47
  359. package/src/memory/schema-migration.ts +25 -984
  360. package/src/memory/schema.ts +228 -7
  361. package/src/memory/search/entity.ts +205 -31
  362. package/src/memory/search/lexical.ts +81 -52
  363. package/src/memory/search/ranking.ts +27 -23
  364. package/src/memory/search/semantic.ts +157 -19
  365. package/src/memory/search/types.ts +24 -0
  366. package/src/memory/shared-app-links-store.ts +4 -5
  367. package/src/memory/validation.ts +19 -0
  368. package/src/messaging/draft-store.ts +5 -6
  369. package/src/messaging/provider-types.ts +2 -0
  370. package/src/messaging/providers/sms/adapter.ts +201 -0
  371. package/src/messaging/providers/sms/client.ts +93 -0
  372. package/src/messaging/providers/sms/types.ts +7 -0
  373. package/src/messaging/providers/telegram-bot/adapter.ts +2 -5
  374. package/src/messaging/providers/whatsapp/adapter.ts +136 -0
  375. package/src/messaging/providers/whatsapp/client.ts +67 -0
  376. package/src/messaging/style-analyzer.ts +5 -4
  377. package/src/messaging/thread-summarizer.ts +61 -69
  378. package/src/messaging/triage-engine.ts +62 -71
  379. package/src/migrations/config-merge.ts +53 -0
  380. package/src/migrations/data-layout.ts +68 -0
  381. package/src/migrations/data-merge.ts +33 -0
  382. package/src/migrations/hooks-merge.ts +90 -0
  383. package/src/migrations/index.ts +6 -0
  384. package/src/migrations/log.ts +23 -0
  385. package/src/migrations/skills-merge.ts +33 -0
  386. package/src/migrations/workspace-layout.ts +79 -0
  387. package/src/permissions/checker.ts +133 -11
  388. package/src/permissions/prompter.ts +14 -0
  389. package/src/permissions/shell-identity.ts +31 -1
  390. package/src/permissions/trust-store.ts +21 -1
  391. package/src/providers/anthropic/client.ts +4 -4
  392. package/src/providers/failover.ts +2 -2
  393. package/src/providers/model-intents.ts +70 -0
  394. package/src/providers/ollama/client.ts +2 -1
  395. package/src/providers/provider-send-message.ts +176 -0
  396. package/src/providers/registry.ts +71 -30
  397. package/src/providers/retry.ts +35 -1
  398. package/src/providers/types.ts +12 -1
  399. package/src/runtime/approval-conversation-turn.ts +97 -0
  400. package/src/runtime/approval-message-composer.ts +253 -0
  401. package/src/runtime/channel-approval-parser.ts +36 -2
  402. package/src/runtime/channel-approvals.ts +11 -24
  403. package/src/runtime/channel-guardian-service.ts +88 -21
  404. package/src/runtime/channel-readiness-service.ts +418 -0
  405. package/src/runtime/channel-readiness-types.ts +35 -0
  406. package/src/runtime/channel-retry-sweep.ts +184 -0
  407. package/src/runtime/guardian-context-resolver.ts +108 -0
  408. package/src/runtime/http-server.ts +275 -717
  409. package/src/runtime/http-types.ts +59 -3
  410. package/src/runtime/middleware/auth.ts +116 -0
  411. package/src/runtime/middleware/error-handler.ts +33 -0
  412. package/src/runtime/middleware/twilio-validation.ts +127 -0
  413. package/src/runtime/routes/app-routes.ts +1 -1
  414. package/src/runtime/routes/call-routes.ts +51 -7
  415. package/src/runtime/routes/channel-delivery-routes.ts +170 -0
  416. package/src/runtime/routes/channel-guardian-routes.ts +1191 -0
  417. package/src/runtime/routes/channel-inbound-routes.ts +1152 -0
  418. package/src/runtime/routes/channel-route-shared.ts +144 -0
  419. package/src/runtime/routes/channel-routes.ts +32 -1588
  420. package/src/runtime/routes/conversation-routes.ts +50 -7
  421. package/src/runtime/routes/events-routes.ts +2 -2
  422. package/src/runtime/routes/identity-routes.ts +126 -0
  423. package/src/runtime/routes/pairing-routes.ts +143 -0
  424. package/src/runtime/routes/run-routes.ts +15 -1
  425. package/src/runtime/run-orchestrator.ts +86 -35
  426. package/src/schedule/schedule-store.ts +36 -32
  427. package/src/schedule/scheduler.ts +3 -3
  428. package/src/security/encrypted-store.ts +5 -7
  429. package/src/security/oauth2.ts +45 -15
  430. package/src/security/parental-control-store.ts +183 -0
  431. package/src/security/secret-allowlist.ts +4 -3
  432. package/src/security/secret-scanner.ts +5 -5
  433. package/src/security/secure-keys.ts +1 -1
  434. package/src/security/token-manager.ts +3 -2
  435. package/src/services/vercel-deploy.ts +6 -2
  436. package/src/skills/tool-manifest.ts +3 -3
  437. package/src/skills/vellum-catalog-remote.ts +75 -16
  438. package/src/slack/slack-webhook.ts +2 -1
  439. package/src/swarm/orchestrator.ts +92 -1
  440. package/src/swarm/router-planner.ts +6 -9
  441. package/src/swarm/worker-prompts.ts +9 -12
  442. package/src/tasks/task-compiler.ts +19 -28
  443. package/src/tasks/task-runner.ts +1 -1
  444. package/src/tools/assets/materialize.ts +2 -2
  445. package/src/tools/assets/search.ts +15 -14
  446. package/src/tools/browser/__tests__/auth-detector.test.ts +1 -0
  447. package/src/tools/browser/auto-navigate.ts +1 -0
  448. package/src/tools/browser/browser-execution.ts +10 -1
  449. package/src/tools/browser/browser-manager.ts +119 -4
  450. package/src/tools/browser/network-recorder.ts +5 -0
  451. package/src/tools/calls/call-start.ts +1 -0
  452. package/src/tools/credentials/broker.ts +11 -2
  453. package/src/tools/credentials/metadata-store.ts +18 -14
  454. package/src/tools/credentials/post-connect-hooks.ts +61 -0
  455. package/src/tools/credentials/vault.ts +49 -23
  456. package/src/tools/execution-target.ts +11 -1
  457. package/src/tools/executor.ts +68 -9
  458. package/src/tools/host-terminal/cli-discover.ts +1 -1
  459. package/src/tools/network/script-proxy/http-forwarder.ts +1 -1
  460. package/src/tools/network/script-proxy/mitm-handler.ts +1 -1
  461. package/src/tools/network/script-proxy/server.ts +1 -1
  462. package/src/tools/network/script-proxy/session-manager.ts +6 -5
  463. package/src/tools/network/web-fetch.ts +18 -2
  464. package/src/tools/network/web-search.ts +8 -4
  465. package/src/tools/reminder/reminder-store.ts +14 -15
  466. package/src/tools/schedule/create.ts +1 -0
  467. package/src/tools/schedule/list.ts +2 -1
  468. package/src/tools/shared/filesystem/file-ops-service.ts +5 -7
  469. package/src/tools/skills/skill-script-runner.ts +24 -9
  470. package/src/tools/skills/skill-tool-factory.ts +1 -0
  471. package/src/tools/tasks/work-item-enqueue.ts +2 -2
  472. package/src/tools/terminal/evaluate-typescript.ts +21 -12
  473. package/src/tools/terminal/parser.ts +50 -0
  474. package/src/tools/types.ts +2 -0
  475. package/src/tools/watcher/delete.ts +6 -0
  476. package/src/tools/weather/service.ts +1 -1
  477. package/src/twitter/client.ts +190 -24
  478. package/src/twitter/router.ts +1 -1
  479. package/src/twitter/session.ts +4 -3
  480. package/src/util/clipboard.ts +1 -1
  481. package/src/util/errors.ts +65 -8
  482. package/src/util/fs.ts +40 -0
  483. package/src/util/json.ts +10 -0
  484. package/src/util/log-redact.ts +189 -0
  485. package/src/util/logger.ts +19 -17
  486. package/src/util/object.ts +3 -0
  487. package/src/util/platform.ts +105 -363
  488. package/src/util/pricing.ts +1 -1
  489. package/src/util/promise-guard.ts +1 -1
  490. package/src/util/retry.ts +19 -0
  491. package/src/util/row-mapper.ts +79 -0
  492. package/src/util/silently.ts +21 -0
  493. package/src/watcher/engine.ts +5 -1
  494. package/src/watcher/provider-types.ts +20 -0
  495. package/src/watcher/providers/github.ts +156 -0
  496. package/src/watcher/providers/gmail.ts +1 -0
  497. package/src/watcher/providers/google-calendar.ts +1 -0
  498. package/src/watcher/providers/linear.ts +460 -0
  499. package/src/watcher/providers/slack.ts +1 -0
  500. package/src/work-items/work-item-runner.ts +1 -1
  501. package/src/workspace/git-service.ts +1 -1
  502. package/src/workspace/provider-commit-message-generator.ts +51 -22
  503. package/src/__tests__/call-bridge.test.ts +0 -517
  504. package/src/__tests__/session-process-bridge.test.ts +0 -244
  505. package/src/calls/call-bridge.ts +0 -168
  506. package/src/config/vellum-skills/google-oauth-setup/SKILL.md +0 -199
@@ -0,0 +1,309 @@
1
+ import { z } from 'zod';
2
+
3
+ const VALID_SECRET_ACTIONS = ['redact', 'warn', 'block', 'prompt'] as const;
4
+ const VALID_PERMISSIONS_MODES = ['legacy', 'strict', 'workspace'] as const;
5
+ const VALID_SMS_PROVIDERS = ['twilio'] as const;
6
+
7
+ export const TimeoutConfigSchema = z.object({
8
+ shellMaxTimeoutSec: z
9
+ .number({ error: 'timeouts.shellMaxTimeoutSec must be a number' })
10
+ .finite('timeouts.shellMaxTimeoutSec must be finite')
11
+ .positive('timeouts.shellMaxTimeoutSec must be a positive number')
12
+ .default(600),
13
+ shellDefaultTimeoutSec: z
14
+ .number({ error: 'timeouts.shellDefaultTimeoutSec must be a number' })
15
+ .finite('timeouts.shellDefaultTimeoutSec must be finite')
16
+ .positive('timeouts.shellDefaultTimeoutSec must be a positive number')
17
+ .default(120),
18
+ permissionTimeoutSec: z
19
+ .number({ error: 'timeouts.permissionTimeoutSec must be a number' })
20
+ .finite('timeouts.permissionTimeoutSec must be finite')
21
+ .positive('timeouts.permissionTimeoutSec must be a positive number')
22
+ .default(300),
23
+ toolExecutionTimeoutSec: z
24
+ .number({ error: 'timeouts.toolExecutionTimeoutSec must be a number' })
25
+ .finite('timeouts.toolExecutionTimeoutSec must be finite')
26
+ .positive('timeouts.toolExecutionTimeoutSec must be a positive number')
27
+ .default(120),
28
+ providerStreamTimeoutSec: z
29
+ .number({ error: 'timeouts.providerStreamTimeoutSec must be a number' })
30
+ .finite('timeouts.providerStreamTimeoutSec must be finite')
31
+ .positive('timeouts.providerStreamTimeoutSec must be a positive number')
32
+ .default(300),
33
+ });
34
+
35
+ export const RateLimitConfigSchema = z.object({
36
+ maxRequestsPerMinute: z
37
+ .number({ error: 'rateLimit.maxRequestsPerMinute must be a number' })
38
+ .int('rateLimit.maxRequestsPerMinute must be an integer')
39
+ .nonnegative('rateLimit.maxRequestsPerMinute must be a non-negative integer')
40
+ .default(0),
41
+ maxTokensPerSession: z
42
+ .number({ error: 'rateLimit.maxTokensPerSession must be a number' })
43
+ .int('rateLimit.maxTokensPerSession must be an integer')
44
+ .nonnegative('rateLimit.maxTokensPerSession must be a non-negative integer')
45
+ .default(0),
46
+ });
47
+
48
+ export const SecretDetectionConfigSchema = z.object({
49
+ enabled: z
50
+ .boolean({ error: 'secretDetection.enabled must be a boolean' })
51
+ .default(true),
52
+ action: z
53
+ .enum(VALID_SECRET_ACTIONS, {
54
+ error: `secretDetection.action must be one of: ${VALID_SECRET_ACTIONS.join(', ')}`,
55
+ })
56
+ .default('redact'),
57
+ entropyThreshold: z
58
+ .number({ error: 'secretDetection.entropyThreshold must be a number' })
59
+ .finite('secretDetection.entropyThreshold must be finite')
60
+ .positive('secretDetection.entropyThreshold must be a positive number')
61
+ .default(4.0),
62
+ allowOneTimeSend: z
63
+ .boolean({ error: 'secretDetection.allowOneTimeSend must be a boolean' })
64
+ .default(false),
65
+ blockIngress: z
66
+ .boolean({ error: 'secretDetection.blockIngress must be a boolean' })
67
+ .default(true),
68
+ });
69
+
70
+ export const PermissionsConfigSchema = z.object({
71
+ mode: z
72
+ .enum(VALID_PERMISSIONS_MODES, {
73
+ error: `permissions.mode must be one of: ${VALID_PERMISSIONS_MODES.join(', ')}`,
74
+ })
75
+ .default('workspace'),
76
+ });
77
+
78
+ export const AuditLogConfigSchema = z.object({
79
+ retentionDays: z
80
+ .number({ error: 'auditLog.retentionDays must be a number' })
81
+ .int('auditLog.retentionDays must be an integer')
82
+ .nonnegative('auditLog.retentionDays must be a non-negative integer')
83
+ .default(0),
84
+ });
85
+
86
+ export const LogFileConfigSchema = z.object({
87
+ dir: z
88
+ .string({ error: 'logFile.dir must be a string' })
89
+ .optional(),
90
+ retentionDays: z
91
+ .number({ error: 'logFile.retentionDays must be a number' })
92
+ .int('logFile.retentionDays must be an integer')
93
+ .positive('logFile.retentionDays must be a positive integer')
94
+ .default(30),
95
+ });
96
+
97
+ export const ThinkingConfigSchema = z.object({
98
+ enabled: z
99
+ .boolean({ error: 'thinking.enabled must be a boolean' })
100
+ .default(false),
101
+ budgetTokens: z
102
+ .number({ error: 'thinking.budgetTokens must be a number' })
103
+ .int('thinking.budgetTokens must be an integer')
104
+ .positive('thinking.budgetTokens must be a positive integer')
105
+ .default(10000),
106
+ streamThinking: z
107
+ .boolean({ error: 'thinking.streamThinking must be a boolean' })
108
+ .default(false),
109
+ });
110
+
111
+ export const ContextWindowConfigSchema = z.object({
112
+ enabled: z
113
+ .boolean({ error: 'contextWindow.enabled must be a boolean' })
114
+ .default(true),
115
+ maxInputTokens: z
116
+ .number({ error: 'contextWindow.maxInputTokens must be a number' })
117
+ .int('contextWindow.maxInputTokens must be an integer')
118
+ .positive('contextWindow.maxInputTokens must be a positive integer')
119
+ .default(180000),
120
+ targetInputTokens: z
121
+ .number({ error: 'contextWindow.targetInputTokens must be a number' })
122
+ .int('contextWindow.targetInputTokens must be an integer')
123
+ .positive('contextWindow.targetInputTokens must be a positive integer')
124
+ .default(110000),
125
+ compactThreshold: z
126
+ .number({ error: 'contextWindow.compactThreshold must be a number' })
127
+ .finite('contextWindow.compactThreshold must be finite')
128
+ .gt(0, 'contextWindow.compactThreshold must be greater than 0')
129
+ .lte(1, 'contextWindow.compactThreshold must be less than or equal to 1')
130
+ .default(0.8),
131
+ preserveRecentUserTurns: z
132
+ .number({ error: 'contextWindow.preserveRecentUserTurns must be a number' })
133
+ .int('contextWindow.preserveRecentUserTurns must be an integer')
134
+ .positive('contextWindow.preserveRecentUserTurns must be a positive integer')
135
+ .default(8),
136
+ summaryMaxTokens: z
137
+ .number({ error: 'contextWindow.summaryMaxTokens must be a number' })
138
+ .int('contextWindow.summaryMaxTokens must be an integer')
139
+ .positive('contextWindow.summaryMaxTokens must be a positive integer')
140
+ .default(1200),
141
+ chunkTokens: z
142
+ .number({ error: 'contextWindow.chunkTokens must be a number' })
143
+ .int('contextWindow.chunkTokens must be an integer')
144
+ .positive('contextWindow.chunkTokens must be a positive integer')
145
+ .default(12000),
146
+ });
147
+
148
+ export const ModelPricingOverrideSchema = z.object({
149
+ provider: z.string({ error: 'pricingOverrides[].provider must be a string' }),
150
+ modelPattern: z.string({ error: 'pricingOverrides[].modelPattern must be a string' }),
151
+ inputPer1M: z
152
+ .number({ error: 'pricingOverrides[].inputPer1M must be a number' })
153
+ .nonnegative('pricingOverrides[].inputPer1M must be a non-negative number'),
154
+ outputPer1M: z
155
+ .number({ error: 'pricingOverrides[].outputPer1M must be a number' })
156
+ .nonnegative('pricingOverrides[].outputPer1M must be a non-negative number'),
157
+ });
158
+
159
+ export const SmsConfigSchema = z.object({
160
+ enabled: z
161
+ .boolean({ error: 'sms.enabled must be a boolean' })
162
+ .default(false),
163
+ provider: z
164
+ .enum(VALID_SMS_PROVIDERS, {
165
+ error: `sms.provider must be one of: ${VALID_SMS_PROVIDERS.join(', ')}`,
166
+ })
167
+ .default('twilio'),
168
+ phoneNumber: z
169
+ .string({ error: 'sms.phoneNumber must be a string' })
170
+ .default(''),
171
+ assistantPhoneNumbers: z
172
+ .record(z.string(), z.string({ error: 'sms.assistantPhoneNumbers values must be strings' }))
173
+ .optional(),
174
+ });
175
+
176
+ export const IngressWebhookConfigSchema = z.object({
177
+ secret: z
178
+ .string({ error: 'ingress.webhook.secret must be a string' })
179
+ .default(''),
180
+ timeoutMs: z
181
+ .number({ error: 'ingress.webhook.timeoutMs must be a number' })
182
+ .int('ingress.webhook.timeoutMs must be an integer')
183
+ .positive('ingress.webhook.timeoutMs must be a positive integer')
184
+ .default(30_000),
185
+ maxRetries: z
186
+ .number({ error: 'ingress.webhook.maxRetries must be a number' })
187
+ .int('ingress.webhook.maxRetries must be an integer')
188
+ .nonnegative('ingress.webhook.maxRetries must be a non-negative integer')
189
+ .default(2),
190
+ initialBackoffMs: z
191
+ .number({ error: 'ingress.webhook.initialBackoffMs must be a number' })
192
+ .int('ingress.webhook.initialBackoffMs must be an integer')
193
+ .positive('ingress.webhook.initialBackoffMs must be a positive integer')
194
+ .default(500),
195
+ maxPayloadBytes: z
196
+ .number({ error: 'ingress.webhook.maxPayloadBytes must be a number' })
197
+ .int('ingress.webhook.maxPayloadBytes must be an integer')
198
+ .positive('ingress.webhook.maxPayloadBytes must be a positive integer')
199
+ .default(1_048_576),
200
+ });
201
+
202
+ export const IngressRateLimitConfigSchema = z.object({
203
+ maxRequestsPerMinute: z
204
+ .number({ error: 'ingress.rateLimit.maxRequestsPerMinute must be a number' })
205
+ .int('ingress.rateLimit.maxRequestsPerMinute must be an integer')
206
+ .nonnegative('ingress.rateLimit.maxRequestsPerMinute must be a non-negative integer')
207
+ .default(0),
208
+ maxRequestsPerHour: z
209
+ .number({ error: 'ingress.rateLimit.maxRequestsPerHour must be a number' })
210
+ .int('ingress.rateLimit.maxRequestsPerHour must be an integer')
211
+ .nonnegative('ingress.rateLimit.maxRequestsPerHour must be a non-negative integer')
212
+ .default(0),
213
+ });
214
+
215
+ const IngressBaseSchema = z.object({
216
+ enabled: z
217
+ .boolean({ error: 'ingress.enabled must be a boolean' })
218
+ .optional(),
219
+ publicBaseUrl: z
220
+ .string({ error: 'ingress.publicBaseUrl must be a string' })
221
+ .refine(
222
+ (val) => val === '' || /^https?:\/\//i.test(val),
223
+ 'ingress.publicBaseUrl must be an absolute URL starting with http:// or https://',
224
+ )
225
+ .default(''),
226
+ webhook: IngressWebhookConfigSchema.default({
227
+ secret: '',
228
+ timeoutMs: 30_000,
229
+ maxRetries: 2,
230
+ initialBackoffMs: 500,
231
+ maxPayloadBytes: 1_048_576,
232
+ }),
233
+ rateLimit: IngressRateLimitConfigSchema.default({
234
+ maxRequestsPerMinute: 0,
235
+ maxRequestsPerHour: 0,
236
+ }),
237
+ shutdownDrainMs: z
238
+ .number({ error: 'ingress.shutdownDrainMs must be a number' })
239
+ .int('ingress.shutdownDrainMs must be an integer')
240
+ .nonnegative('ingress.shutdownDrainMs must be a non-negative integer')
241
+ .default(5_000),
242
+ });
243
+
244
+ export const IngressConfigSchema = IngressBaseSchema
245
+ .default({
246
+ publicBaseUrl: '',
247
+ webhook: {
248
+ secret: '',
249
+ timeoutMs: 30_000,
250
+ maxRetries: 2,
251
+ initialBackoffMs: 500,
252
+ maxPayloadBytes: 1_048_576,
253
+ },
254
+ rateLimit: {
255
+ maxRequestsPerMinute: 0,
256
+ maxRequestsPerHour: 0,
257
+ },
258
+ shutdownDrainMs: 5_000,
259
+ })
260
+ .transform((val) => ({
261
+ ...val,
262
+ // Backward compatibility: if `enabled` was never explicitly set (undefined),
263
+ // infer it from whether a publicBaseUrl is configured. Existing users who
264
+ // have a URL but predate the `enabled` field should not have their webhooks
265
+ // silently disabled on upgrade.
266
+ //
267
+ // When publicBaseUrl is empty and enabled is unset, leave enabled as
268
+ // undefined so getPublicBaseUrl() can still fall through to the
269
+ // INGRESS_PUBLIC_BASE_URL env-var fallback (env-only setups).
270
+ enabled: val.enabled ?? (val.publicBaseUrl ? true : undefined),
271
+ }));
272
+
273
+ export const DaemonConfigSchema = z.object({
274
+ startupSocketWaitMs: z
275
+ .number({ error: 'daemon.startupSocketWaitMs must be a number' })
276
+ .int('daemon.startupSocketWaitMs must be an integer')
277
+ .positive('daemon.startupSocketWaitMs must be a positive integer')
278
+ .default(5000),
279
+ stopTimeoutMs: z
280
+ .number({ error: 'daemon.stopTimeoutMs must be a number' })
281
+ .int('daemon.stopTimeoutMs must be an integer')
282
+ .positive('daemon.stopTimeoutMs must be a positive integer')
283
+ .default(5000),
284
+ sigkillGracePeriodMs: z
285
+ .number({ error: 'daemon.sigkillGracePeriodMs must be a number' })
286
+ .int('daemon.sigkillGracePeriodMs must be an integer')
287
+ .positive('daemon.sigkillGracePeriodMs must be a positive integer')
288
+ .default(2000),
289
+ titleGenerationMaxTokens: z
290
+ .number({ error: 'daemon.titleGenerationMaxTokens must be a number' })
291
+ .int('daemon.titleGenerationMaxTokens must be an integer')
292
+ .positive('daemon.titleGenerationMaxTokens must be a positive integer')
293
+ .default(30),
294
+ });
295
+
296
+ export type TimeoutConfig = z.infer<typeof TimeoutConfigSchema>;
297
+ export type RateLimitConfig = z.infer<typeof RateLimitConfigSchema>;
298
+ export type SecretDetectionConfig = z.infer<typeof SecretDetectionConfigSchema>;
299
+ export type PermissionsConfig = z.infer<typeof PermissionsConfigSchema>;
300
+ export type AuditLogConfig = z.infer<typeof AuditLogConfigSchema>;
301
+ export type LogFileConfig = z.infer<typeof LogFileConfigSchema>;
302
+ export type ThinkingConfig = z.infer<typeof ThinkingConfigSchema>;
303
+ export type ContextWindowConfig = z.infer<typeof ContextWindowConfigSchema>;
304
+ export type ModelPricingOverride = z.infer<typeof ModelPricingOverrideSchema>;
305
+ export type SmsConfig = z.infer<typeof SmsConfigSchema>;
306
+ export type IngressWebhookConfig = z.infer<typeof IngressWebhookConfigSchema>;
307
+ export type IngressRateLimitConfig = z.infer<typeof IngressRateLimitConfigSchema>;
308
+ export type DaemonConfig = z.infer<typeof DaemonConfigSchema>;
309
+ export type IngressConfig = z.infer<typeof IngressConfigSchema>;
@@ -8,14 +8,15 @@ export const DEFAULT_CONFIG: AssistantConfig = {
8
8
  apiKeys: {},
9
9
  webSearchProvider: 'perplexity',
10
10
  providerOrder: [],
11
- maxTokens: 64000,
11
+ maxTokens: 16000,
12
12
  thinking: {
13
13
  enabled: false,
14
14
  budgetTokens: 10000,
15
+ streamThinking: false,
15
16
  },
16
17
  contextWindow: {
17
18
  enabled: true,
18
- maxInputTokens: 180000,
19
+ maxInputTokens: 200000,
19
20
  targetInputTokens: 110000,
20
21
  compactThreshold: 0.8,
21
22
  preserveRecentUserTurns: 8,
@@ -110,6 +111,7 @@ export const DEFAULT_CONFIG: AssistantConfig = {
110
111
  maxEdges: 40,
111
112
  neighborScoreMultiplier: 0.7,
112
113
  maxDepth: 3,
114
+ depthDecay: true,
113
115
  },
114
116
  },
115
117
  conflicts: {
@@ -224,7 +226,7 @@ export const DEFAULT_CONFIG: AssistantConfig = {
224
226
  userConsultTimeoutSeconds: 120,
225
227
  disclosure: {
226
228
  enabled: true,
227
- text: 'At the very beginning of the call, introduce yourself as an assistant calling on behalf of the user.',
229
+ text: 'At the very beginning of the call, introduce yourself as an assistant calling on behalf of the person you represent. Do not say "AI assistant".',
228
230
  },
229
231
  safety: {
230
232
  denyCategories: [],
@@ -250,6 +252,11 @@ export const DEFAULT_CONFIG: AssistantConfig = {
250
252
  callerIdentity: {
251
253
  allowPerCallOverride: true,
252
254
  },
255
+ verification: {
256
+ enabled: false,
257
+ maxAttempts: 3,
258
+ codeLength: 6,
259
+ },
253
260
  },
254
261
  sms: {
255
262
  enabled: false,
@@ -259,5 +266,23 @@ export const DEFAULT_CONFIG: AssistantConfig = {
259
266
  ingress: {
260
267
  enabled: undefined,
261
268
  publicBaseUrl: '',
269
+ webhook: {
270
+ secret: '',
271
+ timeoutMs: 30_000,
272
+ maxRetries: 2,
273
+ initialBackoffMs: 500,
274
+ maxPayloadBytes: 1_048_576,
275
+ },
276
+ rateLimit: {
277
+ maxRequestsPerMinute: 0,
278
+ maxRequestsPerHour: 0,
279
+ },
280
+ shutdownDrainMs: 5_000,
281
+ },
282
+ daemon: {
283
+ startupSocketWaitMs: 5000,
284
+ stopTimeoutMs: 5000,
285
+ sigkillGracePeriodMs: 2000,
286
+ titleGenerationMaxTokens: 30,
262
287
  },
263
288
  };
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Centralized environment variable registry.
3
+ *
4
+ * This module documents every VELLUM_* and related env var with its type,
5
+ * default, and description, and exports typed accessor functions for each.
6
+ *
7
+ * IMPORTANT: This module has NO internal imports (no logger, no platform
8
+ * utilities) so it can be safely imported from bootstrap-level code like
9
+ * util/platform.ts and util/logger.ts without circular dependencies.
10
+ *
11
+ * Higher-level env vars that depend on the logger or config system live in
12
+ * config/env.ts, which re-exports selected accessors from this module.
13
+ */
14
+
15
+ // ── Helpers (dependency-free) ────────────────────────────────────────────────
16
+
17
+ function str(name: string): string | undefined {
18
+ const v = process.env[name]?.trim();
19
+ return v || undefined;
20
+ }
21
+
22
+ function flag(name: string): boolean {
23
+ const raw = str(name);
24
+ return raw === 'true' || raw === '1';
25
+ }
26
+
27
+ function flagTriState(name: string): boolean | undefined {
28
+ const raw = str(name);
29
+ if (raw === 'true' || raw === '1') return true;
30
+ if (raw === 'false' || raw === '0') return false;
31
+ return undefined;
32
+ }
33
+
34
+ // ── Registry ─────────────────────────────────────────────────────────────────
35
+ // Each entry documents the env var name, type, default, and purpose.
36
+
37
+ /**
38
+ * BASE_DATA_DIR — string, default: os.homedir()
39
+ * Overrides the home directory used as the base for ~/.vellum and lockfiles.
40
+ * Primarily used in tests to isolate filesystem state.
41
+ */
42
+ export function getBaseDataDir(): string | undefined {
43
+ return str('BASE_DATA_DIR');
44
+ }
45
+
46
+ /**
47
+ * VELLUM_DAEMON_SOCKET — string, default: ~/.vellum/vellum.sock
48
+ * Overrides the Unix domain socket path for daemon IPC.
49
+ * Supports ~ expansion.
50
+ */
51
+ export function getDaemonSocket(): string | undefined {
52
+ return str('VELLUM_DAEMON_SOCKET');
53
+ }
54
+
55
+ /**
56
+ * VELLUM_DAEMON_TCP_PORT — number, default: 8765
57
+ * TCP port for the daemon's TCP listener (used by iOS clients).
58
+ */
59
+ export function getDaemonTcpPort(): number {
60
+ const raw = str('VELLUM_DAEMON_TCP_PORT');
61
+ if (raw) {
62
+ const port = parseInt(raw, 10);
63
+ if (!isNaN(port) && port > 0 && port <= 65535) return port;
64
+ }
65
+ return 8765;
66
+ }
67
+
68
+ /**
69
+ * VELLUM_DAEMON_TCP_ENABLED — boolean tri-state, default: undefined (falls back to flag file)
70
+ * Whether the daemon TCP listener should be active.
71
+ * 'true'/'1' → on, 'false'/'0' → off, unset → check flag file.
72
+ */
73
+ export function getDaemonTcpEnabled(): boolean | undefined {
74
+ return flagTriState('VELLUM_DAEMON_TCP_ENABLED');
75
+ }
76
+
77
+ /**
78
+ * VELLUM_DAEMON_TCP_HOST — string, default: context-dependent (127.0.0.1 or 0.0.0.0)
79
+ * Hostname/address for the TCP listener. When unset, platform.ts resolves
80
+ * based on whether iOS pairing is enabled.
81
+ */
82
+ export function getDaemonTcpHost(): string | undefined {
83
+ return str('VELLUM_DAEMON_TCP_HOST');
84
+ }
85
+
86
+ /**
87
+ * VELLUM_DAEMON_IOS_PAIRING — boolean tri-state, default: undefined (falls back to flag file)
88
+ * Whether iOS pairing mode is enabled. When on, TCP binds to 0.0.0.0.
89
+ * 'true'/'1' → on, 'false'/'0' → off, unset → check flag file.
90
+ */
91
+ export function getDaemonIosPairing(): boolean | undefined {
92
+ return flagTriState('VELLUM_DAEMON_IOS_PAIRING');
93
+ }
94
+
95
+ /**
96
+ * VELLUM_DEBUG — boolean, default: false
97
+ * Enables debug-level logging and verbose output.
98
+ */
99
+ export function getDebugMode(): boolean {
100
+ return flag('VELLUM_DEBUG');
101
+ }
102
+
103
+ /**
104
+ * VELLUM_LOG_STDERR — boolean, default: false
105
+ * Forces logger output to stderr instead of log files.
106
+ */
107
+ export function getLogStderr(): boolean {
108
+ return flag('VELLUM_LOG_STDERR');
109
+ }
110
+
111
+ /**
112
+ * DEBUG_STDOUT_LOGS — boolean, default: false
113
+ * Enables additional log output to stdout (alongside file logging).
114
+ */
115
+ export function getDebugStdoutLogs(): boolean {
116
+ return flag('DEBUG_STDOUT_LOGS');
117
+ }
118
+
119
+ /**
120
+ * VELLUM_ENABLE_MONITORING — boolean, default: false
121
+ * Enables monitoring/telemetry (Logfire, etc.).
122
+ */
123
+ export function getEnableMonitoring(): boolean {
124
+ return flag('VELLUM_ENABLE_MONITORING');
125
+ }
126
+
127
+ // ── Known env var names ──────────────────────────────────────────────────────
128
+
129
+ /**
130
+ * Complete set of recognized VELLUM_* env var names. Used by validateEnvVars()
131
+ * to warn about typos or unrecognized variables.
132
+ */
133
+ const KNOWN_VELLUM_VARS = new Set([
134
+ 'VELLUM_DAEMON_SOCKET',
135
+ 'VELLUM_DAEMON_TCP_PORT',
136
+ 'VELLUM_DAEMON_TCP_ENABLED',
137
+ 'VELLUM_DAEMON_TCP_HOST',
138
+ 'VELLUM_DAEMON_IOS_PAIRING',
139
+ 'VELLUM_DEBUG',
140
+ 'VELLUM_LOG_STDERR',
141
+ 'VELLUM_ENABLE_MONITORING',
142
+ 'VELLUM_HOOK_EVENT',
143
+ 'VELLUM_HOOK_NAME',
144
+ ]);
145
+
146
+ /**
147
+ * Check all VELLUM_* env vars and return warnings for any unrecognized ones.
148
+ * Returns an array of warning messages (empty if all vars are recognized).
149
+ *
150
+ * This is intentionally a pure function that returns strings rather than
151
+ * logging directly, so it can be called from bootstrap code before the
152
+ * logger is initialized.
153
+ */
154
+ export function checkUnrecognizedEnvVars(): string[] {
155
+ const warnings: string[] = [];
156
+ for (const key of Object.keys(process.env)) {
157
+ if (key.startsWith('VELLUM_') && !KNOWN_VELLUM_VARS.has(key)) {
158
+ warnings.push(`Unrecognized environment variable: ${key}`);
159
+ }
160
+ }
161
+ return warnings;
162
+ }