@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
@@ -7,44 +7,42 @@
7
7
  import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
8
8
 
9
9
  import type { ChannelId } from "../channels/types.js";
10
- import { telegramInviteAdapter } from "../runtime/channel-invite-transports/telegram.js";
11
10
 
12
11
  // Mock credential metadata so tests don't depend on local persisted state.
13
12
  mock.module("../tools/credentials/metadata-store.js", () => ({
14
13
  getCredentialMetadata: () => undefined,
15
14
  }));
16
15
 
16
+ // Mock getTelegramBotUsername — the env var fallback was removed so we
17
+ // control the return value directly via a mutable variable.
18
+ let mockBotUsername: string | undefined;
19
+ mock.module("../telegram/bot-username.js", () => ({
20
+ getTelegramBotUsername: () => mockBotUsername,
21
+ }));
22
+
23
+ import { telegramInviteAdapter } from "../runtime/channel-invite-transports/telegram.js";
24
+
17
25
  // ---------------------------------------------------------------------------
18
26
  // Helpers
19
27
  // ---------------------------------------------------------------------------
20
28
 
21
29
  const CHANNEL: ChannelId = "telegram" as ChannelId;
22
30
 
23
- function setEnv(key: string, value: string | undefined) {
24
- if (value === undefined) {
25
- delete process.env[key];
26
- } else {
27
- process.env[key] = value;
28
- }
29
- }
30
-
31
31
  // ---------------------------------------------------------------------------
32
32
  // buildShareLink
33
33
  // ---------------------------------------------------------------------------
34
34
 
35
35
  describe("telegramInviteAdapter.buildShareLink", () => {
36
- let originalBotUsername: string | undefined;
37
-
38
36
  beforeEach(() => {
39
- originalBotUsername = process.env.TELEGRAM_BOT_USERNAME;
37
+ mockBotUsername = undefined;
40
38
  });
41
39
 
42
40
  afterEach(() => {
43
- setEnv("TELEGRAM_BOT_USERNAME", originalBotUsername);
41
+ mockBotUsername = undefined;
44
42
  });
45
43
 
46
44
  test("builds a deep link with iv_ prefix", () => {
47
- setEnv("TELEGRAM_BOT_USERNAME", "TestBot");
45
+ mockBotUsername = "TestBot";
48
46
 
49
47
  const link = telegramInviteAdapter.buildShareLink!({
50
48
  rawToken: "abc123",
@@ -56,7 +54,7 @@ describe("telegramInviteAdapter.buildShareLink", () => {
56
54
  });
57
55
 
58
56
  test("throws when bot username is not configured", () => {
59
- setEnv("TELEGRAM_BOT_USERNAME", undefined);
57
+ mockBotUsername = undefined;
60
58
 
61
59
  expect(() =>
62
60
  telegramInviteAdapter.buildShareLink!({
@@ -138,25 +136,23 @@ describe("telegramInviteAdapter.extractInboundToken", () => {
138
136
  // ---------------------------------------------------------------------------
139
137
 
140
138
  describe("telegramInviteAdapter.resolveChannelHandle", () => {
141
- let originalBotUsername: string | undefined;
142
-
143
139
  beforeEach(() => {
144
- originalBotUsername = process.env.TELEGRAM_BOT_USERNAME;
140
+ mockBotUsername = undefined;
145
141
  });
146
142
 
147
143
  afterEach(() => {
148
- setEnv("TELEGRAM_BOT_USERNAME", originalBotUsername);
144
+ mockBotUsername = undefined;
149
145
  });
150
146
 
151
- test("returns @-prefixed bot username from env", () => {
152
- setEnv("TELEGRAM_BOT_USERNAME", "MyBot");
147
+ test("returns @-prefixed bot username from config", () => {
148
+ mockBotUsername = "MyBot";
153
149
 
154
150
  const handle = telegramInviteAdapter.resolveChannelHandle!();
155
151
  expect(handle).toBe("@MyBot");
156
152
  });
157
153
 
158
154
  test("returns undefined when bot username is not configured", () => {
159
- setEnv("TELEGRAM_BOT_USERNAME", undefined);
155
+ mockBotUsername = undefined;
160
156
 
161
157
  const handle = telegramInviteAdapter.resolveChannelHandle!();
162
158
  expect(handle).toBeUndefined();
@@ -457,10 +457,10 @@ describe("buildSanitizedEnv", () => {
457
457
  });
458
458
 
459
459
  test("injects INTERNAL_GATEWAY_BASE_URL from gateway config", () => {
460
- process.env.GATEWAY_INTERNAL_BASE_URL = "http://gateway.internal:9000/";
460
+ process.env.GATEWAY_PORT = "9000";
461
461
  const env = buildSanitizedEnv();
462
- expect(env.INTERNAL_GATEWAY_BASE_URL).toBe("http://gateway.internal:9000");
463
- delete process.env.GATEWAY_INTERNAL_BASE_URL;
462
+ expect(env.INTERNAL_GATEWAY_BASE_URL).toBe("http://127.0.0.1:9000");
463
+ delete process.env.GATEWAY_PORT;
464
464
  });
465
465
 
466
466
  test("result is a plain object with no prototype-inherited secrets", () => {
@@ -485,6 +485,7 @@ describe("buildSanitizedEnv", () => {
485
485
  "SSH_AGENT_PID",
486
486
  "GPG_TTY",
487
487
  "GNUPGHOME",
488
+ "VELLUM_DEV",
488
489
  "INTERNAL_GATEWAY_BASE_URL",
489
490
  "VELLUM_DATA_DIR",
490
491
  ];
@@ -2,8 +2,9 @@
2
2
  * Reusable constants and helpers for the computer-use skill migration test suite.
3
3
  */
4
4
 
5
- /** The 10 computer_use_* action tool names provided by the bundled computer-use skill. */
5
+ /** The 11 computer_use_* action tool names provided by the bundled computer-use skill. */
6
6
  export const COMPUTER_USE_TOOL_NAMES = [
7
+ "computer_use_observe",
7
8
  "computer_use_click",
8
9
  "computer_use_type_text",
9
10
  "computer_use_key",
@@ -20,7 +21,7 @@ export const COMPUTER_USE_TOOL_NAMES = [
20
21
  export const COMPUTER_USE_SKILL_ID = "computer-use";
21
22
 
22
23
  /** Number of computer_use_* tools. */
23
- export const COMPUTER_USE_TOOL_COUNT = COMPUTER_USE_TOOL_NAMES.length; // 10
24
+ export const COMPUTER_USE_TOOL_COUNT = COMPUTER_USE_TOOL_NAMES.length; // 11
24
25
 
25
26
  import { expect } from "bun:test";
26
27
 
@@ -21,7 +21,6 @@ mock.module("../util/logger.js", () => ({
21
21
  new Proxy({} as Record<string, unknown>, {
22
22
  get: () => () => {},
23
23
  }),
24
- isDebug: () => false,
25
24
  truncateForLog: (value: string) => value,
26
25
  }));
27
26
 
@@ -44,7 +44,6 @@ mock.module("../util/logger.js", () => ({
44
44
  new Proxy({} as Record<string, unknown>, {
45
45
  get: () => () => {},
46
46
  }),
47
- isDebug: () => false,
48
47
  }));
49
48
 
50
49
  // Allow toggling between no-rule and matched-rule paths
@@ -59,7 +59,6 @@ mock.module("../util/logger.js", () => ({
59
59
  new Proxy({} as Record<string, unknown>, {
60
60
  get: () => () => {},
61
61
  }),
62
- isDebug: () => false,
63
62
  truncateForLog: (value: string) => value,
64
63
  }));
65
64
 
@@ -68,7 +68,6 @@ mock.module("../util/logger.js", () => ({
68
68
  new Proxy({} as Record<string, unknown>, {
69
69
  get: () => () => {},
70
70
  }),
71
- isDebug: () => false,
72
71
  truncateForLog: (value: string) => value,
73
72
  }));
74
73
 
@@ -103,7 +103,6 @@ mock.module("../util/logger.js", () => ({
103
103
  new Proxy({} as Record<string, unknown>, {
104
104
  get: () => () => {},
105
105
  }),
106
- isDebug: () => false,
107
106
  truncateForLog: (value: string) => value,
108
107
  }));
109
108
 
@@ -31,7 +31,6 @@ mock.module("../util/logger.js", () => ({
31
31
  new Proxy({} as Record<string, unknown>, {
32
32
  get: () => () => {},
33
33
  }),
34
- isDebug: () => false,
35
34
  truncateForLog: (value: string) => value,
36
35
  }));
37
36
 
@@ -0,0 +1,29 @@
1
+ import { describe, expect, test } from "bun:test";
2
+
3
+ import { patternMatchesCandidate } from "../permissions/trust-store.js";
4
+
5
+ describe("patternMatchesCandidate", () => {
6
+ test("exact match", () => {
7
+ expect(patternMatchesCandidate("bash:git commit", "bash:git commit")).toBe(
8
+ true,
9
+ );
10
+ });
11
+
12
+ test("glob match", () => {
13
+ expect(patternMatchesCandidate("bash:git *", "bash:git commit")).toBe(true);
14
+ });
15
+
16
+ test("no match", () => {
17
+ expect(patternMatchesCandidate("bash:git *", "file_write:/foo")).toBe(
18
+ false,
19
+ );
20
+ });
21
+
22
+ test("globstar matches anything", () => {
23
+ expect(patternMatchesCandidate("**", "bash:anything")).toBe(true);
24
+ });
25
+
26
+ test("invalid pattern returns false", () => {
27
+ expect(patternMatchesCandidate("[", "bash:anything")).toBe(false);
28
+ });
29
+ });
@@ -777,8 +777,8 @@ describe("Trust Store", () => {
777
777
  "computer_use_click",
778
778
  "computer_use_drag",
779
779
  "computer_use_key",
780
+ "computer_use_observe",
780
781
  "computer_use_open_app",
781
- "computer_use_request_control",
782
782
  "computer_use_run_applescript",
783
783
  "computer_use_scroll",
784
784
  "computer_use_type_text",
@@ -901,19 +901,17 @@ describe("Trust Store", () => {
901
901
  );
902
902
  });
903
903
 
904
- test("findHighestPriorityRule matches default ask for computer_use_request_control", () => {
904
+ test("findHighestPriorityRule matches default ask for computer_use_observe", () => {
905
905
  const match = findHighestPriorityRule(
906
- "computer_use_request_control",
907
- ["computer_use_request_control:"],
906
+ "computer_use_observe",
907
+ ["computer_use_observe:"],
908
908
  "/tmp",
909
909
  );
910
910
  expect(match).not.toBeNull();
911
- expect(match!.id).toBe("default:ask-computer_use_request_control-global");
911
+ expect(match!.id).toBe("default:ask-computer_use_observe-global");
912
912
  expect(match!.decision).toBe("ask");
913
913
  expect(match!.priority).toBe(
914
- DEFAULT_PRIORITY_BY_ID.get(
915
- "default:ask-computer_use_request_control-global",
916
- )!,
914
+ DEFAULT_PRIORITY_BY_ID.get("default:ask-computer_use_observe-global")!,
917
915
  );
918
916
  });
919
917
 
@@ -1755,11 +1753,7 @@ describe("computer-use tool trust rule matching", () => {
1755
1753
  test("actionable CU tools have default ask trust rules", () => {
1756
1754
  // Actionable CU tools (those that perform screen interactions) should
1757
1755
  // have default "ask" rules so strict mode prompts before use.
1758
- const actionableCuTools = [
1759
- "computer_use_click",
1760
- "computer_use_type_text",
1761
- "computer_use_request_control",
1762
- ];
1756
+ const actionableCuTools = ["computer_use_click", "computer_use_type_text"];
1763
1757
 
1764
1758
  for (const name of actionableCuTools) {
1765
1759
  const rule = findHighestPriorityRule(name, [name], "/tmp/test");
@@ -42,7 +42,6 @@ mock.module("../util/logger.js", () => ({
42
42
  new Proxy({} as Record<string, unknown>, {
43
43
  get: () => () => {},
44
44
  }),
45
- isDebug: () => false,
46
45
  truncateForLog: (value: string) => value,
47
46
  }));
48
47
 
@@ -45,7 +45,6 @@ mock.module("../util/logger.js", () => ({
45
45
  new Proxy({} as Record<string, unknown>, {
46
46
  get: () => () => {},
47
47
  }),
48
- isDebug: () => false,
49
48
  truncateForLog: (value: string) => value,
50
49
  }));
51
50
 
@@ -77,7 +77,6 @@ function resolveIngressBaseUrlFromConfig(ingressConfig: unknown): string {
77
77
 
78
78
  mock.module("../config/env.js", () => ({
79
79
  isHttpAuthDisabled: () => true,
80
- getCallWelcomeGreeting: () => process.env.CALL_WELCOME_GREETING || undefined,
81
80
  getGatewayInternalBaseUrl: () => "http://gateway.internal:7830",
82
81
  getIngressPublicBaseUrl: () => mockIngressPublicBaseUrl,
83
82
  setIngressPublicBaseUrl: (value: string | undefined) => {
@@ -109,13 +108,11 @@ mock.module("../util/logger.js", () => ({
109
108
  debug: () => {},
110
109
  trace: () => {},
111
110
  fatal: () => {},
112
- isDebug: () => false,
113
111
  child: () => ({
114
112
  info: () => {},
115
113
  warn: () => {},
116
114
  error: () => {},
117
115
  debug: () => {},
118
- isDebug: () => false,
119
116
  }),
120
117
  }),
121
118
  }));
@@ -438,7 +435,6 @@ describe("twilio webhook routes", () => {
438
435
  updatePhoneNumberWebhookCalls = [];
439
436
  mockTwilioApiValidationStatus = 200;
440
437
  mockTwilioApiValidationBody = JSON.stringify({ sid: "AC_validated" });
441
- delete process.env.CALL_WELCOME_GREETING;
442
438
 
443
439
  globalThis.fetch = (async (
444
440
  url: string | URL | Request,
@@ -819,18 +815,6 @@ describe("twilio webhook routes", () => {
819
815
  const twiml = await res.text();
820
816
  expect(twiml).not.toContain("welcomeGreeting=");
821
817
  });
822
-
823
- test("TwiML includes explicit welcome greeting override when configured", async () => {
824
- process.env.CALL_WELCOME_GREETING = "Custom transport greeting";
825
- const session = createTestSession("conv-twiml-4", "CA_twiml_4");
826
- const req = makeVoiceRequest(session.id, { CallSid: "CA_twiml_4" });
827
-
828
- const res = await handleVoiceWebhook(req);
829
-
830
- expect(res.status).toBe(200);
831
- const twiml = await res.text();
832
- expect(twiml).toContain('welcomeGreeting="Custom transport greeting"');
833
- });
834
818
  });
835
819
 
836
820
  // ── Handler-level idempotency concurrency tests ─────────────────
@@ -64,7 +64,6 @@ mock.module("../util/logger.js", () => ({
64
64
  new Proxy({} as Record<string, unknown>, {
65
65
  get: () => () => {},
66
66
  }),
67
- isDebug: () => false,
68
67
  truncateForLog: (value: string) => value,
69
68
  }));
70
69
 
@@ -23,7 +23,10 @@ mock.module("../util/logger.js", () => ({
23
23
  }),
24
24
  }));
25
25
 
26
- import { findContactChannel } from "../contacts/contact-store.js";
26
+ import {
27
+ findContactChannel,
28
+ upsertContact,
29
+ } from "../contacts/contact-store.js";
27
30
  import { upsertContactChannel } from "../contacts/contacts-write.js";
28
31
  import { getSqlite, initializeDb, resetDb } from "../memory/db.js";
29
32
  import { createInvite, revokeInvite } from "../memory/invite-store.js";
@@ -354,4 +357,32 @@ describe("redeemVoiceInviteCode", () => {
354
357
 
355
358
  expect(result).toEqual({ ok: false, reason: "invalid_or_expired" });
356
359
  });
360
+
361
+ test("returns invalid_or_expired for a revoked guardian to prevent invite-based reactivation", () => {
362
+ const phone = "+15559998888";
363
+ const { code } = createVoiceInvite({ callerPhone: phone });
364
+
365
+ // Pre-create a guardian contact with a revoked phone channel
366
+ upsertContact({
367
+ displayName: "Guardian",
368
+ role: "guardian",
369
+ channels: [
370
+ {
371
+ type: "phone",
372
+ address: phone,
373
+ externalUserId: phone,
374
+ status: "revoked",
375
+ },
376
+ ],
377
+ });
378
+
379
+ const result = redeemVoiceInviteCode({
380
+ callerExternalUserId: phone,
381
+ sourceChannel: "phone",
382
+ code,
383
+ });
384
+
385
+ // Must reject — guardian channels are managed via the binding flow, not invites
386
+ expect(result).toEqual({ ok: false, reason: "invalid_or_expired" });
387
+ });
357
388
  });
@@ -44,7 +44,6 @@ mock.module("../util/logger.js", () => ({
44
44
  new Proxy({} as Record<string, unknown>, {
45
45
  get: () => () => {},
46
46
  }),
47
- isDebug: () => false,
48
47
  truncateForLog: (value: string) => value,
49
48
  }));
50
49