@vellumai/assistant 0.4.44 → 0.4.45

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 (681) hide show
  1. package/.prettierignore +4 -0
  2. package/ARCHITECTURE.md +34 -31
  3. package/README.md +4 -4
  4. package/bun.lock +10 -35
  5. package/docs/architecture/integrations.md +102 -197
  6. package/docs/architecture/keychain-broker.md +1 -1
  7. package/docs/architecture/memory.md +2 -2
  8. package/docs/architecture/scheduling.md +1 -1
  9. package/docs/architecture/security.md +11 -11
  10. package/docs/error-handling.md +1 -1
  11. package/docs/trusted-contact-access.md +3 -3
  12. package/drizzle/meta/0000_snapshot.json +34 -100
  13. package/drizzle/meta/_journal.json +1 -1
  14. package/drizzle.config.ts +4 -4
  15. package/package.json +3 -2
  16. package/scripts/capture-x-graphql.ts +237 -141
  17. package/scripts/generate-bundled-tool-registry.ts +223 -0
  18. package/src/__tests__/access-request-decision.test.ts +0 -1
  19. package/src/__tests__/actor-token-service.test.ts +23 -24
  20. package/src/__tests__/agent-loop.test.ts +0 -131
  21. package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
  22. package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
  23. package/src/__tests__/approval-primitive.test.ts +0 -1
  24. package/src/__tests__/approval-routes-http.test.ts +11 -1
  25. package/src/__tests__/asset-materialize-tool.test.ts +0 -1
  26. package/src/__tests__/asset-search-tool.test.ts +0 -1
  27. package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
  28. package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
  29. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
  30. package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
  31. package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
  32. package/src/__tests__/attachments-store.test.ts +0 -1
  33. package/src/__tests__/avatar-e2e.test.ts +74 -115
  34. package/src/__tests__/avatar-router.test.ts +25 -62
  35. package/src/__tests__/browser-manager.test.ts +24 -0
  36. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
  37. package/src/__tests__/browser-skill-endstate.test.ts +8 -11
  38. package/src/__tests__/btw-routes.test.ts +326 -0
  39. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
  40. package/src/__tests__/call-controller.test.ts +0 -1
  41. package/src/__tests__/call-conversation-messages.test.ts +0 -1
  42. package/src/__tests__/call-domain.test.ts +0 -1
  43. package/src/__tests__/call-pointer-messages.test.ts +0 -1
  44. package/src/__tests__/call-recovery.test.ts +0 -1
  45. package/src/__tests__/call-routes-http.test.ts +0 -1
  46. package/src/__tests__/call-store.test.ts +0 -1
  47. package/src/__tests__/canonical-guardian-store.test.ts +0 -1
  48. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  49. package/src/__tests__/channel-approvals.test.ts +1 -1
  50. package/src/__tests__/channel-delivery-store.test.ts +0 -1
  51. package/src/__tests__/channel-guardian.test.ts +5 -7
  52. package/src/__tests__/channel-retry-sweep.test.ts +0 -1
  53. package/src/__tests__/checker.test.ts +4 -11
  54. package/src/__tests__/compaction.benchmark.test.ts +16 -14
  55. package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
  56. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  57. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
  58. package/src/__tests__/computer-use-tools.test.ts +35 -31
  59. package/src/__tests__/config-schema.test.ts +11 -15
  60. package/src/__tests__/config-watcher.test.ts +0 -1
  61. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  62. package/src/__tests__/conflict-store.test.ts +0 -1
  63. package/src/__tests__/connection-policy.test.ts +4 -7
  64. package/src/__tests__/contacts-tools.test.ts +0 -1
  65. package/src/__tests__/context-memory-e2e.test.ts +2 -4
  66. package/src/__tests__/context-overflow-reducer.test.ts +2 -4
  67. package/src/__tests__/context-window-manager.test.ts +147 -60
  68. package/src/__tests__/contradiction-checker.test.ts +0 -1
  69. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  70. package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
  71. package/src/__tests__/conversation-pairing.test.ts +2 -2
  72. package/src/__tests__/conversation-routes-guardian-reply.test.ts +25 -1
  73. package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
  74. package/src/__tests__/conversation-store.test.ts +0 -1
  75. package/src/__tests__/conversation-unread-route.test.ts +1 -2
  76. package/src/__tests__/credential-security-invariants.test.ts +7 -8
  77. package/src/__tests__/cross-provider-web-search.test.ts +353 -0
  78. package/src/__tests__/daemon-assistant-events.test.ts +6 -7
  79. package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
  80. package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
  81. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
  82. package/src/__tests__/diagnostics-export.test.ts +189 -0
  83. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  84. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  85. package/src/__tests__/entity-extractor.test.ts +0 -1
  86. package/src/__tests__/entity-search.test.ts +0 -1
  87. package/src/__tests__/ephemeral-permissions.test.ts +2 -4
  88. package/src/__tests__/file-read-tool.test.ts +86 -0
  89. package/src/__tests__/followup-tools.test.ts +0 -1
  90. package/src/__tests__/frontmatter.test.ts +77 -34
  91. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  92. package/src/__tests__/gateway-only-guard.test.ts +1 -1
  93. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
  94. package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
  95. package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
  96. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  97. package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
  98. package/src/__tests__/guardian-action-store.test.ts +0 -1
  99. package/src/__tests__/guardian-action-sweep.test.ts +0 -1
  100. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  101. package/src/__tests__/guardian-dispatch.test.ts +1 -2
  102. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  103. package/src/__tests__/guardian-outbound-http.test.ts +0 -1
  104. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
  105. package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
  106. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  107. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  108. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
  109. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
  110. package/src/__tests__/host-bash-proxy.test.ts +335 -0
  111. package/src/__tests__/host-file-proxy.test.ts +374 -0
  112. package/src/__tests__/host-shell-tool.test.ts +147 -1
  113. package/src/__tests__/http-user-message-parity.test.ts +361 -0
  114. package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
  115. package/src/__tests__/integration-status.test.ts +3 -8
  116. package/src/__tests__/intent-routing.test.ts +7 -46
  117. package/src/__tests__/invite-redemption-service.test.ts +0 -1
  118. package/src/__tests__/invite-routes-http.test.ts +0 -1
  119. package/src/__tests__/llm-usage-store.test.ts +0 -1
  120. package/src/__tests__/managed-avatar-client.test.ts +101 -55
  121. package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
  122. package/src/__tests__/managed-store.test.ts +94 -21
  123. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
  124. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
  125. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
  126. package/src/__tests__/memory-recall-quality.test.ts +0 -1
  127. package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
  128. package/src/__tests__/memory-regressions.test.ts +0 -1
  129. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
  130. package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
  131. package/src/__tests__/messaging-send-tool.test.ts +35 -0
  132. package/src/__tests__/messaging-skill-split.test.ts +138 -0
  133. package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
  134. package/src/__tests__/migration-export-http.test.ts +2 -3
  135. package/src/__tests__/migration-import-commit-http.test.ts +1 -2
  136. package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
  137. package/src/__tests__/migration-validate-http.test.ts +1 -2
  138. package/src/__tests__/native-web-search.test.ts +475 -0
  139. package/src/__tests__/navigate-settings-tab.test.ts +84 -0
  140. package/src/__tests__/non-member-access-request.test.ts +0 -1
  141. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  142. package/src/__tests__/notification-decision-strategy.test.ts +6 -6
  143. package/src/__tests__/notification-deep-link.test.ts +7 -7
  144. package/src/__tests__/notification-guardian-path.test.ts +2 -3
  145. package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
  146. package/src/__tests__/notification-thread-candidates.test.ts +4 -4
  147. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  148. package/src/__tests__/playbook-execution.test.ts +0 -1
  149. package/src/__tests__/playbook-tools.test.ts +0 -1
  150. package/src/__tests__/profile-compiler.test.ts +0 -1
  151. package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
  152. package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
  153. package/src/__tests__/recording-handler.test.ts +30 -94
  154. package/src/__tests__/registry.test.ts +28 -35
  155. package/src/__tests__/relay-server.test.ts +0 -1
  156. package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
  157. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  158. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  159. package/src/__tests__/runtime-events-sse.test.ts +0 -1
  160. package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
  161. package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
  162. package/src/__tests__/schedule-store.test.ts +441 -1
  163. package/src/__tests__/schedule-tools.test.ts +468 -7
  164. package/src/__tests__/scheduler-recurrence.test.ts +196 -23
  165. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  166. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  167. package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
  168. package/src/__tests__/secret-response-routing.test.ts +4 -1
  169. package/src/__tests__/send-endpoint-busy.test.ts +14 -2
  170. package/src/__tests__/send-notification-tool.test.ts +0 -7
  171. package/src/__tests__/sequence-store.test.ts +0 -1
  172. package/src/__tests__/server-history-render.test.ts +1 -2
  173. package/src/__tests__/session-abort-tool-results.test.ts +0 -1
  174. package/src/__tests__/session-agent-loop.test.ts +46 -6
  175. package/src/__tests__/session-confirmation-signals.test.ts +0 -1
  176. package/src/__tests__/session-conflict-gate.test.ts +2 -6
  177. package/src/__tests__/session-error.test.ts +5 -14
  178. package/src/__tests__/session-init.benchmark.test.ts +3 -5
  179. package/src/__tests__/session-load-history-repair.test.ts +0 -1
  180. package/src/__tests__/session-media-retry.test.ts +12 -74
  181. package/src/__tests__/session-pre-run-repair.test.ts +0 -1
  182. package/src/__tests__/session-profile-injection.test.ts +2 -6
  183. package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
  184. package/src/__tests__/session-queue.test.ts +94 -139
  185. package/src/__tests__/session-skill-tools.test.ts +115 -115
  186. package/src/__tests__/session-slash-known.test.ts +0 -1
  187. package/src/__tests__/session-slash-queue.test.ts +0 -1
  188. package/src/__tests__/session-slash-unknown.test.ts +0 -1
  189. package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
  190. package/src/__tests__/session-usage.test.ts +0 -1
  191. package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
  192. package/src/__tests__/session-workspace-injection.test.ts +2 -6
  193. package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
  194. package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
  195. package/src/__tests__/skill-feature-flags.test.ts +125 -18
  196. package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
  197. package/src/__tests__/skill-load-tool.test.ts +194 -2
  198. package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
  199. package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
  200. package/src/__tests__/skills.test.ts +14 -53
  201. package/src/__tests__/slack-channel-config.test.ts +0 -1
  202. package/src/__tests__/slack-inbound-verification.test.ts +0 -1
  203. package/src/__tests__/slack-skill.test.ts +1 -1
  204. package/src/__tests__/subagent-tools.test.ts +2 -2
  205. package/src/__tests__/system-prompt.test.ts +4 -3
  206. package/src/__tests__/task-compiler.test.ts +0 -1
  207. package/src/__tests__/task-management-tools.test.ts +0 -1
  208. package/src/__tests__/task-memory-cleanup.test.ts +0 -1
  209. package/src/__tests__/task-runner.test.ts +0 -1
  210. package/src/__tests__/task-scheduler.test.ts +0 -1
  211. package/src/__tests__/terminal-tools.test.ts +0 -1
  212. package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
  213. package/src/__tests__/thread-seed-composer.test.ts +5 -5
  214. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  215. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  216. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  217. package/src/__tests__/tool-executor.test.ts +8 -86
  218. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  219. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  220. package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
  221. package/src/__tests__/trust-store.test.ts +80 -4
  222. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  223. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  224. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
  225. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  226. package/src/__tests__/trusted-contact-verification.test.ts +0 -1
  227. package/src/__tests__/twilio-provider.test.ts +0 -1
  228. package/src/__tests__/twilio-routes.test.ts +0 -1
  229. package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
  230. package/src/__tests__/update-bulletin.test.ts +0 -1
  231. package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
  232. package/src/__tests__/usage-routes.test.ts +0 -1
  233. package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
  234. package/src/__tests__/voice-invite-redemption.test.ts +0 -1
  235. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  236. package/src/__tests__/voice-session-bridge.test.ts +9 -1
  237. package/src/__tests__/web-fetch.test.ts +57 -0
  238. package/src/__tests__/workspace-git-service.test.ts +5 -14
  239. package/src/__tests__/workspace-policy.test.ts +0 -1
  240. package/src/agent/loop.ts +22 -34
  241. package/src/bundler/bundle-signer.ts +4 -4
  242. package/src/calls/call-controller.ts +1 -1
  243. package/src/calls/relay-server.ts +1 -1
  244. package/src/calls/twilio-rest.ts +1 -1
  245. package/src/calls/voice-session-bridge.ts +3 -1
  246. package/src/cli/__tests__/notifications.test.ts +3 -4
  247. package/src/cli/commands/map.ts +2 -6
  248. package/src/cli/commands/mcp.ts +73 -15
  249. package/src/cli/commands/notifications.ts +4 -4
  250. package/src/cli/commands/sessions.ts +9 -1
  251. package/src/cli/commands/skills.ts +6 -10
  252. package/src/cli/http-client.ts +2 -3
  253. package/src/cli/main-screen.tsx +10 -10
  254. package/src/cli/program.ts +0 -4
  255. package/src/cli/reference.ts +0 -2
  256. package/src/cli.ts +15 -9
  257. package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
  258. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
  259. package/src/config/bundled-skills/app-builder/SKILL.md +6 -1
  260. package/src/config/bundled-skills/browser/SKILL.md +6 -1
  261. package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
  262. package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
  263. package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
  264. package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
  265. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
  266. package/src/config/bundled-skills/contacts/SKILL.md +10 -1
  267. package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
  268. package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
  269. package/src/config/bundled-skills/document/SKILL.md +4 -1
  270. package/src/config/bundled-skills/doordash/SKILL.md +8 -1
  271. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
  272. package/src/config/bundled-skills/followups/SKILL.md +4 -1
  273. package/src/config/bundled-skills/gmail/SKILL.md +180 -0
  274. package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
  275. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
  276. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
  277. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
  278. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
  279. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
  280. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
  281. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
  282. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
  283. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
  284. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
  285. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
  286. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
  287. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
  288. package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
  289. package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
  290. package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
  291. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
  292. package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
  293. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
  294. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
  295. package/src/config/bundled-skills/messaging/SKILL.md +23 -139
  296. package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
  297. package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
  298. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
  299. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
  300. package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
  301. package/src/config/bundled-skills/notifications/SKILL.md +5 -1
  302. package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
  303. package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
  304. package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → orchestration/tools/swarm-delegate.ts} +3 -3
  305. package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
  306. package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
  307. package/src/config/bundled-skills/schedule/SKILL.md +70 -9
  308. package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
  309. package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
  310. package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
  311. package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
  312. package/src/config/bundled-skills/sequences/SKILL.md +47 -0
  313. package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
  314. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
  315. package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
  316. package/src/config/bundled-skills/settings/SKILL.md +12 -0
  317. package/src/config/bundled-skills/settings/TOOLS.json +112 -0
  318. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
  319. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
  320. package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
  321. package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
  322. package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
  323. package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
  324. package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
  325. package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
  326. package/src/config/bundled-skills/slack/SKILL.md +5 -1
  327. package/src/config/bundled-skills/subagent/SKILL.md +4 -1
  328. package/src/config/bundled-skills/tasks/SKILL.md +5 -2
  329. package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
  330. package/src/config/bundled-skills/watcher/SKILL.md +4 -1
  331. package/src/config/bundled-tool-registry.ts +118 -107
  332. package/src/config/env.ts +5 -2
  333. package/src/config/feature-flag-registry.json +25 -9
  334. package/src/config/loader.ts +10 -2
  335. package/src/config/schema.ts +19 -16
  336. package/src/config/schemas/inference.ts +12 -22
  337. package/src/config/schemas/memory-storage.ts +19 -1
  338. package/src/config/schemas/platform.ts +0 -16
  339. package/src/config/skill-state.ts +11 -8
  340. package/src/config/skills.ts +83 -32
  341. package/src/context/token-estimator.ts +11 -0
  342. package/src/context/window-manager.ts +180 -151
  343. package/src/daemon/computer-use-session.ts +11 -43
  344. package/src/daemon/daemon-control.ts +4 -1
  345. package/src/daemon/handlers/config-channels.ts +5 -9
  346. package/src/daemon/handlers/config-ingress.ts +0 -4
  347. package/src/daemon/handlers/config-model.ts +7 -13
  348. package/src/daemon/handlers/config-telegram.ts +4 -8
  349. package/src/daemon/handlers/config-voice.ts +2 -5
  350. package/src/daemon/handlers/dictation.ts +2 -12
  351. package/src/daemon/handlers/identity.ts +0 -105
  352. package/src/daemon/handlers/recording.ts +3 -23
  353. package/src/daemon/handlers/session-history.ts +1 -1
  354. package/src/daemon/handlers/sessions.ts +53 -72
  355. package/src/daemon/handlers/shared.ts +7 -28
  356. package/src/daemon/handlers/skills.ts +31 -27
  357. package/src/daemon/host-bash-proxy.ts +148 -0
  358. package/src/daemon/host-file-proxy.ts +135 -0
  359. package/src/daemon/lifecycle.ts +49 -24
  360. package/src/daemon/mcp-reload-service.ts +123 -0
  361. package/src/daemon/message-protocol.ts +6 -0
  362. package/src/daemon/message-types/browser.ts +1 -1
  363. package/src/daemon/message-types/computer-use.ts +1 -4
  364. package/src/daemon/message-types/guardian-actions.ts +1 -1
  365. package/src/daemon/message-types/host-bash.ts +18 -0
  366. package/src/daemon/message-types/host-file.ts +44 -0
  367. package/src/daemon/message-types/integrations.ts +1 -67
  368. package/src/daemon/message-types/messages.ts +15 -0
  369. package/src/daemon/message-types/schedules.ts +11 -27
  370. package/src/daemon/message-types/sessions.ts +2 -1
  371. package/src/daemon/message-types/settings.ts +1 -1
  372. package/src/daemon/message-types/shared.ts +1 -1
  373. package/src/daemon/ride-shotgun-handler.ts +2 -42
  374. package/src/daemon/server.ts +43 -10
  375. package/src/daemon/session-agent-loop-handlers.ts +48 -7
  376. package/src/daemon/session-agent-loop.ts +97 -66
  377. package/src/daemon/session-attachments.ts +1 -1
  378. package/src/daemon/session-error.ts +17 -16
  379. package/src/daemon/session-lifecycle.ts +20 -1
  380. package/src/daemon/session-media-retry.ts +1 -15
  381. package/src/daemon/session-messaging.ts +14 -6
  382. package/src/daemon/session-process.ts +36 -7
  383. package/src/daemon/session-queue-manager.ts +62 -103
  384. package/src/daemon/session-runtime-assembly.ts +27 -0
  385. package/src/daemon/session-skill-tools.ts +12 -11
  386. package/src/daemon/session-slash.ts +7 -0
  387. package/src/daemon/session-surfaces.ts +19 -97
  388. package/src/daemon/session-tool-setup.ts +146 -6
  389. package/src/daemon/session.ts +77 -13
  390. package/src/errors.ts +0 -2
  391. package/src/export/formatter.ts +6 -0
  392. package/src/mcp/mcp-oauth-provider.ts +1 -3
  393. package/src/media/avatar-router.ts +20 -28
  394. package/src/media/avatar-types.ts +7 -14
  395. package/src/media/managed-avatar-client.ts +70 -34
  396. package/src/memory/conversation-title-service.ts +1 -2
  397. package/src/memory/db-init.ts +16 -0
  398. package/src/memory/embedding-backend.ts +129 -27
  399. package/src/memory/embedding-gemini.test.ts +256 -0
  400. package/src/memory/embedding-gemini.ts +47 -13
  401. package/src/memory/embedding-local.ts +14 -2
  402. package/src/memory/embedding-ollama.ts +15 -2
  403. package/src/memory/embedding-openai.ts +15 -2
  404. package/src/memory/embedding-types.test.ts +116 -0
  405. package/src/memory/embedding-types.ts +61 -0
  406. package/src/memory/fingerprint.ts +1 -1
  407. package/src/memory/indexer.ts +25 -1
  408. package/src/memory/job-handlers/embedding.test.ts +258 -0
  409. package/src/memory/job-handlers/embedding.ts +81 -1
  410. package/src/memory/job-handlers/index-maintenance.ts +35 -1
  411. package/src/memory/job-handlers/media-processing.ts +11 -1
  412. package/src/memory/job-utils.ts +21 -6
  413. package/src/memory/jobs-store.ts +5 -1
  414. package/src/memory/jobs-worker.ts +8 -0
  415. package/src/memory/message-content.ts +66 -0
  416. package/src/memory/migrations/100-core-tables.ts +1 -31
  417. package/src/memory/migrations/104-core-indexes.ts +0 -11
  418. package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
  419. package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
  420. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
  421. package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
  422. package/src/memory/migrations/index.ts +4 -0
  423. package/src/memory/migrations/registry.ts +19 -0
  424. package/src/memory/qdrant-client.ts +158 -43
  425. package/src/memory/retriever.test.ts +0 -1
  426. package/src/memory/retriever.ts +12 -2
  427. package/src/memory/schema/infrastructure.ts +5 -29
  428. package/src/memory/search/formatting.ts +34 -9
  429. package/src/memory/search/semantic.ts +57 -2
  430. package/src/memory/search/types.ts +2 -1
  431. package/src/notifications/AGENTS.md +2 -2
  432. package/src/notifications/README.md +59 -58
  433. package/src/notifications/adapters/macos.ts +1 -1
  434. package/src/notifications/broadcaster.ts +5 -5
  435. package/src/notifications/copy-composer.ts +1 -1
  436. package/src/notifications/decision-engine.ts +2 -2
  437. package/src/notifications/destination-resolver.ts +2 -2
  438. package/src/notifications/emit-signal.ts +8 -8
  439. package/src/notifications/signal.ts +1 -1
  440. package/src/notifications/thread-seed-composer.ts +1 -1
  441. package/src/oauth/connect-orchestrator.ts +1 -1
  442. package/src/oauth/token-persistence.ts +1 -1
  443. package/src/permissions/checker.ts +12 -1
  444. package/src/permissions/defaults.ts +10 -14
  445. package/src/permissions/trust-store.ts +37 -0
  446. package/src/permissions/workspace-policy.ts +0 -1
  447. package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
  448. package/src/prompts/computer-use-prompt.ts +1 -1
  449. package/src/prompts/system-prompt.ts +29 -30
  450. package/src/prompts/templates/SOUL.md +1 -2
  451. package/src/prompts/templates/UPDATES.md +16 -7
  452. package/src/providers/anthropic/client.ts +87 -33
  453. package/src/providers/gemini/client.ts +6 -0
  454. package/src/providers/managed-proxy/constants.ts +5 -0
  455. package/src/providers/openai/client.ts +15 -0
  456. package/src/providers/registry.ts +2 -2
  457. package/src/providers/types.ts +24 -2
  458. package/src/runtime/AGENTS.md +18 -0
  459. package/src/runtime/assistant-event-hub.ts +2 -3
  460. package/src/runtime/assistant-event.ts +4 -4
  461. package/src/runtime/auth/__tests__/context.test.ts +5 -5
  462. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  463. package/src/runtime/auth/__tests__/guard-tests.test.ts +2 -2
  464. package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
  465. package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
  466. package/src/runtime/auth/__tests__/scopes.test.ts +7 -7
  467. package/src/runtime/auth/__tests__/subject.test.ts +8 -8
  468. package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
  469. package/src/runtime/auth/route-policy.ts +8 -4
  470. package/src/runtime/auth/scopes.ts +1 -1
  471. package/src/runtime/auth/subject.ts +4 -4
  472. package/src/runtime/auth/token-service.ts +0 -23
  473. package/src/runtime/auth/types.ts +3 -3
  474. package/src/runtime/guardian-action-followup-executor.ts +1 -1
  475. package/src/runtime/guardian-action-grant-minter.ts +1 -1
  476. package/src/runtime/guardian-action-service.ts +3 -3
  477. package/src/runtime/http-server.ts +15 -2
  478. package/src/runtime/invite-service.ts +3 -3
  479. package/src/runtime/local-actor-identity.ts +17 -22
  480. package/src/runtime/pending-interactions.ts +21 -9
  481. package/src/runtime/routes/app-management-routes.ts +2 -3
  482. package/src/runtime/routes/approval-routes.ts +1 -3
  483. package/src/runtime/routes/btw-routes.ts +155 -0
  484. package/src/runtime/routes/computer-use-routes.ts +77 -31
  485. package/src/runtime/routes/conversation-routes.ts +230 -46
  486. package/src/runtime/routes/diagnostics-routes.ts +63 -29
  487. package/src/runtime/routes/documents-routes.ts +2 -2
  488. package/src/runtime/routes/global-search-routes.ts +1 -1
  489. package/src/runtime/routes/host-bash-routes.ts +83 -0
  490. package/src/runtime/routes/host-file-routes.ts +79 -0
  491. package/src/runtime/routes/integrations/slack/share.ts +1 -1
  492. package/src/runtime/routes/log-export-routes.ts +120 -0
  493. package/src/runtime/routes/mcp-routes.ts +20 -0
  494. package/src/runtime/routes/migration-routes.ts +3 -3
  495. package/src/runtime/routes/pairing-routes.ts +1 -1
  496. package/src/runtime/routes/recording-routes.ts +6 -4
  497. package/src/runtime/routes/schedule-routes.ts +31 -5
  498. package/src/runtime/routes/session-management-routes.ts +2 -6
  499. package/src/runtime/routes/session-query-routes.ts +18 -15
  500. package/src/runtime/routes/settings-routes.ts +7 -261
  501. package/src/runtime/routes/skills-routes.ts +7 -6
  502. package/src/runtime/routes/subagents-routes.ts +4 -10
  503. package/src/runtime/routes/surface-action-routes.ts +3 -14
  504. package/src/runtime/routes/surface-content-routes.ts +22 -5
  505. package/src/runtime/routes/work-items-routes.ts +21 -25
  506. package/src/runtime/routes/workspace-routes.test.ts +3 -3
  507. package/src/runtime/routes/workspace-utils.ts +1 -1
  508. package/src/runtime/telegram-streaming-delivery.ts +3 -0
  509. package/src/runtime/verification-outbound-actions.ts +2 -2
  510. package/src/schedule/integration-status.ts +0 -6
  511. package/src/schedule/schedule-store.ts +234 -43
  512. package/src/schedule/scheduler.ts +73 -74
  513. package/src/security/oauth2.ts +1 -1
  514. package/src/sequence/store.ts +12 -2
  515. package/src/skills/frontmatter.ts +19 -77
  516. package/src/skills/managed-store.ts +11 -2
  517. package/src/subagent/manager.ts +5 -3
  518. package/src/tasks/ephemeral-permissions.ts +3 -5
  519. package/src/tools/AGENTS.md +0 -1
  520. package/src/tools/browser/browser-manager.ts +17 -11
  521. package/src/tools/browser/jit-auth.ts +4 -1
  522. package/src/tools/claude-code/claude-code.ts +1 -1
  523. package/src/tools/computer-use/definitions.ts +48 -60
  524. package/src/tools/document/document-tool.ts +6 -6
  525. package/src/tools/filesystem/edit.ts +2 -1
  526. package/src/tools/filesystem/read.ts +20 -2
  527. package/src/tools/filesystem/write.ts +2 -1
  528. package/src/tools/host-filesystem/edit.ts +17 -1
  529. package/src/tools/host-filesystem/read.ts +16 -1
  530. package/src/tools/host-filesystem/write.ts +15 -1
  531. package/src/tools/host-terminal/host-shell.ts +24 -0
  532. package/src/tools/memory/definitions.ts +45 -81
  533. package/src/tools/memory/handlers.test.ts +0 -1
  534. package/src/tools/memory/handlers.ts +1 -1
  535. package/src/tools/memory/register.ts +26 -60
  536. package/src/tools/network/script-proxy/session-manager.ts +6 -8
  537. package/src/tools/network/web-fetch.ts +7 -1
  538. package/src/tools/network/web-search.ts +2 -1
  539. package/src/tools/registry.ts +23 -0
  540. package/src/tools/schedule/create.ts +113 -5
  541. package/src/tools/schedule/list.ts +57 -15
  542. package/src/tools/schedule/update.ts +73 -3
  543. package/src/tools/shared/filesystem/image-read.ts +192 -0
  544. package/src/tools/side-effects.ts +1 -7
  545. package/src/tools/skills/delete-managed.ts +27 -64
  546. package/src/tools/skills/execute.ts +54 -0
  547. package/src/tools/skills/load.ts +127 -5
  548. package/src/tools/skills/scaffold-managed.ts +93 -172
  549. package/src/tools/subagent/message.ts +0 -7
  550. package/src/tools/subagent/spawn.ts +1 -1
  551. package/src/tools/swarm/delegate.ts +0 -3
  552. package/src/tools/system/avatar-generator.ts +13 -19
  553. package/src/tools/system/request-permission.ts +2 -1
  554. package/src/tools/terminal/safe-env.ts +1 -0
  555. package/src/tools/tool-manifest.ts +41 -47
  556. package/src/tools/types.ts +6 -2
  557. package/src/tools/ui-surface/definitions.ts +0 -55
  558. package/src/util/errors.ts +0 -10
  559. package/src/workspace/git-service.ts +0 -2
  560. package/src/__tests__/account-registry.test.ts +0 -258
  561. package/src/__tests__/email-classifier.test.ts +0 -25
  562. package/src/__tests__/gmail-integration.test.ts +0 -97
  563. package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
  564. package/src/__tests__/managed-twitter-guardrails.test.ts +0 -357
  565. package/src/__tests__/recording-intent-fallback.test.ts +0 -199
  566. package/src/__tests__/recording-intent.test.ts +0 -985
  567. package/src/__tests__/recording-state-machine.test.ts +0 -1574
  568. package/src/__tests__/reminder-store.test.ts +0 -350
  569. package/src/__tests__/reminder.test.ts +0 -337
  570. package/src/__tests__/scan-result-store.test.ts +0 -121
  571. package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -475
  572. package/src/__tests__/view-image-tool.test.ts +0 -241
  573. package/src/cli/commands/amazon/cart.ts +0 -513
  574. package/src/cli/commands/amazon/checkout.ts +0 -394
  575. package/src/cli/commands/amazon/client.ts +0 -513
  576. package/src/cli/commands/amazon/index.ts +0 -885
  577. package/src/cli/commands/amazon/product-details.ts +0 -145
  578. package/src/cli/commands/amazon/request-extractor.ts +0 -187
  579. package/src/cli/commands/amazon/search.ts +0 -76
  580. package/src/cli/commands/amazon/session.ts +0 -108
  581. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -345
  582. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -252
  583. package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -151
  584. package/src/cli/commands/twitter/index.ts +0 -420
  585. package/src/cli/commands/twitter/oauth-client.ts +0 -60
  586. package/src/cli/commands/twitter/router.ts +0 -351
  587. package/src/cli/commands/twitter/types.ts +0 -30
  588. package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
  589. package/src/config/bundled-skills/agentmail/icon.svg +0 -21
  590. package/src/config/bundled-skills/amazon/SKILL.md +0 -136
  591. package/src/config/bundled-skills/amazon/icon.svg +0 -13
  592. package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
  593. package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
  594. package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
  595. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
  596. package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
  597. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
  598. package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
  599. package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
  600. package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
  601. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
  602. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
  603. package/src/config/bundled-skills/influencer/SKILL.md +0 -144
  604. package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
  605. package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
  606. package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
  607. package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
  608. package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
  609. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
  610. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
  611. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
  612. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
  613. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
  614. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
  615. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
  616. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
  617. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
  618. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
  619. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
  620. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
  621. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
  622. package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
  623. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
  624. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
  625. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
  626. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
  627. package/src/config/bundled-skills/notion/SKILL.md +0 -240
  628. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
  629. package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
  630. package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
  631. package/src/config/bundled-skills/reminder/SKILL.md +0 -79
  632. package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
  633. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
  634. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
  635. package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
  636. package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
  637. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
  638. package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
  639. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
  640. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
  641. package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
  642. package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
  643. package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
  644. package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
  645. package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
  646. package/src/config/bundled-skills/twitter/SKILL.md +0 -206
  647. package/src/config/bundled-skills/twitter/icon.svg +0 -14
  648. package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
  649. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
  650. package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
  651. package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
  652. package/src/daemon/handlers/pairing.ts +0 -119
  653. package/src/daemon/handlers/session-user-message.ts +0 -961
  654. package/src/daemon/recording-executor.ts +0 -180
  655. package/src/daemon/recording-intent-fallback.ts +0 -162
  656. package/src/daemon/recording-intent.ts +0 -493
  657. package/src/memory/account-store.ts +0 -117
  658. package/src/messaging/activity-analyzer.ts +0 -76
  659. package/src/messaging/email-classifier.ts +0 -208
  660. package/src/messaging/index.ts +0 -2
  661. package/src/messaging/outreach-classifier.ts +0 -185
  662. package/src/messaging/thread-summarizer.ts +0 -346
  663. package/src/messaging/types.ts +0 -17
  664. package/src/tools/browser/x-auto-navigate.ts +0 -254
  665. package/src/tools/credentials/account-registry.ts +0 -144
  666. package/src/tools/filesystem/view-image.ts +0 -244
  667. package/src/tools/reminder/reminder-store.ts +0 -194
  668. package/src/tools/reminder/reminder.ts +0 -158
  669. package/src/tools/system/navigate-settings.ts +0 -74
  670. package/src/tools/system/open-system-settings.ts +0 -85
  671. package/src/tools/system/version.ts +0 -54
  672. package/src/twitter/platform-proxy-client.ts +0 -408
  673. /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
  674. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
  675. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
  676. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
  677. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
  678. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
  679. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
  680. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
  681. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
@@ -27,10 +27,14 @@ import { coreAppProxyTools } from "../tools/apps/definitions.js";
27
27
  import { registerSessionSender } from "../tools/browser/browser-screencast.js";
28
28
  import { requestComputerControlTool } from "../tools/computer-use/request-computer-control.js";
29
29
  import type { ToolExecutor } from "../tools/executor.js";
30
- import { getAllToolDefinitions } from "../tools/registry.js";
30
+ import {
31
+ getAllToolDefinitions,
32
+ getMcpToolDefinitions,
33
+ } from "../tools/registry.js";
31
34
  import type {
32
35
  ProxyApprovalCallback,
33
36
  ProxyApprovalRequest,
37
+ ToolContext,
34
38
  ToolExecutionResult,
35
39
  ToolLifecycleEventHandler,
36
40
  } from "../tools/types.js";
@@ -87,7 +91,7 @@ export interface ToolSetupContext extends SurfaceSessionContext {
87
91
  allowedToolNames?: Set<string>;
88
92
  /** Session memory policy — used to propagate scopeId and strictSideEffects into ToolContext. */
89
93
  memoryPolicy: { scopeId: string; strictSideEffects: boolean };
90
- /** True when the session has no connected IPC client (HTTP-only path). */
94
+ /** True when the session has no connected client (HTTP-only path). */
91
95
  hasNoClient?: boolean;
92
96
  /** When true, the session is executing a task run and must not become interactive. */
93
97
  headlessLock?: boolean;
@@ -97,6 +101,10 @@ export interface ToolSetupContext extends SurfaceSessionContext {
97
101
  trustContext?: TrustContext;
98
102
  /** Voice/call session ID, if the session originates from a call. Propagated into ToolContext for scoped grant consumption. */
99
103
  callSessionId?: string;
104
+ /** Optional proxy for delegating host_bash execution to a connected client. */
105
+ hostBashProxy?: import("./host-bash-proxy.js").HostBashProxy;
106
+ /** Optional proxy for delegating host_file_read/write/edit execution to a connected client. */
107
+ hostFileProxy?: import("./host-file-proxy.js").HostFileProxy;
100
108
  }
101
109
 
102
110
  // ── buildToolDefinitions ─────────────────────────────────────────────
@@ -150,7 +158,9 @@ export function createToolExecutor(
150
158
  markDoordashStepInProgress(ctx, input);
151
159
  }
152
160
 
153
- const result = await executor.execute(name, input, {
161
+ // Build the context object shared by both the skill_execute interception
162
+ // path and the regular executor path.
163
+ const toolContext: ToolContext = {
154
164
  workingDir: ctx.workingDir,
155
165
  sessionId: ctx.conversationId,
156
166
  conversationId: ctx.conversationId,
@@ -175,6 +185,8 @@ export function createToolExecutor(
175
185
  memoryScopeId: ctx.memoryPolicy.scopeId,
176
186
  forcePromptSideEffects: ctx.memoryPolicy.strictSideEffects,
177
187
  toolUseId,
188
+ hostBashProxy: ctx.hostBashProxy,
189
+ hostFileProxy: ctx.hostFileProxy,
178
190
  onToolLifecycleEvent: handleToolLifecycleEvent,
179
191
  sendToClient: (msg) => {
180
192
  // Tool context's sendToClient uses a loose { type: string; [key: string]: unknown }
@@ -315,7 +327,38 @@ export function createToolExecutor(
315
327
  : ("deny" as const),
316
328
  };
317
329
  },
318
- });
330
+ };
331
+
332
+ // Intercept skill_execute: extract the real tool name and input, then
333
+ // route through the full executor pipeline so the underlying tool's
334
+ // risk level, permission checks, hooks, and lifecycle events all fire
335
+ // with the real tool name.
336
+ if (name === "skill_execute") {
337
+ const toolName = typeof input.tool === "string" ? input.tool : "";
338
+ const toolInput =
339
+ input.input != null && typeof input.input === "object"
340
+ ? (input.input as Record<string, unknown>)
341
+ : {};
342
+
343
+ if (!toolName) {
344
+ return {
345
+ content:
346
+ 'Error: skill_execute requires a "tool" parameter with the tool name',
347
+ isError: true,
348
+ };
349
+ }
350
+
351
+ const result = await executor.execute(toolName, toolInput, toolContext);
352
+
353
+ runPostExecutionSideEffects(toolName, toolInput, result, {
354
+ ctx,
355
+ broadcastToAllClients,
356
+ });
357
+
358
+ return result;
359
+ }
360
+
361
+ const result = await executor.execute(name, input, toolContext);
319
362
 
320
363
  runPostExecutionSideEffects(name, input, result, {
321
364
  ctx,
@@ -486,6 +529,63 @@ export interface SkillProjectionContext {
486
529
  allowedToolNames?: Set<string>;
487
530
  /** When > 0, the resolveTools callback returns no tools at all. */
488
531
  toolsDisabledDepth: number;
532
+ /** Channel capabilities — read lazily per turn for conditional tool filtering. */
533
+ readonly channelCapabilities?: {
534
+ channel: string;
535
+ supportsDynamicUi: boolean;
536
+ };
537
+ /** True when no client is connected (HTTP-only). */
538
+ readonly hasNoClient?: boolean;
539
+ /** True when the conversation has user-uploaded attachments. */
540
+ hasAttachments?: boolean;
541
+ }
542
+
543
+ // ── Conditional tool sets ────────────────────────────────────────────
544
+
545
+ const UI_SURFACE_TOOL_NAMES = new Set(["ui_show", "ui_update", "ui_dismiss"]);
546
+ const HOST_TOOL_NAMES = new Set([
547
+ "host_file_read",
548
+ "host_file_write",
549
+ "host_file_edit",
550
+ "host_bash",
551
+ ]);
552
+ const ASSET_TOOL_NAMES = new Set(["asset_search", "asset_materialize"]);
553
+ const CLIENT_CAPABILITY_TOOL_NAMES = new Set([
554
+ "app_open",
555
+ "computer_use_request_control",
556
+ ]);
557
+ const PLATFORM_TOOL_NAMES = new Set(["request_system_permission"]);
558
+
559
+ /**
560
+ * Determine whether a tool should be included in the LLM tool definitions
561
+ * for the current turn based on session context. Tools not active for the
562
+ * current context are omitted from the definitions sent to the provider,
563
+ * reducing noise and preventing the model from attempting calls that would
564
+ * fail.
565
+ */
566
+ export function isToolActiveForContext(
567
+ name: string,
568
+ ctx: SkillProjectionContext,
569
+ ): boolean {
570
+ if (UI_SURFACE_TOOL_NAMES.has(name)) {
571
+ return ctx.channelCapabilities?.supportsDynamicUi ?? !ctx.hasNoClient;
572
+ }
573
+ if (HOST_TOOL_NAMES.has(name)) {
574
+ // Host tools require a connected client — without one, there is no human
575
+ // to approve execution and the guardian auto-approve path would allow
576
+ // unchecked host command execution on the daemon host.
577
+ return !ctx.hasNoClient;
578
+ }
579
+ if (ASSET_TOOL_NAMES.has(name)) {
580
+ return ctx.hasAttachments ?? false;
581
+ }
582
+ if (CLIENT_CAPABILITY_TOOL_NAMES.has(name)) {
583
+ return !ctx.hasNoClient;
584
+ }
585
+ if (PLATFORM_TOOL_NAMES.has(name)) {
586
+ return process.platform === "darwin" && !ctx.hasNoClient;
587
+ }
588
+ return true;
489
589
  }
490
590
 
491
591
  /**
@@ -493,6 +593,12 @@ export interface SkillProjectionContext {
493
593
  * dynamically projected skill tools on each agent turn. Also updates
494
594
  * allowedToolNames so newly-activated skill tools aren't blocked by
495
595
  * the executor's stale gate.
596
+ *
597
+ * Core (non-MCP) tool definitions are captured at session creation and
598
+ * reused on each turn. MCP tool definitions are re-read from the global
599
+ * registry on each turn so that tools registered after session creation
600
+ * (e.g. via `vellum mcp reload`) are automatically picked up without
601
+ * requiring session disposal or app restart.
496
602
  */
497
603
  export function createResolveToolsCallback(
498
604
  toolDefs: ToolDefinition[],
@@ -500,6 +606,20 @@ export function createResolveToolsCallback(
500
606
  ): ((history: Message[]) => ToolDefinition[]) | undefined {
501
607
  if (toolDefs.length === 0) return undefined;
502
608
 
609
+ // Separate the initial tool defs into core (stable) and MCP (dynamic).
610
+ // We keep core tools from the snapshot and re-read MCP tools each turn.
611
+ const initialMcpDefs = getMcpToolDefinitions();
612
+ const initialMcpNames = new Set(initialMcpDefs.map((d) => d.name));
613
+ const coreToolDefs = toolDefs.filter((d) => !initialMcpNames.has(d.name));
614
+ log.debug(
615
+ {
616
+ coreCount: coreToolDefs.length,
617
+ mcpCount: initialMcpDefs.length,
618
+ mcpTools: initialMcpDefs.map((d) => d.name),
619
+ },
620
+ "Session tool resolver initialized",
621
+ );
622
+
503
623
  return (history: Message[]) => {
504
624
  // When tools are explicitly disabled (e.g. during pointer generation),
505
625
  // return an empty tool list so the LLM never sees tool definitions and
@@ -509,6 +629,26 @@ export function createResolveToolsCallback(
509
629
  return [];
510
630
  }
511
631
 
632
+ // Filter core tools based on current session context so that tools
633
+ // irrelevant to this turn (e.g. UI tools when no client is connected)
634
+ // are omitted from the definitions sent to the provider.
635
+ const filteredCoreDefs = coreToolDefs.filter((d) =>
636
+ isToolActiveForContext(d.name, ctx),
637
+ );
638
+
639
+ // Re-read MCP tool definitions from the registry each turn so sessions
640
+ // automatically pick up tools added/removed by `vellum mcp reload`.
641
+ const currentMcpDefs = getMcpToolDefinitions();
642
+ log.debug(
643
+ {
644
+ coreCount: filteredCoreDefs.length,
645
+ mcpCount: currentMcpDefs.length,
646
+ mcpTools: currentMcpDefs.map((d) => d.name),
647
+ },
648
+ "MCP tools resolved for turn",
649
+ );
650
+ const allBaseDefs = [...filteredCoreDefs, ...currentMcpDefs];
651
+
512
652
  const effectivePreactivated = [
513
653
  ...DEFAULT_PREACTIVATED_SKILL_IDS,
514
654
  ...(ctx.preactivatedSkillIds ?? []),
@@ -518,11 +658,11 @@ export function createResolveToolsCallback(
518
658
  previouslyActiveSkillIds: ctx.skillProjectionState,
519
659
  cache: ctx.skillProjectionCache,
520
660
  });
521
- const turnAllowed = new Set(ctx.coreToolNames);
661
+ const turnAllowed = new Set(allBaseDefs.map((d) => d.name));
522
662
  for (const name of projection.allowedToolNames) {
523
663
  turnAllowed.add(name);
524
664
  }
525
665
  ctx.allowedToolNames = turnAllowed;
526
- return [...toolDefs, ...projection.toolDefinitions];
666
+ return allBaseDefs;
527
667
  };
528
668
  }
@@ -46,6 +46,8 @@ import type { AuthContext } from "../runtime/auth/types.js";
46
46
  import * as approvalOverrides from "../runtime/session-approval-overrides.js";
47
47
  import { ToolExecutor } from "../tools/executor.js";
48
48
  import type { AssistantAttachmentDraft } from "./assistant-attachments.js";
49
+ import { HostBashProxy } from "./host-bash-proxy.js";
50
+ import { HostFileProxy } from "./host-file-proxy.js";
49
51
  import type {
50
52
  ServerMessage,
51
53
  SurfaceData,
@@ -82,15 +84,13 @@ import {
82
84
  drainQueue as drainQueueImpl,
83
85
  processMessage as processMessageImpl,
84
86
  } from "./session-process.js";
85
- import type {
86
- QueueDrainReason,
87
- QueueMetrics,
88
- } from "./session-queue-manager.js";
87
+ import type { QueueDrainReason } from "./session-queue-manager.js";
89
88
  import { MessageQueue } from "./session-queue-manager.js";
90
89
  import type {
91
90
  ChannelCapabilities,
92
91
  TrustContext,
93
92
  } from "./session-runtime-assembly.js";
93
+ import { messagesContainAttachments } from "./session-runtime-assembly.js";
94
94
  import type { SkillProjectionCache } from "./session-skill-tools.js";
95
95
  import {
96
96
  createSurfaceMutex,
@@ -121,7 +121,6 @@ export const DEFAULT_MEMORY_POLICY: Readonly<SessionMemoryPolicy> =
121
121
 
122
122
  export { findLastUndoableUserMessageIndex } from "./session-history.js";
123
123
  export type { QueueDrainReason, QueuePolicy } from "./session-queue-manager.js";
124
- export { MAX_QUEUE_DEPTH } from "./session-queue-manager.js";
125
124
 
126
125
  export class Session {
127
126
  public readonly conversationId: string;
@@ -157,9 +156,12 @@ export class Session {
157
156
  /** @internal */ currentRequestId?: string;
158
157
  /** @internal */ conflictGate = new ConflictGate();
159
158
  /** @internal */ hasNoClient = false;
159
+ /** @internal */ hasAttachments = false;
160
160
  /** @internal */ headlessLock = false;
161
161
  /** @internal */ taskRunId?: string;
162
162
  /** @internal */ callSessionId?: string;
163
+ /** @internal */ hostBashProxy?: HostBashProxy;
164
+ /** @internal */ hostFileProxy?: HostFileProxy;
163
165
  /** @internal */ readonly queue = new MessageQueue();
164
166
  /** @internal */ currentActiveSurfaceId?: string;
165
167
  /** @internal */ currentPage?: string;
@@ -336,7 +338,6 @@ export class Session {
336
338
  maxInputTokens: config.contextWindow.maxInputTokens,
337
339
  thinking: config.thinking,
338
340
  effort: config.effort,
339
- maxToolUseTurns: config.maxToolUseTurns,
340
341
  },
341
342
  toolDefs.length > 0 ? toolDefs : undefined,
342
343
  toolDefs.length > 0 ? toolExecutor : undefined,
@@ -358,7 +359,15 @@ export class Session {
358
359
  // ── Lifecycle ────────────────────────────────────────────────────
359
360
 
360
361
  async loadFromDb(): Promise<void> {
361
- return loadFromDbImpl(this);
362
+ await loadFromDbImpl(this);
363
+ // Scan loaded history for attachment content blocks so that asset
364
+ // tools are available when resuming a conversation that already had
365
+ // attachments. One-way: once true it stays true for the session.
366
+ // Also picks up the hasAttachments flag set by loadFromDbImpl which
367
+ // scans compacted (sliced-off) messages that aren't in this.messages.
368
+ if (!this.hasAttachments && messagesContainAttachments(this.messages)) {
369
+ this.hasAttachments = true;
370
+ }
362
371
  }
363
372
 
364
373
  async ensureActorScopedHistory(): Promise<void> {
@@ -370,12 +379,17 @@ export class Session {
370
379
  updateClient(
371
380
  sendToClient: (msg: ServerMessage) => void,
372
381
  hasNoClient = false,
382
+ opts?: { skipProxySenderUpdate?: boolean },
373
383
  ): void {
374
384
  this.sendToClient = sendToClient;
375
385
  this.hasNoClient = hasNoClient;
376
386
  this.prompter.updateSender(sendToClient);
377
387
  this.secretPrompter.updateSender(sendToClient);
378
388
  this.traceEmitter.updateSender(sendToClient);
389
+ if (!opts?.skipProxySenderUpdate) {
390
+ this.hostBashProxy?.updateSender(sendToClient, !hasNoClient);
391
+ this.hostFileProxy?.updateSender(sendToClient, !hasNoClient);
392
+ }
379
393
  }
380
394
 
381
395
  /** Returns the current sendToClient reference for identity comparison. */
@@ -383,6 +397,20 @@ export class Session {
383
397
  return this.sendToClient;
384
398
  }
385
399
 
400
+ /** Mark host proxies as unavailable so tool execution uses local fallback. */
401
+ clearProxyAvailability(): void {
402
+ this.hostBashProxy?.updateSender(this.sendToClient, false);
403
+ this.hostFileProxy?.updateSender(this.sendToClient, false);
404
+ }
405
+
406
+ /** Restore host proxy availability based on whether a real client is connected. */
407
+ restoreProxyAvailability(): void {
408
+ if (!this.hasNoClient) {
409
+ this.hostBashProxy?.updateSender(this.sendToClient, true);
410
+ this.hostFileProxy?.updateSender(this.sendToClient, true);
411
+ }
412
+ }
413
+
386
414
  setSandboxOverride(enabled: boolean | undefined): void {
387
415
  this.sandboxOverride = enabled;
388
416
  }
@@ -418,6 +446,8 @@ export class Session {
418
446
 
419
447
  dispose(): void {
420
448
  approvalOverrides.clearMode(this.conversationId);
449
+ this.hostBashProxy?.dispose();
450
+ this.hostFileProxy?.dispose();
421
451
  disposeSession(this);
422
452
  }
423
453
 
@@ -445,7 +475,7 @@ export class Session {
445
475
  metadata?: Record<string, unknown>,
446
476
  options?: { isInteractive?: boolean },
447
477
  displayContent?: string,
448
- ): { queued: boolean; rejected?: boolean; requestId: string } {
478
+ ): { queued: boolean; requestId: string; rejected?: boolean } {
449
479
  return enqueueMessageImpl(
450
480
  this,
451
481
  content,
@@ -464,10 +494,6 @@ export class Session {
464
494
  return this.queue.length;
465
495
  }
466
496
 
467
- getQueueMetrics(): QueueMetrics {
468
- return this.queue.getMetrics();
469
- }
470
-
471
497
  hasQueuedMessages(): boolean {
472
498
  return !this.queue.isEmpty;
473
499
  }
@@ -530,7 +556,7 @@ export class Session {
530
556
  // guardian trust-class and conversation context are available.
531
557
 
532
558
  // Emit authoritative confirmation state and activity transition centrally
533
- // so ALL callers (IPC handlers, /v1/confirm, channel bridges) get
559
+ // so ALL callers (HTTP handlers, /v1/confirm, channel bridges) get
534
560
  // consistent events without duplicating emission logic.
535
561
  const resolvedState =
536
562
  decision === "deny" || decision === "always_deny"
@@ -573,6 +599,39 @@ export class Session {
573
599
  this.secretPrompter.resolveSecret(requestId, value, delivery);
574
600
  }
575
601
 
602
+ resolveHostBash(
603
+ requestId: string,
604
+ response: {
605
+ stdout: string;
606
+ stderr: string;
607
+ exitCode: number | null;
608
+ timedOut: boolean;
609
+ },
610
+ ): void {
611
+ this.hostBashProxy?.resolve(requestId, response);
612
+ }
613
+
614
+ setHostBashProxy(proxy: HostBashProxy | undefined): void {
615
+ if (this.hostBashProxy && this.hostBashProxy !== proxy) {
616
+ this.hostBashProxy.dispose();
617
+ }
618
+ this.hostBashProxy = proxy;
619
+ }
620
+
621
+ resolveHostFile(
622
+ requestId: string,
623
+ response: { content: string; isError: boolean },
624
+ ): void {
625
+ this.hostFileProxy?.resolve(requestId, response);
626
+ }
627
+
628
+ setHostFileProxy(proxy: HostFileProxy | undefined): void {
629
+ if (this.hostFileProxy && this.hostFileProxy !== proxy) {
630
+ this.hostFileProxy.dispose();
631
+ }
632
+ this.hostFileProxy = proxy;
633
+ }
634
+
576
635
  // ── Server-authoritative state signals ─────────────────────────────
577
636
 
578
637
  emitConfirmationStateChanged(
@@ -666,6 +725,11 @@ export class Session {
666
725
  if (!this.processing) {
667
726
  await this.ensureActorScopedHistory();
668
727
  }
728
+ // One-way flag: once an attachment arrives, asset tools stay available
729
+ // for the remainder of the session.
730
+ if (!this.hasAttachments && attachments.length > 0) {
731
+ this.hasAttachments = true;
732
+ }
669
733
  return persistUserMessageImpl(
670
734
  this,
671
735
  content,
package/src/errors.ts CHANGED
@@ -18,7 +18,6 @@
18
18
  * ├─ PermissionDeniedError
19
19
  * ├─ ConfigError
20
20
  * ├─ DaemonError
21
- * ├─ IpcError
22
21
  * ├─ PlatformError
23
22
  * ├─ IntegrityError
24
23
  * └─ IngressBlockedError
@@ -32,7 +31,6 @@ export {
32
31
  ErrorCode,
33
32
  IngressBlockedError,
34
33
  IntegrityError,
35
- IpcError,
36
34
  PermissionDeniedError,
37
35
  PlatformError,
38
36
  ProviderError,
@@ -51,6 +51,12 @@ function extractText(blocks: ContentBlock[]): string {
51
51
  parts.push(`[Result: ${truncate(block.content ?? "", 500)}]`);
52
52
  }
53
53
  break;
54
+ case "server_tool_use":
55
+ parts.push(`[Web search: ${block.name ?? "web_search"}]`);
56
+ break;
57
+ case "web_search_tool_result":
58
+ parts.push("[Web search results]");
59
+ break;
54
60
  }
55
61
  }
56
62
  return parts.join("\n");
@@ -445,9 +445,7 @@ export async function deleteMcpOAuthCredentials(
445
445
  { key: "client_info", result: clientResult },
446
446
  { key: "discovery", result: discoveryResult },
447
447
  ];
448
- const errors = results
449
- .filter((r) => r.result === "error")
450
- .map((r) => r.key);
448
+ const errors = results.filter((r) => r.result === "error").map((r) => r.key);
451
449
  if (errors.length > 0) {
452
450
  log.warn(
453
451
  { serverId, failedKeys: errors },
@@ -1,15 +1,12 @@
1
1
  /**
2
- * Strategy router for avatar generation.
3
- * Selects managed platform or local Gemini path based on config.
2
+ * Avatar generation router.
3
+ * Tries managed platform path if available, falls back to local Gemini.
4
4
  */
5
5
 
6
6
  import { getConfig } from "../config/loader.js";
7
7
  import { ConfigError, ProviderError } from "../util/errors.js";
8
8
  import { getLogger } from "../util/logger.js";
9
- import type {
10
- AvatarGenerationResult,
11
- AvatarGenerationStrategy,
12
- } from "./avatar-types.js";
9
+ import type { AvatarGenerationResult } from "./avatar-types.js";
13
10
  import { generateImage } from "./gemini-image-service.js";
14
11
  import {
15
12
  generateManagedAvatar,
@@ -18,10 +15,6 @@ import {
18
15
 
19
16
  const log = getLogger("avatar-router");
20
17
 
21
- export function getAvatarStrategy(): AvatarGenerationStrategy {
22
- return getConfig().avatar.generationStrategy;
23
- }
24
-
25
18
  async function generateLocal(
26
19
  prompt: string,
27
20
  correlationId?: string,
@@ -58,36 +51,35 @@ async function generateLocal(
58
51
 
59
52
  export async function routedGenerateAvatar(
60
53
  prompt: string,
61
- options?: { correlationId?: string },
54
+ options?: { correlationId?: string; model?: string },
62
55
  ): Promise<AvatarGenerationResult> {
63
- const strategy = getAvatarStrategy();
64
56
  const correlationId = options?.correlationId;
57
+ const model = options?.model;
65
58
 
66
- if (strategy === "managed_required") {
67
- const managed = await generateManagedAvatar(prompt, { correlationId });
68
- return {
69
- imageBase64: managed.image.data_base64,
70
- mimeType: managed.image.mime_type,
71
- pathUsed: "managed",
72
- correlationId: managed.correlation_id,
73
- };
74
- }
75
-
76
- if (strategy === "local_only") {
77
- return generateLocal(prompt, correlationId);
78
- }
79
-
80
- // managed_prefer: try managed first if available, fall back to local
59
+ // Try managed platform path if available, fall back to local Gemini
81
60
  if (isManagedAvailable()) {
82
61
  try {
83
- const managed = await generateManagedAvatar(prompt, { correlationId });
62
+ const managed = await generateManagedAvatar(prompt, {
63
+ correlationId,
64
+ model,
65
+ });
84
66
  return {
85
67
  imageBase64: managed.image.data_base64,
86
68
  mimeType: managed.image.mime_type,
87
69
  pathUsed: "managed",
88
70
  correlationId: managed.correlation_id,
71
+ model,
89
72
  };
90
73
  } catch (err) {
74
+ const config = getConfig();
75
+ const geminiKey = config.apiKeys.gemini ?? process.env.GEMINI_API_KEY;
76
+ if (!geminiKey) {
77
+ log.warn(
78
+ { err: err instanceof Error ? err.message : String(err) },
79
+ "Managed avatar generation failed and no local Gemini key configured; re-throwing",
80
+ );
81
+ throw err;
82
+ }
91
83
  log.warn(
92
84
  { err: err instanceof Error ? err.message : String(err) },
93
85
  "Managed avatar generation failed, falling back to local Gemini",
@@ -1,5 +1,3 @@
1
- export type AvatarGenerationStrategy = "managed_required" | "managed_prefer" | "local_only";
2
-
3
1
  export interface ManagedAvatarImagePayload {
4
2
  mime_type: string;
5
3
  data_base64: string;
@@ -9,17 +7,6 @@ export interface ManagedAvatarImagePayload {
9
7
 
10
8
  export interface ManagedAvatarResponse {
11
9
  image: ManagedAvatarImagePayload;
12
- usage: { billable: boolean; class_name: string };
13
- generation_source: string;
14
- profile: string;
15
- correlation_id: string;
16
- }
17
-
18
- export interface ManagedAvatarErrorResponse {
19
- code: string;
20
- subcode: string;
21
- detail: string;
22
- retryable: boolean;
23
10
  correlation_id: string;
24
11
  }
25
12
 
@@ -53,8 +40,14 @@ export interface AvatarGenerationResult {
53
40
  mimeType: string;
54
41
  pathUsed: "managed" | "local";
55
42
  correlationId?: string;
43
+ model?: string;
56
44
  }
57
45
 
58
- export const AVATAR_MIME_ALLOWLIST = new Set(["image/png", "image/jpeg", "image/webp"]);
46
+ export const AVATAR_MIME_ALLOWLIST = new Set([
47
+ "image/png",
48
+ "image/jpeg",
49
+ "image/webp",
50
+ ]);
59
51
  export const AVATAR_MAX_DECODED_BYTES = 10 * 1024 * 1024;
60
52
  export const AVATAR_PROMPT_MAX_LENGTH = 2000;
53
+ export const VERTEX_IMAGE_DEFAULT_MODEL = "imagen-3.0-generate-002";