@vellumai/assistant 0.4.46 → 0.4.49

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 (382) hide show
  1. package/ARCHITECTURE.md +7 -7
  2. package/README.md +2 -23
  3. package/docs/architecture/integrations.md +45 -41
  4. package/docs/architecture/keychain-broker.md +3 -3
  5. package/docs/architecture/security.md +5 -5
  6. package/docs/runbook-trusted-contacts.md +3 -8
  7. package/hook-templates/debug-prompt-logger/hook.json +1 -1
  8. package/hook-templates/debug-prompt-logger/run.sh +1 -3
  9. package/package.json +1 -1
  10. package/src/__tests__/actor-token-service.test.ts +0 -1
  11. package/src/__tests__/anthropic-provider.test.ts +156 -0
  12. package/src/__tests__/approval-cascade.test.ts +810 -0
  13. package/src/__tests__/approval-primitive.test.ts +0 -1
  14. package/src/__tests__/approval-routes-http.test.ts +2 -0
  15. package/src/__tests__/assistant-attachments.test.ts +12 -34
  16. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +76 -0
  17. package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -1
  18. package/src/__tests__/browser-fill-credential.test.ts +5 -2
  19. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
  20. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +2 -1
  21. package/src/__tests__/channel-guardian.test.ts +0 -2
  22. package/src/__tests__/channel-readiness-routes.test.ts +35 -25
  23. package/src/__tests__/channel-readiness-service.test.ts +10 -9
  24. package/src/__tests__/checker.test.ts +9 -29
  25. package/src/__tests__/cli.test.ts +23 -0
  26. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +1 -1
  27. package/src/__tests__/computer-use-tools.test.ts +2 -19
  28. package/src/__tests__/config-watcher.test.ts +0 -1
  29. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  30. package/src/__tests__/context-image-dimensions.test.ts +332 -0
  31. package/src/__tests__/context-token-estimator.test.ts +196 -13
  32. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  33. package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
  34. package/src/__tests__/conversation-routes-guardian-reply.test.ts +144 -0
  35. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
  36. package/src/__tests__/credential-broker-browser-fill.test.ts +23 -22
  37. package/src/__tests__/credential-broker-server-use.test.ts +22 -21
  38. package/src/__tests__/credential-broker.test.ts +2 -1
  39. package/src/__tests__/credential-metadata-store.test.ts +239 -26
  40. package/src/__tests__/credential-resolve.test.ts +5 -4
  41. package/src/__tests__/credential-security-e2e.test.ts +8 -8
  42. package/src/__tests__/credential-security-invariants.test.ts +111 -7
  43. package/src/__tests__/credential-vault-unit.test.ts +287 -54
  44. package/src/__tests__/credential-vault.test.ts +406 -12
  45. package/src/__tests__/credentials-cli.test.ts +82 -6
  46. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  47. package/src/__tests__/ephemeral-permissions.test.ts +3 -3
  48. package/src/__tests__/gateway-only-enforcement.test.ts +4 -2
  49. package/src/__tests__/gateway-only-guard.test.ts +0 -1
  50. package/src/__tests__/gemini-image-service.test.ts +75 -45
  51. package/src/__tests__/gemini-provider.test.ts +9 -6
  52. package/src/__tests__/guardian-action-conversation-turn.test.ts +1 -33
  53. package/src/__tests__/guardian-action-copy-generator.test.ts +0 -20
  54. package/src/__tests__/guardian-action-followup-executor.test.ts +1 -28
  55. package/src/__tests__/guardian-action-followup-store.test.ts +1 -1
  56. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  57. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  58. package/src/__tests__/guardian-grant-minting.test.ts +35 -0
  59. package/src/__tests__/guardian-routing-invariants.test.ts +0 -1
  60. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  61. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -39
  62. package/src/__tests__/heartbeat-service.test.ts +0 -1
  63. package/src/__tests__/host-cu-proxy.test.ts +629 -0
  64. package/src/__tests__/host-shell-tool.test.ts +27 -15
  65. package/src/__tests__/http-user-message-parity.test.ts +1 -0
  66. package/src/__tests__/ingress-url-consistency.test.ts +14 -21
  67. package/src/__tests__/integration-status.test.ts +38 -25
  68. package/src/__tests__/intent-routing.test.ts +0 -1
  69. package/src/__tests__/invite-routes-http.test.ts +10 -9
  70. package/src/__tests__/keychain-broker-client.test.ts +11 -43
  71. package/src/__tests__/managed-proxy-context.test.ts +5 -3
  72. package/src/__tests__/media-generate-image.test.ts +63 -2
  73. package/src/__tests__/media-reuse-story.e2e.test.ts +7 -3
  74. package/src/__tests__/messaging-send-tool.test.ts +4 -6
  75. package/src/__tests__/notification-routing-intent.test.ts +0 -1
  76. package/src/__tests__/oauth-cli.test.ts +373 -14
  77. package/src/__tests__/oauth-provider-profiles.test.ts +9 -9
  78. package/src/__tests__/oauth-scope-policy.test.ts +4 -6
  79. package/src/__tests__/oauth-store.test.ts +756 -0
  80. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  81. package/src/__tests__/provider-error-scenarios.test.ts +0 -1
  82. package/src/__tests__/provider-fail-open-selection.test.ts +3 -1
  83. package/src/__tests__/provider-managed-proxy-integration.test.ts +70 -6
  84. package/src/__tests__/provider-streaming.benchmark.test.ts +0 -1
  85. package/src/__tests__/public-ingress-urls.test.ts +15 -21
  86. package/src/__tests__/recording-handler.test.ts +3 -4
  87. package/src/__tests__/registry.test.ts +2 -2
  88. package/src/__tests__/runtime-events-sse.test.ts +55 -7
  89. package/src/__tests__/schedule-store.test.ts +0 -1
  90. package/src/__tests__/scheduler-recurrence.test.ts +0 -1
  91. package/src/__tests__/schema-transforms.test.ts +226 -0
  92. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  93. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  94. package/src/__tests__/script-proxy-injection-runtime.test.ts +23 -13
  95. package/src/__tests__/script-proxy-policy-runtime.test.ts +1 -1
  96. package/src/__tests__/script-proxy-session-manager.test.ts +1 -1
  97. package/src/__tests__/secret-ingress-handler.test.ts +0 -1
  98. package/src/__tests__/secret-onetime-send.test.ts +5 -3
  99. package/src/__tests__/send-endpoint-busy.test.ts +21 -6
  100. package/src/__tests__/sequence-store.test.ts +0 -1
  101. package/src/__tests__/session-init.benchmark.test.ts +4 -5
  102. package/src/__tests__/session-messaging-secret-redirect.test.ts +5 -4
  103. package/src/__tests__/skill-include-graph.test.ts +66 -0
  104. package/src/__tests__/skill-load-feature-flag.test.ts +0 -1
  105. package/src/__tests__/skill-load-tool.test.ts +149 -1
  106. package/src/__tests__/skill-projection-feature-flag.test.ts +0 -1
  107. package/src/__tests__/skills-uninstall.test.ts +3 -3
  108. package/src/__tests__/skills.test.ts +3 -12
  109. package/src/__tests__/slack-channel-config.test.ts +76 -11
  110. package/src/__tests__/slack-share-routes.test.ts +17 -14
  111. package/src/__tests__/system-prompt.test.ts +0 -1
  112. package/src/__tests__/telegram-bot-username-resolution.test.ts +3 -0
  113. package/src/__tests__/telegram-invite-adapter.test.ts +18 -22
  114. package/src/__tests__/terminal-tools.test.ts +4 -3
  115. package/src/__tests__/test-support/computer-use-skill-harness.ts +3 -2
  116. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  117. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  118. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  119. package/src/__tests__/tool-executor-shell-integration.test.ts +0 -1
  120. package/src/__tests__/tool-executor.test.ts +0 -1
  121. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  122. package/src/__tests__/trust-store-pattern-matches.test.ts +29 -0
  123. package/src/__tests__/trust-store.test.ts +1 -22
  124. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  125. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  126. package/src/__tests__/twilio-config.test.ts +2 -1
  127. package/src/__tests__/twilio-provider.test.ts +4 -2
  128. package/src/__tests__/twilio-routes.test.ts +5 -20
  129. package/src/__tests__/verification-control-plane-policy.test.ts +0 -1
  130. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  131. package/src/agent/ax-tree-compaction.test.ts +235 -0
  132. package/src/agent/loop.ts +76 -130
  133. package/src/calls/call-domain.ts +8 -10
  134. package/src/calls/relay-server.ts +9 -13
  135. package/src/calls/twilio-config.ts +4 -8
  136. package/src/calls/twilio-provider.ts +2 -1
  137. package/src/calls/twilio-rest.ts +2 -1
  138. package/src/calls/twilio-routes.ts +1 -2
  139. package/src/calls/voice-ingress-preflight.ts +1 -1
  140. package/src/cli/commands/browser-relay.ts +46 -15
  141. package/src/cli/commands/completions.ts +0 -3
  142. package/src/cli/commands/credentials.ts +110 -23
  143. package/src/cli/commands/oauth/apps.ts +255 -0
  144. package/src/cli/commands/oauth/connections.ts +299 -0
  145. package/src/cli/commands/oauth/index.ts +52 -0
  146. package/src/cli/commands/oauth/providers.ts +242 -0
  147. package/src/cli/commands/skills.ts +4 -338
  148. package/src/cli/program.ts +1 -5
  149. package/src/cli/reference.ts +1 -3
  150. package/src/cli.ts +3 -2
  151. package/src/config/assistant-feature-flags.ts +0 -3
  152. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +1 -1
  153. package/src/config/bundled-skills/claude-code/TOOLS.json +0 -4
  154. package/src/config/bundled-skills/computer-use/SKILL.md +3 -6
  155. package/src/config/bundled-skills/computer-use/TOOLS.json +22 -4
  156. package/src/config/bundled-skills/contacts/tools/google-contacts.ts +29 -32
  157. package/src/config/bundled-skills/gmail/SKILL.md +4 -4
  158. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +54 -61
  159. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +25 -28
  160. package/src/config/bundled-skills/gmail/tools/gmail-draft.ts +14 -17
  161. package/src/config/bundled-skills/gmail/tools/gmail-filters.ts +39 -44
  162. package/src/config/bundled-skills/gmail/tools/gmail-follow-up.ts +61 -58
  163. package/src/config/bundled-skills/gmail/tools/gmail-forward.ts +50 -49
  164. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +11 -13
  165. package/src/config/bundled-skills/gmail/tools/gmail-outreach-scan.ts +148 -146
  166. package/src/config/bundled-skills/gmail/tools/gmail-send-draft.ts +4 -7
  167. package/src/config/bundled-skills/gmail/tools/gmail-sender-digest.ts +175 -173
  168. package/src/config/bundled-skills/gmail/tools/gmail-trash.ts +4 -7
  169. package/src/config/bundled-skills/gmail/tools/gmail-unsubscribe.ts +71 -76
  170. package/src/config/bundled-skills/gmail/tools/gmail-vacation.ts +32 -38
  171. package/src/config/bundled-skills/google-calendar/SKILL.md +2 -2
  172. package/src/config/bundled-skills/google-calendar/calendar-client.ts +90 -44
  173. package/src/config/bundled-skills/google-calendar/tools/calendar-check-availability.ts +9 -10
  174. package/src/config/bundled-skills/google-calendar/tools/calendar-create-event.ts +5 -6
  175. package/src/config/bundled-skills/google-calendar/tools/calendar-get-event.ts +4 -5
  176. package/src/config/bundled-skills/google-calendar/tools/calendar-list-events.ts +14 -15
  177. package/src/config/bundled-skills/google-calendar/tools/calendar-rsvp.ts +37 -37
  178. package/src/config/bundled-skills/google-calendar/tools/shared.ts +4 -9
  179. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +24 -3
  180. package/src/config/bundled-skills/messaging/SKILL.md +6 -6
  181. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +62 -63
  182. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +15 -16
  183. package/src/config/bundled-skills/messaging/tools/messaging-auth-test.ts +4 -5
  184. package/src/config/bundled-skills/messaging/tools/messaging-list-conversations.ts +6 -7
  185. package/src/config/bundled-skills/messaging/tools/messaging-mark-read.ts +4 -5
  186. package/src/config/bundled-skills/messaging/tools/messaging-read.ts +14 -15
  187. package/src/config/bundled-skills/messaging/tools/messaging-search.ts +4 -5
  188. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +128 -128
  189. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +33 -34
  190. package/src/config/bundled-skills/messaging/tools/shared.ts +12 -15
  191. package/src/config/bundled-skills/settings/SKILL.md +1 -1
  192. package/src/config/bundled-skills/settings/TOOLS.json +2 -8
  193. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +5 -33
  194. package/src/config/bundled-skills/slack/tools/shared.ts +4 -10
  195. package/src/config/bundled-skills/slack/tools/slack-add-reaction.ts +4 -5
  196. package/src/config/bundled-skills/slack/tools/slack-channel-details.ts +15 -16
  197. package/src/config/bundled-skills/slack/tools/slack-delete-message.ts +4 -5
  198. package/src/config/bundled-skills/slack/tools/slack-edit-message.ts +4 -5
  199. package/src/config/bundled-skills/slack/tools/slack-leave-channel.ts +4 -5
  200. package/src/config/bundled-skills/slack/tools/slack-scan-digest.ts +95 -92
  201. package/src/config/env-registry.ts +14 -83
  202. package/src/config/env.ts +11 -50
  203. package/src/config/feature-flag-registry.json +16 -16
  204. package/src/config/schema.ts +3 -1
  205. package/src/config/skills.ts +21 -2
  206. package/src/context/image-dimensions.ts +229 -0
  207. package/src/context/token-estimator.ts +75 -12
  208. package/src/context/window-manager.ts +49 -10
  209. package/src/daemon/assistant-attachments.ts +1 -13
  210. package/src/daemon/guardian-action-generators.ts +4 -5
  211. package/src/daemon/handlers/config-ingress.ts +8 -33
  212. package/src/daemon/handlers/config-slack-channel.ts +76 -56
  213. package/src/daemon/handlers/config-telegram.ts +53 -24
  214. package/src/daemon/handlers/sessions.ts +10 -24
  215. package/src/daemon/handlers/shared.ts +0 -130
  216. package/src/daemon/host-cu-proxy.ts +401 -0
  217. package/src/daemon/lifecycle.ts +39 -63
  218. package/src/daemon/message-protocol.ts +3 -0
  219. package/src/daemon/message-types/computer-use.ts +2 -119
  220. package/src/daemon/message-types/host-cu.ts +19 -0
  221. package/src/daemon/message-types/integrations.ts +1 -0
  222. package/src/daemon/message-types/messages.ts +3 -0
  223. package/src/daemon/server.ts +14 -21
  224. package/src/daemon/session-agent-loop-handlers.ts +2 -0
  225. package/src/daemon/session-attachments.ts +1 -2
  226. package/src/daemon/session-messaging.ts +3 -1
  227. package/src/daemon/session-slash.ts +1 -1
  228. package/src/daemon/session-surfaces.ts +40 -28
  229. package/src/daemon/session-tool-setup.ts +20 -11
  230. package/src/daemon/session.ts +139 -16
  231. package/src/daemon/tool-side-effects.ts +2 -8
  232. package/src/daemon/watch-handler.ts +2 -2
  233. package/src/email/providers/index.ts +2 -1
  234. package/src/events/tool-metrics-listener.ts +2 -2
  235. package/src/hooks/manager.ts +1 -4
  236. package/src/inbound/public-ingress-urls.ts +7 -7
  237. package/src/instrument.ts +15 -1
  238. package/src/logfire.ts +16 -5
  239. package/src/media/app-icon-generator.ts +30 -4
  240. package/src/media/avatar-router.ts +26 -3
  241. package/src/media/gemini-image-service.ts +28 -2
  242. package/src/memory/conversation-key-store.ts +21 -0
  243. package/src/memory/db-init.ts +4 -0
  244. package/src/memory/guardian-action-store.ts +1 -1
  245. package/src/memory/migrations/149-oauth-tables.ts +60 -0
  246. package/src/memory/migrations/index.ts +1 -0
  247. package/src/memory/schema/guardian.ts +1 -1
  248. package/src/memory/schema/index.ts +1 -0
  249. package/src/memory/schema/oauth.ts +65 -0
  250. package/src/messaging/provider.ts +19 -13
  251. package/src/messaging/providers/gmail/adapter.ts +40 -23
  252. package/src/messaging/providers/gmail/client.ts +283 -122
  253. package/src/messaging/providers/gmail/people-client.ts +32 -24
  254. package/src/messaging/providers/slack/adapter.ts +29 -19
  255. package/src/messaging/providers/slack/client.ts +265 -78
  256. package/src/messaging/providers/telegram-bot/adapter.ts +19 -18
  257. package/src/messaging/providers/whatsapp/adapter.ts +17 -11
  258. package/src/messaging/registry.ts +2 -31
  259. package/src/notifications/copy-composer.ts +0 -5
  260. package/src/notifications/signal.ts +4 -5
  261. package/src/oauth/byo-connection.test.ts +537 -0
  262. package/src/oauth/byo-connection.ts +128 -0
  263. package/src/oauth/connect-orchestrator.ts +139 -56
  264. package/src/oauth/connect-types.ts +17 -23
  265. package/src/oauth/connection-resolver.ts +58 -0
  266. package/src/oauth/connection.ts +38 -0
  267. package/src/oauth/manual-token-connection.ts +104 -0
  268. package/src/oauth/oauth-store.ts +496 -0
  269. package/src/oauth/platform-connection.test.ts +192 -0
  270. package/src/oauth/platform-connection.ts +111 -0
  271. package/src/oauth/provider-behaviors.ts +124 -0
  272. package/src/oauth/scope-policy.ts +9 -2
  273. package/src/oauth/seed-providers.ts +161 -0
  274. package/src/oauth/token-persistence.ts +74 -78
  275. package/src/permissions/checker.ts +8 -4
  276. package/src/permissions/defaults.ts +0 -1
  277. package/src/permissions/prompter.ts +10 -1
  278. package/src/permissions/trust-store.ts +13 -0
  279. package/src/prompts/__tests__/build-cli-reference-section.test.ts +3 -1
  280. package/src/prompts/system-prompt.ts +70 -45
  281. package/src/providers/anthropic/client.ts +133 -24
  282. package/src/providers/gemini/client.ts +15 -6
  283. package/src/providers/managed-proxy/constants.ts +2 -2
  284. package/src/providers/managed-proxy/context.ts +5 -1
  285. package/src/providers/ratelimit.ts +17 -0
  286. package/src/providers/registry.ts +2 -2
  287. package/src/providers/retry.ts +1 -27
  288. package/src/runtime/AGENTS.md +17 -0
  289. package/src/runtime/auth/route-policy.ts +0 -3
  290. package/src/runtime/channel-invite-transports/telegram.ts +2 -1
  291. package/src/runtime/channel-readiness-service.ts +168 -195
  292. package/src/runtime/channel-readiness-types.ts +4 -0
  293. package/src/runtime/channel-reply-delivery.ts +0 -40
  294. package/src/runtime/gateway-client.ts +0 -7
  295. package/src/runtime/guardian-action-conversation-turn.ts +1 -3
  296. package/src/runtime/guardian-action-followup-executor.ts +1 -1
  297. package/src/runtime/guardian-action-message-composer.ts +3 -23
  298. package/src/runtime/http-server.ts +17 -10
  299. package/src/runtime/http-types.ts +2 -3
  300. package/src/runtime/middleware/rate-limiter.ts +74 -20
  301. package/src/runtime/middleware/twilio-validation.ts +1 -11
  302. package/src/runtime/pending-interactions.ts +14 -12
  303. package/src/runtime/routes/channel-delivery-routes.ts +0 -1
  304. package/src/runtime/routes/channel-readiness-routes.ts +2 -0
  305. package/src/runtime/routes/conversation-routes.ts +73 -19
  306. package/src/runtime/routes/diagnostics-routes.ts +11 -9
  307. package/src/runtime/routes/events-routes.ts +21 -11
  308. package/src/runtime/routes/guardian-approval-interception.ts +20 -5
  309. package/src/runtime/routes/host-cu-routes.ts +97 -0
  310. package/src/runtime/routes/inbound-stages/background-dispatch.ts +12 -111
  311. package/src/runtime/routes/integrations/slack/share.ts +6 -6
  312. package/src/runtime/routes/integrations/twilio.ts +6 -5
  313. package/src/runtime/routes/log-export-routes.ts +126 -8
  314. package/src/runtime/routes/secret-routes.ts +3 -2
  315. package/src/runtime/routes/settings-routes.ts +113 -48
  316. package/src/runtime/routes/surface-action-routes.ts +1 -1
  317. package/src/runtime/routes/watch-routes.ts +128 -0
  318. package/src/schedule/integration-status.ts +10 -8
  319. package/src/security/credential-key.ts +14 -0
  320. package/src/security/keychain-broker-client.ts +5 -6
  321. package/src/security/oauth2.ts +1 -1
  322. package/src/security/token-manager.ts +145 -43
  323. package/src/skills/catalog-install.ts +358 -0
  324. package/src/skills/include-graph.ts +32 -0
  325. package/src/telegram/bot-username.ts +2 -3
  326. package/src/tools/apps/definitions.ts +0 -5
  327. package/src/tools/assets/materialize.ts +0 -5
  328. package/src/tools/assets/search.ts +0 -5
  329. package/src/tools/browser/headless-browser.ts +1 -67
  330. package/src/tools/browser/network-recorder.ts +1 -1
  331. package/src/tools/browser/network-recording-types.ts +1 -1
  332. package/src/tools/claude-code/claude-code.ts +0 -5
  333. package/src/tools/computer-use/definitions.ts +46 -11
  334. package/src/tools/computer-use/registry.ts +4 -5
  335. package/src/tools/credentials/broker.ts +5 -4
  336. package/src/tools/credentials/metadata-store.ts +22 -74
  337. package/src/tools/credentials/resolve.ts +2 -1
  338. package/src/tools/credentials/vault.ts +139 -151
  339. package/src/tools/filesystem/edit.ts +1 -6
  340. package/src/tools/filesystem/read.ts +0 -5
  341. package/src/tools/filesystem/write.ts +1 -6
  342. package/src/tools/host-filesystem/edit.ts +1 -6
  343. package/src/tools/host-filesystem/read.ts +1 -6
  344. package/src/tools/host-filesystem/write.ts +1 -6
  345. package/src/tools/mcp/mcp-tool-factory.ts +18 -1
  346. package/src/tools/memory/definitions.ts +0 -5
  347. package/src/tools/network/web-fetch.ts +0 -5
  348. package/src/tools/network/web-search.ts +0 -5
  349. package/src/tools/registry.ts +2 -7
  350. package/src/tools/schema-transforms.ts +99 -0
  351. package/src/tools/skills/load.ts +62 -8
  352. package/src/tools/swarm/delegate.ts +0 -5
  353. package/src/tools/system/avatar-generator.ts +0 -5
  354. package/src/tools/ui-surface/definitions.ts +0 -15
  355. package/src/tools/watch/screen-watch.ts +0 -5
  356. package/src/tools/watch/watch-state.ts +0 -12
  357. package/src/util/logger.ts +7 -41
  358. package/src/util/platform.ts +9 -28
  359. package/src/version.ts +10 -0
  360. package/src/watcher/providers/github.ts +51 -52
  361. package/src/watcher/providers/gmail.ts +88 -80
  362. package/src/watcher/providers/google-calendar.ts +94 -86
  363. package/src/watcher/providers/linear.ts +87 -93
  364. package/src/__tests__/computer-use-session-compaction.test.ts +0 -143
  365. package/src/__tests__/computer-use-session-lifecycle.test.ts +0 -322
  366. package/src/__tests__/computer-use-session-working-dir.test.ts +0 -166
  367. package/src/__tests__/computer-use-skill-baseline.test.ts +0 -78
  368. package/src/__tests__/computer-use-skill-endstate.test.ts +0 -105
  369. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +0 -249
  370. package/src/__tests__/ride-shotgun-handler.test.ts +0 -452
  371. package/src/cli/commands/dev.ts +0 -129
  372. package/src/cli/commands/map.ts +0 -391
  373. package/src/cli/commands/oauth.ts +0 -77
  374. package/src/config/bundled-skills/computer-use/tools/computer-use-request-control.ts +0 -16
  375. package/src/daemon/computer-use-session.ts +0 -1020
  376. package/src/daemon/ride-shotgun-handler.ts +0 -567
  377. package/src/oauth/provider-profiles.ts +0 -192
  378. package/src/prompts/computer-use-prompt.ts +0 -98
  379. package/src/runtime/routes/computer-use-routes.ts +0 -641
  380. package/src/runtime/telegram-streaming-delivery.test.ts +0 -597
  381. package/src/runtime/telegram-streaming-delivery.ts +0 -383
  382. package/src/tools/computer-use/request-computer-control.ts +0 -61
@@ -1,49 +1,9 @@
1
- // Computer use, task routing, ride shotgun, and watch observation types.
1
+ // Computer use, task routing, and watch observation types.
2
2
 
3
3
  import type { CommandIntent, UserMessageAttachment } from "./shared.js";
4
4
 
5
5
  // === Client → Server ===
6
6
 
7
- export interface CuSessionCreate {
8
- type: "cu_session_create";
9
- sessionId: string;
10
- task: string;
11
- screenWidth: number;
12
- screenHeight: number;
13
- attachments?: UserMessageAttachment[];
14
- interactionType?: "computer_use" | "text_qa";
15
- }
16
-
17
- export interface CuSessionAbort {
18
- type: "cu_session_abort";
19
- sessionId: string;
20
- }
21
-
22
- export interface CuObservation {
23
- type: "cu_observation";
24
- sessionId: string;
25
- axTree?: string;
26
- axDiff?: string;
27
- secondaryWindows?: string;
28
- screenshot?: string;
29
- /** Screenshot image width in pixels (`Px`). */
30
- screenshotWidthPx?: number;
31
- /** Screenshot image height in pixels (`Px`). */
32
- screenshotHeightPx?: number;
33
- /** Screen width in macOS points (`Pt`) used by native execution. */
34
- screenWidthPt?: number;
35
- /** Screen height in macOS points (`Pt`) used by native execution. */
36
- screenHeightPt?: number;
37
- /** Coordinate origin convention used by the observation payload. */
38
- coordinateOrigin?: "top_left";
39
- /** Display ID used by screenshot capture for this observation. */
40
- captureDisplayId?: number;
41
- executionResult?: string;
42
- executionError?: string;
43
- /** Free-form guidance from the user, injected mid-turn to steer the agent. */
44
- userGuidance?: string;
45
- }
46
-
47
7
  export interface TaskSubmit {
48
8
  type: "task_submit";
49
9
  task: string;
@@ -55,22 +15,6 @@ export interface TaskSubmit {
55
15
  commandIntent?: CommandIntent;
56
16
  }
57
17
 
58
- export interface RideShotgunStart {
59
- type: "ride_shotgun_start";
60
- durationSeconds: number;
61
- intervalSeconds: number;
62
- mode?: "observe" | "learn";
63
- targetDomain?: string;
64
- /** Domain to auto-navigate (may differ from targetDomain, e.g. open.spotify.com vs spotify.com). */
65
- navigateDomain?: string;
66
- autoNavigate?: boolean;
67
- }
68
-
69
- export interface RideShotgunStop {
70
- type: "ride_shotgun_stop";
71
- watchId: string;
72
- }
73
-
74
18
  export interface WatchObservation {
75
19
  type: "watch_observation";
76
20
  watchId: string;
@@ -145,58 +89,16 @@ export interface RecordingResume {
145
89
  recordingId: string;
146
90
  }
147
91
 
148
- export interface CuAction {
149
- type: "cu_action";
150
- sessionId: string;
151
- toolName: string;
152
- input: Record<string, unknown>;
153
- reasoning?: string;
154
- stepNumber: number;
155
- }
156
-
157
- export interface CuComplete {
158
- type: "cu_complete";
159
- sessionId: string;
160
- summary: string;
161
- stepCount: number;
162
- isResponse?: boolean;
163
- }
164
-
165
- export interface CuError {
166
- type: "cu_error";
167
- sessionId: string;
168
- message: string;
169
- }
170
-
171
92
  export interface TaskRouted {
172
93
  type: "task_routed";
173
94
  sessionId: string;
174
95
  interactionType: "computer_use" | "text_qa";
175
96
  /** The task text passed to the escalated session. */
176
97
  task?: string;
177
- /** Set when a text_qa session escalates to computer_use via computer_use_request_control. */
98
+ /** Set when a text_qa session escalates to computer_use. */
178
99
  escalatedFrom?: string;
179
100
  }
180
101
 
181
- export interface RideShotgunProgress {
182
- type: "ride_shotgun_progress";
183
- watchId: string;
184
- message: string;
185
- networkEntryCount?: number;
186
- statusMessage?: string;
187
- idleHint?: boolean;
188
- }
189
-
190
- export interface RideShotgunResult {
191
- type: "ride_shotgun_result";
192
- sessionId: string;
193
- watchId: string;
194
- summary: string;
195
- observationCount: number;
196
- recordingId?: string;
197
- recordingPath?: string;
198
- }
199
-
200
102
  export interface WatchStarted {
201
103
  type: "watch_started";
202
104
  sessionId: string;
@@ -211,34 +113,15 @@ export interface WatchCompleteRequest {
211
113
  watchId: string;
212
114
  }
213
115
 
214
- /** Server → Client: bootstrap failure during learn-mode recording setup. */
215
- export interface RideShotgunError {
216
- type: "ride_shotgun_error";
217
- watchId: string;
218
- sessionId: string;
219
- message: string;
220
- }
221
-
222
116
  // --- Domain-level union aliases (consumed by the barrel file) ---
223
117
 
224
118
  export type _ComputerUseClientMessages =
225
- | CuSessionCreate
226
- | CuSessionAbort
227
- | CuObservation
228
119
  | TaskSubmit
229
- | RideShotgunStart
230
- | RideShotgunStop
231
120
  | WatchObservation
232
121
  | RecordingStatus;
233
122
 
234
123
  export type _ComputerUseServerMessages =
235
- | CuAction
236
- | CuComplete
237
- | CuError
238
124
  | TaskRouted
239
- | RideShotgunProgress
240
- | RideShotgunResult
241
- | RideShotgunError
242
125
  | WatchStarted
243
126
  | WatchCompleteRequest
244
127
  | RecordingStart
@@ -0,0 +1,19 @@
1
+ // Host computer-use proxy types.
2
+ // Enables proxying computer-use actions (click, type, screenshot, etc.)
3
+ // to the desktop client when running as a managed assistant.
4
+
5
+ // === Server → Client ===
6
+
7
+ export interface HostCuRequest {
8
+ type: "host_cu_request";
9
+ requestId: string;
10
+ sessionId: string;
11
+ toolName: string; // "computer_use_click", "computer_use_type_text", etc.
12
+ input: Record<string, unknown>;
13
+ stepNumber: number;
14
+ reasoning?: string;
15
+ }
16
+
17
+ // --- Domain-level union aliases (consumed by the barrel file) ---
18
+
19
+ export type _HostCuServerMessages = HostCuRequest;
@@ -194,6 +194,7 @@ export interface IntegrationConnectResult {
194
194
  export interface OAuthConnectResultResponse {
195
195
  type: "oauth_connect_result";
196
196
  success: boolean;
197
+ service?: string;
197
198
  grantedScopes?: string[];
198
199
  accountInfo?: string;
199
200
  error?: string;
@@ -88,6 +88,7 @@ export interface ToolOutputChunk {
88
88
  type: "tool_output_chunk";
89
89
  chunk: string;
90
90
  sessionId?: string;
91
+ toolUseId?: string;
91
92
  subType?: "tool_start" | "tool_complete" | "status";
92
93
  subToolName?: string;
93
94
  subToolInput?: string;
@@ -155,6 +156,8 @@ export interface ConfirmationRequest {
155
156
  persistentDecisionsAllowed?: boolean;
156
157
  /** Which temporary approval options the client should render (e.g. "Allow for 10 minutes", "Allow for this thread"). */
157
158
  temporaryOptionsAvailable?: Array<"allow_10m" | "allow_thread">;
159
+ /** The tool_use block ID for client-side correlation with specific tool calls. */
160
+ toolUseId?: string;
158
161
  }
159
162
 
160
163
  export interface SecretRequest {
@@ -48,7 +48,6 @@ import {
48
48
  getWorkspacePromptPath,
49
49
  } from "../util/platform.js";
50
50
  import { registerDaemonCallbacks } from "../work-items/work-item-runner.js";
51
- import { ComputerUseSession } from "./computer-use-session.js";
52
51
  import { ConfigWatcher } from "./config-watcher.js";
53
52
  import { parseIdentityFields } from "./handlers/identity.js";
54
53
  import type {
@@ -57,6 +56,7 @@ import type {
57
56
  } from "./handlers/shared.js";
58
57
  import type { SkillOperationContext } from "./handlers/skills.js";
59
58
  import { HostBashProxy } from "./host-bash-proxy.js";
59
+ import { HostCuProxy } from "./host-cu-proxy.js";
60
60
  import { HostFileProxy } from "./host-file-proxy.js";
61
61
  import type { ServerMessage } from "./message-protocol.js";
62
62
  import {
@@ -214,14 +214,18 @@ function makePendingInteractionRegistrar(
214
214
  conversationId,
215
215
  kind: "host_file",
216
216
  });
217
+ } else if (msg.type === "host_cu_request") {
218
+ pendingInteractions.register(msg.requestId, {
219
+ session,
220
+ conversationId,
221
+ kind: "host_cu",
222
+ });
217
223
  }
218
224
  };
219
225
  }
220
226
 
221
227
  export class DaemonServer {
222
228
  private sessions = new Map<string, Session>();
223
- private cuSessions = new Map<string, ComputerUseSession>();
224
- private cuObservationParseSequence = new Map<string, number>();
225
229
  private sessionOptions = new Map<string, SessionCreateOptions>();
226
230
  private sessionCreating = new Map<string, Promise<Session>>();
227
231
  private sharedRequestTimestamps: number[] = [];
@@ -412,11 +416,6 @@ export class DaemonServer {
412
416
  }
413
417
  this.sessions.clear();
414
418
 
415
- for (const cuSession of this.cuSessions.values()) {
416
- cuSession.abort();
417
- }
418
- this.cuSessions.clear();
419
-
420
419
  log.info("Daemon server stopped");
421
420
  }
422
421
 
@@ -563,8 +562,6 @@ export class DaemonServer {
563
562
  private handlerContext(): HandlerContext {
564
563
  return {
565
564
  sessions: this.sessions,
566
- cuSessions: this.cuSessions,
567
- cuObservationParseSequence: this.cuObservationParseSequence,
568
565
  sharedRequestTimestamps: this.sharedRequestTimestamps,
569
566
  debounceTimers: this.configWatcher.timers,
570
567
  suppressConfigReload: this.configWatcher.suppressConfigReload,
@@ -665,9 +662,13 @@ export class DaemonServer {
665
662
  }),
666
663
  );
667
664
  }
665
+ if (!session.isProcessing() || !session.hostCuProxy) {
666
+ session.setHostCuProxy(new HostCuProxy(session.getCurrentSender()));
667
+ }
668
668
  } else if (!session.isProcessing()) {
669
669
  session.setHostBashProxy(undefined);
670
670
  session.setHostFileProxy(undefined);
671
+ session.setHostCuProxy(undefined);
671
672
  }
672
673
  session.setCommandIntent(options?.commandIntent ?? null);
673
674
  session.setTurnChannelContext({
@@ -907,23 +908,15 @@ export class DaemonServer {
907
908
 
908
909
  /**
909
910
  * Look up an active session by ID without creating one.
910
- * Checks both normal sessions and computer-use sessions so the HTTP
911
- * surface-action path is consistent with dispatch.
912
911
  */
913
- findSession(sessionId: string): Session | ComputerUseSession | undefined {
914
- return this.cuSessions.get(sessionId) ?? this.sessions.get(sessionId);
912
+ findSession(sessionId: string): Session | undefined {
913
+ return this.sessions.get(sessionId);
915
914
  }
916
915
 
917
916
  /**
918
917
  * Look up an active session that owns a given surfaceId.
919
- * Falls back across both normal and computer-use sessions.
920
918
  */
921
- findSessionBySurfaceId(
922
- surfaceId: string,
923
- ): Session | ComputerUseSession | undefined {
924
- for (const s of this.cuSessions.values()) {
925
- if (s.surfaceState.has(surfaceId)) return s;
926
- }
919
+ findSessionBySurfaceId(surfaceId: string): Session | undefined {
927
920
  for (const s of this.sessions.values()) {
928
921
  if (s.surfaceState.has(surfaceId)) return s;
929
922
  }
@@ -384,6 +384,7 @@ export function handleToolOutputChunk(
384
384
  type: "tool_output_chunk",
385
385
  chunk: event.chunk,
386
386
  sessionId: deps.ctx.conversationId,
387
+ toolUseId: event.toolUseId,
387
388
  subType: structured.subType,
388
389
  subToolName: structured.subToolName,
389
390
  subToolInput: structured.subToolInput,
@@ -395,6 +396,7 @@ export function handleToolOutputChunk(
395
396
  type: "tool_output_chunk",
396
397
  chunk: event.chunk,
397
398
  sessionId: deps.ctx.conversationId,
399
+ toolUseId: event.toolUseId,
398
400
  });
399
401
  }
400
402
  }
@@ -175,8 +175,7 @@ export async function resolveAssistantAttachments(
175
175
  accumulatedToolContentBlocks,
176
176
  toolContentBlockToolNames,
177
177
  );
178
- // Most recent tool outputs (e.g., final browser screenshot) should win
179
- // the MAX_ASSISTANT_ATTACHMENTS cap over older intermediate screenshots.
178
+ // Most recent tool outputs first so deduplication keeps the latest version.
180
179
  toolDrafts.reverse();
181
180
  const merged = deduplicateDrafts([
182
181
  ...directiveDrafts.drafts,
@@ -446,7 +446,9 @@ export function redirectToSecurePrompt(
446
446
  "Ingress redirect: transient credential injected",
447
447
  );
448
448
  } else {
449
- const key = `credential:${target.service}:${target.field}`;
449
+ const { credentialKey: credKey } =
450
+ await import("../security/credential-key.js");
451
+ const key = credKey(target.service, target.field);
450
452
  const stored = await setSecureKeyAsync(key, result.value);
451
453
  if (stored) {
452
454
  try {
@@ -465,7 +465,7 @@ function resolvePairCommand(content: string): SlashResolution | null {
465
465
  kind: "unknown",
466
466
  message:
467
467
  "Cannot generate pairing info — no gateway URL is configured and no LAN address was detected.\n\n" +
468
- "Set a public gateway URL with `config set ingress.publicBaseUrl <url>` or the `INGRESS_PUBLIC_BASE_URL` environment variable.",
468
+ "Set a public gateway URL with `config set ingress.publicBaseUrl <url>`.",
469
469
  };
470
470
  }
471
471
 
@@ -202,7 +202,8 @@ export interface SurfaceSessionContext {
202
202
  }>;
203
203
  display?: string;
204
204
  }>;
205
- onEscalateToComputerUse?: (task: string, sourceSessionId: string) => boolean;
205
+ /** Optional proxy for delegating computer-use actions to a connected desktop client. */
206
+ hostCuProxy?: import("./host-cu-proxy.js").HostCuProxy;
206
207
  isProcessing(): boolean;
207
208
  enqueueMessage(
208
209
  content: string,
@@ -931,13 +932,50 @@ export function buildUserFacingLabel(
931
932
 
932
933
  /**
933
934
  * Resolve a proxy tool call that targets a UI surface.
934
- * Handles ui_show, ui_update, ui_dismiss, computer_use_request_control, and app_open.
935
+ * Handles ui_show, ui_update, ui_dismiss, computer_use_* proxy tools, and app_open.
935
936
  */
936
937
  export async function surfaceProxyResolver(
937
938
  ctx: SurfaceSessionContext,
938
939
  toolName: string,
939
940
  input: Record<string, unknown>,
940
941
  ): Promise<ToolExecutionResult> {
942
+ // Route CU proxy tools (all computer_use_* action tools)
943
+ if (toolName.startsWith("computer_use_")) {
944
+ if (!ctx.hostCuProxy) {
945
+ return {
946
+ content: "Computer use is not available — no desktop client connected.",
947
+ isError: true,
948
+ };
949
+ }
950
+
951
+ // Terminal tools resolve immediately without a client round-trip
952
+ if (
953
+ toolName === "computer_use_done" ||
954
+ toolName === "computer_use_respond"
955
+ ) {
956
+ const summary =
957
+ typeof input.summary === "string"
958
+ ? input.summary
959
+ : typeof input.answer === "string"
960
+ ? input.answer
961
+ : "Task complete";
962
+ ctx.hostCuProxy.reset();
963
+ return { content: summary, isError: false };
964
+ }
965
+
966
+ // Record the action and proxy to the connected desktop client
967
+ const reasoning =
968
+ typeof input.reasoning === "string" ? input.reasoning : undefined;
969
+ ctx.hostCuProxy.recordAction(toolName, input, reasoning);
970
+ return ctx.hostCuProxy.request(
971
+ toolName,
972
+ input,
973
+ ctx.conversationId,
974
+ ctx.hostCuProxy.stepCount,
975
+ reasoning,
976
+ );
977
+ }
978
+
941
979
  if (toolName === "ui_show" || toolName === "ui_update") {
942
980
  const caps = ctx.channelCapabilities;
943
981
  if (caps && !caps.supportsDynamicUi) {
@@ -1152,32 +1190,6 @@ export async function surfaceProxyResolver(
1152
1190
  };
1153
1191
  }
1154
1192
 
1155
- if (toolName === "computer_use_request_control") {
1156
- const task =
1157
- typeof input.task === "string"
1158
- ? input.task
1159
- : "Perform the requested task";
1160
- if (!ctx.onEscalateToComputerUse) {
1161
- return {
1162
- content:
1163
- "Computer control escalation is not available in this session.",
1164
- isError: true,
1165
- };
1166
- }
1167
- const success = ctx.onEscalateToComputerUse(task, ctx.conversationId);
1168
- if (!success) {
1169
- return {
1170
- content: "Computer control escalation failed — no active connection.",
1171
- isError: true,
1172
- };
1173
- }
1174
- return {
1175
- content:
1176
- "Computer control activated. The task has been handed off to foreground computer use.",
1177
- isError: false,
1178
- };
1179
- }
1180
-
1181
1193
  if (toolName === "app_open") {
1182
1194
  const appId = input.app_id as string;
1183
1195
  const preview = input.preview as DynamicPageSurfaceData["preview"];
@@ -25,12 +25,15 @@ import type { TrustClass } from "../runtime/actor-trust-resolver.js";
25
25
  import { getEffectiveMode } from "../runtime/session-approval-overrides.js";
26
26
  import { coreAppProxyTools } from "../tools/apps/definitions.js";
27
27
  import { registerSessionSender } from "../tools/browser/browser-screencast.js";
28
- import { requestComputerControlTool } from "../tools/computer-use/request-computer-control.js";
29
28
  import type { ToolExecutor } from "../tools/executor.js";
30
29
  import {
31
30
  getAllToolDefinitions,
32
31
  getMcpToolDefinitions,
33
32
  } from "../tools/registry.js";
33
+ import {
34
+ injectReasonField,
35
+ REASON_SKIP_SET,
36
+ } from "../tools/schema-transforms.js";
34
37
  import type {
35
38
  ProxyApprovalCallback,
36
39
  ProxyApprovalRequest,
@@ -111,16 +114,13 @@ export interface ToolSetupContext extends SurfaceSessionContext {
111
114
 
112
115
  /**
113
116
  * Collect all tool definitions for the agent loop: built-in tools,
114
- * UI surface proxy tools, app proxy tools, and the computer-use
115
- * escalation tool.
117
+ * UI surface proxy tools, and app proxy tools.
116
118
  */
117
119
  export function buildToolDefinitions(): ToolDefinition[] {
118
120
  return [
119
121
  ...getAllToolDefinitions(),
120
122
  ...allUiSurfaceTools.map((t) => t.getDefinition()),
121
123
  ...coreAppProxyTools.map((t) => t.getDefinition()),
122
- // Escalation tool: allows text_qa sessions to hand off to computer use
123
- requestComputerControlTool.getDefinition(),
124
124
  ];
125
125
  }
126
126
 
@@ -335,11 +335,23 @@ export function createToolExecutor(
335
335
  // with the real tool name.
336
336
  if (name === "skill_execute") {
337
337
  const toolName = typeof input.tool === "string" ? input.tool : "";
338
- const toolInput =
338
+ const rawToolInput =
339
339
  input.input != null && typeof input.input === "object"
340
340
  ? (input.input as Record<string, unknown>)
341
341
  : {};
342
342
 
343
+ // Clone to avoid mutating shared input objects
344
+ const toolInput = { ...rawToolInput };
345
+
346
+ // Propagate outer reason when inner input lacks a valid one
347
+ if (
348
+ typeof input.reason === "string" &&
349
+ input.reason &&
350
+ (typeof toolInput.reason !== "string" || toolInput.reason.length === 0)
351
+ ) {
352
+ toolInput.reason = input.reason;
353
+ }
354
+
343
355
  if (!toolName) {
344
356
  return {
345
357
  content:
@@ -550,10 +562,7 @@ const HOST_TOOL_NAMES = new Set([
550
562
  "host_bash",
551
563
  ]);
552
564
  const ASSET_TOOL_NAMES = new Set(["asset_search", "asset_materialize"]);
553
- const CLIENT_CAPABILITY_TOOL_NAMES = new Set([
554
- "app_open",
555
- "computer_use_request_control",
556
- ]);
565
+ const CLIENT_CAPABILITY_TOOL_NAMES = new Set(["app_open"]);
557
566
  const PLATFORM_TOOL_NAMES = new Set(["request_system_permission"]);
558
567
 
559
568
  /**
@@ -663,6 +672,6 @@ export function createResolveToolsCallback(
663
672
  turnAllowed.add(name);
664
673
  }
665
674
  ctx.allowedToolNames = turnAllowed;
666
- return allBaseDefs;
675
+ return injectReasonField(allBaseDefs, REASON_SKIP_SET);
667
676
  };
668
677
  }