@vellumai/assistant 0.4.48 → 0.4.50

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 (423) hide show
  1. package/ARCHITECTURE.md +26 -35
  2. package/README.md +5 -26
  3. package/docs/architecture/integrations.md +45 -41
  4. package/docs/architecture/keychain-broker.md +3 -3
  5. package/docs/architecture/memory.md +180 -119
  6. package/docs/runbook-trusted-contacts.md +3 -8
  7. package/hook-templates/debug-prompt-logger/hook.json +1 -1
  8. package/hook-templates/debug-prompt-logger/run.sh +1 -3
  9. package/package.json +2 -2
  10. package/src/__tests__/actor-token-service.test.ts +0 -1
  11. package/src/__tests__/agent-loop.test.ts +3 -1
  12. package/src/__tests__/anthropic-provider.test.ts +249 -2
  13. package/src/__tests__/approval-cascade.test.ts +796 -0
  14. package/src/__tests__/approval-primitive.test.ts +0 -1
  15. package/src/__tests__/approval-routes-http.test.ts +4 -0
  16. package/src/__tests__/assistant-attachments.test.ts +12 -34
  17. package/src/__tests__/assistant-feature-flag-guard.test.ts +0 -23
  18. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +76 -0
  19. package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -1
  20. package/src/__tests__/browser-skill-baseline-tool-payload.test.ts +2 -2
  21. package/src/__tests__/canonical-guardian-store.test.ts +95 -0
  22. package/src/__tests__/channel-guardian.test.ts +0 -2
  23. package/src/__tests__/channel-readiness-routes.test.ts +15 -6
  24. package/src/__tests__/channel-readiness-service.test.ts +10 -9
  25. package/src/__tests__/checker.test.ts +13 -20
  26. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +1 -1
  27. package/src/__tests__/computer-use-tools.test.ts +2 -19
  28. package/src/__tests__/config-schema.test.ts +1 -68
  29. package/src/__tests__/config-watcher.test.ts +0 -1
  30. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  31. package/src/__tests__/context-image-dimensions.test.ts +332 -0
  32. package/src/__tests__/context-memory-e2e.test.ts +11 -100
  33. package/src/__tests__/context-token-estimator.test.ts +196 -13
  34. package/src/__tests__/conversation-attention-store.test.ts +0 -1
  35. package/src/__tests__/conversation-attention-telegram.test.ts +0 -1
  36. package/src/__tests__/conversation-routes-guardian-reply.test.ts +152 -0
  37. package/src/__tests__/conversation-routes-slash-commands.test.ts +2 -0
  38. package/src/__tests__/credential-metadata-store.test.ts +64 -73
  39. package/src/__tests__/credential-security-e2e.test.ts +1 -0
  40. package/src/__tests__/credential-security-invariants.test.ts +13 -7
  41. package/src/__tests__/credential-vault-unit.test.ts +284 -49
  42. package/src/__tests__/credential-vault.test.ts +150 -16
  43. package/src/__tests__/credentials-cli.test.ts +71 -0
  44. package/src/__tests__/cu-unified-flow.test.ts +532 -0
  45. package/src/__tests__/date-context.test.ts +93 -77
  46. package/src/__tests__/deterministic-verification-control-plane.test.ts +64 -0
  47. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  48. package/src/__tests__/ephemeral-permissions.test.ts +3 -3
  49. package/src/__tests__/gateway-only-guard.test.ts +0 -1
  50. package/src/__tests__/guardian-action-grant-mint-consume.test.ts +0 -1
  51. package/src/__tests__/guardian-decision-primitive-canonical.test.ts +0 -1
  52. package/src/__tests__/guardian-routing-invariants.test.ts +93 -1
  53. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -1
  54. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -39
  55. package/src/__tests__/heartbeat-service.test.ts +0 -1
  56. package/src/__tests__/history-repair.test.ts +245 -0
  57. package/src/__tests__/host-cu-proxy.test.ts +791 -0
  58. package/src/__tests__/host-shell-tool.test.ts +27 -15
  59. package/src/__tests__/http-user-message-parity.test.ts +2 -0
  60. package/src/__tests__/ingress-url-consistency.test.ts +14 -21
  61. package/src/__tests__/integration-status.test.ts +32 -51
  62. package/src/__tests__/intent-routing.test.ts +0 -1
  63. package/src/__tests__/invite-redemption-service.test.ts +65 -1
  64. package/src/__tests__/invite-routes-http.test.ts +10 -9
  65. package/src/__tests__/keychain-broker-client.test.ts +14 -46
  66. package/src/__tests__/memory-context-benchmark.benchmark.test.ts +56 -18
  67. package/src/__tests__/memory-lifecycle-e2e.test.ts +244 -387
  68. package/src/__tests__/memory-recall-quality.test.ts +244 -407
  69. package/src/__tests__/memory-regressions.experimental.test.ts +126 -101
  70. package/src/__tests__/memory-regressions.test.ts +477 -2841
  71. package/src/__tests__/memory-retrieval.benchmark.test.ts +33 -150
  72. package/src/__tests__/memory-upsert-concurrency.test.ts +5 -244
  73. package/src/__tests__/mime-builder.test.ts +28 -0
  74. package/src/__tests__/native-web-search.test.ts +1 -0
  75. package/src/__tests__/notification-routing-intent.test.ts +0 -1
  76. package/src/__tests__/oauth-cli.test.ts +941 -15
  77. package/src/__tests__/oauth-provider-profiles.test.ts +9 -9
  78. package/src/__tests__/oauth-scope-policy.test.ts +4 -6
  79. package/src/__tests__/oauth-store.test.ts +870 -0
  80. package/src/__tests__/onboarding-starter-tasks.test.ts +0 -1
  81. package/src/__tests__/provider-error-scenarios.test.ts +0 -1
  82. package/src/__tests__/provider-streaming.benchmark.test.ts +0 -1
  83. package/src/__tests__/public-ingress-urls.test.ts +15 -21
  84. package/src/__tests__/qdrant-collection-migration.test.ts +53 -8
  85. package/src/__tests__/recording-handler.test.ts +3 -4
  86. package/src/__tests__/registry.test.ts +2 -3
  87. package/src/__tests__/relay-server.test.ts +46 -1
  88. package/src/__tests__/runtime-events-sse.test.ts +55 -7
  89. package/src/__tests__/schedule-store.test.ts +0 -1
  90. package/src/__tests__/schedule-tools.test.ts +32 -0
  91. package/src/__tests__/scheduler-recurrence.test.ts +0 -1
  92. package/src/__tests__/scoped-approval-grants.test.ts +0 -1
  93. package/src/__tests__/scoped-grant-security-matrix.test.ts +0 -1
  94. package/src/__tests__/script-proxy-certs.test.ts +1 -1
  95. package/src/__tests__/secret-ingress-handler.test.ts +0 -1
  96. package/src/__tests__/secret-onetime-send.test.ts +1 -0
  97. package/src/__tests__/secure-keys.test.ts +7 -2
  98. package/src/__tests__/send-endpoint-busy.test.ts +24 -6
  99. package/src/__tests__/sequence-store.test.ts +0 -1
  100. package/src/__tests__/session-abort-tool-results.test.ts +1 -14
  101. package/src/__tests__/session-agent-loop-overflow.test.ts +1583 -0
  102. package/src/__tests__/session-agent-loop.test.ts +19 -15
  103. package/src/__tests__/session-confirmation-signals.test.ts +1 -15
  104. package/src/__tests__/session-error.test.ts +124 -2
  105. package/src/__tests__/session-history-web-search.test.ts +918 -0
  106. package/src/__tests__/session-init.benchmark.test.ts +4 -5
  107. package/src/__tests__/session-pre-run-repair.test.ts +1 -14
  108. package/src/__tests__/session-provider-retry-repair.test.ts +25 -28
  109. package/src/__tests__/session-queue.test.ts +37 -27
  110. package/src/__tests__/session-runtime-assembly.test.ts +54 -0
  111. package/src/__tests__/session-slash-known.test.ts +1 -15
  112. package/src/__tests__/session-slash-queue.test.ts +1 -15
  113. package/src/__tests__/session-slash-unknown.test.ts +1 -15
  114. package/src/__tests__/session-workspace-cache-state.test.ts +3 -33
  115. package/src/__tests__/session-workspace-injection.test.ts +3 -37
  116. package/src/__tests__/session-workspace-tool-tracking.test.ts +3 -37
  117. package/src/__tests__/skill-include-graph.test.ts +66 -0
  118. package/src/__tests__/skill-load-feature-flag.test.ts +0 -1
  119. package/src/__tests__/skill-load-tool.test.ts +149 -1
  120. package/src/__tests__/skill-projection-feature-flag.test.ts +0 -1
  121. package/src/__tests__/skills-install-extract.test.ts +93 -0
  122. package/src/__tests__/skills-uninstall.test.ts +1 -1
  123. package/src/__tests__/skills.test.ts +3 -3
  124. package/src/__tests__/skillssh-registry.test.ts +451 -0
  125. package/src/__tests__/slack-channel-config.test.ts +67 -3
  126. package/src/__tests__/slack-share-routes.test.ts +17 -19
  127. package/src/__tests__/system-prompt.test.ts +0 -1
  128. package/src/__tests__/telegram-invite-adapter.test.ts +18 -22
  129. package/src/__tests__/terminal-tools.test.ts +4 -3
  130. package/src/__tests__/test-support/computer-use-skill-harness.ts +3 -2
  131. package/src/__tests__/tool-approval-handler.test.ts +0 -1
  132. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +0 -1
  133. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  134. package/src/__tests__/tool-executor-shell-integration.test.ts +0 -1
  135. package/src/__tests__/tool-executor.test.ts +0 -1
  136. package/src/__tests__/tool-grant-request-escalation.test.ts +0 -1
  137. package/src/__tests__/trust-store-pattern-matches.test.ts +29 -0
  138. package/src/__tests__/trust-store.test.ts +7 -13
  139. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  140. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +0 -1
  141. package/src/__tests__/twilio-routes.test.ts +0 -16
  142. package/src/__tests__/verification-control-plane-policy.test.ts +0 -1
  143. package/src/__tests__/voice-invite-redemption.test.ts +32 -1
  144. package/src/__tests__/voice-scoped-grant-consumer.test.ts +0 -1
  145. package/src/agent/ax-tree-compaction.test.ts +286 -0
  146. package/src/agent/loop.ts +104 -131
  147. package/src/approvals/AGENTS.md +1 -1
  148. package/src/approvals/guardian-request-resolvers.ts +14 -2
  149. package/src/bundler/compiler-tools.ts +66 -2
  150. package/src/calls/call-domain.ts +133 -6
  151. package/src/calls/call-store.ts +6 -0
  152. package/src/calls/relay-server.ts +52 -18
  153. package/src/calls/relay-setup-router.ts +17 -1
  154. package/src/calls/twilio-config.ts +3 -8
  155. package/src/calls/twilio-routes.ts +1 -2
  156. package/src/calls/types.ts +3 -1
  157. package/src/calls/voice-ingress-preflight.ts +1 -1
  158. package/src/cli/commands/browser-relay.ts +18 -12
  159. package/src/cli/commands/completions.ts +0 -3
  160. package/src/cli/commands/credentials.ts +101 -15
  161. package/src/cli/commands/doctor.ts +4 -3
  162. package/src/cli/commands/mcp.ts +46 -59
  163. package/src/cli/commands/memory.ts +16 -165
  164. package/src/cli/commands/oauth/apps.ts +284 -0
  165. package/src/cli/commands/oauth/connections.ts +633 -0
  166. package/src/cli/commands/oauth/index.ts +52 -0
  167. package/src/cli/commands/oauth/providers.ts +256 -0
  168. package/src/cli/commands/sessions.ts +5 -2
  169. package/src/cli/commands/skills.ts +177 -339
  170. package/src/cli/http-client.ts +0 -20
  171. package/src/cli/main-screen.tsx +2 -2
  172. package/src/cli/program.ts +6 -11
  173. package/src/cli/reference.ts +1 -3
  174. package/src/cli.ts +4 -10
  175. package/src/config/assistant-feature-flags.ts +0 -3
  176. package/src/config/bundled-skills/_shared/CLI_RETRIEVAL_PATTERN.md +1 -1
  177. package/src/config/bundled-skills/computer-use/SKILL.md +3 -6
  178. package/src/config/bundled-skills/computer-use/TOOLS.json +23 -5
  179. package/src/config/bundled-skills/computer-use/tools/{computer-use-request-control.ts → computer-use-observe.ts} +1 -5
  180. package/src/config/bundled-skills/google-calendar/calendar-client.ts +21 -16
  181. package/src/config/bundled-skills/messaging/tools/shared.ts +1 -4
  182. package/src/config/bundled-skills/settings/SKILL.md +1 -1
  183. package/src/config/bundled-skills/settings/TOOLS.json +2 -8
  184. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +5 -33
  185. package/src/config/bundled-tool-registry.ts +2 -5
  186. package/src/config/env-registry.ts +14 -83
  187. package/src/config/env.ts +11 -50
  188. package/src/config/feature-flag-registry.json +16 -16
  189. package/src/config/loader.ts +0 -6
  190. package/src/config/schema.ts +4 -13
  191. package/src/config/schemas/memory-lifecycle.ts +0 -9
  192. package/src/config/schemas/memory-processing.ts +0 -180
  193. package/src/config/schemas/memory-retrieval.ts +32 -104
  194. package/src/config/schemas/memory.ts +0 -10
  195. package/src/config/skills.ts +21 -2
  196. package/src/config/types.ts +0 -4
  197. package/src/context/image-dimensions.ts +229 -0
  198. package/src/context/token-estimator.ts +75 -12
  199. package/src/context/window-manager.ts +53 -11
  200. package/src/daemon/assistant-attachments.ts +1 -13
  201. package/src/daemon/config-watcher.ts +61 -3
  202. package/src/daemon/daemon-control.ts +1 -1
  203. package/src/daemon/date-context.ts +114 -31
  204. package/src/daemon/handlers/config-ingress.ts +8 -33
  205. package/src/daemon/handlers/config-slack-channel.ts +49 -46
  206. package/src/daemon/handlers/config-telegram.ts +32 -16
  207. package/src/daemon/handlers/sessions.ts +27 -36
  208. package/src/daemon/handlers/shared.ts +0 -130
  209. package/src/daemon/handlers/skills.ts +20 -1
  210. package/src/daemon/history-repair.ts +72 -8
  211. package/src/daemon/host-cu-proxy.ts +430 -0
  212. package/src/daemon/lifecycle.ts +67 -71
  213. package/src/daemon/mcp-reload-service.ts +2 -2
  214. package/src/daemon/message-protocol.ts +3 -0
  215. package/src/daemon/message-types/computer-use.ts +1 -129
  216. package/src/daemon/message-types/host-cu.ts +19 -0
  217. package/src/daemon/message-types/memory.ts +4 -16
  218. package/src/daemon/message-types/messages.ts +4 -0
  219. package/src/daemon/message-types/sessions.ts +4 -0
  220. package/src/daemon/server.ts +25 -21
  221. package/src/daemon/session-agent-loop-handlers.ts +40 -0
  222. package/src/daemon/session-agent-loop.ts +334 -48
  223. package/src/daemon/session-attachments.ts +1 -2
  224. package/src/daemon/session-error.ts +89 -6
  225. package/src/daemon/session-history.ts +17 -7
  226. package/src/daemon/session-media-retry.ts +6 -2
  227. package/src/daemon/session-memory.ts +69 -149
  228. package/src/daemon/session-process.ts +10 -1
  229. package/src/daemon/session-runtime-assembly.ts +49 -19
  230. package/src/daemon/session-slash.ts +1 -1
  231. package/src/daemon/session-surfaces.ts +43 -28
  232. package/src/daemon/session-tool-setup.ts +9 -10
  233. package/src/daemon/session.ts +150 -17
  234. package/src/daemon/tool-side-effects.ts +2 -8
  235. package/src/daemon/watch-handler.ts +2 -2
  236. package/src/events/tool-metrics-listener.ts +2 -2
  237. package/src/hooks/manager.ts +1 -4
  238. package/src/inbound/public-ingress-urls.ts +7 -7
  239. package/src/instrument.ts +61 -1
  240. package/src/logfire.ts +16 -5
  241. package/src/memory/admin.ts +2 -191
  242. package/src/memory/canonical-guardian-store.ts +38 -2
  243. package/src/memory/conversation-crud.ts +0 -33
  244. package/src/memory/conversation-key-store.ts +21 -0
  245. package/src/memory/conversation-queries.ts +22 -3
  246. package/src/memory/db-init.ts +32 -0
  247. package/src/memory/embedding-backend.ts +84 -8
  248. package/src/memory/embedding-types.ts +9 -1
  249. package/src/memory/indexer.ts +7 -46
  250. package/src/memory/items-extractor.ts +274 -76
  251. package/src/memory/job-handlers/backfill.ts +2 -127
  252. package/src/memory/job-handlers/cleanup.ts +2 -16
  253. package/src/memory/job-handlers/extraction.ts +2 -138
  254. package/src/memory/job-handlers/index-maintenance.ts +1 -6
  255. package/src/memory/job-handlers/summarization.ts +3 -148
  256. package/src/memory/job-utils.ts +21 -59
  257. package/src/memory/jobs-store.ts +1 -159
  258. package/src/memory/jobs-worker.ts +9 -52
  259. package/src/memory/migrations/104-core-indexes.ts +3 -3
  260. package/src/memory/migrations/149-oauth-tables.ts +62 -0
  261. package/src/memory/migrations/150-oauth-apps-client-secret-path.ts +98 -0
  262. package/src/memory/migrations/151-oauth-providers-ping-url.ts +11 -0
  263. package/src/memory/migrations/152-memory-item-supersession.ts +44 -0
  264. package/src/memory/migrations/153-drop-entity-tables.ts +15 -0
  265. package/src/memory/migrations/154-drop-fts.ts +20 -0
  266. package/src/memory/migrations/155-drop-conflicts.ts +7 -0
  267. package/src/memory/migrations/156-call-session-invite-metadata.ts +24 -0
  268. package/src/memory/migrations/index.ts +8 -0
  269. package/src/memory/qdrant-client.ts +148 -51
  270. package/src/memory/raw-query.ts +1 -1
  271. package/src/memory/retriever.test.ts +294 -273
  272. package/src/memory/retriever.ts +421 -645
  273. package/src/memory/schema/calls.ts +2 -0
  274. package/src/memory/schema/index.ts +1 -0
  275. package/src/memory/schema/memory-core.ts +3 -48
  276. package/src/memory/schema/oauth.ts +67 -0
  277. package/src/memory/search/formatting.ts +263 -176
  278. package/src/memory/search/lexical.ts +1 -254
  279. package/src/memory/search/ranking.ts +0 -455
  280. package/src/memory/search/semantic.ts +100 -14
  281. package/src/memory/search/staleness.ts +47 -0
  282. package/src/memory/search/tier-classifier.ts +21 -0
  283. package/src/memory/search/types.ts +15 -77
  284. package/src/memory/task-memory-cleanup.ts +4 -6
  285. package/src/messaging/provider.ts +4 -4
  286. package/src/messaging/providers/gmail/client.ts +82 -2
  287. package/src/messaging/providers/gmail/mime-builder.ts +17 -7
  288. package/src/messaging/providers/gmail/people-client.ts +10 -10
  289. package/src/messaging/providers/telegram-bot/adapter.ts +17 -17
  290. package/src/messaging/providers/whatsapp/adapter.ts +11 -8
  291. package/src/messaging/registry.ts +2 -32
  292. package/src/notifications/copy-composer.ts +0 -5
  293. package/src/notifications/signal.ts +4 -5
  294. package/src/oauth/byo-connection.test.ts +133 -25
  295. package/src/oauth/byo-connection.ts +22 -6
  296. package/src/oauth/connect-orchestrator.ts +113 -57
  297. package/src/oauth/connect-types.ts +17 -23
  298. package/src/oauth/connection-resolver.ts +35 -11
  299. package/src/oauth/connection.ts +1 -1
  300. package/src/oauth/manual-token-connection.ts +104 -0
  301. package/src/oauth/oauth-store.ts +582 -0
  302. package/src/oauth/platform-connection.test.ts +29 -0
  303. package/src/oauth/platform-connection.ts +6 -5
  304. package/src/oauth/provider-behaviors.ts +124 -0
  305. package/src/oauth/scope-policy.ts +9 -2
  306. package/src/oauth/seed-providers.ts +167 -0
  307. package/src/oauth/token-persistence.ts +81 -77
  308. package/src/permissions/checker.ts +3 -3
  309. package/src/permissions/defaults.ts +1 -1
  310. package/src/permissions/prompter.ts +10 -1
  311. package/src/permissions/trust-store.ts +36 -1
  312. package/src/playbooks/playbook-compiler.ts +1 -1
  313. package/src/prompts/__tests__/build-cli-reference-section.test.ts +3 -1
  314. package/src/prompts/system-prompt.ts +46 -42
  315. package/src/providers/anthropic/client.ts +59 -20
  316. package/src/providers/retry.ts +1 -27
  317. package/src/providers/types.ts +7 -1
  318. package/src/runtime/AGENTS.md +9 -0
  319. package/src/runtime/auth/route-policy.ts +6 -6
  320. package/src/runtime/channel-reply-delivery.ts +0 -40
  321. package/src/runtime/gateway-client.ts +0 -7
  322. package/src/runtime/guardian-reply-router.ts +24 -22
  323. package/src/runtime/http-server.ts +10 -8
  324. package/src/runtime/http-types.ts +2 -2
  325. package/src/runtime/invite-redemption-service.ts +19 -1
  326. package/src/runtime/invite-service.ts +25 -0
  327. package/src/runtime/middleware/twilio-validation.ts +1 -11
  328. package/src/runtime/pending-interactions.ts +14 -12
  329. package/src/runtime/routes/brain-graph-routes.ts +10 -90
  330. package/src/runtime/routes/channel-delivery-routes.ts +0 -1
  331. package/src/runtime/routes/conversation-routes.ts +81 -19
  332. package/src/runtime/routes/events-routes.ts +21 -11
  333. package/src/runtime/routes/host-cu-routes.ts +97 -0
  334. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +21 -12
  335. package/src/runtime/routes/inbound-stages/background-dispatch.ts +12 -111
  336. package/src/runtime/routes/integrations/slack/share.ts +6 -7
  337. package/src/runtime/routes/log-export-routes.ts +126 -8
  338. package/src/runtime/routes/memory-item-routes.test.ts +754 -0
  339. package/src/runtime/routes/memory-item-routes.ts +503 -0
  340. package/src/runtime/routes/session-management-routes.ts +3 -3
  341. package/src/runtime/routes/settings-routes.ts +55 -48
  342. package/src/runtime/routes/surface-action-routes.ts +1 -1
  343. package/src/runtime/routes/trust-rules-routes.ts +14 -0
  344. package/src/runtime/routes/watch-routes.ts +128 -0
  345. package/src/runtime/routes/workspace-routes.ts +2 -1
  346. package/src/schedule/integration-status.ts +10 -9
  347. package/src/security/credential-key.ts +0 -156
  348. package/src/security/keychain-broker-client.ts +22 -10
  349. package/src/security/oauth2.ts +1 -1
  350. package/src/security/secure-keys.ts +25 -3
  351. package/src/security/token-manager.ts +137 -64
  352. package/src/skills/catalog-install.ts +414 -0
  353. package/src/skills/include-graph.ts +32 -0
  354. package/src/skills/skillssh-registry.ts +503 -0
  355. package/src/telegram/bot-username.ts +2 -3
  356. package/src/tools/assets/search.ts +5 -1
  357. package/src/tools/browser/network-recorder.ts +1 -1
  358. package/src/tools/browser/network-recording-types.ts +1 -1
  359. package/src/tools/computer-use/definitions.ts +36 -11
  360. package/src/tools/computer-use/registry.ts +5 -6
  361. package/src/tools/credentials/broker.ts +1 -2
  362. package/src/tools/credentials/metadata-store.ts +17 -121
  363. package/src/tools/credentials/vault.ts +92 -167
  364. package/src/tools/memory/definitions.ts +4 -13
  365. package/src/tools/memory/handlers.test.ts +83 -103
  366. package/src/tools/memory/handlers.ts +50 -85
  367. package/src/tools/registry.ts +2 -7
  368. package/src/tools/schedule/create.ts +8 -1
  369. package/src/tools/schedule/update.ts +8 -1
  370. package/src/tools/skills/load.ts +85 -3
  371. package/src/tools/watch/watch-state.ts +0 -12
  372. package/src/util/logger.ts +7 -41
  373. package/src/util/platform.ts +9 -28
  374. package/src/watcher/providers/google-calendar.ts +2 -1
  375. package/src/__tests__/clarification-resolver.test.ts +0 -193
  376. package/src/__tests__/computer-use-session-compaction.test.ts +0 -143
  377. package/src/__tests__/computer-use-session-lifecycle.test.ts +0 -322
  378. package/src/__tests__/computer-use-session-working-dir.test.ts +0 -166
  379. package/src/__tests__/computer-use-skill-baseline.test.ts +0 -78
  380. package/src/__tests__/computer-use-skill-endstate.test.ts +0 -105
  381. package/src/__tests__/computer-use-skill-lifecycle-cleanup.test.ts +0 -249
  382. package/src/__tests__/conflict-intent-tokenization.test.ts +0 -160
  383. package/src/__tests__/conflict-policy.test.ts +0 -269
  384. package/src/__tests__/conflict-store.test.ts +0 -372
  385. package/src/__tests__/contradiction-checker.test.ts +0 -361
  386. package/src/__tests__/entity-extractor.test.ts +0 -211
  387. package/src/__tests__/entity-search.test.ts +0 -1117
  388. package/src/__tests__/profile-compiler.test.ts +0 -392
  389. package/src/__tests__/ride-shotgun-handler.test.ts +0 -452
  390. package/src/__tests__/session-conflict-gate.test.ts +0 -1228
  391. package/src/__tests__/session-profile-injection.test.ts +0 -557
  392. package/src/cli/commands/dev.ts +0 -129
  393. package/src/cli/commands/map.ts +0 -391
  394. package/src/cli/commands/oauth.ts +0 -77
  395. package/src/config/bundled-skills/knowledge-graph/SKILL.md +0 -25
  396. package/src/config/bundled-skills/knowledge-graph/TOOLS.json +0 -66
  397. package/src/config/bundled-skills/knowledge-graph/tools/graph-query.ts +0 -211
  398. package/src/daemon/computer-use-session.ts +0 -1026
  399. package/src/daemon/ride-shotgun-handler.ts +0 -569
  400. package/src/daemon/session-conflict-gate.ts +0 -167
  401. package/src/daemon/session-dynamic-profile.ts +0 -77
  402. package/src/memory/clarification-resolver.ts +0 -417
  403. package/src/memory/conflict-intent.ts +0 -205
  404. package/src/memory/conflict-policy.ts +0 -127
  405. package/src/memory/conflict-store.ts +0 -410
  406. package/src/memory/contradiction-checker.ts +0 -508
  407. package/src/memory/entity-extractor.ts +0 -535
  408. package/src/memory/format-recall.ts +0 -47
  409. package/src/memory/fts-reconciler.ts +0 -165
  410. package/src/memory/job-handlers/conflict.ts +0 -200
  411. package/src/memory/profile-compiler.ts +0 -195
  412. package/src/memory/recall-cache.ts +0 -117
  413. package/src/memory/search/entity.ts +0 -535
  414. package/src/memory/search/query-expansion.test.ts +0 -70
  415. package/src/memory/search/query-expansion.ts +0 -118
  416. package/src/oauth/provider-base-urls.ts +0 -21
  417. package/src/oauth/provider-profiles.ts +0 -192
  418. package/src/prompts/computer-use-prompt.ts +0 -98
  419. package/src/runtime/routes/computer-use-routes.ts +0 -641
  420. package/src/runtime/routes/mcp-routes.ts +0 -20
  421. package/src/runtime/telegram-streaming-delivery.test.ts +0 -729
  422. package/src/runtime/telegram-streaming-delivery.ts +0 -393
  423. package/src/tools/computer-use/request-computer-control.ts +0 -56
@@ -1,452 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
2
-
3
- import type { HandlerContext } from "../daemon/handlers/shared.js";
4
-
5
- // ── Mocks ──────────────────────────────────────────────────────────
6
-
7
- let mockEnsureChromeResult = {
8
- baseUrl: "http://localhost:9222",
9
- launchedByUs: false,
10
- userDataDir: "/tmp/cdp-test",
11
- };
12
- let mockEnsureChromeShouldThrow = false;
13
- let mockMinimizeCalled = false;
14
- let mockMinimizeBaseUrl: string | undefined;
15
-
16
- mock.module("../tools/browser/chrome-cdp.js", () => ({
17
- ensureChromeWithCdp: async () => {
18
- if (mockEnsureChromeShouldThrow) {
19
- throw new Error("Chrome launch failed");
20
- }
21
- return { ...mockEnsureChromeResult };
22
- },
23
- minimizeChromeWindow: async (baseUrl: string) => {
24
- mockMinimizeCalled = true;
25
- mockMinimizeBaseUrl = baseUrl;
26
- },
27
- isCdpReady: async () => true,
28
- restoreChromeWindow: async () => {},
29
- }));
30
-
31
- let mockRecorderStartCalls = 0;
32
- let mockRecorderStartShouldThrow = false;
33
- let mockRecorderStartThrowCount = 0;
34
- let mockRecorderConstructorCdpBaseUrl: string | undefined;
35
-
36
- mock.module("../tools/browser/network-recorder.js", () => ({
37
- NetworkRecorder: class MockNetworkRecorder {
38
- loginSignals: string[] = [];
39
- onLoginDetected?: () => void;
40
- get entryCount() {
41
- return 0;
42
- }
43
-
44
- constructor(_targetDomain?: string, cdpBaseUrl?: string) {
45
- mockRecorderConstructorCdpBaseUrl = cdpBaseUrl;
46
- }
47
-
48
- async startDirect() {
49
- mockRecorderStartCalls++;
50
- if (
51
- mockRecorderStartShouldThrow &&
52
- mockRecorderStartCalls <= mockRecorderStartThrowCount
53
- ) {
54
- throw new Error("CDP not ready");
55
- }
56
- }
57
-
58
- async stop() {
59
- return [];
60
- }
61
-
62
- async extractCookies() {
63
- return [];
64
- }
65
- },
66
- }));
67
-
68
- mock.module("../tools/browser/recording-store.js", () => ({
69
- saveRecording: () => "/tmp/test-recording.json",
70
- }));
71
-
72
- mock.module("../tools/browser/auto-navigate.js", () => ({
73
- autoNavigate: async () => [],
74
- }));
75
-
76
- mock.module("../util/logger.js", () => ({
77
- getLogger: () => ({
78
- info: () => {},
79
- debug: () => {},
80
- warn: () => {},
81
- error: () => {},
82
- }),
83
- }));
84
-
85
- const mockLastSummaryBySession = new Map<string, string>();
86
- mock.module("../daemon/watch-handler.js", () => ({
87
- generateSummary: async () => {},
88
- lastSummaryBySession: mockLastSummaryBySession,
89
- }));
90
-
91
- // ── Import under test (after mocks) ───────────────────────────────
92
-
93
- const { handleRideShotgunStart, handleRideShotgunStop } =
94
- await import("../daemon/ride-shotgun-handler.js");
95
- const { watchSessions } = await import("../tools/watch/watch-state.js");
96
-
97
- // ── Helpers ────────────────────────────────────────────────────────
98
-
99
- function makeMockCtx() {
100
- const sent: unknown[] = [];
101
- return {
102
- send: (msg: unknown) => sent.push(msg),
103
- sent,
104
- } as unknown as HandlerContext & { sent: unknown[] };
105
- }
106
-
107
- function waitForRecorderStart(timeoutMs = 3000): Promise<void> {
108
- return new Promise((resolve, reject) => {
109
- const start = Date.now();
110
- const poll = setInterval(() => {
111
- if (mockRecorderStartCalls > 0) {
112
- clearInterval(poll);
113
- resolve();
114
- } else if (Date.now() - start > timeoutMs) {
115
- clearInterval(poll);
116
- reject(new Error("Timed out waiting for recorder start"));
117
- }
118
- }, 50);
119
- });
120
- }
121
-
122
- // ── Tests ──────────────────────────────────────────────────────────
123
-
124
- describe("ride-shotgun-handler", () => {
125
- beforeEach(() => {
126
- mockRecorderStartCalls = 0;
127
- mockRecorderStartShouldThrow = false;
128
- mockRecorderStartThrowCount = 0;
129
- mockRecorderConstructorCdpBaseUrl = undefined;
130
- mockMinimizeCalled = false;
131
- mockMinimizeBaseUrl = undefined;
132
- mockEnsureChromeShouldThrow = false;
133
- mockEnsureChromeResult = {
134
- baseUrl: "http://localhost:9222",
135
- launchedByUs: false,
136
- userDataDir: "/tmp/cdp-test",
137
- };
138
- mockLastSummaryBySession.clear();
139
- watchSessions.clear();
140
- });
141
-
142
- afterEach(() => {
143
- // Clean up any dangling sessions
144
- for (const [, session] of watchSessions) {
145
- if (session.timeoutHandle) clearTimeout(session.timeoutHandle);
146
- }
147
- watchSessions.clear();
148
- });
149
-
150
- test("learn mode calls ensureChromeWithCdp before starting recorder", async () => {
151
- const ctx = makeMockCtx();
152
-
153
- await handleRideShotgunStart(
154
- {
155
- type: "ride_shotgun_start",
156
- durationSeconds: 60,
157
- intervalSeconds: 5,
158
- mode: "learn",
159
- targetDomain: "example.com",
160
- autoNavigate: false,
161
- },
162
- ctx,
163
- );
164
-
165
- // Background recording start — wait for it
166
- await waitForRecorderStart();
167
-
168
- expect(mockRecorderStartCalls).toBe(1);
169
- // The recorder should receive the CDP base URL from the session
170
- expect(mockRecorderConstructorCdpBaseUrl).toBe("http://localhost:9222");
171
- });
172
-
173
- test("learn mode passes CDP base URL to NetworkRecorder constructor", async () => {
174
- mockEnsureChromeResult = {
175
- baseUrl: "http://localhost:9333",
176
- launchedByUs: true,
177
- userDataDir: "/tmp/cdp-custom",
178
- };
179
-
180
- const ctx = makeMockCtx();
181
-
182
- await handleRideShotgunStart(
183
- {
184
- type: "ride_shotgun_start",
185
- durationSeconds: 60,
186
- intervalSeconds: 5,
187
- mode: "learn",
188
- targetDomain: "example.com",
189
- autoNavigate: false,
190
- },
191
- ctx,
192
- );
193
-
194
- await waitForRecorderStart();
195
-
196
- expect(mockRecorderConstructorCdpBaseUrl).toBe("http://localhost:9333");
197
- });
198
-
199
- test("learn mode does not start recorder when ensureChromeWithCdp fails", async () => {
200
- mockEnsureChromeShouldThrow = true;
201
-
202
- const ctx = makeMockCtx();
203
-
204
- await handleRideShotgunStart(
205
- {
206
- type: "ride_shotgun_start",
207
- durationSeconds: 60,
208
- intervalSeconds: 5,
209
- mode: "learn",
210
- targetDomain: "example.com",
211
- autoNavigate: false,
212
- },
213
- ctx,
214
- );
215
-
216
- // Give background task time to execute
217
- await new Promise((r) => setTimeout(r, 200));
218
-
219
- expect(mockRecorderStartCalls).toBe(0);
220
- });
221
-
222
- test("learn mode minimizes Chrome on completion when assistant launched it", async () => {
223
- mockEnsureChromeResult = {
224
- baseUrl: "http://localhost:9222",
225
- launchedByUs: true,
226
- userDataDir: "/tmp/cdp-test",
227
- };
228
-
229
- const ctx = makeMockCtx();
230
-
231
- await handleRideShotgunStart(
232
- {
233
- type: "ride_shotgun_start",
234
- durationSeconds: 60,
235
- intervalSeconds: 5,
236
- mode: "learn",
237
- targetDomain: "example.com",
238
- autoNavigate: false,
239
- },
240
- ctx,
241
- );
242
-
243
- await waitForRecorderStart();
244
-
245
- // Find the session and stop it
246
- const watchId = [...watchSessions.keys()][0]!;
247
- await handleRideShotgunStop({ type: "ride_shotgun_stop", watchId }, ctx);
248
-
249
- expect(mockMinimizeCalled).toBe(true);
250
- expect(mockMinimizeBaseUrl).toBe("http://localhost:9222");
251
- });
252
-
253
- test("learn mode does not minimize Chrome on completion when user launched it", async () => {
254
- mockEnsureChromeResult = {
255
- baseUrl: "http://localhost:9222",
256
- launchedByUs: false,
257
- userDataDir: "/tmp/cdp-test",
258
- };
259
-
260
- const ctx = makeMockCtx();
261
-
262
- await handleRideShotgunStart(
263
- {
264
- type: "ride_shotgun_start",
265
- durationSeconds: 60,
266
- intervalSeconds: 5,
267
- mode: "learn",
268
- targetDomain: "example.com",
269
- autoNavigate: false,
270
- },
271
- ctx,
272
- );
273
-
274
- await waitForRecorderStart();
275
-
276
- // Find the session and stop it
277
- const watchId = [...watchSessions.keys()][0]!;
278
- await handleRideShotgunStop({ type: "ride_shotgun_stop", watchId }, ctx);
279
-
280
- expect(mockMinimizeCalled).toBe(false);
281
- });
282
-
283
- test("observe mode does not call ensureChromeWithCdp", async () => {
284
- const ctx = makeMockCtx();
285
-
286
- await handleRideShotgunStart(
287
- {
288
- type: "ride_shotgun_start",
289
- durationSeconds: 60,
290
- intervalSeconds: 5,
291
- mode: "observe",
292
- },
293
- ctx,
294
- );
295
-
296
- // Give time for any background tasks
297
- await new Promise((r) => setTimeout(r, 200));
298
-
299
- // In observe mode, no recorder should be started
300
- expect(mockRecorderStartCalls).toBe(0);
301
-
302
- // Clean up
303
- const watchId = [...watchSessions.keys()][0]!;
304
- await handleRideShotgunStop({ type: "ride_shotgun_stop", watchId }, ctx);
305
- });
306
-
307
- test("sends watch_started message with session IDs", async () => {
308
- const ctx = makeMockCtx();
309
-
310
- await handleRideShotgunStart(
311
- {
312
- type: "ride_shotgun_start",
313
- durationSeconds: 30,
314
- intervalSeconds: 5,
315
- mode: "learn",
316
- targetDomain: "example.com",
317
- autoNavigate: false,
318
- },
319
- ctx,
320
- );
321
-
322
- const startMsg = ctx.sent.find(
323
- (m: any) => m.type === "watch_started",
324
- ) as any;
325
- expect(startMsg).toBeDefined();
326
- expect(startMsg.sessionId).toBeDefined();
327
- expect(startMsg.watchId).toBeDefined();
328
- expect(startMsg.durationSeconds).toBe(30);
329
-
330
- // Clean up
331
- const watchId = startMsg.watchId;
332
- await handleRideShotgunStop({ type: "ride_shotgun_stop", watchId }, ctx);
333
- });
334
-
335
- test("sends ride_shotgun_error when ensureChromeWithCdp fails", async () => {
336
- mockEnsureChromeShouldThrow = true;
337
-
338
- const ctx = makeMockCtx();
339
-
340
- await handleRideShotgunStart(
341
- {
342
- type: "ride_shotgun_start",
343
- durationSeconds: 60,
344
- intervalSeconds: 5,
345
- mode: "learn",
346
- targetDomain: "example.com",
347
- autoNavigate: false,
348
- },
349
- ctx,
350
- );
351
-
352
- // Give background task time to execute and complete session
353
- await new Promise((r) => setTimeout(r, 500));
354
-
355
- const errorMsg = ctx.sent.find(
356
- (m: any) => m.type === "ride_shotgun_error",
357
- ) as any;
358
- expect(errorMsg).toBeDefined();
359
- expect(errorMsg.watchId).toBeDefined();
360
- expect(errorMsg.sessionId).toBeDefined();
361
- expect(errorMsg.message).toContain("Chrome CDP");
362
- });
363
-
364
- test("cleans up session when ensureChromeWithCdp fails", async () => {
365
- mockEnsureChromeShouldThrow = true;
366
-
367
- const ctx = makeMockCtx();
368
-
369
- await handleRideShotgunStart(
370
- {
371
- type: "ride_shotgun_start",
372
- durationSeconds: 60,
373
- intervalSeconds: 5,
374
- mode: "learn",
375
- targetDomain: "example.com",
376
- autoNavigate: false,
377
- },
378
- ctx,
379
- );
380
-
381
- // Give background task time to execute
382
- await new Promise((r) => setTimeout(r, 500));
383
-
384
- // Session should be completed (not left hanging for the full duration)
385
- const session = [...watchSessions.values()][0];
386
- expect(session?.status).toBe("completed");
387
- });
388
-
389
- test("reports failure summary when no recorder ever started", async () => {
390
- mockEnsureChromeShouldThrow = true;
391
-
392
- const ctx = makeMockCtx();
393
-
394
- await handleRideShotgunStart(
395
- {
396
- type: "ride_shotgun_start",
397
- durationSeconds: 60,
398
- intervalSeconds: 5,
399
- mode: "learn",
400
- targetDomain: "example.com",
401
- autoNavigate: false,
402
- },
403
- ctx,
404
- );
405
-
406
- // Give background task time to execute
407
- await new Promise((r) => setTimeout(r, 500));
408
-
409
- // The result message should indicate the specific CDP failure
410
- const resultMsg = ctx.sent.find(
411
- (m: any) => m.type === "ride_shotgun_result",
412
- ) as any;
413
- expect(resultMsg).toBeDefined();
414
- expect(resultMsg.summary).toContain("failed");
415
- expect(resultMsg.summary).toContain("browser could not be started");
416
- expect(resultMsg.summary).not.toContain("recording saved");
417
- });
418
-
419
- test("sends ride_shotgun_error when all 10 recorder retries fail", async () => {
420
- mockRecorderStartShouldThrow = true;
421
- mockRecorderStartThrowCount = 10;
422
-
423
- const ctx = makeMockCtx();
424
-
425
- await handleRideShotgunStart(
426
- {
427
- type: "ride_shotgun_start",
428
- durationSeconds: 60,
429
- intervalSeconds: 5,
430
- mode: "learn",
431
- targetDomain: "example.com",
432
- autoNavigate: false,
433
- },
434
- ctx,
435
- );
436
-
437
- // Wait for all 10 retry attempts (each has a 2s delay except the last)
438
- // 9 retries * 2s = 18s, but mock doesn't actually wait — it should complete quickly
439
- // The mock delays are real setTimeout calls, so we need enough time
440
- await new Promise((r) => setTimeout(r, 25000));
441
-
442
- const errorMsg = ctx.sent.find(
443
- (m: any) => m.type === "ride_shotgun_error",
444
- ) as any;
445
- expect(errorMsg).toBeDefined();
446
- expect(errorMsg.message).toContain("10 attempts");
447
-
448
- // Session should be completed
449
- const session = [...watchSessions.values()][0];
450
- expect(session?.status).toBe("completed");
451
- }, 30000); // Extended timeout for retry delays
452
- });