@vellumai/assistant 0.4.56 → 0.4.57

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 (450) hide show
  1. package/ARCHITECTURE.md +10 -10
  2. package/Dockerfile +3 -0
  3. package/README.md +11 -11
  4. package/docs/architecture/integrations.md +2 -2
  5. package/docs/architecture/memory.md +3 -4
  6. package/docs/credential-execution-service.md +13 -20
  7. package/node_modules/@vellumai/ces-contracts/src/error.ts +5 -4
  8. package/package.json +1 -1
  9. package/src/__tests__/actor-token-service.test.ts +7 -7
  10. package/src/__tests__/anthropic-provider.test.ts +172 -0
  11. package/src/__tests__/app-builder-tool-scripts.test.ts +15 -1
  12. package/src/__tests__/approval-cascade.test.ts +2 -2
  13. package/src/__tests__/approval-routes-http.test.ts +3 -4
  14. package/src/__tests__/asset-materialize-tool.test.ts +5 -5
  15. package/src/__tests__/asset-search-tool.test.ts +1 -1
  16. package/src/__tests__/assistant-attachments.test.ts +5 -5
  17. package/src/__tests__/assistant-events-sse-hardening.test.ts +1 -1
  18. package/src/__tests__/assistant-feature-flags-integration.test.ts +50 -38
  19. package/src/__tests__/attachments-store.test.ts +2 -2
  20. package/src/__tests__/avatar-e2e.test.ts +5 -3
  21. package/src/__tests__/browser-skill-endstate.test.ts +0 -1
  22. package/src/__tests__/call-routes-http.test.ts +2 -2
  23. package/src/__tests__/callback-handoff-copy.test.ts +1 -1
  24. package/src/__tests__/cancel-resolves-conversation-key.test.ts +158 -0
  25. package/src/__tests__/channel-readiness-routes.test.ts +0 -1
  26. package/src/__tests__/channel-readiness-service.test.ts +0 -1
  27. package/src/__tests__/checker.test.ts +31 -32
  28. package/src/__tests__/chrome-cdp.test.ts +47 -18
  29. package/src/__tests__/claude-code-skill-regression.test.ts +2 -2
  30. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  31. package/src/__tests__/config-schema.test.ts +9 -18
  32. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +1 -1
  33. package/src/__tests__/conversation-abort-tool-results.test.ts +4 -4
  34. package/src/__tests__/conversation-agent-loop-overflow.test.ts +2 -2
  35. package/src/__tests__/conversation-agent-loop.test.ts +11 -4
  36. package/src/__tests__/conversation-attachments.test.ts +1 -1
  37. package/src/__tests__/conversation-confirmation-signals.test.ts +2 -2
  38. package/src/__tests__/conversation-error.test.ts +33 -0
  39. package/src/__tests__/conversation-init.benchmark.test.ts +0 -1
  40. package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
  41. package/src/__tests__/conversation-pairing.test.ts +1 -1
  42. package/src/__tests__/conversation-pre-run-repair.test.ts +4 -4
  43. package/src/__tests__/conversation-provider-retry-repair.test.ts +4 -4
  44. package/src/__tests__/conversation-queue.test.ts +23 -14
  45. package/src/__tests__/conversation-routes-slash-commands.test.ts +3 -3
  46. package/src/__tests__/conversation-runtime-assembly.test.ts +185 -173
  47. package/src/__tests__/conversation-seed-composer.test.ts +1 -1
  48. package/src/__tests__/conversation-slash-queue.test.ts +4 -4
  49. package/src/__tests__/conversation-slash-unknown.test.ts +4 -4
  50. package/src/__tests__/conversation-starter-routes.test.ts +291 -0
  51. package/src/__tests__/conversation-wipe.test.ts +438 -0
  52. package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -3
  53. package/src/__tests__/conversation-workspace-injection.test.ts +4 -5
  54. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +4 -5
  55. package/src/__tests__/credential-security-e2e.test.ts +20 -0
  56. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  57. package/src/__tests__/credential-vault-unit.test.ts +227 -0
  58. package/src/__tests__/credentials-cli.test.ts +3 -0
  59. package/src/__tests__/date-context.test.ts +59 -377
  60. package/src/__tests__/drop-capability-card-state-migration.test.ts +169 -0
  61. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +11 -45
  62. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  63. package/src/__tests__/encrypted-store.test.ts +237 -15
  64. package/src/__tests__/ephemeral-permissions.test.ts +4 -5
  65. package/src/__tests__/event-bus.test.ts +3 -3
  66. package/src/__tests__/gateway-only-enforcement.test.ts +2 -2
  67. package/src/__tests__/gateway-only-guard.test.ts +1 -0
  68. package/src/__tests__/gemini-image-service.test.ts +4 -4
  69. package/src/__tests__/gemini-provider.test.ts +6 -9
  70. package/src/__tests__/guardian-binding-drift-heal.test.ts +128 -0
  71. package/src/__tests__/guardian-dispatch.test.ts +0 -1
  72. package/src/__tests__/host-shell-tool.test.ts +6 -6
  73. package/src/__tests__/http-user-message-parity.test.ts +2 -2
  74. package/src/__tests__/intent-routing.test.ts +51 -99
  75. package/src/__tests__/invite-routes-http.test.ts +5 -0
  76. package/src/__tests__/list-messages-attachments.test.ts +1 -1
  77. package/src/__tests__/managed-proxy-context.test.ts +2 -5
  78. package/src/__tests__/managed-skill-lifecycle.test.ts +8 -8
  79. package/src/__tests__/media-generate-image.test.ts +32 -15
  80. package/src/__tests__/media-reuse-story.e2e.test.ts +1 -1
  81. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +1 -1
  82. package/src/__tests__/memory-lifecycle-e2e.test.ts +24 -18
  83. package/src/__tests__/memory-recall-quality.test.ts +4 -3
  84. package/src/__tests__/memory-regressions.test.ts +86 -90
  85. package/src/__tests__/migration-cross-version-compatibility.test.ts +32 -32
  86. package/src/__tests__/migration-export-http.test.ts +26 -27
  87. package/src/__tests__/migration-import-commit-http.test.ts +165 -37
  88. package/src/__tests__/migration-import-preflight-http.test.ts +81 -20
  89. package/src/__tests__/migration-validate-http.test.ts +16 -16
  90. package/src/__tests__/model-intents.test.ts +1 -1
  91. package/src/__tests__/no-domain-routing-in-prompt-guard.test.ts +1 -1
  92. package/src/__tests__/notification-broadcaster.test.ts +1 -1
  93. package/src/__tests__/notification-decision-fallback.test.ts +2 -2
  94. package/src/__tests__/notification-decision-identity.test.ts +8 -9
  95. package/src/__tests__/notification-decision-strategy.test.ts +1 -1
  96. package/src/__tests__/notification-deep-link.test.ts +1 -1
  97. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  98. package/src/__tests__/notification-schedule-dedup.test.ts +7 -7
  99. package/src/__tests__/oauth-store.test.ts +1 -3
  100. package/src/__tests__/oauth2-gateway-transport.test.ts +6 -1
  101. package/src/__tests__/onboarding-template-contract.test.ts +23 -59
  102. package/src/__tests__/provider-error-scenarios.test.ts +154 -0
  103. package/src/__tests__/provider-fail-open-selection.test.ts +2 -2
  104. package/src/__tests__/provider-managed-proxy-integration.test.ts +8 -9
  105. package/src/__tests__/provider-registry-ollama.test.ts +5 -2
  106. package/src/__tests__/qdrant-manager.test.ts +7 -7
  107. package/src/__tests__/ratelimit.test.ts +0 -74
  108. package/src/__tests__/recording-handler.test.ts +0 -1
  109. package/src/__tests__/require-fresh-approval.test.ts +1 -1
  110. package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
  111. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  112. package/src/__tests__/runtime-events-sse.test.ts +1 -1
  113. package/src/__tests__/scheduler-recurrence.test.ts +46 -2
  114. package/src/__tests__/schema-transforms.test.ts +114 -54
  115. package/src/__tests__/secret-onetime-send.test.ts +20 -0
  116. package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -2
  117. package/src/__tests__/secret-scanner-executor.test.ts +1 -2
  118. package/src/__tests__/send-endpoint-busy.test.ts +63 -4
  119. package/src/__tests__/send-notification-tool.test.ts +2 -2
  120. package/src/__tests__/shell-credential-ref.test.ts +0 -1
  121. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -2
  122. package/src/__tests__/skill-memory.test.ts +547 -0
  123. package/src/__tests__/skill-script-runner-sandbox.test.ts +1 -2
  124. package/src/__tests__/slack-app-setup-skill-regression.test.ts +37 -0
  125. package/src/__tests__/slack-channel-config.test.ts +109 -94
  126. package/src/__tests__/swarm-conversation-integration.test.ts +2 -2
  127. package/src/__tests__/swarm-recursion.test.ts +2 -2
  128. package/src/__tests__/swarm-tool.test.ts +2 -2
  129. package/src/__tests__/system-prompt.test.ts +19 -66
  130. package/src/__tests__/telegram-config.test.ts +121 -0
  131. package/src/__tests__/terminal-tools.test.ts +1 -1
  132. package/src/__tests__/tool-execution-abort-cleanup.test.ts +1 -2
  133. package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
  134. package/src/__tests__/tool-executor-shell-integration.test.ts +1 -1
  135. package/src/__tests__/tool-executor.test.ts +1 -1
  136. package/src/__tests__/trace-emitter.test.ts +8 -1
  137. package/src/__tests__/trust-store.test.ts +7 -8
  138. package/src/__tests__/twilio-routes.test.ts +1 -18
  139. package/src/__tests__/user-reference.test.ts +82 -2
  140. package/src/__tests__/vbundle-pax-and-symlink.test.ts +196 -0
  141. package/src/__tests__/verification-control-plane-policy.test.ts +1 -1
  142. package/src/approvals/guardian-request-resolvers.ts +3 -3
  143. package/src/avatar/ascii-renderer.ts +2 -2
  144. package/src/avatar/png-renderer.ts +2 -2
  145. package/src/avatar/resvg-lazy.ts +21 -0
  146. package/src/calls/guardian-dispatch.ts +1 -1
  147. package/src/calls/relay-access-wait.ts +2 -2
  148. package/src/calls/twilio-rest.ts +0 -248
  149. package/src/cli/AGENTS.md +5 -8
  150. package/src/cli/__tests__/notifications.test.ts +5 -5
  151. package/src/cli/commands/avatar.ts +64 -2
  152. package/src/cli/commands/conversations.ts +131 -1
  153. package/src/cli/commands/credentials.ts +2 -0
  154. package/src/cli/commands/notifications.ts +3 -3
  155. package/src/cli.ts +10 -0
  156. package/src/config/bundled-skills/acp/SKILL.md +5 -5
  157. package/src/config/bundled-skills/acp/TOOLS.json +6 -6
  158. package/src/config/bundled-skills/app-builder/SKILL.md +42 -42
  159. package/src/config/bundled-skills/app-builder/TOOLS.json +10 -10
  160. package/src/config/bundled-skills/browser/SKILL.md +15 -15
  161. package/src/config/bundled-skills/browser/TOOLS.json +14 -14
  162. package/src/config/bundled-skills/chatgpt-import/SKILL.md +2 -2
  163. package/src/config/bundled-skills/chatgpt-import/TOOLS.json +1 -1
  164. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
  165. package/src/config/bundled-skills/claude-code/SKILL.md +5 -5
  166. package/src/config/bundled-skills/computer-use/SKILL.md +2 -2
  167. package/src/config/bundled-skills/computer-use/TOOLS.json +15 -15
  168. package/src/config/bundled-skills/contacts/SKILL.md +3 -3
  169. package/src/config/bundled-skills/contacts/TOOLS.json +4 -4
  170. package/src/config/bundled-skills/document/SKILL.md +4 -4
  171. package/src/config/bundled-skills/document/TOOLS.json +2 -2
  172. package/src/config/bundled-skills/followups/TOOLS.json +3 -3
  173. package/src/config/bundled-skills/gmail/SKILL.md +32 -32
  174. package/src/config/bundled-skills/gmail/TOOLS.json +16 -16
  175. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +1 -1
  176. package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +1 -1
  177. package/src/config/bundled-skills/google-calendar/SKILL.md +1 -1
  178. package/src/config/bundled-skills/google-calendar/TOOLS.json +5 -5
  179. package/src/config/bundled-skills/google-calendar/types.ts +1 -1
  180. package/src/config/bundled-skills/heartbeat/SKILL.md +43 -0
  181. package/src/config/bundled-skills/image-studio/SKILL.md +3 -3
  182. package/src/config/bundled-skills/image-studio/TOOLS.json +2 -3
  183. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +16 -12
  184. package/src/config/bundled-skills/media-processing/SKILL.md +40 -40
  185. package/src/config/bundled-skills/media-processing/TOOLS.json +8 -8
  186. package/src/config/bundled-skills/media-processing/__tests__/concurrency-pool.test.ts +2 -2
  187. package/src/config/bundled-skills/media-processing/__tests__/preprocess.test.ts +1 -1
  188. package/src/config/bundled-skills/media-processing/services/gemini-map.ts +5 -5
  189. package/src/config/bundled-skills/media-processing/services/gemini-video.ts +2 -2
  190. package/src/config/bundled-skills/media-processing/services/preprocess.ts +2 -2
  191. package/src/config/bundled-skills/media-processing/services/processing-pipeline.ts +2 -2
  192. package/src/config/bundled-skills/media-processing/services/reduce.ts +3 -3
  193. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +2 -2
  194. package/src/config/bundled-skills/media-processing/tools/query-media-events.ts +1 -1
  195. package/src/config/bundled-skills/messaging/SKILL.md +29 -25
  196. package/src/config/bundled-skills/messaging/TOOLS.json +11 -11
  197. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +1 -1
  198. package/src/config/bundled-skills/messaging/tools/shared.ts +1 -1
  199. package/src/config/bundled-skills/notifications/SKILL.md +3 -3
  200. package/src/config/bundled-skills/notifications/TOOLS.json +2 -2
  201. package/src/config/bundled-skills/notifications/tools/send-notification.ts +3 -3
  202. package/src/config/bundled-skills/orchestration/SKILL.md +1 -1
  203. package/src/config/bundled-skills/orchestration/TOOLS.json +1 -1
  204. package/src/config/bundled-skills/phone-calls/SKILL.md +18 -14
  205. package/src/config/bundled-skills/phone-calls/TOOLS.json +3 -3
  206. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +2 -2
  207. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +2 -2
  208. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +1 -1
  209. package/src/config/bundled-skills/playbooks/TOOLS.json +4 -4
  210. package/src/config/bundled-skills/schedule/SKILL.md +26 -26
  211. package/src/config/bundled-skills/schedule/TOOLS.json +5 -5
  212. package/src/config/bundled-skills/screen-watch/SKILL.md +3 -3
  213. package/src/config/bundled-skills/screen-watch/TOOLS.json +1 -1
  214. package/src/config/bundled-skills/sequences/SKILL.md +2 -2
  215. package/src/config/bundled-skills/sequences/TOOLS.json +10 -10
  216. package/src/config/bundled-skills/sequences/tools/sequence-analytics.ts +2 -2
  217. package/src/config/bundled-skills/sequences/tools/sequence-enroll.ts +2 -2
  218. package/src/config/bundled-skills/sequences/tools/sequence-enrollment-list.ts +1 -1
  219. package/src/config/bundled-skills/sequences/tools/sequence-get.ts +1 -1
  220. package/src/config/bundled-skills/sequences/tools/sequence-import.ts +3 -3
  221. package/src/config/bundled-skills/sequences/tools/sequence-list.ts +1 -1
  222. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +1 -1
  223. package/src/config/bundled-skills/settings/TOOLS.json +3 -3
  224. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +1 -1
  225. package/src/config/bundled-skills/skill-management/TOOLS.json +5 -5
  226. package/src/config/bundled-skills/skills-catalog/SKILL.md +84 -0
  227. package/src/config/bundled-skills/slack/SKILL.md +2 -2
  228. package/src/config/bundled-skills/slack/TOOLS.json +8 -8
  229. package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +3 -3
  230. package/src/config/bundled-skills/subagent/TOOLS.json +5 -5
  231. package/src/config/bundled-skills/tasks/SKILL.md +1 -1
  232. package/src/config/bundled-skills/tasks/TOOLS.json +9 -9
  233. package/src/config/bundled-skills/transcribe/SKILL.md +5 -5
  234. package/src/config/bundled-skills/transcribe/TOOLS.json +1 -1
  235. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +10 -10
  236. package/src/config/bundled-skills/watcher/SKILL.md +4 -4
  237. package/src/config/bundled-skills/watcher/TOOLS.json +5 -5
  238. package/src/config/feature-flag-registry.json +33 -17
  239. package/src/config/schemas/sandbox.ts +1 -1
  240. package/src/config/schemas/services.ts +13 -3
  241. package/src/config/schemas/timeouts.ts +0 -10
  242. package/src/contacts/contact-store.ts +63 -0
  243. package/src/contacts/contacts-write.ts +1 -1
  244. package/src/daemon/assistant-attachments.ts +2 -2
  245. package/src/daemon/conversation-agent-loop-handlers.ts +2 -2
  246. package/src/daemon/conversation-agent-loop.ts +7 -30
  247. package/src/daemon/conversation-error.ts +24 -0
  248. package/src/daemon/conversation-memory.ts +8 -7
  249. package/src/daemon/conversation-runtime-assembly.ts +139 -274
  250. package/src/daemon/conversation-slash.ts +7 -26
  251. package/src/daemon/conversation-surfaces.ts +14 -0
  252. package/src/daemon/conversation-tool-setup.ts +9 -8
  253. package/src/daemon/conversation.ts +2 -0
  254. package/src/daemon/daemon-control.ts +1 -1
  255. package/src/daemon/date-context.ts +10 -83
  256. package/src/daemon/handlers/config-channels.ts +12 -2
  257. package/src/daemon/handlers/config-slack-channel.ts +7 -1
  258. package/src/daemon/handlers/config-telegram.ts +6 -1
  259. package/src/daemon/handlers/conversations.ts +2 -2
  260. package/src/daemon/handlers/skills.ts +4 -0
  261. package/src/daemon/lifecycle.ts +28 -4
  262. package/src/daemon/providers-setup.ts +1 -1
  263. package/src/daemon/server.ts +1 -5
  264. package/src/daemon/shutdown-handlers.ts +9 -3
  265. package/src/daemon/tool-side-effects.ts +40 -0
  266. package/src/daemon/trace-emitter.ts +25 -2
  267. package/src/events/domain-events.ts +1 -1
  268. package/src/events/tool-permission-telemetry-listener.ts +46 -0
  269. package/src/inbound/platform-callback-registration.ts +0 -18
  270. package/src/media/app-icon-generator.ts +15 -8
  271. package/src/media/avatar-router.ts +15 -8
  272. package/src/media/gemini-image-service.ts +125 -21
  273. package/src/memory/attachments-store.ts +3 -3
  274. package/src/memory/channel-verification-sessions.ts +6 -6
  275. package/src/memory/conversation-crud.ts +196 -1
  276. package/src/memory/{thread-starters-cadence.ts → conversation-starters-cadence.ts} +9 -42
  277. package/src/memory/conversation-title-service.ts +2 -3
  278. package/src/memory/db-init.ts +25 -1
  279. package/src/memory/invite-store.ts +4 -4
  280. package/src/memory/items-extractor.ts +4 -4
  281. package/src/memory/job-handlers/{thread-starters.ts → conversation-starters.ts} +123 -38
  282. package/src/memory/jobs-store.ts +3 -2
  283. package/src/memory/jobs-worker.ts +7 -5
  284. package/src/memory/lifecycle-events-store.ts +63 -0
  285. package/src/memory/migrations/172-rename-created-by-session-id.ts +27 -0
  286. package/src/memory/migrations/173-rename-source-session-id.ts +16 -0
  287. package/src/memory/migrations/174-rename-thread-starters-table.ts +52 -0
  288. package/src/memory/migrations/175-create-lifecycle-events.ts +15 -0
  289. package/src/memory/migrations/176-drop-capability-card-state.ts +36 -0
  290. package/src/memory/migrations/177-create-trace-events-table.ts +40 -0
  291. package/src/memory/migrations/index.ts +6 -0
  292. package/src/memory/migrations/registry.ts +13 -0
  293. package/src/memory/retriever.test.ts +223 -96
  294. package/src/memory/retriever.ts +115 -138
  295. package/src/memory/schema/calls.ts +1 -1
  296. package/src/memory/schema/contacts.ts +1 -1
  297. package/src/memory/schema/infrastructure.ts +29 -0
  298. package/src/memory/schema/memory-core.ts +7 -17
  299. package/src/memory/schema/notifications.ts +1 -1
  300. package/src/memory/search/formatting.ts +23 -6
  301. package/src/memory/search/lexical.ts +2 -0
  302. package/src/memory/search/semantic.ts +2 -0
  303. package/src/memory/search/staleness.ts +1 -0
  304. package/src/memory/search/types.ts +4 -0
  305. package/src/memory/task-memory-cleanup.ts +96 -6
  306. package/src/memory/trace-event-store.ts +148 -0
  307. package/src/notifications/README.md +1 -1
  308. package/src/notifications/decision-engine.ts +2 -2
  309. package/src/notifications/emit-signal.ts +4 -4
  310. package/src/notifications/events-store.ts +4 -4
  311. package/src/notifications/signal.ts +1 -1
  312. package/src/oauth/manual-token-connection.ts +49 -25
  313. package/src/permissions/checker.ts +6 -5
  314. package/src/permissions/defaults.ts +4 -4
  315. package/src/prompts/__tests__/build-cli-reference-section.test.ts +9 -90
  316. package/src/prompts/cache-boundary.ts +8 -0
  317. package/src/prompts/system-prompt.ts +105 -634
  318. package/src/prompts/templates/BOOTSTRAP.md +166 -33
  319. package/src/prompts/templates/IDENTITY.md +8 -23
  320. package/src/prompts/templates/SOUL.md +20 -41
  321. package/src/prompts/templates/USER.md +3 -19
  322. package/src/prompts/user-reference.ts +14 -16
  323. package/src/providers/anthropic/client.ts +46 -2
  324. package/src/providers/gemini/client.ts +6 -9
  325. package/src/providers/managed-proxy/constants.ts +1 -7
  326. package/src/providers/managed-proxy/context.ts +0 -1
  327. package/src/providers/model-intents.ts +5 -5
  328. package/src/providers/openai/client.ts +10 -1
  329. package/src/providers/openrouter/client.ts +1 -0
  330. package/src/providers/ratelimit.ts +0 -35
  331. package/src/providers/registry.ts +3 -5
  332. package/src/providers/retry.ts +18 -1
  333. package/src/runtime/access-request-helper.ts +1 -1
  334. package/src/runtime/auth/route-policy.ts +7 -0
  335. package/src/runtime/channel-verification-service.ts +1 -1
  336. package/src/runtime/confirmation-request-guardian-bridge.ts +1 -1
  337. package/src/runtime/guardian-vellum-migration.ts +63 -1
  338. package/src/runtime/http-server.ts +8 -4
  339. package/src/runtime/migrations/vbundle-builder.ts +212 -32
  340. package/src/runtime/migrations/vbundle-import-analyzer.ts +74 -8
  341. package/src/runtime/migrations/vbundle-importer.ts +66 -1
  342. package/src/runtime/migrations/vbundle-validator.ts +17 -3
  343. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +4 -4
  344. package/src/runtime/routes/attachment-routes.ts +2 -2
  345. package/src/runtime/routes/btw-routes.ts +9 -0
  346. package/src/runtime/routes/channel-verification-routes.ts +19 -2
  347. package/src/runtime/routes/conversation-management-routes.ts +55 -1
  348. package/src/runtime/routes/conversation-query-routes.ts +1 -1
  349. package/src/runtime/routes/conversation-routes.ts +49 -5
  350. package/src/runtime/routes/conversation-starter-routes.ts +207 -0
  351. package/src/runtime/routes/guardian-bootstrap-routes.ts +13 -9
  352. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +1 -1
  353. package/src/runtime/routes/inbound-stages/verification-intercept.ts +1 -1
  354. package/src/runtime/routes/migration-routes.ts +25 -13
  355. package/src/runtime/routes/secret-routes.ts +18 -0
  356. package/src/runtime/routes/settings-routes.ts +8 -8
  357. package/src/runtime/routes/telemetry-routes.ts +53 -0
  358. package/src/runtime/routes/trace-event-routes.ts +62 -0
  359. package/src/runtime/tool-grant-request-helper.ts +1 -1
  360. package/src/runtime/verification-outbound-actions.ts +47 -31
  361. package/src/security/encrypted-store.ts +263 -78
  362. package/src/skills/catalog-install.ts +10 -0
  363. package/src/skills/managed-store.ts +2 -0
  364. package/src/skills/skill-memory.ts +220 -0
  365. package/src/subagent/manager.ts +1 -4
  366. package/src/telemetry/types.ts +10 -1
  367. package/src/telemetry/usage-telemetry-reporter.test.ts +1 -1
  368. package/src/telemetry/usage-telemetry-reporter.ts +51 -4
  369. package/src/tools/AGENTS.md +11 -11
  370. package/src/tools/acp/spawn.ts +1 -1
  371. package/src/tools/apps/executors.ts +8 -8
  372. package/src/tools/apps/registry.ts +1 -1
  373. package/src/tools/assets/materialize.ts +6 -6
  374. package/src/tools/assets/search.ts +10 -10
  375. package/src/tools/browser/__tests__/auth-cache.test.ts +2 -2
  376. package/src/tools/browser/__tests__/auth-detector.test.ts +4 -4
  377. package/src/tools/browser/auth-detector.ts +6 -6
  378. package/src/tools/browser/browser-execution.ts +13 -13
  379. package/src/tools/browser/browser-manager.ts +3 -3
  380. package/src/tools/browser/chrome-cdp.ts +5 -5
  381. package/src/tools/browser/jit-auth.ts +2 -2
  382. package/src/tools/browser/network-recorder.test.ts +2 -2
  383. package/src/tools/browser/network-recorder.ts +3 -3
  384. package/src/tools/browser/runtime-check.ts +3 -3
  385. package/src/tools/claude-code/claude-code.ts +2 -2
  386. package/src/tools/computer-use/definitions.ts +18 -18
  387. package/src/tools/credential-execution/make-authenticated-request.ts +4 -4
  388. package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -3
  389. package/src/tools/credential-execution/run-authenticated-command.ts +4 -4
  390. package/src/tools/credentials/broker-types.ts +5 -5
  391. package/src/tools/credentials/broker.ts +15 -15
  392. package/src/tools/credentials/metadata-store.ts +2 -2
  393. package/src/tools/credentials/resolve.ts +1 -1
  394. package/src/tools/credentials/selection.ts +1 -1
  395. package/src/tools/credentials/tool-policy.ts +1 -1
  396. package/src/tools/credentials/vault.ts +115 -25
  397. package/src/tools/execution-target.ts +2 -2
  398. package/src/tools/executor.ts +7 -7
  399. package/src/tools/filesystem/edit.ts +2 -2
  400. package/src/tools/filesystem/read.ts +1 -1
  401. package/src/tools/filesystem/write.ts +1 -1
  402. package/src/tools/host-filesystem/edit.ts +2 -1
  403. package/src/tools/host-filesystem/read.ts +2 -1
  404. package/src/tools/host-filesystem/write.ts +1 -1
  405. package/src/tools/host-terminal/host-shell.ts +9 -8
  406. package/src/tools/mcp/mcp-tool-factory.ts +7 -6
  407. package/src/tools/memory/definitions.ts +6 -5
  408. package/src/tools/memory/handlers.test.ts +1 -1
  409. package/src/tools/network/__tests__/web-search.test.ts +3 -3
  410. package/src/tools/network/domain-normalize.ts +2 -2
  411. package/src/tools/network/script-proxy/session-manager.ts +10 -10
  412. package/src/tools/network/web-fetch.ts +1 -1
  413. package/src/tools/network/web-search.ts +3 -3
  414. package/src/tools/permission-checker.ts +8 -8
  415. package/src/tools/registry.ts +7 -7
  416. package/src/tools/schedule/list.ts +2 -2
  417. package/src/tools/schema-transforms.ts +31 -21
  418. package/src/tools/secret-detection-handler.ts +1 -1
  419. package/src/tools/sensitive-output-placeholders.ts +1 -1
  420. package/src/tools/shared/filesystem/edit-engine.ts +1 -1
  421. package/src/tools/shared/filesystem/file-ops-service.ts +3 -3
  422. package/src/tools/shared/filesystem/image-read.ts +25 -5
  423. package/src/tools/shared/filesystem/path-policy.ts +2 -2
  424. package/src/tools/shared/shell-output.ts +1 -1
  425. package/src/tools/side-effects.ts +1 -1
  426. package/src/tools/skills/execute.ts +1 -1
  427. package/src/tools/skills/load.ts +3 -3
  428. package/src/tools/skills/sandbox-runner.ts +3 -3
  429. package/src/tools/subagent/read.ts +1 -1
  430. package/src/tools/subagent/spawn.ts +2 -2
  431. package/src/tools/swarm/delegate.ts +3 -3
  432. package/src/tools/system/request-permission.ts +5 -4
  433. package/src/tools/terminal/backends/native.ts +4 -4
  434. package/src/tools/terminal/parser.ts +6 -6
  435. package/src/tools/terminal/sandbox-diagnostics.ts +1 -1
  436. package/src/tools/terminal/shell.ts +16 -16
  437. package/src/tools/tool-approval-handler.ts +21 -12
  438. package/src/tools/tool-manifest.ts +4 -4
  439. package/src/tools/types.ts +3 -3
  440. package/src/tools/ui-surface/definitions.ts +9 -37
  441. package/src/tools/watcher/list.ts +1 -1
  442. package/src/util/logger.ts +7 -2
  443. package/src/util/retry.ts +29 -1
  444. package/src/workspace/migrations/007-web-search-provider-rename.ts +37 -0
  445. package/src/workspace/migrations/registry.ts +2 -0
  446. package/src/__tests__/cli-help-reference-sync.test.ts +0 -26
  447. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -190
  448. package/src/cli/reference.ts +0 -38
  449. package/src/memory/job-handlers/capability-cards.ts +0 -420
  450. package/src/runtime/routes/thread-starter-routes.ts +0 -294
@@ -33,7 +33,7 @@
33
33
  "enum": ["text", "blocks"],
34
34
  "description": "Output format: 'text' returns JSON (default), 'blocks' returns Slack Block Kit structured output"
35
35
  },
36
- "reason": {
36
+ "activity": {
37
37
  "type": "string",
38
38
  "description": "Brief non-technical explanation of why this tool is being called"
39
39
  }
@@ -54,7 +54,7 @@
54
54
  "type": "string",
55
55
  "description": "The Slack channel ID to get details for"
56
56
  },
57
- "reason": {
57
+ "activity": {
58
58
  "type": "string",
59
59
  "description": "Brief non-technical explanation of why this tool is being called"
60
60
  }
@@ -84,7 +84,7 @@
84
84
  },
85
85
  "description": "Channel IDs to add, remove, or set (not needed for 'list')"
86
86
  },
87
- "reason": {
87
+ "activity": {
88
88
  "type": "string",
89
89
  "description": "Brief non-technical explanation of why this tool is being called"
90
90
  }
@@ -118,7 +118,7 @@
118
118
  "type": "number",
119
119
  "description": "Confidence score (0-1) for this action"
120
120
  },
121
- "reason": {
121
+ "activity": {
122
122
  "type": "string",
123
123
  "description": "Brief non-technical explanation of why this tool is being called"
124
124
  }
@@ -148,7 +148,7 @@
148
148
  "type": "number",
149
149
  "description": "Confidence score (0-1) for this action"
150
150
  },
151
- "reason": {
151
+ "activity": {
152
152
  "type": "string",
153
153
  "description": "Brief non-technical explanation of why this tool is being called"
154
154
  }
@@ -182,7 +182,7 @@
182
182
  "type": "number",
183
183
  "description": "Confidence score (0-1) for this action"
184
184
  },
185
- "reason": {
185
+ "activity": {
186
186
  "type": "string",
187
187
  "description": "Brief non-technical explanation of why this tool is being called"
188
188
  }
@@ -208,7 +208,7 @@
208
208
  "type": "number",
209
209
  "description": "Confidence score (0-1) for this action"
210
210
  },
211
- "reason": {
211
+ "activity": {
212
212
  "type": "string",
213
213
  "description": "Brief non-technical explanation of why this tool is being called"
214
214
  }
@@ -258,7 +258,7 @@
258
258
  "enum": ["restricted", "standard"],
259
259
  "description": "Trust level override: 'restricted' limits tool access, 'standard' uses defaults (for 'set' action)"
260
260
  },
261
- "reason": {
261
+ "activity": {
262
262
  "type": "string",
263
263
  "description": "Brief non-technical explanation of why this tool is being called"
264
264
  }
@@ -165,7 +165,7 @@ function buildBlockKitOutput(
165
165
  type: "header",
166
166
  text: {
167
167
  type: "plain_text",
168
- text: `Slack Digest ${digests.length} channel${digests.length !== 1 ? "s" : ""} scanned`,
168
+ text: `Slack Digest - ${digests.length} channel${digests.length !== 1 ? "s" : ""} scanned`,
169
169
  },
170
170
  });
171
171
 
@@ -185,7 +185,7 @@ function buildBlockKitOutput(
185
185
  type: "section",
186
186
  text: {
187
187
  type: "mrkdwn",
188
- text: `${digest.isPrivate ? "\ud83d\udd12 " : ""}*#${digest.channelName}* _Error: ${digest.error}_`,
188
+ text: `${digest.isPrivate ? "\ud83d\udd12 " : ""}*#${digest.channelName}* - _Error: ${digest.error}_`,
189
189
  },
190
190
  });
191
191
  blocks.push({ type: "divider" });
@@ -198,7 +198,7 @@ function buildBlockKitOutput(
198
198
  type: "section",
199
199
  text: {
200
200
  type: "mrkdwn",
201
- text: `${privacyIcon}*#${digest.channelName}* ${digest.messageCount} message${digest.messageCount !== 1 ? "s" : ""}`,
201
+ text: `${privacyIcon}*#${digest.channelName}* - ${digest.messageCount} message${digest.messageCount !== 1 ? "s" : ""}`,
202
202
  },
203
203
  });
204
204
 
@@ -25,7 +25,7 @@
25
25
  "type": "boolean",
26
26
  "description": "Whether to present the subagent's result to the user when it completes. Defaults to true. Set to false for internal/silent processing."
27
27
  },
28
- "reason": {
28
+ "activity": {
29
29
  "type": "string",
30
30
  "description": "Brief non-technical explanation of why this tool is being called"
31
31
  }
@@ -47,7 +47,7 @@
47
47
  "type": "string",
48
48
  "description": "Optional subagent ID to query. If omitted, returns all subagents for this conversation."
49
49
  },
50
- "reason": {
50
+ "activity": {
51
51
  "type": "string",
52
52
  "description": "Brief non-technical explanation of why this tool is being called"
53
53
  }
@@ -69,7 +69,7 @@
69
69
  "type": "string",
70
70
  "description": "The ID of the subagent to abort."
71
71
  },
72
- "reason": {
72
+ "activity": {
73
73
  "type": "string",
74
74
  "description": "Brief non-technical explanation of why this tool is being called"
75
75
  }
@@ -95,7 +95,7 @@
95
95
  "type": "string",
96
96
  "description": "The message content to send to the subagent."
97
97
  },
98
- "reason": {
98
+ "activity": {
99
99
  "type": "string",
100
100
  "description": "Brief non-technical explanation of why this tool is being called"
101
101
  }
@@ -117,7 +117,7 @@
117
117
  "type": "string",
118
118
  "description": "The ID of the subagent whose output to read."
119
119
  },
120
- "reason": {
120
+ "activity": {
121
121
  "type": "string",
122
122
  "description": "Brief non-technical explanation of why this tool is being called"
123
123
  }
@@ -29,4 +29,4 @@ Use `task_list_add` to enqueue items (ad-hoc or from a template), `task_list_sho
29
29
  - When the user says "add to my tasks" or "add to my queue", use `task_list_add` (NOT schedule_create).
30
30
  - Use `task_save` only when the user wants to capture a conversation pattern as a reusable template.
31
31
  - `task_list` shows saved templates; `task_list_show` shows the active work queue.
32
- - **Always specify `required_tools`** when calling `task_list_add`. Think about what tools the task will need at execution time and list them explicitly (e.g. `["host_bash"]` for shell commands, `["host_file_read", "host_file_write"]` for file operations, `["web_search", "web_fetch"]` for web lookups). The user must approve these tools before the task can run omitting them forces a fallback to all tools, which is noisy and may miss non-standard tools the task actually needs.
32
+ - **Always specify `required_tools`** when calling `task_list_add`. Think about what tools the task will need at execution time and list them explicitly (e.g. `["host_bash"]` for shell commands, `["host_file_read", "host_file_write"]` for file operations, `["web_search", "web_fetch"]` for web lookups). The user must approve these tools before the task can run - omitting them forces a fallback to all tools, which is noisy and may miss non-standard tools the task actually needs.
@@ -17,7 +17,7 @@
17
17
  "type": "string",
18
18
  "description": "Optional override for the auto-generated task title"
19
19
  },
20
- "reason": {
20
+ "activity": {
21
21
  "type": "string",
22
22
  "description": "Brief non-technical explanation of why this tool is being called"
23
23
  }
@@ -50,7 +50,7 @@
50
50
  "type": "string"
51
51
  }
52
52
  },
53
- "reason": {
53
+ "activity": {
54
54
  "type": "string",
55
55
  "description": "Brief non-technical explanation of why this tool is being called"
56
56
  }
@@ -67,7 +67,7 @@
67
67
  "input_schema": {
68
68
  "type": "object",
69
69
  "properties": {
70
- "reason": {
70
+ "activity": {
71
71
  "type": "string",
72
72
  "description": "Brief non-technical explanation of why this tool is being called"
73
73
  }
@@ -91,7 +91,7 @@
91
91
  },
92
92
  "description": "One or more task IDs to delete."
93
93
  },
94
- "reason": {
94
+ "activity": {
95
95
  "type": "string",
96
96
  "description": "Brief non-technical explanation of why this tool is being called"
97
97
  }
@@ -123,7 +123,7 @@
123
123
  ],
124
124
  "description": "Optional status filter. A single status string (e.g. \"queued\") or an array of statuses to include."
125
125
  },
126
- "reason": {
126
+ "activity": {
127
127
  "type": "string",
128
128
  "description": "Brief non-technical explanation of why this tool is being called"
129
129
  }
@@ -180,7 +180,7 @@
180
180
  },
181
181
  "description": "Tools the task will need at execution time. Always specify this \u2014 think about what tools are needed to accomplish the task (e.g. [\"host_bash\"] for shell commands, [\"host_file_read\", \"host_file_write\"] for file operations, [\"web_search\"] for web lookups). The user must approve these before the task runs. Pass [] if no tools are needed."
182
182
  },
183
- "reason": {
183
+ "activity": {
184
184
  "type": "string",
185
185
  "description": "Brief non-technical explanation of why this tool is being called"
186
186
  }
@@ -259,7 +259,7 @@
259
259
  "type": "number",
260
260
  "description": "Disambiguation filter: pick the Nth oldest match (1 = oldest, 2 = second oldest, etc.) when multiple items share the same title/task_id."
261
261
  },
262
- "reason": {
262
+ "activity": {
263
263
  "type": "string",
264
264
  "description": "Brief non-technical explanation of why this tool is being called"
265
265
  }
@@ -311,7 +311,7 @@
311
311
  "type": "number",
312
312
  "description": "Disambiguator: 1-indexed creation order among matches (1 = oldest, 2 = second oldest, etc.)"
313
313
  },
314
- "reason": {
314
+ "activity": {
315
315
  "type": "string",
316
316
  "description": "Brief non-technical explanation of why this tool is being called"
317
317
  }
@@ -340,7 +340,7 @@
340
340
  "type": "string",
341
341
  "description": "Work item title to search for (case-insensitive substring match)"
342
342
  },
343
- "reason": {
343
+ "activity": {
344
344
  "type": "string",
345
345
  "description": "Brief non-technical explanation of why this tool is being called"
346
346
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: transcribe
3
- description: Transcribe audio and video files using Whisper (cloud API or local)
3
+ description: Transcribe audio and video files using Whisper
4
4
  compatibility: "Designed for Vellum personal assistants"
5
5
  metadata:
6
6
  emoji: "🎙️"
@@ -8,14 +8,14 @@ metadata:
8
8
  display-name: "Transcribe"
9
9
  ---
10
10
 
11
- Transcribe audio and video files using OpenAI's Whisper model either via the cloud API or locally via whisper.cpp.
11
+ Transcribe audio and video files using OpenAI's Whisper model - either via the cloud API or locally via whisper.cpp.
12
12
 
13
13
  ## Choosing a Mode
14
14
 
15
15
  Before transcribing, **ask the user which mode they prefer** if they haven't specified:
16
16
 
17
- 1. **`api`** Uses the OpenAI Whisper API. Fast, accurate, no setup needed. Requires an OpenAI API key (check if one is already configured). Audio is sent to OpenAI's servers. Costs ~$0.006/min.
18
- 2. **`local`** Uses whisper.cpp installed via Homebrew. Free, private, runs entirely on-device. Requires a one-time `brew install whisper-cpp`. Slightly slower but no data leaves the machine.
17
+ 1. **`api`** - Uses the OpenAI Whisper API. Fast, accurate, no setup needed. Requires an OpenAI API key (check if one is already configured). Audio is sent to OpenAI's servers. Costs ~$0.006/min.
18
+ 2. **`local`** - Uses whisper.cpp installed via Homebrew. Free, private, runs entirely on-device. Requires a one-time `brew install whisper-cpp`. Slightly slower but no data leaves the machine.
19
19
 
20
20
  If the user says "cloud", "API", or "online" → use `api`.
21
21
  If the user says "local", "offline", "private", or "on-device" → use `local`.
@@ -25,5 +25,5 @@ If the user says "local", "offline", "private", or "on-device" → use `local`.
25
25
  - The tool accepts either a `file_path` (absolute path to a local file) or an `attachment_id` (for uploaded attachments). Prefer `file_path` when the user references a file on disk.
26
26
  - Supported formats: any video (mp4, mov, etc.) or audio (mp3, wav, m4a, etc.) file.
27
27
  - For video files, audio is automatically extracted via ffmpeg before transcription.
28
- - The API mode has a 25MB per-request limit large files are automatically split into chunks.
28
+ - The API mode has a 25MB per-request limit - large files are automatically split into chunks.
29
29
  - Local mode requires whisper.cpp (`brew install whisper-cpp`). The model is downloaded automatically on first use.
@@ -22,7 +22,7 @@
22
22
  "enum": ["api", "local"],
23
23
  "description": "Transcription backend: 'api' for OpenAI Whisper API (cloud), 'local' for whisper.cpp (on-device)"
24
24
  },
25
- "reason": {
25
+ "activity": {
26
26
  "type": "string",
27
27
  "description": "Brief non-technical explanation of why this tool is being called"
28
28
  }
@@ -50,7 +50,7 @@ const AUDIO_EXTENSIONS = new Set([
50
50
  /** Max file size for a single OpenAI Whisper API request (25MB). */
51
51
  const WHISPER_API_MAX_BYTES = 25 * 1024 * 1024;
52
52
 
53
- /** Duration per chunk when splitting for the API (10 minutes stays well under 25MB as WAV). */
53
+ /** Duration per chunk when splitting for the API (10 minutes - stays well under 25MB as WAV). */
54
54
  const API_CHUNK_DURATION_SECS = 600;
55
55
 
56
56
  /** Timeout for a single Whisper API request. */
@@ -167,7 +167,7 @@ async function resolveSource(
167
167
  // Check if this is a file-backed attachment (large files stored on disk)
168
168
  const onDiskPath = getFilePathForAttachment(attachment.id);
169
169
  if (onDiskPath) {
170
- // File-backed attachment use the on-disk file directly
170
+ // File-backed attachment - use the on-disk file directly
171
171
  try {
172
172
  await access(onDiskPath);
173
173
  } catch {
@@ -183,7 +183,7 @@ async function resolveSource(
183
183
  };
184
184
  }
185
185
 
186
- // Inline attachment decode base64 to a temp file
186
+ // Inline attachment - decode base64 to a temp file
187
187
  const ext = mime.startsWith("video/") ? ".mp4" : ".m4a";
188
188
  const tempPath = join(
189
189
  tmpdir(),
@@ -217,7 +217,7 @@ async function toWav(inputPath: string, isVideo: boolean): Promise<string> {
217
217
  }
218
218
 
219
219
  // ---------------------------------------------------------------------------
220
- // API mode OpenAI Whisper API
220
+ // API mode - OpenAI Whisper API
221
221
  // ---------------------------------------------------------------------------
222
222
 
223
223
  async function transcribeViaApi(
@@ -244,7 +244,7 @@ async function transcribeViaApi(
244
244
  context.onOutput?.(
245
245
  `Large file (${Math.round(
246
246
  duration / 60,
247
- )}min) splitting into chunks...\n`,
247
+ )}min) - splitting into chunks...\n`,
248
248
  );
249
249
  const chunks = await splitAudio(
250
250
  audioPath,
@@ -305,7 +305,7 @@ async function whisperApiRequest(
305
305
  }
306
306
 
307
307
  // ---------------------------------------------------------------------------
308
- // Local mode whisper.cpp
308
+ // Local mode - whisper.cpp
309
309
  // ---------------------------------------------------------------------------
310
310
 
311
311
  async function transcribeViaLocal(
@@ -320,20 +320,20 @@ async function transcribeViaLocal(
320
320
  );
321
321
  }
322
322
 
323
- // Resolve model path use the base model, download if needed
323
+ // Resolve model path - use the base model, download if needed
324
324
  const modelPath = await resolveWhisperModel(context);
325
325
 
326
326
  const duration = await getAudioDuration(audioPath);
327
327
 
328
328
  if (duration > 0 && duration <= 1800) {
329
- // Under 30 minutes transcribe directly (whisper.cpp handles long files well)
329
+ // Under 30 minutes - transcribe directly (whisper.cpp handles long files well)
330
330
  context.onOutput?.(
331
331
  `Transcribing ${Math.round(duration / 60)}min of audio locally...\n`,
332
332
  );
333
333
  return await whisperCppRun(audioPath, modelPath);
334
334
  }
335
335
 
336
- // Very long files split into 10-minute chunks to show progress
336
+ // Very long files - split into 10-minute chunks to show progress
337
337
  const chunkDir = join(
338
338
  tmpdir(),
339
339
  `vellum-transcribe-local-chunks-${randomUUID()}`,
@@ -344,7 +344,7 @@ async function transcribeViaLocal(
344
344
  context.onOutput?.(
345
345
  `Large file (${Math.round(
346
346
  duration / 60,
347
- )}min) splitting into chunks...\n`,
347
+ )}min) - splitting into chunks...\n`,
348
348
  );
349
349
  const chunks = await splitAudio(audioPath, chunkDir, 600);
350
350
  const parts: string[] = [];
@@ -12,10 +12,10 @@ Create and manage watchers that poll external services for events and process th
12
12
 
13
13
  ## Concepts
14
14
 
15
- - **Provider** The external service to poll (e.g. "gmail"). Each provider defines how to fetch and parse events.
16
- - **Action prompt** LLM instructions for handling detected events. Sent along with event data to a background conversation.
17
- - **Poll interval** How often to check for new events (minimum 15 seconds, default 60 seconds).
18
- - **Digest** Summary of recent watcher activity, grouped by watcher with time-based filtering.
15
+ - **Provider** - The external service to poll (e.g. "gmail"). Each provider defines how to fetch and parse events.
16
+ - **Action prompt** - LLM instructions for handling detected events. Sent along with event data to a background conversation.
17
+ - **Poll interval** - How often to check for new events (minimum 15 seconds, default 60 seconds).
18
+ - **Digest** - Summary of recent watcher activity, grouped by watcher with time-based filtering.
19
19
 
20
20
  ## Lifecycle
21
21
 
@@ -33,7 +33,7 @@
33
33
  "type": "object",
34
34
  "description": "Provider-specific configuration (e.g. filter criteria)"
35
35
  },
36
- "reason": {
36
+ "activity": {
37
37
  "type": "string",
38
38
  "description": "Brief non-technical explanation of why this tool is being called"
39
39
  }
@@ -59,7 +59,7 @@
59
59
  "type": "boolean",
60
60
  "description": "When true, only show enabled watchers. Defaults to false."
61
61
  },
62
- "reason": {
62
+ "activity": {
63
63
  "type": "string",
64
64
  "description": "Brief non-technical explanation of why this tool is being called"
65
65
  }
@@ -101,7 +101,7 @@
101
101
  "type": "object",
102
102
  "description": "New provider-specific configuration"
103
103
  },
104
- "reason": {
104
+ "activity": {
105
105
  "type": "string",
106
106
  "description": "Brief non-technical explanation of why this tool is being called"
107
107
  }
@@ -123,7 +123,7 @@
123
123
  "type": "string",
124
124
  "description": "The ID of the watcher to delete"
125
125
  },
126
- "reason": {
126
+ "activity": {
127
127
  "type": "string",
128
128
  "description": "Brief non-technical explanation of why this tool is being called"
129
129
  }
@@ -153,7 +153,7 @@
153
153
  "type": "number",
154
154
  "description": "Maximum number of events to return. Defaults to 50."
155
155
  },
156
- "reason": {
156
+ "activity": {
157
157
  "type": "string",
158
158
  "description": "Brief non-technical explanation of why this tool is being called"
159
159
  }
@@ -41,14 +41,6 @@
41
41
  "description": "Enable multi-file TSX app creation with esbuild compilation instead of single-HTML apps",
42
42
  "defaultEnabled": false
43
43
  },
44
- {
45
- "id": "sentry-testing",
46
- "scope": "macos",
47
- "key": "sentry_testing_enabled",
48
- "label": "Sentry Testing",
49
- "description": "Show the Sentry Testing tab in Settings for triggering test crash reports and error events",
50
- "defaultEnabled": false
51
- },
52
44
  {
53
45
  "id": "mobile-pairing",
54
46
  "scope": "macos",
@@ -226,19 +218,43 @@
226
218
  "defaultEnabled": false
227
219
  },
228
220
  {
229
- "id": "thread-starters",
230
- "scope": "macos",
231
- "key": "thread_starters_enabled",
232
- "label": "Thread Starters",
233
- "description": "Show personalized thread starter suggestions on the empty conversation page",
221
+ "id": "integration-notion",
222
+ "scope": "assistant",
223
+ "key": "feature_flags.integration-notion.enabled",
224
+ "label": "Notion Integration",
225
+ "description": "Enable the Notion setup skill for connecting to Notion",
226
+ "defaultEnabled": false
227
+ },
228
+ {
229
+ "id": "conversation-starters",
230
+ "scope": "assistant",
231
+ "key": "feature_flags.conversation-starters.enabled",
232
+ "label": "Recommended Starts",
233
+ "description": "Show a curated row of recommended starting actions on the empty conversation page, ordered by relevance as confident first-click options",
234
+ "defaultEnabled": true
235
+ },
236
+ {
237
+ "id": "deploy-to-vercel",
238
+ "scope": "assistant",
239
+ "key": "feature_flags.deploy-to-vercel.enabled",
240
+ "label": "Deploy to Vercel",
241
+ "description": "Enable the Deploy to Vercel / Publish option in the app workspace header share menu",
242
+ "defaultEnabled": false
243
+ },
244
+ {
245
+ "id": "managed-google-oauth",
246
+ "scope": "assistant",
247
+ "key": "feature_flags.managed-google-oauth.enabled",
248
+ "label": "Managed Google OAuth",
249
+ "description": "Show the Google OAuth service card in Models & Services settings",
234
250
  "defaultEnabled": false
235
251
  },
236
252
  {
237
- "id": "capability-feed",
253
+ "id": "quick-input",
238
254
  "scope": "macos",
239
- "key": "capability_feed_enabled",
240
- "label": "Capability Feed",
241
- "description": "Show the scrollable capability cards feed below the hero on the new thread page",
255
+ "key": "quick_input_enabled",
256
+ "label": "Quick Input",
257
+ "description": "Enable the Quick Input popover on right-click of the menu bar icon",
242
258
  "defaultEnabled": false
243
259
  }
244
260
  ]
@@ -4,7 +4,7 @@ export const SandboxConfigSchema = z
4
4
  .object({
5
5
  enabled: z
6
6
  .boolean({ error: "sandbox.enabled must be a boolean" })
7
- .default(true)
7
+ .default(false)
8
8
  .describe(
9
9
  "Whether to run tool executions in a sandboxed environment for safety",
10
10
  ),
@@ -17,7 +17,7 @@ export const VALID_IMAGE_GEN_PROVIDERS = ["gemini", "openai"] as const;
17
17
  export const VALID_WEB_SEARCH_PROVIDERS = [
18
18
  "perplexity",
19
19
  "brave",
20
- "anthropic-native",
20
+ "inference-provider-native",
21
21
  ] as const;
22
22
 
23
23
  export const InferenceServiceSchema = z.object({
@@ -30,7 +30,7 @@ export type InferenceService = z.infer<typeof InferenceServiceSchema>;
30
30
  export const ImageGenerationServiceSchema = z.object({
31
31
  mode: ServiceModeSchema.default("your-own"),
32
32
  provider: z.enum(VALID_IMAGE_GEN_PROVIDERS).default("gemini"),
33
- model: z.string().default("gemini-2.5-flash-image"),
33
+ model: z.string().default("gemini-3.1-flash-image-preview"),
34
34
  });
35
35
  export type ImageGenerationService = z.infer<
36
36
  typeof ImageGenerationServiceSchema
@@ -38,10 +38,17 @@ export type ImageGenerationService = z.infer<
38
38
 
39
39
  export const WebSearchServiceSchema = z.object({
40
40
  mode: ServiceModeSchema.default("your-own"),
41
- provider: z.enum(VALID_WEB_SEARCH_PROVIDERS).default("anthropic-native"),
41
+ provider: z
42
+ .enum(VALID_WEB_SEARCH_PROVIDERS)
43
+ .default("inference-provider-native"),
42
44
  });
43
45
  export type WebSearchService = z.infer<typeof WebSearchServiceSchema>;
44
46
 
47
+ export const GoogleOAuthServiceSchema = z.object({
48
+ mode: ServiceModeSchema.default("managed"),
49
+ });
50
+ export type GoogleOAuthService = z.infer<typeof GoogleOAuthServiceSchema>;
51
+
45
52
  export const ServicesSchema = z.object({
46
53
  inference: InferenceServiceSchema.default(InferenceServiceSchema.parse({})),
47
54
  "image-generation": ImageGenerationServiceSchema.default(
@@ -50,5 +57,8 @@ export const ServicesSchema = z.object({
50
57
  "web-search": WebSearchServiceSchema.default(
51
58
  WebSearchServiceSchema.parse({}),
52
59
  ),
60
+ "google-oauth": GoogleOAuthServiceSchema.default(
61
+ GoogleOAuthServiceSchema.parse({}),
62
+ ),
53
63
  });
54
64
  export type Services = z.infer<typeof ServicesSchema>;
@@ -53,16 +53,6 @@ export const RateLimitConfigSchema = z
53
53
  )
54
54
  .default(0)
55
55
  .describe("Maximum number of LLM requests per minute (0 = unlimited)"),
56
- maxTokensPerSession: z
57
- .number({ error: "rateLimit.maxTokensPerSession must be a number" })
58
- .int("rateLimit.maxTokensPerSession must be an integer")
59
- .nonnegative(
60
- "rateLimit.maxTokensPerSession must be a non-negative integer",
61
- )
62
- .default(0)
63
- .describe(
64
- "Maximum total tokens (input + output) per conversation session (0 = unlimited)",
65
- ),
66
56
  })
67
57
  .describe("Rate limiting for LLM provider requests");
68
58
 
@@ -900,6 +900,69 @@ export function updateChannelLastSeenById(channelId: string): void {
900
900
  .run();
901
901
  }
902
902
 
903
+ /**
904
+ * Update a guardian contact's principalId and its channel's identity fields.
905
+ * Used for healing guardian binding drift when the JWT principal no longer
906
+ * matches the stored guardian binding after a DB reset.
907
+ *
908
+ * Returns false if the update would violate the unique (type, address)
909
+ * constraint on contact_channels — e.g. when the incoming principal already
910
+ * exists on another channel record (a revoked former guardian entry).
911
+ * In that case the heal is skipped and trust stays `unknown`.
912
+ */
913
+ export function updateContactPrincipalAndChannel(
914
+ contactId: string,
915
+ channelId: string,
916
+ newPrincipalId: string,
917
+ ): boolean {
918
+ const db = getDb();
919
+ const now = Date.now();
920
+ const normalizedAddress = newPrincipalId.toLowerCase();
921
+
922
+ // Look up the channel we're about to update so we know its type.
923
+ const channel = db
924
+ .select()
925
+ .from(contactChannels)
926
+ .where(eq(contactChannels.id, channelId))
927
+ .get();
928
+ if (!channel) return false;
929
+
930
+ // Guard: check if another channel row already holds this (type, address).
931
+ const conflicting = db
932
+ .select()
933
+ .from(contactChannels)
934
+ .where(
935
+ and(
936
+ eq(contactChannels.type, channel.type),
937
+ eq(contactChannels.address, normalizedAddress),
938
+ ),
939
+ )
940
+ .get();
941
+
942
+ if (conflicting && conflicting.id !== channelId) {
943
+ return false;
944
+ }
945
+
946
+ db.transaction(() => {
947
+ db.update(contacts)
948
+ .set({ principalId: newPrincipalId, updatedAt: now })
949
+ .where(eq(contacts.id, contactId))
950
+ .run();
951
+
952
+ db.update(contactChannels)
953
+ .set({
954
+ externalUserId: newPrincipalId,
955
+ address: normalizedAddress,
956
+ updatedAt: now,
957
+ })
958
+ .where(eq(contactChannels.id, channelId))
959
+ .run();
960
+ });
961
+
962
+ emitContactChange();
963
+ return true;
964
+ }
965
+
903
966
  /**
904
967
  * Atomically increment interactionCount and set lastInteraction on a contact channel.
905
968
  * Optimized for the hot path — single UPDATE with no prior SELECT.
@@ -145,7 +145,7 @@ export function upsertContactChannel(params: {
145
145
  policy?: string;
146
146
  status?: string;
147
147
  inviteId?: string;
148
- createdByConversationId?: string;
148
+ sourceConversationId?: string;
149
149
  verifiedAt?: number;
150
150
  verifiedVia?: string;
151
151
  role?: ContactRole;
@@ -17,8 +17,8 @@ import {
17
17
  // Constants
18
18
  // ---------------------------------------------------------------------------
19
19
 
20
- /** Maximum size in bytes for a single assistant attachment (50 MB). */
21
- export const MAX_ASSISTANT_ATTACHMENT_BYTES = 50 * 1024 * 1024;
20
+ /** Maximum size in bytes for a single assistant attachment (100 MB). */
21
+ export const MAX_ASSISTANT_ATTACHMENT_BYTES = 100 * 1024 * 1024;
22
22
 
23
23
  // ---------------------------------------------------------------------------
24
24
  // Types