@vellumai/assistant 0.4.43 → 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 (713) hide show
  1. package/.prettierignore +4 -0
  2. package/ARCHITECTURE.md +46 -44
  3. package/README.md +15 -16
  4. package/bun.lock +10 -35
  5. package/docs/architecture/integrations.md +102 -215
  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 -3
  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-asset.test.ts +1 -1
  40. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
  41. package/src/__tests__/call-controller.test.ts +0 -1
  42. package/src/__tests__/call-conversation-messages.test.ts +0 -1
  43. package/src/__tests__/call-domain.test.ts +0 -1
  44. package/src/__tests__/call-pointer-messages.test.ts +0 -1
  45. package/src/__tests__/call-recovery.test.ts +0 -1
  46. package/src/__tests__/call-routes-http.test.ts +0 -1
  47. package/src/__tests__/call-store.test.ts +0 -1
  48. package/src/__tests__/canonical-guardian-store.test.ts +0 -1
  49. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  50. package/src/__tests__/channel-approvals.test.ts +1 -1
  51. package/src/__tests__/channel-delivery-store.test.ts +0 -1
  52. package/src/__tests__/channel-guardian.test.ts +5 -7
  53. package/src/__tests__/channel-retry-sweep.test.ts +0 -1
  54. package/src/__tests__/checker.test.ts +32 -36
  55. package/src/__tests__/compaction.benchmark.test.ts +16 -14
  56. package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
  57. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  58. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
  59. package/src/__tests__/computer-use-tools.test.ts +35 -31
  60. package/src/__tests__/config-schema.test.ts +11 -15
  61. package/src/__tests__/config-watcher.test.ts +0 -1
  62. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  63. package/src/__tests__/conflict-store.test.ts +0 -1
  64. package/src/__tests__/connection-policy.test.ts +4 -7
  65. package/src/__tests__/contacts-tools.test.ts +0 -1
  66. package/src/__tests__/context-memory-e2e.test.ts +2 -4
  67. package/src/__tests__/context-overflow-reducer.test.ts +2 -4
  68. package/src/__tests__/context-window-manager.test.ts +147 -60
  69. package/src/__tests__/contradiction-checker.test.ts +0 -1
  70. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  71. package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
  72. package/src/__tests__/conversation-pairing.test.ts +2 -2
  73. package/src/__tests__/conversation-routes-guardian-reply.test.ts +31 -7
  74. package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
  75. package/src/__tests__/conversation-store.test.ts +0 -1
  76. package/src/__tests__/conversation-unread-route.test.ts +1 -2
  77. package/src/__tests__/credential-security-invariants.test.ts +8 -8
  78. package/src/__tests__/cross-provider-web-search.test.ts +353 -0
  79. package/src/__tests__/daemon-assistant-events.test.ts +6 -7
  80. package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
  81. package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
  82. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
  83. package/src/__tests__/diagnostics-export.test.ts +189 -0
  84. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  85. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  86. package/src/__tests__/entity-extractor.test.ts +0 -1
  87. package/src/__tests__/entity-search.test.ts +0 -1
  88. package/src/__tests__/ephemeral-permissions.test.ts +2 -4
  89. package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
  90. package/src/__tests__/file-read-tool.test.ts +86 -0
  91. package/src/__tests__/followup-tools.test.ts +0 -1
  92. package/src/__tests__/frontmatter.test.ts +77 -34
  93. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  94. package/src/__tests__/gateway-only-guard.test.ts +1 -1
  95. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
  96. package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
  97. package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
  98. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  99. package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
  100. package/src/__tests__/guardian-action-store.test.ts +0 -1
  101. package/src/__tests__/guardian-action-sweep.test.ts +0 -1
  102. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  103. package/src/__tests__/guardian-dispatch.test.ts +1 -2
  104. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  105. package/src/__tests__/guardian-outbound-http.test.ts +0 -1
  106. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
  107. package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
  108. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  109. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  110. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
  111. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
  112. package/src/__tests__/host-bash-proxy.test.ts +335 -0
  113. package/src/__tests__/host-file-proxy.test.ts +374 -0
  114. package/src/__tests__/host-shell-tool.test.ts +147 -1
  115. package/src/__tests__/http-user-message-parity.test.ts +361 -0
  116. package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
  117. package/src/__tests__/integration-status.test.ts +3 -8
  118. package/src/__tests__/intent-routing.test.ts +7 -46
  119. package/src/__tests__/invite-redemption-service.test.ts +0 -1
  120. package/src/__tests__/invite-routes-http.test.ts +0 -1
  121. package/src/__tests__/llm-usage-store.test.ts +0 -1
  122. package/src/__tests__/managed-avatar-client.test.ts +101 -55
  123. package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
  124. package/src/__tests__/managed-store.test.ts +94 -21
  125. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
  126. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
  127. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
  128. package/src/__tests__/memory-recall-quality.test.ts +0 -1
  129. package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
  130. package/src/__tests__/memory-regressions.test.ts +0 -1
  131. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
  132. package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
  133. package/src/__tests__/messaging-send-tool.test.ts +35 -0
  134. package/src/__tests__/messaging-skill-split.test.ts +138 -0
  135. package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
  136. package/src/__tests__/migration-export-http.test.ts +2 -3
  137. package/src/__tests__/migration-import-commit-http.test.ts +1 -2
  138. package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
  139. package/src/__tests__/migration-validate-http.test.ts +1 -2
  140. package/src/__tests__/native-web-search.test.ts +475 -0
  141. package/src/__tests__/navigate-settings-tab.test.ts +84 -0
  142. package/src/__tests__/non-member-access-request.test.ts +0 -1
  143. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  144. package/src/__tests__/notification-decision-strategy.test.ts +6 -6
  145. package/src/__tests__/notification-deep-link.test.ts +7 -7
  146. package/src/__tests__/notification-guardian-path.test.ts +2 -3
  147. package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
  148. package/src/__tests__/notification-thread-candidates.test.ts +4 -4
  149. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  150. package/src/__tests__/onboarding-template-contract.test.ts +0 -10
  151. package/src/__tests__/playbook-execution.test.ts +0 -1
  152. package/src/__tests__/playbook-tools.test.ts +0 -1
  153. package/src/__tests__/profile-compiler.test.ts +0 -1
  154. package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
  155. package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
  156. package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
  157. package/src/__tests__/recording-handler.test.ts +30 -94
  158. package/src/__tests__/registry.test.ts +28 -35
  159. package/src/__tests__/relay-server.test.ts +0 -1
  160. package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
  161. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  162. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  163. package/src/__tests__/runtime-events-sse.test.ts +0 -1
  164. package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
  165. package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
  166. package/src/__tests__/schedule-store.test.ts +441 -1
  167. package/src/__tests__/schedule-tools.test.ts +468 -7
  168. package/src/__tests__/scheduler-recurrence.test.ts +196 -23
  169. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  170. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  171. package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
  172. package/src/__tests__/secret-response-routing.test.ts +4 -1
  173. package/src/__tests__/send-endpoint-busy.test.ts +14 -5
  174. package/src/__tests__/send-notification-tool.test.ts +0 -7
  175. package/src/__tests__/sequence-store.test.ts +0 -1
  176. package/src/__tests__/server-history-render.test.ts +1 -2
  177. package/src/__tests__/session-abort-tool-results.test.ts +0 -1
  178. package/src/__tests__/session-agent-loop.test.ts +46 -6
  179. package/src/__tests__/session-confirmation-signals.test.ts +7 -46
  180. package/src/__tests__/session-conflict-gate.test.ts +2 -6
  181. package/src/__tests__/session-error.test.ts +5 -14
  182. package/src/__tests__/session-init.benchmark.test.ts +3 -5
  183. package/src/__tests__/session-load-history-repair.test.ts +0 -1
  184. package/src/__tests__/session-media-retry.test.ts +12 -74
  185. package/src/__tests__/session-pre-run-repair.test.ts +0 -1
  186. package/src/__tests__/session-profile-injection.test.ts +2 -6
  187. package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
  188. package/src/__tests__/session-queue.test.ts +94 -139
  189. package/src/__tests__/session-skill-tools.test.ts +115 -115
  190. package/src/__tests__/session-slash-known.test.ts +0 -1
  191. package/src/__tests__/session-slash-queue.test.ts +0 -1
  192. package/src/__tests__/session-slash-unknown.test.ts +0 -1
  193. package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
  194. package/src/__tests__/session-usage.test.ts +0 -1
  195. package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
  196. package/src/__tests__/session-workspace-injection.test.ts +2 -6
  197. package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
  198. package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
  199. package/src/__tests__/skill-feature-flags.test.ts +125 -18
  200. package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
  201. package/src/__tests__/skill-load-tool.test.ts +194 -2
  202. package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
  203. package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
  204. package/src/__tests__/skills.test.ts +14 -53
  205. package/src/__tests__/slack-channel-config.test.ts +0 -1
  206. package/src/__tests__/slack-inbound-verification.test.ts +0 -1
  207. package/src/__tests__/slack-skill.test.ts +1 -1
  208. package/src/__tests__/starter-task-flow.test.ts +9 -19
  209. package/src/__tests__/subagent-tools.test.ts +2 -2
  210. package/src/__tests__/system-prompt.test.ts +7 -7
  211. package/src/__tests__/task-compiler.test.ts +0 -1
  212. package/src/__tests__/task-management-tools.test.ts +0 -1
  213. package/src/__tests__/task-memory-cleanup.test.ts +0 -1
  214. package/src/__tests__/task-runner.test.ts +0 -1
  215. package/src/__tests__/task-scheduler.test.ts +0 -1
  216. package/src/__tests__/terminal-tools.test.ts +0 -1
  217. package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
  218. package/src/__tests__/thread-seed-composer.test.ts +5 -5
  219. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  220. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  221. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  222. package/src/__tests__/tool-executor.test.ts +8 -86
  223. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  224. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  225. package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
  226. package/src/__tests__/trust-store.test.ts +84 -8
  227. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  228. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  229. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
  230. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  231. package/src/__tests__/trusted-contact-verification.test.ts +0 -1
  232. package/src/__tests__/twilio-provider.test.ts +0 -1
  233. package/src/__tests__/twilio-routes.test.ts +0 -1
  234. package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
  235. package/src/__tests__/update-bulletin.test.ts +0 -1
  236. package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
  237. package/src/__tests__/usage-routes.test.ts +0 -1
  238. package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
  239. package/src/__tests__/voice-invite-redemption.test.ts +0 -1
  240. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  241. package/src/__tests__/voice-session-bridge.test.ts +9 -1
  242. package/src/__tests__/web-fetch.test.ts +57 -0
  243. package/src/__tests__/workspace-git-service.test.ts +5 -14
  244. package/src/__tests__/workspace-policy.test.ts +0 -1
  245. package/src/agent/loop.ts +22 -34
  246. package/src/bundler/bundle-signer.ts +4 -4
  247. package/src/calls/call-controller.ts +1 -1
  248. package/src/calls/relay-server.ts +1 -1
  249. package/src/calls/twilio-rest.ts +1 -1
  250. package/src/calls/voice-session-bridge.ts +3 -1
  251. package/src/cli/__tests__/notifications.test.ts +3 -4
  252. package/src/cli/commands/map.ts +2 -6
  253. package/src/cli/commands/mcp.ts +73 -15
  254. package/src/cli/commands/notifications.ts +4 -4
  255. package/src/cli/commands/sessions.ts +9 -1
  256. package/src/cli/commands/skills.ts +6 -10
  257. package/src/cli/http-client.ts +2 -3
  258. package/src/cli/main-screen.tsx +10 -10
  259. package/src/cli/program.ts +0 -4
  260. package/src/cli/reference.ts +0 -2
  261. package/src/cli.ts +15 -9
  262. package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
  263. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
  264. package/src/config/bundled-skills/app-builder/SKILL.md +6 -7
  265. package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
  266. package/src/config/bundled-skills/browser/SKILL.md +6 -1
  267. package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
  268. package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
  269. package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
  270. package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
  271. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
  272. package/src/config/bundled-skills/contacts/SKILL.md +10 -1
  273. package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
  274. package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
  275. package/src/config/bundled-skills/document/SKILL.md +4 -1
  276. package/src/config/bundled-skills/doordash/SKILL.md +8 -2
  277. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -82
  278. package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -28
  279. package/src/config/bundled-skills/doordash/lib/session.ts +21 -17
  280. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
  281. package/src/config/bundled-skills/followups/SKILL.md +4 -1
  282. package/src/config/bundled-skills/gmail/SKILL.md +180 -0
  283. package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
  284. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
  285. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
  286. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
  287. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
  288. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
  289. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
  290. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
  291. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
  292. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
  293. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
  294. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
  295. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
  296. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
  297. package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
  298. package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
  299. package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
  300. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
  301. package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
  302. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
  303. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
  304. package/src/config/bundled-skills/messaging/SKILL.md +23 -139
  305. package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
  306. package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
  307. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
  308. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
  309. package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
  310. package/src/config/bundled-skills/notifications/SKILL.md +5 -1
  311. package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
  312. package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
  313. package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → orchestration/tools/swarm-delegate.ts} +3 -3
  314. package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
  315. package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
  316. package/src/config/bundled-skills/schedule/SKILL.md +70 -9
  317. package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
  318. package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
  319. package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
  320. package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
  321. package/src/config/bundled-skills/sequences/SKILL.md +47 -0
  322. package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
  323. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
  324. package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
  325. package/src/config/bundled-skills/settings/SKILL.md +12 -0
  326. package/src/config/bundled-skills/settings/TOOLS.json +112 -0
  327. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
  328. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
  329. package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
  330. package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
  331. package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
  332. package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
  333. package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
  334. package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
  335. package/src/config/bundled-skills/slack/SKILL.md +5 -1
  336. package/src/config/bundled-skills/subagent/SKILL.md +4 -1
  337. package/src/config/bundled-skills/tasks/SKILL.md +5 -2
  338. package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
  339. package/src/config/bundled-skills/watcher/SKILL.md +4 -1
  340. package/src/config/bundled-tool-registry.ts +118 -107
  341. package/src/config/env.ts +5 -2
  342. package/src/config/feature-flag-registry.json +33 -9
  343. package/src/config/loader.ts +10 -2
  344. package/src/config/schema.ts +19 -16
  345. package/src/config/schemas/inference.ts +12 -22
  346. package/src/config/schemas/memory-storage.ts +19 -1
  347. package/src/config/schemas/platform.ts +0 -16
  348. package/src/config/skill-state.ts +11 -8
  349. package/src/config/skills.ts +83 -32
  350. package/src/context/token-estimator.ts +11 -0
  351. package/src/context/window-manager.ts +180 -151
  352. package/src/daemon/computer-use-session.ts +11 -43
  353. package/src/daemon/daemon-control.ts +4 -1
  354. package/src/daemon/handlers/config-channels.ts +5 -9
  355. package/src/daemon/handlers/config-ingress.ts +0 -4
  356. package/src/daemon/handlers/config-model.ts +7 -13
  357. package/src/daemon/handlers/config-telegram.ts +4 -8
  358. package/src/daemon/handlers/config-voice.ts +2 -5
  359. package/src/daemon/handlers/dictation.ts +2 -12
  360. package/src/daemon/handlers/identity.ts +0 -105
  361. package/src/daemon/handlers/recording.ts +3 -23
  362. package/src/daemon/handlers/session-history.ts +42 -10
  363. package/src/daemon/handlers/sessions.ts +53 -72
  364. package/src/daemon/handlers/shared.ts +7 -28
  365. package/src/daemon/handlers/skills.ts +31 -27
  366. package/src/daemon/host-bash-proxy.ts +148 -0
  367. package/src/daemon/host-file-proxy.ts +135 -0
  368. package/src/daemon/lifecycle.ts +53 -41
  369. package/src/daemon/mcp-reload-service.ts +123 -0
  370. package/src/daemon/message-protocol.ts +6 -0
  371. package/src/daemon/message-types/apps.ts +0 -25
  372. package/src/daemon/message-types/browser.ts +1 -1
  373. package/src/daemon/message-types/computer-use.ts +1 -4
  374. package/src/daemon/message-types/guardian-actions.ts +1 -1
  375. package/src/daemon/message-types/host-bash.ts +18 -0
  376. package/src/daemon/message-types/host-file.ts +44 -0
  377. package/src/daemon/message-types/integrations.ts +1 -73
  378. package/src/daemon/message-types/messages.ts +15 -0
  379. package/src/daemon/message-types/schedules.ts +11 -27
  380. package/src/daemon/message-types/sessions.ts +8 -2
  381. package/src/daemon/message-types/settings.ts +1 -1
  382. package/src/daemon/message-types/shared.ts +1 -1
  383. package/src/daemon/message-types/surfaces.ts +2 -0
  384. package/src/daemon/ride-shotgun-handler.ts +35 -43
  385. package/src/daemon/seed-files.ts +3 -27
  386. package/src/daemon/server.ts +45 -28
  387. package/src/daemon/session-agent-loop-handlers.ts +72 -9
  388. package/src/daemon/session-agent-loop.ts +97 -66
  389. package/src/daemon/session-attachments.ts +1 -1
  390. package/src/daemon/session-error.ts +17 -16
  391. package/src/daemon/session-lifecycle.ts +20 -1
  392. package/src/daemon/session-media-retry.ts +1 -15
  393. package/src/daemon/session-messaging.ts +14 -6
  394. package/src/daemon/session-process.ts +36 -7
  395. package/src/daemon/session-queue-manager.ts +62 -103
  396. package/src/daemon/session-runtime-assembly.ts +27 -7
  397. package/src/daemon/session-skill-tools.ts +12 -11
  398. package/src/daemon/session-slash.ts +7 -0
  399. package/src/daemon/session-surfaces.ts +192 -118
  400. package/src/daemon/session-tool-setup.ts +146 -6
  401. package/src/daemon/session.ts +75 -37
  402. package/src/errors.ts +0 -2
  403. package/src/export/formatter.ts +6 -0
  404. package/src/mcp/mcp-oauth-provider.ts +1 -3
  405. package/src/media/avatar-router.ts +20 -28
  406. package/src/media/avatar-types.ts +7 -14
  407. package/src/media/managed-avatar-client.ts +70 -34
  408. package/src/memory/app-store.ts +0 -18
  409. package/src/memory/conversation-title-service.ts +1 -2
  410. package/src/memory/db-init.ts +16 -0
  411. package/src/memory/embedding-backend.ts +129 -27
  412. package/src/memory/embedding-gemini.test.ts +256 -0
  413. package/src/memory/embedding-gemini.ts +47 -13
  414. package/src/memory/embedding-local.ts +14 -2
  415. package/src/memory/embedding-ollama.ts +15 -2
  416. package/src/memory/embedding-openai.ts +15 -2
  417. package/src/memory/embedding-types.test.ts +116 -0
  418. package/src/memory/embedding-types.ts +61 -0
  419. package/src/memory/fingerprint.ts +1 -1
  420. package/src/memory/indexer.ts +25 -1
  421. package/src/memory/job-handlers/embedding.test.ts +258 -0
  422. package/src/memory/job-handlers/embedding.ts +81 -1
  423. package/src/memory/job-handlers/index-maintenance.ts +35 -1
  424. package/src/memory/job-handlers/media-processing.ts +11 -1
  425. package/src/memory/job-utils.ts +21 -6
  426. package/src/memory/jobs-store.ts +5 -1
  427. package/src/memory/jobs-worker.ts +8 -0
  428. package/src/memory/message-content.ts +66 -0
  429. package/src/memory/migrations/100-core-tables.ts +1 -31
  430. package/src/memory/migrations/104-core-indexes.ts +0 -11
  431. package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
  432. package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
  433. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
  434. package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
  435. package/src/memory/migrations/index.ts +4 -0
  436. package/src/memory/migrations/registry.ts +19 -0
  437. package/src/memory/qdrant-client.ts +158 -43
  438. package/src/memory/retriever.test.ts +0 -1
  439. package/src/memory/retriever.ts +12 -2
  440. package/src/memory/schema/infrastructure.ts +5 -37
  441. package/src/memory/search/formatting.ts +34 -9
  442. package/src/memory/search/semantic.ts +57 -2
  443. package/src/memory/search/types.ts +2 -1
  444. package/src/notifications/AGENTS.md +2 -2
  445. package/src/notifications/README.md +59 -58
  446. package/src/notifications/adapters/macos.ts +1 -1
  447. package/src/notifications/broadcaster.ts +5 -5
  448. package/src/notifications/copy-composer.ts +1 -1
  449. package/src/notifications/decision-engine.ts +2 -2
  450. package/src/notifications/destination-resolver.ts +2 -2
  451. package/src/notifications/emit-signal.ts +8 -8
  452. package/src/notifications/signal.ts +1 -1
  453. package/src/notifications/thread-seed-composer.ts +1 -1
  454. package/src/oauth/connect-orchestrator.ts +1 -1
  455. package/src/oauth/token-persistence.ts +1 -1
  456. package/src/permissions/checker.ts +12 -1
  457. package/src/permissions/defaults.ts +13 -17
  458. package/src/permissions/trust-store.ts +37 -0
  459. package/src/permissions/workspace-policy.ts +0 -1
  460. package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
  461. package/src/prompts/computer-use-prompt.ts +1 -1
  462. package/src/prompts/system-prompt.ts +33 -35
  463. package/src/prompts/templates/BOOTSTRAP.md +0 -3
  464. package/src/prompts/templates/SOUL.md +1 -2
  465. package/src/prompts/templates/UPDATES.md +16 -7
  466. package/src/providers/anthropic/client.ts +87 -33
  467. package/src/providers/gemini/client.ts +6 -0
  468. package/src/providers/managed-proxy/constants.ts +5 -0
  469. package/src/providers/openai/client.ts +15 -0
  470. package/src/providers/registry.ts +4 -6
  471. package/src/providers/types.ts +24 -2
  472. package/src/runtime/AGENTS.md +18 -0
  473. package/src/runtime/assistant-event-hub.ts +2 -3
  474. package/src/runtime/assistant-event.ts +4 -4
  475. package/src/runtime/auth/__tests__/context.test.ts +5 -5
  476. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  477. package/src/runtime/auth/__tests__/guard-tests.test.ts +3 -2
  478. package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
  479. package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
  480. package/src/runtime/auth/__tests__/scopes.test.ts +9 -8
  481. package/src/runtime/auth/__tests__/subject.test.ts +8 -8
  482. package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
  483. package/src/runtime/auth/route-policy.ts +8 -8
  484. package/src/runtime/auth/scopes.ts +2 -1
  485. package/src/runtime/auth/subject.ts +4 -4
  486. package/src/runtime/auth/token-service.ts +1 -24
  487. package/src/runtime/auth/types.ts +3 -3
  488. package/src/runtime/guardian-action-followup-executor.ts +1 -1
  489. package/src/runtime/guardian-action-grant-minter.ts +1 -1
  490. package/src/runtime/guardian-action-service.ts +3 -3
  491. package/src/runtime/http-server.ts +15 -2
  492. package/src/runtime/http-types.ts +10 -0
  493. package/src/runtime/invite-service.ts +3 -3
  494. package/src/runtime/local-actor-identity.ts +17 -22
  495. package/src/runtime/middleware/error-handler.ts +14 -1
  496. package/src/runtime/pending-interactions.ts +21 -9
  497. package/src/runtime/routes/app-management-routes.ts +63 -67
  498. package/src/runtime/routes/approval-routes.ts +1 -3
  499. package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
  500. package/src/runtime/routes/brain-graph-routes.ts +4 -42
  501. package/src/runtime/routes/btw-routes.ts +155 -0
  502. package/src/runtime/routes/computer-use-routes.ts +77 -31
  503. package/src/runtime/routes/conversation-routes.ts +234 -47
  504. package/src/runtime/routes/diagnostics-routes.ts +154 -43
  505. package/src/runtime/routes/documents-routes.ts +2 -2
  506. package/src/runtime/routes/global-search-routes.ts +1 -1
  507. package/src/runtime/routes/host-bash-routes.ts +83 -0
  508. package/src/runtime/routes/host-file-routes.ts +79 -0
  509. package/src/runtime/routes/integrations/slack/share.ts +1 -1
  510. package/src/runtime/routes/log-export-routes.ts +120 -0
  511. package/src/runtime/routes/mcp-routes.ts +20 -0
  512. package/src/runtime/routes/migration-routes.ts +3 -3
  513. package/src/runtime/routes/pairing-routes.ts +1 -1
  514. package/src/runtime/routes/recording-routes.ts +6 -4
  515. package/src/runtime/routes/schedule-routes.ts +31 -5
  516. package/src/runtime/routes/session-management-routes.ts +2 -6
  517. package/src/runtime/routes/session-query-routes.ts +18 -15
  518. package/src/runtime/routes/settings-routes.ts +7 -351
  519. package/src/runtime/routes/skills-routes.ts +7 -6
  520. package/src/runtime/routes/subagents-routes.ts +4 -10
  521. package/src/runtime/routes/surface-action-routes.ts +3 -14
  522. package/src/runtime/routes/surface-content-routes.ts +22 -5
  523. package/src/runtime/routes/work-items-routes.ts +21 -25
  524. package/src/runtime/routes/workspace-routes.test.ts +3 -3
  525. package/src/runtime/routes/workspace-utils.ts +1 -1
  526. package/src/runtime/telegram-streaming-delivery.ts +3 -0
  527. package/src/runtime/verification-outbound-actions.ts +2 -2
  528. package/src/schedule/integration-status.ts +0 -6
  529. package/src/schedule/schedule-store.ts +234 -43
  530. package/src/schedule/scheduler.ts +73 -74
  531. package/src/security/oauth2.ts +1 -1
  532. package/src/sequence/store.ts +12 -2
  533. package/src/skills/frontmatter.ts +19 -77
  534. package/src/skills/managed-store.ts +11 -2
  535. package/src/subagent/manager.ts +5 -3
  536. package/src/tasks/ephemeral-permissions.ts +3 -5
  537. package/src/tools/AGENTS.md +37 -0
  538. package/src/tools/apps/executors.ts +0 -6
  539. package/src/tools/browser/browser-manager.ts +17 -11
  540. package/src/tools/browser/jit-auth.ts +4 -1
  541. package/src/tools/claude-code/claude-code.ts +1 -1
  542. package/src/tools/computer-use/definitions.ts +48 -60
  543. package/src/tools/document/document-tool.ts +6 -6
  544. package/src/tools/document/editor-template.ts +10 -8
  545. package/src/tools/filesystem/edit.ts +2 -1
  546. package/src/tools/filesystem/read.ts +20 -2
  547. package/src/tools/filesystem/write.ts +2 -1
  548. package/src/tools/host-filesystem/edit.ts +17 -1
  549. package/src/tools/host-filesystem/read.ts +16 -1
  550. package/src/tools/host-filesystem/write.ts +15 -1
  551. package/src/tools/host-terminal/host-shell.ts +24 -0
  552. package/src/tools/memory/definitions.ts +45 -81
  553. package/src/tools/memory/handlers.test.ts +0 -1
  554. package/src/tools/memory/handlers.ts +1 -1
  555. package/src/tools/memory/register.ts +26 -60
  556. package/src/tools/network/script-proxy/session-manager.ts +6 -8
  557. package/src/tools/network/web-fetch.ts +7 -1
  558. package/src/tools/network/web-search.ts +2 -1
  559. package/src/tools/registry.ts +23 -0
  560. package/src/tools/schedule/create.ts +113 -5
  561. package/src/tools/schedule/list.ts +57 -15
  562. package/src/tools/schedule/update.ts +73 -3
  563. package/src/tools/shared/filesystem/image-read.ts +192 -0
  564. package/src/tools/side-effects.ts +1 -7
  565. package/src/tools/skills/delete-managed.ts +27 -64
  566. package/src/tools/skills/execute.ts +54 -0
  567. package/src/tools/skills/load.ts +127 -5
  568. package/src/tools/skills/scaffold-managed.ts +93 -172
  569. package/src/tools/subagent/message.ts +0 -7
  570. package/src/tools/subagent/spawn.ts +1 -1
  571. package/src/tools/swarm/delegate.ts +0 -3
  572. package/src/tools/system/avatar-generator.ts +13 -19
  573. package/src/tools/system/request-permission.ts +2 -1
  574. package/src/tools/terminal/safe-env.ts +1 -0
  575. package/src/tools/tool-manifest.ts +41 -47
  576. package/src/tools/types.ts +6 -2
  577. package/src/tools/ui-surface/definitions.ts +0 -55
  578. package/src/util/errors.ts +12 -10
  579. package/src/workspace/git-service.ts +0 -2
  580. package/src/__tests__/account-registry.test.ts +0 -258
  581. package/src/__tests__/email-classifier.test.ts +0 -25
  582. package/src/__tests__/gmail-integration.test.ts +0 -97
  583. package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
  584. package/src/__tests__/home-base-bootstrap.test.ts +0 -84
  585. package/src/__tests__/managed-twitter-guardrails.test.ts +0 -353
  586. package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
  587. package/src/__tests__/recording-intent-fallback.test.ts +0 -199
  588. package/src/__tests__/recording-intent.test.ts +0 -985
  589. package/src/__tests__/recording-state-machine.test.ts +0 -1574
  590. package/src/__tests__/reminder-store.test.ts +0 -350
  591. package/src/__tests__/reminder.test.ts +0 -337
  592. package/src/__tests__/scan-result-store.test.ts +0 -121
  593. package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -450
  594. package/src/__tests__/view-image-tool.test.ts +0 -241
  595. package/src/cli/commands/amazon/cart.ts +0 -513
  596. package/src/cli/commands/amazon/checkout.ts +0 -394
  597. package/src/cli/commands/amazon/client.ts +0 -513
  598. package/src/cli/commands/amazon/index.ts +0 -920
  599. package/src/cli/commands/amazon/product-details.ts +0 -145
  600. package/src/cli/commands/amazon/request-extractor.ts +0 -187
  601. package/src/cli/commands/amazon/search.ts +0 -76
  602. package/src/cli/commands/amazon/session.ts +0 -116
  603. package/src/cli/commands/twitter/__tests__/cli-error-shaping.test.ts +0 -265
  604. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -483
  605. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -412
  606. package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -197
  607. package/src/cli/commands/twitter/client.ts +0 -989
  608. package/src/cli/commands/twitter/index.ts +0 -1160
  609. package/src/cli/commands/twitter/oauth-client.ts +0 -94
  610. package/src/cli/commands/twitter/router.ts +0 -396
  611. package/src/cli/commands/twitter/session.ts +0 -121
  612. package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
  613. package/src/config/bundled-skills/agentmail/icon.svg +0 -21
  614. package/src/config/bundled-skills/amazon/SKILL.md +0 -137
  615. package/src/config/bundled-skills/amazon/icon.svg +0 -13
  616. package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
  617. package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
  618. package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
  619. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
  620. package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
  621. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
  622. package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
  623. package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
  624. package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
  625. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
  626. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
  627. package/src/config/bundled-skills/influencer/SKILL.md +0 -144
  628. package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
  629. package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
  630. package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
  631. package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
  632. package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
  633. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
  634. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
  635. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
  636. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
  637. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
  638. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
  639. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
  640. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
  641. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
  642. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
  643. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
  644. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
  645. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
  646. package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
  647. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
  648. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
  649. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
  650. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
  651. package/src/config/bundled-skills/notion/SKILL.md +0 -240
  652. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
  653. package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
  654. package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
  655. package/src/config/bundled-skills/reminder/SKILL.md +0 -79
  656. package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
  657. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
  658. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
  659. package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
  660. package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
  661. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
  662. package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
  663. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
  664. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
  665. package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
  666. package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
  667. package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
  668. package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
  669. package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
  670. package/src/config/bundled-skills/twitter/SKILL.md +0 -319
  671. package/src/config/bundled-skills/twitter/icon.svg +0 -14
  672. package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
  673. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
  674. package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
  675. package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
  676. package/src/daemon/handlers/pairing.ts +0 -119
  677. package/src/daemon/handlers/session-user-message.ts +0 -961
  678. package/src/daemon/recording-executor.ts +0 -180
  679. package/src/daemon/recording-intent-fallback.ts +0 -162
  680. package/src/daemon/recording-intent.ts +0 -493
  681. package/src/home-base/app-link-store.ts +0 -78
  682. package/src/home-base/bootstrap.ts +0 -74
  683. package/src/home-base/prebuilt/brain-graph.html +0 -1483
  684. package/src/home-base/prebuilt/index.html +0 -702
  685. package/src/home-base/prebuilt/seed-metadata.json +0 -21
  686. package/src/home-base/prebuilt/seed.ts +0 -122
  687. package/src/home-base/prebuilt-home-base-updater.ts +0 -36
  688. package/src/memory/account-store.ts +0 -117
  689. package/src/messaging/activity-analyzer.ts +0 -76
  690. package/src/messaging/email-classifier.ts +0 -208
  691. package/src/messaging/index.ts +0 -2
  692. package/src/messaging/outreach-classifier.ts +0 -185
  693. package/src/messaging/thread-summarizer.ts +0 -346
  694. package/src/messaging/types.ts +0 -17
  695. package/src/tools/browser/x-auto-navigate.ts +0 -254
  696. package/src/tools/credentials/account-registry.ts +0 -144
  697. package/src/tools/filesystem/view-image.ts +0 -244
  698. package/src/tools/reminder/reminder-store.ts +0 -194
  699. package/src/tools/reminder/reminder.ts +0 -158
  700. package/src/tools/system/navigate-settings.ts +0 -74
  701. package/src/tools/system/open-system-settings.ts +0 -85
  702. package/src/tools/system/version.ts +0 -54
  703. package/src/twitter/platform-proxy-client.ts +0 -405
  704. package/src/util/cookie-session.ts +0 -98
  705. /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
  706. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
  707. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
  708. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
  709. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
  710. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
  711. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
  712. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
  713. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
@@ -21,7 +21,6 @@ mock.module("../util/platform.js", () => ({
21
21
  isMacOS: () => process.platform === "darwin",
22
22
  isLinux: () => process.platform === "linux",
23
23
  isWindows: () => process.platform === "win32",
24
- getSocketPath: () => join(testDir, "test.sock"),
25
24
  getPidPath: () => join(testDir, "test.pid"),
26
25
  getDbPath: () => join(testDir, "test.db"),
27
26
  getLogPath: () => join(testDir, "test.log"),
@@ -56,8 +56,6 @@ function loadRegistry(): Registry {
56
56
  * exercising legacy paths.
57
57
  */
58
58
  const LEGACY_KEY_ALLOWLIST = new Set([
59
- // Legacy wrapper (deprecated, kept for migration)
60
- "assistant/src/config/skill-state.ts",
61
59
  // Type definitions documenting the legacy format
62
60
  "assistant/src/config/types.ts",
63
61
  // macOS client: fallback reads from legacy config section
@@ -32,7 +32,8 @@ let currentConfig: Record<string, unknown> = {
32
32
  sandbox: { enabled: false, backend: "native" },
33
33
  };
34
34
 
35
- const DECLARED_FLAG_KEY = "feature_flags.hatch-new-assistant.enabled";
35
+ const DECLARED_FLAG_ID = "hatch-new-assistant";
36
+ const DECLARED_FLAG_KEY = `feature_flags.${DECLARED_FLAG_ID}.enabled`;
36
37
  const DECLARED_SKILL_ID = "hatch-new-assistant";
37
38
 
38
39
  // eslint-disable-next-line @typescript-eslint/no-require-imports
@@ -47,7 +48,6 @@ mock.module("../util/platform.js", () => ({
47
48
  getWorkspaceHooksDir: () => join(TEST_DIR, "hooks"),
48
49
  getWorkspacePromptPath: (file: string) => join(TEST_DIR, file),
49
50
  ensureDataDir: () => {},
50
- getSocketPath: () => join(TEST_DIR, "vellum.sock"),
51
51
  getPidPath: () => join(TEST_DIR, "vellum.pid"),
52
52
  getDbPath: () => join(TEST_DIR, "data", "assistant.db"),
53
53
  getLogPath: () => join(TEST_DIR, "logs", "vellum.log"),
@@ -138,12 +138,16 @@ function createSkillOnDisk(
138
138
  id: string,
139
139
  name: string,
140
140
  description: string,
141
+ featureFlag?: string,
141
142
  ): void {
142
143
  const skillsDir = join(TEST_DIR, "skills");
143
144
  mkdirSync(join(skillsDir, id), { recursive: true });
145
+ const ffBlock = featureFlag
146
+ ? `\nmetadata: {"vellum":{"feature-flag":"${featureFlag}"}}`
147
+ : "";
144
148
  writeFileSync(
145
149
  join(skillsDir, id, "SKILL.md"),
146
- `---\nname: "${name}"\ndescription: "${description}"\n---\n\nInstructions for ${id}.\n`,
150
+ `---\nname: "${name}"\ndescription: "${description}"${ffBlock}\n---\n\nInstructions for ${id}.\n`,
147
151
  );
148
152
  const indexPath = join(skillsDir, "SKILLS.md");
149
153
  const existing = existsSync(indexPath)
@@ -162,21 +166,27 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
162
166
  DECLARED_SKILL_ID,
163
167
  "Hatch New Assistant",
164
168
  "Toggle hatch new assistant behavior",
169
+ DECLARED_FLAG_ID,
170
+ );
171
+ createSkillOnDisk(
172
+ "browser",
173
+ "Browser",
174
+ "Web browsing automation",
175
+ "browser",
165
176
  );
166
- createSkillOnDisk("twitter", "Twitter", "Post to X/Twitter");
167
177
 
168
178
  currentConfig = {
169
179
  sandbox: { enabled: false, backend: "native" },
170
180
  assistantFeatureFlagValues: {
171
181
  [DECLARED_FLAG_KEY]: false,
172
- "feature_flags.twitter.enabled": true,
182
+ "feature_flags.browser.enabled": true,
173
183
  },
174
184
  };
175
185
 
176
186
  const result = buildSystemPrompt();
177
187
 
178
- // twitter is explicitly enabled, declared flagged skill is explicitly off
179
- expect(result).toContain('id="twitter"');
188
+ // browser is explicitly enabled, declared flagged skill is explicitly off
189
+ expect(result).toContain('id="browser"');
180
190
  expect(result).not.toContain(`id="${DECLARED_SKILL_ID}"`);
181
191
  });
182
192
 
@@ -185,8 +195,14 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
185
195
  DECLARED_SKILL_ID,
186
196
  "Hatch New Assistant",
187
197
  "Toggle hatch new assistant behavior",
198
+ DECLARED_FLAG_ID,
199
+ );
200
+ createSkillOnDisk(
201
+ "contacts",
202
+ "Contacts",
203
+ "View and manage contacts",
204
+ "contacts",
188
205
  );
189
- createSkillOnDisk("twitter", "Twitter", "Post to X/Twitter");
190
206
 
191
207
  currentConfig = {
192
208
  sandbox: { enabled: false, backend: "native" },
@@ -194,9 +210,9 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
194
210
 
195
211
  const result = buildSystemPrompt();
196
212
 
197
- // Both skills are declared in the registry with defaultEnabled: false
213
+ // Both skills declare feature flags with registry defaultEnabled: false
198
214
  expect(result).not.toContain(`id="${DECLARED_SKILL_ID}"`);
199
- expect(result).not.toContain('id="twitter"');
215
+ expect(result).not.toContain('id="contacts"');
200
216
  });
201
217
 
202
218
  test("flagged-off skills hidden when all flags are OFF", () => {
@@ -204,21 +220,27 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
204
220
  DECLARED_SKILL_ID,
205
221
  "Hatch New Assistant",
206
222
  "Toggle hatch new assistant behavior",
223
+ DECLARED_FLAG_ID,
224
+ );
225
+ createSkillOnDisk(
226
+ "contacts",
227
+ "Contacts",
228
+ "View and manage contacts",
229
+ "contacts",
207
230
  );
208
- createSkillOnDisk("twitter", "Twitter", "Post to X/Twitter");
209
231
 
210
232
  currentConfig = {
211
233
  sandbox: { enabled: false, backend: "native" },
212
234
  assistantFeatureFlagValues: {
213
235
  [DECLARED_FLAG_KEY]: false,
214
- "feature_flags.twitter.enabled": false,
236
+ "feature_flags.contacts.enabled": false,
215
237
  },
216
238
  };
217
239
 
218
240
  const result = buildSystemPrompt();
219
241
 
220
242
  expect(result).not.toContain(`id="${DECLARED_SKILL_ID}"`);
221
- expect(result).not.toContain('id="twitter"');
243
+ expect(result).not.toContain('id="contacts"');
222
244
  });
223
245
 
224
246
  test("assistantFeatureFlagValues overrides control visibility", () => {
@@ -226,6 +248,7 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
226
248
  DECLARED_SKILL_ID,
227
249
  "Hatch New Assistant",
228
250
  "Toggle hatch new assistant behavior",
251
+ DECLARED_FLAG_ID,
229
252
  );
230
253
 
231
254
  currentConfig = {
@@ -239,7 +262,12 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
239
262
  });
240
263
 
241
264
  test("persisted overrides for undeclared flags are respected", () => {
242
- createSkillOnDisk("browser", "Browser", "Web browsing automation");
265
+ createSkillOnDisk(
266
+ "browser",
267
+ "Browser",
268
+ "Web browsing automation",
269
+ "browser",
270
+ );
243
271
 
244
272
  currentConfig = {
245
273
  sandbox: { enabled: false, backend: "native" },
@@ -248,13 +276,18 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
248
276
 
249
277
  const result = buildSystemPrompt();
250
278
 
251
- // Even though 'browser' is not in the defaults registry, the user
279
+ // browser declares featureFlag: "browser" and the user
252
280
  // explicitly disabled it — that override must be honored.
253
281
  expect(result).not.toContain('id="browser"');
254
282
  });
255
283
 
256
284
  test("declared flags with no persisted override use registry default", () => {
257
- createSkillOnDisk("browser", "Browser", "Web browsing automation");
285
+ createSkillOnDisk(
286
+ "browser",
287
+ "Browser",
288
+ "Web browsing automation",
289
+ "browser",
290
+ );
258
291
 
259
292
  currentConfig = {
260
293
  sandbox: { enabled: false, backend: "native" },
@@ -265,6 +298,19 @@ describe("buildSystemPrompt assistant feature flag filtering", () => {
265
298
  // browser is declared in the registry with defaultEnabled: true
266
299
  expect(result).toContain('id="browser"');
267
300
  });
301
+
302
+ test("skill without featureFlag is never flag-gated", () => {
303
+ createSkillOnDisk("my-skill", "My Skill", "A skill without feature flag");
304
+
305
+ currentConfig = {
306
+ sandbox: { enabled: false, backend: "native" },
307
+ };
308
+
309
+ const result = buildSystemPrompt();
310
+
311
+ // Skills without featureFlag declared are never gated — always pass through
312
+ expect(result).toContain('id="my-skill"');
313
+ });
268
314
  });
269
315
 
270
316
  // ---------------------------------------------------------------------------
@@ -329,7 +375,10 @@ describe("isAssistantFeatureFlagEnabled with skillFlagKey", () => {
329
375
  } as any;
330
376
 
331
377
  expect(
332
- isAssistantFeatureFlagEnabled(skillFlagKey(DECLARED_SKILL_ID), config),
378
+ isAssistantFeatureFlagEnabled(
379
+ skillFlagKey({ featureFlag: DECLARED_FLAG_ID })!,
380
+ config,
381
+ ),
333
382
  ).toBe(false);
334
383
  });
335
384
 
@@ -337,7 +386,10 @@ describe("isAssistantFeatureFlagEnabled with skillFlagKey", () => {
337
386
  const config = {} as any;
338
387
 
339
388
  expect(
340
- isAssistantFeatureFlagEnabled(skillFlagKey(DECLARED_SKILL_ID), config),
389
+ isAssistantFeatureFlagEnabled(
390
+ skillFlagKey({ featureFlag: DECLARED_FLAG_ID })!,
391
+ config,
392
+ ),
341
393
  ).toBe(false);
342
394
  });
343
395
  });
@@ -244,7 +244,7 @@ describe("assistant ID boundary", () => {
244
244
  // Excluded:
245
245
  // - Test files (they may legitimately assert against the value)
246
246
  // - Migration files (SQL literals like DEFAULT 'self' are fine)
247
- // - IPC contract files (comments documenting default values are fine)
247
+ // - Message contract files (comments documenting default values are fine)
248
248
  // - CSP headers ('self' in Content-Security-Policy has nothing to do with assistant IDs)
249
249
  const pattern = `(assistantId|assistant_id).*['"]self['"]`;
250
250
 
@@ -307,21 +307,21 @@ describe("assistant ID boundary", () => {
307
307
  // -------------------------------------------------------------------------
308
308
  // Rule (e): No assistantId on daemon control-plane request/param types
309
309
  //
310
- // Daemon IPC contracts and guardian outbound param interfaces must not
310
+ // Daemon message contracts and guardian outbound param interfaces must not
311
311
  // accept an assistantId field -- the daemon always uses
312
312
  // DAEMON_INTERNAL_ASSISTANT_ID internally. Accepting assistantId on these
313
313
  // surfaces invites callers to pass external IDs into daemon scoping.
314
314
  // -------------------------------------------------------------------------
315
315
 
316
- test("IPC contract types do not contain assistantId for guardian requests", () => {
317
- const ipcContractPath = join(
316
+ test("message contract types do not contain assistantId for guardian requests", () => {
317
+ const contractPath = join(
318
318
  import.meta.dir,
319
319
  "..",
320
320
  "daemon",
321
321
  "message-types",
322
322
  "integrations.ts",
323
323
  );
324
- const content = readFileSync(ipcContractPath, "utf-8");
324
+ const content = readFileSync(contractPath, "utf-8");
325
325
 
326
326
  // Extract the interface blocks for the request types and verify
327
327
  // none of them declare an assistantId property.
@@ -334,7 +334,7 @@ describe("assistant ID boundary", () => {
334
334
  const typeIndex = content.indexOf(typeName);
335
335
  expect(
336
336
  typeIndex,
337
- `Expected to find ${typeName} in IPC contract`,
337
+ `Expected to find ${typeName} in message contract`,
338
338
  ).toBeGreaterThan(-1);
339
339
 
340
340
  // Extract from the type declaration to the next '}' line
@@ -10,7 +10,6 @@ mock.module("../util/platform.js", () => ({
10
10
  isMacOS: () => process.platform === "darwin",
11
11
  isLinux: () => process.platform === "linux",
12
12
  isWindows: () => process.platform === "win32",
13
- getSocketPath: () => join(testDir, "test.sock"),
14
13
  getPidPath: () => join(testDir, "test.pid"),
15
14
  getDbPath: () => join(testDir, "test.db"),
16
15
  getLogPath: () => join(testDir, "test.log"),
@@ -4,7 +4,6 @@ import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
4
4
  // Mock state — mutable variables control per-test behavior
5
5
  // ---------------------------------------------------------------------------
6
6
 
7
- let mockStrategy: string = "local_only";
8
7
  let mockGeminiKey: string | undefined = "test-gemini-key";
9
8
  let mockApiKey: string | undefined = "test-api-key-123";
10
9
  let mockBaseUrl = "https://platform.test.vellum.ai";
@@ -33,7 +32,6 @@ const geminiGenerateContentFn = mock(async () => geminiGenerateContentResult);
33
32
  mock.module("../config/loader.js", () => ({
34
33
  getConfig: () => ({
35
34
  apiKeys: { gemini: mockGeminiKey },
36
- avatar: { generationStrategy: mockStrategy },
37
35
  platform: { baseUrl: mockBaseUrl },
38
36
  imageGenModel: "gemini-2.5-flash-image",
39
37
  }),
@@ -125,19 +123,15 @@ function executeAvatar(description: string) {
125
123
  );
126
124
  }
127
125
 
128
- /** Standard successful managed avatar platform response. */
126
+ /** Standard successful Vertex predictions response. */
129
127
  function managedPlatformResponse() {
130
128
  return {
131
- image: {
132
- mime_type: "image/png",
133
- data_base64: "iVBORw0KGgoAAAANSUhEUg==",
134
- bytes: 1024,
135
- sha256: "abc123",
136
- },
137
- usage: { billable: true, class_name: "assistant_avatar_system" },
138
- generation_source: "vertex",
139
- profile: "avatar_v1",
140
- correlation_id: "managed-corr-id-123",
129
+ predictions: [
130
+ {
131
+ bytesBase64Encoded: "iVBORw0KGgoAAAANSUhEUg==",
132
+ mimeType: "image/png",
133
+ },
134
+ ],
141
135
  };
142
136
  }
143
137
 
@@ -171,6 +165,10 @@ function mockFetchReturning(response: {
171
165
  ok: response.ok,
172
166
  status: response.status,
173
167
  json: async () => response.body,
168
+ text: async () =>
169
+ typeof response.body === "string"
170
+ ? response.body
171
+ : JSON.stringify(response.body),
174
172
  }),
175
173
  ) as unknown as typeof globalThis.fetch;
176
174
  }
@@ -189,7 +187,6 @@ describe("avatar E2E integration", () => {
189
187
  const originalGeminiKey = process.env.GEMINI_API_KEY;
190
188
 
191
189
  beforeEach(() => {
192
- mockStrategy = "local_only";
193
190
  mockGeminiKey = "test-gemini-key";
194
191
  mockApiKey = "test-api-key-123";
195
192
  mockBaseUrl = "https://platform.test.vellum.ai";
@@ -225,8 +222,7 @@ describe("avatar E2E integration", () => {
225
222
  // 1. Managed success E2E
226
223
  // -----------------------------------------------------------------------
227
224
 
228
- test("managed_required success — file written, correct content, success message", async () => {
229
- mockStrategy = "managed_required";
225
+ test("managed success — file written, correct content, success message", async () => {
230
226
  mockFetchReturning({
231
227
  ok: true,
232
228
  status: 200,
@@ -261,43 +257,10 @@ describe("avatar E2E integration", () => {
261
257
  });
262
258
 
263
259
  // -----------------------------------------------------------------------
264
- // 2. Managed-required failure E2E no fallback
265
- // -----------------------------------------------------------------------
266
-
267
- test("managed_required failure — error surfaced, no file written, no fallback", async () => {
268
- mockStrategy = "managed_required";
269
- mockFetchReturning({
270
- ok: false,
271
- status: 500,
272
- body: {
273
- code: "internal_error",
274
- subcode: "server_fault",
275
- detail: "Internal server error",
276
- retryable: true,
277
- correlation_id: "corr-500",
278
- },
279
- });
280
-
281
- const result = await executeAvatar("a friendly robot");
282
-
283
- // Verify error is surfaced
284
- expect(result.isError).toBe(true);
285
- expect(result.content).toContain("failed");
286
-
287
- // Verify no file was written
288
- expect(writeFileSyncFn).not.toHaveBeenCalled();
289
- expect(renameSyncFn).not.toHaveBeenCalled();
290
-
291
- // Verify Gemini was never called (no fallback)
292
- expect(geminiGenerateContentFn).not.toHaveBeenCalled();
293
- });
294
-
295
- // -----------------------------------------------------------------------
296
- // 3. Managed-prefer fallback E2E
260
+ // 2. Managed failure — falls back to local
297
261
  // -----------------------------------------------------------------------
298
262
 
299
- test("managed_prefer fallbackmanaged fails, local Gemini used, file written", async () => {
300
- mockStrategy = "managed_prefer";
263
+ test("managed failurefalls back to local Gemini, file written", async () => {
301
264
  mockFetchReturning({
302
265
  ok: false,
303
266
  status: 502,
@@ -325,11 +288,10 @@ describe("avatar E2E integration", () => {
325
288
  });
326
289
 
327
290
  // -----------------------------------------------------------------------
328
- // 4. Managed-prefer no-fallback when managed unavailable (no API key)
291
+ // 3. No managed prerequisites goes straight to local
329
292
  // -----------------------------------------------------------------------
330
293
 
331
- test("managed_prefer without API key — goes straight to local Gemini", async () => {
332
- mockStrategy = "managed_prefer";
294
+ test("no managed API key — goes straight to local Gemini", async () => {
333
295
  mockApiKey = undefined; // No managed API key available
334
296
 
335
297
  const result = await executeAvatar("a cute cat");
@@ -347,81 +309,76 @@ describe("avatar E2E integration", () => {
347
309
  });
348
310
 
349
311
  // -----------------------------------------------------------------------
350
- // 5. Local-only E2E
312
+ // 4. No managed prerequisites and no local key — error
351
313
  // -----------------------------------------------------------------------
352
314
 
353
- test("local_only only local Gemini called, managed never contacted", async () => {
354
- mockStrategy = "local_only";
355
- const fetchMock = mock(() =>
356
- Promise.resolve({ ok: true, status: 200, json: async () => ({}) }),
357
- );
358
- globalThis.fetch = fetchMock as unknown as typeof globalThis.fetch;
315
+ test("no managed API key and no Gemini key error surfaced", async () => {
316
+ mockApiKey = undefined;
317
+ mockGeminiKey = undefined;
359
318
 
360
319
  const result = await executeAvatar("a whimsical owl");
361
320
 
362
- // Verify success
363
- expect(result.isError).toBe(false);
364
- expect(result.content).toContain("Avatar updated");
365
-
366
- // Verify Gemini was called
367
- expect(geminiGenerateContentFn).toHaveBeenCalledTimes(1);
368
-
369
- // Verify managed endpoint was never contacted
370
- expect(fetchMock).not.toHaveBeenCalled();
371
-
372
- // Verify file was written
373
- expect(writeFileSyncFn).toHaveBeenCalledTimes(1);
374
- expect(renameSyncFn).toHaveBeenCalledTimes(1);
321
+ expect(result.isError).toBe(true);
322
+ expect(result.content).toContain("failed");
375
323
  });
376
324
 
377
325
  // -----------------------------------------------------------------------
378
- // 6. Response validation — bad MIME type
326
+ // 5. Response validation — bad MIME type
379
327
  // -----------------------------------------------------------------------
380
328
 
381
- test("managed response with disallowed MIME type — rejected, no file written", async () => {
382
- mockStrategy = "managed_required";
383
- const badResponse = managedPlatformResponse();
384
- badResponse.image.mime_type = "image/gif";
385
- mockFetchReturning({ ok: true, status: 200, body: badResponse });
329
+ test("managed response with disallowed MIME type — falls back to local", async () => {
330
+ mockFetchReturning({
331
+ ok: true,
332
+ status: 200,
333
+ body: {
334
+ predictions: [
335
+ {
336
+ bytesBase64Encoded: "iVBORw0KGgoAAAANSUhEUg==",
337
+ mimeType: "image/gif",
338
+ },
339
+ ],
340
+ },
341
+ });
386
342
 
387
343
  const result = await executeAvatar("a cat");
388
344
 
389
- // Verify error returned
390
- expect(result.isError).toBe(true);
391
- expect(result.content).toContain("failed");
392
-
393
- // Verify no file was written
394
- expect(writeFileSyncFn).not.toHaveBeenCalled();
395
- expect(renameSyncFn).not.toHaveBeenCalled();
345
+ // Managed fails validation, falls back to local Gemini
346
+ expect(result.isError).toBe(false);
347
+ expect(result.content).toContain("Avatar updated");
348
+ expect(geminiGenerateContentFn).toHaveBeenCalledTimes(1);
396
349
  });
397
350
 
398
351
  // -----------------------------------------------------------------------
399
- // 7. Response validation — oversized image
352
+ // 6. Response validation — oversized image
400
353
  // -----------------------------------------------------------------------
401
354
 
402
- test("managed response with oversized data — rejected, no file written", async () => {
403
- mockStrategy = "managed_required";
404
- const oversizedResponse = managedPlatformResponse();
405
- oversizedResponse.image.bytes = AVATAR_MAX_DECODED_BYTES + 1;
406
- mockFetchReturning({ ok: true, status: 200, body: oversizedResponse });
355
+ test("managed response with oversized data — falls back to local", async () => {
356
+ const oversizedBase64 = "A".repeat(
357
+ Math.ceil(((AVATAR_MAX_DECODED_BYTES + 100) * 4) / 3),
358
+ );
359
+ mockFetchReturning({
360
+ ok: true,
361
+ status: 200,
362
+ body: {
363
+ predictions: [
364
+ { bytesBase64Encoded: oversizedBase64, mimeType: "image/png" },
365
+ ],
366
+ },
367
+ });
407
368
 
408
369
  const result = await executeAvatar("a cat");
409
370
 
410
- // Verify error returned
411
- expect(result.isError).toBe(true);
412
- expect(result.content).toContain("failed");
413
-
414
- // Verify no file was written
415
- expect(writeFileSyncFn).not.toHaveBeenCalled();
416
- expect(renameSyncFn).not.toHaveBeenCalled();
371
+ // Managed fails validation, falls back to local Gemini
372
+ expect(result.isError).toBe(false);
373
+ expect(result.content).toContain("Avatar updated");
374
+ expect(geminiGenerateContentFn).toHaveBeenCalledTimes(1);
417
375
  });
418
376
 
419
377
  // -----------------------------------------------------------------------
420
- // 8. Rate limit user message
378
+ // 7. Rate limit falls back to local
421
379
  // -----------------------------------------------------------------------
422
380
 
423
- test("managed 429 response — user-friendly rate limit message", async () => {
424
- mockStrategy = "managed_required";
381
+ test("managed 429 response — falls back to local Gemini", async () => {
425
382
  mockFetchReturning({
426
383
  ok: false,
427
384
  status: 429,
@@ -436,19 +393,22 @@ describe("avatar E2E integration", () => {
436
393
 
437
394
  const result = await executeAvatar("a cat");
438
395
 
439
- expect(result.isError).toBe(true);
440
- expect(result.content.toLowerCase()).toContain("rate limited");
396
+ // Falls back to local successfully
397
+ expect(result.isError).toBe(false);
398
+ expect(result.content).toContain("Avatar updated");
399
+ expect(geminiGenerateContentFn).toHaveBeenCalledTimes(1);
441
400
  });
442
401
 
443
402
  // -----------------------------------------------------------------------
444
- // 9. Correlation ID propagation
403
+ // 8. Correlation ID propagation
445
404
  // -----------------------------------------------------------------------
446
405
 
447
- test("managed success — correlation ID from response is propagated through the pipeline", async () => {
448
- mockStrategy = "managed_required";
449
- const response = managedPlatformResponse();
450
- response.correlation_id = "unique-corr-id-xyz";
451
- mockFetchReturning({ ok: true, status: 200, body: response });
406
+ test("managed success — correlation ID is propagated through the pipeline", async () => {
407
+ mockFetchReturning({
408
+ ok: true,
409
+ status: 200,
410
+ body: managedPlatformResponse(),
411
+ });
452
412
 
453
413
  const result = await executeAvatar("a robot");
454
414
 
@@ -456,15 +416,14 @@ describe("avatar E2E integration", () => {
456
416
  expect(result.isError).toBe(false);
457
417
  expect(writeFileSyncFn).toHaveBeenCalled();
458
418
 
419
+ // Correlation ID is now generated client-side, so just verify one is logged
459
420
  const correlationLogged = logInfoCalls.some(([meta, message]) => {
460
421
  if (message !== "Avatar saved successfully") return false;
461
422
  if (!meta || typeof meta !== "object" || !("correlationId" in meta)) {
462
423
  return false;
463
424
  }
464
- return (
465
- (meta as { correlationId?: unknown }).correlationId ===
466
- "unique-corr-id-xyz"
467
- );
425
+ const cid = (meta as { correlationId?: unknown }).correlationId;
426
+ return typeof cid === "string" && cid.length > 0;
468
427
  });
469
428
 
470
429
  expect(correlationLogged).toBe(true);