@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
@@ -4,7 +4,6 @@ import { beforeEach, describe, expect, mock, test } from "bun:test";
4
4
  // Mock state
5
5
  // ---------------------------------------------------------------------------
6
6
 
7
- let mockStrategy: string | undefined;
8
7
  let mockGeminiKey: string | undefined = "test-gemini-key";
9
8
  let mockManagedAvailable = true;
10
9
  let mockManagedResult: unknown;
@@ -27,7 +26,6 @@ const isManagedAvailableFn = mock(() => mockManagedAvailable);
27
26
  mock.module("../config/loader.js", () => ({
28
27
  getConfig: () => ({
29
28
  apiKeys: { gemini: mockGeminiKey },
30
- avatar: { generationStrategy: mockStrategy ?? "local_only" },
31
29
  }),
32
30
  }));
33
31
 
@@ -50,10 +48,7 @@ mock.module("../media/gemini-image-service.js", () => ({
50
48
  }));
51
49
 
52
50
  // Import after mocking
53
- import {
54
- getAvatarStrategy,
55
- routedGenerateAvatar,
56
- } from "../media/avatar-router.js";
51
+ import { routedGenerateAvatar } from "../media/avatar-router.js";
57
52
 
58
53
  // ---------------------------------------------------------------------------
59
54
  // Helpers
@@ -67,9 +62,6 @@ function managedResponse() {
67
62
  bytes: 1024,
68
63
  sha256: "abc",
69
64
  },
70
- usage: { billable: false, class_name: "assistant_avatar_system" },
71
- generation_source: "vertex",
72
- profile: "avatar_v1",
73
65
  correlation_id: "test-correlation-id",
74
66
  };
75
67
  }
@@ -87,7 +79,6 @@ function geminiResponse() {
87
79
 
88
80
  describe("avatar-router", () => {
89
81
  beforeEach(() => {
90
- mockStrategy = undefined;
91
82
  mockGeminiKey = "test-gemini-key";
92
83
  mockManagedAvailable = true;
93
84
  mockManagedResult = managedResponse();
@@ -98,9 +89,7 @@ describe("avatar-router", () => {
98
89
  isManagedAvailableFn.mockClear();
99
90
  });
100
91
 
101
- // 1. managed_required managed success
102
- test("managed_required returns pathUsed managed on success", async () => {
103
- mockStrategy = "managed_required";
92
+ test("uses managed path when available", async () => {
104
93
  const result = await routedGenerateAvatar("a cute cat");
105
94
  expect(result.pathUsed).toBe("managed");
106
95
  expect(result.imageBase64).toBe("base64data");
@@ -109,31 +98,25 @@ describe("avatar-router", () => {
109
98
  expect(generateImageFn).not.toHaveBeenCalled();
110
99
  });
111
100
 
112
- // 2. managed_required managed failure throws, no fallback
113
- test("managed_required throws on managed failure without fallback", async () => {
114
- mockStrategy = "managed_required";
115
- mockManagedError = new Error("upstream error");
116
- await expect(routedGenerateAvatar("a cute cat")).rejects.toThrow(
117
- "upstream error",
118
- );
119
- expect(generateImageFn).not.toHaveBeenCalled();
101
+ test("falls back to local when managed fails", async () => {
102
+ mockManagedError = new Error("managed failed");
103
+ const result = await routedGenerateAvatar("a cute cat");
104
+ expect(result.pathUsed).toBe("local");
105
+ expect(generateManagedAvatarFn).toHaveBeenCalledTimes(1);
106
+ expect(generateImageFn).toHaveBeenCalledTimes(1);
120
107
  });
121
108
 
122
- // 3. local_only calls local Gemini, never managed
123
- test("local_only calls local Gemini and never managed", async () => {
124
- mockStrategy = "local_only";
109
+ test("goes to local when managed unavailable", async () => {
110
+ mockManagedAvailable = false;
125
111
  const result = await routedGenerateAvatar("a cute cat");
126
112
  expect(result.pathUsed).toBe("local");
127
- expect(result.imageBase64).toBe("base64data");
128
- expect(generateImageFn).toHaveBeenCalledTimes(1);
129
113
  expect(generateManagedAvatarFn).not.toHaveBeenCalled();
114
+ expect(generateImageFn).toHaveBeenCalledTimes(1);
130
115
  });
131
116
 
132
- // 4. local_only missing Gemini API key throws
133
- test("local_only throws when Gemini API key is missing", async () => {
134
- mockStrategy = "local_only";
117
+ test("throws when managed unavailable and no Gemini key", async () => {
118
+ mockManagedAvailable = false;
135
119
  mockGeminiKey = undefined;
136
- // Also clear the env var to ensure no fallback
137
120
  const saved = process.env.GEMINI_API_KEY;
138
121
  delete process.env.GEMINI_API_KEY;
139
122
  try {
@@ -146,41 +129,21 @@ describe("avatar-router", () => {
146
129
  }
147
130
  });
148
131
 
149
- // 5. managed_prefer managed success
150
- test("managed_prefer returns pathUsed managed on success", async () => {
151
- mockStrategy = "managed_prefer";
152
- const result = await routedGenerateAvatar("a cute cat");
153
- expect(result.pathUsed).toBe("managed");
132
+ test("forwards model to generateManagedAvatar", async () => {
133
+ const result = await routedGenerateAvatar("a cute cat", {
134
+ model: "imagen-3.0-generate-002",
135
+ });
154
136
  expect(generateManagedAvatarFn).toHaveBeenCalledTimes(1);
155
- expect(generateImageFn).not.toHaveBeenCalled();
156
- });
157
-
158
- // 6. managed_prefer — managed failure falls back to local
159
- test("managed_prefer falls back to local on managed failure", async () => {
160
- mockStrategy = "managed_prefer";
161
- mockManagedError = new Error("managed failed");
162
- const result = await routedGenerateAvatar("a cute cat");
163
- expect(result.pathUsed).toBe("local");
164
- expect(generateManagedAvatarFn).toHaveBeenCalledTimes(1);
165
- expect(generateImageFn).toHaveBeenCalledTimes(1);
137
+ expect(generateManagedAvatarFn).toHaveBeenCalledWith("a cute cat", {
138
+ correlationId: undefined,
139
+ model: "imagen-3.0-generate-002",
140
+ });
141
+ expect(result.model).toBe("imagen-3.0-generate-002");
142
+ expect(result.pathUsed).toBe("managed");
166
143
  });
167
144
 
168
- // 7. managed_prefer managed unavailable goes directly to local
169
- test("managed_prefer goes to local when managed unavailable", async () => {
170
- mockStrategy = "managed_prefer";
171
- mockManagedAvailable = false;
145
+ test("model is undefined in result when not provided", async () => {
172
146
  const result = await routedGenerateAvatar("a cute cat");
173
- expect(result.pathUsed).toBe("local");
174
- expect(generateManagedAvatarFn).not.toHaveBeenCalled();
175
- expect(generateImageFn).toHaveBeenCalledTimes(1);
147
+ expect(result.model).toBeUndefined();
176
148
  });
177
-
178
- // 8. Default strategy is local_only when config key absent
179
- test("defaults to local_only when config key is absent", () => {
180
- mockStrategy = undefined;
181
- expect(getAvatarStrategy()).toBe("local_only");
182
- });
183
-
184
- // 9. Removed: Invalid strategy values are now rejected at config parse time
185
- // by the Zod schema, so they cannot reach getAvatarStrategy().
186
149
  });
@@ -15,6 +15,7 @@ mock.module("../util/logger.js", () => ({
15
15
 
16
16
  import {
17
17
  browserManager,
18
+ sanitizeDownloadFilename,
18
19
  setLaunchFn,
19
20
  } from "../tools/browser/browser-manager.js";
20
21
 
@@ -73,6 +74,29 @@ function createMockContext() {
73
74
  };
74
75
  }
75
76
 
77
+ describe("sanitizeDownloadFilename", () => {
78
+ test("keeps a normal filename", () => {
79
+ expect(sanitizeDownloadFilename("report.json")).toBe("report.json");
80
+ });
81
+
82
+ test("removes traversal segments and separators", () => {
83
+ expect(sanitizeDownloadFilename("../../.ssh/authorized_keys")).toBe(
84
+ "authorized_keys",
85
+ );
86
+ expect(
87
+ sanitizeDownloadFilename(
88
+ "..\\..\\windows\\system32\\drivers\\etc\\hosts",
89
+ ),
90
+ ).toBe("hosts");
91
+ });
92
+
93
+ test("falls back to safe default for empty or dot paths", () => {
94
+ expect(sanitizeDownloadFilename(" ")).toBe("download");
95
+ expect(sanitizeDownloadFilename(".")).toBe("download");
96
+ expect(sanitizeDownloadFilename("..")).toBe("download");
97
+ });
98
+ });
99
+
76
100
  describe("BrowserManager", () => {
77
101
  let mockCtx: ReturnType<typeof createMockContext>;
78
102
 
@@ -43,10 +43,11 @@ describe("browser skill cutover — startup tool payload", () => {
43
43
 
44
44
  test("total tool definition count reflects removal of 14 browser tools", () => {
45
45
  const definitions = getAllToolDefinitions();
46
- // Startup has ~31 definitions (no browser tools).
46
+ // Startup has ~20 definitions after moving scaffold/settings/skill-management
47
+ // tools to bundled skills (no browser tools).
47
48
  // Allow wider drift for unrelated tool additions while still failing if
48
- // browser tools are reintroduced at startup (+10 definitions).
49
- expect(definitions.length).toBeGreaterThanOrEqual(25);
49
+ // browser tools are reintroduced at startup (+14 definitions).
50
+ expect(definitions.length).toBeGreaterThanOrEqual(15);
50
51
  expect(definitions.length).toBeLessThanOrEqual(50);
51
52
  });
52
53
 
@@ -78,10 +78,11 @@ describe("browser skill migration end-state", () => {
78
78
 
79
79
  test("startup tool definition count is reduced (no browser tools)", () => {
80
80
  const definitions = getAllToolDefinitions();
81
- // Startup has ~15 eager + ~11 explicit definitions (no browser tools).
81
+ // Startup has ~20 definitions after moving scaffold/settings/skill-management
82
+ // tools to bundled skills (no browser tools).
82
83
  // Allow wider drift for unrelated tool additions while still failing if
83
84
  // browser tools are reintroduced at startup (+14 definitions).
84
- expect(definitions.length).toBeGreaterThanOrEqual(10);
85
+ expect(definitions.length).toBeGreaterThanOrEqual(15);
85
86
  expect(definitions.length).toBeLessThanOrEqual(50);
86
87
 
87
88
  const defNames = definitions.map((d) => d.name);
@@ -222,16 +223,12 @@ describe("browser skill migration end-state", () => {
222
223
  previouslyActiveSkillIds: tracking,
223
224
  });
224
225
 
225
- // Exactly 14 new tool definitions should be projected
226
- expect(projection.toolDefinitions).toHaveLength(BROWSER_TOOL_COUNT);
226
+ // Tool definitions are no longer sent to the LLM (dispatched via
227
+ // skill_execute), so toolDefinitions is expected to be empty.
228
+ expect(projection.toolDefinitions).toHaveLength(0);
227
229
 
228
- // Every browser tool name should be in the projection
229
- const projectedNames = projection.toolDefinitions.map((d) => d.name);
230
- for (const name of BROWSER_TOOL_NAMES) {
231
- expect(projectedNames).toContain(name);
232
- }
233
-
234
- // The allowedToolNames set should also contain all browser tools
230
+ // All 14 browser tools should be registered and tracked in allowedToolNames
231
+ expect(projection.allowedToolNames.size).toBe(BROWSER_TOOL_COUNT);
235
232
  for (const name of BROWSER_TOOL_NAMES) {
236
233
  expect(projection.allowedToolNames.has(name)).toBe(true);
237
234
  }
@@ -0,0 +1,326 @@
1
+ /**
2
+ * Unit tests for the POST /v1/btw SSE-streaming side-chain endpoint.
3
+ *
4
+ * Validates request validation (400s), service unavailability (503),
5
+ * successful SSE streaming, provider argument passing, no persistence,
6
+ * and no session.processing mutation.
7
+ */
8
+
9
+ import { describe, expect, mock, test } from "bun:test";
10
+
11
+ // ---------------------------------------------------------------------------
12
+ // Mocks — must be defined before importing the module under test
13
+ // ---------------------------------------------------------------------------
14
+
15
+ mock.module("../util/logger.js", () => ({
16
+ getLogger: () =>
17
+ new Proxy({} as Record<string, unknown>, {
18
+ get: () => () => {},
19
+ }),
20
+ }));
21
+
22
+ const mockGetOrCreateConversation = mock((_key: string) => ({
23
+ conversationId: "conv-test-123",
24
+ created: false,
25
+ }));
26
+
27
+ mock.module("../memory/conversation-key-store.js", () => ({
28
+ getOrCreateConversation: mockGetOrCreateConversation,
29
+ }));
30
+
31
+ const mockAddMessage = mock(() => {});
32
+
33
+ mock.module("../memory/conversation-crud.js", () => ({
34
+ addMessage: mockAddMessage,
35
+ }));
36
+
37
+ const MOCK_TOOLS = [
38
+ {
39
+ name: "test_tool",
40
+ description: "A test tool",
41
+ input_schema: { type: "object", properties: {} },
42
+ },
43
+ ];
44
+
45
+ mock.module("../daemon/session-tool-setup.js", () => ({
46
+ buildToolDefinitions: () => MOCK_TOOLS,
47
+ }));
48
+
49
+ // ---------------------------------------------------------------------------
50
+ // Imports (after mocks)
51
+ // ---------------------------------------------------------------------------
52
+
53
+ import type {
54
+ ProviderResponse,
55
+ SendMessageOptions,
56
+ } from "../providers/types.js";
57
+ import type { AuthContext, Scope } from "../runtime/auth/types.js";
58
+ import type { SendMessageDeps } from "../runtime/http-types.js";
59
+ import { btwRouteDefinitions } from "../runtime/routes/btw-routes.js";
60
+
61
+ // ---------------------------------------------------------------------------
62
+ // Helpers
63
+ // ---------------------------------------------------------------------------
64
+
65
+ const FAKE_AUTH_CONTEXT: AuthContext = {
66
+ subject: "test-user",
67
+ principalType: "local",
68
+ assistantId: "self",
69
+ scopeProfile: "local_v1",
70
+ scopes: new Set<Scope>(["local.all"]),
71
+ policyEpoch: 0,
72
+ };
73
+
74
+ function makeMockProvider(
75
+ onSendMessage?: (
76
+ messages: unknown[],
77
+ tools: unknown[],
78
+ systemPrompt: string | undefined,
79
+ options: SendMessageOptions | undefined,
80
+ ) => Promise<ProviderResponse>,
81
+ ) {
82
+ const defaultSendMessage = async (
83
+ _messages: unknown[],
84
+ _tools: unknown[],
85
+ _systemPrompt: string | undefined,
86
+ options: SendMessageOptions | undefined,
87
+ ): Promise<ProviderResponse> => {
88
+ options?.onEvent?.({ type: "text_delta", text: "hello" });
89
+ return {
90
+ content: [{ type: "text", text: "hello" }],
91
+ model: "test-model",
92
+ usage: { inputTokens: 10, outputTokens: 5 },
93
+ stopReason: "end_turn",
94
+ };
95
+ };
96
+
97
+ return {
98
+ name: "test-provider",
99
+ sendMessage: mock(onSendMessage ?? defaultSendMessage),
100
+ };
101
+ }
102
+
103
+ function makeMockSession(
104
+ providerOverride?: ReturnType<typeof makeMockProvider>,
105
+ ) {
106
+ const provider = providerOverride ?? makeMockProvider();
107
+ return {
108
+ provider,
109
+ systemPrompt: "You are a helpful assistant.",
110
+ processing: false,
111
+ getMessages: () => [
112
+ {
113
+ role: "user" as const,
114
+ content: [{ type: "text" as const, text: "prior message" }],
115
+ },
116
+ {
117
+ role: "assistant" as const,
118
+ content: [{ type: "text" as const, text: "prior response" }],
119
+ },
120
+ ],
121
+ };
122
+ }
123
+
124
+ function makeSendMessageDeps(
125
+ session?: ReturnType<typeof makeMockSession>,
126
+ ): SendMessageDeps {
127
+ const s = session ?? makeMockSession();
128
+ return {
129
+ getOrCreateSession: mock(
130
+ async (_conversationId: string) => s,
131
+ ) as unknown as SendMessageDeps["getOrCreateSession"],
132
+ assistantEventHub: {} as never,
133
+ resolveAttachments: () => [],
134
+ };
135
+ }
136
+
137
+ function makeRequest(body: Record<string, unknown>): Request {
138
+ return new Request("http://localhost/v1/btw", {
139
+ method: "POST",
140
+ headers: { "Content-Type": "application/json" },
141
+ body: JSON.stringify(body),
142
+ });
143
+ }
144
+
145
+ async function callHandler(
146
+ body: Record<string, unknown>,
147
+ deps: { sendMessageDeps?: SendMessageDeps },
148
+ ): Promise<Response> {
149
+ const routes = btwRouteDefinitions(deps);
150
+ const route = routes.find((r) => r.endpoint === "btw" && r.method === "POST");
151
+ if (!route) throw new Error("btw route not found");
152
+ const req = makeRequest(body);
153
+ const url = new URL(req.url);
154
+ return route.handler({
155
+ req,
156
+ url,
157
+ server: null as never,
158
+ authContext: FAKE_AUTH_CONTEXT,
159
+ params: {},
160
+ });
161
+ }
162
+
163
+ async function readStream(response: Response): Promise<string> {
164
+ return await response.text();
165
+ }
166
+
167
+ // ---------------------------------------------------------------------------
168
+ // Tests
169
+ // ---------------------------------------------------------------------------
170
+
171
+ describe("POST /v1/btw", () => {
172
+ // -- Validation (400s) --
173
+
174
+ test("returns 400 for missing conversationKey", async () => {
175
+ const res = await callHandler(
176
+ { content: "hello" },
177
+ { sendMessageDeps: makeSendMessageDeps() },
178
+ );
179
+ expect(res.status).toBe(400);
180
+ const body = (await res.json()) as {
181
+ error: { code: string; message: string };
182
+ };
183
+ expect(body.error.code).toBe("BAD_REQUEST");
184
+ expect(body.error.message).toContain("conversationKey");
185
+ });
186
+
187
+ test("returns 400 for missing content", async () => {
188
+ const res = await callHandler(
189
+ { conversationKey: "key" },
190
+ { sendMessageDeps: makeSendMessageDeps() },
191
+ );
192
+ expect(res.status).toBe(400);
193
+ const body = (await res.json()) as {
194
+ error: { code: string; message: string };
195
+ };
196
+ expect(body.error.code).toBe("BAD_REQUEST");
197
+ expect(body.error.message).toContain("content");
198
+ });
199
+
200
+ test("returns 400 for empty content", async () => {
201
+ const res = await callHandler(
202
+ { conversationKey: "key", content: "" },
203
+ { sendMessageDeps: makeSendMessageDeps() },
204
+ );
205
+ expect(res.status).toBe(400);
206
+ const body = (await res.json()) as {
207
+ error: { code: string; message: string };
208
+ };
209
+ expect(body.error.code).toBe("BAD_REQUEST");
210
+ expect(body.error.message).toContain("content");
211
+ });
212
+
213
+ // -- Service unavailability (503) --
214
+
215
+ test("returns 503 when sendMessageDeps is unavailable", async () => {
216
+ const res = await callHandler(
217
+ { conversationKey: "key", content: "hello" },
218
+ { sendMessageDeps: undefined },
219
+ );
220
+ expect(res.status).toBe(503);
221
+ const body = (await res.json()) as {
222
+ error: { code: string; message: string };
223
+ };
224
+ expect(body.error.code).toBe("SERVICE_UNAVAILABLE");
225
+ });
226
+
227
+ // -- Successful SSE streaming --
228
+
229
+ test("streams btw_text_delta SSE events", async () => {
230
+ const res = await callHandler(
231
+ { conversationKey: "key", content: "hello" },
232
+ { sendMessageDeps: makeSendMessageDeps() },
233
+ );
234
+ expect(res.status).toBe(200);
235
+ expect(res.headers.get("Content-Type")).toBe("text/event-stream");
236
+
237
+ const text = await readStream(res);
238
+ expect(text).toContain(`event: btw_text_delta\ndata: {"text":"hello"}`);
239
+ });
240
+
241
+ test("response ends with btw_complete", async () => {
242
+ const res = await callHandler(
243
+ { conversationKey: "key", content: "hello" },
244
+ { sendMessageDeps: makeSendMessageDeps() },
245
+ );
246
+ const text = await readStream(res);
247
+ expect(text).toContain("event: btw_complete\ndata: {}");
248
+ });
249
+
250
+ // -- Provider receives correct args --
251
+
252
+ test("provider receives session messages + btw user message, system prompt, tools, and tool_choice none", async () => {
253
+ const provider = makeMockProvider();
254
+ const session = makeMockSession(provider);
255
+ const deps = makeSendMessageDeps(session);
256
+
257
+ const res = await callHandler(
258
+ { conversationKey: "key", content: " my question " },
259
+ { sendMessageDeps: deps },
260
+ );
261
+ // Consume the stream to ensure the provider call completes
262
+ await readStream(res);
263
+
264
+ expect(provider.sendMessage).toHaveBeenCalledTimes(1);
265
+
266
+ const [messages, tools, systemPrompt, options] =
267
+ provider.sendMessage.mock.calls[0];
268
+
269
+ // Messages should be session messages + the new user message (trimmed)
270
+ expect(messages).toHaveLength(3);
271
+ expect(messages[0]).toEqual({
272
+ role: "user",
273
+ content: [{ type: "text", text: "prior message" }],
274
+ });
275
+ expect(messages[1]).toEqual({
276
+ role: "assistant",
277
+ content: [{ type: "text", text: "prior response" }],
278
+ });
279
+ expect(messages[2]).toEqual({
280
+ role: "user",
281
+ content: [{ type: "text", text: "my question" }],
282
+ });
283
+
284
+ // Tools
285
+ expect(tools).toEqual(MOCK_TOOLS);
286
+
287
+ // System prompt from session
288
+ expect(systemPrompt).toBe("You are a helpful assistant.");
289
+
290
+ // Options: tool_choice must be "none"
291
+ expect(options!.config!.tool_choice).toEqual({ type: "none" });
292
+ });
293
+
294
+ // -- No persistence --
295
+
296
+ test("does not persist any messages (addMessage never called)", async () => {
297
+ mockAddMessage.mockClear();
298
+
299
+ const res = await callHandler(
300
+ { conversationKey: "key", content: "hello" },
301
+ { sendMessageDeps: makeSendMessageDeps() },
302
+ );
303
+ await readStream(res);
304
+
305
+ expect(mockAddMessage).not.toHaveBeenCalled();
306
+ });
307
+
308
+ // -- session.processing not touched --
309
+
310
+ test("session.processing remains unchanged", async () => {
311
+ const session = makeMockSession();
312
+ const deps = makeSendMessageDeps(session);
313
+
314
+ // Verify initial state
315
+ expect(session.processing).toBe(false);
316
+
317
+ const res = await callHandler(
318
+ { conversationKey: "key", content: "hello" },
319
+ { sendMessageDeps: deps },
320
+ );
321
+ await readStream(res);
322
+
323
+ // processing should still be false — the handler never sets it
324
+ expect(session.processing).toBe(false);
325
+ });
326
+ });