@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,383 +0,0 @@
1
- import type { ServerMessage } from "../daemon/message-protocol.js";
2
- import { getLogger } from "../util/logger.js";
3
- import type { ApprovalUIMetadata } from "./channel-approval-types.js";
4
- import type { ChannelDeliveryResult } from "./gateway-client.js";
5
- import { deliverChannelReply } from "./gateway-client.js";
6
-
7
- const log = getLogger("telegram-streaming-delivery");
8
-
9
- const EDIT_THROTTLE_MS = 1000; // Min interval between edits
10
- const TELEGRAM_MAX_TEXT_LEN = 4000; // Max chars per Telegram message
11
- const MIN_INITIAL_CHARS = 20; // Min chars before sending first message
12
-
13
- export interface TelegramStreamingOptions {
14
- callbackUrl: string;
15
- chatId: string;
16
- mintBearerToken: () => string;
17
- assistantId?: string;
18
- }
19
-
20
- export class TelegramStreamingDelivery {
21
- private readonly opts: TelegramStreamingOptions;
22
- private buffer = ""; // Accumulated text not yet sent
23
- private currentMessageId: number | null = null; // ID of current Telegram message
24
- private currentMessageText = ""; // Full text of current message
25
- private lastSentText = ""; // Last text successfully sent to Telegram
26
- private lastEditAt = 0; // Timestamp of last edit
27
- private editTimer: ReturnType<typeof setTimeout> | null = null;
28
- private messageCount = 0; // Total messages sent
29
- private finished = false;
30
- private textDelivered = false; // True once at least some text was sent
31
- private finishOk = false; // True only when finish() completes without error
32
- private initialSendInFlight = false; // Synchronous guard against duplicate initial sends
33
- private initialSendPromise: Promise<ChannelDeliveryResult> | null = null; // Tracks in-flight initial send
34
-
35
- constructor(opts: TelegramStreamingOptions) {
36
- this.opts = opts;
37
- }
38
-
39
- // ── Public API ──────────────────────────────────────────────────────
40
-
41
- onEvent(msg: ServerMessage): void {
42
- if (this.finished) return;
43
- switch (msg.type) {
44
- case "assistant_text_delta":
45
- this.onTextDelta(msg.text);
46
- break;
47
- case "tool_use_preview_start":
48
- // Early preview of tool use — ignored by Telegram; full tool_use_start follows.
49
- break;
50
- case "tool_use_start":
51
- // Flush buffer and send an edit so the message is up-to-date before the tool runs
52
- if (this.buffer.length > 0 && this.currentMessageId) {
53
- this.flushEdit();
54
- } else if (this.buffer.length > 0) {
55
- // No message sent yet — just move buffer to currentMessageText
56
- this.currentMessageText += this.buffer;
57
- this.buffer = "";
58
- }
59
- break;
60
- case "message_complete":
61
- // Don't finalize here — let finish() handle it
62
- break;
63
- }
64
- }
65
-
66
- async finish(approval?: ApprovalUIMetadata): Promise<void> {
67
- this.finished = true;
68
- if (this.editTimer) {
69
- clearTimeout(this.editTimer);
70
- this.editTimer = null;
71
- }
72
-
73
- // If sendInitialMessage() is in-flight, wait for it so currentMessageId is resolved
74
- if (this.initialSendPromise) {
75
- await this.initialSendPromise.catch(() => {
76
- // Error already logged in sendInitialMessage; proceed with whatever state we have
77
- });
78
- }
79
-
80
- // Flush any remaining buffered text
81
- if (this.buffer.length > 0) {
82
- if (this.currentMessageId) {
83
- this.currentMessageText += this.buffer;
84
- this.buffer = "";
85
- } else {
86
- log.warn(
87
- {
88
- chatId: this.opts.chatId,
89
- bufferLen: this.buffer.length,
90
- currentMessageTextLen: this.currentMessageText.length,
91
- textDelivered: this.textDelivered,
92
- initialSendInFlight: this.initialSendInFlight,
93
- },
94
- "finish() sending as new message because currentMessageId is null",
95
- );
96
- if (this.textDelivered) {
97
- // Initial text already delivered but no messageId — just send remainder
98
- this.currentMessageText = this.buffer;
99
- } else {
100
- // Initial send failed, buffer has been restored — send everything
101
- this.currentMessageText += this.buffer;
102
- }
103
- this.buffer = "";
104
- // Send as new message
105
- await this.sendNewMessage(this.currentMessageText, approval);
106
- this.finishOk = true;
107
- return;
108
- }
109
- }
110
-
111
- // Buffer was empty but text was moved to currentMessageText (e.g. by
112
- // tool_use_start) before any Telegram message was created. Send it now.
113
- if (
114
- !this.currentMessageId &&
115
- !this.textDelivered &&
116
- this.currentMessageText.length > 0 &&
117
- this.buffer.length === 0
118
- ) {
119
- await this.sendNewMessage(this.currentMessageText, approval);
120
- this.finishOk = true;
121
- return;
122
- }
123
-
124
- // Final edit with approval buttons if present.
125
- // Skip the edit when text hasn't changed since the last successful
126
- // delivery and there are no approval buttons to attach — sending the
127
- // same text again would trigger Telegram's "message is not modified"
128
- // 400 error.
129
- if (this.currentMessageId && (this.currentMessageText || approval)) {
130
- if (!approval && this.currentMessageText === this.lastSentText) {
131
- this.finishOk = true;
132
- return;
133
- }
134
-
135
- // Enforce Telegram length limits: if the final text exceeds the max,
136
- // split it the same way flushEdit() does — finalize the current message
137
- // with text up to the limit, then send the overflow as a new message.
138
- if (this.currentMessageText.length > TELEGRAM_MAX_TEXT_LEN) {
139
- const cutText = this.currentMessageText.slice(0, TELEGRAM_MAX_TEXT_LEN);
140
- const overflow = this.currentMessageText.slice(TELEGRAM_MAX_TEXT_LEN);
141
-
142
- // Edit existing message with truncated text (no approval — it goes on the final message)
143
- await deliverChannelReply(
144
- this.opts.callbackUrl,
145
- {
146
- chatId: this.opts.chatId,
147
- text: cutText,
148
- messageId: this.currentMessageId,
149
- assistantId: this.opts.assistantId,
150
- },
151
- this.opts.mintBearerToken(),
152
- );
153
- this.lastSentText = cutText;
154
-
155
- // Send overflow (with approval buttons if present) as a new message
156
- await this.sendNewMessage(overflow, approval);
157
- this.finishOk = true;
158
- return;
159
- }
160
-
161
- await deliverChannelReply(
162
- this.opts.callbackUrl,
163
- {
164
- chatId: this.opts.chatId,
165
- text: this.currentMessageText,
166
- messageId: this.currentMessageId,
167
- assistantId: this.opts.assistantId,
168
- approval,
169
- },
170
- this.opts.mintBearerToken(),
171
- );
172
- this.lastSentText = this.currentMessageText;
173
- }
174
- this.finishOk = true;
175
- }
176
-
177
- get hasDeliveredText(): boolean {
178
- return this.textDelivered;
179
- }
180
-
181
- /** True only when finish() completed without throwing. */
182
- get finishSucceeded(): boolean {
183
- return this.finishOk;
184
- }
185
-
186
- // ── Internal ────────────────────────────────────────────────────────
187
-
188
- private onTextDelta(text: string): void {
189
- this.buffer += text;
190
- if (
191
- !this.currentMessageId &&
192
- !this.initialSendInFlight &&
193
- !this.textDelivered &&
194
- this.buffer.length + this.currentMessageText.length >= MIN_INITIAL_CHARS
195
- ) {
196
- this.sendInitialMessage();
197
- } else if (this.currentMessageId) {
198
- this.scheduleEdit();
199
- }
200
- }
201
-
202
- private sendInitialMessage(): void {
203
- this.initialSendInFlight = true;
204
- this.currentMessageText += this.buffer;
205
- this.buffer = "";
206
-
207
- const textSnapshot = this.currentMessageText;
208
- const promise = deliverChannelReply(
209
- this.opts.callbackUrl,
210
- {
211
- chatId: this.opts.chatId,
212
- text: textSnapshot,
213
- assistantId: this.opts.assistantId,
214
- },
215
- this.opts.mintBearerToken(),
216
- );
217
- this.initialSendPromise = promise;
218
-
219
- promise
220
- .then((result) => {
221
- if (result.messageId) {
222
- this.currentMessageId = result.messageId;
223
- } else {
224
- log.warn(
225
- { chatId: this.opts.chatId },
226
- "Initial streaming send succeeded but no messageId in response",
227
- );
228
- }
229
- this.textDelivered = true;
230
- this.lastSentText = textSnapshot;
231
- this.messageCount++;
232
- this.lastEditAt = Date.now();
233
- this.initialSendInFlight = false;
234
- })
235
- .catch((err) => {
236
- log.error(
237
- { err, chatId: this.opts.chatId },
238
- "Failed to send initial streaming message",
239
- );
240
- // Push the initial text back into the buffer so finish() can send
241
- // the full accumulated text as a single message
242
- this.buffer = this.currentMessageText + this.buffer;
243
- this.currentMessageText = "";
244
- // Fall back: clear guard so future deltas can retry
245
- this.initialSendInFlight = false;
246
- this.currentMessageId = null;
247
- });
248
- }
249
-
250
- private scheduleEdit(): void {
251
- const elapsed = Date.now() - this.lastEditAt;
252
- if (elapsed >= EDIT_THROTTLE_MS) {
253
- this.flushEdit();
254
- } else if (!this.editTimer) {
255
- const remaining = EDIT_THROTTLE_MS - elapsed;
256
- this.editTimer = setTimeout(() => this.flushEdit(), remaining);
257
- }
258
- }
259
-
260
- private flushEdit(): void {
261
- if (this.editTimer) {
262
- clearTimeout(this.editTimer);
263
- this.editTimer = null;
264
- }
265
- if (this.buffer.length === 0) return;
266
-
267
- this.currentMessageText += this.buffer;
268
- this.buffer = "";
269
-
270
- if (this.currentMessageText.length > TELEGRAM_MAX_TEXT_LEN) {
271
- // Split: finalize current message with text up to the limit,
272
- // then send the remainder as a new message.
273
- const cutText = this.currentMessageText.slice(0, TELEGRAM_MAX_TEXT_LEN);
274
- const overflow = this.currentMessageText.slice(TELEGRAM_MAX_TEXT_LEN);
275
-
276
- if (this.currentMessageId) {
277
- deliverChannelReply(
278
- this.opts.callbackUrl,
279
- {
280
- chatId: this.opts.chatId,
281
- text: cutText,
282
- messageId: this.currentMessageId,
283
- assistantId: this.opts.assistantId,
284
- },
285
- this.opts.mintBearerToken(),
286
- )
287
- .then(() => {
288
- this.lastSentText = cutText;
289
- })
290
- .catch((err) => {
291
- log.error(
292
- { err, chatId: this.opts.chatId },
293
- "Failed to edit message at split boundary",
294
- );
295
- });
296
- }
297
-
298
- // Reset and send overflow as a new message
299
- this.currentMessageId = null;
300
- this.currentMessageText = overflow;
301
- const overflowSnapshot = this.currentMessageText;
302
-
303
- deliverChannelReply(
304
- this.opts.callbackUrl,
305
- {
306
- chatId: this.opts.chatId,
307
- text: overflowSnapshot,
308
- assistantId: this.opts.assistantId,
309
- },
310
- this.opts.mintBearerToken(),
311
- )
312
- .then((result) => {
313
- if (result.messageId) {
314
- this.currentMessageId = result.messageId;
315
- }
316
- this.lastSentText = overflowSnapshot;
317
- this.messageCount++;
318
- this.lastEditAt = Date.now();
319
- })
320
- .catch((err) => {
321
- log.error(
322
- { err, chatId: this.opts.chatId },
323
- "Failed to send overflow message",
324
- );
325
- this.currentMessageId = null;
326
- });
327
- return;
328
- }
329
-
330
- if (this.currentMessageId) {
331
- const textSnapshot = this.currentMessageText;
332
- deliverChannelReply(
333
- this.opts.callbackUrl,
334
- {
335
- chatId: this.opts.chatId,
336
- text: this.currentMessageText,
337
- messageId: this.currentMessageId,
338
- assistantId: this.opts.assistantId,
339
- },
340
- this.opts.mintBearerToken(),
341
- )
342
- .then(() => {
343
- this.lastSentText = textSnapshot;
344
- })
345
- .catch((err) => {
346
- log.error(
347
- { err, chatId: this.opts.chatId },
348
- "Failed to edit streaming message",
349
- );
350
- });
351
- }
352
- this.lastEditAt = Date.now();
353
- }
354
-
355
- private async sendNewMessage(
356
- text: string,
357
- approval?: ApprovalUIMetadata,
358
- ): Promise<void> {
359
- try {
360
- const result = await deliverChannelReply(
361
- this.opts.callbackUrl,
362
- {
363
- chatId: this.opts.chatId,
364
- text,
365
- assistantId: this.opts.assistantId,
366
- approval,
367
- },
368
- this.opts.mintBearerToken(),
369
- );
370
- if (result.messageId) {
371
- this.currentMessageId = result.messageId;
372
- }
373
- this.textDelivered = true;
374
- this.lastSentText = text;
375
- this.messageCount++;
376
- } catch (err) {
377
- log.error(
378
- { err, chatId: this.opts.chatId },
379
- "Failed to send new streaming message",
380
- );
381
- }
382
- }
383
- }
@@ -1,61 +0,0 @@
1
- /**
2
- * computer_use_request_control tool definition.
3
- *
4
- * This tool allows a text_qa session to escalate to foreground computer use
5
- * when the user explicitly requests it (e.g. "go ahead and do it", "take over
6
- * for 20 seconds"). It is a proxy tool — execution is handled by the session's
7
- * surfaceProxyResolver, which creates a CU session and sends a task_routed
8
- * message to the client.
9
- *
10
- * This tool is only available to text_qa sessions. It must NOT be added to
11
- * CU sessions (that would be recursive).
12
- *
13
- * Part of the bundled computer-use skill. The definition here is imported by
14
- * buildToolDefinitions() so text_qa sessions can include it without
15
- * preactivating the entire skill.
16
- */
17
-
18
- import { RiskLevel } from "../../permissions/types.js";
19
- import type { ToolDefinition } from "../../providers/types.js";
20
- import type { Tool, ToolExecutionResult } from "../types.js";
21
-
22
- export const requestComputerControlTool: Tool = {
23
- name: "computer_use_request_control",
24
- description:
25
- "Escalate to foreground computer use. Call this when the user explicitly asks you to " +
26
- 'take control of their computer to perform a task (e.g. "go ahead and do it", ' +
27
- '"take over", "open that for me"). Provide a concise description of the task ' +
28
- "that computer use should accomplish.",
29
- category: "computer-use",
30
- defaultRiskLevel: RiskLevel.Low,
31
- executionMode: "proxy",
32
-
33
- getDefinition(): ToolDefinition {
34
- return {
35
- name: this.name,
36
- description: this.description,
37
- input_schema: {
38
- type: "object",
39
- properties: {
40
- task: {
41
- type: "string",
42
- description:
43
- "Concise description of what computer use should accomplish",
44
- },
45
- reason: {
46
- type: "string",
47
- description:
48
- "Brief non-technical explanation of what you are doing and why, shown to the user as a status update. Use simple language a non-technical person would understand.",
49
- },
50
- },
51
- required: ["task"],
52
- },
53
- };
54
- },
55
-
56
- execute(): Promise<ToolExecutionResult> {
57
- throw new Error(
58
- "Proxy tool: execution must be forwarded via surfaceProxyResolver",
59
- );
60
- },
61
- };