@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
@@ -9,7 +9,6 @@ import {
9
9
  import { NetworkRecorder } from "../tools/browser/network-recorder.js";
10
10
  import type { SessionRecording } from "../tools/browser/network-recording-types.js";
11
11
  import { saveRecording } from "../tools/browser/recording-store.js";
12
- import { navigateXPages } from "../tools/browser/x-auto-navigate.js";
13
12
  import type { WatchSession } from "../tools/watch/watch-state.js";
14
13
  import {
15
14
  fireWatchCompletionNotifier,
@@ -35,13 +34,7 @@ const activeCdpSessions = new Map<string, CdpSession>();
35
34
  const activeProgressIntervals = new Map<string, NodeJS.Timeout>();
36
35
 
37
36
  /** Return domain-specific URL patterns that indicate a successful login. */
38
- function getLoginSignals(targetDomain?: string): string[] {
39
- if (targetDomain === "x.com" || targetDomain === "twitter.com") {
40
- return [
41
- "/i/api/graphql/", // any authenticated GraphQL call
42
- "/1.1/account/settings", // legacy API session check
43
- ];
44
- }
37
+ function getLoginSignals(_targetDomain?: string): string[] {
45
38
  // DoorDash and general fallback
46
39
  return [
47
40
  "/graphql/postLoginQuery",
@@ -324,40 +317,7 @@ export async function handleRideShotgunStart(
324
317
  }, 5000);
325
318
  activeProgressIntervals.set(watchId, progressInterval);
326
319
 
327
- // For x.com, auto-navigate Chrome through key pages to capture the full API surface.
328
- // Skip login detection — auto-navigation will complete the session when done.
329
- if (
330
- (targetDomain === "x.com" || targetDomain === "twitter.com") &&
331
- msg.autoNavigate !== false
332
- ) {
333
- // Don't set onLoginDetected — it would kill the session after the first
334
- // GraphQL call (5s grace), before auto-navigation finishes.
335
- const abortSignal = { aborted: false };
336
- const checkInterval = setInterval(() => {
337
- if (session.status !== "active") {
338
- abortSignal.aborted = true;
339
- clearInterval(checkInterval);
340
- }
341
- }, 1000);
342
- navigateXPages({ abortSignal, cdpBaseUrl })
343
- .then((completed) => {
344
- clearInterval(checkInterval);
345
- log.info(
346
- { watchId, completedSteps: completed.length },
347
- "X auto-navigation finished",
348
- );
349
- if (session.status === "active") {
350
- completeSession(session);
351
- }
352
- })
353
- .catch((err) => {
354
- clearInterval(checkInterval);
355
- log.warn({ err, watchId }, "X auto-navigation failed");
356
- if (session.status === "active") {
357
- completeSession(session);
358
- }
359
- });
360
- } else if (msg.autoNavigate && targetDomain) {
320
+ if (msg.autoNavigate && targetDomain) {
361
321
  const navDomain = msg.navigateDomain ?? targetDomain;
362
322
  const abortSignal = { aborted: false };
363
323
  const checkInterval = setInterval(() => {
@@ -538,13 +498,45 @@ async function finalizeLearnRecording(
538
498
  const networkEntries = recorder ? await recorder.stop() : [];
539
499
  activeRecorders.delete(watchId);
540
500
 
501
+ // Save cookies to the encrypted credential store (keyed by target domain)
502
+ // so they don't need to be persisted in the plaintext recording file.
503
+ if (session.targetDomain && cookies.length > 0) {
504
+ const { setSecureKeyAsync } = await import("../security/secure-keys.js");
505
+ const { upsertCredentialMetadata } =
506
+ await import("../tools/credentials/metadata-store.js");
507
+
508
+ const service = session.targetDomain;
509
+ const field = "session:cookies";
510
+ const storageKey = `credential:${service}:${field}`;
511
+ const stored = await setSecureKeyAsync(
512
+ storageKey,
513
+ JSON.stringify(cookies),
514
+ );
515
+ if (stored) {
516
+ try {
517
+ upsertCredentialMetadata(service, field, {});
518
+ } catch {
519
+ // Non-critical: metadata upsert is best-effort
520
+ }
521
+ log.info(
522
+ { targetDomain: service, cookieCount: cookies.length },
523
+ "Cookies saved to credential store",
524
+ );
525
+ } else {
526
+ log.warn(
527
+ { targetDomain: service },
528
+ "Failed to save cookies to credential store",
529
+ );
530
+ }
531
+ }
532
+
541
533
  const recording: SessionRecording = {
542
534
  id: recordingId,
543
535
  startedAt: session.startedAt,
544
536
  endedAt: Date.now(),
545
537
  targetDomain: session.targetDomain,
546
538
  networkEntries,
547
- cookies,
539
+ cookies: [], // Cookies saved to credential store — never persisted in recording
548
540
  observations: session.observations.map((obs) => ({
549
541
  ocrText: obs.ocrText,
550
542
  appName: obs.appName,
@@ -2,16 +2,15 @@ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
2
  import { createRequire } from "node:module";
3
3
  import { dirname, join } from "node:path";
4
4
 
5
- import { loadPrebuiltHtml } from "../home-base/prebuilt/seed.js";
6
5
  import { getLogger } from "../util/logger.js";
7
6
  import { getInterfacesDir } from "../util/platform.js";
8
7
 
9
8
  const log = getLogger("seed-files");
10
9
 
11
10
  /**
12
- * Seeds interface files (TUI main-window, desktop index.html) from their
13
- * source packages when they don't already exist on disk. Called during
14
- * daemon startup so the runtime can serve these files immediately.
11
+ * Seeds interface files (TUI main-window) from their source packages when they
12
+ * don't already exist on disk. Called during daemon startup so the runtime can
13
+ * serve these files immediately.
15
14
  */
16
15
  export function seedInterfaceFiles(): void {
17
16
  // Seed the TUI main-window interface from the CLI package's DefaultMainScreen
@@ -35,27 +34,4 @@ export function seedInterfaceFiles(): void {
35
34
  log.warn({ err }, "Could not seed tui/main-window.tsx from CLI package");
36
35
  }
37
36
  }
38
-
39
- // Seed the vellum-desktop interface from the prebuilt Home Base HTML if it
40
- // doesn't already exist. This ensures the Home tab renders immediately
41
- // on first launch for both local and remote hatches.
42
- const desktopIndexPath = join(
43
- getInterfacesDir(),
44
- "vellum-desktop",
45
- "index.html",
46
- );
47
- if (!existsSync(desktopIndexPath)) {
48
- const prebuiltHtml = loadPrebuiltHtml();
49
- if (prebuiltHtml) {
50
- mkdirSync(join(getInterfacesDir(), "vellum-desktop"), {
51
- recursive: true,
52
- });
53
- writeFileSync(desktopIndexPath, prebuiltHtml);
54
- log.info("Seeded vellum-desktop/index.html from prebuilt Home Base");
55
- } else {
56
- log.warn(
57
- "Could not seed vellum-desktop/index.html — prebuilt HTML not found (missing embedded index.html in home-base/prebuilt/)",
58
- );
59
- }
60
- }
61
37
  }
@@ -14,7 +14,6 @@ import {
14
14
  import { getConfig } from "../config/loader.js";
15
15
  import { onContactChange } from "../contacts/contact-events.js";
16
16
  import type { HeartbeatService } from "../heartbeat/heartbeat-service.js";
17
- import { bootstrapHomeBaseAppLink } from "../home-base/bootstrap.js";
18
17
  import * as attachmentsStore from "../memory/attachments-store.js";
19
18
  import {
20
19
  createCanonicalGuardianRequest,
@@ -57,6 +56,8 @@ import type {
57
56
  SessionCreateOptions,
58
57
  } from "./handlers/shared.js";
59
58
  import type { SkillOperationContext } from "./handlers/skills.js";
59
+ import { HostBashProxy } from "./host-bash-proxy.js";
60
+ import { HostFileProxy } from "./host-file-proxy.js";
60
61
  import type { ServerMessage } from "./message-protocol.js";
61
62
  import {
62
63
  DEFAULT_MEMORY_POLICY,
@@ -131,8 +132,9 @@ function resolveCanonicalRequestSourceType(
131
132
 
132
133
  /**
133
134
  * Build an onEvent callback that registers pending interactions when the agent
134
- * loop emits confirmation_request or secret_request events. This ensures that
135
- * channel approval interception can look up the session by requestId.
135
+ * loop emits confirmation_request, secret_request, host_bash_request, or
136
+ * host_file_request events. This ensures that channel approval interception
137
+ * can look up the session by requestId.
136
138
  */
137
139
  function makePendingInteractionRegistrar(
138
140
  session: Session,
@@ -200,6 +202,18 @@ function makePendingInteractionRegistrar(
200
202
  conversationId,
201
203
  kind: "secret",
202
204
  });
205
+ } else if (msg.type === "host_bash_request") {
206
+ pendingInteractions.register(msg.requestId, {
207
+ session,
208
+ conversationId,
209
+ kind: "host_bash",
210
+ });
211
+ } else if (msg.type === "host_file_request") {
212
+ pendingInteractions.register(msg.requestId, {
213
+ session,
214
+ conversationId,
215
+ kind: "host_file",
216
+ });
203
217
  }
204
218
  };
205
219
  }
@@ -292,14 +306,7 @@ export class DaemonServer {
292
306
  undefined,
293
307
  metadata,
294
308
  );
295
- if (enqueueResult.rejected) {
296
- log.warn(
297
- { parentSessionId },
298
- "Parent session queue full, dropping subagent notification",
299
- );
300
- return;
301
- }
302
- if (!enqueueResult.queued) {
309
+ if (!enqueueResult.queued && !enqueueResult.rejected) {
303
310
  const messageId = await parentSession.persistUserMessage(
304
311
  message,
305
312
  [],
@@ -325,10 +332,7 @@ export class DaemonServer {
325
332
  * Publications are serialized via a promise chain so subscribers
326
333
  * always observe events in send order.
327
334
  */
328
- private publishAssistantEvent(
329
- msg: ServerMessage,
330
- sessionId?: string,
331
- ): void {
335
+ private publishAssistantEvent(msg: ServerMessage, sessionId?: string): void {
332
336
  const id = this.assistantId ?? "default";
333
337
  const event = buildAssistantEvent(id, msg, sessionId);
334
338
  this._hubChain = this._hubChain
@@ -373,15 +377,6 @@ export class DaemonServer {
373
377
  initializeProviders(config);
374
378
  this.configWatcher.initFingerprint(config);
375
379
 
376
- try {
377
- bootstrapHomeBaseAppLink();
378
- } catch (err) {
379
- log.warn(
380
- { err },
381
- "Failed to bootstrap Home Base app link at daemon startup",
382
- );
383
- }
384
-
385
380
  this.evictor.start();
386
381
 
387
382
  registerDaemonCallbacks({
@@ -629,10 +624,7 @@ export class DaemonServer {
629
624
  );
630
625
  }
631
626
 
632
- const session = await this.getOrCreateSession(
633
- conversationId,
634
- options,
635
- );
627
+ const session = await this.getOrCreateSession(conversationId, options);
636
628
 
637
629
  if (session.isProcessing()) {
638
630
  throw new Error("Session is already processing a message");
@@ -652,6 +644,31 @@ export class DaemonServer {
652
644
  session.setChannelCapabilities(
653
645
  resolveChannelCapabilities(sourceChannel, sourceInterface),
654
646
  );
647
+ // Only create the host bash proxy for desktop client interfaces that can
648
+ // execute commands on the user's machine. Non-desktop sessions (CLI,
649
+ // channels, headless) fall back to local execution.
650
+ // Guard: don't replace an active proxy during concurrent turn races —
651
+ // another request may have started processing between the isProcessing()
652
+ // check above and the await on ensureActorScopedHistory().
653
+ if (resolvedInterface === "macos" || resolvedInterface === "ios") {
654
+ if (!session.isProcessing() || !session.hostBashProxy) {
655
+ session.setHostBashProxy(
656
+ new HostBashProxy(session.getCurrentSender(), (requestId) => {
657
+ pendingInteractions.resolve(requestId);
658
+ }),
659
+ );
660
+ }
661
+ if (!session.isProcessing() || !session.hostFileProxy) {
662
+ session.setHostFileProxy(
663
+ new HostFileProxy(session.getCurrentSender(), (requestId) => {
664
+ pendingInteractions.resolve(requestId);
665
+ }),
666
+ );
667
+ }
668
+ } else if (!session.isProcessing()) {
669
+ session.setHostBashProxy(undefined);
670
+ session.setHostFileProxy(undefined);
671
+ }
655
672
  session.setCommandIntent(options?.commandIntent ?? null);
656
673
  session.setTurnChannelContext({
657
674
  userMessageChannel: resolvedChannel,
@@ -164,22 +164,22 @@ export function emitLlmCallStartedIfNeeded(
164
164
  );
165
165
  }
166
166
 
167
- // ── IPC Size Caps ────────────────────────────────────────────────────
167
+ // ── Client Payload Size Caps ─────────────────────────────────────────
168
168
  // The client truncates tool results anyway (2 000 chars in ChatViewModel),
169
169
  // but the full string can be megabytes (file_read, bash output). Capping
170
- // here avoids sending oversized payloads over IPC which get decoded on
171
- // the client's main thread.
170
+ // here avoids sending oversized payloads which get decoded on the
171
+ // client's main thread.
172
172
 
173
173
  const TOOL_RESULT_MAX_CHARS = 2_000;
174
174
  const TOOL_RESULT_TRUNCATION_SUFFIX = "...[truncated]";
175
175
 
176
176
  // tool_input_delta streams accumulated JSON as tools run. For non-app
177
177
  // tools the client discards it (extractCodePreview only handles app tools),
178
- // so we cap it aggressively to avoid excessive IPC traffic.
178
+ // so we cap it aggressively to avoid excessive client traffic.
179
179
  const TOOL_INPUT_DELTA_MAX_CHARS = 50_000;
180
180
  const APP_TOOL_NAMES = new Set(["app_create", "app_update"]);
181
181
 
182
- function truncateForIpc(
182
+ function truncateForClient(
183
183
  value: string,
184
184
  maxChars: number,
185
185
  suffix: string,
@@ -206,6 +206,7 @@ const TOOL_FRIENDLY_NAMES: Record<string, string> = {
206
206
  app_create: "app",
207
207
  app_update: "app",
208
208
  skill_load: "skill",
209
+ skill_execute: "skill",
209
210
  app_file_edit: "app file",
210
211
  app_file_write: "app file",
211
212
  };
@@ -304,6 +305,27 @@ export function handleToolUse(
304
305
  });
305
306
  }
306
307
 
308
+ export function handleToolUsePreviewStart(
309
+ _state: EventHandlerState,
310
+ deps: EventHandlerDeps,
311
+ event: Extract<AgentEvent, { type: "tool_use_preview_start" }>,
312
+ ): void {
313
+ deps.onEvent({
314
+ type: "tool_use_preview_start",
315
+ toolUseId: event.toolUseId,
316
+ toolName: event.toolName,
317
+ sessionId: deps.ctx.conversationId,
318
+ });
319
+ const statusText = `Preparing ${friendlyToolName(event.toolName)}...`;
320
+ deps.ctx.emitActivityState(
321
+ "tool_running",
322
+ "preview_start",
323
+ "assistant_turn",
324
+ deps.reqId,
325
+ statusText,
326
+ );
327
+ }
328
+
307
329
  export function handleToolOutputChunk(
308
330
  _state: EventHandlerState,
309
331
  deps: EventHandlerDeps,
@@ -386,7 +408,7 @@ export function handleInputJsonDelta(
386
408
  // app_create/app_update code previews; all other tools discard it.
387
409
  const content = APP_TOOL_NAMES.has(event.toolName)
388
410
  ? event.accumulatedJson
389
- : truncateForIpc(
411
+ : truncateForClient(
390
412
  event.accumulatedJson,
391
413
  TOOL_INPUT_DELTA_MAX_CHARS,
392
414
  TOOL_RESULT_TRUNCATION_SUFFIX,
@@ -396,6 +418,7 @@ export function handleInputJsonDelta(
396
418
  toolName: event.toolName,
397
419
  content,
398
420
  sessionId: deps.ctx.conversationId,
421
+ toolUseId: event.toolUseId,
399
422
  });
400
423
  }
401
424
 
@@ -410,7 +433,7 @@ export function handleToolResult(
410
433
  deps.onEvent({
411
434
  type: "tool_result",
412
435
  toolName: "",
413
- result: truncateForIpc(
436
+ result: truncateForClient(
414
437
  event.content,
415
438
  TOOL_RESULT_MAX_CHARS,
416
439
  TOOL_RESULT_TRUNCATION_SUFFIX,
@@ -420,6 +443,7 @@ export function handleToolResult(
420
443
  status: event.status,
421
444
  sessionId: deps.ctx.conversationId,
422
445
  imageData: imageBlock?.source.data,
446
+ toolUseId: event.toolUseId,
423
447
  });
424
448
  state.pendingToolResults.set(event.toolUseId, {
425
449
  content: event.content,
@@ -481,7 +505,7 @@ export function handleToolResult(
481
505
  return ts && ts.completedAt != null;
482
506
  });
483
507
  if (allToolsDone && state.currentTurnToolUseIds.length > 0) {
484
- annotatePersistedAssistantMessage(state);
508
+ annotatePersistedAssistantMessage(state, deps);
485
509
  }
486
510
  }
487
511
 
@@ -491,7 +515,10 @@ export function handleToolResult(
491
515
  * and update the DB. This runs post-tool-execution so the metadata maps are
492
516
  * fully populated (unlike message_complete which fires before tools run).
493
517
  */
494
- function annotatePersistedAssistantMessage(state: EventHandlerState): void {
518
+ function annotatePersistedAssistantMessage(
519
+ state: EventHandlerState,
520
+ deps: EventHandlerDeps,
521
+ ): void {
495
522
  const messageId = state.lastAssistantMessageId;
496
523
  if (!messageId) return;
497
524
 
@@ -529,6 +556,25 @@ function annotatePersistedAssistantMessage(state: EventHandlerState): void {
529
556
  }
530
557
  }
531
558
 
559
+ // Persist any surfaces created during tool execution.
560
+ // message_complete fires BEFORE tools run, so currentTurnSurfaces is empty
561
+ // at write time. We append them here after all tools have completed.
562
+ if (deps.ctx.currentTurnSurfaces.length > 0) {
563
+ for (const surface of deps.ctx.currentTurnSurfaces) {
564
+ content.push({
565
+ type: "ui_surface",
566
+ surfaceId: surface.surfaceId,
567
+ surfaceType: surface.surfaceType,
568
+ title: surface.title,
569
+ data: surface.data,
570
+ actions: surface.actions,
571
+ display: surface.display,
572
+ } as unknown as ContentBlock);
573
+ }
574
+ modified = true;
575
+ deps.ctx.currentTurnSurfaces = [];
576
+ }
577
+
532
578
  if (modified) {
533
579
  updateMessageContent(messageId, JSON.stringify(content));
534
580
  }
@@ -759,6 +805,9 @@ export async function dispatchAgentEvent(
759
805
  case "tool_use":
760
806
  handleToolUse(state, deps, event);
761
807
  break;
808
+ case "tool_use_preview_start":
809
+ handleToolUsePreviewStart(state, deps, event);
810
+ break;
762
811
  case "tool_output_chunk":
763
812
  handleToolOutputChunk(state, deps, event);
764
813
  break;
@@ -768,6 +817,20 @@ export async function dispatchAgentEvent(
768
817
  case "tool_result":
769
818
  handleToolResult(state, deps, event);
770
819
  break;
820
+ case "server_tool_start": {
821
+ const friendlyNames: Record<string, string> = {
822
+ web_search: "Searching the web",
823
+ };
824
+ const statusText = friendlyNames[event.name] ?? `Running ${event.name}`;
825
+ deps.ctx.emitActivityState(
826
+ "tool_running",
827
+ "tool_use_start",
828
+ "assistant_turn",
829
+ deps.reqId,
830
+ statusText,
831
+ );
832
+ break;
833
+ }
771
834
  case "error":
772
835
  handleError(state, deps, event);
773
836
  break;
@@ -139,6 +139,7 @@ const TOOL_FRIENDLY_LABEL: Record<string, string> = {
139
139
  app_create: "Create App",
140
140
  app_update: "Update App",
141
141
  skill_load: "Load Skill",
142
+ skill_execute: "Run Skill Tool",
142
143
  app_file_edit: "Edit App File",
143
144
  app_file_write: "Write App File",
144
145
  };
@@ -226,6 +227,7 @@ export interface AgentLoopSessionContext {
226
227
  | "thinking_delta"
227
228
  | "first_text_delta"
228
229
  | "tool_use_start"
230
+ | "preview_start"
229
231
  | "tool_result_received"
230
232
  | "confirmation_requested"
231
233
  | "confirmation_resolved"
@@ -1301,60 +1303,10 @@ export async function runAgentLoopImpl(
1301
1303
  sessionId: ctx.conversationId,
1302
1304
  });
1303
1305
 
1304
- // Resolve attachments
1305
- const attachmentResult = await resolveAssistantAttachments(
1306
- state.accumulatedDirectives,
1307
- state.accumulatedToolContentBlocks,
1308
- state.directiveWarnings,
1309
- ctx.workingDir,
1310
- async (filePath) =>
1311
- approveHostAttachmentRead(
1312
- filePath,
1313
- ctx.workingDir,
1314
- ctx.prompter,
1315
- ctx.conversationId,
1316
- ctx.hasNoClient,
1317
- ),
1318
- state.lastAssistantMessageId,
1319
- state.toolContentBlockToolNames,
1320
- );
1321
- const { assistantAttachments, emittedAttachments } = attachmentResult;
1322
-
1323
- ctx.lastAssistantAttachments = assistantAttachments;
1324
- ctx.lastAttachmentWarnings = attachmentResult.directiveWarnings;
1325
-
1326
- const warningText = formatAttachmentWarnings(
1327
- attachmentResult.directiveWarnings,
1328
- );
1329
- if (warningText) {
1330
- onEvent({
1331
- type: "assistant_text_delta",
1332
- text: warningText,
1333
- sessionId: ctx.conversationId,
1334
- });
1335
- }
1336
-
1337
- // Emit completion event
1338
- if (yieldedForHandoff) {
1339
- ctx.traceEmitter.emit(
1340
- "generation_handoff",
1341
- "Handing off to next queued message",
1342
- {
1343
- requestId: reqId,
1344
- status: "info",
1345
- attributes: { queuedCount: ctx.getQueueDepth() },
1346
- },
1347
- );
1348
- onEvent({
1349
- type: "generation_handoff",
1350
- sessionId: ctx.conversationId,
1351
- requestId: reqId,
1352
- queuedCount: ctx.getQueueDepth(),
1353
- ...(emittedAttachments.length > 0
1354
- ? { attachments: emittedAttachments }
1355
- : {}),
1356
- });
1357
- } else if (abortController.signal.aborted) {
1306
+ // Fast-path: when the user cancelled, skip expensive post-loop work
1307
+ // (attachment resolution) and emit the cancellation event immediately
1308
+ // so the client can re-enable the UI without delay.
1309
+ if (abortController.signal.aborted) {
1358
1310
  ctx.emitActivityState("idle", "generation_cancelled", "global", reqId);
1359
1311
  ctx.traceEmitter.emit(
1360
1312
  "generation_cancelled",
@@ -1366,18 +1318,97 @@ export async function runAgentLoopImpl(
1366
1318
  );
1367
1319
  onEvent({ type: "generation_cancelled", sessionId: ctx.conversationId });
1368
1320
  } else {
1369
- ctx.emitActivityState("idle", "message_complete", "global", reqId);
1370
- ctx.traceEmitter.emit("message_complete", "Message processing complete", {
1371
- requestId: reqId,
1372
- status: "success",
1373
- });
1374
- onEvent({
1375
- type: "message_complete",
1376
- sessionId: ctx.conversationId,
1377
- ...(emittedAttachments.length > 0
1378
- ? { attachments: emittedAttachments }
1379
- : {}),
1380
- });
1321
+ // Resolve attachments (only when not cancelled — this is expensive async I/O)
1322
+ const attachmentResult = await resolveAssistantAttachments(
1323
+ state.accumulatedDirectives,
1324
+ state.accumulatedToolContentBlocks,
1325
+ state.directiveWarnings,
1326
+ ctx.workingDir,
1327
+ async (filePath) =>
1328
+ approveHostAttachmentRead(
1329
+ filePath,
1330
+ ctx.workingDir,
1331
+ ctx.prompter,
1332
+ ctx.conversationId,
1333
+ ctx.hasNoClient,
1334
+ ),
1335
+ state.lastAssistantMessageId,
1336
+ state.toolContentBlockToolNames,
1337
+ );
1338
+ const { assistantAttachments, emittedAttachments } = attachmentResult;
1339
+
1340
+ ctx.lastAssistantAttachments = assistantAttachments;
1341
+ ctx.lastAttachmentWarnings = attachmentResult.directiveWarnings;
1342
+
1343
+ const warningText = formatAttachmentWarnings(
1344
+ attachmentResult.directiveWarnings,
1345
+ );
1346
+ if (warningText) {
1347
+ onEvent({
1348
+ type: "assistant_text_delta",
1349
+ text: warningText,
1350
+ sessionId: ctx.conversationId,
1351
+ });
1352
+ }
1353
+
1354
+ // Re-check: the user may have cancelled during attachment resolution
1355
+ if (abortController.signal.aborted) {
1356
+ ctx.emitActivityState("idle", "generation_cancelled", "global", reqId);
1357
+ ctx.traceEmitter.emit(
1358
+ "generation_cancelled",
1359
+ "Generation cancelled by user",
1360
+ {
1361
+ requestId: reqId,
1362
+ status: "warning",
1363
+ },
1364
+ );
1365
+ onEvent({
1366
+ type: "generation_cancelled",
1367
+ sessionId: ctx.conversationId,
1368
+ });
1369
+ } else if (yieldedForHandoff) {
1370
+ ctx.traceEmitter.emit(
1371
+ "generation_handoff",
1372
+ "Handing off to next queued message",
1373
+ {
1374
+ requestId: reqId,
1375
+ status: "info",
1376
+ attributes: { queuedCount: ctx.getQueueDepth() },
1377
+ },
1378
+ );
1379
+ onEvent({
1380
+ type: "generation_handoff",
1381
+ sessionId: ctx.conversationId,
1382
+ requestId: reqId,
1383
+ queuedCount: ctx.getQueueDepth(),
1384
+ ...(emittedAttachments.length > 0
1385
+ ? { attachments: emittedAttachments }
1386
+ : {}),
1387
+ ...(state.lastAssistantMessageId
1388
+ ? { messageId: state.lastAssistantMessageId }
1389
+ : {}),
1390
+ });
1391
+ } else {
1392
+ ctx.emitActivityState("idle", "message_complete", "global", reqId);
1393
+ ctx.traceEmitter.emit(
1394
+ "message_complete",
1395
+ "Message processing complete",
1396
+ {
1397
+ requestId: reqId,
1398
+ status: "success",
1399
+ },
1400
+ );
1401
+ onEvent({
1402
+ type: "message_complete",
1403
+ sessionId: ctx.conversationId,
1404
+ ...(emittedAttachments.length > 0
1405
+ ? { attachments: emittedAttachments }
1406
+ : {}),
1407
+ ...(state.lastAssistantMessageId
1408
+ ? { messageId: state.lastAssistantMessageId }
1409
+ : {}),
1410
+ });
1411
+ }
1381
1412
  }
1382
1413
 
1383
1414
  // Second title pass: after 3 completed turns, re-generate the title
@@ -199,7 +199,7 @@ export async function resolveAssistantAttachments(
199
199
  }
200
200
 
201
201
  // Persist resolved attachments and link to the last assistant message.
202
- // Large video attachments are omitted from the IPC payload and lazy-loaded
202
+ // Large video attachments are omitted from the event payload and lazy-loaded
203
203
  // by the client via the HTTP endpoint (same pattern as history_response).
204
204
  const MAX_INLINE_B64_SIZE = 512 * 1024;
205
205