@vellumai/assistant 0.4.44 → 0.4.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (681) hide show
  1. package/.prettierignore +4 -0
  2. package/ARCHITECTURE.md +34 -31
  3. package/README.md +4 -4
  4. package/bun.lock +10 -35
  5. package/docs/architecture/integrations.md +102 -197
  6. package/docs/architecture/keychain-broker.md +1 -1
  7. package/docs/architecture/memory.md +2 -2
  8. package/docs/architecture/scheduling.md +1 -1
  9. package/docs/architecture/security.md +11 -11
  10. package/docs/error-handling.md +1 -1
  11. package/docs/trusted-contact-access.md +3 -3
  12. package/drizzle/meta/0000_snapshot.json +34 -100
  13. package/drizzle/meta/_journal.json +1 -1
  14. package/drizzle.config.ts +4 -4
  15. package/package.json +3 -2
  16. package/scripts/capture-x-graphql.ts +237 -141
  17. package/scripts/generate-bundled-tool-registry.ts +223 -0
  18. package/src/__tests__/access-request-decision.test.ts +0 -1
  19. package/src/__tests__/actor-token-service.test.ts +23 -24
  20. package/src/__tests__/agent-loop.test.ts +0 -131
  21. package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
  22. package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
  23. package/src/__tests__/approval-primitive.test.ts +0 -1
  24. package/src/__tests__/approval-routes-http.test.ts +11 -1
  25. package/src/__tests__/asset-materialize-tool.test.ts +0 -1
  26. package/src/__tests__/asset-search-tool.test.ts +0 -1
  27. package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
  28. package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
  29. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
  30. package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
  31. package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
  32. package/src/__tests__/attachments-store.test.ts +0 -1
  33. package/src/__tests__/avatar-e2e.test.ts +74 -115
  34. package/src/__tests__/avatar-router.test.ts +25 -62
  35. package/src/__tests__/browser-manager.test.ts +24 -0
  36. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
  37. package/src/__tests__/browser-skill-endstate.test.ts +8 -11
  38. package/src/__tests__/btw-routes.test.ts +326 -0
  39. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
  40. package/src/__tests__/call-controller.test.ts +0 -1
  41. package/src/__tests__/call-conversation-messages.test.ts +0 -1
  42. package/src/__tests__/call-domain.test.ts +0 -1
  43. package/src/__tests__/call-pointer-messages.test.ts +0 -1
  44. package/src/__tests__/call-recovery.test.ts +0 -1
  45. package/src/__tests__/call-routes-http.test.ts +0 -1
  46. package/src/__tests__/call-store.test.ts +0 -1
  47. package/src/__tests__/canonical-guardian-store.test.ts +0 -1
  48. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  49. package/src/__tests__/channel-approvals.test.ts +1 -1
  50. package/src/__tests__/channel-delivery-store.test.ts +0 -1
  51. package/src/__tests__/channel-guardian.test.ts +5 -7
  52. package/src/__tests__/channel-retry-sweep.test.ts +0 -1
  53. package/src/__tests__/checker.test.ts +4 -11
  54. package/src/__tests__/compaction.benchmark.test.ts +16 -14
  55. package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
  56. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  57. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
  58. package/src/__tests__/computer-use-tools.test.ts +35 -31
  59. package/src/__tests__/config-schema.test.ts +11 -15
  60. package/src/__tests__/config-watcher.test.ts +0 -1
  61. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  62. package/src/__tests__/conflict-store.test.ts +0 -1
  63. package/src/__tests__/connection-policy.test.ts +4 -7
  64. package/src/__tests__/contacts-tools.test.ts +0 -1
  65. package/src/__tests__/context-memory-e2e.test.ts +2 -4
  66. package/src/__tests__/context-overflow-reducer.test.ts +2 -4
  67. package/src/__tests__/context-window-manager.test.ts +147 -60
  68. package/src/__tests__/contradiction-checker.test.ts +0 -1
  69. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  70. package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
  71. package/src/__tests__/conversation-pairing.test.ts +2 -2
  72. package/src/__tests__/conversation-routes-guardian-reply.test.ts +25 -1
  73. package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
  74. package/src/__tests__/conversation-store.test.ts +0 -1
  75. package/src/__tests__/conversation-unread-route.test.ts +1 -2
  76. package/src/__tests__/credential-security-invariants.test.ts +7 -8
  77. package/src/__tests__/cross-provider-web-search.test.ts +353 -0
  78. package/src/__tests__/daemon-assistant-events.test.ts +6 -7
  79. package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
  80. package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
  81. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
  82. package/src/__tests__/diagnostics-export.test.ts +189 -0
  83. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  84. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  85. package/src/__tests__/entity-extractor.test.ts +0 -1
  86. package/src/__tests__/entity-search.test.ts +0 -1
  87. package/src/__tests__/ephemeral-permissions.test.ts +2 -4
  88. package/src/__tests__/file-read-tool.test.ts +86 -0
  89. package/src/__tests__/followup-tools.test.ts +0 -1
  90. package/src/__tests__/frontmatter.test.ts +77 -34
  91. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  92. package/src/__tests__/gateway-only-guard.test.ts +1 -1
  93. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
  94. package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
  95. package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
  96. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  97. package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
  98. package/src/__tests__/guardian-action-store.test.ts +0 -1
  99. package/src/__tests__/guardian-action-sweep.test.ts +0 -1
  100. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  101. package/src/__tests__/guardian-dispatch.test.ts +1 -2
  102. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  103. package/src/__tests__/guardian-outbound-http.test.ts +0 -1
  104. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
  105. package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
  106. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  107. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  108. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
  109. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
  110. package/src/__tests__/host-bash-proxy.test.ts +335 -0
  111. package/src/__tests__/host-file-proxy.test.ts +374 -0
  112. package/src/__tests__/host-shell-tool.test.ts +147 -1
  113. package/src/__tests__/http-user-message-parity.test.ts +361 -0
  114. package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
  115. package/src/__tests__/integration-status.test.ts +3 -8
  116. package/src/__tests__/intent-routing.test.ts +7 -46
  117. package/src/__tests__/invite-redemption-service.test.ts +0 -1
  118. package/src/__tests__/invite-routes-http.test.ts +0 -1
  119. package/src/__tests__/llm-usage-store.test.ts +0 -1
  120. package/src/__tests__/managed-avatar-client.test.ts +101 -55
  121. package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
  122. package/src/__tests__/managed-store.test.ts +94 -21
  123. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
  124. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
  125. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
  126. package/src/__tests__/memory-recall-quality.test.ts +0 -1
  127. package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
  128. package/src/__tests__/memory-regressions.test.ts +0 -1
  129. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
  130. package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
  131. package/src/__tests__/messaging-send-tool.test.ts +35 -0
  132. package/src/__tests__/messaging-skill-split.test.ts +138 -0
  133. package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
  134. package/src/__tests__/migration-export-http.test.ts +2 -3
  135. package/src/__tests__/migration-import-commit-http.test.ts +1 -2
  136. package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
  137. package/src/__tests__/migration-validate-http.test.ts +1 -2
  138. package/src/__tests__/native-web-search.test.ts +475 -0
  139. package/src/__tests__/navigate-settings-tab.test.ts +84 -0
  140. package/src/__tests__/non-member-access-request.test.ts +0 -1
  141. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  142. package/src/__tests__/notification-decision-strategy.test.ts +6 -6
  143. package/src/__tests__/notification-deep-link.test.ts +7 -7
  144. package/src/__tests__/notification-guardian-path.test.ts +2 -3
  145. package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
  146. package/src/__tests__/notification-thread-candidates.test.ts +4 -4
  147. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  148. package/src/__tests__/playbook-execution.test.ts +0 -1
  149. package/src/__tests__/playbook-tools.test.ts +0 -1
  150. package/src/__tests__/profile-compiler.test.ts +0 -1
  151. package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
  152. package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
  153. package/src/__tests__/recording-handler.test.ts +30 -94
  154. package/src/__tests__/registry.test.ts +28 -35
  155. package/src/__tests__/relay-server.test.ts +0 -1
  156. package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
  157. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  158. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  159. package/src/__tests__/runtime-events-sse.test.ts +0 -1
  160. package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
  161. package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
  162. package/src/__tests__/schedule-store.test.ts +441 -1
  163. package/src/__tests__/schedule-tools.test.ts +468 -7
  164. package/src/__tests__/scheduler-recurrence.test.ts +196 -23
  165. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  166. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  167. package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
  168. package/src/__tests__/secret-response-routing.test.ts +4 -1
  169. package/src/__tests__/send-endpoint-busy.test.ts +14 -2
  170. package/src/__tests__/send-notification-tool.test.ts +0 -7
  171. package/src/__tests__/sequence-store.test.ts +0 -1
  172. package/src/__tests__/server-history-render.test.ts +1 -2
  173. package/src/__tests__/session-abort-tool-results.test.ts +0 -1
  174. package/src/__tests__/session-agent-loop.test.ts +46 -6
  175. package/src/__tests__/session-confirmation-signals.test.ts +0 -1
  176. package/src/__tests__/session-conflict-gate.test.ts +2 -6
  177. package/src/__tests__/session-error.test.ts +5 -14
  178. package/src/__tests__/session-init.benchmark.test.ts +3 -5
  179. package/src/__tests__/session-load-history-repair.test.ts +0 -1
  180. package/src/__tests__/session-media-retry.test.ts +12 -74
  181. package/src/__tests__/session-pre-run-repair.test.ts +0 -1
  182. package/src/__tests__/session-profile-injection.test.ts +2 -6
  183. package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
  184. package/src/__tests__/session-queue.test.ts +94 -139
  185. package/src/__tests__/session-skill-tools.test.ts +115 -115
  186. package/src/__tests__/session-slash-known.test.ts +0 -1
  187. package/src/__tests__/session-slash-queue.test.ts +0 -1
  188. package/src/__tests__/session-slash-unknown.test.ts +0 -1
  189. package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
  190. package/src/__tests__/session-usage.test.ts +0 -1
  191. package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
  192. package/src/__tests__/session-workspace-injection.test.ts +2 -6
  193. package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
  194. package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
  195. package/src/__tests__/skill-feature-flags.test.ts +125 -18
  196. package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
  197. package/src/__tests__/skill-load-tool.test.ts +194 -2
  198. package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
  199. package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
  200. package/src/__tests__/skills.test.ts +14 -53
  201. package/src/__tests__/slack-channel-config.test.ts +0 -1
  202. package/src/__tests__/slack-inbound-verification.test.ts +0 -1
  203. package/src/__tests__/slack-skill.test.ts +1 -1
  204. package/src/__tests__/subagent-tools.test.ts +2 -2
  205. package/src/__tests__/system-prompt.test.ts +4 -3
  206. package/src/__tests__/task-compiler.test.ts +0 -1
  207. package/src/__tests__/task-management-tools.test.ts +0 -1
  208. package/src/__tests__/task-memory-cleanup.test.ts +0 -1
  209. package/src/__tests__/task-runner.test.ts +0 -1
  210. package/src/__tests__/task-scheduler.test.ts +0 -1
  211. package/src/__tests__/terminal-tools.test.ts +0 -1
  212. package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
  213. package/src/__tests__/thread-seed-composer.test.ts +5 -5
  214. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  215. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  216. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  217. package/src/__tests__/tool-executor.test.ts +8 -86
  218. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  219. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  220. package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
  221. package/src/__tests__/trust-store.test.ts +80 -4
  222. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  223. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  224. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
  225. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  226. package/src/__tests__/trusted-contact-verification.test.ts +0 -1
  227. package/src/__tests__/twilio-provider.test.ts +0 -1
  228. package/src/__tests__/twilio-routes.test.ts +0 -1
  229. package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
  230. package/src/__tests__/update-bulletin.test.ts +0 -1
  231. package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
  232. package/src/__tests__/usage-routes.test.ts +0 -1
  233. package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
  234. package/src/__tests__/voice-invite-redemption.test.ts +0 -1
  235. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  236. package/src/__tests__/voice-session-bridge.test.ts +9 -1
  237. package/src/__tests__/web-fetch.test.ts +57 -0
  238. package/src/__tests__/workspace-git-service.test.ts +5 -14
  239. package/src/__tests__/workspace-policy.test.ts +0 -1
  240. package/src/agent/loop.ts +22 -34
  241. package/src/bundler/bundle-signer.ts +4 -4
  242. package/src/calls/call-controller.ts +1 -1
  243. package/src/calls/relay-server.ts +1 -1
  244. package/src/calls/twilio-rest.ts +1 -1
  245. package/src/calls/voice-session-bridge.ts +3 -1
  246. package/src/cli/__tests__/notifications.test.ts +3 -4
  247. package/src/cli/commands/map.ts +2 -6
  248. package/src/cli/commands/mcp.ts +73 -15
  249. package/src/cli/commands/notifications.ts +4 -4
  250. package/src/cli/commands/sessions.ts +9 -1
  251. package/src/cli/commands/skills.ts +6 -10
  252. package/src/cli/http-client.ts +2 -3
  253. package/src/cli/main-screen.tsx +10 -10
  254. package/src/cli/program.ts +0 -4
  255. package/src/cli/reference.ts +0 -2
  256. package/src/cli.ts +15 -9
  257. package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
  258. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
  259. package/src/config/bundled-skills/app-builder/SKILL.md +6 -1
  260. package/src/config/bundled-skills/browser/SKILL.md +6 -1
  261. package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
  262. package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
  263. package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
  264. package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
  265. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
  266. package/src/config/bundled-skills/contacts/SKILL.md +10 -1
  267. package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
  268. package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
  269. package/src/config/bundled-skills/document/SKILL.md +4 -1
  270. package/src/config/bundled-skills/doordash/SKILL.md +8 -1
  271. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
  272. package/src/config/bundled-skills/followups/SKILL.md +4 -1
  273. package/src/config/bundled-skills/gmail/SKILL.md +180 -0
  274. package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
  275. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
  276. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
  277. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
  278. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
  279. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
  280. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
  281. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
  282. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
  283. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
  284. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
  285. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
  286. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
  287. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
  288. package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
  289. package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
  290. package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
  291. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
  292. package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
  293. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
  294. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
  295. package/src/config/bundled-skills/messaging/SKILL.md +23 -139
  296. package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
  297. package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
  298. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
  299. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
  300. package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
  301. package/src/config/bundled-skills/notifications/SKILL.md +5 -1
  302. package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
  303. package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
  304. package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → orchestration/tools/swarm-delegate.ts} +3 -3
  305. package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
  306. package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
  307. package/src/config/bundled-skills/schedule/SKILL.md +70 -9
  308. package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
  309. package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
  310. package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
  311. package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
  312. package/src/config/bundled-skills/sequences/SKILL.md +47 -0
  313. package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
  314. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
  315. package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
  316. package/src/config/bundled-skills/settings/SKILL.md +12 -0
  317. package/src/config/bundled-skills/settings/TOOLS.json +112 -0
  318. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
  319. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
  320. package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
  321. package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
  322. package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
  323. package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
  324. package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
  325. package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
  326. package/src/config/bundled-skills/slack/SKILL.md +5 -1
  327. package/src/config/bundled-skills/subagent/SKILL.md +4 -1
  328. package/src/config/bundled-skills/tasks/SKILL.md +5 -2
  329. package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
  330. package/src/config/bundled-skills/watcher/SKILL.md +4 -1
  331. package/src/config/bundled-tool-registry.ts +118 -107
  332. package/src/config/env.ts +5 -2
  333. package/src/config/feature-flag-registry.json +25 -9
  334. package/src/config/loader.ts +10 -2
  335. package/src/config/schema.ts +19 -16
  336. package/src/config/schemas/inference.ts +12 -22
  337. package/src/config/schemas/memory-storage.ts +19 -1
  338. package/src/config/schemas/platform.ts +0 -16
  339. package/src/config/skill-state.ts +11 -8
  340. package/src/config/skills.ts +83 -32
  341. package/src/context/token-estimator.ts +11 -0
  342. package/src/context/window-manager.ts +180 -151
  343. package/src/daemon/computer-use-session.ts +11 -43
  344. package/src/daemon/daemon-control.ts +4 -1
  345. package/src/daemon/handlers/config-channels.ts +5 -9
  346. package/src/daemon/handlers/config-ingress.ts +0 -4
  347. package/src/daemon/handlers/config-model.ts +7 -13
  348. package/src/daemon/handlers/config-telegram.ts +4 -8
  349. package/src/daemon/handlers/config-voice.ts +2 -5
  350. package/src/daemon/handlers/dictation.ts +2 -12
  351. package/src/daemon/handlers/identity.ts +0 -105
  352. package/src/daemon/handlers/recording.ts +3 -23
  353. package/src/daemon/handlers/session-history.ts +1 -1
  354. package/src/daemon/handlers/sessions.ts +53 -72
  355. package/src/daemon/handlers/shared.ts +7 -28
  356. package/src/daemon/handlers/skills.ts +31 -27
  357. package/src/daemon/host-bash-proxy.ts +148 -0
  358. package/src/daemon/host-file-proxy.ts +135 -0
  359. package/src/daemon/lifecycle.ts +49 -24
  360. package/src/daemon/mcp-reload-service.ts +123 -0
  361. package/src/daemon/message-protocol.ts +6 -0
  362. package/src/daemon/message-types/browser.ts +1 -1
  363. package/src/daemon/message-types/computer-use.ts +1 -4
  364. package/src/daemon/message-types/guardian-actions.ts +1 -1
  365. package/src/daemon/message-types/host-bash.ts +18 -0
  366. package/src/daemon/message-types/host-file.ts +44 -0
  367. package/src/daemon/message-types/integrations.ts +1 -67
  368. package/src/daemon/message-types/messages.ts +15 -0
  369. package/src/daemon/message-types/schedules.ts +11 -27
  370. package/src/daemon/message-types/sessions.ts +2 -1
  371. package/src/daemon/message-types/settings.ts +1 -1
  372. package/src/daemon/message-types/shared.ts +1 -1
  373. package/src/daemon/ride-shotgun-handler.ts +2 -42
  374. package/src/daemon/server.ts +43 -10
  375. package/src/daemon/session-agent-loop-handlers.ts +48 -7
  376. package/src/daemon/session-agent-loop.ts +97 -66
  377. package/src/daemon/session-attachments.ts +1 -1
  378. package/src/daemon/session-error.ts +17 -16
  379. package/src/daemon/session-lifecycle.ts +20 -1
  380. package/src/daemon/session-media-retry.ts +1 -15
  381. package/src/daemon/session-messaging.ts +14 -6
  382. package/src/daemon/session-process.ts +36 -7
  383. package/src/daemon/session-queue-manager.ts +62 -103
  384. package/src/daemon/session-runtime-assembly.ts +27 -0
  385. package/src/daemon/session-skill-tools.ts +12 -11
  386. package/src/daemon/session-slash.ts +7 -0
  387. package/src/daemon/session-surfaces.ts +19 -97
  388. package/src/daemon/session-tool-setup.ts +146 -6
  389. package/src/daemon/session.ts +77 -13
  390. package/src/errors.ts +0 -2
  391. package/src/export/formatter.ts +6 -0
  392. package/src/mcp/mcp-oauth-provider.ts +1 -3
  393. package/src/media/avatar-router.ts +20 -28
  394. package/src/media/avatar-types.ts +7 -14
  395. package/src/media/managed-avatar-client.ts +70 -34
  396. package/src/memory/conversation-title-service.ts +1 -2
  397. package/src/memory/db-init.ts +16 -0
  398. package/src/memory/embedding-backend.ts +129 -27
  399. package/src/memory/embedding-gemini.test.ts +256 -0
  400. package/src/memory/embedding-gemini.ts +47 -13
  401. package/src/memory/embedding-local.ts +14 -2
  402. package/src/memory/embedding-ollama.ts +15 -2
  403. package/src/memory/embedding-openai.ts +15 -2
  404. package/src/memory/embedding-types.test.ts +116 -0
  405. package/src/memory/embedding-types.ts +61 -0
  406. package/src/memory/fingerprint.ts +1 -1
  407. package/src/memory/indexer.ts +25 -1
  408. package/src/memory/job-handlers/embedding.test.ts +258 -0
  409. package/src/memory/job-handlers/embedding.ts +81 -1
  410. package/src/memory/job-handlers/index-maintenance.ts +35 -1
  411. package/src/memory/job-handlers/media-processing.ts +11 -1
  412. package/src/memory/job-utils.ts +21 -6
  413. package/src/memory/jobs-store.ts +5 -1
  414. package/src/memory/jobs-worker.ts +8 -0
  415. package/src/memory/message-content.ts +66 -0
  416. package/src/memory/migrations/100-core-tables.ts +1 -31
  417. package/src/memory/migrations/104-core-indexes.ts +0 -11
  418. package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
  419. package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
  420. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
  421. package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
  422. package/src/memory/migrations/index.ts +4 -0
  423. package/src/memory/migrations/registry.ts +19 -0
  424. package/src/memory/qdrant-client.ts +158 -43
  425. package/src/memory/retriever.test.ts +0 -1
  426. package/src/memory/retriever.ts +12 -2
  427. package/src/memory/schema/infrastructure.ts +5 -29
  428. package/src/memory/search/formatting.ts +34 -9
  429. package/src/memory/search/semantic.ts +57 -2
  430. package/src/memory/search/types.ts +2 -1
  431. package/src/notifications/AGENTS.md +2 -2
  432. package/src/notifications/README.md +59 -58
  433. package/src/notifications/adapters/macos.ts +1 -1
  434. package/src/notifications/broadcaster.ts +5 -5
  435. package/src/notifications/copy-composer.ts +1 -1
  436. package/src/notifications/decision-engine.ts +2 -2
  437. package/src/notifications/destination-resolver.ts +2 -2
  438. package/src/notifications/emit-signal.ts +8 -8
  439. package/src/notifications/signal.ts +1 -1
  440. package/src/notifications/thread-seed-composer.ts +1 -1
  441. package/src/oauth/connect-orchestrator.ts +1 -1
  442. package/src/oauth/token-persistence.ts +1 -1
  443. package/src/permissions/checker.ts +12 -1
  444. package/src/permissions/defaults.ts +10 -14
  445. package/src/permissions/trust-store.ts +37 -0
  446. package/src/permissions/workspace-policy.ts +0 -1
  447. package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
  448. package/src/prompts/computer-use-prompt.ts +1 -1
  449. package/src/prompts/system-prompt.ts +29 -30
  450. package/src/prompts/templates/SOUL.md +1 -2
  451. package/src/prompts/templates/UPDATES.md +16 -7
  452. package/src/providers/anthropic/client.ts +87 -33
  453. package/src/providers/gemini/client.ts +6 -0
  454. package/src/providers/managed-proxy/constants.ts +5 -0
  455. package/src/providers/openai/client.ts +15 -0
  456. package/src/providers/registry.ts +2 -2
  457. package/src/providers/types.ts +24 -2
  458. package/src/runtime/AGENTS.md +18 -0
  459. package/src/runtime/assistant-event-hub.ts +2 -3
  460. package/src/runtime/assistant-event.ts +4 -4
  461. package/src/runtime/auth/__tests__/context.test.ts +5 -5
  462. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  463. package/src/runtime/auth/__tests__/guard-tests.test.ts +2 -2
  464. package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
  465. package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
  466. package/src/runtime/auth/__tests__/scopes.test.ts +7 -7
  467. package/src/runtime/auth/__tests__/subject.test.ts +8 -8
  468. package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
  469. package/src/runtime/auth/route-policy.ts +8 -4
  470. package/src/runtime/auth/scopes.ts +1 -1
  471. package/src/runtime/auth/subject.ts +4 -4
  472. package/src/runtime/auth/token-service.ts +0 -23
  473. package/src/runtime/auth/types.ts +3 -3
  474. package/src/runtime/guardian-action-followup-executor.ts +1 -1
  475. package/src/runtime/guardian-action-grant-minter.ts +1 -1
  476. package/src/runtime/guardian-action-service.ts +3 -3
  477. package/src/runtime/http-server.ts +15 -2
  478. package/src/runtime/invite-service.ts +3 -3
  479. package/src/runtime/local-actor-identity.ts +17 -22
  480. package/src/runtime/pending-interactions.ts +21 -9
  481. package/src/runtime/routes/app-management-routes.ts +2 -3
  482. package/src/runtime/routes/approval-routes.ts +1 -3
  483. package/src/runtime/routes/btw-routes.ts +155 -0
  484. package/src/runtime/routes/computer-use-routes.ts +77 -31
  485. package/src/runtime/routes/conversation-routes.ts +230 -46
  486. package/src/runtime/routes/diagnostics-routes.ts +63 -29
  487. package/src/runtime/routes/documents-routes.ts +2 -2
  488. package/src/runtime/routes/global-search-routes.ts +1 -1
  489. package/src/runtime/routes/host-bash-routes.ts +83 -0
  490. package/src/runtime/routes/host-file-routes.ts +79 -0
  491. package/src/runtime/routes/integrations/slack/share.ts +1 -1
  492. package/src/runtime/routes/log-export-routes.ts +120 -0
  493. package/src/runtime/routes/mcp-routes.ts +20 -0
  494. package/src/runtime/routes/migration-routes.ts +3 -3
  495. package/src/runtime/routes/pairing-routes.ts +1 -1
  496. package/src/runtime/routes/recording-routes.ts +6 -4
  497. package/src/runtime/routes/schedule-routes.ts +31 -5
  498. package/src/runtime/routes/session-management-routes.ts +2 -6
  499. package/src/runtime/routes/session-query-routes.ts +18 -15
  500. package/src/runtime/routes/settings-routes.ts +7 -261
  501. package/src/runtime/routes/skills-routes.ts +7 -6
  502. package/src/runtime/routes/subagents-routes.ts +4 -10
  503. package/src/runtime/routes/surface-action-routes.ts +3 -14
  504. package/src/runtime/routes/surface-content-routes.ts +22 -5
  505. package/src/runtime/routes/work-items-routes.ts +21 -25
  506. package/src/runtime/routes/workspace-routes.test.ts +3 -3
  507. package/src/runtime/routes/workspace-utils.ts +1 -1
  508. package/src/runtime/telegram-streaming-delivery.ts +3 -0
  509. package/src/runtime/verification-outbound-actions.ts +2 -2
  510. package/src/schedule/integration-status.ts +0 -6
  511. package/src/schedule/schedule-store.ts +234 -43
  512. package/src/schedule/scheduler.ts +73 -74
  513. package/src/security/oauth2.ts +1 -1
  514. package/src/sequence/store.ts +12 -2
  515. package/src/skills/frontmatter.ts +19 -77
  516. package/src/skills/managed-store.ts +11 -2
  517. package/src/subagent/manager.ts +5 -3
  518. package/src/tasks/ephemeral-permissions.ts +3 -5
  519. package/src/tools/AGENTS.md +0 -1
  520. package/src/tools/browser/browser-manager.ts +17 -11
  521. package/src/tools/browser/jit-auth.ts +4 -1
  522. package/src/tools/claude-code/claude-code.ts +1 -1
  523. package/src/tools/computer-use/definitions.ts +48 -60
  524. package/src/tools/document/document-tool.ts +6 -6
  525. package/src/tools/filesystem/edit.ts +2 -1
  526. package/src/tools/filesystem/read.ts +20 -2
  527. package/src/tools/filesystem/write.ts +2 -1
  528. package/src/tools/host-filesystem/edit.ts +17 -1
  529. package/src/tools/host-filesystem/read.ts +16 -1
  530. package/src/tools/host-filesystem/write.ts +15 -1
  531. package/src/tools/host-terminal/host-shell.ts +24 -0
  532. package/src/tools/memory/definitions.ts +45 -81
  533. package/src/tools/memory/handlers.test.ts +0 -1
  534. package/src/tools/memory/handlers.ts +1 -1
  535. package/src/tools/memory/register.ts +26 -60
  536. package/src/tools/network/script-proxy/session-manager.ts +6 -8
  537. package/src/tools/network/web-fetch.ts +7 -1
  538. package/src/tools/network/web-search.ts +2 -1
  539. package/src/tools/registry.ts +23 -0
  540. package/src/tools/schedule/create.ts +113 -5
  541. package/src/tools/schedule/list.ts +57 -15
  542. package/src/tools/schedule/update.ts +73 -3
  543. package/src/tools/shared/filesystem/image-read.ts +192 -0
  544. package/src/tools/side-effects.ts +1 -7
  545. package/src/tools/skills/delete-managed.ts +27 -64
  546. package/src/tools/skills/execute.ts +54 -0
  547. package/src/tools/skills/load.ts +127 -5
  548. package/src/tools/skills/scaffold-managed.ts +93 -172
  549. package/src/tools/subagent/message.ts +0 -7
  550. package/src/tools/subagent/spawn.ts +1 -1
  551. package/src/tools/swarm/delegate.ts +0 -3
  552. package/src/tools/system/avatar-generator.ts +13 -19
  553. package/src/tools/system/request-permission.ts +2 -1
  554. package/src/tools/terminal/safe-env.ts +1 -0
  555. package/src/tools/tool-manifest.ts +41 -47
  556. package/src/tools/types.ts +6 -2
  557. package/src/tools/ui-surface/definitions.ts +0 -55
  558. package/src/util/errors.ts +0 -10
  559. package/src/workspace/git-service.ts +0 -2
  560. package/src/__tests__/account-registry.test.ts +0 -258
  561. package/src/__tests__/email-classifier.test.ts +0 -25
  562. package/src/__tests__/gmail-integration.test.ts +0 -97
  563. package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
  564. package/src/__tests__/managed-twitter-guardrails.test.ts +0 -357
  565. package/src/__tests__/recording-intent-fallback.test.ts +0 -199
  566. package/src/__tests__/recording-intent.test.ts +0 -985
  567. package/src/__tests__/recording-state-machine.test.ts +0 -1574
  568. package/src/__tests__/reminder-store.test.ts +0 -350
  569. package/src/__tests__/reminder.test.ts +0 -337
  570. package/src/__tests__/scan-result-store.test.ts +0 -121
  571. package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -475
  572. package/src/__tests__/view-image-tool.test.ts +0 -241
  573. package/src/cli/commands/amazon/cart.ts +0 -513
  574. package/src/cli/commands/amazon/checkout.ts +0 -394
  575. package/src/cli/commands/amazon/client.ts +0 -513
  576. package/src/cli/commands/amazon/index.ts +0 -885
  577. package/src/cli/commands/amazon/product-details.ts +0 -145
  578. package/src/cli/commands/amazon/request-extractor.ts +0 -187
  579. package/src/cli/commands/amazon/search.ts +0 -76
  580. package/src/cli/commands/amazon/session.ts +0 -108
  581. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -345
  582. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -252
  583. package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -151
  584. package/src/cli/commands/twitter/index.ts +0 -420
  585. package/src/cli/commands/twitter/oauth-client.ts +0 -60
  586. package/src/cli/commands/twitter/router.ts +0 -351
  587. package/src/cli/commands/twitter/types.ts +0 -30
  588. package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
  589. package/src/config/bundled-skills/agentmail/icon.svg +0 -21
  590. package/src/config/bundled-skills/amazon/SKILL.md +0 -136
  591. package/src/config/bundled-skills/amazon/icon.svg +0 -13
  592. package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
  593. package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
  594. package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
  595. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
  596. package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
  597. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
  598. package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
  599. package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
  600. package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
  601. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
  602. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
  603. package/src/config/bundled-skills/influencer/SKILL.md +0 -144
  604. package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
  605. package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
  606. package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
  607. package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
  608. package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
  609. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
  610. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
  611. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
  612. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
  613. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
  614. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
  615. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
  616. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
  617. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
  618. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
  619. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
  620. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
  621. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
  622. package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
  623. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
  624. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
  625. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
  626. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
  627. package/src/config/bundled-skills/notion/SKILL.md +0 -240
  628. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
  629. package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
  630. package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
  631. package/src/config/bundled-skills/reminder/SKILL.md +0 -79
  632. package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
  633. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
  634. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
  635. package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
  636. package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
  637. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
  638. package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
  639. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
  640. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
  641. package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
  642. package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
  643. package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
  644. package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
  645. package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
  646. package/src/config/bundled-skills/twitter/SKILL.md +0 -206
  647. package/src/config/bundled-skills/twitter/icon.svg +0 -14
  648. package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
  649. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
  650. package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
  651. package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
  652. package/src/daemon/handlers/pairing.ts +0 -119
  653. package/src/daemon/handlers/session-user-message.ts +0 -961
  654. package/src/daemon/recording-executor.ts +0 -180
  655. package/src/daemon/recording-intent-fallback.ts +0 -162
  656. package/src/daemon/recording-intent.ts +0 -493
  657. package/src/memory/account-store.ts +0 -117
  658. package/src/messaging/activity-analyzer.ts +0 -76
  659. package/src/messaging/email-classifier.ts +0 -208
  660. package/src/messaging/index.ts +0 -2
  661. package/src/messaging/outreach-classifier.ts +0 -185
  662. package/src/messaging/thread-summarizer.ts +0 -346
  663. package/src/messaging/types.ts +0 -17
  664. package/src/tools/browser/x-auto-navigate.ts +0 -254
  665. package/src/tools/credentials/account-registry.ts +0 -144
  666. package/src/tools/filesystem/view-image.ts +0 -244
  667. package/src/tools/reminder/reminder-store.ts +0 -194
  668. package/src/tools/reminder/reminder.ts +0 -158
  669. package/src/tools/system/navigate-settings.ts +0 -74
  670. package/src/tools/system/open-system-settings.ts +0 -85
  671. package/src/tools/system/version.ts +0 -54
  672. package/src/twitter/platform-proxy-client.ts +0 -408
  673. /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
  674. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
  675. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
  676. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
  677. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
  678. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
  679. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
  680. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
  681. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
@@ -1,961 +0,0 @@
1
- import { v4 as uuid } from "uuid";
2
-
3
- import {
4
- createAssistantMessage,
5
- createUserMessage,
6
- } from "../../agent/message-types.js";
7
- import {
8
- type ChannelId,
9
- type InterfaceId,
10
- parseChannelId,
11
- parseInterfaceId,
12
- } from "../../channels/types.js";
13
- import { getConfig } from "../../config/loader.js";
14
- import {
15
- listCanonicalGuardianRequests,
16
- listPendingCanonicalGuardianRequestsByDestinationConversation,
17
- } from "../../memory/canonical-guardian-store.js";
18
- import { addMessage } from "../../memory/conversation-crud.js";
19
- import { DAEMON_INTERNAL_ASSISTANT_ID } from "../../runtime/assistant-scope.js";
20
- import { routeGuardianReply } from "../../runtime/guardian-reply-router.js";
21
- import {
22
- resolveLocalIpcAuthContext,
23
- resolveLocalIpcTrustContext,
24
- } from "../../runtime/local-actor-identity.js";
25
- import * as pendingInteractions from "../../runtime/pending-interactions.js";
26
- import { checkIngressForSecrets } from "../../security/secret-ingress.js";
27
- import {
28
- compileCustomPatterns,
29
- redactSecrets,
30
- } from "../../security/secret-scanner.js";
31
- import { createApprovalConversationGenerator } from "../approval-generators.js";
32
- import { getAssistantName } from "../identity-helpers.js";
33
- import type {
34
- ServerMessage,
35
- UserMessage,
36
- UserMessageAttachment,
37
- } from "../message-protocol.js";
38
- import { executeRecordingIntent } from "../recording-executor.js";
39
- import { resolveRecordingIntent } from "../recording-intent.js";
40
- import {
41
- classifyRecordingIntentFallback,
42
- containsRecordingKeywords,
43
- } from "../recording-intent-fallback.js";
44
- import type { Session } from "../session.js";
45
- import {
46
- buildSessionErrorMessage,
47
- classifySessionError,
48
- } from "../session-error.js";
49
- import { resolveChannelCapabilities } from "../session-runtime-assembly.js";
50
- import {
51
- handleRecordingPause,
52
- handleRecordingRestart,
53
- handleRecordingResume,
54
- handleRecordingStart,
55
- handleRecordingStop,
56
- } from "./recording.js";
57
- import {
58
- makeIpcEventSender,
59
- syncCanonicalStatusFromIpcConfirmationDecision,
60
- } from "./sessions.js";
61
- import { type HandlerContext, log, wireEscalationHandler } from "./shared.js";
62
-
63
- const desktopApprovalConversationGenerator =
64
- createApprovalConversationGenerator();
65
-
66
- // ── Recording command persistence helper ─────────────────────────────
67
- // Several recording command actions share identical logic: send a response
68
- // delta + complete, persist user/assistant messages, and sync in-memory
69
- // session history. This helper consolidates that pattern.
70
- async function persistRecordingExchange(
71
- sessionId: string,
72
- messageText: string,
73
- responseText: string,
74
- session: Session,
75
- ctx: HandlerContext,
76
- ): Promise<void> {
77
- ctx.send({
78
- type: "assistant_text_delta",
79
- text: responseText,
80
- sessionId,
81
- });
82
- ctx.send({
83
- type: "message_complete",
84
- sessionId,
85
- });
86
- await addMessage(
87
- sessionId,
88
- "user",
89
- JSON.stringify([{ type: "text", text: messageText }]),
90
- );
91
- await addMessage(
92
- sessionId,
93
- "assistant",
94
- JSON.stringify([{ type: "text", text: responseText }]),
95
- );
96
- if (!session.isProcessing()) {
97
- session.messages.push({
98
- role: "user",
99
- content: [{ type: "text", text: messageText }],
100
- });
101
- session.messages.push({
102
- role: "assistant",
103
- content: [{ type: "text", text: responseText }],
104
- });
105
- }
106
- }
107
-
108
- // ── Secret ingress check and redirect ────────────────────────────────
109
- // Returns true if the message was blocked (caller should return early).
110
- function handleSecretIngress(
111
- msg: UserMessage,
112
- messageText: string,
113
- ctx: HandlerContext,
114
- session: Session,
115
- rlog: typeof log,
116
- dispatchUserMessage: DispatchUserMessageFn,
117
- ): boolean {
118
- if (msg.bypassSecretCheck) return false;
119
-
120
- const ingressCheck = checkIngressForSecrets(messageText);
121
- if (!ingressCheck.blocked) return false;
122
-
123
- rlog.warn(
124
- { detectedTypes: ingressCheck.detectedTypes },
125
- "Blocked user message containing secrets",
126
- );
127
- ctx.send({
128
- type: "error",
129
- message: ingressCheck.userNotice!,
130
- category: "secret_blocked",
131
- });
132
-
133
- const config = getConfig();
134
- const compiledCustom = config.secretDetection.customPatterns?.length
135
- ? compileCustomPatterns(config.secretDetection.customPatterns)
136
- : undefined;
137
- const redactedMessageText = redactSecrets(
138
- messageText,
139
- {
140
- enabled: true,
141
- base64Threshold: config.secretDetection.entropyThreshold,
142
- },
143
- compiledCustom,
144
- ).trim();
145
-
146
- session.redirectToSecurePrompt(ingressCheck.detectedTypes, {
147
- onStored: (record) => {
148
- ctx.send({
149
- type: "assistant_text_delta",
150
- sessionId: msg.sessionId,
151
- text: "Saved your secret securely. Continuing with your request.",
152
- });
153
- ctx.send({
154
- type: "message_complete",
155
- sessionId: msg.sessionId,
156
- });
157
-
158
- const continuationParts: string[] = [];
159
- if (redactedMessageText.length > 0)
160
- continuationParts.push(redactedMessageText);
161
- continuationParts.push(
162
- `I entered the redacted secret via the Secure Credential UI and saved it as credential ${record.service}/${record.field}. ` +
163
- "Continue with my request using that stored credential and do not ask me to paste the secret again.",
164
- );
165
- const continuationMessage = continuationParts.join("\n\n");
166
- const continuationRequestId = uuid();
167
- dispatchUserMessage(
168
- continuationMessage,
169
- msg.attachments ?? [],
170
- continuationRequestId,
171
- "secure_redirect_resume",
172
- msg.activeSurfaceId,
173
- msg.currentPage,
174
- );
175
- },
176
- });
177
-
178
- return true;
179
- }
180
-
181
- // ── Structured recording command intent ──────────────────────────────
182
- // Returns true if the command was fully handled (caller should return early).
183
- async function handleStructuredRecordingIntent(
184
- msg: UserMessage,
185
- messageText: string,
186
- session: Session,
187
- ctx: HandlerContext,
188
- rlog: typeof log,
189
- ): Promise<boolean> {
190
- const config = getConfig();
191
- if (
192
- !config.daemon.standaloneRecording ||
193
- msg.commandIntent?.domain !== "screen_recording"
194
- ) {
195
- return false;
196
- }
197
-
198
- const action = msg.commandIntent.action;
199
- rlog.info(
200
- { action, source: "commandIntent" },
201
- "Recording command intent received in user_message",
202
- );
203
-
204
- if (action === "start") {
205
- const recordingId = handleRecordingStart(
206
- msg.sessionId,
207
- { promptForSource: true },
208
- ctx,
209
- );
210
- const responseText = recordingId
211
- ? "Starting screen recording."
212
- : "A recording is already active.";
213
- await persistRecordingExchange(
214
- msg.sessionId,
215
- messageText,
216
- responseText,
217
- session,
218
- ctx,
219
- );
220
- return true;
221
- } else if (action === "stop") {
222
- const stopped = handleRecordingStop(msg.sessionId, ctx) !== undefined;
223
- const responseText = stopped
224
- ? "Stopping the recording."
225
- : "No active recording to stop.";
226
- await persistRecordingExchange(
227
- msg.sessionId,
228
- messageText,
229
- responseText,
230
- session,
231
- ctx,
232
- );
233
- return true;
234
- } else if (action === "restart") {
235
- const restartResult = handleRecordingRestart(msg.sessionId, ctx);
236
- await persistRecordingExchange(
237
- msg.sessionId,
238
- messageText,
239
- restartResult.responseText,
240
- session,
241
- ctx,
242
- );
243
- return true;
244
- } else if (action === "pause") {
245
- const paused = handleRecordingPause(msg.sessionId, ctx) !== undefined;
246
- const responseText = paused
247
- ? "Pausing the recording."
248
- : "No active recording to pause.";
249
- await persistRecordingExchange(
250
- msg.sessionId,
251
- messageText,
252
- responseText,
253
- session,
254
- ctx,
255
- );
256
- return true;
257
- } else if (action === "resume") {
258
- const resumed = handleRecordingResume(msg.sessionId, ctx) !== undefined;
259
- const responseText = resumed
260
- ? "Resuming the recording."
261
- : "No active recording to resume.";
262
- await persistRecordingExchange(
263
- msg.sessionId,
264
- messageText,
265
- responseText,
266
- session,
267
- ctx,
268
- );
269
- return true;
270
- }
271
-
272
- // Unrecognized action — fall through to normal text handling
273
- rlog.warn(
274
- { action, source: "commandIntent" },
275
- "Unrecognized screen_recording action, falling through to text handling",
276
- );
277
- return false;
278
- }
279
-
280
- // ── Standalone recording intent interception ─────────────────────────
281
- // Returns the original content before strip (if recording keywords were
282
- // stripped from the message), or undefined if the message was fully handled
283
- // or no recording intent was detected.
284
- async function handleStandaloneRecordingIntent(
285
- msg: UserMessage,
286
- messageText: string,
287
- session: Session,
288
- ctx: HandlerContext,
289
- rlog: typeof log,
290
- ): Promise<{
291
- handled: boolean;
292
- originalContentBeforeStrip?: string;
293
- updatedMessageText: string;
294
- }> {
295
- const config = getConfig();
296
- if (!config.daemon.standaloneRecording || !messageText) {
297
- return { handled: false, updatedMessageText: messageText };
298
- }
299
-
300
- const name = getAssistantName();
301
- const dynamicNames = [name].filter(Boolean) as string[];
302
- const intentResult = resolveRecordingIntent(messageText, dynamicNames);
303
-
304
- // Pure recording-only intents
305
- if (
306
- intentResult.kind === "start_only" ||
307
- intentResult.kind === "stop_only" ||
308
- intentResult.kind === "start_and_stop_only" ||
309
- intentResult.kind === "restart_only" ||
310
- intentResult.kind === "pause_only" ||
311
- intentResult.kind === "resume_only"
312
- ) {
313
- const execResult = executeRecordingIntent(intentResult, {
314
- conversationId: msg.sessionId,
315
- ctx,
316
- });
317
-
318
- if (execResult.handled) {
319
- rlog.info(
320
- { kind: intentResult.kind },
321
- "Recording intent intercepted in user_message",
322
- );
323
- await persistRecordingExchange(
324
- msg.sessionId,
325
- messageText,
326
- execResult.responseText!,
327
- session,
328
- ctx,
329
- );
330
- return { handled: true, updatedMessageText: messageText };
331
- }
332
- }
333
-
334
- // Recording intent with remainder text
335
- if (
336
- intentResult.kind === "start_with_remainder" ||
337
- intentResult.kind === "stop_with_remainder" ||
338
- intentResult.kind === "start_and_stop_with_remainder" ||
339
- intentResult.kind === "restart_with_remainder"
340
- ) {
341
- const execResult = executeRecordingIntent(intentResult, {
342
- conversationId: msg.sessionId,
343
- ctx,
344
- });
345
-
346
- const originalContentBeforeStrip = messageText;
347
- const updatedText = execResult.remainderText ?? messageText;
348
- msg.content = updatedText;
349
-
350
- if (intentResult.kind === "stop_with_remainder") {
351
- handleRecordingStop(msg.sessionId, ctx);
352
- }
353
- if (intentResult.kind === "start_with_remainder") {
354
- handleRecordingStart(
355
- msg.sessionId,
356
- { promptForSource: true },
357
- ctx,
358
- );
359
- }
360
- if (
361
- intentResult.kind === "restart_with_remainder" ||
362
- intentResult.kind === "start_and_stop_with_remainder"
363
- ) {
364
- const restartResult = handleRecordingRestart(msg.sessionId, ctx);
365
- if (
366
- !restartResult.initiated &&
367
- restartResult.reason === "no_active_recording" &&
368
- intentResult.kind === "start_and_stop_with_remainder"
369
- ) {
370
- handleRecordingStart(
371
- msg.sessionId,
372
- { promptForSource: true },
373
- ctx,
374
- );
375
- }
376
- }
377
-
378
- rlog.info(
379
- { remaining: updatedText, kind: intentResult.kind },
380
- "Recording intent with remainder — continuing with remaining text",
381
- );
382
-
383
- return {
384
- handled: false,
385
- originalContentBeforeStrip,
386
- updatedMessageText: updatedText,
387
- };
388
- }
389
-
390
- // 'none' — deterministic resolver found nothing; try LLM fallback
391
- // if the text contains recording-related keywords.
392
- if (intentResult.kind === "none" && containsRecordingKeywords(messageText)) {
393
- const fallback = await classifyRecordingIntentFallback(messageText);
394
- rlog.info(
395
- {
396
- fallbackAction: fallback.action,
397
- fallbackConfidence: fallback.confidence,
398
- },
399
- "Recording intent LLM fallback result",
400
- );
401
-
402
- if (fallback.action !== "none" && fallback.confidence === "high") {
403
- const kindMap: Record<
404
- string,
405
- import("../recording-intent.js").RecordingIntentResult
406
- > = {
407
- start: { kind: "start_only" },
408
- stop: { kind: "stop_only" },
409
- restart: { kind: "restart_only" },
410
- pause: { kind: "pause_only" },
411
- resume: { kind: "resume_only" },
412
- };
413
- const mapped = kindMap[fallback.action];
414
- if (mapped) {
415
- const execResult = executeRecordingIntent(mapped, {
416
- conversationId: msg.sessionId,
417
- ctx,
418
- });
419
-
420
- if (execResult.handled) {
421
- rlog.info(
422
- { kind: mapped.kind, source: "llm_fallback" },
423
- "Recording intent intercepted via LLM fallback",
424
- );
425
- await persistRecordingExchange(
426
- msg.sessionId,
427
- messageText,
428
- execResult.responseText!,
429
- session,
430
- ctx,
431
- );
432
- return { handled: true, updatedMessageText: messageText };
433
- }
434
- }
435
- }
436
- }
437
-
438
- return { handled: false, updatedMessageText: messageText };
439
- }
440
-
441
- // ── Pending confirmation reply interception ──────────────────────────
442
- // Returns true if the message was consumed as an inline approval reply.
443
- async function handlePendingConfirmationReply(
444
- msg: UserMessage,
445
- messageText: string,
446
- requestId: string,
447
- session: Session,
448
- ipcChannel: ChannelId,
449
- ipcInterface: InterfaceId,
450
- ctx: HandlerContext,
451
- rlog: typeof log,
452
- ): Promise<boolean> {
453
- if (!session.hasAnyPendingConfirmation() || messageText.trim().length === 0) {
454
- return false;
455
- }
456
-
457
- try {
458
- const pendingInteractionRequestIdsForConversation = pendingInteractions
459
- .getByConversation(msg.sessionId)
460
- .filter(
461
- (interaction) =>
462
- interaction.kind === "confirmation" &&
463
- interaction.session === session &&
464
- session.hasPendingConfirmation(interaction.requestId),
465
- )
466
- .map((interaction) => interaction.requestId);
467
-
468
- const pendingCanonicalRequestIdsForConversation = [
469
- ...listPendingCanonicalGuardianRequestsByDestinationConversation(
470
- msg.sessionId,
471
- ipcChannel,
472
- )
473
- .filter((request) => request.kind === "tool_approval")
474
- .map((request) => request.id),
475
- ...listCanonicalGuardianRequests({
476
- status: "pending",
477
- conversationId: msg.sessionId,
478
- kind: "tool_approval",
479
- }).map((request) => request.id),
480
- ].filter((pendingRequestId) =>
481
- session.hasPendingConfirmation(pendingRequestId),
482
- );
483
-
484
- const pendingRequestIdsForConversation = Array.from(
485
- new Set([
486
- ...pendingInteractionRequestIdsForConversation,
487
- ...pendingCanonicalRequestIdsForConversation,
488
- ]),
489
- );
490
-
491
- if (pendingRequestIdsForConversation.length === 0) {
492
- return false;
493
- }
494
-
495
- const localCtx = resolveLocalIpcTrustContext(ipcChannel);
496
- const routerResult = await routeGuardianReply({
497
- messageText: messageText.trim(),
498
- channel: ipcChannel,
499
- actor: {
500
- actorPrincipalId: localCtx.guardianPrincipalId ?? undefined,
501
- actorExternalUserId: localCtx.guardianExternalUserId,
502
- channel: ipcChannel,
503
- guardianPrincipalId: localCtx.guardianPrincipalId ?? undefined,
504
- },
505
- conversationId: msg.sessionId,
506
- pendingRequestIds: pendingRequestIdsForConversation,
507
- approvalConversationGenerator: desktopApprovalConversationGenerator,
508
- emissionContext: {
509
- source: "inline_nl",
510
- causedByRequestId: requestId,
511
- decisionText: messageText.trim(),
512
- },
513
- });
514
-
515
- if (routerResult.consumed && routerResult.type !== "nl_keep_pending") {
516
- if (routerResult.requestId && !routerResult.decisionApplied) {
517
- session.emitConfirmationStateChanged({
518
- sessionId: msg.sessionId,
519
- requestId: routerResult.requestId,
520
- state: "resolved_stale",
521
- source: "inline_nl",
522
- causedByRequestId: requestId,
523
- decisionText: messageText.trim(),
524
- });
525
- // Notify agent loop so the outcome is persisted on the tool_use block
526
- session.onConfirmationOutcome?.(
527
- routerResult.requestId,
528
- "resolved_stale",
529
- );
530
- }
531
-
532
- const consumedChannelMeta = {
533
- userMessageChannel: ipcChannel,
534
- assistantMessageChannel: ipcChannel,
535
- userMessageInterface: ipcInterface,
536
- assistantMessageInterface: ipcInterface,
537
- provenanceTrustClass: "guardian" as const,
538
- };
539
-
540
- const consumedUserMessage = createUserMessage(
541
- messageText,
542
- msg.attachments ?? [],
543
- );
544
- await addMessage(
545
- msg.sessionId,
546
- "user",
547
- JSON.stringify(consumedUserMessage.content),
548
- consumedChannelMeta,
549
- );
550
-
551
- const replyText =
552
- routerResult.replyText?.trim() ||
553
- (routerResult.decisionApplied
554
- ? "Decision applied."
555
- : "Request already resolved.");
556
- const consumedAssistantMessage = createAssistantMessage(replyText);
557
- await addMessage(
558
- msg.sessionId,
559
- "assistant",
560
- JSON.stringify(consumedAssistantMessage.content),
561
- consumedChannelMeta,
562
- );
563
- if (!session.isProcessing()) {
564
- session.messages.push(consumedUserMessage, consumedAssistantMessage);
565
- }
566
-
567
- ctx.send({
568
- type: "message_queued",
569
- sessionId: msg.sessionId,
570
- requestId,
571
- position: 0,
572
- });
573
- ctx.send({
574
- type: "message_dequeued",
575
- sessionId: msg.sessionId,
576
- requestId,
577
- });
578
-
579
- if (!session.isProcessing()) {
580
- ctx.send({
581
- type: "assistant_text_delta",
582
- text: replyText,
583
- sessionId: msg.sessionId,
584
- });
585
- }
586
- ctx.send({
587
- type: "message_request_complete",
588
- sessionId: msg.sessionId,
589
- requestId,
590
- runStillActive: session.isProcessing(),
591
- });
592
-
593
- rlog.info(
594
- {
595
- routerType: routerResult.type,
596
- decisionApplied: routerResult.decisionApplied,
597
- routerRequestId: routerResult.requestId,
598
- },
599
- "Consumed pending-confirmation reply before auto-deny",
600
- );
601
- return true;
602
- }
603
- } catch (err) {
604
- rlog.warn(
605
- { err },
606
- "Failed to process pending-confirmation reply; falling back to auto-deny behavior",
607
- );
608
- }
609
-
610
- return false;
611
- }
612
-
613
- // ── Auto-deny pending confirmations ──────────────────────────────────
614
- function autoDenyPendingConfirmations(
615
- msg: UserMessage,
616
- requestId: string,
617
- session: Session,
618
- rlog: typeof log,
619
- ): void {
620
- if (!session.hasAnyPendingConfirmation()) return;
621
-
622
- rlog.info("Auto-denying pending confirmation(s) due to new user message");
623
- for (const interaction of pendingInteractions.getByConversation(
624
- msg.sessionId,
625
- )) {
626
- if (
627
- interaction.session === session &&
628
- interaction.kind === "confirmation"
629
- ) {
630
- session.emitConfirmationStateChanged({
631
- sessionId: msg.sessionId,
632
- requestId: interaction.requestId,
633
- state: "denied",
634
- source: "auto_deny",
635
- causedByRequestId: requestId,
636
- });
637
- // Notify agent loop so the outcome is persisted on the tool_use block
638
- session.onConfirmationOutcome?.(interaction.requestId, "denied");
639
- }
640
- }
641
- session.denyAllPendingConfirmations();
642
- for (const interaction of pendingInteractions.getByConversation(
643
- msg.sessionId,
644
- )) {
645
- if (
646
- interaction.session === session &&
647
- interaction.kind === "confirmation"
648
- ) {
649
- syncCanonicalStatusFromIpcConfirmationDecision(
650
- interaction.requestId,
651
- "deny",
652
- );
653
- pendingInteractions.resolve(interaction.requestId);
654
- }
655
- }
656
- }
657
-
658
- // ── Dispatch user message function type ──────────────────────────────
659
- type DispatchUserMessageFn = (
660
- content: string,
661
- attachments: UserMessageAttachment[],
662
- dispatchRequestId: string,
663
- source: "user_message" | "secure_redirect_resume",
664
- activeSurfaceId?: string,
665
- currentPage?: string,
666
- displayContent?: string,
667
- ) => void;
668
-
669
- // ── Build dispatch function ──────────────────────────────────────────
670
- // Creates the dispatchUserMessage closure used to enqueue or immediately
671
- // process a user message through the session.
672
- function buildDispatchUserMessage(params: {
673
- msg: UserMessage;
674
- session: Session;
675
- sendEvent: (event: ServerMessage) => void;
676
- ipcChannel: ChannelId;
677
- ipcInterface: InterfaceId;
678
- ctx: HandlerContext;
679
- rlog: typeof log;
680
- }): DispatchUserMessageFn {
681
- const {
682
- msg,
683
- session,
684
- sendEvent,
685
- ipcChannel,
686
- ipcInterface,
687
- ctx,
688
- rlog,
689
- } = params;
690
-
691
- const queuedChannelMetadata = {
692
- userMessageChannel: ipcChannel,
693
- assistantMessageChannel: ipcChannel,
694
- userMessageInterface: ipcInterface,
695
- assistantMessageInterface: ipcInterface,
696
- };
697
-
698
- return (
699
- content: string,
700
- attachments: UserMessageAttachment[],
701
- dispatchRequestId: string,
702
- source: "user_message" | "secure_redirect_resume",
703
- activeSurfaceId?: string,
704
- currentPage?: string,
705
- displayContent?: string,
706
- ): void => {
707
- const receivedDescription =
708
- source === "user_message"
709
- ? "User message received"
710
- : "Resuming message after secure credential save";
711
- const queuedDescription =
712
- source === "user_message"
713
- ? "Message queued (session busy)"
714
- : "Resumed message queued (session busy)";
715
-
716
- session.traceEmitter.emit("request_received", receivedDescription, {
717
- requestId: dispatchRequestId,
718
- status: "info",
719
- attributes: { source },
720
- });
721
-
722
- const result = session.enqueueMessage(
723
- content,
724
- attachments,
725
- sendEvent,
726
- dispatchRequestId,
727
- activeSurfaceId,
728
- currentPage,
729
- queuedChannelMetadata,
730
- undefined,
731
- displayContent,
732
- );
733
- if (result.rejected) {
734
- rlog.warn({ source }, "Message rejected — queue is full");
735
- session.traceEmitter.emit(
736
- "request_error",
737
- "Message rejected — queue is full",
738
- {
739
- requestId: dispatchRequestId,
740
- status: "error",
741
- attributes: {
742
- reason: "queue_full",
743
- queueDepth: session.getQueueDepth(),
744
- source,
745
- },
746
- },
747
- );
748
- ctx.send(
749
- buildSessionErrorMessage(msg.sessionId, {
750
- code: "QUEUE_FULL",
751
- userMessage:
752
- "Message queue is full (max depth: 10). Please wait for current messages to be processed.",
753
- retryable: true,
754
- debugDetails: "Message rejected — session queue is full",
755
- }),
756
- );
757
- return;
758
- }
759
- if (result.queued) {
760
- const position = session.getQueueDepth();
761
- rlog.info({ source, position }, queuedDescription);
762
- session.traceEmitter.emit(
763
- "request_queued",
764
- `Message queued at position ${position}`,
765
- {
766
- requestId: dispatchRequestId,
767
- status: "info",
768
- attributes: { position, source },
769
- },
770
- );
771
- ctx.send({
772
- type: "message_queued",
773
- sessionId: msg.sessionId,
774
- requestId: dispatchRequestId,
775
- position,
776
- });
777
- return;
778
- }
779
-
780
- rlog.info({ source }, "Processing user message");
781
- session.emitActivityState(
782
- "thinking",
783
- "message_dequeued",
784
- "assistant_turn",
785
- dispatchRequestId,
786
- );
787
- session.setTurnChannelContext({
788
- userMessageChannel: ipcChannel,
789
- assistantMessageChannel: ipcChannel,
790
- });
791
- session.setTurnInterfaceContext({
792
- userMessageInterface: ipcInterface,
793
- assistantMessageInterface: ipcInterface,
794
- });
795
- session.setAssistantId(DAEMON_INTERNAL_ASSISTANT_ID);
796
- session.setTrustContext(resolveLocalIpcTrustContext(ipcChannel));
797
- session.setAuthContext(resolveLocalIpcAuthContext(msg.sessionId));
798
- session.setCommandIntent(null);
799
- session
800
- .processMessage(
801
- content,
802
- attachments,
803
- sendEvent,
804
- dispatchRequestId,
805
- activeSurfaceId,
806
- currentPage,
807
- undefined,
808
- displayContent,
809
- )
810
- .catch((err) => {
811
- const message = err instanceof Error ? err.message : String(err);
812
- rlog.error(
813
- { err, source },
814
- "Error processing user message (session or provider failure)",
815
- );
816
- ctx.send({
817
- type: "error",
818
- message: `Failed to process message: ${message}`,
819
- });
820
- const classified = classifySessionError(err, { phase: "agent_loop" });
821
- ctx.send( buildSessionErrorMessage(msg.sessionId, classified));
822
- });
823
- };
824
- }
825
-
826
- export async function handleUserMessage(
827
- msg: UserMessage,
828
- ctx: HandlerContext,
829
- ): Promise<void> {
830
- const requestId = uuid();
831
- const rlog = log.child({ sessionId: msg.sessionId, requestId });
832
- try {
833
- const session = await ctx.getOrCreateSession(msg.sessionId);
834
- // Only wire the escalation handler if one isn't already set — handleTaskSubmit
835
- // sets a handler with the client's actual screen dimensions, and overwriting it
836
- // here would replace those dimensions with the daemon's defaults.
837
- if (!session.hasEscalationHandler()) {
838
- wireEscalationHandler(session, ctx);
839
- }
840
-
841
- const ipcChannel = parseChannelId(msg.channel) ?? "vellum";
842
- const sendEvent = makeIpcEventSender({
843
- ctx,
844
- session,
845
- conversationId: msg.sessionId,
846
- sourceChannel: ipcChannel,
847
- });
848
- // Route prompter-originated events (confirmation_request/secret_request)
849
- // through the IPC wrapper so pending-interactions + canonical tracking
850
- // are updated before the message is sent to the client.
851
- session.updateClient(sendEvent, false);
852
- const ipcInterface = parseInterfaceId(msg.interface);
853
- if (!ipcInterface) {
854
- ctx.send({
855
- type: "error",
856
- message:
857
- "Invalid user_message: interface is required and must be valid",
858
- });
859
- return;
860
- }
861
-
862
- // Update channel capabilities eagerly so both immediate and queued paths
863
- // reflect the latest PTT / microphone state from the client.
864
- session.setChannelCapabilities(
865
- resolveChannelCapabilities(ipcChannel, ipcInterface, {
866
- pttActivationKey: msg.pttActivationKey,
867
- microphonePermissionGranted: msg.microphonePermissionGranted,
868
- }),
869
- );
870
-
871
- const dispatchUserMessage = buildDispatchUserMessage({
872
- msg,
873
- session,
874
- sendEvent,
875
- ipcChannel,
876
- ipcInterface,
877
- ctx,
878
- rlog,
879
- });
880
-
881
- let messageText = msg.content ?? "";
882
-
883
- // Block inbound messages that contain secrets and redirect to secure prompt
884
- if (
885
- handleSecretIngress(
886
- msg,
887
- messageText,
888
- ctx,
889
- session,
890
- rlog,
891
- dispatchUserMessage,
892
- )
893
- ) {
894
- return;
895
- }
896
-
897
- // ── Structured command intent (bypasses text parsing) ──────────────────
898
- if (
899
- await handleStructuredRecordingIntent(
900
- msg,
901
- messageText,
902
- session,
903
- ctx,
904
- rlog,
905
- )
906
- ) {
907
- return;
908
- }
909
-
910
- // ── Standalone recording intent interception ──────────────────────────
911
- const recordingResult = await handleStandaloneRecordingIntent(
912
- msg,
913
- messageText,
914
- session,
915
- ctx,
916
- rlog,
917
- );
918
- if (recordingResult.handled) return;
919
- messageText = recordingResult.updatedMessageText;
920
- const originalContentBeforeStrip =
921
- recordingResult.originalContentBeforeStrip;
922
-
923
- // ── Pending confirmation reply interception ───────────────────────────
924
- if (
925
- await handlePendingConfirmationReply(
926
- msg,
927
- messageText,
928
- requestId,
929
- session,
930
- ipcChannel,
931
- ipcInterface,
932
- ctx,
933
- rlog,
934
- )
935
- ) {
936
- return;
937
- }
938
-
939
- // ── Auto-deny pending confirmations ───────────────────────────────────
940
- autoDenyPendingConfirmations(msg, requestId, session, rlog);
941
-
942
- dispatchUserMessage(
943
- messageText,
944
- msg.attachments ?? [],
945
- requestId,
946
- "user_message",
947
- msg.activeSurfaceId,
948
- msg.currentPage,
949
- originalContentBeforeStrip,
950
- );
951
- } catch (err) {
952
- const message = err instanceof Error ? err.message : String(err);
953
- rlog.error({ err }, "Error setting up user message processing");
954
- ctx.send( {
955
- type: "error",
956
- message: `Failed to process message: ${message}`,
957
- });
958
- const classified = classifySessionError(err, { phase: "handler" });
959
- ctx.send( buildSessionErrorMessage(msg.sessionId, classified));
960
- }
961
- }