@vellumai/assistant 0.3.5 → 0.3.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 (487) hide show
  1. package/README.md +51 -0
  2. package/eslint.config.mjs +31 -0
  3. package/package.json +1 -1
  4. package/scripts/ipc/check-swift-decoder-drift.ts +4 -1
  5. package/scripts/ipc/generate-swift.ts +18 -2
  6. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +338 -1
  7. package/src/__tests__/approval-conversation-turn.test.ts +214 -0
  8. package/src/__tests__/browser-manager.test.ts +1 -0
  9. package/src/__tests__/call-conversation-messages.test.ts +130 -0
  10. package/src/__tests__/call-orchestrator.test.ts +752 -271
  11. package/src/__tests__/call-pointer-messages.test.ts +148 -0
  12. package/src/__tests__/call-recovery.test.ts +3 -0
  13. package/src/__tests__/call-routes-http.test.ts +5 -0
  14. package/src/__tests__/call-store.test.ts +3 -0
  15. package/src/__tests__/channel-approval-routes.test.ts +1260 -85
  16. package/src/__tests__/channel-approval.test.ts +37 -0
  17. package/src/__tests__/channel-approvals.test.ts +4 -65
  18. package/src/__tests__/channel-guardian.test.ts +556 -0
  19. package/src/__tests__/channel-readiness-service.test.ts +74 -7
  20. package/src/__tests__/checker.test.ts +14 -7
  21. package/src/__tests__/clarification-resolver.test.ts +44 -24
  22. package/src/__tests__/commit-message-enrichment-service.test.ts +9 -4
  23. package/src/__tests__/computer-use-session-working-dir.test.ts +8 -0
  24. package/src/__tests__/config-schema.test.ts +12 -7
  25. package/src/__tests__/context-window-manager.test.ts +30 -2
  26. package/src/__tests__/contradiction-checker.test.ts +20 -5
  27. package/src/__tests__/credential-security-invariants.test.ts +6 -2
  28. package/src/__tests__/db-migration-rollback.test.ts +752 -0
  29. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -0
  30. package/src/__tests__/fuzzy-match-property.test.ts +5 -5
  31. package/src/__tests__/guardian-action-store.test.ts +123 -0
  32. package/src/__tests__/guardian-action-sweep.test.ts +277 -0
  33. package/src/__tests__/guardian-dispatch.test.ts +389 -0
  34. package/src/__tests__/guardian-question-copy.test.ts +47 -0
  35. package/src/__tests__/handlers-telegram-config.test.ts +4 -2
  36. package/src/__tests__/handlers-twilio-config.test.ts +126 -0
  37. package/src/__tests__/intent-routing.test.ts +2 -0
  38. package/src/__tests__/ipc-snapshot.test.ts +228 -1
  39. package/src/__tests__/memory-upsert-concurrency.test.ts +828 -0
  40. package/src/__tests__/model-intents.test.ts +96 -0
  41. package/src/__tests__/no-direct-anthropic-sdk-imports.test.ts +42 -0
  42. package/src/__tests__/oauth2-gateway-transport.test.ts +130 -0
  43. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -0
  44. package/src/__tests__/provider-commit-message-generator.test.ts +89 -13
  45. package/src/__tests__/provider-error-scenarios.test.ts +621 -0
  46. package/src/__tests__/provider-fail-open-selection.test.ts +119 -0
  47. package/src/__tests__/qdrant-manager.test.ts +27 -20
  48. package/src/__tests__/relay-server.test.ts +779 -40
  49. package/src/__tests__/run-orchestrator-assistant-events.test.ts +2 -0
  50. package/src/__tests__/run-orchestrator.test.ts +20 -4
  51. package/src/__tests__/runtime-runs-http.test.ts +17 -1
  52. package/src/__tests__/runtime-runs.test.ts +16 -0
  53. package/src/__tests__/schedule-store.test.ts +18 -4
  54. package/src/__tests__/scheduler-recurrence.test.ts +13 -4
  55. package/src/__tests__/session-abort-tool-results.test.ts +6 -0
  56. package/src/__tests__/session-agent-loop.test.ts +857 -0
  57. package/src/__tests__/session-conflict-gate.test.ts +6 -0
  58. package/src/__tests__/session-pre-run-repair.test.ts +6 -0
  59. package/src/__tests__/session-profile-injection.test.ts +6 -0
  60. package/src/__tests__/session-provider-retry-repair.test.ts +6 -0
  61. package/src/__tests__/session-queue.test.ts +6 -0
  62. package/src/__tests__/session-runtime-assembly.test.ts +237 -13
  63. package/src/__tests__/session-slash-known.test.ts +6 -0
  64. package/src/__tests__/session-slash-queue.test.ts +6 -0
  65. package/src/__tests__/session-slash-unknown.test.ts +6 -0
  66. package/src/__tests__/session-surfaces-task-progress.test.ts +2 -0
  67. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -0
  68. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -0
  69. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -0
  70. package/src/__tests__/session-workspace-injection.test.ts +6 -0
  71. package/src/__tests__/session-workspace-tool-tracking.test.ts +6 -0
  72. package/src/__tests__/skills.test.ts +2 -0
  73. package/src/__tests__/sms-messaging-provider.test.ts +2 -1
  74. package/src/__tests__/starter-task-flow.test.ts +2 -0
  75. package/src/__tests__/swarm-dag-pathological.test.ts +535 -0
  76. package/src/__tests__/system-prompt.test.ts +2 -0
  77. package/src/__tests__/task-management-tools.test.ts +2 -2
  78. package/src/__tests__/task-runner.test.ts +14 -4
  79. package/src/__tests__/terminal-tools.test.ts +25 -19
  80. package/src/__tests__/tool-execution-abort-cleanup.test.ts +545 -0
  81. package/src/__tests__/tool-executor-shell-integration.test.ts +11 -11
  82. package/src/__tests__/tool-executor.test.ts +23 -24
  83. package/src/__tests__/trust-store.test.ts +3 -3
  84. package/src/__tests__/twilio-rest.test.ts +29 -0
  85. package/src/__tests__/twilio-routes-elevenlabs.test.ts +3 -0
  86. package/src/__tests__/twilio-routes-twiml.test.ts +11 -0
  87. package/src/__tests__/twilio-routes.test.ts +141 -21
  88. package/src/__tests__/user-reference.test.ts +2 -0
  89. package/src/__tests__/voice-quality.test.ts +222 -0
  90. package/src/__tests__/web-search.test.ts +45 -29
  91. package/src/agent/loop.ts +1 -1
  92. package/src/agent-heartbeat/agent-heartbeat-service.ts +2 -10
  93. package/src/amazon/client.ts +1418 -0
  94. package/src/amazon/request-extractor.ts +135 -0
  95. package/src/amazon/session.ts +109 -0
  96. package/src/autonomy/autonomy-store.ts +5 -5
  97. package/src/browser-extension-relay/client.ts +124 -0
  98. package/src/browser-extension-relay/protocol.ts +63 -0
  99. package/src/browser-extension-relay/server.ts +177 -0
  100. package/src/bundler/app-bundler.ts +3 -3
  101. package/src/bundler/bundle-signer.ts +1 -1
  102. package/src/bundler/signature-verifier.ts +1 -1
  103. package/src/calls/call-conversation-messages.ts +33 -0
  104. package/src/calls/call-domain.ts +106 -5
  105. package/src/calls/call-orchestrator.ts +252 -54
  106. package/src/calls/call-pointer-messages.ts +53 -0
  107. package/src/calls/call-recovery.ts +3 -8
  108. package/src/calls/call-store.ts +69 -87
  109. package/src/calls/elevenlabs-config.ts +3 -2
  110. package/src/calls/guardian-action-sweep.ts +105 -0
  111. package/src/calls/guardian-dispatch.ts +203 -0
  112. package/src/calls/guardian-question-copy.ts +133 -0
  113. package/src/calls/relay-server.ts +466 -8
  114. package/src/calls/speaker-identification.ts +1 -1
  115. package/src/calls/twilio-config.ts +7 -5
  116. package/src/calls/twilio-provider.ts +6 -4
  117. package/src/calls/twilio-rest.ts +40 -15
  118. package/src/calls/twilio-routes.ts +60 -45
  119. package/src/calls/types.ts +3 -1
  120. package/src/channels/types.ts +25 -0
  121. package/src/cli/amazon.ts +815 -0
  122. package/src/cli/config-commands.ts +2 -2
  123. package/src/cli/core-commands.ts +4 -3
  124. package/src/cli/influencer.ts +244 -0
  125. package/src/cli/map.ts +89 -6
  126. package/src/cli.ts +1 -1
  127. package/src/config/agent-schema.ts +171 -0
  128. package/src/config/bundled-skills/amazon/SKILL.md +127 -0
  129. package/src/config/bundled-skills/amazon/icon.svg +13 -0
  130. package/src/config/bundled-skills/api-mapping/SKILL.md +78 -0
  131. package/src/config/bundled-skills/browser/SKILL.md +1 -0
  132. package/src/config/bundled-skills/browser/TOOLS.json +17 -0
  133. package/src/config/bundled-skills/browser/tools/browser-wait-for-download.ts +25 -0
  134. package/src/config/bundled-skills/doordash/SKILL.md +51 -51
  135. package/src/config/bundled-skills/email-setup/SKILL.md +14 -5
  136. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +183 -0
  137. package/src/config/bundled-skills/influencer/SKILL.md +144 -0
  138. package/src/config/bundled-skills/macos-automation/icon.svg +12 -0
  139. package/src/config/bundled-skills/media-processing/SKILL.md +72 -95
  140. package/src/config/bundled-skills/media-processing/TOOLS.json +57 -147
  141. package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +77 -0
  142. package/src/config/bundled-skills/media-processing/__tests__/cost-tracker.test.ts +69 -0
  143. package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +303 -0
  144. package/src/config/bundled-skills/media-processing/services/concurrency-pool.ts +55 -0
  145. package/src/config/bundled-skills/media-processing/services/cost-tracker.ts +86 -0
  146. package/src/config/bundled-skills/media-processing/services/gemini-map.ts +339 -0
  147. package/src/config/bundled-skills/media-processing/services/preprocess.ts +551 -0
  148. package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +7 -9
  149. package/src/config/bundled-skills/media-processing/services/reduce.ts +197 -0
  150. package/src/config/bundled-skills/media-processing/tools/analyze-keyframes.ts +88 -253
  151. package/src/config/bundled-skills/media-processing/tools/extract-keyframes.ts +22 -153
  152. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
  153. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +28 -51
  154. package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +35 -270
  155. package/src/config/bundled-skills/messaging/SKILL.md +12 -2
  156. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -7
  157. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +2 -1
  158. package/src/config/bundled-skills/phone-calls/SKILL.md +86 -21
  159. package/src/config/bundled-skills/twitter/icon.svg +14 -0
  160. package/src/config/bundled-tool-registry.ts +310 -0
  161. package/src/config/calls-schema.ts +181 -0
  162. package/src/config/core-schema.ts +309 -0
  163. package/src/config/defaults.ts +27 -3
  164. package/src/config/env-registry.ts +169 -0
  165. package/src/config/env.ts +175 -0
  166. package/src/config/loader.ts +6 -6
  167. package/src/config/memory-schema.ts +528 -0
  168. package/src/config/sandbox-schema.ts +55 -0
  169. package/src/config/schema.ts +157 -1138
  170. package/src/config/skill-state.ts +1 -1
  171. package/src/config/skills-schema.ts +32 -0
  172. package/src/config/skills.ts +35 -24
  173. package/src/config/system-prompt.ts +107 -56
  174. package/src/config/templates/SOUL.md +1 -1
  175. package/src/config/types.ts +1 -0
  176. package/src/config/user-reference.ts +4 -9
  177. package/src/config/vellum-skills/catalog.json +0 -7
  178. package/src/config/vellum-skills/chatgpt-import/tools/chatgpt-import.ts +5 -1
  179. package/src/config/vellum-skills/slack-oauth-setup/SKILL.md +1 -0
  180. package/src/config/vellum-skills/sms-setup/SKILL.md +112 -14
  181. package/src/context/window-manager.ts +27 -7
  182. package/src/daemon/approval-generators.ts +186 -0
  183. package/src/daemon/approved-devices-store.ts +140 -0
  184. package/src/daemon/assistant-attachments.ts +1 -1
  185. package/src/daemon/classifier.ts +35 -32
  186. package/src/daemon/config-watcher.ts +1 -1
  187. package/src/daemon/daemon-control.ts +254 -0
  188. package/src/daemon/handlers/apps.ts +2 -3
  189. package/src/daemon/handlers/config-channels.ts +158 -0
  190. package/src/daemon/handlers/config-inbox.ts +540 -0
  191. package/src/daemon/handlers/config-ingress.ts +231 -0
  192. package/src/daemon/handlers/config-integrations.ts +258 -0
  193. package/src/daemon/handlers/config-model.ts +143 -0
  194. package/src/daemon/handlers/config-parental.ts +163 -0
  195. package/src/daemon/handlers/config-scheduling.ts +172 -0
  196. package/src/daemon/handlers/config-slack.ts +92 -0
  197. package/src/daemon/handlers/config-telegram.ts +301 -0
  198. package/src/daemon/handlers/config-tools.ts +177 -0
  199. package/src/daemon/handlers/config-trust.ts +104 -0
  200. package/src/daemon/handlers/config-twilio.ts +1080 -0
  201. package/src/daemon/handlers/config.ts +53 -2463
  202. package/src/daemon/handlers/diagnostics.ts +1 -1
  203. package/src/daemon/handlers/dictation.ts +4 -6
  204. package/src/daemon/handlers/documents.ts +18 -32
  205. package/src/daemon/handlers/index.ts +9 -0
  206. package/src/daemon/handlers/misc.ts +3 -5
  207. package/src/daemon/handlers/pairing.ts +98 -0
  208. package/src/daemon/handlers/sessions.ts +74 -5
  209. package/src/daemon/handlers/shared.ts +3 -1
  210. package/src/daemon/handlers/skills.ts +1 -1
  211. package/src/daemon/handlers/twitter-auth.ts +2 -0
  212. package/src/daemon/handlers/work-items.ts +2 -2
  213. package/src/daemon/handlers/workspace-files.ts +4 -3
  214. package/src/daemon/install-cli-launchers.ts +113 -0
  215. package/src/daemon/ipc-contract/apps.ts +356 -0
  216. package/src/daemon/ipc-contract/browser.ts +74 -0
  217. package/src/daemon/ipc-contract/computer-use.ts +151 -0
  218. package/src/daemon/ipc-contract/diagnostics.ts +56 -0
  219. package/src/daemon/ipc-contract/documents.ts +74 -0
  220. package/src/daemon/ipc-contract/inbox.ts +209 -0
  221. package/src/daemon/ipc-contract/integrations.ts +284 -0
  222. package/src/daemon/ipc-contract/memory.ts +48 -0
  223. package/src/daemon/ipc-contract/messages.ts +211 -0
  224. package/src/daemon/ipc-contract/pairing.ts +45 -0
  225. package/src/daemon/ipc-contract/parental-control.ts +95 -0
  226. package/src/daemon/ipc-contract/schedules.ts +97 -0
  227. package/src/daemon/ipc-contract/sessions.ts +321 -0
  228. package/src/daemon/ipc-contract/shared.ts +42 -0
  229. package/src/daemon/ipc-contract/skills.ts +120 -0
  230. package/src/daemon/ipc-contract/subagents.ts +58 -0
  231. package/src/daemon/ipc-contract/surfaces.ts +250 -0
  232. package/src/daemon/ipc-contract/trust.ts +60 -0
  233. package/src/daemon/ipc-contract/work-items.ts +225 -0
  234. package/src/daemon/ipc-contract/workspace.ts +113 -0
  235. package/src/daemon/ipc-contract-inventory.json +62 -0
  236. package/src/daemon/ipc-contract-inventory.ts +55 -29
  237. package/src/daemon/ipc-contract.ts +227 -2527
  238. package/src/daemon/ipc-protocol.ts +1 -1
  239. package/src/daemon/ipc-validate.ts +7 -0
  240. package/src/daemon/lifecycle.ts +97 -379
  241. package/src/daemon/pairing-store.ts +177 -0
  242. package/src/daemon/providers-setup.ts +43 -0
  243. package/src/daemon/ride-shotgun-handler.ts +67 -2
  244. package/src/daemon/server.ts +60 -44
  245. package/src/daemon/session-agent-loop-handlers.ts +421 -0
  246. package/src/daemon/session-agent-loop.ts +113 -275
  247. package/src/daemon/session-dynamic-profile.ts +1 -1
  248. package/src/daemon/session-history.ts +1 -1
  249. package/src/daemon/session-media-retry.ts +1 -1
  250. package/src/daemon/session-messaging.ts +37 -2
  251. package/src/daemon/session-notifiers.ts +5 -25
  252. package/src/daemon/session-process.ts +99 -59
  253. package/src/daemon/session-queue-manager.ts +98 -4
  254. package/src/daemon/session-runtime-assembly.ts +149 -15
  255. package/src/daemon/session-surfaces.ts +26 -4
  256. package/src/daemon/session-tool-setup.ts +28 -30
  257. package/src/daemon/session-workspace.ts +1 -1
  258. package/src/daemon/session.ts +24 -1
  259. package/src/daemon/shutdown-handlers.ts +122 -0
  260. package/src/daemon/trace-emitter.ts +1 -1
  261. package/src/daemon/watch-handler.ts +36 -33
  262. package/src/doordash/cart-queries.ts +787 -0
  263. package/src/doordash/client.ts +144 -127
  264. package/src/doordash/order-queries.ts +85 -0
  265. package/src/doordash/queries.ts +10 -1308
  266. package/src/doordash/search-queries.ts +203 -0
  267. package/src/doordash/session.ts +3 -2
  268. package/src/doordash/store-queries.ts +246 -0
  269. package/src/doordash/types.ts +367 -0
  270. package/src/email/providers/agentmail.ts +2 -1
  271. package/src/email/providers/index.ts +3 -2
  272. package/src/email/service.ts +3 -2
  273. package/src/errors.ts +43 -0
  274. package/src/home-base/prebuilt/seed.ts +1 -1
  275. package/src/hooks/cli.ts +6 -5
  276. package/src/hooks/config.ts +6 -8
  277. package/src/hooks/discovery.ts +6 -5
  278. package/src/hooks/manager.ts +4 -3
  279. package/src/hooks/runner.ts +2 -2
  280. package/src/hooks/templates.ts +5 -5
  281. package/src/inbound/public-ingress-urls.ts +3 -1
  282. package/src/index.ts +4 -2
  283. package/src/influencer/client.ts +1104 -0
  284. package/src/instrument.ts +4 -3
  285. package/src/logfire.ts +4 -3
  286. package/src/memory/admin.ts +25 -35
  287. package/src/memory/attachments-store.ts +4 -7
  288. package/src/memory/channel-delivery-store.ts +30 -1
  289. package/src/memory/channel-guardian-store.ts +200 -1
  290. package/src/memory/clarification-resolver.ts +37 -33
  291. package/src/memory/conflict-store.ts +67 -61
  292. package/src/memory/contradiction-checker.ts +141 -117
  293. package/src/memory/conversation-store.ts +335 -51
  294. package/src/memory/db-connection.ts +27 -4
  295. package/src/memory/db-init.ts +121 -4
  296. package/src/memory/db.ts +14 -1
  297. package/src/memory/embedding-backend.ts +27 -5
  298. package/src/memory/embedding-ollama.ts +2 -1
  299. package/src/memory/entity-extractor.ts +38 -35
  300. package/src/memory/guardian-action-store.ts +430 -0
  301. package/src/memory/inbox-escalation-projection.ts +59 -0
  302. package/src/memory/inbox-thread-store.ts +218 -0
  303. package/src/memory/ingress-invite-store.ts +338 -0
  304. package/src/memory/ingress-member-store.ts +350 -0
  305. package/src/memory/items-extractor.ts +91 -97
  306. package/src/memory/job-handlers/index-maintenance.ts +3 -3
  307. package/src/memory/job-handlers/media-processing.ts +11 -42
  308. package/src/memory/job-handlers/summarization.ts +32 -26
  309. package/src/memory/job-utils.ts +3 -10
  310. package/src/memory/jobs-store.ts +6 -9
  311. package/src/memory/jobs-worker.ts +51 -36
  312. package/src/memory/migrations/001-job-deferrals.ts +45 -0
  313. package/src/memory/migrations/002-tool-invocations-fk.ts +43 -0
  314. package/src/memory/migrations/003-memory-fts-backfill.ts +24 -0
  315. package/src/memory/migrations/004-entity-relation-dedup.ts +87 -0
  316. package/src/memory/migrations/005-fingerprint-scope-unique.ts +80 -0
  317. package/src/memory/migrations/006-scope-salted-fingerprints.ts +62 -0
  318. package/src/memory/migrations/007-assistant-id-to-self.ts +254 -0
  319. package/src/memory/migrations/008-remove-assistant-id-columns.ts +208 -0
  320. package/src/memory/migrations/009-llm-usage-events-drop-assistant-id.ts +83 -0
  321. package/src/memory/migrations/010-ext-conv-bindings-channel-chat-unique.ts +56 -0
  322. package/src/memory/migrations/011-call-sessions-provider-sid-dedup.ts +63 -0
  323. package/src/memory/migrations/012-call-sessions-add-initiated-from.ts +19 -0
  324. package/src/memory/migrations/013-guardian-action-tables.ts +68 -0
  325. package/src/memory/migrations/014-backfill-inbox-thread-state.ts +76 -0
  326. package/src/memory/migrations/015-drop-active-search-index.ts +27 -0
  327. package/src/memory/migrations/016-memory-segments-indexes.ts +11 -0
  328. package/src/memory/migrations/017-memory-items-indexes.ts +12 -0
  329. package/src/memory/migrations/018-remaining-table-indexes.ts +13 -0
  330. package/src/memory/migrations/index.ts +24 -0
  331. package/src/memory/migrations/registry.ts +79 -0
  332. package/src/memory/migrations/validate-migration-state.ts +69 -0
  333. package/src/memory/qdrant-manager.ts +49 -8
  334. package/src/memory/query-builder.ts +1 -1
  335. package/src/memory/raw-query.ts +119 -0
  336. package/src/memory/recall-cache.ts +4 -1
  337. package/src/memory/retriever.ts +163 -47
  338. package/src/memory/schema-migration.ts +25 -984
  339. package/src/memory/schema.ts +130 -7
  340. package/src/memory/search/entity.ts +10 -19
  341. package/src/memory/search/lexical.ts +81 -52
  342. package/src/memory/search/ranking.ts +21 -22
  343. package/src/memory/search/semantic.ts +157 -19
  344. package/src/memory/shared-app-links-store.ts +4 -5
  345. package/src/memory/validation.ts +19 -0
  346. package/src/messaging/draft-store.ts +5 -6
  347. package/src/messaging/providers/sms/adapter.ts +3 -6
  348. package/src/messaging/providers/telegram-bot/adapter.ts +2 -5
  349. package/src/messaging/providers/whatsapp/adapter.ts +136 -0
  350. package/src/messaging/providers/whatsapp/client.ts +67 -0
  351. package/src/messaging/style-analyzer.ts +5 -4
  352. package/src/messaging/thread-summarizer.ts +61 -69
  353. package/src/messaging/triage-engine.ts +62 -71
  354. package/src/migrations/config-merge.ts +53 -0
  355. package/src/migrations/data-layout.ts +68 -0
  356. package/src/migrations/data-merge.ts +33 -0
  357. package/src/migrations/hooks-merge.ts +90 -0
  358. package/src/migrations/index.ts +6 -0
  359. package/src/migrations/log.ts +23 -0
  360. package/src/migrations/skills-merge.ts +33 -0
  361. package/src/migrations/workspace-layout.ts +79 -0
  362. package/src/permissions/checker.ts +126 -11
  363. package/src/permissions/prompter.ts +14 -0
  364. package/src/permissions/shell-identity.ts +31 -1
  365. package/src/permissions/trust-store.ts +21 -1
  366. package/src/providers/anthropic/client.ts +4 -4
  367. package/src/providers/failover.ts +2 -2
  368. package/src/providers/model-intents.ts +70 -0
  369. package/src/providers/ollama/client.ts +2 -1
  370. package/src/providers/provider-send-message.ts +176 -0
  371. package/src/providers/registry.ts +71 -30
  372. package/src/providers/retry.ts +35 -1
  373. package/src/providers/types.ts +12 -1
  374. package/src/runtime/approval-conversation-turn.ts +97 -0
  375. package/src/runtime/approval-message-composer.ts +115 -5
  376. package/src/runtime/assistant-event-hub.ts +3 -1
  377. package/src/runtime/channel-approval-parser.ts +36 -2
  378. package/src/runtime/channel-approvals.ts +0 -21
  379. package/src/runtime/channel-guardian-service.ts +48 -7
  380. package/src/runtime/channel-readiness-service.ts +160 -34
  381. package/src/runtime/channel-readiness-types.ts +10 -4
  382. package/src/runtime/channel-retry-sweep.ts +184 -0
  383. package/src/runtime/guardian-context-resolver.ts +108 -0
  384. package/src/runtime/http-server.ts +289 -745
  385. package/src/runtime/http-types.ts +56 -3
  386. package/src/runtime/middleware/auth.ts +116 -0
  387. package/src/runtime/middleware/error-handler.ts +33 -0
  388. package/src/runtime/middleware/twilio-validation.ts +127 -0
  389. package/src/runtime/routes/app-routes.ts +1 -1
  390. package/src/runtime/routes/call-routes.ts +49 -6
  391. package/src/runtime/routes/channel-delivery-routes.ts +170 -0
  392. package/src/runtime/routes/channel-guardian-routes.ts +1191 -0
  393. package/src/runtime/routes/channel-inbound-routes.ts +1152 -0
  394. package/src/runtime/routes/channel-route-shared.ts +144 -0
  395. package/src/runtime/routes/channel-routes.ts +32 -1634
  396. package/src/runtime/routes/conversation-routes.ts +50 -7
  397. package/src/runtime/routes/events-routes.ts +2 -2
  398. package/src/runtime/routes/identity-routes.ts +126 -0
  399. package/src/runtime/routes/pairing-routes.ts +144 -0
  400. package/src/runtime/routes/run-routes.ts +15 -1
  401. package/src/runtime/run-orchestrator.ts +52 -34
  402. package/src/schedule/schedule-store.ts +36 -32
  403. package/src/schedule/scheduler.ts +3 -3
  404. package/src/security/encrypted-store.ts +5 -7
  405. package/src/security/oauth2.ts +45 -15
  406. package/src/security/parental-control-store.ts +183 -0
  407. package/src/security/secret-allowlist.ts +4 -3
  408. package/src/security/secret-scanner.ts +5 -5
  409. package/src/security/secure-keys.ts +1 -1
  410. package/src/security/token-manager.ts +3 -2
  411. package/src/services/vercel-deploy.ts +6 -2
  412. package/src/skills/tool-manifest.ts +3 -3
  413. package/src/skills/vellum-catalog-remote.ts +75 -16
  414. package/src/slack/slack-webhook.ts +2 -1
  415. package/src/swarm/orchestrator.ts +92 -1
  416. package/src/swarm/router-planner.ts +6 -9
  417. package/src/swarm/worker-prompts.ts +9 -12
  418. package/src/tasks/task-compiler.ts +19 -28
  419. package/src/tasks/task-runner.ts +1 -1
  420. package/src/tools/assets/search.ts +15 -14
  421. package/src/tools/browser/__tests__/auth-detector.test.ts +1 -0
  422. package/src/tools/browser/auto-navigate.ts +1 -0
  423. package/src/tools/browser/browser-execution.ts +13 -1
  424. package/src/tools/browser/browser-manager.ts +119 -4
  425. package/src/tools/browser/network-recorder.ts +5 -0
  426. package/src/tools/credentials/broker.ts +11 -2
  427. package/src/tools/credentials/metadata-store.ts +18 -14
  428. package/src/tools/credentials/post-connect-hooks.ts +61 -0
  429. package/src/tools/credentials/vault.ts +49 -23
  430. package/src/tools/executor.ts +80 -18
  431. package/src/tools/host-terminal/cli-discover.ts +1 -1
  432. package/src/tools/network/script-proxy/http-forwarder.ts +1 -1
  433. package/src/tools/network/script-proxy/mitm-handler.ts +1 -1
  434. package/src/tools/network/script-proxy/server.ts +1 -1
  435. package/src/tools/network/script-proxy/session-manager.ts +6 -5
  436. package/src/tools/network/web-fetch.ts +18 -2
  437. package/src/tools/network/web-search.ts +7 -3
  438. package/src/tools/reminder/reminder-store.ts +14 -15
  439. package/src/tools/schedule/create.ts +1 -0
  440. package/src/tools/schedule/list.ts +2 -1
  441. package/src/tools/shared/filesystem/file-ops-service.ts +5 -7
  442. package/src/tools/skills/skill-script-runner.ts +24 -9
  443. package/src/tools/skills/skill-tool-factory.ts +1 -0
  444. package/src/tools/tasks/work-item-enqueue.ts +2 -2
  445. package/src/tools/terminal/evaluate-typescript.ts +21 -12
  446. package/src/tools/terminal/parser.ts +50 -0
  447. package/src/tools/watcher/delete.ts +6 -0
  448. package/src/tools/weather/service.ts +1 -1
  449. package/src/twitter/client.ts +190 -24
  450. package/src/twitter/session.ts +4 -3
  451. package/src/util/clipboard.ts +1 -1
  452. package/src/util/errors.ts +65 -8
  453. package/src/util/fs.ts +40 -0
  454. package/src/util/json.ts +10 -0
  455. package/src/util/log-redact.ts +189 -0
  456. package/src/util/logger.ts +25 -18
  457. package/src/util/object.ts +3 -0
  458. package/src/util/platform.ts +72 -365
  459. package/src/util/pricing.ts +1 -1
  460. package/src/util/promise-guard.ts +1 -1
  461. package/src/util/retry.ts +19 -0
  462. package/src/util/row-mapper.ts +79 -0
  463. package/src/util/silently.ts +21 -0
  464. package/src/watcher/engine.ts +5 -1
  465. package/src/watcher/provider-types.ts +20 -0
  466. package/src/watcher/providers/github.ts +156 -0
  467. package/src/watcher/providers/gmail.ts +1 -0
  468. package/src/watcher/providers/google-calendar.ts +1 -0
  469. package/src/watcher/providers/linear.ts +460 -0
  470. package/src/watcher/providers/slack.ts +1 -0
  471. package/src/work-items/work-item-runner.ts +1 -1
  472. package/src/workspace/git-service.ts +1 -1
  473. package/src/workspace/provider-commit-message-generator.ts +51 -22
  474. package/src/__tests__/call-bridge.test.ts +0 -517
  475. package/src/__tests__/session-process-bridge.test.ts +0 -244
  476. package/src/calls/call-bridge.ts +0 -168
  477. package/src/config/bundled-skills/media-processing/services/capability-registry.ts +0 -137
  478. package/src/config/bundled-skills/media-processing/services/event-detection-service.ts +0 -280
  479. package/src/config/bundled-skills/media-processing/services/feedback-aggregation.ts +0 -144
  480. package/src/config/bundled-skills/media-processing/services/feedback-store.ts +0 -136
  481. package/src/config/bundled-skills/media-processing/services/retrieval-service.ts +0 -95
  482. package/src/config/bundled-skills/media-processing/services/timeline-service.ts +0 -267
  483. package/src/config/bundled-skills/media-processing/tools/detect-events.ts +0 -110
  484. package/src/config/bundled-skills/media-processing/tools/recalibrate.ts +0 -235
  485. package/src/config/bundled-skills/media-processing/tools/select-tracking-profile.ts +0 -142
  486. package/src/config/bundled-skills/media-processing/tools/submit-feedback.ts +0 -150
  487. 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,
@@ -46,7 +47,7 @@ export const DEFAULT_CONFIG: AssistantConfig = {
46
47
  injectionFormat: 'markdown' as const,
47
48
  injectionStrategy: 'prepend_user_block' as const,
48
49
  reranking: {
49
- enabled: true,
50
+ enabled: false,
50
51
  model: 'claude-haiku-4-5-20251001',
51
52
  topK: 20,
52
53
  },
@@ -251,6 +252,11 @@ export const DEFAULT_CONFIG: AssistantConfig = {
251
252
  callerIdentity: {
252
253
  allowPerCallOverride: true,
253
254
  },
255
+ verification: {
256
+ enabled: false,
257
+ maxAttempts: 3,
258
+ codeLength: 6,
259
+ },
254
260
  },
255
261
  sms: {
256
262
  enabled: false,
@@ -260,5 +266,23 @@ export const DEFAULT_CONFIG: AssistantConfig = {
260
266
  ingress: {
261
267
  enabled: undefined,
262
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,
263
287
  },
264
288
  };
@@ -0,0 +1,169 @@
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_DAEMON_NOAUTH',
140
+ 'VELLUM_DAEMON_AUTOSTART',
141
+ 'VELLUM_DEBUG',
142
+ 'VELLUM_LOG_STDERR',
143
+ 'VELLUM_ENABLE_MONITORING',
144
+ 'VELLUM_HOOK_EVENT',
145
+ 'VELLUM_HOOK_NAME',
146
+ 'VELLUM_HOOK_SETTINGS',
147
+ 'VELLUM_ROOT_DIR',
148
+ 'VELLUM_WORKSPACE_DIR',
149
+ 'VELLUM_CLAUDE_CODE_DEPTH',
150
+ 'VELLUM_ASSISTANT_PLATFORM_URL',
151
+ ]);
152
+
153
+ /**
154
+ * Check all VELLUM_* env vars and return warnings for any unrecognized ones.
155
+ * Returns an array of warning messages (empty if all vars are recognized).
156
+ *
157
+ * This is intentionally a pure function that returns strings rather than
158
+ * logging directly, so it can be called from bootstrap code before the
159
+ * logger is initialized.
160
+ */
161
+ export function checkUnrecognizedEnvVars(): string[] {
162
+ const warnings: string[] = [];
163
+ for (const key of Object.keys(process.env)) {
164
+ if (key.startsWith('VELLUM_') && !KNOWN_VELLUM_VARS.has(key)) {
165
+ warnings.push(`Unrecognized environment variable: ${key}`);
166
+ }
167
+ }
168
+ return warnings;
169
+ }