@vellumai/assistant 0.4.43 → 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 (713) hide show
  1. package/.prettierignore +4 -0
  2. package/ARCHITECTURE.md +46 -44
  3. package/README.md +15 -16
  4. package/bun.lock +10 -35
  5. package/docs/architecture/integrations.md +102 -215
  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 -3
  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-asset.test.ts +1 -1
  40. package/src/__tests__/bundled-skill-retrieval-guard.test.ts +23 -9
  41. package/src/__tests__/call-controller.test.ts +0 -1
  42. package/src/__tests__/call-conversation-messages.test.ts +0 -1
  43. package/src/__tests__/call-domain.test.ts +0 -1
  44. package/src/__tests__/call-pointer-messages.test.ts +0 -1
  45. package/src/__tests__/call-recovery.test.ts +0 -1
  46. package/src/__tests__/call-routes-http.test.ts +0 -1
  47. package/src/__tests__/call-store.test.ts +0 -1
  48. package/src/__tests__/canonical-guardian-store.test.ts +0 -1
  49. package/src/__tests__/channel-approval-routes.test.ts +1 -1
  50. package/src/__tests__/channel-approvals.test.ts +1 -1
  51. package/src/__tests__/channel-delivery-store.test.ts +0 -1
  52. package/src/__tests__/channel-guardian.test.ts +5 -7
  53. package/src/__tests__/channel-retry-sweep.test.ts +0 -1
  54. package/src/__tests__/checker.test.ts +32 -36
  55. package/src/__tests__/compaction.benchmark.test.ts +16 -14
  56. package/src/__tests__/computer-use-session-lifecycle.test.ts +10 -11
  57. package/src/__tests__/computer-use-session-working-dir.test.ts +2 -6
  58. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +2 -5
  59. package/src/__tests__/computer-use-tools.test.ts +35 -31
  60. package/src/__tests__/config-schema.test.ts +11 -15
  61. package/src/__tests__/config-watcher.test.ts +0 -1
  62. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  63. package/src/__tests__/conflict-store.test.ts +0 -1
  64. package/src/__tests__/connection-policy.test.ts +4 -7
  65. package/src/__tests__/contacts-tools.test.ts +0 -1
  66. package/src/__tests__/context-memory-e2e.test.ts +2 -4
  67. package/src/__tests__/context-overflow-reducer.test.ts +2 -4
  68. package/src/__tests__/context-window-manager.test.ts +147 -60
  69. package/src/__tests__/contradiction-checker.test.ts +0 -1
  70. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  71. package/src/__tests__/conversation-attention-telegram.test.ts +1 -1
  72. package/src/__tests__/conversation-pairing.test.ts +2 -2
  73. package/src/__tests__/conversation-routes-guardian-reply.test.ts +31 -7
  74. package/src/__tests__/conversation-routes-slash-commands.test.ts +381 -0
  75. package/src/__tests__/conversation-store.test.ts +0 -1
  76. package/src/__tests__/conversation-unread-route.test.ts +1 -2
  77. package/src/__tests__/credential-security-invariants.test.ts +8 -8
  78. package/src/__tests__/cross-provider-web-search.test.ts +353 -0
  79. package/src/__tests__/daemon-assistant-events.test.ts +6 -7
  80. package/src/__tests__/db-schedule-syntax-migration.test.ts +15 -3
  81. package/src/__tests__/delete-managed-skill-tool.test.ts +5 -9
  82. package/src/__tests__/deterministic-verification-control-plane.test.ts +0 -1
  83. package/src/__tests__/diagnostics-export.test.ts +189 -0
  84. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  85. package/src/__tests__/emit-signal-routing-intent.test.ts +3 -3
  86. package/src/__tests__/entity-extractor.test.ts +0 -1
  87. package/src/__tests__/entity-search.test.ts +0 -1
  88. package/src/__tests__/ephemeral-permissions.test.ts +2 -4
  89. package/src/__tests__/error-handler-friendly-messages.test.ts +46 -0
  90. package/src/__tests__/file-read-tool.test.ts +86 -0
  91. package/src/__tests__/followup-tools.test.ts +0 -1
  92. package/src/__tests__/frontmatter.test.ts +77 -34
  93. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  94. package/src/__tests__/gateway-only-guard.test.ts +1 -1
  95. package/src/__tests__/guardian-action-conversation-turn.test.ts +0 -1
  96. package/src/__tests__/guardian-action-followup-executor.test.ts +0 -1
  97. package/src/__tests__/guardian-action-followup-store.test.ts +0 -1
  98. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  99. package/src/__tests__/guardian-action-late-reply.test.ts +0 -1
  100. package/src/__tests__/guardian-action-store.test.ts +0 -1
  101. package/src/__tests__/guardian-action-sweep.test.ts +0 -1
  102. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  103. package/src/__tests__/guardian-dispatch.test.ts +1 -2
  104. package/src/__tests__/guardian-grant-minting.test.ts +1 -1
  105. package/src/__tests__/guardian-outbound-http.test.ts +0 -1
  106. package/src/__tests__/guardian-principal-id-roundtrip.test.ts +0 -1
  107. package/src/__tests__/guardian-routing-invariants.test.ts +1 -1
  108. package/src/__tests__/guardian-routing-state.test.ts +0 -1
  109. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  110. package/src/__tests__/guardian-verify-setup-skill-regression.test.ts +3 -5
  111. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +28 -426
  112. package/src/__tests__/host-bash-proxy.test.ts +335 -0
  113. package/src/__tests__/host-file-proxy.test.ts +374 -0
  114. package/src/__tests__/host-shell-tool.test.ts +147 -1
  115. package/src/__tests__/http-user-message-parity.test.ts +361 -0
  116. package/src/__tests__/inbound-invite-redemption.test.ts +0 -1
  117. package/src/__tests__/integration-status.test.ts +3 -8
  118. package/src/__tests__/intent-routing.test.ts +7 -46
  119. package/src/__tests__/invite-redemption-service.test.ts +0 -1
  120. package/src/__tests__/invite-routes-http.test.ts +0 -1
  121. package/src/__tests__/llm-usage-store.test.ts +0 -1
  122. package/src/__tests__/managed-avatar-client.test.ts +101 -55
  123. package/src/__tests__/managed-skill-lifecycle.test.ts +9 -18
  124. package/src/__tests__/managed-store.test.ts +94 -21
  125. package/src/__tests__/media-reuse-story.e2e.test.ts +0 -1
  126. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +2 -4
  127. package/src/__tests__/memory-lifecycle-e2e.test.ts +0 -1
  128. package/src/__tests__/memory-recall-quality.test.ts +0 -1
  129. package/src/__tests__/memory-regressions.experimental.test.ts +0 -1
  130. package/src/__tests__/memory-regressions.test.ts +0 -1
  131. package/src/__tests__/memory-retrieval.benchmark.test.ts +0 -1
  132. package/src/__tests__/memory-upsert-concurrency.test.ts +0 -1
  133. package/src/__tests__/messaging-send-tool.test.ts +35 -0
  134. package/src/__tests__/messaging-skill-split.test.ts +138 -0
  135. package/src/__tests__/migration-cross-version-compatibility.test.ts +0 -1
  136. package/src/__tests__/migration-export-http.test.ts +2 -3
  137. package/src/__tests__/migration-import-commit-http.test.ts +1 -2
  138. package/src/__tests__/migration-import-preflight-http.test.ts +1 -2
  139. package/src/__tests__/migration-validate-http.test.ts +1 -2
  140. package/src/__tests__/native-web-search.test.ts +475 -0
  141. package/src/__tests__/navigate-settings-tab.test.ts +84 -0
  142. package/src/__tests__/non-member-access-request.test.ts +0 -1
  143. package/src/__tests__/notification-broadcaster.test.ts +15 -15
  144. package/src/__tests__/notification-decision-strategy.test.ts +6 -6
  145. package/src/__tests__/notification-deep-link.test.ts +7 -7
  146. package/src/__tests__/notification-guardian-path.test.ts +2 -3
  147. package/src/__tests__/notification-telegram-adapter.test.ts +1 -1
  148. package/src/__tests__/notification-thread-candidates.test.ts +4 -4
  149. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  150. package/src/__tests__/onboarding-template-contract.test.ts +0 -10
  151. package/src/__tests__/playbook-execution.test.ts +0 -1
  152. package/src/__tests__/playbook-tools.test.ts +0 -1
  153. package/src/__tests__/profile-compiler.test.ts +0 -1
  154. package/src/__tests__/provider-fail-open-selection.test.ts +12 -2
  155. package/src/__tests__/provider-managed-proxy-integration.test.ts +25 -0
  156. package/src/__tests__/qdrant-collection-migration.test.ts +223 -0
  157. package/src/__tests__/recording-handler.test.ts +30 -94
  158. package/src/__tests__/registry.test.ts +28 -35
  159. package/src/__tests__/relay-server.test.ts +0 -1
  160. package/src/__tests__/ride-shotgun-handler.test.ts +4 -20
  161. package/src/__tests__/runtime-attachment-metadata.test.ts +0 -1
  162. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  163. package/src/__tests__/runtime-events-sse.test.ts +0 -1
  164. package/src/__tests__/sandbox-diagnostics.test.ts +0 -1
  165. package/src/__tests__/scaffold-managed-skill-tool.test.ts +30 -28
  166. package/src/__tests__/schedule-store.test.ts +441 -1
  167. package/src/__tests__/schedule-tools.test.ts +468 -7
  168. package/src/__tests__/scheduler-recurrence.test.ts +196 -23
  169. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  170. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  171. package/src/__tests__/secret-prompt-log-hygiene.test.ts +6 -3
  172. package/src/__tests__/secret-response-routing.test.ts +4 -1
  173. package/src/__tests__/send-endpoint-busy.test.ts +14 -5
  174. package/src/__tests__/send-notification-tool.test.ts +0 -7
  175. package/src/__tests__/sequence-store.test.ts +0 -1
  176. package/src/__tests__/server-history-render.test.ts +1 -2
  177. package/src/__tests__/session-abort-tool-results.test.ts +0 -1
  178. package/src/__tests__/session-agent-loop.test.ts +46 -6
  179. package/src/__tests__/session-confirmation-signals.test.ts +7 -46
  180. package/src/__tests__/session-conflict-gate.test.ts +2 -6
  181. package/src/__tests__/session-error.test.ts +5 -14
  182. package/src/__tests__/session-init.benchmark.test.ts +3 -5
  183. package/src/__tests__/session-load-history-repair.test.ts +0 -1
  184. package/src/__tests__/session-media-retry.test.ts +12 -74
  185. package/src/__tests__/session-pre-run-repair.test.ts +0 -1
  186. package/src/__tests__/session-profile-injection.test.ts +2 -6
  187. package/src/__tests__/session-provider-retry-repair.test.ts +2 -6
  188. package/src/__tests__/session-queue.test.ts +94 -139
  189. package/src/__tests__/session-skill-tools.test.ts +115 -115
  190. package/src/__tests__/session-slash-known.test.ts +0 -1
  191. package/src/__tests__/session-slash-queue.test.ts +0 -1
  192. package/src/__tests__/session-slash-unknown.test.ts +0 -1
  193. package/src/__tests__/session-surfaces-task-progress.test.ts +34 -0
  194. package/src/__tests__/session-usage.test.ts +0 -1
  195. package/src/__tests__/session-workspace-cache-state.test.ts +2 -6
  196. package/src/__tests__/session-workspace-injection.test.ts +2 -6
  197. package/src/__tests__/session-workspace-tool-tracking.test.ts +2 -6
  198. package/src/__tests__/skill-feature-flags-integration.test.ts +180 -184
  199. package/src/__tests__/skill-feature-flags.test.ts +125 -18
  200. package/src/__tests__/skill-load-feature-flag.test.ts +1 -2
  201. package/src/__tests__/skill-load-tool.test.ts +194 -2
  202. package/src/__tests__/skill-projection-feature-flag.test.ts +27 -16
  203. package/src/__tests__/skill-projection.benchmark.test.ts +15 -14
  204. package/src/__tests__/skills.test.ts +14 -53
  205. package/src/__tests__/slack-channel-config.test.ts +0 -1
  206. package/src/__tests__/slack-inbound-verification.test.ts +0 -1
  207. package/src/__tests__/slack-skill.test.ts +1 -1
  208. package/src/__tests__/starter-task-flow.test.ts +9 -19
  209. package/src/__tests__/subagent-tools.test.ts +2 -2
  210. package/src/__tests__/system-prompt.test.ts +7 -7
  211. package/src/__tests__/task-compiler.test.ts +0 -1
  212. package/src/__tests__/task-management-tools.test.ts +0 -1
  213. package/src/__tests__/task-memory-cleanup.test.ts +0 -1
  214. package/src/__tests__/task-runner.test.ts +0 -1
  215. package/src/__tests__/task-scheduler.test.ts +0 -1
  216. package/src/__tests__/terminal-tools.test.ts +0 -1
  217. package/src/__tests__/test-support/computer-use-skill-harness.ts +2 -4
  218. package/src/__tests__/thread-seed-composer.test.ts +5 -5
  219. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  220. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  221. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  222. package/src/__tests__/tool-executor.test.ts +8 -86
  223. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  224. package/src/__tests__/tool-notification-listener.test.ts +1 -1
  225. package/src/__tests__/tool-preview-lifecycle.test.ts +416 -0
  226. package/src/__tests__/trust-store.test.ts +84 -8
  227. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  228. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  229. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +0 -1
  230. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  231. package/src/__tests__/trusted-contact-verification.test.ts +0 -1
  232. package/src/__tests__/twilio-provider.test.ts +0 -1
  233. package/src/__tests__/twilio-routes.test.ts +0 -1
  234. package/src/__tests__/{request-file-tool.test.ts → ui-file-upload-surface.test.ts} +11 -72
  235. package/src/__tests__/update-bulletin.test.ts +0 -1
  236. package/src/__tests__/usage-cache-backfill-migration.test.ts +0 -1
  237. package/src/__tests__/usage-routes.test.ts +0 -1
  238. package/src/__tests__/verification-control-plane-policy.test.ts +4 -4
  239. package/src/__tests__/voice-invite-redemption.test.ts +0 -1
  240. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  241. package/src/__tests__/voice-session-bridge.test.ts +9 -1
  242. package/src/__tests__/web-fetch.test.ts +57 -0
  243. package/src/__tests__/workspace-git-service.test.ts +5 -14
  244. package/src/__tests__/workspace-policy.test.ts +0 -1
  245. package/src/agent/loop.ts +22 -34
  246. package/src/bundler/bundle-signer.ts +4 -4
  247. package/src/calls/call-controller.ts +1 -1
  248. package/src/calls/relay-server.ts +1 -1
  249. package/src/calls/twilio-rest.ts +1 -1
  250. package/src/calls/voice-session-bridge.ts +3 -1
  251. package/src/cli/__tests__/notifications.test.ts +3 -4
  252. package/src/cli/commands/map.ts +2 -6
  253. package/src/cli/commands/mcp.ts +73 -15
  254. package/src/cli/commands/notifications.ts +4 -4
  255. package/src/cli/commands/sessions.ts +9 -1
  256. package/src/cli/commands/skills.ts +6 -10
  257. package/src/cli/http-client.ts +2 -3
  258. package/src/cli/main-screen.tsx +10 -10
  259. package/src/cli/program.ts +0 -4
  260. package/src/cli/reference.ts +0 -2
  261. package/src/cli.ts +15 -9
  262. package/src/config/__tests__/bundled-tool-registry-guard.test.ts +120 -0
  263. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +11 -0
  264. package/src/config/bundled-skills/app-builder/SKILL.md +6 -7
  265. package/src/config/bundled-skills/app-builder/TOOLS.json +0 -4
  266. package/src/config/bundled-skills/browser/SKILL.md +6 -1
  267. package/src/config/bundled-skills/chatgpt-import/SKILL.md +5 -1
  268. package/src/config/bundled-skills/claude-code/SKILL.md +5 -1
  269. package/src/config/bundled-skills/computer-use/SKILL.md +6 -1
  270. package/src/config/bundled-skills/computer-use/TOOLS.json +6 -69
  271. package/src/config/bundled-skills/computer-use/tools/computer-use-click.ts +10 -1
  272. package/src/config/bundled-skills/contacts/SKILL.md +10 -1
  273. package/src/config/bundled-skills/contacts/TOOLS.json +35 -0
  274. package/src/config/bundled-skills/{messaging → contacts}/tools/google-contacts.ts +9 -2
  275. package/src/config/bundled-skills/document/SKILL.md +4 -1
  276. package/src/config/bundled-skills/doordash/SKILL.md +8 -2
  277. package/src/config/bundled-skills/doordash/__tests__/doordash-session.test.ts +1 -82
  278. package/src/config/bundled-skills/doordash/doordash-cli.ts +17 -28
  279. package/src/config/bundled-skills/doordash/lib/session.ts +21 -17
  280. package/src/config/bundled-skills/doordash/lib/shared/platform.ts +4 -1
  281. package/src/config/bundled-skills/followups/SKILL.md +4 -1
  282. package/src/config/bundled-skills/gmail/SKILL.md +180 -0
  283. package/src/config/bundled-skills/gmail/TOOLS.json +506 -0
  284. package/src/config/bundled-skills/gmail/tools/gmail-archive.ts +149 -0
  285. package/src/config/bundled-skills/gmail/tools/gmail-attachments.ts +110 -0
  286. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-draft.ts +1 -1
  287. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-filters.ts +1 -1
  288. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-follow-up.ts +1 -1
  289. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-forward.ts +1 -1
  290. package/src/config/bundled-skills/gmail/tools/gmail-label.ts +50 -0
  291. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-outreach-scan.ts +8 -90
  292. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-send-draft.ts +1 -1
  293. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-sender-digest.ts +2 -2
  294. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-trash.ts +1 -1
  295. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-unsubscribe.ts +1 -1
  296. package/src/config/bundled-skills/{messaging → gmail}/tools/gmail-vacation.ts +1 -1
  297. package/src/config/bundled-skills/gmail/tools/shared.ts +47 -0
  298. package/src/config/bundled-skills/google-calendar/SKILL.md +5 -1
  299. package/src/config/bundled-skills/image-studio/SKILL.md +5 -1
  300. package/src/config/bundled-skills/knowledge-graph/SKILL.md +4 -1
  301. package/src/config/bundled-skills/media-processing/SKILL.md +7 -13
  302. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -22
  303. package/src/config/bundled-skills/media-processing/tools/generate-clip.ts +12 -1
  304. package/src/config/bundled-skills/messaging/SKILL.md +23 -139
  305. package/src/config/bundled-skills/messaging/TOOLS.json +33 -1215
  306. package/src/config/bundled-skills/messaging/tools/gmail-mime-helpers.ts +42 -0
  307. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +165 -2
  308. package/src/config/bundled-skills/messaging/tools/messaging-sender-digest.ts +1 -13
  309. package/src/config/bundled-skills/messaging/tools/shared.ts +81 -34
  310. package/src/config/bundled-skills/notifications/SKILL.md +5 -1
  311. package/src/config/bundled-skills/orchestration/SKILL.md +30 -0
  312. package/src/config/bundled-skills/orchestration/TOOLS.json +35 -0
  313. package/src/config/bundled-skills/{reminder/tools/reminder-cancel.ts → orchestration/tools/swarm-delegate.ts} +3 -3
  314. package/src/config/bundled-skills/phone-calls/SKILL.md +9 -1
  315. package/src/config/bundled-skills/playbooks/SKILL.md +4 -1
  316. package/src/config/bundled-skills/schedule/SKILL.md +70 -9
  317. package/src/config/bundled-skills/schedule/TOOLS.json +38 -6
  318. package/src/config/bundled-skills/screen-watch/SKILL.md +28 -0
  319. package/src/config/bundled-skills/screen-watch/TOOLS.json +35 -0
  320. package/src/config/bundled-skills/{reminder/tools/reminder-create.ts → screen-watch/tools/start-screen-watch.ts} +3 -3
  321. package/src/config/bundled-skills/sequences/SKILL.md +47 -0
  322. package/src/config/bundled-skills/sequences/TOOLS.json +340 -0
  323. package/src/config/bundled-skills/sequences/tools/sequence-update.ts +128 -0
  324. package/src/config/bundled-skills/sequences/tools/shared.ts +9 -0
  325. package/src/config/bundled-skills/settings/SKILL.md +12 -0
  326. package/src/config/bundled-skills/settings/TOOLS.json +112 -0
  327. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +43 -0
  328. package/src/config/bundled-skills/settings/tools/open-system-settings.ts +52 -0
  329. package/src/config/bundled-skills/{computer-use/tools/computer-use-right-click.ts → settings/tools/set-avatar.ts} +2 -6
  330. package/src/{tools/system/voice-config.ts → config/bundled-skills/settings/tools/voice-config-update.ts} +59 -96
  331. package/src/config/bundled-skills/skill-management/SKILL.md +18 -0
  332. package/src/config/bundled-skills/skill-management/TOOLS.json +90 -0
  333. package/src/config/bundled-skills/{computer-use/tools/computer-use-double-click.ts → skill-management/tools/delete-managed.ts} +2 -6
  334. package/src/config/bundled-skills/skill-management/tools/scaffold-managed.ts +12 -0
  335. package/src/config/bundled-skills/slack/SKILL.md +5 -1
  336. package/src/config/bundled-skills/subagent/SKILL.md +4 -1
  337. package/src/config/bundled-skills/tasks/SKILL.md +5 -2
  338. package/src/config/bundled-skills/transcribe/SKILL.md +4 -1
  339. package/src/config/bundled-skills/watcher/SKILL.md +4 -1
  340. package/src/config/bundled-tool-registry.ts +118 -107
  341. package/src/config/env.ts +5 -2
  342. package/src/config/feature-flag-registry.json +33 -9
  343. package/src/config/loader.ts +10 -2
  344. package/src/config/schema.ts +19 -16
  345. package/src/config/schemas/inference.ts +12 -22
  346. package/src/config/schemas/memory-storage.ts +19 -1
  347. package/src/config/schemas/platform.ts +0 -16
  348. package/src/config/skill-state.ts +11 -8
  349. package/src/config/skills.ts +83 -32
  350. package/src/context/token-estimator.ts +11 -0
  351. package/src/context/window-manager.ts +180 -151
  352. package/src/daemon/computer-use-session.ts +11 -43
  353. package/src/daemon/daemon-control.ts +4 -1
  354. package/src/daemon/handlers/config-channels.ts +5 -9
  355. package/src/daemon/handlers/config-ingress.ts +0 -4
  356. package/src/daemon/handlers/config-model.ts +7 -13
  357. package/src/daemon/handlers/config-telegram.ts +4 -8
  358. package/src/daemon/handlers/config-voice.ts +2 -5
  359. package/src/daemon/handlers/dictation.ts +2 -12
  360. package/src/daemon/handlers/identity.ts +0 -105
  361. package/src/daemon/handlers/recording.ts +3 -23
  362. package/src/daemon/handlers/session-history.ts +42 -10
  363. package/src/daemon/handlers/sessions.ts +53 -72
  364. package/src/daemon/handlers/shared.ts +7 -28
  365. package/src/daemon/handlers/skills.ts +31 -27
  366. package/src/daemon/host-bash-proxy.ts +148 -0
  367. package/src/daemon/host-file-proxy.ts +135 -0
  368. package/src/daemon/lifecycle.ts +53 -41
  369. package/src/daemon/mcp-reload-service.ts +123 -0
  370. package/src/daemon/message-protocol.ts +6 -0
  371. package/src/daemon/message-types/apps.ts +0 -25
  372. package/src/daemon/message-types/browser.ts +1 -1
  373. package/src/daemon/message-types/computer-use.ts +1 -4
  374. package/src/daemon/message-types/guardian-actions.ts +1 -1
  375. package/src/daemon/message-types/host-bash.ts +18 -0
  376. package/src/daemon/message-types/host-file.ts +44 -0
  377. package/src/daemon/message-types/integrations.ts +1 -73
  378. package/src/daemon/message-types/messages.ts +15 -0
  379. package/src/daemon/message-types/schedules.ts +11 -27
  380. package/src/daemon/message-types/sessions.ts +8 -2
  381. package/src/daemon/message-types/settings.ts +1 -1
  382. package/src/daemon/message-types/shared.ts +1 -1
  383. package/src/daemon/message-types/surfaces.ts +2 -0
  384. package/src/daemon/ride-shotgun-handler.ts +35 -43
  385. package/src/daemon/seed-files.ts +3 -27
  386. package/src/daemon/server.ts +45 -28
  387. package/src/daemon/session-agent-loop-handlers.ts +72 -9
  388. package/src/daemon/session-agent-loop.ts +97 -66
  389. package/src/daemon/session-attachments.ts +1 -1
  390. package/src/daemon/session-error.ts +17 -16
  391. package/src/daemon/session-lifecycle.ts +20 -1
  392. package/src/daemon/session-media-retry.ts +1 -15
  393. package/src/daemon/session-messaging.ts +14 -6
  394. package/src/daemon/session-process.ts +36 -7
  395. package/src/daemon/session-queue-manager.ts +62 -103
  396. package/src/daemon/session-runtime-assembly.ts +27 -7
  397. package/src/daemon/session-skill-tools.ts +12 -11
  398. package/src/daemon/session-slash.ts +7 -0
  399. package/src/daemon/session-surfaces.ts +192 -118
  400. package/src/daemon/session-tool-setup.ts +146 -6
  401. package/src/daemon/session.ts +75 -37
  402. package/src/errors.ts +0 -2
  403. package/src/export/formatter.ts +6 -0
  404. package/src/mcp/mcp-oauth-provider.ts +1 -3
  405. package/src/media/avatar-router.ts +20 -28
  406. package/src/media/avatar-types.ts +7 -14
  407. package/src/media/managed-avatar-client.ts +70 -34
  408. package/src/memory/app-store.ts +0 -18
  409. package/src/memory/conversation-title-service.ts +1 -2
  410. package/src/memory/db-init.ts +16 -0
  411. package/src/memory/embedding-backend.ts +129 -27
  412. package/src/memory/embedding-gemini.test.ts +256 -0
  413. package/src/memory/embedding-gemini.ts +47 -13
  414. package/src/memory/embedding-local.ts +14 -2
  415. package/src/memory/embedding-ollama.ts +15 -2
  416. package/src/memory/embedding-openai.ts +15 -2
  417. package/src/memory/embedding-types.test.ts +116 -0
  418. package/src/memory/embedding-types.ts +61 -0
  419. package/src/memory/fingerprint.ts +1 -1
  420. package/src/memory/indexer.ts +25 -1
  421. package/src/memory/job-handlers/embedding.test.ts +258 -0
  422. package/src/memory/job-handlers/embedding.ts +81 -1
  423. package/src/memory/job-handlers/index-maintenance.ts +35 -1
  424. package/src/memory/job-handlers/media-processing.ts +11 -1
  425. package/src/memory/job-utils.ts +21 -6
  426. package/src/memory/jobs-store.ts +5 -1
  427. package/src/memory/jobs-worker.ts +8 -0
  428. package/src/memory/message-content.ts +66 -0
  429. package/src/memory/migrations/100-core-tables.ts +1 -31
  430. package/src/memory/migrations/104-core-indexes.ts +0 -11
  431. package/src/memory/migrations/145-drop-accounts-table.ts +19 -0
  432. package/src/memory/migrations/146-schedule-oneshot-routing.ts +94 -0
  433. package/src/memory/migrations/147-migrate-reminders-to-schedules.ts +129 -0
  434. package/src/memory/migrations/148-drop-reminders-table.ts +18 -0
  435. package/src/memory/migrations/index.ts +4 -0
  436. package/src/memory/migrations/registry.ts +19 -0
  437. package/src/memory/qdrant-client.ts +158 -43
  438. package/src/memory/retriever.test.ts +0 -1
  439. package/src/memory/retriever.ts +12 -2
  440. package/src/memory/schema/infrastructure.ts +5 -37
  441. package/src/memory/search/formatting.ts +34 -9
  442. package/src/memory/search/semantic.ts +57 -2
  443. package/src/memory/search/types.ts +2 -1
  444. package/src/notifications/AGENTS.md +2 -2
  445. package/src/notifications/README.md +59 -58
  446. package/src/notifications/adapters/macos.ts +1 -1
  447. package/src/notifications/broadcaster.ts +5 -5
  448. package/src/notifications/copy-composer.ts +1 -1
  449. package/src/notifications/decision-engine.ts +2 -2
  450. package/src/notifications/destination-resolver.ts +2 -2
  451. package/src/notifications/emit-signal.ts +8 -8
  452. package/src/notifications/signal.ts +1 -1
  453. package/src/notifications/thread-seed-composer.ts +1 -1
  454. package/src/oauth/connect-orchestrator.ts +1 -1
  455. package/src/oauth/token-persistence.ts +1 -1
  456. package/src/permissions/checker.ts +12 -1
  457. package/src/permissions/defaults.ts +13 -17
  458. package/src/permissions/trust-store.ts +37 -0
  459. package/src/permissions/workspace-policy.ts +0 -1
  460. package/src/prompts/__tests__/build-cli-reference-section.test.ts +11 -0
  461. package/src/prompts/computer-use-prompt.ts +1 -1
  462. package/src/prompts/system-prompt.ts +33 -35
  463. package/src/prompts/templates/BOOTSTRAP.md +0 -3
  464. package/src/prompts/templates/SOUL.md +1 -2
  465. package/src/prompts/templates/UPDATES.md +16 -7
  466. package/src/providers/anthropic/client.ts +87 -33
  467. package/src/providers/gemini/client.ts +6 -0
  468. package/src/providers/managed-proxy/constants.ts +5 -0
  469. package/src/providers/openai/client.ts +15 -0
  470. package/src/providers/registry.ts +4 -6
  471. package/src/providers/types.ts +24 -2
  472. package/src/runtime/AGENTS.md +18 -0
  473. package/src/runtime/assistant-event-hub.ts +2 -3
  474. package/src/runtime/assistant-event.ts +4 -4
  475. package/src/runtime/auth/__tests__/context.test.ts +5 -5
  476. package/src/runtime/auth/__tests__/credential-service.test.ts +0 -1
  477. package/src/runtime/auth/__tests__/guard-tests.test.ts +3 -2
  478. package/src/runtime/auth/__tests__/{ipc-auth-context.test.ts → local-auth-context.test.ts} +21 -21
  479. package/src/runtime/auth/__tests__/route-policy.test.ts +2 -2
  480. package/src/runtime/auth/__tests__/scopes.test.ts +9 -8
  481. package/src/runtime/auth/__tests__/subject.test.ts +8 -8
  482. package/src/runtime/auth/__tests__/token-service.test.ts +0 -1
  483. package/src/runtime/auth/route-policy.ts +8 -8
  484. package/src/runtime/auth/scopes.ts +2 -1
  485. package/src/runtime/auth/subject.ts +4 -4
  486. package/src/runtime/auth/token-service.ts +1 -24
  487. package/src/runtime/auth/types.ts +3 -3
  488. package/src/runtime/guardian-action-followup-executor.ts +1 -1
  489. package/src/runtime/guardian-action-grant-minter.ts +1 -1
  490. package/src/runtime/guardian-action-service.ts +3 -3
  491. package/src/runtime/http-server.ts +15 -2
  492. package/src/runtime/http-types.ts +10 -0
  493. package/src/runtime/invite-service.ts +3 -3
  494. package/src/runtime/local-actor-identity.ts +17 -22
  495. package/src/runtime/middleware/error-handler.ts +14 -1
  496. package/src/runtime/pending-interactions.ts +21 -9
  497. package/src/runtime/routes/app-management-routes.ts +63 -67
  498. package/src/runtime/routes/approval-routes.ts +1 -3
  499. package/src/runtime/routes/brain-graph/brain-graph.html +1845 -0
  500. package/src/runtime/routes/brain-graph-routes.ts +4 -42
  501. package/src/runtime/routes/btw-routes.ts +155 -0
  502. package/src/runtime/routes/computer-use-routes.ts +77 -31
  503. package/src/runtime/routes/conversation-routes.ts +234 -47
  504. package/src/runtime/routes/diagnostics-routes.ts +154 -43
  505. package/src/runtime/routes/documents-routes.ts +2 -2
  506. package/src/runtime/routes/global-search-routes.ts +1 -1
  507. package/src/runtime/routes/host-bash-routes.ts +83 -0
  508. package/src/runtime/routes/host-file-routes.ts +79 -0
  509. package/src/runtime/routes/integrations/slack/share.ts +1 -1
  510. package/src/runtime/routes/log-export-routes.ts +120 -0
  511. package/src/runtime/routes/mcp-routes.ts +20 -0
  512. package/src/runtime/routes/migration-routes.ts +3 -3
  513. package/src/runtime/routes/pairing-routes.ts +1 -1
  514. package/src/runtime/routes/recording-routes.ts +6 -4
  515. package/src/runtime/routes/schedule-routes.ts +31 -5
  516. package/src/runtime/routes/session-management-routes.ts +2 -6
  517. package/src/runtime/routes/session-query-routes.ts +18 -15
  518. package/src/runtime/routes/settings-routes.ts +7 -351
  519. package/src/runtime/routes/skills-routes.ts +7 -6
  520. package/src/runtime/routes/subagents-routes.ts +4 -10
  521. package/src/runtime/routes/surface-action-routes.ts +3 -14
  522. package/src/runtime/routes/surface-content-routes.ts +22 -5
  523. package/src/runtime/routes/work-items-routes.ts +21 -25
  524. package/src/runtime/routes/workspace-routes.test.ts +3 -3
  525. package/src/runtime/routes/workspace-utils.ts +1 -1
  526. package/src/runtime/telegram-streaming-delivery.ts +3 -0
  527. package/src/runtime/verification-outbound-actions.ts +2 -2
  528. package/src/schedule/integration-status.ts +0 -6
  529. package/src/schedule/schedule-store.ts +234 -43
  530. package/src/schedule/scheduler.ts +73 -74
  531. package/src/security/oauth2.ts +1 -1
  532. package/src/sequence/store.ts +12 -2
  533. package/src/skills/frontmatter.ts +19 -77
  534. package/src/skills/managed-store.ts +11 -2
  535. package/src/subagent/manager.ts +5 -3
  536. package/src/tasks/ephemeral-permissions.ts +3 -5
  537. package/src/tools/AGENTS.md +37 -0
  538. package/src/tools/apps/executors.ts +0 -6
  539. package/src/tools/browser/browser-manager.ts +17 -11
  540. package/src/tools/browser/jit-auth.ts +4 -1
  541. package/src/tools/claude-code/claude-code.ts +1 -1
  542. package/src/tools/computer-use/definitions.ts +48 -60
  543. package/src/tools/document/document-tool.ts +6 -6
  544. package/src/tools/document/editor-template.ts +10 -8
  545. package/src/tools/filesystem/edit.ts +2 -1
  546. package/src/tools/filesystem/read.ts +20 -2
  547. package/src/tools/filesystem/write.ts +2 -1
  548. package/src/tools/host-filesystem/edit.ts +17 -1
  549. package/src/tools/host-filesystem/read.ts +16 -1
  550. package/src/tools/host-filesystem/write.ts +15 -1
  551. package/src/tools/host-terminal/host-shell.ts +24 -0
  552. package/src/tools/memory/definitions.ts +45 -81
  553. package/src/tools/memory/handlers.test.ts +0 -1
  554. package/src/tools/memory/handlers.ts +1 -1
  555. package/src/tools/memory/register.ts +26 -60
  556. package/src/tools/network/script-proxy/session-manager.ts +6 -8
  557. package/src/tools/network/web-fetch.ts +7 -1
  558. package/src/tools/network/web-search.ts +2 -1
  559. package/src/tools/registry.ts +23 -0
  560. package/src/tools/schedule/create.ts +113 -5
  561. package/src/tools/schedule/list.ts +57 -15
  562. package/src/tools/schedule/update.ts +73 -3
  563. package/src/tools/shared/filesystem/image-read.ts +192 -0
  564. package/src/tools/side-effects.ts +1 -7
  565. package/src/tools/skills/delete-managed.ts +27 -64
  566. package/src/tools/skills/execute.ts +54 -0
  567. package/src/tools/skills/load.ts +127 -5
  568. package/src/tools/skills/scaffold-managed.ts +93 -172
  569. package/src/tools/subagent/message.ts +0 -7
  570. package/src/tools/subagent/spawn.ts +1 -1
  571. package/src/tools/swarm/delegate.ts +0 -3
  572. package/src/tools/system/avatar-generator.ts +13 -19
  573. package/src/tools/system/request-permission.ts +2 -1
  574. package/src/tools/terminal/safe-env.ts +1 -0
  575. package/src/tools/tool-manifest.ts +41 -47
  576. package/src/tools/types.ts +6 -2
  577. package/src/tools/ui-surface/definitions.ts +0 -55
  578. package/src/util/errors.ts +12 -10
  579. package/src/workspace/git-service.ts +0 -2
  580. package/src/__tests__/account-registry.test.ts +0 -258
  581. package/src/__tests__/email-classifier.test.ts +0 -25
  582. package/src/__tests__/gmail-integration.test.ts +0 -97
  583. package/src/__tests__/handle-user-message-secret-resume.test.ts +0 -172
  584. package/src/__tests__/home-base-bootstrap.test.ts +0 -84
  585. package/src/__tests__/managed-twitter-guardrails.test.ts +0 -353
  586. package/src/__tests__/prebuilt-home-base-seed.test.ts +0 -79
  587. package/src/__tests__/recording-intent-fallback.test.ts +0 -199
  588. package/src/__tests__/recording-intent.test.ts +0 -985
  589. package/src/__tests__/recording-state-machine.test.ts +0 -1574
  590. package/src/__tests__/reminder-store.test.ts +0 -350
  591. package/src/__tests__/reminder.test.ts +0 -337
  592. package/src/__tests__/scan-result-store.test.ts +0 -121
  593. package/src/__tests__/twitter-platform-proxy-client.test.ts +0 -450
  594. package/src/__tests__/view-image-tool.test.ts +0 -241
  595. package/src/cli/commands/amazon/cart.ts +0 -513
  596. package/src/cli/commands/amazon/checkout.ts +0 -394
  597. package/src/cli/commands/amazon/client.ts +0 -513
  598. package/src/cli/commands/amazon/index.ts +0 -920
  599. package/src/cli/commands/amazon/product-details.ts +0 -145
  600. package/src/cli/commands/amazon/request-extractor.ts +0 -187
  601. package/src/cli/commands/amazon/search.ts +0 -76
  602. package/src/cli/commands/amazon/session.ts +0 -116
  603. package/src/cli/commands/twitter/__tests__/cli-error-shaping.test.ts +0 -265
  604. package/src/cli/commands/twitter/__tests__/cli-read-routing.test.ts +0 -483
  605. package/src/cli/commands/twitter/__tests__/cli-routing.test.ts +0 -412
  606. package/src/cli/commands/twitter/__tests__/oauth-client.test.ts +0 -197
  607. package/src/cli/commands/twitter/client.ts +0 -989
  608. package/src/cli/commands/twitter/index.ts +0 -1160
  609. package/src/cli/commands/twitter/oauth-client.ts +0 -94
  610. package/src/cli/commands/twitter/router.ts +0 -396
  611. package/src/cli/commands/twitter/session.ts +0 -121
  612. package/src/config/bundled-skills/agentmail/SKILL.md +0 -132
  613. package/src/config/bundled-skills/agentmail/icon.svg +0 -21
  614. package/src/config/bundled-skills/amazon/SKILL.md +0 -137
  615. package/src/config/bundled-skills/amazon/icon.svg +0 -13
  616. package/src/config/bundled-skills/api-mapping/SKILL.md +0 -78
  617. package/src/config/bundled-skills/api-mapping/icon.svg +0 -18
  618. package/src/config/bundled-skills/cli-discover/SKILL.md +0 -68
  619. package/src/config/bundled-skills/deploy-fullstack-vercel/SKILL.md +0 -179
  620. package/src/config/bundled-skills/document-writer/SKILL.md +0 -195
  621. package/src/config/bundled-skills/elevenlabs-voice/SKILL.md +0 -140
  622. package/src/config/bundled-skills/email-setup/SKILL.md +0 -68
  623. package/src/config/bundled-skills/frontend-design/SKILL.md +0 -44
  624. package/src/config/bundled-skills/frontend-design/icon.svg +0 -16
  625. package/src/config/bundled-skills/google-oauth-setup/SKILL.md +0 -452
  626. package/src/config/bundled-skills/guardian-verify-setup/SKILL.md +0 -203
  627. package/src/config/bundled-skills/influencer/SKILL.md +0 -144
  628. package/src/config/bundled-skills/influencer/scripts/client.ts +0 -1269
  629. package/src/config/bundled-skills/influencer/scripts/influencer.ts +0 -267
  630. package/src/config/bundled-skills/macos-automation/SKILL.md +0 -65
  631. package/src/config/bundled-skills/macos-automation/icon.svg +0 -12
  632. package/src/config/bundled-skills/mcp-setup/SKILL.md +0 -75
  633. package/src/config/bundled-skills/media-processing/tools/media-diagnostics.ts +0 -184
  634. package/src/config/bundled-skills/messaging/tools/gmail-archive-by-query.ts +0 -80
  635. package/src/config/bundled-skills/messaging/tools/gmail-archive.ts +0 -29
  636. package/src/config/bundled-skills/messaging/tools/gmail-batch-archive.ts +0 -56
  637. package/src/config/bundled-skills/messaging/tools/gmail-batch-label.ts +0 -34
  638. package/src/config/bundled-skills/messaging/tools/gmail-download-attachment.ts +0 -47
  639. package/src/config/bundled-skills/messaging/tools/gmail-label.ts +0 -31
  640. package/src/config/bundled-skills/messaging/tools/gmail-list-attachments.ts +0 -67
  641. package/src/config/bundled-skills/messaging/tools/gmail-send-with-attachments.ts +0 -97
  642. package/src/config/bundled-skills/messaging/tools/gmail-summarize-thread.ts +0 -87
  643. package/src/config/bundled-skills/messaging/tools/gmail-triage.ts +0 -135
  644. package/src/config/bundled-skills/messaging/tools/messaging-analyze-activity.ts +0 -24
  645. package/src/config/bundled-skills/messaging/tools/messaging-reply.ts +0 -201
  646. package/src/config/bundled-skills/messaging/tools/send-notification.ts +0 -1
  647. package/src/config/bundled-skills/messaging/tools/sequence-cancel.ts +0 -27
  648. package/src/config/bundled-skills/messaging/tools/sequence-pause.ts +0 -48
  649. package/src/config/bundled-skills/messaging/tools/sequence-resume.ts +0 -27
  650. package/src/config/bundled-skills/messaging/tools/sequence-update.ts +0 -56
  651. package/src/config/bundled-skills/notion/SKILL.md +0 -240
  652. package/src/config/bundled-skills/notion-oauth-setup/SKILL.md +0 -126
  653. package/src/config/bundled-skills/oauth-setup/SKILL.md +0 -143
  654. package/src/config/bundled-skills/public-ingress/SKILL.md +0 -258
  655. package/src/config/bundled-skills/reminder/SKILL.md +0 -79
  656. package/src/config/bundled-skills/reminder/TOOLS.json +0 -89
  657. package/src/config/bundled-skills/reminder/tools/reminder-list.ts +0 -12
  658. package/src/config/bundled-skills/restaurant-reservation/SKILL.md +0 -141
  659. package/src/config/bundled-skills/screen-recording/SKILL.md +0 -148
  660. package/src/config/bundled-skills/self-upgrade/SKILL.md +0 -69
  661. package/src/config/bundled-skills/skills-catalog/SKILL.md +0 -78
  662. package/src/config/bundled-skills/slack-app-setup/SKILL.md +0 -178
  663. package/src/config/bundled-skills/slack-digest-setup/SKILL.md +0 -163
  664. package/src/config/bundled-skills/slack-oauth-setup/SKILL.md +0 -157
  665. package/src/config/bundled-skills/start-the-day/SKILL.md +0 -70
  666. package/src/config/bundled-skills/start-the-day/icon.svg +0 -13
  667. package/src/config/bundled-skills/telegram-setup/SKILL.md +0 -105
  668. package/src/config/bundled-skills/time-based-actions/SKILL.md +0 -142
  669. package/src/config/bundled-skills/twilio-setup/SKILL.md +0 -232
  670. package/src/config/bundled-skills/twitter/SKILL.md +0 -319
  671. package/src/config/bundled-skills/twitter/icon.svg +0 -14
  672. package/src/config/bundled-skills/typescript-eval/SKILL.md +0 -60
  673. package/src/config/bundled-skills/vercel-token-setup/SKILL.md +0 -214
  674. package/src/config/bundled-skills/voice-setup/SKILL.md +0 -131
  675. package/src/config/bundled-skills/voice-setup/icon.svg +0 -20
  676. package/src/daemon/handlers/pairing.ts +0 -119
  677. package/src/daemon/handlers/session-user-message.ts +0 -961
  678. package/src/daemon/recording-executor.ts +0 -180
  679. package/src/daemon/recording-intent-fallback.ts +0 -162
  680. package/src/daemon/recording-intent.ts +0 -493
  681. package/src/home-base/app-link-store.ts +0 -78
  682. package/src/home-base/bootstrap.ts +0 -74
  683. package/src/home-base/prebuilt/brain-graph.html +0 -1483
  684. package/src/home-base/prebuilt/index.html +0 -702
  685. package/src/home-base/prebuilt/seed-metadata.json +0 -21
  686. package/src/home-base/prebuilt/seed.ts +0 -122
  687. package/src/home-base/prebuilt-home-base-updater.ts +0 -36
  688. package/src/memory/account-store.ts +0 -117
  689. package/src/messaging/activity-analyzer.ts +0 -76
  690. package/src/messaging/email-classifier.ts +0 -208
  691. package/src/messaging/index.ts +0 -2
  692. package/src/messaging/outreach-classifier.ts +0 -185
  693. package/src/messaging/thread-summarizer.ts +0 -346
  694. package/src/messaging/types.ts +0 -17
  695. package/src/tools/browser/x-auto-navigate.ts +0 -254
  696. package/src/tools/credentials/account-registry.ts +0 -144
  697. package/src/tools/filesystem/view-image.ts +0 -244
  698. package/src/tools/reminder/reminder-store.ts +0 -194
  699. package/src/tools/reminder/reminder.ts +0 -158
  700. package/src/tools/system/navigate-settings.ts +0 -74
  701. package/src/tools/system/open-system-settings.ts +0 -85
  702. package/src/tools/system/version.ts +0 -54
  703. package/src/twitter/platform-proxy-client.ts +0 -405
  704. package/src/util/cookie-session.ts +0 -98
  705. /package/src/config/bundled-skills/{messaging → gmail}/tools/scan-result-store.ts +0 -0
  706. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-analytics.ts +0 -0
  707. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-create.ts +0 -0
  708. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-delete.ts +0 -0
  709. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enroll.ts +0 -0
  710. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-enrollment-list.ts +0 -0
  711. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-get.ts +0 -0
  712. /package/src/config/bundled-skills/{messaging → sequences}/tools/sequence-import.ts +0 -0
  713. /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
  });