@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
@@ -14,15 +14,33 @@ import {
14
14
  parseChannelId,
15
15
  parseInterfaceId,
16
16
  } from "../../channels/types.js";
17
+ import { getConfig } from "../../config/loader.js";
17
18
  import { renderHistoryContent } from "../../daemon/handlers/shared.js";
19
+ import { HostBashProxy } from "../../daemon/host-bash-proxy.js";
20
+ import { HostFileProxy } from "../../daemon/host-file-proxy.js";
18
21
  import type { ServerMessage } from "../../daemon/message-protocol.js";
22
+ import {
23
+ buildModelInfoEvent,
24
+ isModelSlashCommand,
25
+ } from "../../daemon/session-process.js";
26
+ import {
27
+ isProviderShortcut,
28
+ resolveSlash,
29
+ type SlashContext,
30
+ } from "../../daemon/session-slash.js";
19
31
  import * as attachmentsStore from "../../memory/attachments-store.js";
20
32
  import {
21
33
  createCanonicalGuardianRequest,
22
34
  generateCanonicalRequestCode,
23
35
  listPendingRequestsByConversationScope,
24
36
  } from "../../memory/canonical-guardian-store.js";
25
- import { addMessage, getMessages } from "../../memory/conversation-crud.js";
37
+ import {
38
+ addMessage,
39
+ getMessages,
40
+ provenanceFromTrustContext,
41
+ setConversationOriginChannelIfUnset,
42
+ setConversationOriginInterfaceIfUnset,
43
+ } from "../../memory/conversation-crud.js";
26
44
  import {
27
45
  getConversationByKey,
28
46
  getOrCreateConversation,
@@ -30,6 +48,7 @@ import {
30
48
  import { searchConversations } from "../../memory/conversation-queries.js";
31
49
  import { getConfiguredProvider } from "../../providers/provider-send-message.js";
32
50
  import type { Provider } from "../../providers/types.js";
51
+ import { checkIngressForSecrets } from "../../security/secret-ingress.js";
33
52
  import { getLogger } from "../../util/logger.js";
34
53
  import { buildAssistantEvent } from "../assistant-event.js";
35
54
  import { DAEMON_INTERNAL_ASSISTANT_ID } from "../assistant-scope.js";
@@ -344,9 +363,10 @@ export function handleListMessages(
344
363
  * Build an `onEvent` callback that publishes every outbound event to the
345
364
  * assistant event hub, maintaining ordered delivery through a serial chain.
346
365
  *
347
- * Also registers pending interactions when confirmation_request or
348
- * secret_request events flow through, so standalone approval endpoints
349
- * can look up the session by requestId.
366
+ * Also registers pending interactions when confirmation_request,
367
+ * secret_request, host_bash_request, or host_file_request events flow
368
+ * through, so standalone approval/result endpoints can look up the session
369
+ * by requestId.
350
370
  */
351
371
  function makeHubPublisher(
352
372
  deps: SendMessageDeps,
@@ -373,7 +393,7 @@ function makeHubPublisher(
373
393
  },
374
394
  });
375
395
 
376
- // Create a canonical guardian request so IPC/HTTP handlers can find it
396
+ // Create a canonical guardian request so HTTP handlers can find it
377
397
  // via applyCanonicalGuardianDecision.
378
398
  try {
379
399
  const trustContext = session.trustContext;
@@ -417,6 +437,18 @@ function makeHubPublisher(
417
437
  conversationId,
418
438
  kind: "secret",
419
439
  });
440
+ } else if (msg.type === "host_bash_request") {
441
+ pendingInteractions.register(msg.requestId, {
442
+ session,
443
+ conversationId,
444
+ kind: "host_bash",
445
+ });
446
+ } else if (msg.type === "host_file_request") {
447
+ pendingInteractions.register(msg.requestId, {
448
+ session,
449
+ conversationId,
450
+ kind: "host_file",
451
+ });
420
452
  }
421
453
 
422
454
  // ServerMessage is a large union; sessionId exists on most but not all variants.
@@ -526,6 +558,29 @@ export async function handleSendMessage(
526
558
  }
527
559
  }
528
560
 
561
+ // Block inbound messages containing secrets before they reach the model.
562
+ // This mirrors the legacy handleUserMessage behavior: secrets are
563
+ // detected and the message is rejected with a safe notice. The client
564
+ // should prompt the user to use the secure credential flow instead.
565
+ if (trimmedContent.length > 0) {
566
+ const ingressCheck = checkIngressForSecrets(trimmedContent);
567
+ if (ingressCheck.blocked) {
568
+ log.warn(
569
+ { detectedTypes: ingressCheck.detectedTypes },
570
+ "Blocked user message containing secrets (POST /v1/messages)",
571
+ );
572
+ return Response.json(
573
+ {
574
+ accepted: false,
575
+ error: "secret_blocked",
576
+ message: ingressCheck.userNotice,
577
+ detectedTypes: ingressCheck.detectedTypes,
578
+ },
579
+ { status: 422 },
580
+ );
581
+ }
582
+ }
583
+
529
584
  if (!deps.sendMessageDeps) {
530
585
  return httpError(
531
586
  "SERVICE_UNAVAILABLE",
@@ -557,11 +612,49 @@ export async function handleSendMessage(
557
612
  }
558
613
 
559
614
  const onEvent = makeHubPublisher(smDeps, mapping.conversationId, session);
560
- // Wire sendToClient to the SSE hub so all subsystems (prompter, surface
561
- // resolver, notifiers, trace emitter) can reach the HTTP client. The
562
- // IPC socket removal (PR #14431) left sendToClient as a no-op; this
563
- // restores the delivery path using the SSE hub instead.
564
- session.updateClient(onEvent, true);
615
+ // Desktop, CLI, and web interfaces have an SSE client that can display
616
+ // permission prompts. Channel interfaces (telegram, slack, etc.) route
617
+ // approvals through the guardian system and have no interactive prompter UI.
618
+ const isInteractiveInterface =
619
+ sourceInterface === "macos" ||
620
+ sourceInterface === "ios" ||
621
+ sourceInterface === "cli" ||
622
+ sourceInterface === "vellum";
623
+ // Only create the host bash proxy for desktop client interfaces that can
624
+ // execute commands on the user's machine. Non-desktop sessions (CLI,
625
+ // channels, headless) fall back to local execution.
626
+ // Set the proxy BEFORE updateClient so updateClient's call to
627
+ // hostBashProxy.updateSender targets the correct (new) proxy.
628
+ if (sourceInterface === "macos" || sourceInterface === "ios") {
629
+ // Reuse the existing proxy if the session is actively processing a
630
+ // host bash request to avoid orphaning in-flight requests.
631
+ if (!session.isProcessing() || !session.hostBashProxy) {
632
+ const proxy = new HostBashProxy(onEvent, (requestId) => {
633
+ pendingInteractions.resolve(requestId);
634
+ });
635
+ session.setHostBashProxy(proxy);
636
+ }
637
+ if (!session.isProcessing() || !session.hostFileProxy) {
638
+ const fileProxy = new HostFileProxy(onEvent, (requestId) => {
639
+ pendingInteractions.resolve(requestId);
640
+ });
641
+ session.setHostFileProxy(fileProxy);
642
+ }
643
+ } else if (!session.isProcessing()) {
644
+ session.setHostBashProxy(undefined);
645
+ session.setHostFileProxy(undefined);
646
+ }
647
+ // Wire sendToClient to the SSE hub so all subsystems can reach the HTTP client.
648
+ // Called after setHostBashProxy so updateSender targets the current proxy.
649
+ // When proxies are preserved during an active turn (non-desktop request while
650
+ // processing), skip updating proxy senders to avoid degrading them.
651
+ const preservingProxies =
652
+ session.isProcessing() &&
653
+ sourceInterface !== "macos" &&
654
+ sourceInterface !== "ios";
655
+ session.updateClient(onEvent, !isInteractiveInterface, {
656
+ skipProxySenderUpdate: preservingProxies,
657
+ });
565
658
 
566
659
  const attachments = hasAttachments
567
660
  ? smDeps.resolveAttachments(attachmentIds)
@@ -576,7 +669,7 @@ export async function handleSendMessage(
576
669
 
577
670
  // Try to consume the message as a canonical guardian approval/rejection reply.
578
671
  // On failure, degrade to the existing queue/auto-deny path rather than
579
- // surfacing a 500 — mirrors the IPC handler's catch-and-fallback.
672
+ // surfacing a 500 — mirrors the handler's catch-and-fallback.
580
673
  try {
581
674
  const inlineReplyResult = await tryConsumeCanonicalGuardianReply({
582
675
  conversationId: mapping.conversationId,
@@ -609,8 +702,33 @@ export async function handleSendMessage(
609
702
  }
610
703
 
611
704
  if (session.isProcessing()) {
612
- // If a tool confirmation is pending, auto-deny it so the agent
613
- // can finish the current turn and process this queued message.
705
+ // Queue the message so it's processed when the current turn completes
706
+ const requestId = crypto.randomUUID();
707
+ const enqueueResult = session.enqueueMessage(
708
+ content ?? "",
709
+ attachments,
710
+ onEvent,
711
+ requestId,
712
+ undefined, // activeSurfaceId
713
+ undefined, // currentPage
714
+ {
715
+ userMessageChannel: sourceChannel,
716
+ assistantMessageChannel: sourceChannel,
717
+ userMessageInterface: sourceInterface,
718
+ assistantMessageInterface: sourceInterface,
719
+ },
720
+ { isInteractive: isInteractiveInterface },
721
+ );
722
+ if (enqueueResult.rejected) {
723
+ return Response.json(
724
+ { accepted: false, error: "queue_full" },
725
+ { status: 429 },
726
+ );
727
+ }
728
+
729
+ // Auto-deny pending confirmations only after enqueue succeeds, so we
730
+ // don't cancel approval-gated workflows when the replacement message
731
+ // is itself rejected by the queue budget.
614
732
  if (session.hasAnyPendingConfirmation()) {
615
733
  // Emit authoritative denial state for each pending request.
616
734
  // sendToClient (wired to the SSE hub) delivers these to the client.
@@ -633,30 +751,6 @@ export async function handleSendMessage(
633
751
  pendingInteractions.removeBySession(session);
634
752
  }
635
753
 
636
- // Queue the message so it's processed when the current turn completes
637
- const requestId = crypto.randomUUID();
638
- const result = session.enqueueMessage(
639
- content ?? "",
640
- attachments,
641
- onEvent,
642
- requestId,
643
- undefined, // activeSurfaceId
644
- undefined, // currentPage
645
- {
646
- userMessageChannel: sourceChannel,
647
- assistantMessageChannel: sourceChannel,
648
- userMessageInterface: sourceInterface,
649
- assistantMessageInterface: sourceInterface,
650
- },
651
- { isInteractive: false },
652
- );
653
- if (result.rejected) {
654
- return httpError(
655
- "RATE_LIMITED",
656
- "Message queue is full. Please retry later.",
657
- 429,
658
- );
659
- }
660
754
  return Response.json({ accepted: true, queued: true }, { status: 202 });
661
755
  }
662
756
 
@@ -669,18 +763,108 @@ export async function handleSendMessage(
669
763
  userMessageInterface: sourceInterface,
670
764
  assistantMessageInterface: sourceInterface,
671
765
  });
672
- const requestId = crypto.randomUUID();
673
- const messageId = await session.persistUserMessage(
674
- content ?? "",
675
- attachments,
676
- requestId,
677
- );
766
+
767
+ await session.ensureActorScopedHistory();
768
+
769
+ // Resolve slash commands before persisting or running the agent loop.
770
+ const rawContent = content ?? "";
771
+ const config = getConfig();
772
+ const slashContext: SlashContext = {
773
+ messageCount: session.getMessages().length,
774
+ inputTokens: session.usageStats.inputTokens,
775
+ outputTokens: session.usageStats.outputTokens,
776
+ maxInputTokens: config.contextWindow.maxInputTokens,
777
+ model: config.model,
778
+ provider: config.provider,
779
+ estimatedCost: session.usageStats.estimatedCost,
780
+ };
781
+ const slashResult = resolveSlash(rawContent, slashContext);
782
+
783
+ if (slashResult.kind === "unknown") {
784
+ session.processing = true;
785
+ try {
786
+ const provenance = provenanceFromTrustContext(session.trustContext);
787
+ const channelMeta = {
788
+ ...provenance,
789
+ userMessageChannel: sourceChannel,
790
+ assistantMessageChannel: sourceChannel,
791
+ userMessageInterface: sourceInterface,
792
+ assistantMessageInterface: sourceInterface,
793
+ };
794
+ const userMsg = createUserMessage(rawContent, attachments);
795
+ const persisted = await addMessage(
796
+ mapping.conversationId,
797
+ "user",
798
+ JSON.stringify(userMsg.content),
799
+ channelMeta,
800
+ );
801
+ session.getMessages().push(userMsg);
802
+
803
+ const assistantMsg = createAssistantMessage(slashResult.message);
804
+ await addMessage(
805
+ mapping.conversationId,
806
+ "assistant",
807
+ JSON.stringify(assistantMsg.content),
808
+ channelMeta,
809
+ );
810
+ session.getMessages().push(assistantMsg);
811
+
812
+ setConversationOriginChannelIfUnset(
813
+ mapping.conversationId,
814
+ sourceChannel,
815
+ );
816
+ setConversationOriginInterfaceIfUnset(
817
+ mapping.conversationId,
818
+ sourceInterface,
819
+ );
820
+
821
+ // Emit fresh model info before the text delta so the client has
822
+ // up-to-date configuredProviders when rendering /model, /models,
823
+ // and provider shortcut commands (/gpt4, /opus, etc.).
824
+ if (isModelSlashCommand(rawContent) || isProviderShortcut(rawContent)) {
825
+ onEvent(buildModelInfoEvent());
826
+ }
827
+
828
+ onEvent({ type: "assistant_text_delta", text: slashResult.message });
829
+ onEvent({
830
+ type: "message_complete",
831
+ sessionId: mapping.conversationId,
832
+ });
833
+
834
+ return Response.json(
835
+ { accepted: true, messageId: persisted.id },
836
+ { status: 202 },
837
+ );
838
+ } finally {
839
+ session.processing = false;
840
+ session.drainQueue().catch(() => {});
841
+ }
842
+ }
843
+
844
+ const resolvedContent = slashResult.content;
845
+ if (slashResult.kind === "rewritten") {
846
+ session.setPreactivatedSkillIds([slashResult.skillId]);
847
+ }
848
+
849
+ let messageId: string;
850
+ try {
851
+ const requestId = crypto.randomUUID();
852
+ messageId = await session.persistUserMessage(
853
+ resolvedContent,
854
+ attachments,
855
+ requestId,
856
+ );
857
+ } catch (err) {
858
+ // Reset preactivated skill IDs so a stale activation doesn't leak
859
+ // into the next message if persistence fails.
860
+ session.setPreactivatedSkillIds(undefined);
861
+ throw err;
862
+ }
678
863
 
679
864
  // Fire-and-forget the agent loop; events flow to the hub via onEvent.
680
- // Mark non-interactive so conflict clarification doesn't block the turn.
681
865
  session
682
- .runAgentLoop(content ?? "", messageId, onEvent, {
683
- isInteractive: false,
866
+ .runAgentLoop(resolvedContent, messageId, onEvent, {
867
+ isInteractive: isInteractiveInterface,
684
868
  isUserMessage: true,
685
869
  })
686
870
  .catch((err) => {
@@ -1,9 +1,7 @@
1
1
  /**
2
2
  * HTTP route handlers for diagnostics export and dictation processing.
3
3
  *
4
- * Migrated from IPC handlers:
5
- * - handlers/diagnostics.ts (diagnostics_export_request)
6
- * - handlers/dictation.ts (dictation_request)
4
+ * Handles diagnostics export and dictation processing requests.
7
5
  */
8
6
 
9
7
  import { randomBytes } from "node:crypto";
@@ -53,7 +51,7 @@ import type { RouteDefinition } from "../http-router.js";
53
51
  const log = getLogger("diagnostics-routes");
54
52
 
55
53
  // ---------------------------------------------------------------------------
56
- // Diagnostics export — redaction helpers (shared with IPC handler)
54
+ // Diagnostics export — redaction helpers
57
55
  // ---------------------------------------------------------------------------
58
56
 
59
57
  const MAX_CONTENT_LENGTH = 500;
@@ -181,7 +179,12 @@ async function handleDiagnosticsExport(body: {
181
179
  try {
182
180
  const db = getDb();
183
181
 
184
- // 1. Find the anchor message
182
+ // 1. Find the anchor message.
183
+ // Try in order: specific ID → most recent assistant message → any message.
184
+ // The final fallback handles the race condition where the user clicks
185
+ // "export" before message_complete fires and the assistant message has
186
+ // been persisted — the user message and in-flight tool/usage data are
187
+ // still captured.
185
188
  let anchorMessage;
186
189
  if (anchorMessageId) {
187
190
  anchorMessage = db
@@ -194,7 +197,8 @@ async function handleDiagnosticsExport(body: {
194
197
  ),
195
198
  )
196
199
  .get();
197
- } else {
200
+ }
201
+ if (!anchorMessage) {
198
202
  anchorMessage = db
199
203
  .select()
200
204
  .from(messages)
@@ -208,30 +212,60 @@ async function handleDiagnosticsExport(body: {
208
212
  .limit(1)
209
213
  .get();
210
214
  }
211
-
212
215
  if (!anchorMessage) {
213
- return httpError("NOT_FOUND", "Anchor message not found", 404);
216
+ anchorMessage = db
217
+ .select()
218
+ .from(messages)
219
+ .where(eq(messages.conversationId, conversationId))
220
+ .orderBy(desc(messages.createdAt))
221
+ .limit(1)
222
+ .get();
214
223
  }
215
224
 
216
- // 2. Find the preceding user message
217
- const precedingUserMessage = db
218
- .select()
219
- .from(messages)
220
- .where(
221
- and(
222
- eq(messages.conversationId, conversationId),
223
- eq(messages.role, "user"),
224
- lte(messages.createdAt, anchorMessage.createdAt),
225
- ),
226
- )
227
- .orderBy(desc(messages.createdAt))
228
- .limit(1)
229
- .get();
225
+ // 2. Compute the export time range.
226
+ // When an anchor message exists, scope to the preceding user message
227
+ // through the anchor. When no messages exist at all (empty conversation
228
+ // or race condition), use the current timestamp so the export still
229
+ // captures any in-flight usage/tool data.
230
+ const now = Date.now();
231
+ let rangeEnd: number;
232
+ let rangeStart: number;
233
+ let usageRangeEnd: number;
230
234
 
231
- const rangeStart =
232
- precedingUserMessage?.createdAt ?? anchorMessage.createdAt - 2000;
233
- const rangeEnd = anchorMessage.createdAt;
234
- const usageRangeEnd = anchorMessage.createdAt + 5000;
235
+ if (anchorMessage) {
236
+ const precedingUserMessage = db
237
+ .select()
238
+ .from(messages)
239
+ .where(
240
+ and(
241
+ eq(messages.conversationId, conversationId),
242
+ eq(messages.role, "user"),
243
+ lte(messages.createdAt, anchorMessage.createdAt),
244
+ ),
245
+ )
246
+ .orderBy(desc(messages.createdAt))
247
+ .limit(1)
248
+ .get();
249
+
250
+ rangeStart =
251
+ precedingUserMessage?.createdAt ?? anchorMessage.createdAt - 2000;
252
+
253
+ // When the anchor is not an assistant message (e.g. the fallback "any
254
+ // message" path hit because the assistant reply hasn't been persisted
255
+ // yet), extend the range to the current time so in-flight tool
256
+ // invocations and usage recorded after the user message are captured.
257
+ const anchorIsAssistant = anchorMessage.role === "assistant";
258
+ rangeEnd = anchorIsAssistant ? anchorMessage.createdAt : now;
259
+ usageRangeEnd = anchorIsAssistant
260
+ ? anchorMessage.createdAt + 5000
261
+ : now + 5000;
262
+ } else {
263
+ // No messages at all — use the current time so we capture any
264
+ // in-flight LLM usage or tool invocations.
265
+ rangeStart = now - 60_000;
266
+ rangeEnd = now;
267
+ usageRangeEnd = now + 5000;
268
+ }
235
269
 
236
270
  // 3. Query all messages in the range
237
271
  const rangeMessages = db
@@ -299,7 +333,7 @@ async function handleDiagnosticsExport(body: {
299
333
  version: "1.1",
300
334
  exportedAt: new Date().toISOString(),
301
335
  conversationId,
302
- messageId: anchorMessage.id,
336
+ messageId: anchorMessage?.id ?? null,
303
337
  };
304
338
  writeFileSync(
305
339
  join(tempDir, "manifest.json"),
@@ -434,7 +468,7 @@ async function handleDiagnosticsExport(body: {
434
468
  "Diagnostics export completed via HTTP",
435
469
  );
436
470
 
437
- return Response.json({ ok: true, filePath: zipPath });
471
+ return Response.json({ success: true, filePath: zipPath });
438
472
  } finally {
439
473
  try {
440
474
  rmSync(tempDir, { recursive: true, force: true });
@@ -653,7 +687,7 @@ async function handleDictation(body: DictationBody): Promise<Response> {
653
687
  log.warn(
654
688
  "Dictation: no provider available, using heuristic + raw transcription",
655
689
  );
656
- // Build an IPC-compatible msg for the heuristic
690
+ // Build a compatible msg for the heuristic
657
691
  const mode = detectDictationModeHeuristic({
658
692
  type: "dictation_request",
659
693
  transcription: body.transcription,
@@ -2,7 +2,7 @@
2
2
  * Route handlers for document persistence operations.
3
3
  *
4
4
  * Exposes document CRUD over HTTP, sharing business logic with the
5
- * IPC handlers in `daemon/handlers/documents.ts`.
5
+ * handlers in `daemon/handlers/documents.ts`.
6
6
  */
7
7
  import { rawAll, rawGet, rawRun } from "../../memory/db.js";
8
8
  import { getLogger } from "../../util/logger.js";
@@ -24,7 +24,7 @@ interface DocumentRow {
24
24
  type DocumentListRow = Omit<DocumentRow, "content">;
25
25
 
26
26
  // ---------------------------------------------------------------------------
27
- // Shared business logic (used by both IPC handlers and HTTP routes)
27
+ // Shared business logic (used by both message handlers and HTTP routes)
28
28
  // ---------------------------------------------------------------------------
29
29
 
30
30
  export function saveDocument(params: {
@@ -49,7 +49,7 @@ interface GlobalSearchMemory {
49
49
  interface GlobalSearchSchedule {
50
50
  id: string;
51
51
  name: string;
52
- expression: string;
52
+ expression: string | null;
53
53
  message: string;
54
54
  enabled: boolean;
55
55
  nextRunAt: number | null;
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Route handler for host bash result submissions.
3
+ *
4
+ * Resolves pending host bash proxy requests by requestId when the desktop
5
+ * client returns execution results via HTTP.
6
+ */
7
+ import { requireBoundGuardian } from "../auth/require-bound-guardian.js";
8
+ import type { AuthContext } from "../auth/types.js";
9
+ import { httpError } from "../http-errors.js";
10
+ import type { RouteDefinition } from "../http-router.js";
11
+ import * as pendingInteractions from "../pending-interactions.js";
12
+
13
+ /**
14
+ * POST /v1/host-bash-result — resolve a pending host bash request by requestId.
15
+ * Requires AuthContext with guardian-bound actor.
16
+ */
17
+ export async function handleHostBashResult(
18
+ req: Request,
19
+ authContext: AuthContext,
20
+ ): Promise<Response> {
21
+ const authError = requireBoundGuardian(authContext);
22
+ if (authError) return authError;
23
+
24
+ const body = (await req.json()) as {
25
+ requestId?: string;
26
+ stdout?: string;
27
+ stderr?: string;
28
+ exitCode?: number | null;
29
+ timedOut?: boolean;
30
+ };
31
+
32
+ const { requestId, stdout, stderr, exitCode, timedOut } = body;
33
+
34
+ if (!requestId || typeof requestId !== "string") {
35
+ return httpError("BAD_REQUEST", "requestId is required", 400);
36
+ }
37
+
38
+ // Peek first (non-destructive) so we can validate the interaction kind
39
+ // without accidentally consuming a confirmation or secret interaction.
40
+ const peeked = pendingInteractions.get(requestId);
41
+ if (!peeked) {
42
+ return httpError(
43
+ "NOT_FOUND",
44
+ "No pending interaction found for this requestId",
45
+ 404,
46
+ );
47
+ }
48
+
49
+ if (peeked.kind !== "host_bash") {
50
+ return httpError(
51
+ "CONFLICT",
52
+ `Pending interaction is of kind "${peeked.kind}", expected "host_bash"`,
53
+ 409,
54
+ );
55
+ }
56
+
57
+ // Validation passed — consume the pending interaction.
58
+ const interaction = pendingInteractions.resolve(requestId)!;
59
+
60
+ interaction.session.resolveHostBash(requestId, {
61
+ stdout: stdout ?? "",
62
+ stderr: stderr ?? "",
63
+ exitCode: exitCode ?? null,
64
+ timedOut: timedOut ?? false,
65
+ });
66
+
67
+ return Response.json({ accepted: true });
68
+ }
69
+
70
+ // ---------------------------------------------------------------------------
71
+ // Route definitions
72
+ // ---------------------------------------------------------------------------
73
+
74
+ export function hostBashRouteDefinitions(): RouteDefinition[] {
75
+ return [
76
+ {
77
+ endpoint: "host-bash-result",
78
+ method: "POST",
79
+ handler: async ({ req, authContext }) =>
80
+ handleHostBashResult(req, authContext),
81
+ },
82
+ ];
83
+ }