@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
@@ -0,0 +1,60 @@
1
+ import type { DrizzleDb } from "../db-connection.js";
2
+
3
+ /**
4
+ * OAuth provider, app, and connection tables.
5
+ * Creates tables in FK-dependency order: providers → apps → connections.
6
+ */
7
+ export function createOAuthTables(database: DrizzleDb): void {
8
+ database.run(/*sql*/ `
9
+ CREATE TABLE IF NOT EXISTS oauth_providers (
10
+ provider_key TEXT PRIMARY KEY,
11
+ auth_url TEXT NOT NULL,
12
+ token_url TEXT NOT NULL,
13
+ token_endpoint_auth_method TEXT,
14
+ userinfo_url TEXT,
15
+ base_url TEXT,
16
+ default_scopes TEXT NOT NULL DEFAULT '[]',
17
+ scope_policy TEXT NOT NULL DEFAULT '{}',
18
+ extra_params TEXT,
19
+ callback_transport TEXT,
20
+ loopback_port INTEGER,
21
+ created_at INTEGER NOT NULL,
22
+ updated_at INTEGER NOT NULL
23
+ )
24
+ `);
25
+
26
+ database.run(/*sql*/ `
27
+ CREATE TABLE IF NOT EXISTS oauth_apps (
28
+ id TEXT PRIMARY KEY,
29
+ provider_key TEXT NOT NULL REFERENCES oauth_providers(provider_key),
30
+ client_id TEXT NOT NULL,
31
+ created_at INTEGER NOT NULL,
32
+ updated_at INTEGER NOT NULL
33
+ )
34
+ `);
35
+
36
+ database.run(/*sql*/ `
37
+ CREATE TABLE IF NOT EXISTS oauth_connections (
38
+ id TEXT PRIMARY KEY,
39
+ oauth_app_id TEXT NOT NULL REFERENCES oauth_apps(id),
40
+ provider_key TEXT NOT NULL,
41
+ account_info TEXT,
42
+ granted_scopes TEXT NOT NULL DEFAULT '[]',
43
+ expires_at INTEGER,
44
+ has_refresh_token INTEGER NOT NULL DEFAULT 0,
45
+ status TEXT NOT NULL DEFAULT 'active',
46
+ label TEXT,
47
+ metadata TEXT,
48
+ created_at INTEGER NOT NULL,
49
+ updated_at INTEGER NOT NULL
50
+ )
51
+ `);
52
+
53
+ database.run(
54
+ /*sql*/ `CREATE UNIQUE INDEX IF NOT EXISTS idx_oauth_apps_provider_client ON oauth_apps(provider_key, client_id)`,
55
+ );
56
+
57
+ database.run(
58
+ /*sql*/ `CREATE INDEX IF NOT EXISTS idx_oauth_connections_provider_key ON oauth_connections(provider_key)`,
59
+ );
60
+ }
@@ -90,6 +90,7 @@ export { migrateDropAccountsTable } from "./145-drop-accounts-table.js";
90
90
  export { migrateScheduleOneShotRouting } from "./146-schedule-oneshot-routing.js";
91
91
  export { migrateRemindersToSchedules } from "./147-migrate-reminders-to-schedules.js";
92
92
  export { migrateDropRemindersTable } from "./148-drop-reminders-table.js";
93
+ export { createOAuthTables } from "./149-oauth-tables.js";
93
94
  export {
94
95
  MIGRATION_REGISTRY,
95
96
  type MigrationRegistryEntry,
@@ -27,7 +27,7 @@ export const guardianActionRequests = sqliteTable(
27
27
  followupState: text("followup_state").notNull().default("none"), // none | awaiting_guardian_choice | dispatching | completed | declined | failed
28
28
  lateAnswerText: text("late_answer_text"),
29
29
  lateAnsweredAt: integer("late_answered_at"),
30
- followupAction: text("followup_action"), // call_back | message_back | decline
30
+ followupAction: text("followup_action"), // call_back | decline
31
31
  followupCompletedAt: integer("followup_completed_at"),
32
32
  toolName: text("tool_name"), // tool identity for tool-approval requests
33
33
  inputDigest: text("input_digest"), // canonical SHA-256 digest of tool input
@@ -5,4 +5,5 @@ export * from "./guardian.js";
5
5
  export * from "./infrastructure.js";
6
6
  export * from "./memory-core.js";
7
7
  export * from "./notifications.js";
8
+ export * from "./oauth.js";
8
9
  export * from "./tasks.js";
@@ -0,0 +1,65 @@
1
+ import {
2
+ index,
3
+ integer,
4
+ sqliteTable,
5
+ text,
6
+ uniqueIndex,
7
+ } from "drizzle-orm/sqlite-core";
8
+
9
+ export const oauthProviders = sqliteTable("oauth_providers", {
10
+ providerKey: text("provider_key").primaryKey(),
11
+ authUrl: text("auth_url").notNull(),
12
+ tokenUrl: text("token_url").notNull(),
13
+ tokenEndpointAuthMethod: text("token_endpoint_auth_method"),
14
+ userinfoUrl: text("userinfo_url"),
15
+ baseUrl: text("base_url"),
16
+ defaultScopes: text("default_scopes").notNull().default("[]"),
17
+ scopePolicy: text("scope_policy").notNull().default("{}"),
18
+ extraParams: text("extra_params"),
19
+ callbackTransport: text("callback_transport"),
20
+ loopbackPort: integer("loopback_port"),
21
+ createdAt: integer("created_at").notNull(),
22
+ updatedAt: integer("updated_at").notNull(),
23
+ });
24
+
25
+ export const oauthApps = sqliteTable(
26
+ "oauth_apps",
27
+ {
28
+ id: text("id").primaryKey(),
29
+ providerKey: text("provider_key")
30
+ .notNull()
31
+ .references(() => oauthProviders.providerKey),
32
+ clientId: text("client_id").notNull(),
33
+ createdAt: integer("created_at").notNull(),
34
+ updatedAt: integer("updated_at").notNull(),
35
+ },
36
+ (table) => [
37
+ uniqueIndex("idx_oauth_apps_provider_client").on(
38
+ table.providerKey,
39
+ table.clientId,
40
+ ),
41
+ ],
42
+ );
43
+
44
+ export const oauthConnections = sqliteTable(
45
+ "oauth_connections",
46
+ {
47
+ id: text("id").primaryKey(),
48
+ oauthAppId: text("oauth_app_id")
49
+ .notNull()
50
+ .references(() => oauthApps.id),
51
+ providerKey: text("provider_key").notNull(),
52
+ accountInfo: text("account_info"),
53
+ grantedScopes: text("granted_scopes").notNull().default("[]"),
54
+ expiresAt: integer("expires_at"),
55
+ hasRefreshToken: integer("has_refresh_token").notNull().default(0),
56
+ status: text("status").notNull().default("active"),
57
+ label: text("label"),
58
+ metadata: text("metadata"),
59
+ createdAt: integer("created_at").notNull(),
60
+ updatedAt: integer("updated_at").notNull(),
61
+ },
62
+ (table) => [
63
+ index("idx_oauth_connections_provider_key").on(table.providerKey),
64
+ ],
65
+ );
@@ -5,6 +5,7 @@
5
5
  * implementing one adapter file + an OAuth setup skill.
6
6
  */
7
7
 
8
+ import type { OAuthConnection } from "../oauth/connection.js";
8
9
  import type {
9
10
  ArchiveResult,
10
11
  ConnectionInfo,
@@ -29,23 +30,25 @@ export interface MessagingProvider {
29
30
 
30
31
  // ── Universal operations (every platform must implement) ──────────
31
32
 
32
- testConnection(token: string): Promise<ConnectionInfo>;
33
+ testConnection(
34
+ connectionOrToken: OAuthConnection | string,
35
+ ): Promise<ConnectionInfo>;
33
36
  listConversations(
34
- token: string,
37
+ connectionOrToken: OAuthConnection | string,
35
38
  options?: ListOptions,
36
39
  ): Promise<Conversation[]>;
37
40
  getHistory(
38
- token: string,
41
+ connectionOrToken: OAuthConnection | string,
39
42
  conversationId: string,
40
43
  options?: HistoryOptions,
41
44
  ): Promise<Message[]>;
42
45
  search(
43
- token: string,
46
+ connectionOrToken: OAuthConnection | string,
44
47
  query: string,
45
48
  options?: SearchOptions,
46
49
  ): Promise<SearchResult>;
47
50
  sendMessage(
48
- token: string,
51
+ connectionOrToken: OAuthConnection | string,
49
52
  conversationId: string,
50
53
  text: string,
51
54
  options?: SendOptions,
@@ -54,32 +57,35 @@ export interface MessagingProvider {
54
57
  // ── Optional operations (platforms implement what they support) ───
55
58
 
56
59
  getThreadReplies?(
57
- token: string,
60
+ connectionOrToken: OAuthConnection | string,
58
61
  conversationId: string,
59
62
  threadId: string,
60
63
  options?: HistoryOptions,
61
64
  ): Promise<Message[]>;
62
65
  markRead?(
63
- token: string,
66
+ connectionOrToken: OAuthConnection | string,
64
67
  conversationId: string,
65
68
  messageId?: string,
66
69
  ): Promise<void>;
67
70
 
68
71
  /** Scan messages and group by sender for bulk cleanup (e.g. newsletter decluttering). */
69
72
  senderDigest?(
70
- token: string,
73
+ connectionOrToken: OAuthConnection | string,
71
74
  query: string,
72
75
  options?: { maxMessages?: number; maxSenders?: number; pageToken?: string },
73
76
  ): Promise<SenderDigestResult>;
74
77
  /** Archive messages matching a search query. */
75
- archiveByQuery?(token: string, query: string): Promise<ArchiveResult>;
78
+ archiveByQuery?(
79
+ connectionOrToken: OAuthConnection | string,
80
+ query: string,
81
+ ): Promise<ArchiveResult>;
76
82
 
77
83
  /**
78
84
  * Override the default credential check used by getConnectedProviders().
79
- * When present, the registry calls this instead of looking for
80
- * credential:${credentialService}:access_token. Useful for providers
81
- * that don't use OAuth (e.g. Telegram bot tokens stored under a
82
- * non-standard key).
85
+ * When present, the registry calls this instead of checking for an
86
+ * active oauth-store connection via isProviderConnected(). Useful
87
+ * for providers that don't use OAuth (e.g. Telegram bot tokens stored
88
+ * under a non-standard key).
83
89
  */
84
90
  isConnected?(): boolean;
85
91
 
@@ -5,6 +5,7 @@
5
5
  * and implements the MessagingProvider interface.
6
6
  */
7
7
 
8
+ import type { OAuthConnection } from "../../../oauth/connection.js";
8
9
  import type { MessagingProvider } from "../../provider.js";
9
10
  import type {
10
11
  ArchiveResult,
@@ -94,8 +95,11 @@ export const gmailMessagingProvider: MessagingProvider = {
94
95
  "unsubscribe",
95
96
  ]),
96
97
 
97
- async testConnection(token: string): Promise<ConnectionInfo> {
98
- const profile = await gmail.getProfile(token);
98
+ async testConnection(
99
+ connectionOrToken: OAuthConnection | string,
100
+ ): Promise<ConnectionInfo> {
101
+ const connection = connectionOrToken as OAuthConnection;
102
+ const profile = await gmail.getProfile(connection);
99
103
  return {
100
104
  connected: true,
101
105
  user: profile.emailAddress,
@@ -108,11 +112,12 @@ export const gmailMessagingProvider: MessagingProvider = {
108
112
  },
109
113
 
110
114
  async listConversations(
111
- token: string,
115
+ connectionOrToken: OAuthConnection | string,
112
116
  _options?: ListOptions,
113
117
  ): Promise<Conversation[]> {
118
+ const connection = connectionOrToken as OAuthConnection;
114
119
  // Gmail "conversations" are modeled as labels with unread counts
115
- const labels = await gmail.listLabels(token);
120
+ const labels = await gmail.listLabels(connection);
116
121
  const conversations: Conversation[] = [];
117
122
 
118
123
  for (const label of labels) {
@@ -151,14 +156,15 @@ export const gmailMessagingProvider: MessagingProvider = {
151
156
  },
152
157
 
153
158
  async getHistory(
154
- token: string,
159
+ connectionOrToken: OAuthConnection | string,
155
160
  conversationId: string,
156
161
  options?: HistoryOptions,
157
162
  ): Promise<Message[]> {
163
+ const connection = connectionOrToken as OAuthConnection;
158
164
  // conversationId is a label ID — list messages in that label
159
165
  const limit = options?.limit ?? 50;
160
166
  const listResult = await gmail.listMessages(
161
- token,
167
+ connection,
162
168
  undefined,
163
169
  limit,
164
170
  undefined,
@@ -168,7 +174,7 @@ export const gmailMessagingProvider: MessagingProvider = {
168
174
  if (!listResult.messages?.length) return [];
169
175
 
170
176
  const messages = await gmail.batchGetMessages(
171
- token,
177
+ connection,
172
178
  listResult.messages.map((m) => m.id),
173
179
  "full",
174
180
  );
@@ -177,19 +183,20 @@ export const gmailMessagingProvider: MessagingProvider = {
177
183
  },
178
184
 
179
185
  async search(
180
- token: string,
186
+ connectionOrToken: OAuthConnection | string,
181
187
  query: string,
182
188
  options?: SearchOptions,
183
189
  ): Promise<SearchResult> {
190
+ const connection = connectionOrToken as OAuthConnection;
184
191
  const count = options?.count ?? 20;
185
- const listResult = await gmail.listMessages(token, query, count);
192
+ const listResult = await gmail.listMessages(connection, query, count);
186
193
 
187
194
  if (!listResult.messages?.length) {
188
195
  return { total: 0, messages: [], hasMore: false };
189
196
  }
190
197
 
191
198
  const messages = await gmail.batchGetMessages(
192
- token,
199
+ connection,
193
200
  listResult.messages.map((m) => m.id),
194
201
  "full",
195
202
  );
@@ -203,16 +210,17 @@ export const gmailMessagingProvider: MessagingProvider = {
203
210
  },
204
211
 
205
212
  async sendMessage(
206
- token: string,
213
+ connectionOrToken: OAuthConnection | string,
207
214
  conversationId: string,
208
215
  text: string,
209
216
  options?: SendOptions,
210
217
  ): Promise<SendResult> {
218
+ const connection = connectionOrToken as OAuthConnection;
211
219
  // conversationId is the recipient email for Gmail
212
220
  const to = conversationId;
213
221
  const subject = options?.subject ?? "";
214
222
  const msg = await gmail.sendMessage(
215
- token,
223
+ connection,
216
224
  to,
217
225
  subject,
218
226
  text,
@@ -228,15 +236,16 @@ export const gmailMessagingProvider: MessagingProvider = {
228
236
  },
229
237
 
230
238
  async getThreadReplies(
231
- token: string,
239
+ connectionOrToken: OAuthConnection | string,
232
240
  _conversationId: string,
233
241
  threadId: string,
234
242
  options?: HistoryOptions,
235
243
  ): Promise<Message[]> {
244
+ const connection = connectionOrToken as OAuthConnection;
236
245
  // Get all messages in a Gmail thread
237
246
  const limit = options?.limit ?? 50;
238
247
  const listResult = await gmail.listMessages(
239
- token,
248
+ connection,
240
249
  `thread:${threadId}`,
241
250
  limit,
242
251
  );
@@ -244,7 +253,7 @@ export const gmailMessagingProvider: MessagingProvider = {
244
253
  if (!listResult.messages?.length) return [];
245
254
 
246
255
  const messages = await gmail.batchGetMessages(
247
- token,
256
+ connection,
248
257
  listResult.messages.map((m) => m.id),
249
258
  "full",
250
259
  );
@@ -253,19 +262,23 @@ export const gmailMessagingProvider: MessagingProvider = {
253
262
  },
254
263
 
255
264
  async markRead(
256
- token: string,
265
+ connectionOrToken: OAuthConnection | string,
257
266
  _conversationId: string,
258
267
  messageId?: string,
259
268
  ): Promise<void> {
269
+ const connection = connectionOrToken as OAuthConnection;
260
270
  if (!messageId) return;
261
- await gmail.modifyMessage(token, messageId, { removeLabelIds: ["UNREAD"] });
271
+ await gmail.modifyMessage(connection, messageId, {
272
+ removeLabelIds: ["UNREAD"],
273
+ });
262
274
  },
263
275
 
264
276
  async senderDigest(
265
- token: string,
277
+ connectionOrToken: OAuthConnection | string,
266
278
  query: string,
267
279
  options?: { maxMessages?: number; maxSenders?: number; pageToken?: string },
268
280
  ): Promise<SenderDigestResult> {
281
+ const connection = connectionOrToken as OAuthConnection;
269
282
  const maxMessages = Math.min(options?.maxMessages ?? 5000, 5000);
270
283
  const maxSenders = options?.maxSenders ?? 30;
271
284
  const maxIdsPerSender = 5000;
@@ -285,7 +298,7 @@ export const gmailMessagingProvider: MessagingProvider = {
285
298
  }
286
299
  const pageSize = Math.min(100, maxMessages - allMessageIds.length);
287
300
  const listResp = await gmail.listMessages(
288
- token,
301
+ connection,
289
302
  query,
290
303
  pageSize,
291
304
  pageToken,
@@ -295,7 +308,7 @@ export const gmailMessagingProvider: MessagingProvider = {
295
308
  allMessageIds.push(...ids);
296
309
  fetchPromises.push(
297
310
  gmail.batchGetMessages(
298
- token,
311
+ connection,
299
312
  ids,
300
313
  "metadata",
301
314
  metadataHeaders,
@@ -409,7 +422,11 @@ export const gmailMessagingProvider: MessagingProvider = {
409
422
  };
410
423
  },
411
424
 
412
- async archiveByQuery(token: string, query: string): Promise<ArchiveResult> {
425
+ async archiveByQuery(
426
+ connectionOrToken: OAuthConnection | string,
427
+ query: string,
428
+ ): Promise<ArchiveResult> {
429
+ const connection = connectionOrToken as OAuthConnection;
413
430
  const maxMessages = 5000;
414
431
  const batchModifyLimit = 1000;
415
432
 
@@ -419,7 +436,7 @@ export const gmailMessagingProvider: MessagingProvider = {
419
436
 
420
437
  while (allMessageIds.length < maxMessages) {
421
438
  const listResp = await gmail.listMessages(
422
- token,
439
+ connection,
423
440
  query,
424
441
  Math.min(500, maxMessages - allMessageIds.length),
425
442
  pageToken,
@@ -441,7 +458,7 @@ export const gmailMessagingProvider: MessagingProvider = {
441
458
 
442
459
  for (let i = 0; i < allMessageIds.length; i += batchModifyLimit) {
443
460
  const chunk = allMessageIds.slice(i, i + batchModifyLimit);
444
- await gmail.batchModifyMessages(token, chunk, {
461
+ await gmail.batchModifyMessages(connection, chunk, {
445
462
  removeLabelIds: ["INBOX"],
446
463
  });
447
464
  }