@vellumai/assistant 0.4.41 → 0.4.43

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 (843) hide show
  1. package/.env.example +1 -6
  2. package/.prettierignore +3 -0
  3. package/ARCHITECTURE.md +131 -393
  4. package/Dockerfile +0 -1
  5. package/README.md +73 -83
  6. package/bun.lock +8 -2
  7. package/docs/architecture/integrations.md +16 -21
  8. package/docs/architecture/memory.md +1 -1
  9. package/docs/architecture/scheduling.md +63 -63
  10. package/docs/architecture/security.md +3 -3
  11. package/docs/runbook-trusted-contacts.md +11 -12
  12. package/docs/trusted-contact-access.md +39 -39
  13. package/package.json +5 -8
  14. package/src/__tests__/access-request-decision.test.ts +4 -4
  15. package/src/__tests__/active-skill-tools.test.ts +49 -34
  16. package/src/__tests__/actor-token-service.test.ts +55 -85
  17. package/src/__tests__/amazon-cdp-integration.test.ts +14 -26
  18. package/src/__tests__/app-bundler.test.ts +14 -368
  19. package/src/__tests__/app-compiler.test.ts +0 -1
  20. package/src/__tests__/app-executors.test.ts +10 -1
  21. package/src/__tests__/approval-hardcoded-copy-guard.test.ts +1 -1
  22. package/src/__tests__/approval-primitive.test.ts +2 -4
  23. package/src/__tests__/approval-routes-http.test.ts +1 -1
  24. package/src/__tests__/asset-materialize-tool.test.ts +1 -4
  25. package/src/__tests__/asset-search-tool.test.ts +1 -4
  26. package/src/__tests__/assistant-attachments.test.ts +23 -0
  27. package/src/__tests__/assistant-feature-flags-integration.test.ts +4 -8
  28. package/src/__tests__/assistant-id-boundary-guard.test.ts +5 -5
  29. package/src/__tests__/attachments-store.test.ts +1 -4
  30. package/src/__tests__/avatar-e2e.test.ts +43 -23
  31. package/src/__tests__/browser-fill-credential.test.ts +1 -1
  32. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +2 -9
  33. package/src/__tests__/call-controller.test.ts +4 -8
  34. package/src/__tests__/call-conversation-messages.test.ts +1 -1
  35. package/src/__tests__/call-domain.test.ts +250 -8
  36. package/src/__tests__/call-pointer-message-composer.test.ts +14 -14
  37. package/src/__tests__/call-pointer-messages.test.ts +7 -11
  38. package/src/__tests__/call-recovery.test.ts +47 -0
  39. package/src/__tests__/call-routes-http.test.ts +13 -0
  40. package/src/__tests__/call-start-guardian-guard.test.ts +1 -1
  41. package/src/__tests__/callback-handoff-copy.test.ts +5 -5
  42. package/src/__tests__/canonical-guardian-store.test.ts +3 -3
  43. package/src/__tests__/channel-approval-routes.test.ts +101 -134
  44. package/src/__tests__/channel-approval.test.ts +0 -201
  45. package/src/__tests__/channel-approvals.test.ts +2 -2
  46. package/src/__tests__/channel-delivery-store.test.ts +16 -24
  47. package/src/__tests__/channel-guardian.test.ts +641 -740
  48. package/src/__tests__/channel-invite-transport.test.ts +1 -2
  49. package/src/__tests__/channel-policy.test.ts +9 -12
  50. package/src/__tests__/channel-readiness-service.test.ts +156 -45
  51. package/src/__tests__/channel-reply-delivery.test.ts +3 -3
  52. package/src/__tests__/channel-retry-sweep.test.ts +7 -7
  53. package/src/__tests__/checker.test.ts +10 -7
  54. package/src/__tests__/chrome-cdp.test.ts +57 -17
  55. package/src/__tests__/cli-help-reference-sync.test.ts +26 -0
  56. package/src/__tests__/compaction.benchmark.test.ts +25 -5
  57. package/src/__tests__/computer-use-session-lifecycle.test.ts +1 -1
  58. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  59. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +1 -1
  60. package/src/__tests__/config-loader-backfill.test.ts +310 -0
  61. package/src/__tests__/config-watcher.test.ts +1 -5
  62. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +3 -5
  63. package/src/__tests__/connection-policy.test.ts +3 -62
  64. package/src/__tests__/contacts-tools.test.ts +0 -2
  65. package/src/__tests__/context-memory-e2e.test.ts +11 -7
  66. package/src/__tests__/context-overflow-policy.test.ts +2 -2
  67. package/src/__tests__/context-window-manager.test.ts +220 -61
  68. package/src/__tests__/conversation-attention-store.test.ts +178 -2
  69. package/src/__tests__/conversation-attention-telegram.test.ts +8 -11
  70. package/src/__tests__/conversation-pairing.test.ts +14 -14
  71. package/src/__tests__/conversation-routes-guardian-reply.test.ts +1 -1
  72. package/src/__tests__/conversation-store.test.ts +2 -2
  73. package/src/__tests__/conversation-unread-route.test.ts +155 -0
  74. package/src/__tests__/credential-metadata-store.test.ts +0 -2
  75. package/src/__tests__/credential-security-invariants.test.ts +9 -16
  76. package/src/__tests__/credentials-cli.test.ts +49 -5
  77. package/src/__tests__/daemon-assistant-events.test.ts +4 -22
  78. package/src/__tests__/db-migration-rollback.test.ts +2 -2
  79. package/src/__tests__/deterministic-verification-control-plane.test.ts +19 -19
  80. package/src/__tests__/dictation-mode-detection.test.ts +1 -1
  81. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  82. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +2 -6
  83. package/src/__tests__/email-cli.test.ts +12 -12
  84. package/src/__tests__/email-service-config-fallback.test.ts +1 -1
  85. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -18
  86. package/src/__tests__/event-bus.test.ts +0 -1
  87. package/src/__tests__/followup-tools.test.ts +0 -2
  88. package/src/__tests__/gateway-client-managed-outbound.test.ts +6 -6
  89. package/src/__tests__/gateway-only-enforcement.test.ts +13 -77
  90. package/src/__tests__/gateway-only-guard.test.ts +5 -0
  91. package/src/__tests__/guardian-action-conversation-turn.test.ts +3 -3
  92. package/src/__tests__/guardian-action-followup-executor.test.ts +29 -94
  93. package/src/__tests__/guardian-action-followup-store.test.ts +2 -12
  94. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +48 -194
  95. package/src/__tests__/guardian-action-late-reply.test.ts +12 -12
  96. package/src/__tests__/guardian-action-store.test.ts +2 -2
  97. package/src/__tests__/guardian-action-sweep.test.ts +5 -5
  98. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +1 -3
  99. package/src/__tests__/guardian-dispatch.test.ts +5 -46
  100. package/src/__tests__/guardian-grant-minting.test.ts +5 -44
  101. package/src/__tests__/guardian-outbound-http.test.ts +95 -114
  102. package/src/__tests__/guardian-question-mode.test.ts +1 -4
  103. package/src/__tests__/guardian-routing-invariants.test.ts +5 -13
  104. package/src/__tests__/guardian-routing-state.test.ts +3 -3
  105. package/src/__tests__/guardian-verification-voice-binding.test.ts +64 -7
  106. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +2 -2
  107. package/src/__tests__/handle-user-message-secret-resume.test.ts +3 -5
  108. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +16 -34
  109. package/src/__tests__/headless-browser-interactions.test.ts +1 -1
  110. package/src/__tests__/headless-browser-navigate.test.ts +1 -1
  111. package/src/__tests__/headless-browser-read-tools.test.ts +1 -1
  112. package/src/__tests__/headless-browser-snapshot.test.ts +1 -1
  113. package/src/__tests__/heartbeat-service.test.ts +1 -1
  114. package/src/__tests__/home-base-bootstrap.test.ts +0 -2
  115. package/src/__tests__/host-shell-tool.test.ts +3 -12
  116. package/src/__tests__/inbound-invite-redemption.test.ts +2 -2
  117. package/src/__tests__/ingress-url-consistency.test.ts +0 -64
  118. package/src/__tests__/integration-status.test.ts +8 -8
  119. package/src/__tests__/intent-routing.test.ts +9 -13
  120. package/src/__tests__/invite-redemption-service.test.ts +4 -4
  121. package/src/__tests__/invite-routes-http.test.ts +10 -10
  122. package/src/__tests__/llm-usage-store.test.ts +45 -9
  123. package/src/__tests__/local-gateway-health.test.ts +209 -0
  124. package/src/__tests__/managed-avatar-client.test.ts +23 -12
  125. package/src/__tests__/managed-skill-lifecycle.test.ts +1 -2
  126. package/src/__tests__/managed-store.test.ts +29 -12
  127. package/src/__tests__/managed-twitter-guardrails.test.ts +353 -0
  128. package/src/__tests__/mcp-cli.test.ts +1 -1
  129. package/src/__tests__/mcp-health-check.test.ts +1 -1
  130. package/src/__tests__/media-generate-image.test.ts +1 -1
  131. package/src/__tests__/media-reuse-story.e2e.test.ts +1 -4
  132. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +9 -6
  133. package/src/__tests__/memory-regressions.test.ts +1 -166
  134. package/src/__tests__/messaging-send-tool.test.ts +8 -4
  135. package/src/__tests__/migration-export-http.test.ts +2 -2
  136. package/src/__tests__/migration-transport.test.ts +44 -0
  137. package/src/__tests__/non-member-access-request.test.ts +49 -36
  138. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  139. package/src/__tests__/notification-decision-fallback.test.ts +2 -2
  140. package/src/__tests__/notification-decision-strategy.test.ts +4 -4
  141. package/src/__tests__/notification-deep-link.test.ts +3 -3
  142. package/src/__tests__/notification-guardian-path.test.ts +6 -44
  143. package/src/__tests__/notification-routing-intent.test.ts +11 -7
  144. package/src/__tests__/oauth-cli.test.ts +1 -1
  145. package/src/__tests__/onboarding-starter-tasks.test.ts +2 -6
  146. package/src/__tests__/onboarding-template-contract.test.ts +2 -2
  147. package/src/__tests__/platform.test.ts +168 -5
  148. package/src/__tests__/playbook-execution.test.ts +0 -2
  149. package/src/__tests__/playbook-tools.test.ts +0 -2
  150. package/src/__tests__/pricing.test.ts +125 -0
  151. package/src/__tests__/provider-error-scenarios.test.ts +9 -3
  152. package/src/__tests__/recording-handler.test.ts +46 -80
  153. package/src/__tests__/recording-state-machine.test.ts +112 -183
  154. package/src/__tests__/registry.test.ts +1 -1
  155. package/src/__tests__/relay-server.test.ts +69 -71
  156. package/src/__tests__/reminder-store.test.ts +3 -3
  157. package/src/__tests__/request-file-tool.test.ts +2 -2
  158. package/src/__tests__/ride-shotgun-handler.test.ts +2 -33
  159. package/src/__tests__/runtime-attachment-metadata.test.ts +3 -3
  160. package/src/__tests__/runtime-events-sse-parity.test.ts +1 -1
  161. package/src/__tests__/scaffold-managed-skill-tool.test.ts +4 -4
  162. package/src/__tests__/schedule-store.test.ts +13 -4
  163. package/src/__tests__/schedule-tools.test.ts +0 -2
  164. package/src/__tests__/scheduler-recurrence.test.ts +3 -4
  165. package/src/__tests__/scoped-approval-grants.test.ts +3 -5
  166. package/src/__tests__/scoped-grant-security-matrix.test.ts +6 -8
  167. package/src/__tests__/secret-prompt-log-hygiene.test.ts +1 -1
  168. package/src/__tests__/secret-response-routing.test.ts +1 -1
  169. package/src/__tests__/send-endpoint-busy.test.ts +1 -1
  170. package/src/__tests__/sequence-store.test.ts +0 -2
  171. package/src/__tests__/server-history-render.test.ts +2 -199
  172. package/src/__tests__/session-abort-tool-results.test.ts +9 -3
  173. package/src/__tests__/session-agent-loop.test.ts +107 -3
  174. package/src/__tests__/session-confirmation-signals.test.ts +10 -4
  175. package/src/__tests__/session-conflict-gate.test.ts +9 -3
  176. package/src/__tests__/session-init.benchmark.test.ts +22 -13
  177. package/src/__tests__/session-load-history-repair.test.ts +6 -3
  178. package/src/__tests__/session-pre-run-repair.test.ts +9 -3
  179. package/src/__tests__/session-profile-injection.test.ts +9 -3
  180. package/src/__tests__/session-provider-retry-repair.test.ts +10 -4
  181. package/src/__tests__/session-queue.test.ts +10 -4
  182. package/src/__tests__/session-runtime-assembly.test.ts +28 -18
  183. package/src/__tests__/session-skill-tools.test.ts +2 -3
  184. package/src/__tests__/session-slash-known.test.ts +11 -4
  185. package/src/__tests__/session-slash-queue.test.ts +11 -4
  186. package/src/__tests__/session-slash-unknown.test.ts +12 -4
  187. package/src/__tests__/session-surfaces-deselection.test.ts +2 -2
  188. package/src/__tests__/session-surfaces-task-progress.test.ts +3 -3
  189. package/src/__tests__/session-tool-setup-app-refresh.test.ts +1 -1
  190. package/src/__tests__/session-tool-setup-memory-scope.test.ts +1 -1
  191. package/src/__tests__/session-tool-setup-side-effect-flag.test.ts +1 -1
  192. package/src/__tests__/session-usage.test.ts +180 -0
  193. package/src/__tests__/session-workspace-cache-state.test.ts +8 -2
  194. package/src/__tests__/session-workspace-injection.test.ts +8 -2
  195. package/src/__tests__/session-workspace-tool-tracking.test.ts +8 -2
  196. package/src/__tests__/skill-feature-flags-integration.test.ts +5 -11
  197. package/src/__tests__/skill-feature-flags.test.ts +1 -0
  198. package/src/__tests__/skill-include-graph.test.ts +1 -0
  199. package/src/__tests__/skill-load-feature-flag.test.ts +3 -9
  200. package/src/__tests__/skill-load-tool.test.ts +90 -12
  201. package/src/__tests__/skill-projection-feature-flag.test.ts +14 -15
  202. package/src/__tests__/skills-uninstall.test.ts +131 -0
  203. package/src/__tests__/skills.test.ts +32 -16
  204. package/src/__tests__/slack-block-formatting.test.ts +1 -1
  205. package/src/__tests__/slack-channel-config.test.ts +71 -12
  206. package/src/__tests__/slack-inbound-verification.test.ts +7 -7
  207. package/src/__tests__/slack-share-routes.test.ts +1 -1
  208. package/src/__tests__/slack-skill.test.ts +2 -2
  209. package/src/__tests__/slash-commands-catalog.test.ts +1 -0
  210. package/src/__tests__/slash-commands-resolver.test.ts +1 -0
  211. package/src/__tests__/starter-task-flow.test.ts +1 -1
  212. package/src/__tests__/subagent-manager-notify.test.ts +1 -1
  213. package/src/__tests__/subagent-tools.test.ts +2 -2
  214. package/src/__tests__/system-prompt.test.ts +4 -8
  215. package/src/__tests__/task-compiler.test.ts +0 -2
  216. package/src/__tests__/task-management-tools.test.ts +0 -2
  217. package/src/__tests__/task-runner.test.ts +0 -2
  218. package/src/__tests__/task-scheduler.test.ts +2 -2
  219. package/src/__tests__/telegram-bot-username-resolution.test.ts +46 -44
  220. package/src/__tests__/terminal-tools.test.ts +1 -11
  221. package/src/__tests__/thread-seed-composer.test.ts +3 -1
  222. package/src/__tests__/tool-approval-handler.test.ts +5 -7
  223. package/src/__tests__/tool-executor.test.ts +2 -2
  224. package/src/__tests__/tool-grant-request-escalation.test.ts +3 -5
  225. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  226. package/src/__tests__/tool-profiling-listener.test.ts +1 -1
  227. package/src/__tests__/tool-trace-listener.test.ts +1 -2
  228. package/src/__tests__/trace-emitter.test.ts +1 -1
  229. package/src/__tests__/trust-context-guards.test.ts +1 -1
  230. package/src/__tests__/trust-store.test.ts +44 -395
  231. package/src/__tests__/trusted-contact-approval-notifier.test.ts +6 -8
  232. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +5 -7
  233. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +6 -6
  234. package/src/__tests__/trusted-contact-multichannel.test.ts +54 -47
  235. package/src/__tests__/trusted-contact-verification.test.ts +12 -12
  236. package/src/__tests__/twilio-config.test.ts +11 -2
  237. package/src/__tests__/twilio-provider.test.ts +6 -4
  238. package/src/__tests__/twilio-routes.test.ts +408 -86
  239. package/src/__tests__/twitter-platform-proxy-client.test.ts +450 -0
  240. package/src/__tests__/update-bulletin-format.test.ts +1 -1
  241. package/src/__tests__/update-bulletin-state.test.ts +1 -1
  242. package/src/__tests__/update-bulletin.test.ts +4 -8
  243. package/src/__tests__/update-template-contract.test.ts +1 -1
  244. package/src/__tests__/usage-cache-backfill-migration.test.ts +406 -0
  245. package/src/__tests__/usage-routes.test.ts +23 -5
  246. package/src/__tests__/user-reference.test.ts +1 -1
  247. package/src/__tests__/{guardian-control-plane-policy.test.ts → verification-control-plane-policy.test.ts} +142 -170
  248. package/src/__tests__/{guardian-verification-intent-routing.test.ts → verification-session-intent-routing.test.ts} +16 -16
  249. package/src/__tests__/view-image-tool.test.ts +0 -2
  250. package/src/__tests__/voice-ingress-preflight.test.ts +36 -0
  251. package/src/__tests__/voice-invite-redemption.test.ts +18 -18
  252. package/src/__tests__/voice-scoped-grant-consumer.test.ts +7 -7
  253. package/src/__tests__/voice-session-bridge.test.ts +14 -16
  254. package/src/__tests__/workspace-policy.test.ts +1 -1
  255. package/src/approvals/AGENTS.md +4 -4
  256. package/src/approvals/approval-primitive.ts +2 -2
  257. package/src/approvals/guardian-decision-primitive.ts +1 -1
  258. package/src/approvals/guardian-request-resolvers.ts +3 -4
  259. package/src/bundler/app-bundler.ts +29 -217
  260. package/src/bundler/app-compiler.ts +131 -103
  261. package/src/bundler/compiler-tools.ts +248 -0
  262. package/src/calls/active-call-lease.ts +207 -0
  263. package/src/calls/call-constants.ts +0 -7
  264. package/src/calls/call-controller.ts +1 -1
  265. package/src/calls/call-conversation-messages.ts +6 -6
  266. package/src/calls/call-domain.ts +73 -38
  267. package/src/calls/call-pointer-message-composer.ts +6 -6
  268. package/src/calls/call-pointer-messages.ts +14 -13
  269. package/src/calls/call-recovery.ts +2 -0
  270. package/src/calls/call-store.ts +21 -28
  271. package/src/calls/guardian-action-sweep.ts +6 -8
  272. package/src/calls/guardian-dispatch.ts +2 -6
  273. package/src/calls/relay-access-wait.ts +4 -4
  274. package/src/calls/relay-server.ts +69 -80
  275. package/src/calls/relay-setup-router.ts +16 -21
  276. package/src/calls/relay-verification.ts +27 -28
  277. package/src/calls/twilio-config.ts +28 -3
  278. package/src/calls/twilio-provider.ts +5 -5
  279. package/src/calls/twilio-rest.ts +26 -27
  280. package/src/calls/twilio-routes.ts +67 -54
  281. package/src/calls/types.ts +8 -8
  282. package/src/calls/voice-ingress-preflight.ts +110 -0
  283. package/src/calls/voice-session-bridge.ts +7 -7
  284. package/src/channels/config.ts +1 -10
  285. package/src/{config/channel-permission-profiles.ts → channels/permission-profiles.ts} +1 -1
  286. package/src/channels/types.ts +2 -13
  287. package/src/cli/__tests__/notifications.test.ts +1 -1
  288. package/src/{amazon → cli/commands/amazon}/client.ts +99 -42
  289. package/src/cli/{amazon.ts → commands/amazon/index.ts} +12 -17
  290. package/src/{amazon → cli/commands/amazon}/request-extractor.ts +39 -3
  291. package/src/cli/commands/amazon/session.ts +116 -0
  292. package/src/cli/{audit.ts → commands/audit.ts} +2 -4
  293. package/src/cli/{autonomy.ts → commands/autonomy.ts} +1 -3
  294. package/src/cli/commands/browser-relay.ts +520 -0
  295. package/src/cli/commands/channel-verification-sessions.ts +442 -0
  296. package/src/cli/{completions.ts → commands/completions.ts} +1 -3
  297. package/src/cli/{config.ts → commands/config.ts} +3 -5
  298. package/src/cli/{contacts.ts → commands/contacts.ts} +263 -16
  299. package/src/cli/{credentials.ts → commands/credentials.ts} +9 -10
  300. package/src/cli/{default-action.ts → commands/default-action.ts} +3 -3
  301. package/src/cli/{dev.ts → commands/dev.ts} +4 -6
  302. package/src/cli/{doctor.ts → commands/doctor.ts} +36 -60
  303. package/src/cli/{email.ts → commands/email.ts} +2 -2
  304. package/src/cli/{keys.ts → commands/keys.ts} +6 -6
  305. package/src/cli/{map.ts → commands/map.ts} +85 -93
  306. package/src/cli/{mcp.ts → commands/mcp.ts} +5 -7
  307. package/src/cli/{memory.ts → commands/memory.ts} +6 -7
  308. package/src/cli/{notifications.ts → commands/notifications.ts} +8 -10
  309. package/src/cli/{oauth.ts → commands/oauth.ts} +2 -2
  310. package/src/cli/commands/platform.ts +176 -0
  311. package/src/cli/{sequence.ts → commands/sequence.ts} +3 -3
  312. package/src/cli/{sessions.ts → commands/sessions.ts} +32 -52
  313. package/src/cli/commands/skills.ts +498 -0
  314. package/src/cli/{trust.ts → commands/trust.ts} +2 -4
  315. package/src/{__tests__/twitter-cli-error-shaping.test.ts → cli/commands/twitter/__tests__/cli-error-shaping.test.ts} +43 -2
  316. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +483 -0
  317. package/src/{__tests__/twitter-cli-routing.test.ts → cli/commands/twitter/__tests__/cli-routing.test.ts} +130 -4
  318. package/src/{__tests__/twitter-oauth-client.test.ts → cli/commands/twitter/__tests__/oauth-client.test.ts} +2 -2
  319. package/src/{twitter → cli/commands/twitter}/client.ts +17 -7
  320. package/src/cli/{twitter.ts → commands/twitter/index.ts} +322 -273
  321. package/src/cli/commands/twitter/router.ts +396 -0
  322. package/src/cli/commands/twitter/session.ts +121 -0
  323. package/src/cli/db.ts +1 -0
  324. package/src/cli/http-client.ts +87 -0
  325. package/src/cli/logger.ts +6 -0
  326. package/src/cli/main-screen.tsx +4 -3
  327. package/src/cli/output.ts +19 -0
  328. package/src/cli/program.ts +29 -27
  329. package/src/cli/reference.ts +27 -37
  330. package/src/cli.ts +452 -240
  331. package/src/config/assistant-feature-flags.ts +3 -15
  332. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +3 -6
  333. package/src/config/bundled-skills/agentmail/SKILL.md +4 -4
  334. package/src/config/bundled-skills/amazon/SKILL.md +15 -5
  335. package/src/config/bundled-skills/api-mapping/SKILL.md +4 -4
  336. package/src/config/bundled-skills/app-builder/SKILL.md +21 -6
  337. package/src/config/bundled-skills/browser/SKILL.md +4 -5
  338. package/src/config/bundled-skills/chatgpt-import/SKILL.md +4 -4
  339. package/src/config/bundled-skills/chatgpt-import/tools/chatgpt-import.ts +1 -1
  340. package/src/config/bundled-skills/claude-code/SKILL.md +4 -4
  341. package/src/config/bundled-skills/cli-discover/SKILL.md +4 -4
  342. package/src/config/bundled-skills/computer-use/SKILL.md +4 -4
  343. package/src/config/bundled-skills/contacts/SKILL.md +87 -229
  344. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +4 -4
  345. package/src/config/bundled-skills/document/SKILL.md +4 -3
  346. package/src/config/bundled-skills/document-writer/SKILL.md +4 -4
  347. package/src/config/bundled-skills/doordash/SKILL.md +4 -11
  348. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +8 -16
  349. package/src/config/bundled-skills/doordash/doordash-cli.ts +120 -86
  350. package/src/config/bundled-skills/doordash/lib/session.ts +1 -2
  351. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +26 -9
  352. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +140 -0
  353. package/src/config/bundled-skills/email-setup/SKILL.md +4 -4
  354. package/src/config/bundled-skills/followups/SKILL.md +4 -3
  355. package/src/config/bundled-skills/frontend-design/SKILL.md +2 -0
  356. package/src/config/bundled-skills/google-calendar/SKILL.md +4 -4
  357. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +4 -6
  358. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +26 -41
  359. package/src/config/bundled-skills/image-studio/SKILL.md +4 -5
  360. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +1 -1
  361. package/src/config/bundled-skills/influencer/SKILL.md +19 -19
  362. package/src/{influencer → config/bundled-skills/influencer/scripts}/client.ts +73 -56
  363. package/src/config/bundled-skills/influencer/scripts/influencer.ts +267 -0
  364. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -2
  365. package/src/config/bundled-skills/macos-automation/SKILL.md +4 -5
  366. package/src/config/bundled-skills/mcp-setup/SKILL.md +4 -4
  367. package/src/config/bundled-skills/media-processing/SKILL.md +3 -2
  368. package/src/config/bundled-skills/messaging/SKILL.md +6 -33
  369. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -5
  370. package/src/config/bundled-skills/notifications/SKILL.md +4 -4
  371. package/src/config/bundled-skills/notion/SKILL.md +4 -4
  372. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +4 -5
  373. package/src/config/bundled-skills/oauth-setup/SKILL.md +4 -5
  374. package/src/config/bundled-skills/phone-calls/SKILL.md +24 -458
  375. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +83 -0
  376. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +57 -0
  377. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +67 -0
  378. package/src/config/bundled-skills/playbooks/SKILL.md +4 -3
  379. package/src/config/bundled-skills/public-ingress/SKILL.md +65 -14
  380. package/src/config/bundled-skills/reminder/SKILL.md +4 -3
  381. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +4 -6
  382. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  383. package/src/config/bundled-skills/screen-recording/SKILL.md +4 -3
  384. package/src/config/bundled-skills/self-upgrade/SKILL.md +4 -4
  385. package/src/config/bundled-skills/skills-catalog/SKILL.md +4 -4
  386. package/src/config/bundled-skills/slack/SKILL.md +4 -8
  387. package/src/config/bundled-skills/slack/tools/slack-channel-permissions.ts +1 -1
  388. package/src/config/bundled-skills/slack-app-setup/SKILL.md +66 -88
  389. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +4 -5
  390. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +4 -5
  391. package/src/config/bundled-skills/start-the-day/SKILL.md +4 -4
  392. package/src/config/bundled-skills/subagent/SKILL.md +4 -3
  393. package/src/config/bundled-skills/tasks/SKILL.md +4 -3
  394. package/src/config/bundled-skills/telegram-setup/SKILL.md +63 -112
  395. package/src/config/bundled-skills/time-based-actions/SKILL.md +4 -3
  396. package/src/config/bundled-skills/transcribe/SKILL.md +4 -3
  397. package/src/config/bundled-skills/twilio-setup/SKILL.md +23 -50
  398. package/src/config/bundled-skills/twitter/SKILL.md +56 -14
  399. package/src/config/bundled-skills/typescript-eval/SKILL.md +4 -4
  400. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +4 -5
  401. package/src/config/bundled-skills/voice-setup/SKILL.md +19 -45
  402. package/src/config/bundled-skills/watcher/SKILL.md +4 -3
  403. package/src/config/env-registry.ts +1 -10
  404. package/src/config/feature-flag-registry.json +0 -16
  405. package/src/config/loader.ts +78 -38
  406. package/src/config/schema.ts +143 -106
  407. package/src/config/schemas/channels.ts +80 -0
  408. package/src/config/schemas/heartbeat.ts +51 -0
  409. package/src/config/schemas/inference.ts +136 -0
  410. package/src/config/schemas/ingress.ts +81 -0
  411. package/src/config/schemas/logging.ts +21 -0
  412. package/src/config/schemas/memory-lifecycle.ts +67 -0
  413. package/src/config/schemas/memory-processing.ts +215 -0
  414. package/src/config/schemas/memory-retrieval.ts +222 -0
  415. package/src/config/schemas/memory-storage.ts +83 -0
  416. package/src/config/schemas/memory.ts +58 -0
  417. package/src/config/schemas/platform.ts +64 -0
  418. package/src/config/schemas/security.ts +54 -0
  419. package/src/config/schemas/swarm.ts +50 -0
  420. package/src/config/schemas/timeouts.ts +47 -0
  421. package/src/config/{agent-schema.ts → schemas/workspace-git.ts} +0 -97
  422. package/src/config/skill-state.ts +3 -13
  423. package/src/config/skills.ts +233 -75
  424. package/src/config/types.ts +1 -20
  425. package/src/contacts/contact-store.ts +12 -49
  426. package/src/contacts/contacts-write.ts +1 -5
  427. package/src/contacts/index.ts +0 -2
  428. package/src/contacts/types.ts +0 -8
  429. package/src/context/window-manager.ts +73 -14
  430. package/src/daemon/assistant-attachments.ts +9 -0
  431. package/src/daemon/computer-use-session.ts +3 -3
  432. package/src/daemon/connection-policy.ts +6 -21
  433. package/src/daemon/context-overflow-policy.ts +1 -1
  434. package/src/daemon/daemon-control.ts +46 -54
  435. package/src/daemon/doordash-steps.ts +1 -1
  436. package/src/daemon/handlers/config-channels.ts +407 -71
  437. package/src/daemon/handlers/config-ingress.ts +17 -85
  438. package/src/daemon/handlers/config-model.ts +145 -123
  439. package/src/daemon/handlers/config-slack-channel.ts +43 -29
  440. package/src/daemon/handlers/config-telegram.ts +32 -27
  441. package/src/daemon/handlers/config-voice.ts +1 -4
  442. package/src/daemon/handlers/dictation.ts +11 -16
  443. package/src/daemon/handlers/identity.ts +5 -6
  444. package/src/daemon/handlers/pairing.ts +5 -13
  445. package/src/daemon/handlers/recording.ts +97 -199
  446. package/src/daemon/handlers/session-history.ts +110 -96
  447. package/src/daemon/handlers/session-user-message.ts +29 -57
  448. package/src/daemon/handlers/sessions.ts +240 -137
  449. package/src/daemon/handlers/shared.ts +62 -95
  450. package/src/daemon/handlers/skills.ts +492 -543
  451. package/src/daemon/lifecycle.ts +168 -55
  452. package/src/daemon/main.ts +1 -0
  453. package/src/daemon/{ipc-contract.ts → message-protocol.ts} +49 -49
  454. package/src/daemon/{ipc-contract → message-types}/computer-use.ts +0 -3
  455. package/src/daemon/{ipc-contract → message-types}/diagnostics.ts +0 -16
  456. package/src/daemon/{ipc-contract → message-types}/integrations.ts +29 -13
  457. package/src/daemon/{ipc-contract → message-types}/memory.ts +8 -0
  458. package/src/daemon/{ipc-contract → message-types}/notifications.ts +15 -1
  459. package/src/daemon/{ipc-contract → message-types}/sessions.ts +1 -0
  460. package/src/daemon/{ipc-contract → message-types}/shared.ts +0 -8
  461. package/src/daemon/{ipc-contract → message-types}/workspace.ts +2 -2
  462. package/src/daemon/providers-setup.ts +0 -5
  463. package/src/daemon/recording-executor.ts +0 -7
  464. package/src/daemon/ride-shotgun-handler.ts +9 -13
  465. package/src/daemon/server.ts +136 -510
  466. package/src/daemon/session-agent-loop-handlers.ts +22 -7
  467. package/src/daemon/session-agent-loop.ts +86 -24
  468. package/src/daemon/session-attachments.ts +1 -1
  469. package/src/daemon/session-error.ts +1 -1
  470. package/src/daemon/session-history.ts +20 -15
  471. package/src/daemon/session-lifecycle.ts +9 -7
  472. package/src/daemon/session-memory.ts +15 -1
  473. package/src/daemon/session-messaging.ts +10 -6
  474. package/src/daemon/session-notifiers.ts +10 -8
  475. package/src/daemon/session-process.ts +34 -25
  476. package/src/daemon/session-queue-manager.ts +1 -1
  477. package/src/daemon/session-runtime-assembly.ts +6 -25
  478. package/src/daemon/session-surfaces.ts +2 -2
  479. package/src/daemon/session-tool-setup.ts +1 -1
  480. package/src/daemon/session-usage.ts +119 -18
  481. package/src/daemon/session.ts +13 -9
  482. package/src/daemon/tool-side-effects.ts +6 -5
  483. package/src/daemon/trace-emitter.ts +1 -1
  484. package/src/daemon/{guardian-verification-intent.ts → verification-session-intent.ts} +16 -16
  485. package/src/daemon/watch-handler.ts +2 -5
  486. package/src/email/service.ts +8 -8
  487. package/src/events/domain-events.ts +0 -1
  488. package/src/events/tool-notification-listener.ts +1 -1
  489. package/src/followups/followup-store.ts +1 -2
  490. package/src/followups/types.ts +0 -6
  491. package/src/heartbeat/heartbeat-service.ts +1 -1
  492. package/src/inbound/platform-callback-registration.ts +1 -1
  493. package/src/inbound/public-ingress-urls.ts +0 -8
  494. package/src/index.ts +12 -0
  495. package/src/mcp/client.ts +1 -1
  496. package/src/mcp/manager.ts +1 -1
  497. package/src/memory/app-store.ts +1 -42
  498. package/src/memory/{guardian-verification.ts → channel-verification-sessions.ts} +110 -93
  499. package/src/memory/conversation-attention-store.ts +154 -0
  500. package/src/memory/conversation-bootstrap.ts +1 -1
  501. package/src/memory/conversation-crud.ts +53 -1
  502. package/src/memory/conversation-display-order-migration.ts +2 -3
  503. package/src/memory/conversation-queries.ts +1 -29
  504. package/src/memory/conversation-title-service.ts +26 -21
  505. package/src/memory/db-connection.ts +1 -8
  506. package/src/memory/db-init.ts +20 -0
  507. package/src/memory/delivery-crud.ts +4 -34
  508. package/src/memory/external-conversation-store.ts +1 -1
  509. package/src/memory/format-recall.ts +47 -0
  510. package/src/memory/guardian-action-store.ts +4 -5
  511. package/src/memory/guardian-rate-limits.ts +0 -3
  512. package/src/memory/invite-store.ts +1 -1
  513. package/src/memory/job-handlers/backfill.ts +9 -2
  514. package/src/memory/job-handlers/extraction.ts +2 -7
  515. package/src/memory/job-handlers/summarization.ts +1 -1
  516. package/src/memory/llm-usage-store.ts +11 -0
  517. package/src/memory/migrations/114-notifications.ts +12 -40
  518. package/src/memory/migrations/140-backfill-usage-cache-accounting.ts +357 -0
  519. package/src/memory/migrations/141-rename-verification-table.ts +55 -0
  520. package/src/memory/migrations/142-rename-verification-session-id-column.ts +32 -0
  521. package/src/memory/migrations/143-rename-guardian-verification-values.ts +48 -0
  522. package/src/memory/migrations/144-rename-voice-to-phone.ts +147 -0
  523. package/src/memory/migrations/index.ts +5 -0
  524. package/src/memory/migrations/registry.ts +30 -0
  525. package/src/memory/qdrant-circuit-breaker.ts +5 -0
  526. package/src/memory/retriever.test.ts +707 -0
  527. package/src/memory/retriever.ts +120 -116
  528. package/src/memory/schema/calls.ts +3 -7
  529. package/src/memory/schema/guardian.ts +2 -2
  530. package/src/memory/search/lexical.ts +4 -1
  531. package/src/memory/search/query-expansion.test.ts +70 -0
  532. package/src/memory/search/query-expansion.ts +118 -0
  533. package/src/memory/search/types.ts +18 -17
  534. package/src/messaging/providers/telegram-bot/adapter.ts +1 -1
  535. package/src/messaging/providers/whatsapp/adapter.ts +1 -4
  536. package/src/messaging/registry.ts +0 -1
  537. package/src/notifications/README.md +13 -22
  538. package/src/notifications/adapters/macos.ts +1 -1
  539. package/src/notifications/conversation-pairing.ts +2 -2
  540. package/src/notifications/copy-composer.ts +2 -2
  541. package/src/notifications/decision-engine.ts +1 -10
  542. package/src/notifications/destination-resolver.ts +2 -3
  543. package/src/notifications/emit-signal.ts +2 -8
  544. package/src/notifications/guardian-question-mode.ts +5 -8
  545. package/src/notifications/signal.ts +1 -2
  546. package/src/notifications/types.ts +1 -1
  547. package/src/oauth/token-persistence.ts +25 -1
  548. package/src/permissions/checker.ts +4 -29
  549. package/src/permissions/defaults.ts +6 -6
  550. package/src/permissions/prompter.ts +1 -1
  551. package/src/permissions/secret-prompter.ts +1 -1
  552. package/src/permissions/shell-identity.ts +1 -1
  553. package/src/permissions/trust-store.ts +13 -76
  554. package/src/permissions/workspace-policy.ts +1 -1
  555. package/src/{config → prompts}/computer-use-prompt.ts +1 -1
  556. package/src/{config → prompts}/system-prompt.ts +40 -21
  557. package/src/runtime/AGENTS.md +6 -8
  558. package/src/runtime/access-request-helper.ts +36 -55
  559. package/src/runtime/actor-trust-resolver.ts +1 -24
  560. package/src/runtime/approval-message-composer.ts +6 -2
  561. package/src/runtime/assistant-event.ts +1 -1
  562. package/src/runtime/auth/__tests__/ipc-auth-context.test.ts +1 -1
  563. package/src/runtime/auth/__tests__/subject.test.ts +32 -0
  564. package/src/runtime/auth/route-policy.ts +140 -24
  565. package/src/runtime/auth/subject.ts +9 -0
  566. package/src/runtime/auth/token-service.ts +11 -0
  567. package/src/runtime/auth/types.ts +1 -1
  568. package/src/runtime/channel-approval-types.ts +1 -1
  569. package/src/runtime/channel-approvals.ts +1 -1
  570. package/src/runtime/channel-invite-transport.ts +0 -2
  571. package/src/runtime/channel-invite-transports/slack.ts +5 -19
  572. package/src/runtime/channel-invite-transports/telegram.ts +17 -34
  573. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  574. package/src/runtime/channel-readiness-service.ts +24 -159
  575. package/src/runtime/channel-readiness-types.ts +5 -1
  576. package/src/runtime/channel-reply-delivery.ts +43 -3
  577. package/src/runtime/channel-retry-sweep.ts +14 -22
  578. package/src/runtime/{channel-guardian-service.ts → channel-verification-service.ts} +50 -53
  579. package/src/runtime/confirmation-request-guardian-bridge.ts +2 -3
  580. package/src/runtime/gateway-client.ts +12 -15
  581. package/src/runtime/guardian-action-followup-executor.ts +8 -73
  582. package/src/runtime/guardian-action-grant-minter.ts +45 -61
  583. package/src/runtime/guardian-action-message-composer.ts +4 -4
  584. package/src/runtime/guardian-reply-router.ts +3 -3
  585. package/src/runtime/http-server.ts +133 -24
  586. package/src/runtime/http-types.ts +34 -1
  587. package/src/runtime/invite-instruction-generator.ts +1 -3
  588. package/src/runtime/invite-redemption-service.ts +5 -5
  589. package/src/runtime/invite-service.ts +7 -7
  590. package/src/runtime/local-actor-identity.ts +28 -2
  591. package/src/runtime/local-gateway-health.ts +275 -0
  592. package/src/runtime/middleware/twilio-validation.ts +3 -3
  593. package/src/runtime/migrations/migration-transport.ts +18 -3
  594. package/src/runtime/migrations/rebind-secrets-screen.ts +2 -2
  595. package/src/runtime/nl-approval-parser.ts +2 -3
  596. package/src/runtime/routes/access-request-decision.ts +2 -2
  597. package/src/runtime/routes/app-management-routes.ts +921 -0
  598. package/src/runtime/routes/approval-routes.ts +76 -7
  599. package/src/runtime/routes/approval-strategies/guardian-callback-strategy.ts +38 -203
  600. package/src/runtime/routes/channel-delivery-routes.ts +5 -4
  601. package/src/runtime/routes/channel-route-shared.ts +1 -3
  602. package/src/runtime/routes/channel-routes.ts +1 -4
  603. package/src/runtime/routes/channel-verification-routes.ts +257 -0
  604. package/src/runtime/routes/computer-use-routes.ts +595 -0
  605. package/src/runtime/routes/contact-routes.ts +1 -317
  606. package/src/runtime/routes/conversation-attention-routes.ts +6 -5
  607. package/src/runtime/routes/conversation-routes.ts +11 -18
  608. package/src/runtime/routes/debug-routes.ts +1 -1
  609. package/src/runtime/routes/diagnostics-routes.ts +813 -0
  610. package/src/runtime/routes/documents-routes.ts +227 -0
  611. package/src/runtime/routes/guardian-approval-interception.ts +25 -48
  612. package/src/runtime/routes/guardian-bootstrap-routes.ts +3 -3
  613. package/src/runtime/routes/guardian-expiry-sweep.ts +2 -2
  614. package/src/runtime/routes/guardian-refresh-routes.ts +11 -6
  615. package/src/runtime/routes/inbound-conversation.ts +3 -10
  616. package/src/runtime/routes/inbound-message-handler.ts +7 -6
  617. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +22 -22
  618. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +44 -0
  619. package/src/runtime/routes/inbound-stages/background-dispatch.ts +140 -22
  620. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +4 -4
  621. package/src/runtime/routes/inbound-stages/edit-intercept.ts +5 -5
  622. package/src/runtime/routes/inbound-stages/escalation-intercept.ts +3 -3
  623. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +4 -4
  624. package/src/runtime/routes/inbound-stages/verification-intercept.ts +13 -14
  625. package/src/runtime/routes/integrations/slack/channel.ts +72 -0
  626. package/src/runtime/routes/{slack-share-routes.ts → integrations/slack/share.ts} +9 -9
  627. package/src/runtime/routes/integrations/telegram.ts +111 -0
  628. package/src/runtime/routes/integrations/twilio.ts +451 -0
  629. package/src/runtime/routes/invite-routes.ts +2 -2
  630. package/src/runtime/routes/pairing-routes.ts +1 -1
  631. package/src/runtime/routes/recording-routes.ts +332 -0
  632. package/src/{daemon/handlers/config-scheduling.ts → runtime/routes/schedule-routes.ts} +91 -106
  633. package/src/runtime/routes/session-management-routes.ts +167 -0
  634. package/src/runtime/routes/session-query-routes.ts +204 -0
  635. package/src/runtime/routes/settings-routes.ts +977 -0
  636. package/src/runtime/routes/skills-routes.ts +266 -0
  637. package/src/runtime/routes/subagents-routes.ts +246 -0
  638. package/src/runtime/routes/surface-action-routes.ts +100 -10
  639. package/src/runtime/routes/surface-content-routes.ts +1 -1
  640. package/src/runtime/routes/work-items-routes.ts +809 -0
  641. package/src/runtime/routes/workspace-routes.test.ts +778 -0
  642. package/src/runtime/routes/workspace-routes.ts +410 -0
  643. package/src/runtime/routes/workspace-utils.ts +88 -0
  644. package/src/runtime/telegram-streaming-delivery.test.ts +597 -0
  645. package/src/runtime/telegram-streaming-delivery.ts +380 -0
  646. package/src/runtime/tool-grant-request-helper.ts +1 -2
  647. package/src/runtime/trust-context-resolver.ts +0 -1
  648. package/src/runtime/{guardian-outbound-actions.ts → verification-outbound-actions.ts} +23 -188
  649. package/src/runtime/verification-rate-limiter.ts +2 -2
  650. package/src/runtime/{guardian-verification-templates.ts → verification-templates.ts} +2 -28
  651. package/src/schedule/integration-status.ts +2 -2
  652. package/src/schedule/schedule-store.ts +7 -9
  653. package/src/sequence/engine.ts +1 -1
  654. package/src/skills/active-skill-tools.ts +0 -8
  655. package/src/skills/clawhub.ts +1 -10
  656. package/src/skills/managed-store.ts +14 -4
  657. package/src/skills/slash-commands.ts +1 -1
  658. package/src/subagent/manager.ts +1 -1
  659. package/src/subagent/types.ts +1 -1
  660. package/src/tasks/SPEC.md +10 -10
  661. package/src/tasks/task-scheduler.ts +1 -1
  662. package/src/telegram/bot-username.ts +13 -0
  663. package/src/tools/assets/materialize.ts +1 -1
  664. package/src/tools/assets/search.ts +1 -1
  665. package/src/tools/browser/browser-execution.ts +2 -2
  666. package/src/tools/browser/browser-manager.ts +88 -11
  667. package/src/tools/browser/browser-screencast.ts +1 -1
  668. package/src/tools/browser/headless-browser.ts +0 -17
  669. package/src/tools/browser/jit-auth.ts +1 -1
  670. package/src/tools/browser/recording-store.ts +19 -1
  671. package/src/tools/browser/runtime-check.ts +4 -2
  672. package/src/tools/calls/call-start.ts +3 -3
  673. package/src/tools/credentials/metadata-store.ts +0 -13
  674. package/src/tools/credentials/vault.ts +7 -31
  675. package/src/tools/followups/followup_create.ts +0 -8
  676. package/src/tools/mcp/mcp-tool-factory.ts +1 -1
  677. package/src/tools/memory/definitions.ts +32 -10
  678. package/src/tools/memory/handlers.test.ts +573 -0
  679. package/src/tools/memory/handlers.ts +222 -65
  680. package/src/tools/memory/register.ts +53 -24
  681. package/src/tools/network/script-proxy/session-manager.ts +1 -12
  682. package/src/tools/schedule/update.ts +0 -8
  683. package/src/tools/skills/load.ts +3 -3
  684. package/src/tools/subagent/read.ts +1 -1
  685. package/src/tools/system/voice-config.ts +2 -14
  686. package/src/tools/terminal/safe-env.ts +5 -18
  687. package/src/tools/tool-approval-handler.ts +4 -4
  688. package/src/tools/tool-manifest.ts +4 -2
  689. package/src/tools/types.ts +1 -1
  690. package/src/tools/{guardian-control-plane-policy.ts → verification-control-plane-policy.ts} +37 -39
  691. package/src/twitter/platform-proxy-client.ts +405 -0
  692. package/src/usage/types.ts +21 -0
  693. package/src/util/canonicalize-identity.ts +2 -6
  694. package/src/util/cookie-session.ts +35 -51
  695. package/src/util/platform.ts +93 -86
  696. package/src/util/pricing.ts +180 -43
  697. package/src/work-items/work-item-runner.ts +1 -1
  698. package/scripts/ipc/check-contract-inventory.ts +0 -107
  699. package/scripts/ipc/check-swift-decoder-drift.ts +0 -184
  700. package/scripts/ipc/generate-swift.ts +0 -528
  701. package/src/__tests__/__snapshots__/ipc-snapshot.test.ts.snap +0 -3043
  702. package/src/__tests__/app-migration.test.ts +0 -148
  703. package/src/__tests__/config-loader-migration.test.ts +0 -85
  704. package/src/__tests__/daemon-lifecycle.test.ts +0 -715
  705. package/src/__tests__/daemon-server-session-init.test.ts +0 -864
  706. package/src/__tests__/guardian-actions-endpoint.test.ts +0 -1452
  707. package/src/__tests__/handlers-add-trust-rule-metadata.test.ts +0 -228
  708. package/src/__tests__/handlers-cu-observation-blob.test.ts +0 -397
  709. package/src/__tests__/handlers-ipc-blob-probe.test.ts +0 -218
  710. package/src/__tests__/handlers-slack-config.test.ts +0 -140
  711. package/src/__tests__/handlers-telegram-config.test.ts +0 -1317
  712. package/src/__tests__/handlers-twitter-config.test.ts +0 -1145
  713. package/src/__tests__/ingress-reconcile.test.ts +0 -606
  714. package/src/__tests__/integrations-cli.test.ts +0 -232
  715. package/src/__tests__/ipc-blob-store.test.ts +0 -329
  716. package/src/__tests__/ipc-contract-inventory.test.ts +0 -69
  717. package/src/__tests__/ipc-contract.test.ts +0 -76
  718. package/src/__tests__/ipc-protocol.test.ts +0 -120
  719. package/src/__tests__/ipc-roundtrip.benchmark.test.ts +0 -250
  720. package/src/__tests__/ipc-snapshot.test.ts +0 -2197
  721. package/src/__tests__/ipc-validate.test.ts +0 -471
  722. package/src/__tests__/migration-cli-flows.test.ts +0 -186
  723. package/src/__tests__/migration-ordering.test.ts +0 -267
  724. package/src/__tests__/oauth-connect-handler.test.ts +0 -361
  725. package/src/__tests__/platform-move-helper.test.ts +0 -108
  726. package/src/__tests__/platform-socket-path.test.ts +0 -52
  727. package/src/__tests__/platform-workspace-migration.test.ts +0 -1051
  728. package/src/__tests__/recording-intent-handler.test.ts +0 -1155
  729. package/src/__tests__/script-proxy-profile-template-fallback.test.ts +0 -127
  730. package/src/__tests__/sms-messaging-provider.test.ts +0 -156
  731. package/src/__tests__/tool-permission-simulate-handler.test.ts +0 -367
  732. package/src/__tests__/twitter-auth-handler.test.ts +0 -561
  733. package/src/__tests__/work-item-output.test.ts +0 -150
  734. package/src/amazon/session.ts +0 -58
  735. package/src/cli/channels.ts +0 -51
  736. package/src/cli/influencer.ts +0 -319
  737. package/src/cli/integrations.ts +0 -372
  738. package/src/cli/ipc-client.ts +0 -88
  739. package/src/config/bundled-skills/configure-settings/SKILL.md +0 -86
  740. package/src/config/bundled-skills/doordash/lib/shared/ipc.ts +0 -32
  741. package/src/config/bundled-skills/sms-setup/SKILL.md +0 -210
  742. package/src/config/core-schema.ts +0 -434
  743. package/src/config/memory-schema.ts +0 -617
  744. package/src/daemon/auth-manager.ts +0 -106
  745. package/src/daemon/handlers/apps.ts +0 -758
  746. package/src/daemon/handlers/avatar.ts +0 -73
  747. package/src/daemon/handlers/browser.ts +0 -3
  748. package/src/daemon/handlers/computer-use.ts +0 -231
  749. package/src/daemon/handlers/config-dispatch.ts +0 -29
  750. package/src/daemon/handlers/config-heartbeat.ts +0 -299
  751. package/src/daemon/handlers/config-inbox.ts +0 -457
  752. package/src/daemon/handlers/config-integrations.ts +0 -409
  753. package/src/daemon/handlers/config-platform.ts +0 -77
  754. package/src/daemon/handlers/config-slack.ts +0 -41
  755. package/src/daemon/handlers/config-tools.ts +0 -226
  756. package/src/daemon/handlers/config-trust.ts +0 -135
  757. package/src/daemon/handlers/config.ts +0 -64
  758. package/src/daemon/handlers/contacts.ts +0 -193
  759. package/src/daemon/handlers/diagnostics.ts +0 -382
  760. package/src/daemon/handlers/documents.ts +0 -188
  761. package/src/daemon/handlers/guardian-actions.ts +0 -82
  762. package/src/daemon/handlers/home-base.ts +0 -82
  763. package/src/daemon/handlers/index.ts +0 -222
  764. package/src/daemon/handlers/misc.ts +0 -1139
  765. package/src/daemon/handlers/navigate-settings.ts +0 -29
  766. package/src/daemon/handlers/oauth-connect.ts +0 -202
  767. package/src/daemon/handlers/open-bundle-handler.ts +0 -88
  768. package/src/daemon/handlers/publish.ts +0 -176
  769. package/src/daemon/handlers/signing.ts +0 -56
  770. package/src/daemon/handlers/subagents.ts +0 -286
  771. package/src/daemon/handlers/twitter-auth.ts +0 -220
  772. package/src/daemon/handlers/work-items.ts +0 -796
  773. package/src/daemon/handlers/workspace-files.ts +0 -84
  774. package/src/daemon/handlers.ts +0 -16
  775. package/src/daemon/ipc-blob-store.ts +0 -246
  776. package/src/daemon/ipc-contract-inventory.json +0 -348
  777. package/src/daemon/ipc-contract-inventory.ts +0 -202
  778. package/src/daemon/ipc-handler.ts +0 -120
  779. package/src/daemon/ipc-protocol.ts +0 -85
  780. package/src/daemon/ipc-validate.ts +0 -254
  781. package/src/memory/app-migration.ts +0 -114
  782. package/src/memory/channel-delivery-store.ts +0 -40
  783. package/src/memory/channel-guardian-store.ts +0 -83
  784. package/src/memory/conversation-store.ts +0 -102
  785. package/src/memory/schema-migration.ts +0 -38
  786. package/src/messaging/providers/sms/adapter.ts +0 -232
  787. package/src/messaging/providers/sms/client.ts +0 -93
  788. package/src/messaging/providers/sms/types.ts +0 -7
  789. package/src/migrations/config-merge.ts +0 -62
  790. package/src/migrations/data-layout.ts +0 -89
  791. package/src/migrations/data-merge.ts +0 -44
  792. package/src/migrations/hooks-merge.ts +0 -118
  793. package/src/migrations/index.ts +0 -6
  794. package/src/migrations/log.ts +0 -28
  795. package/src/migrations/skills-merge.ts +0 -44
  796. package/src/migrations/workspace-layout.ts +0 -94
  797. package/src/notifications/adapters/sms.ts +0 -94
  798. package/src/runtime/channel-approval-parser.ts +0 -123
  799. package/src/runtime/channel-invite-transports/sms.ts +0 -53
  800. package/src/runtime/routes/approval-strategies/guardian-legacy-fallback-strategy.ts +0 -82
  801. package/src/runtime/routes/integration-routes.ts +0 -381
  802. package/src/runtime/routes/twilio-routes.ts +0 -1251
  803. package/src/twitter/router.ts +0 -131
  804. package/src/twitter/session.ts +0 -54
  805. package/src/watcher/providers/slack.ts +0 -282
  806. /package/src/{amazon → cli/commands/amazon}/cart.ts +0 -0
  807. /package/src/{amazon → cli/commands/amazon}/checkout.ts +0 -0
  808. /package/src/{amazon → cli/commands/amazon}/product-details.ts +0 -0
  809. /package/src/{amazon → cli/commands/amazon}/search.ts +0 -0
  810. /package/src/{twitter → cli/commands/twitter}/oauth-client.ts +0 -0
  811. /package/src/config/{calls-schema.ts → schemas/calls.ts} +0 -0
  812. /package/src/config/{elevenlabs-schema.ts → schemas/elevenlabs.ts} +0 -0
  813. /package/src/config/{mcp-schema.ts → schemas/mcp.ts} +0 -0
  814. /package/src/config/{notifications-schema.ts → schemas/notifications.ts} +0 -0
  815. /package/src/config/{sandbox-schema.ts → schemas/sandbox.ts} +0 -0
  816. /package/src/config/{skills-schema.ts → schemas/skills.ts} +0 -0
  817. /package/src/daemon/{ipc-contract → message-types}/apps.ts +0 -0
  818. /package/src/daemon/{ipc-contract → message-types}/browser.ts +0 -0
  819. /package/src/daemon/{ipc-contract → message-types}/contacts.ts +0 -0
  820. /package/src/daemon/{ipc-contract → message-types}/documents.ts +0 -0
  821. /package/src/daemon/{ipc-contract → message-types}/guardian-actions.ts +0 -0
  822. /package/src/daemon/{ipc-contract → message-types}/inbox.ts +0 -0
  823. /package/src/daemon/{ipc-contract → message-types}/messages.ts +0 -0
  824. /package/src/daemon/{ipc-contract → message-types}/pairing.ts +0 -0
  825. /package/src/daemon/{ipc-contract → message-types}/schedules.ts +0 -0
  826. /package/src/daemon/{ipc-contract → message-types}/settings.ts +0 -0
  827. /package/src/daemon/{ipc-contract → message-types}/skills.ts +0 -0
  828. /package/src/daemon/{ipc-contract → message-types}/subagents.ts +0 -0
  829. /package/src/daemon/{ipc-contract → message-types}/surfaces.ts +0 -0
  830. /package/src/daemon/{ipc-contract → message-types}/trust.ts +0 -0
  831. /package/src/daemon/{ipc-contract → message-types}/work-items.ts +0 -0
  832. /package/src/{cli/email-guardrails.ts → email/guardrails.ts} +0 -0
  833. /package/src/{config → prompts}/__tests__/build-cli-reference-section.test.ts +0 -0
  834. /package/src/{config → prompts}/templates/BOOTSTRAP.md +0 -0
  835. /package/src/{config → prompts}/templates/IDENTITY.md +0 -0
  836. /package/src/{config → prompts}/templates/SOUL.md +0 -0
  837. /package/src/{config → prompts}/templates/UPDATES.md +0 -0
  838. /package/src/{config → prompts}/templates/USER.md +0 -0
  839. /package/src/{config → prompts}/update-bulletin-format.ts +0 -0
  840. /package/src/{config → prompts}/update-bulletin-state.ts +0 -0
  841. /package/src/{config → prompts}/update-bulletin-template-path.ts +0 -0
  842. /package/src/{config → prompts}/update-bulletin.ts +0 -0
  843. /package/src/{config → prompts}/user-reference.ts +0 -0
@@ -5,11 +5,14 @@
5
5
  * All commands output JSON to stdout. Use --json for machine-readable output.
6
6
  */
7
7
 
8
- import * as net from "node:net";
8
+ import { execFile } from "node:child_process";
9
+ import { promisify } from "node:util";
9
10
 
10
11
  import { Command } from "commander";
11
12
 
12
- import { createMessageParser, serialize } from "../daemon/ipc-protocol.js";
13
+ const execFileAsync = promisify(execFile);
14
+
15
+ import { httpSend } from "../../http-client.js";
13
16
  import {
14
17
  getBookmarks,
15
18
  getFollowers,
@@ -17,21 +20,19 @@ import {
17
20
  getHomeTimeline,
18
21
  getLikes,
19
22
  getNotifications,
20
- getTweetDetail,
21
23
  getUserByScreenName,
22
24
  getUserMedia,
23
- getUserTweets,
24
- searchTweets,
25
25
  SessionExpiredError,
26
- } from "../twitter/client.js";
27
- import type { TwitterStrategy } from "../twitter/router.js";
28
- import { routedPostTweet } from "../twitter/router.js";
26
+ } from "./client.js";
27
+ import type { TwitterStrategy } from "./router.js";
29
28
  import {
30
- clearSession,
31
- importFromRecording,
32
- loadSession,
33
- } from "../twitter/session.js";
34
- import { getSocketPath, readSessionToken } from "../util/platform.js";
29
+ routedGetTweetDetail,
30
+ routedGetUserByScreenName,
31
+ routedGetUserTweets,
32
+ routedPostTweet,
33
+ routedSearchTweets,
34
+ } from "./router.js";
35
+ import { clearSession, importFromRecording, loadSession } from "./session.js";
35
36
 
36
37
  // ---------------------------------------------------------------------------
37
38
  // Helpers
@@ -88,7 +89,8 @@ async function run(cmd: Command, fn: () => Promise<unknown>): Promise<void> {
88
89
  err instanceof Error &&
89
90
  (meta.pathUsed !== undefined ||
90
91
  meta.suggestAlternative !== undefined ||
91
- meta.oauthError !== undefined)
92
+ meta.oauthError !== undefined ||
93
+ meta.proxyErrorCode !== undefined)
92
94
  ) {
93
95
  const payload: Record<string, unknown> = {
94
96
  ok: false,
@@ -98,6 +100,9 @@ async function run(cmd: Command, fn: () => Promise<unknown>): Promise<void> {
98
100
  if (meta.suggestAlternative !== undefined)
99
101
  payload.suggestAlternative = meta.suggestAlternative;
100
102
  if (meta.oauthError !== undefined) payload.oauthError = meta.oauthError;
103
+ if (meta.proxyErrorCode !== undefined)
104
+ payload.proxyErrorCode = meta.proxyErrorCode;
105
+ if (meta.retryable !== undefined) payload.retryable = meta.retryable;
101
106
  output(payload, getJson(cmd));
102
107
  process.exitCode = 1;
103
108
  return;
@@ -115,22 +120,25 @@ export function registerTwitterCommand(program: Command): void {
115
120
  .command("x")
116
121
  .alias("twitter")
117
122
  .description(
118
- "Post on X and manage connections. Supports OAuth (official API) and browser session paths.",
123
+ "Post on X and manage connections. Supports managed (platform proxy), OAuth (official API), and browser session paths.",
119
124
  )
120
125
  .option("--json", "Machine-readable JSON output");
121
126
 
122
127
  tw.addHelpText(
123
128
  "after",
124
129
  `
125
- Twitter (X) uses a dual-path architecture for interacting with the platform:
130
+ Twitter (X) supports multiple paths for interacting with the platform:
126
131
 
127
- 1. OAuth (official API) — uses an authenticated Twitter OAuth application for
132
+ 1. Managed (platform proxy) — routes Twitter API calls through the platform,
133
+ which holds the OAuth credentials. Used when integrationMode is "managed".
134
+ 2. OAuth (official API) — uses an authenticated Twitter OAuth application for
128
135
  posting and replying. Requires a connected OAuth credential.
129
- 2. Browser session (Ride Shotgun) — uses cookies captured from a real Chrome
136
+ 3. Browser session (Ride Shotgun) — uses cookies captured from a real Chrome
130
137
  session to call Twitter's internal GraphQL API. Supports all read operations
131
138
  and posting as a fallback.
132
139
 
133
- The strategy system controls which path is used for operations that support both:
140
+ The strategy system controls which path is used for operations that support multiple:
141
+ managed — route through the platform proxy (platform holds credentials)
134
142
  oauth — always use the OAuth API; fail if unavailable
135
143
  browser — always use the browser session; fail if unavailable
136
144
  auto — try OAuth first, fall back to browser session (default)
@@ -144,7 +152,8 @@ Session management:
144
152
 
145
153
  Examples:
146
154
  $ assistant x status
147
- $ assistant x post "Hello world"
155
+ $ assistant x post "Hello world" --strategy managed
156
+ $ assistant x post "Hello world" --strategy auto
148
157
  $ assistant x timeline elonmusk --count 10
149
158
  $ assistant x search "from:vaborsh AI agents" --product Latest
150
159
  $ assistant x strategy set oauth`,
@@ -172,11 +181,10 @@ Examples:
172
181
  )
173
182
  .action(async (opts: { recording: string }, cmd: Command) => {
174
183
  await run(cmd, async () => {
175
- const session = importFromRecording(opts.recording);
184
+ const session = await importFromRecording(opts.recording);
176
185
  return {
177
186
  message: "Session imported successfully",
178
187
  cookieCount: session.cookies.length,
179
- recordingId: session.recordingId,
180
188
  };
181
189
  });
182
190
  });
@@ -196,8 +204,8 @@ OAuth credentials are not affected.
196
204
  Examples:
197
205
  $ assistant x logout`,
198
206
  )
199
- .action((_opts: unknown, cmd: Command) => {
200
- clearSession();
207
+ .action(async (_opts: unknown, cmd: Command) => {
208
+ await clearSession();
201
209
  output({ ok: true, message: "Session cleared" }, getJson(cmd));
202
210
  });
203
211
 
@@ -236,11 +244,11 @@ Examples:
236
244
  try {
237
245
  const result = await startLearnSession(duration);
238
246
  if (result.recordingPath) {
239
- const session = importFromRecording(result.recordingPath);
247
+ const session = await importFromRecording(result.recordingPath);
240
248
 
241
249
  // Hide Chrome after capturing session
242
250
  try {
243
- await minimizeChromeWindow(); // uses default CDP port
251
+ await minimizeChrome();
244
252
  } catch {
245
253
  /* best-effort */
246
254
  }
@@ -250,7 +258,6 @@ Examples:
250
258
  ok: true,
251
259
  message: "Session refreshed successfully",
252
260
  cookieCount: session.cookies.length,
253
- recordingId: result.recordingId,
254
261
  },
255
262
  json,
256
263
  );
@@ -259,7 +266,6 @@ Examples:
259
266
  {
260
267
  ok: false,
261
268
  error: "Recording completed but no recording path returned",
262
- recordingId: result.recordingId,
263
269
  },
264
270
  json,
265
271
  );
@@ -280,8 +286,7 @@ Examples:
280
286
  `
281
287
  Shows the current state of both authentication paths:
282
288
 
283
- Browser session — whether cookies are loaded, cookie count, import timestamp,
284
- and the recording ID they came from.
289
+ Browser session — whether cookies are loaded and the cookie count.
285
290
  OAuth — whether an OAuth credential is connected, the linked account, the
286
291
  current strategy setting, and whether a strategy has been explicitly configured.
287
292
 
@@ -292,27 +297,18 @@ Examples:
292
297
  $ assistant x status --json`,
293
298
  )
294
299
  .action(async (_opts: unknown, cmd: Command) => {
295
- const session = loadSession();
300
+ const session = await loadSession();
296
301
  const browserInfo: Record<string, unknown> = session
297
302
  ? {
298
303
  browserSessionActive: true,
299
304
  cookieCount: session.cookies.length,
300
- importedAt: session.importedAt,
301
- recordingId: session.recordingId,
302
305
  }
303
306
  : { browserSessionActive: false };
304
307
 
305
308
  // Query daemon for OAuth / strategy config
306
309
  let oauthInfo: Record<string, unknown> = {};
307
310
  try {
308
- const daemonResponse = await sendDaemonMessage(
309
- {
310
- type: "twitter_integration_config",
311
- action: "get",
312
- } as import("../daemon/ipc-protocol.js").ClientMessage,
313
- "twitter_integration_config_response",
314
- );
315
- const r = daemonResponse as Record<string, unknown>;
311
+ const r = await sendTwitterConfigRequest("get");
316
312
  oauthInfo = {
317
313
  oauthConnected: r.connected ?? false,
318
314
  oauthAccount: r.accountInfo ?? undefined,
@@ -346,7 +342,7 @@ Examples:
346
342
  const strategyCli = tw
347
343
  .command("strategy")
348
344
  .description(
349
- "Get or set the Twitter operation strategy (oauth, browser, auto)",
345
+ "Get or set the Twitter operation strategy (managed, oauth, browser, auto)",
350
346
  )
351
347
  .addHelpText(
352
348
  "after",
@@ -354,6 +350,7 @@ Examples:
354
350
  The strategy controls which authentication path is used for operations that
355
351
  support both OAuth and browser session:
356
352
 
353
+ managed — route through the platform proxy (platform holds OAuth credentials).
357
354
  oauth — always use the official Twitter OAuth API. Fails if no OAuth
358
355
  credential is connected. Best for reliable posting.
359
356
  browser — always use the browser session (captured cookies). Fails if no
@@ -371,14 +368,7 @@ Examples:
371
368
  .action(async (_opts: unknown, cmd: Command) => {
372
369
  const json = getJson(cmd);
373
370
  try {
374
- const daemonResponse = await sendDaemonMessage(
375
- {
376
- type: "twitter_integration_config",
377
- action: "get_strategy",
378
- } as import("../daemon/ipc-protocol.js").ClientMessage,
379
- "twitter_integration_config_response",
380
- );
381
- const r = daemonResponse as Record<string, unknown>;
371
+ const r = await sendTwitterConfigRequest("get_strategy");
382
372
  output({ ok: true, strategy: r.strategy ?? "auto" }, json);
383
373
  } catch (err) {
384
374
  outputError(err instanceof Error ? err.message : String(err));
@@ -397,7 +387,8 @@ Arguments:
397
387
 
398
388
  Sets the preferred strategy for Twitter operations that support dual-path
399
389
  routing. The setting is persisted by the assistant and applies to all subsequent
400
- operations until changed.
390
+ operations until changed. Note: "managed" is determined by integration mode
391
+ and cannot be set manually.
401
392
 
402
393
  Examples:
403
394
  $ assistant x strategy set oauth
@@ -407,15 +398,9 @@ Examples:
407
398
  .action(async (value: string, _opts: unknown, cmd: Command) => {
408
399
  const json = getJson(cmd);
409
400
  try {
410
- const daemonResponse = await sendDaemonMessage(
411
- {
412
- type: "twitter_integration_config",
413
- action: "set_strategy",
414
- strategy: value,
415
- } as import("../daemon/ipc-protocol.js").ClientMessage,
416
- "twitter_integration_config_response",
417
- );
418
- const r = daemonResponse as Record<string, unknown>;
401
+ const r = await sendTwitterConfigRequest("set_strategy", {
402
+ strategy: value,
403
+ });
419
404
  if (r.success) {
420
405
  output({ ok: true, strategy: r.strategy }, json);
421
406
  } else {
@@ -438,7 +423,7 @@ Examples:
438
423
  .argument("<text>", "Tweet text")
439
424
  .requiredOption(
440
425
  "--strategy <strategy>",
441
- "Operation strategy: oauth, browser, or auto",
426
+ "Operation strategy: oauth, browser, auto, or managed",
442
427
  )
443
428
  .option(
444
429
  "--oauth-token <token>",
@@ -450,14 +435,20 @@ Examples:
450
435
  Arguments:
451
436
  text The tweet text to post (max 280 characters)
452
437
 
453
- Posts a new tweet using the routed dual-path system. The --strategy flag
454
- controls which path is used. The response includes the tweet ID, URL, and
455
- which path was used.
438
+ Posts a new tweet using the routed system. The --strategy flag controls which
439
+ path is used. The response includes the tweet ID, URL, and which path was used.
440
+
441
+ Strategies:
442
+ oauth — use the local OAuth token directly
443
+ browser — use the browser session (CDP)
444
+ auto — try OAuth first, fall back to browser
445
+ managed — route through the platform proxy (platform holds OAuth credentials)
456
446
 
457
447
  Examples:
458
448
  $ assistant x post "Hello world" --strategy browser
459
449
  $ assistant x post "Hello world" --strategy oauth --oauth-token "$TOKEN"
460
- $ assistant x post "Hello world" --strategy auto --oauth-token "$TOKEN"`,
450
+ $ assistant x post "Hello world" --strategy auto --oauth-token "$TOKEN"
451
+ $ assistant x post "Hello world" --strategy managed`,
461
452
  )
462
453
  .action(
463
454
  async (
@@ -470,10 +461,11 @@ Examples:
470
461
  if (
471
462
  strategy !== "oauth" &&
472
463
  strategy !== "browser" &&
473
- strategy !== "auto"
464
+ strategy !== "auto" &&
465
+ strategy !== "managed"
474
466
  ) {
475
467
  throw new Error(
476
- `Invalid strategy "${opts.strategy}". Must be oauth, browser, or auto.`,
468
+ `Invalid strategy "${opts.strategy}". Must be oauth, browser, auto, or managed.`,
477
469
  );
478
470
  }
479
471
  const { result, pathUsed } = await routedPostTweet(text, {
@@ -499,7 +491,7 @@ Examples:
499
491
  .argument("<text>", "Reply text")
500
492
  .requiredOption(
501
493
  "--strategy <strategy>",
502
- "Operation strategy: oauth, browser, or auto",
494
+ "Operation strategy: oauth, browser, auto, or managed",
503
495
  )
504
496
  .option(
505
497
  "--oauth-token <token>",
@@ -518,7 +510,8 @@ URL. The --strategy flag controls which path is used.
518
510
 
519
511
  Examples:
520
512
  $ assistant x reply https://x.com/elonmusk/status/1234567890 "Great point!" --strategy browser
521
- $ assistant x reply 1234567890 "Interesting thread" --strategy oauth --oauth-token "$TOKEN"`,
513
+ $ assistant x reply 1234567890 "Interesting thread" --strategy oauth --oauth-token "$TOKEN"
514
+ $ assistant x reply 1234567890 "Nice!" --strategy managed`,
522
515
  )
523
516
  .action(
524
517
  async (
@@ -532,10 +525,11 @@ Examples:
532
525
  if (
533
526
  strategy !== "oauth" &&
534
527
  strategy !== "browser" &&
535
- strategy !== "auto"
528
+ strategy !== "auto" &&
529
+ strategy !== "managed"
536
530
  ) {
537
531
  throw new Error(
538
- `Invalid strategy "${opts.strategy}". Must be oauth, browser, or auto.`,
532
+ `Invalid strategy "${opts.strategy}". Must be oauth, browser, auto, or managed.`,
539
533
  );
540
534
  }
541
535
  // Extract tweet ID: either a bare numeric ID or the last numeric segment of a URL
@@ -566,30 +560,54 @@ Examples:
566
560
  .description("Fetch a user's recent tweets")
567
561
  .argument("<screenName>", "Twitter screen name (without @)")
568
562
  .option("--count <n>", "Number of tweets to fetch", "20")
563
+ .option(
564
+ "--strategy <strategy>",
565
+ "Operation strategy: managed or browser (default: browser)",
566
+ )
569
567
  .addHelpText(
570
568
  "after",
571
569
  `
572
570
  Arguments:
573
571
  screenName Twitter screen name without the @ prefix (e.g. "elonmusk", not "@elonmusk")
574
572
 
575
- Fetches a user's recent tweets via the browser session. Resolves the screen name
576
- to a user ID first, then retrieves their tweet timeline. The --count flag controls
577
- how many tweets to return (default: 20).
573
+ Fetches a user's recent tweets. Resolves the screen name to a user ID first,
574
+ then retrieves their tweet timeline. The --count flag controls how many tweets
575
+ to return (default: 20). Use --strategy managed to route through the platform proxy.
578
576
 
579
577
  Examples:
580
578
  $ assistant x timeline elonmusk
581
579
  $ assistant x timeline vaborsh --count 50
582
- $ assistant x timeline openai --count 10 --json`,
580
+ $ assistant x timeline openai --count 10 --json
581
+ $ assistant x timeline elonmusk --strategy managed`,
583
582
  )
584
583
  .action(
585
- async (screenName: string, opts: { count: string }, cmd: Command) => {
584
+ async (
585
+ screenName: string,
586
+ opts: { count: string; strategy?: string },
587
+ cmd: Command,
588
+ ) => {
586
589
  await run(cmd, async () => {
587
- const user = await getUserByScreenName(screenName.replace(/^@/, ""));
588
- const tweets = await getUserTweets(
590
+ const strategy = (opts.strategy ?? "browser") as TwitterStrategy;
591
+ if (
592
+ strategy !== "oauth" &&
593
+ strategy !== "browser" &&
594
+ strategy !== "auto" &&
595
+ strategy !== "managed"
596
+ ) {
597
+ throw new Error(
598
+ `Invalid strategy "${opts.strategy}". Must be oauth, browser, auto, or managed.`,
599
+ );
600
+ }
601
+ const { result: user, pathUsed } = await routedGetUserByScreenName(
602
+ screenName.replace(/^@/, ""),
603
+ { strategy },
604
+ );
605
+ const { result: tweets } = await routedGetUserTweets(
589
606
  user.userId,
590
607
  parseInt(opts.count, 10),
608
+ { strategy },
591
609
  );
592
- return { user, tweets };
610
+ return { user, tweets, pathUsed };
593
611
  });
594
612
  },
595
613
  );
@@ -600,6 +618,10 @@ Examples:
600
618
  tw.command("tweet")
601
619
  .description("Fetch a tweet and its reply thread")
602
620
  .argument("<tweetIdOrUrl>", "Tweet ID or URL")
621
+ .option(
622
+ "--strategy <strategy>",
623
+ "Operation strategy: managed or browser (default: browser)",
624
+ )
603
625
  .addHelpText(
604
626
  "after",
605
627
  `
@@ -607,24 +629,45 @@ Arguments:
607
629
  tweetIdOrUrl A bare tweet ID (e.g. 1234567890) or a full tweet URL
608
630
  (e.g. https://x.com/user/status/1234567890)
609
631
 
610
- Fetches a single tweet and its reply thread via the browser session. The tweet
611
- ID is extracted from the last numeric segment of the input. Returns an array of
612
- tweets representing the conversation thread.
632
+ Fetches a single tweet and its reply thread. The tweet ID is extracted from the
633
+ last numeric segment of the input. Returns an array of tweets representing the
634
+ conversation thread. Use --strategy managed to route through the platform proxy.
613
635
 
614
636
  Examples:
615
637
  $ assistant x tweet 1234567890
616
638
  $ assistant x tweet https://x.com/elonmusk/status/1234567890
617
- $ assistant x tweet https://x.com/openai/status/9876543210 --json`,
639
+ $ assistant x tweet https://x.com/openai/status/9876543210 --json
640
+ $ assistant x tweet 1234567890 --strategy managed`,
618
641
  )
619
- .action(async (tweetIdOrUrl: string, _opts: unknown, cmd: Command) => {
620
- await run(cmd, async () => {
621
- const idMatch = tweetIdOrUrl.match(/(\d+)\s*$/);
622
- if (!idMatch)
623
- throw new Error(`Could not extract tweet ID from: ${tweetIdOrUrl}`);
624
- const tweets = await getTweetDetail(idMatch[1]);
625
- return { tweets };
626
- });
627
- });
642
+ .action(
643
+ async (
644
+ tweetIdOrUrl: string,
645
+ opts: { strategy?: string },
646
+ cmd: Command,
647
+ ) => {
648
+ await run(cmd, async () => {
649
+ const idMatch = tweetIdOrUrl.match(/(\d+)\s*$/);
650
+ if (!idMatch)
651
+ throw new Error(`Could not extract tweet ID from: ${tweetIdOrUrl}`);
652
+ const strategy = (opts.strategy ?? "browser") as TwitterStrategy;
653
+ if (
654
+ strategy !== "oauth" &&
655
+ strategy !== "browser" &&
656
+ strategy !== "auto" &&
657
+ strategy !== "managed"
658
+ ) {
659
+ throw new Error(
660
+ `Invalid strategy "${opts.strategy}". Must be oauth, browser, auto, or managed.`,
661
+ );
662
+ }
663
+ const { result: tweets, pathUsed } = await routedGetTweetDetail(
664
+ idMatch[1],
665
+ { strategy },
666
+ );
667
+ return { tweets, pathUsed };
668
+ });
669
+ },
670
+ );
628
671
 
629
672
  // =========================================================================
630
673
  // search — search tweets
@@ -633,6 +676,10 @@ Examples:
633
676
  .description("Search tweets")
634
677
  .argument("<query>", "Search query")
635
678
  .option("--product <type>", "Top, Latest, People, or Media", "Top")
679
+ .option(
680
+ "--strategy <strategy>",
681
+ "Operation strategy: managed or browser (default: browser)",
682
+ )
636
683
  .addHelpText(
637
684
  "after",
638
685
  `
@@ -646,22 +693,43 @@ The --product flag selects the search result type:
646
693
  People — user accounts matching the query
647
694
  Media — tweets containing images or video
648
695
 
649
- Uses the browser session path. Requires an active browser session.
696
+ Use --strategy managed to route through the platform proxy (uses Twitter's
697
+ recent search API).
650
698
 
651
699
  Examples:
652
700
  $ assistant x search "AI agents"
653
701
  $ assistant x search "from:elonmusk SpaceX" --product Latest
654
- $ assistant x search "machine learning" --product Media --json`,
702
+ $ assistant x search "machine learning" --product Media --json
703
+ $ assistant x search "AI agents" --strategy managed`,
655
704
  )
656
- .action(async (query: string, opts: { product: string }, cmd: Command) => {
657
- await run(cmd, async () => {
658
- const tweets = await searchTweets(
659
- query,
660
- opts.product as "Top" | "Latest" | "People" | "Media",
661
- );
662
- return { query, tweets };
663
- });
664
- });
705
+ .action(
706
+ async (
707
+ query: string,
708
+ opts: { product: string; strategy?: string },
709
+ cmd: Command,
710
+ ) => {
711
+ await run(cmd, async () => {
712
+ const strategy = (opts.strategy ?? "browser") as TwitterStrategy;
713
+ if (
714
+ strategy !== "oauth" &&
715
+ strategy !== "browser" &&
716
+ strategy !== "auto" &&
717
+ strategy !== "managed"
718
+ ) {
719
+ throw new Error(
720
+ `Invalid strategy "${opts.strategy}". Must be oauth, browser, auto, or managed.`,
721
+ );
722
+ }
723
+ const product = opts.product as "Top" | "Latest" | "People" | "Media";
724
+ const { result: tweets, pathUsed } = await routedSearchTweets(
725
+ query,
726
+ product,
727
+ { strategy },
728
+ );
729
+ return { query, tweets, pathUsed };
730
+ });
731
+ },
732
+ );
665
733
 
666
734
  // =========================================================================
667
735
  // bookmarks — fetch bookmarks
@@ -875,108 +943,94 @@ Examples:
875
943
  }
876
944
 
877
945
  // ---------------------------------------------------------------------------
878
- // Daemon IPC helper — send a message and wait for the first response
946
+ // Daemon HTTP helper — send requests to the daemon's HTTP API
879
947
  // ---------------------------------------------------------------------------
880
948
 
881
- function sendDaemonMessage(
882
- message: import("../daemon/ipc-protocol.js").ClientMessage,
883
- expectedResponseType: string,
949
+ /**
950
+ * Send a Twitter integration config request to the daemon via HTTP.
951
+ *
952
+ * Maps the old IPC `twitter_integration_config` message actions to HTTP
953
+ * endpoints on the settings routes:
954
+ * - "get" / "get_strategy" → GET /v1/integrations/twitter/auth/status
955
+ * - "set_strategy" → PUT /v1/settings/client (key=twitter.strategy)
956
+ */
957
+ async function sendTwitterConfigRequest(
958
+ action: string,
959
+ extra?: Record<string, unknown>,
884
960
  ): Promise<Record<string, unknown>> {
885
- return new Promise((resolve, reject) => {
886
- const socketPath = getSocketPath();
887
- const sessionToken = readSessionToken();
888
- const socket = net.createConnection(socketPath);
889
- const parser = createMessageParser();
890
-
891
- const timeoutHandle = setTimeout(() => {
892
- socket.destroy();
893
- reject(new Error("Request timed out after 10s"));
894
- }, 10_000);
895
- timeoutHandle.unref();
896
-
897
- let authenticated = !sessionToken;
898
- let messageSent = false;
899
-
900
- const sendPayload = () => {
901
- if (messageSent) return;
902
- messageSent = true;
903
- socket.write(serialize(message));
904
- };
905
-
906
- socket.on("error", (err) => {
907
- clearTimeout(timeoutHandle);
908
- reject(
909
- new Error(
910
- `Cannot connect to assistant: ${err.message}. Is the assistant running?`,
911
- ),
912
- );
961
+ if (action === "get" || action === "get_strategy") {
962
+ const response = await httpSend("/v1/integrations/twitter/auth/status", {
963
+ method: "GET",
913
964
  });
965
+ if (!response.ok) {
966
+ const text = await response.text();
967
+ throw new Error(`Assistant returned an error: ${text}`);
968
+ }
969
+ const data = (await response.json()) as Record<string, unknown>;
970
+ // Map the HTTP response shape to the old IPC response shape
971
+ return {
972
+ type: "twitter_integration_config_response",
973
+ success: true,
974
+ connected: data.connected ?? false,
975
+ accountInfo: data.accountInfo,
976
+ strategy: data.strategy ?? "auto",
977
+ strategyConfigured: data.strategyConfigured ?? false,
978
+ mode: data.mode,
979
+ managedAvailable: data.managedAvailable ?? false,
980
+ managedPrerequisites: data.managedPrerequisites,
981
+ localClientConfigured: data.localClientConfigured ?? false,
982
+ };
983
+ }
914
984
 
915
- socket.on("data", (chunk) => {
916
- const messages = parser.feed(chunk.toString("utf-8"));
917
- for (const msg of messages) {
918
- const m = msg as unknown as Record<string, unknown>;
919
-
920
- if (!authenticated && m.type === "auth_result") {
921
- if ((m as { success: boolean }).success) {
922
- authenticated = true;
923
- sendPayload();
924
- } else {
925
- clearTimeout(timeoutHandle);
926
- socket.destroy();
927
- reject(new Error("Authentication failed"));
928
- }
929
- continue;
930
- }
931
-
932
- // Reject immediately on daemon error frames so the CLI surfaces the
933
- // real failure reason instead of hanging until the timeout fires.
934
- if (m.type === "error") {
935
- clearTimeout(timeoutHandle);
936
- socket.destroy();
937
- reject(
938
- new Error(
939
- (m as { message?: string }).message ??
940
- "Assistant returned an error",
941
- ),
942
- );
943
- return;
944
- }
945
-
946
- // Only resolve on the expected response type; skip everything else
947
- if (m.type === expectedResponseType) {
948
- clearTimeout(timeoutHandle);
949
- socket.destroy();
950
- resolve(m);
951
- return;
952
- }
953
- // Skip all other message types (auth_result, daemon_status, pong, session_info, tasks_changed, etc.)
954
- }
985
+ if (action === "set_strategy") {
986
+ const strategy = extra?.strategy as string | undefined;
987
+ if (!strategy) throw new Error("strategy is required for set_strategy");
988
+ const response = await httpSend("/v1/settings/client", {
989
+ method: "PUT",
990
+ body: JSON.stringify({ key: "twitter.strategy", value: strategy }),
955
991
  });
992
+ if (!response.ok) {
993
+ const text = await response.text();
994
+ throw new Error(`Assistant returned an error: ${text}`);
995
+ }
996
+ return {
997
+ type: "twitter_integration_config_response",
998
+ success: true,
999
+ strategy,
1000
+ };
1001
+ }
956
1002
 
957
- socket.on("connect", () => {
958
- if (sessionToken) {
959
- socket.write(
960
- serialize({
961
- type: "auth",
962
- token: sessionToken,
963
- } as unknown as import("../daemon/ipc-protocol.js").ClientMessage),
964
- );
965
- } else {
966
- sendPayload();
967
- }
968
- });
969
- });
1003
+ throw new Error(`Unsupported twitter_integration_config action: ${action}`);
970
1004
  }
971
1005
 
972
1006
  // ---------------------------------------------------------------------------
973
- // Chrome CDP helpers (shared)
1007
+ // Chrome CDP helpers (via `assistant browser chrome` CLI)
974
1008
  // ---------------------------------------------------------------------------
975
1009
 
976
- import {
977
- ensureChromeWithCdp,
978
- minimizeChromeWindow,
979
- } from "../tools/browser/chrome-cdp.js";
1010
+ async function launchChromeCdp(
1011
+ startUrl?: string,
1012
+ ): Promise<{ baseUrl: string }> {
1013
+ const args = ["browser", "chrome", "launch"];
1014
+ if (startUrl) args.push("--start-url", startUrl);
1015
+ const { stdout } = await execFileAsync("assistant", args);
1016
+ const result = JSON.parse(stdout) as {
1017
+ ok: boolean;
1018
+ baseUrl?: string;
1019
+ error?: string;
1020
+ };
1021
+ if (!result.ok || !result.baseUrl) {
1022
+ throw new Error(result.error ?? "Failed to launch Chrome with CDP");
1023
+ }
1024
+ return { baseUrl: result.baseUrl };
1025
+ }
1026
+
1027
+ async function minimizeChrome(): Promise<void> {
1028
+ try {
1029
+ await execFileAsync("assistant", ["browser", "chrome", "minimize"]);
1030
+ } catch {
1031
+ // best-effort — same as the original
1032
+ }
1033
+ }
980
1034
 
981
1035
  // ---------------------------------------------------------------------------
982
1036
  // Ride Shotgun learn session helper
@@ -1012,100 +1066,95 @@ async function navigateToX(cdpBase: string): Promise<void> {
1012
1066
  async function startLearnSession(
1013
1067
  durationSeconds: number,
1014
1068
  ): Promise<LearnResult> {
1015
- const cdpSession = await ensureChromeWithCdp({
1016
- startUrl: "https://x.com/login",
1017
- });
1069
+ const cdpSession = await launchChromeCdp("https://x.com/login");
1018
1070
  await navigateToX(cdpSession.baseUrl);
1019
1071
 
1020
- return new Promise((resolve, reject) => {
1021
- const socketPath = getSocketPath();
1022
- const sessionToken = readSessionToken();
1023
- const socket = net.createConnection(socketPath);
1024
- const parser = createMessageParser();
1025
-
1026
- socket.on("error", (err) => {
1027
- reject(
1028
- new Error(
1029
- `Cannot connect to assistant: ${err.message}. Is the assistant running?`,
1030
- ),
1031
- );
1032
- });
1072
+ // Start ride shotgun via HTTP
1073
+ const response = await httpSend("/v1/computer-use/ride-shotgun/start", {
1074
+ method: "POST",
1075
+ body: JSON.stringify({
1076
+ durationSeconds,
1077
+ intervalSeconds: 5,
1078
+ mode: "learn",
1079
+ targetDomain: "x.com",
1080
+ }),
1081
+ });
1082
+
1083
+ if (!response.ok) {
1084
+ const body = await response.text();
1085
+ throw new Error(
1086
+ `Cannot connect to assistant: ${response.status} ${body}. Is the assistant running?`,
1087
+ );
1088
+ }
1089
+
1090
+ const startResult = (await response.json()) as {
1091
+ watchId?: string;
1092
+ sessionId?: string;
1093
+ };
1033
1094
 
1034
- const timeoutHandle = setTimeout(
1035
- () => {
1036
- socket.destroy();
1095
+ if (!startResult.watchId) {
1096
+ throw new Error("Ride-shotgun start response missing watchId");
1097
+ }
1098
+
1099
+ // Poll the status endpoint using watchId to correlate completion
1100
+ const { watchId } = startResult;
1101
+ const timeoutMs = (durationSeconds + 30) * 1000;
1102
+ const pollIntervalMs = 2000;
1103
+ const startTime = Date.now();
1104
+
1105
+ return new Promise<LearnResult>((resolve, reject) => {
1106
+ const tick = async () => {
1107
+ if (Date.now() - startTime > timeoutMs) {
1037
1108
  reject(
1038
1109
  new Error(`Learn session timed out after ${durationSeconds + 30}s`),
1039
1110
  );
1040
- },
1041
- (durationSeconds + 30) * 1000,
1042
- );
1043
- timeoutHandle.unref();
1044
-
1045
- let authenticated = !sessionToken;
1046
-
1047
- const sendStartCommand = () => {
1048
- socket.write(
1049
- serialize({
1050
- type: "ride_shotgun_start",
1051
- durationSeconds,
1052
- intervalSeconds: 5,
1053
- mode: "learn",
1054
- targetDomain: "x.com",
1055
- } as unknown as import("../daemon/ipc-protocol.js").ClientMessage),
1056
- );
1057
- };
1058
-
1059
- socket.on("data", (chunk) => {
1060
- const messages = parser.feed(chunk.toString("utf-8"));
1061
- for (const msg of messages) {
1062
- const m = msg as unknown as Record<string, unknown>;
1111
+ return;
1112
+ }
1063
1113
 
1064
- if (!authenticated && m.type === "auth_result") {
1065
- if ((m as { success: boolean }).success) {
1066
- authenticated = true;
1067
- sendStartCommand();
1068
- } else {
1069
- clearTimeout(timeoutHandle);
1070
- socket.destroy();
1071
- reject(new Error("Authentication failed"));
1072
- }
1073
- continue;
1114
+ try {
1115
+ const statusRes = await httpSend(
1116
+ `/v1/computer-use/ride-shotgun/status/${watchId}`,
1117
+ { method: "GET" },
1118
+ );
1119
+ if (!statusRes.ok) {
1120
+ setTimeout(tick, pollIntervalMs);
1121
+ return;
1074
1122
  }
1075
1123
 
1076
- if (m.type === "auth_result") {
1077
- continue;
1078
- }
1124
+ const status = (await statusRes.json()) as {
1125
+ status: string;
1126
+ recordingId?: string;
1127
+ savedRecordingPath?: string;
1128
+ bootstrapFailureReason?: string;
1129
+ };
1079
1130
 
1080
- if (m.type === "ride_shotgun_error") {
1081
- clearTimeout(timeoutHandle);
1082
- socket.destroy();
1083
- reject(new Error((m as { message: string }).message));
1084
- continue;
1131
+ if (status.bootstrapFailureReason) {
1132
+ reject(
1133
+ new Error(`Learn session failed: ${status.bootstrapFailureReason}`),
1134
+ );
1135
+ return;
1085
1136
  }
1086
1137
 
1087
- if (m.type === "ride_shotgun_result") {
1088
- clearTimeout(timeoutHandle);
1089
- socket.destroy();
1090
- resolve({
1091
- recordingId: m.recordingId as string | undefined,
1092
- recordingPath: m.recordingPath as string | undefined,
1093
- });
1138
+ if (status.status === "completed") {
1139
+ if (status.recordingId) {
1140
+ resolve({
1141
+ recordingId: status.recordingId,
1142
+ recordingPath: status.savedRecordingPath,
1143
+ });
1144
+ } else {
1145
+ reject(
1146
+ new Error("Learn session completed but no recording was saved."),
1147
+ );
1148
+ }
1149
+ return;
1094
1150
  }
1151
+ } catch {
1152
+ // Status endpoint not reachable — continue polling
1095
1153
  }
1096
- });
1097
1154
 
1098
- socket.on("connect", () => {
1099
- if (sessionToken) {
1100
- socket.write(
1101
- serialize({
1102
- type: "auth",
1103
- token: sessionToken,
1104
- } as unknown as import("../daemon/ipc-protocol.js").ClientMessage),
1105
- );
1106
- } else {
1107
- sendStartCommand();
1108
- }
1109
- });
1155
+ setTimeout(tick, pollIntervalMs);
1156
+ };
1157
+
1158
+ setTimeout(tick, pollIntervalMs);
1110
1159
  });
1111
1160
  }