@vellumai/assistant 0.4.44 → 0.4.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (681) hide show
  1. package/.prettierignore +4 -0
  2. package/ARCHITECTURE.md +34 -31
  3. package/README.md +4 -4
  4. package/bun.lock +10 -35
  5. package/docs/architecture/integrations.md +102 -197
  6. package/docs/architecture/keychain-broker.md +1 -1
  7. package/docs/architecture/memory.md +2 -2
  8. package/docs/architecture/scheduling.md +1 -1
  9. package/docs/architecture/security.md +11 -11
  10. package/docs/error-handling.md +1 -1
  11. package/docs/trusted-contact-access.md +3 -3
  12. package/drizzle/meta/0000_snapshot.json +34 -100
  13. package/drizzle/meta/_journal.json +1 -1
  14. package/drizzle.config.ts +4 -4
  15. package/package.json +3 -2
  16. package/scripts/capture-x-graphql.ts +237 -141
  17. package/scripts/generate-bundled-tool-registry.ts +223 -0
  18. package/src/__tests__/access-request-decision.test.ts +0 -1
  19. package/src/__tests__/actor-token-service.test.ts +23 -24
  20. package/src/__tests__/agent-loop.test.ts +0 -131
  21. package/src/__tests__/always-loaded-tools-guard.test.ts +71 -0
  22. package/src/__tests__/amazon-cdp-integration.test.ts +11 -9
  23. package/src/__tests__/approval-primitive.test.ts +0 -1
  24. package/src/__tests__/approval-routes-http.test.ts +11 -1
  25. package/src/__tests__/asset-materialize-tool.test.ts +0 -1
  26. package/src/__tests__/asset-search-tool.test.ts +0 -1
  27. package/src/__tests__/assistant-attachment-directive.test.ts +1 -1
  28. package/src/__tests__/assistant-events-sse-hardening.test.ts +0 -1
  29. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +0 -2
  30. package/src/__tests__/assistant-feature-flags-integration.test.ts +70 -18
  31. package/src/__tests__/assistant-id-boundary-guard.test.ts +6 -6
  32. package/src/__tests__/attachments-store.test.ts +0 -1
  33. package/src/__tests__/avatar-e2e.test.ts +74 -115
  34. package/src/__tests__/avatar-router.test.ts +25 -62
  35. package/src/__tests__/browser-manager.test.ts +24 -0
  36. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +4 -3
  37. package/src/__tests__/browser-skill-endstate.test.ts +8 -11
  38. package/src/__tests__/btw-routes.test.ts +326 -0
  39. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
  40. package/src/__tests__/call-controller.test.ts +0 -1
  41. package/src/__tests__/call-conversation-messages.test.ts +0 -1
  42. package/src/__tests__/call-domain.test.ts +0 -1
  43. package/src/__tests__/call-pointer-messages.test.ts +0 -1
  44. package/src/__tests__/call-recovery.test.ts +0 -1
  45. package/src/__tests__/call-routes-http.test.ts +0 -1
  46. package/src/__tests__/call-store.test.ts +0 -1
  47. package/src/__tests__/canonical-guardian-store.test.ts +0 -1
  48. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  49. package/src/__tests__/channel-approvals.test.ts +1 -1
  50. package/src/__tests__/channel-delivery-store.test.ts +0 -1
  51. package/src/__tests__/channel-guardian.test.ts +5 -7
  52. package/src/__tests__/channel-retry-sweep.test.ts +0 -1
  53. package/src/__tests__/checker.test.ts +4 -11
  54. package/src/__tests__/compaction.benchmark.test.ts +16 -14
  55. package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
  56. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  57. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
  58. package/src/__tests__/computer-use-tools.test.ts +35 -31
  59. package/src/__tests__/config-schema.test.ts +11 -15
  60. package/src/__tests__/config-watcher.test.ts +0 -1
  61. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  62. package/src/__tests__/conflict-store.test.ts +0 -1
  63. package/src/__tests__/connection-policy.test.ts +4 -7
  64. package/src/__tests__/contacts-tools.test.ts +0 -1
  65. package/src/__tests__/context-memory-e2e.test.ts +2 -4
  66. package/src/__tests__/context-overflow-reducer.test.ts +2 -4
  67. package/src/__tests__/context-window-manager.test.ts +147 -60
  68. package/src/__tests__/contradiction-checker.test.ts +0 -1
  69. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  70. package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
  71. package/src/__tests__/conversation-pairing.test.ts +2 -2
  72. package/src/__tests__/conversation-routes-guardian-reply.test.ts +25 -1
  73. package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
  74. package/src/__tests__/conversation-store.test.ts +0 -1
  75. package/src/__tests__/conversation-unread-route.test.ts +1 -2
  76. package/src/__tests__/credential-security-invariants.test.ts +7 -8
  77. package/src/__tests__/cross-provider-web-search.test.ts +353 -0
  78. package/src/__tests__/daemon-assistant-events.test.ts +6 -7
  79. package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
  80. package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
  81. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
  82. package/src/__tests__/diagnostics-export.test.ts +189 -0
  83. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  84. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  85. package/src/__tests__/entity-extractor.test.ts +0 -1
  86. package/src/__tests__/entity-search.test.ts +0 -1
  87. package/src/__tests__/ephemeral-permissions.test.ts +2 -4
  88. package/src/__tests__/file-read-tool.test.ts +86 -0
  89. package/src/__tests__/followup-tools.test.ts +0 -1
  90. package/src/__tests__/frontmatter.test.ts +77 -34
  91. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  92. package/src/__tests__/gateway-only-guard.test.ts +1 -1
  93. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
  94. package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
  95. package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
  96. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  97. package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
  98. package/src/__tests__/guardian-action-store.test.ts +0 -1
  99. package/src/__tests__/guardian-action-sweep.test.ts +0 -1
  100. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  101. package/src/__tests__/guardian-dispatch.test.ts +1 -2
  102. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  103. package/src/__tests__/guardian-outbound-http.test.ts +0 -1
  104. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
  105. package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
  106. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  107. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  108. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
  109. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
  110. package/src/__tests__/host-bash-proxy.test.ts +335 -0
  111. package/src/__tests__/host-file-proxy.test.ts +374 -0
  112. package/src/__tests__/host-shell-tool.test.ts +147 -1
  113. package/src/__tests__/http-user-message-parity.test.ts +361 -0
  114. package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
  115. package/src/__tests__/integration-status.test.ts +3 -8
  116. package/src/__tests__/intent-routing.test.ts +7 -46
  117. package/src/__tests__/invite-redemption-service.test.ts +0 -1
  118. package/src/__tests__/invite-routes-http.test.ts +0 -1
  119. package/src/__tests__/llm-usage-store.test.ts +0 -1
  120. package/src/__tests__/managed-avatar-client.test.ts +101 -55
  121. package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
  122. package/src/__tests__/managed-store.test.ts +94 -21
  123. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
  124. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
  125. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
  126. package/src/__tests__/memory-recall-quality.test.ts +0 -1
  127. package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
  128. package/src/__tests__/memory-regressions.test.ts +0 -1
  129. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
  130. package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
  131. package/src/__tests__/messaging-send-tool.test.ts +35 -0
  132. package/src/__tests__/messaging-skill-split.test.ts +138 -0
  133. package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
  134. package/src/__tests__/migration-export-http.test.ts +2 -3
  135. package/src/__tests__/migration-import-commit-http.test.ts +1 -2
  136. package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
  137. package/src/__tests__/migration-validate-http.test.ts +1 -2
  138. package/src/__tests__/native-web-search.test.ts +475 -0
  139. package/src/__tests__/navigate-settings-tab.test.ts +84 -0
  140. package/src/__tests__/non-member-access-request.test.ts +0 -1
  141. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  142. package/src/__tests__/notification-decision-strategy.test.ts +6 -6
  143. package/src/__tests__/notification-deep-link.test.ts +7 -7
  144. package/src/__tests__/notification-guardian-path.test.ts +2 -3
  145. package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
  146. package/src/__tests__/notification-thread-candidates.test.ts +4 -4
  147. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  148. package/src/__tests__/playbook-execution.test.ts +0 -1
  149. package/src/__tests__/playbook-tools.test.ts +0 -1
  150. package/src/__tests__/profile-compiler.test.ts +0 -1
  151. package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
  152. package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
  153. package/src/__tests__/recording-handler.test.ts +30 -94
  154. package/src/__tests__/registry.test.ts +28 -35
  155. package/src/__tests__/relay-server.test.ts +0 -1
  156. package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
  157. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  158. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  159. package/src/__tests__/runtime-events-sse.test.ts +0 -1
  160. package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
  161. package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
  162. package/src/__tests__/schedule-store.test.ts +441 -1
  163. package/src/__tests__/schedule-tools.test.ts +468 -7
  164. package/src/__tests__/scheduler-recurrence.test.ts +196 -23
  165. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  166. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  167. package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
  168. package/src/__tests__/secret-response-routing.test.ts +4 -1
  169. package/src/__tests__/send-endpoint-busy.test.ts +14 -2
  170. package/src/__tests__/send-notification-tool.test.ts +0 -7
  171. package/src/__tests__/sequence-store.test.ts +0 -1
  172. package/src/__tests__/server-history-render.test.ts +1 -2
  173. package/src/__tests__/session-abort-tool-results.test.ts +0 -1
  174. package/src/__tests__/session-agent-loop.test.ts +46 -6
  175. package/src/__tests__/session-confirmation-signals.test.ts +0 -1
  176. package/src/__tests__/session-conflict-gate.test.ts +2 -6
  177. package/src/__tests__/session-error.test.ts +5 -14
  178. package/src/__tests__/session-init.benchmark.test.ts +3 -5
  179. package/src/__tests__/session-load-history-repair.test.ts +0 -1
  180. package/src/__tests__/session-media-retry.test.ts +12 -74
  181. package/src/__tests__/session-pre-run-repair.test.ts +0 -1
  182. package/src/__tests__/session-profile-injection.test.ts +2 -6
  183. package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
  184. package/src/__tests__/session-queue.test.ts +94 -139
  185. package/src/__tests__/session-skill-tools.test.ts +115 -115
  186. package/src/__tests__/session-slash-known.test.ts +0 -1
  187. package/src/__tests__/session-slash-queue.test.ts +0 -1
  188. package/src/__tests__/session-slash-unknown.test.ts +0 -1
  189. package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
  190. package/src/__tests__/session-usage.test.ts +0 -1
  191. package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
  192. package/src/__tests__/session-workspace-injection.test.ts +2 -6
  193. package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
  194. package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
  195. package/src/__tests__/skill-feature-flags.test.ts +125 -18
  196. package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
  197. package/src/__tests__/skill-load-tool.test.ts +194 -2
  198. package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
  199. package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
  200. package/src/__tests__/skills.test.ts +14 -53
  201. package/src/__tests__/slack-channel-config.test.ts +0 -1
  202. package/src/__tests__/slack-inbound-verification.test.ts +0 -1
  203. package/src/__tests__/slack-skill.test.ts +1 -1
  204. package/src/__tests__/subagent-tools.test.ts +2 -2
  205. package/src/__tests__/system-prompt.test.ts +4 -3
  206. package/src/__tests__/task-compiler.test.ts +0 -1
  207. package/src/__tests__/task-management-tools.test.ts +0 -1
  208. package/src/__tests__/task-memory-cleanup.test.ts +0 -1
  209. package/src/__tests__/task-runner.test.ts +0 -1
  210. package/src/__tests__/task-scheduler.test.ts +0 -1
  211. package/src/__tests__/terminal-tools.test.ts +0 -1
  212. package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
  213. package/src/__tests__/thread-seed-composer.test.ts +5 -5
  214. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  215. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  216. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  217. package/src/__tests__/tool-executor.test.ts +8 -86
  218. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  219. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  220. package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
  221. package/src/__tests__/trust-store.test.ts +80 -4
  222. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  223. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  224. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
  225. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  226. package/src/__tests__/trusted-contact-verification.test.ts +0 -1
  227. package/src/__tests__/twilio-provider.test.ts +0 -1
  228. package/src/__tests__/twilio-routes.test.ts +0 -1
  229. package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
  230. package/src/__tests__/update-bulletin.test.ts +0 -1
  231. package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
  232. package/src/__tests__/usage-routes.test.ts +0 -1
  233. package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
  234. package/src/__tests__/voice-invite-redemption.test.ts +0 -1
  235. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  236. package/src/__tests__/voice-session-bridge.test.ts +9 -1
  237. package/src/__tests__/web-fetch.test.ts +57 -0
  238. package/src/__tests__/workspace-git-service.test.ts +5 -14
  239. package/src/__tests__/workspace-policy.test.ts +0 -1
  240. package/src/agent/loop.ts +22 -34
  241. package/src/bundler/bundle-signer.ts +4 -4
  242. package/src/calls/call-controller.ts +1 -1
  243. package/src/calls/relay-server.ts +1 -1
  244. package/src/calls/twilio-rest.ts +1 -1
  245. package/src/calls/voice-session-bridge.ts +3 -1
  246. package/src/cli/__tests__/notifications.test.ts +3 -4
  247. package/src/cli/commands/map.ts +2 -6
  248. package/src/cli/commands/mcp.ts +73 -15
  249. package/src/cli/commands/notifications.ts +4 -4
  250. package/src/cli/commands/sessions.ts +9 -1
  251. package/src/cli/commands/skills.ts +6 -10
  252. package/src/cli/http-client.ts +2 -3
  253. package/src/cli/main-screen.tsx +10 -10
  254. package/src/cli/program.ts +0 -4
  255. package/src/cli/reference.ts +0 -2
  256. package/src/cli.ts +15 -9
  257. package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
  258. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
  259. package/src/config/bundled-skills/app-builder/SKILL.md +6 -1
  260. package/src/config/bundled-skills/browser/SKILL.md +6 -1
  261. package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
  262. package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
  263. package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
  264. package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
  265. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
  266. package/src/config/bundled-skills/contacts/SKILL.md +10 -1
  267. package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
  268. package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
  269. package/src/config/bundled-skills/document/SKILL.md +4 -1
  270. package/src/config/bundled-skills/doordash/SKILL.md +8 -1
  271. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
  272. package/src/config/bundled-skills/followups/SKILL.md +4 -1
  273. package/src/config/bundled-skills/gmail/SKILL.md +180 -0
  274. package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
  275. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
  276. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
  277. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
  278. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
  279. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
  280. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
  281. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
  282. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
  283. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
  284. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
  285. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
  286. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
  287. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
  288. package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
  289. package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
  290. package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
  291. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
  292. package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
  293. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
  294. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
  295. package/src/config/bundled-skills/messaging/SKILL.md +23 -139
  296. package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
  297. package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
  298. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
  299. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
  300. package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
  301. package/src/config/bundled-skills/notifications/SKILL.md +5 -1
  302. package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
  303. package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
  304. package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → orchestration/tools/swarm-delegate.ts} +3 -3
  305. package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
  306. package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
  307. package/src/config/bundled-skills/schedule/SKILL.md +70 -9
  308. package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
  309. package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
  310. package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
  311. package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
  312. package/src/config/bundled-skills/sequences/SKILL.md +47 -0
  313. package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
  314. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
  315. package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
  316. package/src/config/bundled-skills/settings/SKILL.md +12 -0
  317. package/src/config/bundled-skills/settings/TOOLS.json +112 -0
  318. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
  319. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
  320. package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
  321. package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
  322. package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
  323. package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
  324. package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
  325. package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
  326. package/src/config/bundled-skills/slack/SKILL.md +5 -1
  327. package/src/config/bundled-skills/subagent/SKILL.md +4 -1
  328. package/src/config/bundled-skills/tasks/SKILL.md +5 -2
  329. package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
  330. package/src/config/bundled-skills/watcher/SKILL.md +4 -1
  331. package/src/config/bundled-tool-registry.ts +118 -107
  332. package/src/config/env.ts +5 -2
  333. package/src/config/feature-flag-registry.json +25 -9
  334. package/src/config/loader.ts +10 -2
  335. package/src/config/schema.ts +19 -16
  336. package/src/config/schemas/inference.ts +12 -22
  337. package/src/config/schemas/memory-storage.ts +19 -1
  338. package/src/config/schemas/platform.ts +0 -16
  339. package/src/config/skill-state.ts +11 -8
  340. package/src/config/skills.ts +83 -32
  341. package/src/context/token-estimator.ts +11 -0
  342. package/src/context/window-manager.ts +180 -151
  343. package/src/daemon/computer-use-session.ts +11 -43
  344. package/src/daemon/daemon-control.ts +4 -1
  345. package/src/daemon/handlers/config-channels.ts +5 -9
  346. package/src/daemon/handlers/config-ingress.ts +0 -4
  347. package/src/daemon/handlers/config-model.ts +7 -13
  348. package/src/daemon/handlers/config-telegram.ts +4 -8
  349. package/src/daemon/handlers/config-voice.ts +2 -5
  350. package/src/daemon/handlers/dictation.ts +2 -12
  351. package/src/daemon/handlers/identity.ts +0 -105
  352. package/src/daemon/handlers/recording.ts +3 -23
  353. package/src/daemon/handlers/session-history.ts +1 -1
  354. package/src/daemon/handlers/sessions.ts +53 -72
  355. package/src/daemon/handlers/shared.ts +7 -28
  356. package/src/daemon/handlers/skills.ts +31 -27
  357. package/src/daemon/host-bash-proxy.ts +148 -0
  358. package/src/daemon/host-file-proxy.ts +135 -0
  359. package/src/daemon/lifecycle.ts +49 -24
  360. package/src/daemon/mcp-reload-service.ts +123 -0
  361. package/src/daemon/message-protocol.ts +6 -0
  362. package/src/daemon/message-types/browser.ts +1 -1
  363. package/src/daemon/message-types/computer-use.ts +1 -4
  364. package/src/daemon/message-types/guardian-actions.ts +1 -1
  365. package/src/daemon/message-types/host-bash.ts +18 -0
  366. package/src/daemon/message-types/host-file.ts +44 -0
  367. package/src/daemon/message-types/integrations.ts +1 -67
  368. package/src/daemon/message-types/messages.ts +15 -0
  369. package/src/daemon/message-types/schedules.ts +11 -27
  370. package/src/daemon/message-types/sessions.ts +2 -1
  371. package/src/daemon/message-types/settings.ts +1 -1
  372. package/src/daemon/message-types/shared.ts +1 -1
  373. package/src/daemon/ride-shotgun-handler.ts +2 -42
  374. package/src/daemon/server.ts +43 -10
  375. package/src/daemon/session-agent-loop-handlers.ts +48 -7
  376. package/src/daemon/session-agent-loop.ts +97 -66
  377. package/src/daemon/session-attachments.ts +1 -1
  378. package/src/daemon/session-error.ts +17 -16
  379. package/src/daemon/session-lifecycle.ts +20 -1
  380. package/src/daemon/session-media-retry.ts +1 -15
  381. package/src/daemon/session-messaging.ts +14 -6
  382. package/src/daemon/session-process.ts +36 -7
  383. package/src/daemon/session-queue-manager.ts +62 -103
  384. package/src/daemon/session-runtime-assembly.ts +27 -0
  385. package/src/daemon/session-skill-tools.ts +12 -11
  386. package/src/daemon/session-slash.ts +7 -0
  387. package/src/daemon/session-surfaces.ts +19 -97
  388. package/src/daemon/session-tool-setup.ts +146 -6
  389. package/src/daemon/session.ts +77 -13
  390. package/src/errors.ts +0 -2
  391. package/src/export/formatter.ts +6 -0
  392. package/src/mcp/mcp-oauth-provider.ts +1 -3
  393. package/src/media/avatar-router.ts +20 -28
  394. package/src/media/avatar-types.ts +7 -14
  395. package/src/media/managed-avatar-client.ts +70 -34
  396. package/src/memory/conversation-title-service.ts +1 -2
  397. package/src/memory/db-init.ts +16 -0
  398. package/src/memory/embedding-backend.ts +129 -27
  399. package/src/memory/embedding-gemini.test.ts +256 -0
  400. package/src/memory/embedding-gemini.ts +47 -13
  401. package/src/memory/embedding-local.ts +14 -2
  402. package/src/memory/embedding-ollama.ts +15 -2
  403. package/src/memory/embedding-openai.ts +15 -2
  404. package/src/memory/embedding-types.test.ts +116 -0
  405. package/src/memory/embedding-types.ts +61 -0
  406. package/src/memory/fingerprint.ts +1 -1
  407. package/src/memory/indexer.ts +25 -1
  408. package/src/memory/job-handlers/embedding.test.ts +258 -0
  409. package/src/memory/job-handlers/embedding.ts +81 -1
  410. package/src/memory/job-handlers/index-maintenance.ts +35 -1
  411. package/src/memory/job-handlers/media-processing.ts +11 -1
  412. package/src/memory/job-utils.ts +21 -6
  413. package/src/memory/jobs-store.ts +5 -1
  414. package/src/memory/jobs-worker.ts +8 -0
  415. package/src/memory/message-content.ts +66 -0
  416. package/src/memory/migrations/100-core-tables.ts +1 -31
  417. package/src/memory/migrations/104-core-indexes.ts +0 -11
  418. package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
  419. package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
  420. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
  421. package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
  422. package/src/memory/migrations/index.ts +4 -0
  423. package/src/memory/migrations/registry.ts +19 -0
  424. package/src/memory/qdrant-client.ts +158 -43
  425. package/src/memory/retriever.test.ts +0 -1
  426. package/src/memory/retriever.ts +12 -2
  427. package/src/memory/schema/infrastructure.ts +5 -29
  428. package/src/memory/search/formatting.ts +34 -9
  429. package/src/memory/search/semantic.ts +57 -2
  430. package/src/memory/search/types.ts +2 -1
  431. package/src/notifications/AGENTS.md +2 -2
  432. package/src/notifications/README.md +59 -58
  433. package/src/notifications/adapters/macos.ts +1 -1
  434. package/src/notifications/broadcaster.ts +5 -5
  435. package/src/notifications/copy-composer.ts +1 -1
  436. package/src/notifications/decision-engine.ts +2 -2
  437. package/src/notifications/destination-resolver.ts +2 -2
  438. package/src/notifications/emit-signal.ts +8 -8
  439. package/src/notifications/signal.ts +1 -1
  440. package/src/notifications/thread-seed-composer.ts +1 -1
  441. package/src/oauth/connect-orchestrator.ts +1 -1
  442. package/src/oauth/token-persistence.ts +1 -1
  443. package/src/permissions/checker.ts +12 -1
  444. package/src/permissions/defaults.ts +10 -14
  445. package/src/permissions/trust-store.ts +37 -0
  446. package/src/permissions/workspace-policy.ts +0 -1
  447. package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
  448. package/src/prompts/computer-use-prompt.ts +1 -1
  449. package/src/prompts/system-prompt.ts +29 -30
  450. package/src/prompts/templates/SOUL.md +1 -2
  451. package/src/prompts/templates/UPDATES.md +16 -7
  452. package/src/providers/anthropic/client.ts +87 -33
  453. package/src/providers/gemini/client.ts +6 -0
  454. package/src/providers/managed-proxy/constants.ts +5 -0
  455. package/src/providers/openai/client.ts +15 -0
  456. package/src/providers/registry.ts +2 -2
  457. package/src/providers/types.ts +24 -2
  458. package/src/runtime/AGENTS.md +18 -0
  459. package/src/runtime/assistant-event-hub.ts +2 -3
  460. package/src/runtime/assistant-event.ts +4 -4
  461. package/src/runtime/auth/__tests__/context.test.ts +5 -5
  462. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  463. package/src/runtime/auth/__tests__/guard-tests.test.ts +2 -2
  464. package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
  465. package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
  466. package/src/runtime/auth/__tests__/scopes.test.ts +7 -7
  467. package/src/runtime/auth/__tests__/subject.test.ts +8 -8
  468. package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
  469. package/src/runtime/auth/route-policy.ts +8 -4
  470. package/src/runtime/auth/scopes.ts +1 -1
  471. package/src/runtime/auth/subject.ts +4 -4
  472. package/src/runtime/auth/token-service.ts +0 -23
  473. package/src/runtime/auth/types.ts +3 -3
  474. package/src/runtime/guardian-action-followup-executor.ts +1 -1
  475. package/src/runtime/guardian-action-grant-minter.ts +1 -1
  476. package/src/runtime/guardian-action-service.ts +3 -3
  477. package/src/runtime/http-server.ts +15 -2
  478. package/src/runtime/invite-service.ts +3 -3
  479. package/src/runtime/local-actor-identity.ts +17 -22
  480. package/src/runtime/pending-interactions.ts +21 -9
  481. package/src/runtime/routes/app-management-routes.ts +2 -3
  482. package/src/runtime/routes/approval-routes.ts +1 -3
  483. package/src/runtime/routes/btw-routes.ts +155 -0
  484. package/src/runtime/routes/computer-use-routes.ts +77 -31
  485. package/src/runtime/routes/conversation-routes.ts +230 -46
  486. package/src/runtime/routes/diagnostics-routes.ts +63 -29
  487. package/src/runtime/routes/documents-routes.ts +2 -2
  488. package/src/runtime/routes/global-search-routes.ts +1 -1
  489. package/src/runtime/routes/host-bash-routes.ts +83 -0
  490. package/src/runtime/routes/host-file-routes.ts +79 -0
  491. package/src/runtime/routes/integrations/slack/share.ts +1 -1
  492. package/src/runtime/routes/log-export-routes.ts +120 -0
  493. package/src/runtime/routes/mcp-routes.ts +20 -0
  494. package/src/runtime/routes/migration-routes.ts +3 -3
  495. package/src/runtime/routes/pairing-routes.ts +1 -1
  496. package/src/runtime/routes/recording-routes.ts +6 -4
  497. package/src/runtime/routes/schedule-routes.ts +31 -5
  498. package/src/runtime/routes/session-management-routes.ts +2 -6
  499. package/src/runtime/routes/session-query-routes.ts +18 -15
  500. package/src/runtime/routes/settings-routes.ts +7 -261
  501. package/src/runtime/routes/skills-routes.ts +7 -6
  502. package/src/runtime/routes/subagents-routes.ts +4 -10
  503. package/src/runtime/routes/surface-action-routes.ts +3 -14
  504. package/src/runtime/routes/surface-content-routes.ts +22 -5
  505. package/src/runtime/routes/work-items-routes.ts +21 -25
  506. package/src/runtime/routes/workspace-routes.test.ts +3 -3
  507. package/src/runtime/routes/workspace-utils.ts +1 -1
  508. package/src/runtime/telegram-streaming-delivery.ts +3 -0
  509. package/src/runtime/verification-outbound-actions.ts +2 -2
  510. package/src/schedule/integration-status.ts +0 -6
  511. package/src/schedule/schedule-store.ts +234 -43
  512. package/src/schedule/scheduler.ts +73 -74
  513. package/src/security/oauth2.ts +1 -1
  514. package/src/sequence/store.ts +12 -2
  515. package/src/skills/frontmatter.ts +19 -77
  516. package/src/skills/managed-store.ts +11 -2
  517. package/src/subagent/manager.ts +5 -3
  518. package/src/tasks/ephemeral-permissions.ts +3 -5
  519. package/src/tools/AGENTS.md +0 -1
  520. package/src/tools/browser/browser-manager.ts +17 -11
  521. package/src/tools/browser/jit-auth.ts +4 -1
  522. package/src/tools/claude-code/claude-code.ts +1 -1
  523. package/src/tools/computer-use/definitions.ts +48 -60
  524. package/src/tools/document/document-tool.ts +6 -6
  525. package/src/tools/filesystem/edit.ts +2 -1
  526. package/src/tools/filesystem/read.ts +20 -2
  527. package/src/tools/filesystem/write.ts +2 -1
  528. package/src/tools/host-filesystem/edit.ts +17 -1
  529. package/src/tools/host-filesystem/read.ts +16 -1
  530. package/src/tools/host-filesystem/write.ts +15 -1
  531. package/src/tools/host-terminal/host-shell.ts +24 -0
  532. package/src/tools/memory/definitions.ts +45 -81
  533. package/src/tools/memory/handlers.test.ts +0 -1
  534. package/src/tools/memory/handlers.ts +1 -1
  535. package/src/tools/memory/register.ts +26 -60
  536. package/src/tools/network/script-proxy/session-manager.ts +6 -8
  537. package/src/tools/network/web-fetch.ts +7 -1
  538. package/src/tools/network/web-search.ts +2 -1
  539. package/src/tools/registry.ts +23 -0
  540. package/src/tools/schedule/create.ts +113 -5
  541. package/src/tools/schedule/list.ts +57 -15
  542. package/src/tools/schedule/update.ts +73 -3
  543. package/src/tools/shared/filesystem/image-read.ts +192 -0
  544. package/src/tools/side-effects.ts +1 -7
  545. package/src/tools/skills/delete-managed.ts +27 -64
  546. package/src/tools/skills/execute.ts +54 -0
  547. package/src/tools/skills/load.ts +127 -5
  548. package/src/tools/skills/scaffold-managed.ts +93 -172
  549. package/src/tools/subagent/message.ts +0 -7
  550. package/src/tools/subagent/spawn.ts +1 -1
  551. package/src/tools/swarm/delegate.ts +0 -3
  552. package/src/tools/system/avatar-generator.ts +13 -19
  553. package/src/tools/system/request-permission.ts +2 -1
  554. package/src/tools/terminal/safe-env.ts +1 -0
  555. package/src/tools/tool-manifest.ts +41 -47
  556. package/src/tools/types.ts +6 -2
  557. package/src/tools/ui-surface/definitions.ts +0 -55
  558. package/src/util/errors.ts +0 -10
  559. package/src/workspace/git-service.ts +0 -2
  560. package/src/__tests__/account-registry.test.ts +0 -258
  561. package/src/__tests__/email-classifier.test.ts +0 -25
  562. package/src/__tests__/gmail-integration.test.ts +0 -97
  563. package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
  564. package/src/__tests__/managed-twitter-guardrails.test.ts +0 -357
  565. package/src/__tests__/recording-intent-fallback.test.ts +0 -199
  566. package/src/__tests__/recording-intent.test.ts +0 -985
  567. package/src/__tests__/recording-state-machine.test.ts +0 -1574
  568. package/src/__tests__/reminder-store.test.ts +0 -350
  569. package/src/__tests__/reminder.test.ts +0 -337
  570. package/src/__tests__/scan-result-store.test.ts +0 -121
  571. package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -475
  572. package/src/__tests__/view-image-tool.test.ts +0 -241
  573. package/src/cli/commands/amazon/cart.ts +0 -513
  574. package/src/cli/commands/amazon/checkout.ts +0 -394
  575. package/src/cli/commands/amazon/client.ts +0 -513
  576. package/src/cli/commands/amazon/index.ts +0 -885
  577. package/src/cli/commands/amazon/product-details.ts +0 -145
  578. package/src/cli/commands/amazon/request-extractor.ts +0 -187
  579. package/src/cli/commands/amazon/search.ts +0 -76
  580. package/src/cli/commands/amazon/session.ts +0 -108
  581. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -345
  582. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -252
  583. package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -151
  584. package/src/cli/commands/twitter/index.ts +0 -420
  585. package/src/cli/commands/twitter/oauth-client.ts +0 -60
  586. package/src/cli/commands/twitter/router.ts +0 -351
  587. package/src/cli/commands/twitter/types.ts +0 -30
  588. package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
  589. package/src/config/bundled-skills/agentmail/icon.svg +0 -21
  590. package/src/config/bundled-skills/amazon/SKILL.md +0 -136
  591. package/src/config/bundled-skills/amazon/icon.svg +0 -13
  592. package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
  593. package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
  594. package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
  595. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
  596. package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
  597. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
  598. package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
  599. package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
  600. package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
  601. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
  602. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
  603. package/src/config/bundled-skills/influencer/SKILL.md +0 -144
  604. package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
  605. package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
  606. package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
  607. package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
  608. package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
  609. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
  610. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
  611. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
  612. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
  613. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
  614. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
  615. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
  616. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
  617. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
  618. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
  619. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
  620. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
  621. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
  622. package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
  623. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
  624. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
  625. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
  626. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
  627. package/src/config/bundled-skills/notion/SKILL.md +0 -240
  628. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
  629. package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
  630. package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
  631. package/src/config/bundled-skills/reminder/SKILL.md +0 -79
  632. package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
  633. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
  634. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
  635. package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
  636. package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
  637. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
  638. package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
  639. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
  640. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
  641. package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
  642. package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
  643. package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
  644. package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
  645. package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
  646. package/src/config/bundled-skills/twitter/SKILL.md +0 -206
  647. package/src/config/bundled-skills/twitter/icon.svg +0 -14
  648. package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
  649. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
  650. package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
  651. package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
  652. package/src/daemon/handlers/pairing.ts +0 -119
  653. package/src/daemon/handlers/session-user-message.ts +0 -961
  654. package/src/daemon/recording-executor.ts +0 -180
  655. package/src/daemon/recording-intent-fallback.ts +0 -162
  656. package/src/daemon/recording-intent.ts +0 -493
  657. package/src/memory/account-store.ts +0 -117
  658. package/src/messaging/activity-analyzer.ts +0 -76
  659. package/src/messaging/email-classifier.ts +0 -208
  660. package/src/messaging/index.ts +0 -2
  661. package/src/messaging/outreach-classifier.ts +0 -185
  662. package/src/messaging/thread-summarizer.ts +0 -346
  663. package/src/messaging/types.ts +0 -17
  664. package/src/tools/browser/x-auto-navigate.ts +0 -254
  665. package/src/tools/credentials/account-registry.ts +0 -144
  666. package/src/tools/filesystem/view-image.ts +0 -244
  667. package/src/tools/reminder/reminder-store.ts +0 -194
  668. package/src/tools/reminder/reminder.ts +0 -158
  669. package/src/tools/system/navigate-settings.ts +0 -74
  670. package/src/tools/system/open-system-settings.ts +0 -85
  671. package/src/tools/system/version.ts +0 -54
  672. package/src/twitter/platform-proxy-client.ts +0 -408
  673. /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
  674. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
  675. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
  676. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
  677. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
  678. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
  679. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
  680. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
  681. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-list.ts +0 -0
@@ -13,24 +13,39 @@
13
13
  * --all Capture ALL GraphQL queries (skip relevance filter)
14
14
  */
15
15
 
16
- import { existsSync,mkdirSync } from 'node:fs';
16
+ import { existsSync, mkdirSync } from "node:fs";
17
17
 
18
- const CDP_BASE = 'http://localhost:9222';
19
- const CAPTURE_DIR = '/tmp/x-graphql-capture';
18
+ const CDP_BASE = "http://localhost:9222";
19
+ const CAPTURE_DIR = "/tmp/x-graphql-capture";
20
20
 
21
21
  // ─── Relevance filter ────────────────────────────────────────────────────────
22
22
 
23
23
  const RELEVANT_QUERIES = new Set([
24
24
  // Reads
25
- 'UserByScreenName', 'UserTweets', 'TweetDetail', 'TweetResultByRestId',
26
- 'SearchTimeline', 'Bookmarks', 'Likes', 'Favoriters',
27
- 'Followers', 'Following', 'HomeTimeline', 'HomeLatestTimeline',
28
- 'NotificationsTimeline', 'ListTimeline',
29
- 'UserMedia',
25
+ "UserByScreenName",
26
+ "UserTweets",
27
+ "TweetDetail",
28
+ "TweetResultByRestId",
29
+ "SearchTimeline",
30
+ "Bookmarks",
31
+ "Likes",
32
+ "Favoriters",
33
+ "Followers",
34
+ "Following",
35
+ "HomeTimeline",
36
+ "HomeLatestTimeline",
37
+ "NotificationsTimeline",
38
+ "ListTimeline",
39
+ "UserMedia",
30
40
  // Writes
31
- 'CreateTweet', 'DeleteTweet', 'FavoriteTweet',
32
- 'UnfavoriteTweet', 'CreateRetweet', 'DeleteRetweet', 'CreateBookmark',
33
- 'DeleteBookmark',
41
+ "CreateTweet",
42
+ "DeleteTweet",
43
+ "FavoriteTweet",
44
+ "UnfavoriteTweet",
45
+ "CreateRetweet",
46
+ "DeleteRetweet",
47
+ "CreateBookmark",
48
+ "DeleteBookmark",
34
49
  ]);
35
50
 
36
51
  // ─── Types ───────────────────────────────────────────────────────────────────
@@ -50,28 +65,50 @@ interface CapturedQuery {
50
65
  class CDPClient {
51
66
  private ws: WebSocket | null = null;
52
67
  private nextId = 1;
53
- private callbacks = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void }>();
54
- private eventHandlers = new Map<string, Array<(params: Record<string, unknown>) => void>>();
68
+ private callbacks = new Map<
69
+ number,
70
+ { resolve: (v: unknown) => void; reject: (e: Error) => void }
71
+ >();
72
+ private eventHandlers = new Map<
73
+ string,
74
+ Array<(params: Record<string, unknown>) => void>
75
+ >();
55
76
 
56
77
  async connect(wsUrl: string): Promise<void> {
57
78
  return new Promise((resolve, reject) => {
58
79
  const ws = new WebSocket(wsUrl);
59
- ws.onopen = () => { this.ws = ws; resolve(); };
80
+ ws.onopen = () => {
81
+ this.ws = ws;
82
+ resolve();
83
+ };
60
84
  ws.onerror = (e) => reject(new Error(`CDP error: ${e}`));
61
- ws.onclose = () => { this.ws = null; };
85
+ ws.onclose = () => {
86
+ this.ws = null;
87
+ };
62
88
  ws.onmessage = (event) => {
63
89
  const msg = JSON.parse(String(event.data));
64
90
  if (msg.id != null) {
65
91
  const cb = this.callbacks.get(msg.id);
66
- if (cb) { this.callbacks.delete(msg.id); if (msg.error) { cb.reject(new Error(msg.error.message)); } else { cb.resolve(msg.result); } }
92
+ if (cb) {
93
+ this.callbacks.delete(msg.id);
94
+ if (msg.error) {
95
+ cb.reject(new Error(msg.error.message));
96
+ } else {
97
+ cb.resolve(msg.result);
98
+ }
99
+ }
67
100
  } else if (msg.method) {
68
- for (const h of this.eventHandlers.get(msg.method) ?? []) h(msg.params ?? {});
101
+ for (const h of this.eventHandlers.get(msg.method) ?? [])
102
+ h(msg.params ?? {});
69
103
  }
70
104
  };
71
105
  });
72
106
  }
73
107
 
74
- async send(method: string, params?: Record<string, unknown>): Promise<unknown> {
108
+ async send(
109
+ method: string,
110
+ params?: Record<string, unknown>,
111
+ ): Promise<unknown> {
75
112
  const id = this.nextId++;
76
113
  return new Promise((resolve, reject) => {
77
114
  this.callbacks.set(id, { resolve, reject });
@@ -85,14 +122,16 @@ class CDPClient {
85
122
  this.eventHandlers.set(event, list);
86
123
  }
87
124
 
88
- close() { this.ws?.close(); }
125
+ close() {
126
+ this.ws?.close();
127
+ }
89
128
  }
90
129
 
91
130
  // ─── State ───────────────────────────────────────────────────────────────────
92
131
 
93
132
  const args = process.argv.slice(2);
94
- const autoMode = args.includes('--auto');
95
- const captureAll = args.includes('--all');
133
+ const autoMode = args.includes("--auto");
134
+ const captureAll = args.includes("--all");
96
135
 
97
136
  const captured: CapturedQuery[] = [];
98
137
  const seenQueries = new Set<string>();
@@ -113,7 +152,7 @@ interface GuideStep {
113
152
  async function getScreenName(): Promise<string | null> {
114
153
  if (!navigationClient) return null;
115
154
  try {
116
- const result = await navigationClient.send('Runtime.evaluate', {
155
+ const result = (await navigationClient.send("Runtime.evaluate", {
117
156
  expression: `
118
157
  (function() {
119
158
  const link = document.querySelector('a[data-testid="AppTabBar_Profile_Link"]');
@@ -123,7 +162,7 @@ async function getScreenName(): Promise<string | null> {
123
162
  `,
124
163
  awaitPromise: false,
125
164
  returnByValue: true,
126
- }) as { result?: { value?: string | null } };
165
+ })) as { result?: { value?: string | null } };
127
166
  return result?.result?.value ?? null;
128
167
  } catch {
129
168
  return null;
@@ -132,55 +171,55 @@ async function getScreenName(): Promise<string | null> {
132
171
 
133
172
  const GUIDE_STEPS: GuideStep[] = [
134
173
  {
135
- label: 'Home timeline',
136
- url: 'https://x.com/home',
137
- expectedQueries: ['HomeTimeline', 'HomeLatestTimeline'],
174
+ label: "Home timeline",
175
+ url: "https://x.com/home",
176
+ expectedQueries: ["HomeTimeline", "HomeLatestTimeline"],
138
177
  },
139
178
  {
140
- label: 'Profile',
179
+ label: "Profile",
141
180
  // URL set dynamically in runAutoMode after resolving screen name
142
181
  clickSelector: 'a[data-testid="AppTabBar_Profile_Link"]',
143
- expectedQueries: ['UserByScreenName', 'UserTweets'],
182
+ expectedQueries: ["UserByScreenName", "UserTweets"],
144
183
  },
145
184
  {
146
- label: 'Tweet detail',
185
+ label: "Tweet detail",
147
186
  clickSelector: 'article[data-testid="tweet"] a[href*="/status/"]',
148
- expectedQueries: ['TweetDetail'],
187
+ expectedQueries: ["TweetDetail"],
149
188
  },
150
189
  {
151
- label: 'Search',
152
- url: 'https://x.com/search?q=hello&src=typed_query',
153
- expectedQueries: ['SearchTimeline'],
190
+ label: "Search",
191
+ url: "https://x.com/search?q=hello&src=typed_query",
192
+ expectedQueries: ["SearchTimeline"],
154
193
  },
155
194
  {
156
- label: 'Bookmarks',
157
- url: 'https://x.com/i/bookmarks',
158
- expectedQueries: ['Bookmarks'],
195
+ label: "Bookmarks",
196
+ url: "https://x.com/i/bookmarks",
197
+ expectedQueries: ["Bookmarks"],
159
198
  },
160
199
  {
161
- label: 'Notifications',
162
- url: 'https://x.com/notifications',
163
- expectedQueries: ['NotificationsTimeline'],
200
+ label: "Notifications",
201
+ url: "https://x.com/notifications",
202
+ expectedQueries: ["NotificationsTimeline"],
164
203
  },
165
204
  {
166
- label: 'Likes',
205
+ label: "Likes",
167
206
  // URL set dynamically
168
- expectedQueries: ['Likes'],
207
+ expectedQueries: ["Likes"],
169
208
  },
170
209
  {
171
- label: 'Followers',
210
+ label: "Followers",
172
211
  // URL set dynamically
173
- expectedQueries: ['Followers'],
212
+ expectedQueries: ["Followers"],
174
213
  },
175
214
  {
176
- label: 'Following',
215
+ label: "Following",
177
216
  // URL set dynamically
178
- expectedQueries: ['Following'],
217
+ expectedQueries: ["Following"],
179
218
  },
180
219
  {
181
- label: 'Media',
220
+ label: "Media",
182
221
  // URL set dynamically
183
- expectedQueries: ['UserMedia'],
222
+ expectedQueries: ["UserMedia"],
184
223
  },
185
224
  ];
186
225
 
@@ -188,14 +227,18 @@ const GUIDE_STEPS: GuideStep[] = [
188
227
 
189
228
  const res = await fetch(`${CDP_BASE}/json/list`);
190
229
  if (!res.ok) {
191
- console.error('Chrome CDP not available. Run `vellum x refresh` first.');
230
+ console.error("Chrome CDP not available. Run `vellum x refresh` first.");
192
231
  process.exit(1);
193
232
  }
194
- const targets = (await res.json()) as Array<{ type: string; url: string; webSocketDebuggerUrl: string }>;
195
- const pages = targets.filter(t => t.type === 'page');
233
+ const targets = (await res.json()) as Array<{
234
+ type: string;
235
+ url: string;
236
+ webSocketDebuggerUrl: string;
237
+ }>;
238
+ const pages = targets.filter((t) => t.type === "page");
196
239
 
197
240
  if (pages.length === 0) {
198
- console.error('No pages found in Chrome.');
241
+ console.error("No pages found in Chrome.");
199
242
  process.exit(1);
200
243
  }
201
244
 
@@ -216,9 +259,12 @@ function notifyQuerySeen(queryName: string) {
216
259
  }
217
260
  }
218
261
 
219
- function waitForAnyQuery(queryNames: string[], timeoutMs = 15000): Promise<boolean> {
220
- if (queryNames.some(q => seenQueries.has(q))) return Promise.resolve(true);
221
- return new Promise(resolve => {
262
+ function waitForAnyQuery(
263
+ queryNames: string[],
264
+ timeoutMs = 15000,
265
+ ): Promise<boolean> {
266
+ if (queryNames.some((q) => seenQueries.has(q))) return Promise.resolve(true);
267
+ return new Promise((resolve) => {
222
268
  const timer = setTimeout(() => {
223
269
  for (const q of queryNames) queryWaiters.delete(q);
224
270
  resolve(false);
@@ -241,22 +287,22 @@ let navigationClient: CDPClient | null = null;
241
287
  for (const page of pages) {
242
288
  const client = new CDPClient();
243
289
  await client.connect(page.webSocketDebuggerUrl);
244
- await client.send('Network.enable');
290
+ await client.send("Network.enable");
245
291
 
246
292
  // Track which client is on an x.com tab for navigation
247
- if (page.url.includes('x.com') || page.url.includes('twitter.com')) {
293
+ if (page.url.includes("x.com") || page.url.includes("twitter.com")) {
248
294
  navigationClient = client;
249
295
  }
250
296
 
251
- client.on('Network.requestWillBeSent', (params) => {
297
+ client.on("Network.requestWillBeSent", (params) => {
252
298
  const req = params.request as Record<string, unknown> | undefined;
253
299
  const url = (req?.url ?? params.url) as string | undefined;
254
- if (!url?.includes('/i/api/graphql/')) return;
300
+ if (!url?.includes("/i/api/graphql/")) return;
255
301
 
256
302
  const match = url.match(/\/graphql\/([^/]+)\/([^?]+)/);
257
- const queryId = match?.[1] ?? 'unknown';
258
- const queryName = match?.[2] ?? 'unknown';
259
- const method = (req?.method as string) ?? 'GET';
303
+ const queryId = match?.[1] ?? "unknown";
304
+ const queryName = match?.[2] ?? "unknown";
305
+ const method = (req?.method as string) ?? "GET";
260
306
 
261
307
  // Apply relevance filter
262
308
  if (!captureAll && !RELEVANT_QUERIES.has(queryName)) return;
@@ -264,30 +310,42 @@ for (const page of pages) {
264
310
  let variables: unknown = undefined;
265
311
  let features: unknown = undefined;
266
312
 
267
- if (method === 'POST' && req?.postData) {
313
+ if (method === "POST" && req?.postData) {
268
314
  try {
269
315
  const body = JSON.parse(req.postData as string);
270
316
  variables = body.variables;
271
317
  features = body.features;
272
- } catch { /* ignore */ }
273
- } else if (method === 'GET') {
318
+ } catch {
319
+ /* ignore */
320
+ }
321
+ } else if (method === "GET") {
274
322
  try {
275
323
  const u = new URL(url);
276
- const v = u.searchParams.get('variables');
324
+ const v = u.searchParams.get("variables");
277
325
  if (v) variables = JSON.parse(v);
278
- const f = u.searchParams.get('features');
326
+ const f = u.searchParams.get("features");
279
327
  if (f) features = JSON.parse(f);
280
- } catch { /* ignore */ }
328
+ } catch {
329
+ /* ignore */
330
+ }
281
331
  }
282
332
 
283
333
  console.log(`\n>>> ${method} ${queryName} (${queryId})`);
284
- if (variables) console.log(` variables: ${JSON.stringify(variables).slice(0, 200)}`);
334
+ if (variables)
335
+ console.log(` variables: ${JSON.stringify(variables).slice(0, 200)}`);
285
336
 
286
337
  pendingRequests.set(params.requestId as string, { url, queryName });
287
- captured.push({ queryName, queryId, method, variables, features, timestamp: Date.now() });
338
+ captured.push({
339
+ queryName,
340
+ queryId,
341
+ method,
342
+ variables,
343
+ features,
344
+ timestamp: Date.now(),
345
+ });
288
346
  });
289
347
 
290
- client.on('Network.responseReceived', (params) => {
348
+ client.on("Network.responseReceived", (params) => {
291
349
  const requestId = params.requestId as string;
292
350
  const pending = pendingRequests.get(requestId);
293
351
  if (!pending) return;
@@ -297,31 +355,47 @@ for (const page of pages) {
297
355
  console.log(` <<< ${status}`);
298
356
 
299
357
  // Get full response body
300
- client.send('Network.getResponseBody', { requestId }).then((result) => {
301
- const body = (result as Record<string, unknown>).body as string;
302
- try {
303
- const json = JSON.parse(body);
304
- // Attach full response to the captured entry
305
- const entry = [...captured].reverse().find(e => e.queryName === pending.queryName && !e.response);
306
- if (entry) {
307
- entry.response = json;
308
-
309
- // Write individual file
310
- const filename = `${pending.queryName}-${entry.timestamp}.json`;
311
- Bun.write(`${CAPTURE_DIR}/${filename}`, JSON.stringify({
312
- queryName: entry.queryName,
313
- queryId: entry.queryId,
314
- method: entry.method,
315
- variables: entry.variables,
316
- features: entry.features,
317
- response: json,
318
- }, null, 2));
358
+ client
359
+ .send("Network.getResponseBody", { requestId })
360
+ .then((result) => {
361
+ const body = (result as Record<string, unknown>).body as string;
362
+ try {
363
+ const json = JSON.parse(body);
364
+ // Attach full response to the captured entry
365
+ const entry = [...captured]
366
+ .reverse()
367
+ .find((e) => e.queryName === pending.queryName && !e.response);
368
+ if (entry) {
369
+ entry.response = json;
370
+
371
+ // Write individual file
372
+ const filename = `${pending.queryName}-${entry.timestamp}.json`;
373
+ Bun.write(
374
+ `${CAPTURE_DIR}/${filename}`,
375
+ JSON.stringify(
376
+ {
377
+ queryName: entry.queryName,
378
+ queryId: entry.queryId,
379
+ method: entry.method,
380
+ variables: entry.variables,
381
+ features: entry.features,
382
+ response: json,
383
+ },
384
+ null,
385
+ 2,
386
+ ),
387
+ );
388
+ }
389
+
390
+ // Notify waiters
391
+ notifyQuerySeen(pending.queryName);
392
+ } catch {
393
+ /* ignore */
319
394
  }
320
-
321
- // Notify waiters
322
- notifyQuerySeen(pending.queryName);
323
- } catch { /* ignore */ }
324
- }).catch(() => { /* body not available */ });
395
+ })
396
+ .catch(() => {
397
+ /* body not available */
398
+ });
325
399
 
326
400
  pendingRequests.delete(requestId);
327
401
  });
@@ -337,15 +411,15 @@ if (!navigationClient && pages.length > 0) {
337
411
 
338
412
  async function navigateTo(url: string): Promise<void> {
339
413
  if (!navigationClient) return;
340
- await navigationClient.send('Page.navigate', { url });
414
+ await navigationClient.send("Page.navigate", { url });
341
415
  // Wait for page to load
342
- await new Promise(r => setTimeout(r, 3000));
416
+ await new Promise((r) => setTimeout(r, 3000));
343
417
  }
344
418
 
345
419
  async function clickElement(selector: string): Promise<boolean> {
346
420
  if (!navigationClient) return false;
347
421
  try {
348
- const result = await navigationClient.send('Runtime.evaluate', {
422
+ const result = (await navigationClient.send("Runtime.evaluate", {
349
423
  expression: `
350
424
  (function() {
351
425
  const el = document.querySelector(${JSON.stringify(selector)});
@@ -357,7 +431,7 @@ async function clickElement(selector: string): Promise<boolean> {
357
431
  `,
358
432
  awaitPromise: false,
359
433
  returnByValue: true,
360
- }) as { result?: { value?: boolean } };
434
+ })) as { result?: { value?: boolean } };
361
435
  return result?.result?.value === true;
362
436
  } catch {
363
437
  return false;
@@ -367,44 +441,52 @@ async function clickElement(selector: string): Promise<boolean> {
367
441
  async function scrollDown(): Promise<void> {
368
442
  if (!navigationClient) return;
369
443
  try {
370
- await navigationClient.send('Runtime.evaluate', {
371
- expression: 'window.scrollBy(0, 800)',
444
+ await navigationClient.send("Runtime.evaluate", {
445
+ expression: "window.scrollBy(0, 800)",
372
446
  awaitPromise: false,
373
447
  });
374
- } catch { /* ignore */ }
448
+ } catch {
449
+ /* ignore */
450
+ }
375
451
  }
376
452
 
377
453
  // ─── Auto mode ───────────────────────────────────────────────────────────────
378
454
 
379
455
  async function runAutoMode() {
380
- console.log('\n🚗 Auto mode: navigating Chrome through X.com...\n');
456
+ console.log("\n🚗 Auto mode: navigating Chrome through X.com...\n");
381
457
 
382
458
  // Enable Page domain for navigation
383
459
  if (navigationClient) {
384
- await navigationClient.send('Page.enable').catch(() => {});
460
+ await navigationClient.send("Page.enable").catch(() => {});
385
461
  }
386
462
 
387
463
  // Navigate to home first to discover the screen name
388
- await navigateTo('https://x.com/home');
464
+ await navigateTo("https://x.com/home");
389
465
  const screenName = await getScreenName();
390
466
  if (screenName) {
391
467
  console.log(` Detected user: @${screenName}\n`);
392
468
  // Fill in profile-based URLs
393
469
  for (const step of GUIDE_STEPS) {
394
- if (step.label === 'Likes') step.url = `https://x.com/${screenName}/likes`;
395
- if (step.label === 'Followers') step.url = `https://x.com/${screenName}/followers`;
396
- if (step.label === 'Following') step.url = `https://x.com/${screenName}/following`;
397
- if (step.label === 'Media') step.url = `https://x.com/${screenName}/media`;
470
+ if (step.label === "Likes")
471
+ step.url = `https://x.com/${screenName}/likes`;
472
+ if (step.label === "Followers")
473
+ step.url = `https://x.com/${screenName}/followers`;
474
+ if (step.label === "Following")
475
+ step.url = `https://x.com/${screenName}/following`;
476
+ if (step.label === "Media")
477
+ step.url = `https://x.com/${screenName}/media`;
398
478
  }
399
479
  } else {
400
- console.log(' Could not detect screen name — some steps will use click navigation\n');
480
+ console.log(
481
+ " Could not detect screen name — some steps will use click navigation\n",
482
+ );
401
483
  }
402
484
 
403
485
  const completedSteps: string[] = [];
404
486
  const failedSteps: string[] = [];
405
487
 
406
488
  for (const step of GUIDE_STEPS) {
407
- const alreadySeen = step.expectedQueries.some(q => seenQueries.has(q));
489
+ const alreadySeen = step.expectedQueries.some((q) => seenQueries.has(q));
408
490
  if (alreadySeen) {
409
491
  console.log(` ✓ ${step.label} (already captured)`);
410
492
  completedSteps.push(step.label);
@@ -420,15 +502,15 @@ async function runAutoMode() {
420
502
 
421
503
  // Click if selector provided
422
504
  if (step.clickSelector) {
423
- await new Promise(r => setTimeout(r, 1500)); // wait for page to settle
505
+ await new Promise((r) => setTimeout(r, 1500)); // wait for page to settle
424
506
  const clicked = await clickElement(step.clickSelector);
425
507
  if (!clicked) {
426
508
  // Try scrolling and clicking again
427
509
  await scrollDown();
428
- await new Promise(r => setTimeout(r, 1000));
510
+ await new Promise((r) => setTimeout(r, 1000));
429
511
  await clickElement(step.clickSelector);
430
512
  }
431
- await new Promise(r => setTimeout(r, 2000)); // wait for navigation
513
+ await new Promise((r) => setTimeout(r, 2000)); // wait for navigation
432
514
  }
433
515
 
434
516
  // Scroll to trigger lazy-loaded content
@@ -438,18 +520,22 @@ async function runAutoMode() {
438
520
  const seen = await waitForAnyQuery(step.expectedQueries, 10000);
439
521
 
440
522
  if (seen) {
441
- const captured = step.expectedQueries.filter(q => seenQueries.has(q));
442
- console.log(`\r ✅ ${step.label} → ${captured.join(', ')}`);
523
+ const captured = step.expectedQueries.filter((q) => seenQueries.has(q));
524
+ console.log(`\r ✅ ${step.label} → ${captured.join(", ")}`);
443
525
  completedSteps.push(step.label);
444
526
  } else {
445
- console.log(`\r ⚠️ ${step.label} → no queries captured (page may need manual interaction)`);
527
+ console.log(
528
+ `\r ⚠️ ${step.label} → no queries captured (page may need manual interaction)`,
529
+ );
446
530
  failedSteps.push(step.label);
447
531
  }
448
532
  }
449
533
 
450
- console.log(`\n🏁 Auto navigation complete: ${completedSteps.length}/${GUIDE_STEPS.length} steps succeeded`);
534
+ console.log(
535
+ `\n🏁 Auto navigation complete: ${completedSteps.length}/${GUIDE_STEPS.length} steps succeeded`,
536
+ );
451
537
  if (failedSteps.length > 0) {
452
- console.log(` Missed: ${failedSteps.join(', ')}`);
538
+ console.log(` Missed: ${failedSteps.join(", ")}`);
453
539
  }
454
540
 
455
541
  // Finish
@@ -460,32 +546,35 @@ async function runAutoMode() {
460
546
  // ─── Summary ─────────────────────────────────────────────────────────────────
461
547
 
462
548
  function printSummary() {
463
- console.log(`\n\n${'='.repeat(60)}`);
549
+ console.log(`\n\n${"=".repeat(60)}`);
464
550
  console.log(` Captured ${captured.length} GraphQL requests`);
465
- console.log(`${'='.repeat(60)}\n`);
551
+ console.log(`${"=".repeat(60)}\n`);
466
552
 
467
553
  // Dedupe by queryName
468
554
  const seen = new Set<string>();
469
- const unique = captured.filter(q => {
555
+ const unique = captured.filter((q) => {
470
556
  if (seen.has(q.queryName)) return false;
471
557
  seen.add(q.queryName);
472
558
  return true;
473
559
  });
474
560
 
475
561
  // Print table
476
- const nameWidth = Math.max(25, ...unique.map(q => q.queryName.length));
562
+ const nameWidth = Math.max(25, ...unique.map((q) => q.queryName.length));
477
563
  const idWidth = 22;
478
564
  const methodWidth = 6;
479
565
 
480
566
  console.log(
481
- ` ${'Query'.padEnd(nameWidth)} ${'QueryID'.padEnd(idWidth)} ${'Method'.padEnd(methodWidth)} Variables`,
567
+ ` ${"Query".padEnd(nameWidth)} ${"QueryID".padEnd(idWidth)} ${"Method".padEnd(methodWidth)} Variables`,
568
+ );
569
+ console.log(
570
+ ` ${"─".repeat(nameWidth)} ${"─".repeat(idWidth)} ${"─".repeat(methodWidth)} ${"─".repeat(30)}`,
482
571
  );
483
- console.log(` ${'─'.repeat(nameWidth)} ${'─'.repeat(idWidth)} ${'─'.repeat(methodWidth)} ${'─'.repeat(30)}`);
484
572
 
485
573
  for (const q of unique) {
486
- const varKeys = q.variables && typeof q.variables === 'object'
487
- ? Object.keys(q.variables as Record<string, unknown>).join(', ')
488
- : '—';
574
+ const varKeys =
575
+ q.variables && typeof q.variables === "object"
576
+ ? Object.keys(q.variables as Record<string, unknown>).join(", ")
577
+ : "—";
489
578
  console.log(
490
579
  ` ${q.queryName.padEnd(nameWidth)} ${q.queryId.padEnd(idWidth)} ${q.method.padEnd(methodWidth)} ${varKeys}`,
491
580
  );
@@ -493,14 +582,14 @@ function printSummary() {
493
582
 
494
583
  // Gap analysis
495
584
  if (!captureAll) {
496
- const notSeen = [...RELEVANT_QUERIES].filter(q => !seenQueries.has(q));
585
+ const notSeen = [...RELEVANT_QUERIES].filter((q) => !seenQueries.has(q));
497
586
  if (notSeen.length > 0) {
498
587
  console.log(`\n ⚠️ Not captured (${notSeen.length}):`);
499
588
  for (const q of notSeen) {
500
589
  console.log(` • ${q}`);
501
590
  }
502
591
  } else {
503
- console.log('\n ✅ All relevant queries captured!');
592
+ console.log("\n ✅ All relevant queries captured!");
504
593
  }
505
594
  }
506
595
 
@@ -509,15 +598,18 @@ function printSummary() {
509
598
  const summary = {
510
599
  capturedAt: new Date().toISOString(),
511
600
  totalRequests: captured.length,
512
- uniqueQueries: unique.map(q => ({
601
+ uniqueQueries: unique.map((q) => ({
513
602
  queryName: q.queryName,
514
603
  queryId: q.queryId,
515
604
  method: q.method,
516
- variableKeys: q.variables && typeof q.variables === 'object'
517
- ? Object.keys(q.variables as Record<string, unknown>)
518
- : [],
605
+ variableKeys:
606
+ q.variables && typeof q.variables === "object"
607
+ ? Object.keys(q.variables as Record<string, unknown>)
608
+ : [],
519
609
  })),
520
- notCaptured: captureAll ? [] : [...RELEVANT_QUERIES].filter(q => !seenQueries.has(q)),
610
+ notCaptured: captureAll
611
+ ? []
612
+ : [...RELEVANT_QUERIES].filter((q) => !seenQueries.has(q)),
521
613
  };
522
614
  Bun.write(summaryPath, JSON.stringify(summary, null, 2));
523
615
  console.log(`\n Summary saved to ${summaryPath}`);
@@ -527,19 +619,23 @@ function printSummary() {
527
619
  // ─── Main ────────────────────────────────────────────────────────────────────
528
620
 
529
621
  if (autoMode) {
530
- console.log('\nRecording X.com GraphQL requests (auto mode)...');
531
- console.log(`Filter: ${captureAll ? 'ALL queries' : `${RELEVANT_QUERIES.size} relevant queries`}`);
622
+ console.log("\nRecording X.com GraphQL requests (auto mode)...");
623
+ console.log(
624
+ `Filter: ${captureAll ? "ALL queries" : `${RELEVANT_QUERIES.size} relevant queries`}`,
625
+ );
532
626
  // Give network listeners a moment to settle, then start auto-navigation
533
627
  setTimeout(() => runAutoMode(), 1000);
534
628
  } else {
535
- console.log('\nRecording X.com GraphQL requests...');
536
- console.log(`Filter: ${captureAll ? 'ALL queries' : `${RELEVANT_QUERIES.size} relevant queries`}`);
537
- console.log('Browse X in Chrome visit a profile, scroll tweets, search.');
538
- console.log('Press Ctrl+C to stop and dump results.\n');
629
+ console.log("\nRecording X.com GraphQL requests...");
630
+ console.log(
631
+ `Filter: ${captureAll ? "ALL queries" : `${RELEVANT_QUERIES.size} relevant queries`}`,
632
+ );
633
+ console.log("Browse X in Chrome — visit a profile, scroll tweets, search.");
634
+ console.log("Press Ctrl+C to stop and dump results.\n");
539
635
  }
540
636
 
541
637
  // Ctrl+C handler
542
- process.on('SIGINT', () => {
638
+ process.on("SIGINT", () => {
543
639
  printSummary();
544
640
  process.exit(0);
545
641
  });