@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
@@ -1,8 +1,11 @@
1
1
  import { ProviderError } from "../util/errors.js";
2
- import type { SessionErrorCode, SessionErrorMessage } from "./message-protocol.js";
2
+ import type {
3
+ SessionErrorCode,
4
+ SessionErrorMessage,
5
+ } from "./message-protocol.js";
3
6
 
4
7
  /**
5
- * Classified session error ready for IPC emission.
8
+ * Classified session error ready for client emission.
6
9
  */
7
10
  export interface ClassifiedSessionError {
8
11
  code: SessionErrorCode;
@@ -73,7 +76,7 @@ const CANCEL_PATTERNS = [/abort/i, /cancel/i];
73
76
  */
74
77
  export interface ErrorContext {
75
78
  /** Where in the processing pipeline the error occurred. */
76
- phase: "agent_loop" | "queue" | "regenerate" | "handler" | "persist";
79
+ phase: "agent_loop" | "regenerate" | "handler" | "persist";
77
80
  /** Whether the abort signal was active when the error occurred. */
78
81
  aborted?: boolean;
79
82
  }
@@ -90,11 +93,11 @@ export function isUserCancellation(error: unknown, ctx: ErrorContext): boolean {
90
93
  return false;
91
94
  }
92
95
 
93
- /** Maximum length for debugDetails to prevent unbounded IPC payloads. */
96
+ /** Maximum length for debugDetails to prevent unbounded event payloads. */
94
97
  const MAX_DEBUG_DETAIL_LENGTH = 4000;
95
98
 
96
99
  /**
97
- * Truncate debug details to a reasonable size for IPC transport.
100
+ * Truncate debug details to a reasonable size for transport.
98
101
  */
99
102
  function truncateDebugDetails(details: string): string {
100
103
  if (details.length <= MAX_DEBUG_DETAIL_LENGTH) return details;
@@ -121,15 +124,6 @@ export function classifySessionError(
121
124
  const debugDetails = truncateDebugDetails(rawDetails);
122
125
 
123
126
  // Phase-specific overrides
124
- if (ctx.phase === "queue") {
125
- return {
126
- code: "QUEUE_FULL",
127
- userMessage: "Message queue is full (10 messages pending).",
128
- retryable: true,
129
- debugDetails: truncateDebugDetails(message),
130
- };
131
- }
132
-
133
127
  if (ctx.phase === "regenerate") {
134
128
  const base = classifyCore(error, message);
135
129
  return {
@@ -165,6 +159,13 @@ function classifyCore(
165
159
  retryable: false,
166
160
  };
167
161
  }
162
+ if (error.statusCode === 401) {
163
+ return {
164
+ code: "PROVIDER_BILLING",
165
+ userMessage: "Your API key is invalid or expired.",
166
+ retryable: false,
167
+ };
168
+ }
168
169
  if (error.statusCode === 429) {
169
170
  return {
170
171
  code: "PROVIDER_RATE_LIMIT",
@@ -209,7 +210,7 @@ function classifyCore(
209
210
  return {
210
211
  code: "PROVIDER_API",
211
212
  userMessage: "The AI provider rejected the request.",
212
- retryable: false,
213
+ retryable: true,
213
214
  };
214
215
  }
215
216
  }
@@ -311,7 +312,7 @@ function classifyByMessage(
311
312
  }
312
313
 
313
314
  /**
314
- * Build a `session_error` IPC message from a classified error.
315
+ * Build a `session_error` server message from a classified error.
315
316
  */
316
317
  export function buildSessionErrorMessage(
317
318
  sessionId: string,
@@ -24,7 +24,11 @@ import {
24
24
  import { unregisterSessionSender } from "../tools/browser/browser-screencast.js";
25
25
  import { getLogger } from "../util/logger.js";
26
26
  import { repairHistory } from "./history-repair.js";
27
- import type { SurfaceData, SurfaceType, UsageStats } from "./message-protocol.js";
27
+ import type {
28
+ SurfaceData,
29
+ SurfaceType,
30
+ UsageStats,
31
+ } from "./message-protocol.js";
28
32
  import {
29
33
  unregisterCallNotifiers,
30
34
  unregisterWatchNotifiers,
@@ -74,6 +78,7 @@ export interface LoadFromDbContext {
74
78
  contextCompactedAt: number | null;
75
79
  trustContext?: { trustClass: TrustClass };
76
80
  loadedHistoryTrustClass?: TrustClass;
81
+ hasAttachments?: boolean;
77
82
  }
78
83
 
79
84
  export interface AbortContext {
@@ -177,6 +182,20 @@ export async function loadFromDb(ctx: LoadFromDbContext): Promise<void> {
177
182
 
178
183
  ctx.loadedHistoryTrustClass = trustClass;
179
184
 
185
+ // Scan ALL db messages (including compacted ones) for attachments so that
186
+ // asset tools remain available after context compaction.
187
+ if (
188
+ ctx.contextCompactedMessageCount > 0 &&
189
+ dbMessages.some(
190
+ (m) =>
191
+ m.role === "user" &&
192
+ (m.content.includes('"type":"image"') ||
193
+ m.content.includes('"type":"file"')),
194
+ )
195
+ ) {
196
+ ctx.hasAttachments = true;
197
+ }
198
+
180
199
  log.info(
181
200
  { conversationId: ctx.conversationId, count: ctx.messages.length },
182
201
  "Loaded messages from DB",
@@ -19,29 +19,15 @@ export function stripMediaPayloadsForRetry(messages: Message[]): {
19
19
  latestUserIndex: number | null;
20
20
  } {
21
21
  let latestUserIndex: number | null = null;
22
- let lastSummaryUserIndex: number | null = null;
23
22
  for (let i = messages.length - 1; i >= 0; i--) {
24
23
  const msg = messages[i];
25
24
  if (msg.role !== "user") continue;
26
25
  if (isToolResultOnlyMessage(msg)) continue;
27
- if (getSummaryFromContextMessage(msg) != null) {
28
- // Track the last summary message as a fallback — after aggressive
29
- // compaction (minKeepRecentUserTurns: 0), the summary may be the only
30
- // user message left and it can contain preserved image blocks that
31
- // should not be stripped.
32
- if (lastSummaryUserIndex == null) lastSummaryUserIndex = i;
33
- continue;
34
- }
26
+ if (getSummaryFromContextMessage(msg) != null) continue;
35
27
  latestUserIndex = i;
36
28
  break;
37
29
  }
38
30
 
39
- // Fall back to the summary message when compaction consumed all user turns,
40
- // so images preserved by compaction are not unconditionally stripped.
41
- if (latestUserIndex == null && lastSummaryUserIndex != null) {
42
- latestUserIndex = lastSummaryUserIndex;
43
- }
44
-
45
31
  let modified = false;
46
32
  let replacedBlocks = 0;
47
33
  let keptLatestMediaBlocks = 0;
@@ -28,7 +28,10 @@ import {
28
28
  import type { SecretPrompter } from "../permissions/secret-prompter.js";
29
29
  import type { Message } from "../providers/types.js";
30
30
  import { getLogger } from "../util/logger.js";
31
- import type { ServerMessage, UserMessageAttachment } from "./message-protocol.js";
31
+ import type {
32
+ ServerMessage,
33
+ UserMessageAttachment,
34
+ } from "./message-protocol.js";
32
35
  import type { MessageQueue } from "./session-queue-manager.js";
33
36
  import type { TrustContext } from "./session-runtime-assembly.js";
34
37
 
@@ -212,7 +215,7 @@ export function enqueueMessage(
212
215
  metadata?: Record<string, unknown>,
213
216
  options?: { isInteractive?: boolean },
214
217
  displayContent?: string,
215
- ): { queued: boolean; rejected?: boolean; requestId: string } {
218
+ ): { queued: boolean; requestId: string; rejected?: boolean } {
216
219
  if (!ctx.processing) {
217
220
  return { queued: false, requestId };
218
221
  }
@@ -225,7 +228,7 @@ export function enqueueMessage(
225
228
  extractTurnInterfaceContext(metadata) ??
226
229
  ctx.getTurnInterfaceContext() ??
227
230
  undefined;
228
- const pushed = ctx.queue.push({
231
+ const accepted = ctx.queue.push({
229
232
  content,
230
233
  attachments,
231
234
  requestId,
@@ -236,11 +239,16 @@ export function enqueueMessage(
236
239
  turnChannelContext,
237
240
  turnInterfaceContext,
238
241
  isInteractive: options?.isInteractive,
239
- queuedAt: Date.now(),
240
242
  displayContent,
241
243
  });
242
- if (!pushed) {
243
- return { queued: false, rejected: true, requestId };
244
+ if (!accepted) {
245
+ onEvent({
246
+ type: "error",
247
+ message:
248
+ "The assistant is busy and cannot accept more messages right now. Please try again shortly.",
249
+ category: "queue_full",
250
+ });
251
+ return { queued: false, requestId, rejected: true };
244
252
  }
245
253
  return { queued: true, requestId };
246
254
  }
@@ -36,14 +36,18 @@ import type {
36
36
  import type { MessageQueue } from "./session-queue-manager.js";
37
37
  import type { QueueDrainReason } from "./session-queue-manager.js";
38
38
  import type { TrustContext } from "./session-runtime-assembly.js";
39
- import { resolveSlash, type SlashContext } from "./session-slash.js";
39
+ import {
40
+ isProviderShortcut,
41
+ resolveSlash,
42
+ type SlashContext,
43
+ } from "./session-slash.js";
40
44
  import type { TraceEmitter } from "./trace-emitter.js";
41
45
  import { resolveVerificationSessionIntent } from "./verification-session-intent.js";
42
46
 
43
47
  const log = getLogger("session-process");
44
48
 
45
49
  /** Build a model_info event with fresh config data. */
46
- function buildModelInfoEvent(): ServerMessage {
50
+ export function buildModelInfoEvent(): ServerMessage {
47
51
  const config = getConfig();
48
52
  const configured = Object.keys(config.apiKeys).filter(
49
53
  (k) => !!config.apiKeys[k],
@@ -58,7 +62,7 @@ function buildModelInfoEvent(): ServerMessage {
58
62
  }
59
63
 
60
64
  /** True when the trimmed content is a /model or /models slash command. */
61
- function isModelSlashCommand(content: string): boolean {
65
+ export function isModelSlashCommand(content: string): boolean {
62
66
  const trimmed = content.trim();
63
67
  return (
64
68
  trimmed === "/model" ||
@@ -114,6 +118,10 @@ export interface ProcessSessionContext {
114
118
  setTurnChannelContext(ctx: TurnChannelContext): void;
115
119
  getTurnInterfaceContext(): TurnInterfaceContext | null;
116
120
  setTurnInterfaceContext(ctx: TurnInterfaceContext): void;
121
+ /** Mark host proxies as unavailable so tool execution uses local fallback. */
122
+ clearProxyAvailability(): void;
123
+ /** Restore host proxy availability based on whether a real client is connected. */
124
+ restoreProxyAvailability(): void;
117
125
  emitActivityState(
118
126
  phase:
119
127
  | "idle"
@@ -131,7 +139,8 @@ export interface ProcessSessionContext {
131
139
  | "confirmation_resolved"
132
140
  | "message_complete"
133
141
  | "generation_cancelled"
134
- | "error_terminal",
142
+ | "error_terminal"
143
+ | "preview_start",
135
144
  anchor?: "assistant_turn" | "user_turn" | "global",
136
145
  requestId?: string,
137
146
  statusText?: string,
@@ -260,6 +269,23 @@ export async function drainQueue(
260
269
  session.setTurnInterfaceContext(queuedInterfaceCtx);
261
270
  }
262
271
 
272
+ // Non-interactive queued messages (channel requests) must not execute tools
273
+ // via the desktop host proxy. Clear proxy availability so isAvailable()
274
+ // returns false and tool execution falls back to local.
275
+ if (next.isInteractive === false) {
276
+ session.clearProxyAvailability();
277
+ } else {
278
+ // Restore proxy availability only for desktop-originating turns (macos/ios)
279
+ // in case a prior non-interactive drain disabled it. Non-desktop interactive
280
+ // interfaces (CLI, Vellum) should not re-enable desktop host proxies.
281
+ const interfaceCtx =
282
+ queuedInterfaceCtx ?? session.getTurnInterfaceContext();
283
+ const sourceInterface = interfaceCtx?.userMessageInterface;
284
+ if (sourceInterface === "macos" || sourceInterface === "ios") {
285
+ session.restoreProxyAvailability();
286
+ }
287
+ }
288
+
263
289
  // Resolve slash commands for queued messages
264
290
  const slashResult = resolveSlash(next.content, buildSlashContext(session));
265
291
 
@@ -326,7 +352,10 @@ export async function drainQueue(
326
352
 
327
353
  // Emit fresh model info before the text delta so the client has
328
354
  // up-to-date configuredProviders when rendering /model or /models UI.
329
- if (isModelSlashCommand(next.content)) {
355
+ if (
356
+ isModelSlashCommand(next.content) ||
357
+ isProviderShortcut(next.content)
358
+ ) {
330
359
  next.onEvent(buildModelInfoEvent());
331
360
  }
332
361
  next.onEvent({ type: "assistant_text_delta", text: slashResult.message });
@@ -510,7 +539,7 @@ export async function drainQueue(
510
539
 
511
540
  /**
512
541
  * Convenience function that persists a user message and runs the agent loop
513
- * in a single call. Used by the IPC path where blocking is expected.
542
+ * in a single call. Used by the message-handler path where blocking is expected.
514
543
  */
515
544
  export async function processMessage(
516
545
  session: ProcessSessionContext,
@@ -676,7 +705,7 @@ export async function processMessage(
676
705
 
677
706
  // Emit fresh model info before the text delta so the client has
678
707
  // up-to-date configuredProviders when rendering /model or /models UI.
679
- if (isModelSlashCommand(content)) {
708
+ if (isModelSlashCommand(content) || isProviderShortcut(content)) {
680
709
  onEvent(buildModelInfoEvent());
681
710
  }
682
711
  onEvent({ type: "assistant_text_delta", text: slashResult.message });
@@ -10,7 +10,10 @@ import type {
10
10
  TurnInterfaceContext,
11
11
  } from "../channels/types.js";
12
12
  import { getLogger } from "../util/logger.js";
13
- import type { ServerMessage, UserMessageAttachment } from "./message-protocol.js";
13
+ import type {
14
+ ServerMessage,
15
+ UserMessageAttachment,
16
+ } from "./message-protocol.js";
14
17
 
15
18
  const log = getLogger("session-queue");
16
19
 
@@ -26,16 +29,16 @@ export interface QueuedMessage {
26
29
  turnInterfaceContext?: TurnInterfaceContext;
27
30
  /** When false, the turn has no interactive user and should skip clarification prompts. */
28
31
  isInteractive?: boolean;
29
- /** Timestamp (ms) when the message was enqueued. */
30
- queuedAt: number;
31
32
  /** Original user message text to persist to DB when recording intent stripping produced a different `content`. */
32
33
  displayContent?: string;
33
34
  }
34
35
 
35
- export const MAX_QUEUE_DEPTH = 10;
36
- /** Messages older than this (ms) are auto-expired from the queue. */
37
- export const DEFAULT_MAX_WAIT_MS = 60_000;
38
- const CAPACITY_WARNING_THRESHOLD = 0.8;
36
+ /**
37
+ * Maximum total estimated bytes across all queued messages per session.
38
+ * Limits memory consumption when a sender floods messages while the
39
+ * session is busy. 50 MB is well above any legitimate usage.
40
+ */
41
+ export const DEFAULT_MAX_QUEUE_BYTES = 50 * 1024 * 1024; // 50 MB
39
42
 
40
43
  /**
41
44
  * Describes why a queued message was promoted from the queue.
@@ -53,75 +56,59 @@ export interface QueuePolicy {
53
56
  checkpointHandoffEnabled: boolean;
54
57
  }
55
58
 
56
- export interface QueueMetrics {
57
- currentDepth: number;
58
- totalDropped: number;
59
- totalExpired: number;
60
- /** Average wait time (ms) of dequeued messages. 0 when no messages have been dequeued. */
61
- averageWaitMs: number;
62
- }
63
-
64
59
  /**
65
60
  * Typed wrapper around the queued-message array.
66
61
  *
67
- * Session owns one instance; the wrapper handles capacity checks,
68
- * expiry, metrics, and iteration so the rest of Session doesn't
69
- * touch the raw array.
62
+ * Session owns one instance; the wrapper handles iteration
63
+ * so the rest of Session doesn't touch the raw array.
64
+ *
65
+ * A byte budget caps total memory held by queued messages so a
66
+ * high-rate sender cannot exhaust the process.
70
67
  */
71
68
  export class MessageQueue {
72
69
  private items: QueuedMessage[] = [];
73
- private maxWaitMs: number;
74
- private droppedCount = 0;
75
- private expiredCount = 0;
76
- private totalWaitMs = 0;
77
- private dequeuedCount = 0;
78
- private capacityWarned = false;
79
-
80
- constructor(maxWaitMs: number = DEFAULT_MAX_WAIT_MS) {
81
- this.maxWaitMs = maxWaitMs;
70
+ private currentBytes = 0;
71
+ private maxBytes: number;
72
+
73
+ constructor(maxBytes: number = DEFAULT_MAX_QUEUE_BYTES) {
74
+ this.maxBytes = maxBytes;
82
75
  }
83
76
 
77
+ /**
78
+ * Attempt to enqueue a message.
79
+ * Returns `true` if accepted, `false` if rejected (over budget).
80
+ */
84
81
  push(item: QueuedMessage): boolean {
85
- this.expireStale();
86
-
87
- if (this.items.length >= MAX_QUEUE_DEPTH) {
88
- this.droppedCount++;
89
- return false;
90
- }
91
-
92
- item.queuedAt = Date.now();
93
- this.items.push(item);
94
-
95
- const ratio = this.items.length / MAX_QUEUE_DEPTH;
96
- if (ratio >= CAPACITY_WARNING_THRESHOLD && !this.capacityWarned) {
97
- this.capacityWarned = true;
82
+ const itemBytes = estimateItemBytes(item);
83
+ if (this.currentBytes + itemBytes > this.maxBytes && this.items.length > 0) {
98
84
  log.warn(
99
- { depth: this.items.length, max: MAX_QUEUE_DEPTH },
100
- "Queue nearing capacity",
85
+ {
86
+ requestId: item.requestId,
87
+ queueDepth: this.items.length,
88
+ currentBytes: this.currentBytes,
89
+ itemBytes,
90
+ maxBytes: this.maxBytes,
91
+ },
92
+ "Rejecting queued message: queue byte budget exceeded",
101
93
  );
102
- } else if (ratio < CAPACITY_WARNING_THRESHOLD) {
103
- this.capacityWarned = false;
94
+ return false;
104
95
  }
105
-
96
+ this.items.push(item);
97
+ this.currentBytes += itemBytes;
106
98
  return true;
107
99
  }
108
100
 
109
101
  shift(): QueuedMessage | undefined {
110
- this.expireStale();
111
102
  const item = this.items.shift();
112
103
  if (item) {
113
- this.dequeuedCount++;
114
- this.totalWaitMs += Date.now() - item.queuedAt;
115
- }
116
- if (this.items.length / MAX_QUEUE_DEPTH < CAPACITY_WARNING_THRESHOLD) {
117
- this.capacityWarned = false;
104
+ this.currentBytes -= estimateItemBytes(item);
118
105
  }
119
106
  return item;
120
107
  }
121
108
 
122
109
  clear(): void {
123
110
  this.items = [];
124
- this.capacityWarned = false;
111
+ this.currentBytes = 0;
125
112
  }
126
113
 
127
114
  get length(): number {
@@ -132,6 +119,10 @@ export class MessageQueue {
132
119
  return this.items.length === 0;
133
120
  }
134
121
 
122
+ get totalBytes(): number {
123
+ return this.currentBytes;
124
+ }
125
+
135
126
  /**
136
127
  * Remove a queued message by its requestId.
137
128
  * Returns the removed message, or undefined if not found.
@@ -139,60 +130,28 @@ export class MessageQueue {
139
130
  removeByRequestId(requestId: string): QueuedMessage | undefined {
140
131
  const idx = this.items.findIndex((m) => m.requestId === requestId);
141
132
  if (idx === -1) return undefined;
142
- return this.items.splice(idx, 1)[0];
143
- }
144
-
145
- getMetrics(): QueueMetrics {
146
- return {
147
- currentDepth: this.items.length,
148
- totalDropped: this.droppedCount,
149
- totalExpired: this.expiredCount,
150
- averageWaitMs:
151
- this.dequeuedCount > 0 ? this.totalWaitMs / this.dequeuedCount : 0,
152
- };
153
- }
154
-
155
- /** Remove messages that have been waiting longer than maxWaitMs. */
156
- private expireStale(): void {
157
- const now = Date.now();
158
- const cutoff = now - this.maxWaitMs;
159
- const expired: QueuedMessage[] = [];
160
- this.items = this.items.filter((item) => {
161
- if (item.queuedAt < cutoff) {
162
- this.expiredCount++;
163
- expired.push(item);
164
- return false;
165
- }
166
- return true;
167
- });
168
- for (const item of expired) {
169
- log.warn(
170
- { requestId: item.requestId, waitMs: now - item.queuedAt },
171
- "Expiring stale queued message",
172
- );
173
- try {
174
- item.onEvent({
175
- type: "error",
176
- message:
177
- "Your queued message was dropped because it waited too long in the queue.",
178
- category: "queue_expired",
179
- });
180
- } catch (e) {
181
- log.debug(
182
- { err: e, requestId: item.requestId },
183
- "Failed to notify client of expired message",
184
- );
185
- }
186
- }
187
- if (
188
- expired.length > 0 &&
189
- this.items.length / MAX_QUEUE_DEPTH < CAPACITY_WARNING_THRESHOLD
190
- ) {
191
- this.capacityWarned = false;
192
- }
133
+ const [removed] = this.items.splice(idx, 1);
134
+ this.currentBytes -= estimateItemBytes(removed);
135
+ return removed;
193
136
  }
194
137
 
195
138
  [Symbol.iterator](): Iterator<QueuedMessage> {
196
139
  return this.items[Symbol.iterator]();
197
140
  }
198
141
  }
142
+
143
+ /**
144
+ * Estimate the in-memory byte cost of a queued message.
145
+ * Dominated by content text and attachment `data` (base64 strings).
146
+ */
147
+ function estimateItemBytes(item: QueuedMessage): number {
148
+ let bytes = item.content.length * 2; // JS strings are UTF-16
149
+ for (const a of item.attachments) {
150
+ bytes += a.data.length * 2;
151
+ if (a.extractedText) bytes += a.extractedText.length * 2;
152
+ }
153
+ // Small fixed overhead for metadata, pointers, etc. (not worth
154
+ // measuring precisely — the content/attachment data dominates).
155
+ bytes += 512;
156
+ return bytes;
157
+ }
@@ -421,13 +421,6 @@ export function injectActiveSurfaceContext(
421
421
  "8. Keep your text response to 1 brief sentence confirming what you changed.",
422
422
  );
423
423
 
424
- if (ctx.html.includes('data-vellum-home-base="v1"')) {
425
- lines.push(
426
- "9. This is the prebuilt Home Base scaffold. Preserve layout anchors:",
427
- " `home-base-root`, `home-base-onboarding-lane`, and `home-base-starter-lane`.",
428
- );
429
- }
430
-
431
424
  // File tree with sizes (capped at 50 files to bound prompt size)
432
425
  const files = ctx.appFiles ?? listAppFiles(ctx.appId);
433
426
  const MAX_FILE_TREE_ENTRIES = 50;
@@ -1181,3 +1174,30 @@ export function applyRuntimeInjections(
1181
1174
 
1182
1175
  return result;
1183
1176
  }
1177
+
1178
+ // ---------------------------------------------------------------------------
1179
+ // Attachment detection
1180
+ // ---------------------------------------------------------------------------
1181
+
1182
+ /** Content block types that indicate user-uploaded attachments. */
1183
+ const ATTACHMENT_CONTENT_TYPES = new Set(["image", "file"]);
1184
+
1185
+ /**
1186
+ * Scan conversation messages for user-uploaded attachment content blocks
1187
+ * (image or file). Returns true as soon as any attachment is found.
1188
+ *
1189
+ * Used to set the one-way `hasAttachments` flag on Session so that asset
1190
+ * tools (asset_search, asset_materialize) are included in tool definitions
1191
+ * only when the conversation contains attachments.
1192
+ */
1193
+ export function messagesContainAttachments(messages: Message[]): boolean {
1194
+ for (const message of messages) {
1195
+ if (message.role !== "user") continue;
1196
+ for (const block of message.content) {
1197
+ if (ATTACHMENT_CONTENT_TYPES.has(block.type)) {
1198
+ return true;
1199
+ }
1200
+ }
1201
+ }
1202
+ return false;
1203
+ }
@@ -240,12 +240,21 @@ export function projectSkillTools(
240
240
  const contextIds = contextEntries.map((e) => e.id);
241
241
  const allCandidateIds = new Set<string>([...contextIds, ...preactivated]);
242
242
 
243
+ // Load the catalog (cached for session lifetime) and index by ID
244
+ const catalog = getCachedCatalog(options?.cache);
245
+ const catalogById = new Map<string, SkillSummary>();
246
+ for (const skill of catalog) {
247
+ catalogById.set(skill.id, skill);
248
+ }
249
+
243
250
  // Assistant feature flag gate: drop skills whose flag is explicitly OFF,
244
251
  // even if they have markers in conversation history from before the flag was turned off.
245
252
  const config = getConfig();
246
253
  const activeIds = new Set<string>();
247
254
  for (const id of allCandidateIds) {
248
- if (isAssistantFeatureFlagEnabled(skillFlagKey(id), config)) {
255
+ const skill = catalogById.get(id);
256
+ const flagKey = skill ? skillFlagKey(skill) : undefined;
257
+ if (!flagKey || isAssistantFeatureFlagEnabled(flagKey, config)) {
249
258
  activeIds.add(id);
250
259
  }
251
260
  }
@@ -270,14 +279,7 @@ export function projectSkillTools(
270
279
  return { toolDefinitions: [], allowedToolNames: new Set() };
271
280
  }
272
281
 
273
- // Load the catalog (cached for session lifetime) and index by ID
274
- const catalog = getCachedCatalog(options?.cache);
275
- const catalogById = new Map<string, SkillSummary>();
276
- for (const skill of catalog) {
277
- catalogById.set(skill.id, skill);
278
- }
279
-
280
- const allToolDefinitions: ToolDefinition[] = [];
282
+ // Tool definitions are no longer sent to the LLM tools are invoked via skill_execute dispatch.
281
283
  const allToolNames = new Set<string>();
282
284
  const successfulEntries = new Map<string, string>();
283
285
  // Track skills already unregistered in the version-change branch so the
@@ -373,7 +375,6 @@ export function projectSkillTools(
373
375
 
374
376
  successfulEntries.set(skillId, currentHash);
375
377
  for (const tool of accepted) {
376
- allToolDefinitions.push(tool.getDefinition());
377
378
  allToolNames.add(tool.name);
378
379
  }
379
380
  }
@@ -405,7 +406,7 @@ export function projectSkillTools(
405
406
  }
406
407
 
407
408
  return {
408
- toolDefinitions: allToolDefinitions,
409
+ toolDefinitions: [],
409
410
  allowedToolNames: allToolNames,
410
411
  };
411
412
  }
@@ -121,6 +121,13 @@ const PROVIDER_MODEL_SHORTCUTS: Record<
121
121
  },
122
122
  };
123
123
 
124
+ /** True when the trimmed content matches a provider shortcut like /opus, /gpt4, etc. */
125
+ export function isProviderShortcut(content: string): boolean {
126
+ const match = content.trim().match(/^\/([a-z0-9-]+)(\s|$)/i);
127
+ if (!match) return false;
128
+ return match[1].toLowerCase() in PROVIDER_MODEL_SHORTCUTS;
129
+ }
130
+
124
131
  /** Reverse lookup: model ID → provider, derived from PROVIDER_MODEL_SHORTCUTS. */
125
132
  export const MODEL_TO_PROVIDER: Record<string, string> = Object.fromEntries(
126
133
  Object.values(PROVIDER_MODEL_SHORTCUTS).map(({ model, provider }) => [