@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,49 +1,9 @@
1
- // Computer use, task routing, ride shotgun, and watch observation types.
1
+ // Computer use and watch observation types.
2
2
 
3
3
  import type { CommandIntent, UserMessageAttachment } from "./shared.js";
4
4
 
5
5
  // === Client → Server ===
6
6
 
7
- export interface CuSessionCreate {
8
- type: "cu_session_create";
9
- sessionId: string;
10
- task: string;
11
- screenWidth: number;
12
- screenHeight: number;
13
- attachments?: UserMessageAttachment[];
14
- interactionType?: "computer_use" | "text_qa";
15
- }
16
-
17
- export interface CuSessionAbort {
18
- type: "cu_session_abort";
19
- sessionId: string;
20
- }
21
-
22
- export interface CuObservation {
23
- type: "cu_observation";
24
- sessionId: string;
25
- axTree?: string;
26
- axDiff?: string;
27
- secondaryWindows?: string;
28
- screenshot?: string;
29
- /** Screenshot image width in pixels (`Px`). */
30
- screenshotWidthPx?: number;
31
- /** Screenshot image height in pixels (`Px`). */
32
- screenshotHeightPx?: number;
33
- /** Screen width in macOS points (`Pt`) used by native execution. */
34
- screenWidthPt?: number;
35
- /** Screen height in macOS points (`Pt`) used by native execution. */
36
- screenHeightPt?: number;
37
- /** Coordinate origin convention used by the observation payload. */
38
- coordinateOrigin?: "top_left";
39
- /** Display ID used by screenshot capture for this observation. */
40
- captureDisplayId?: number;
41
- executionResult?: string;
42
- executionError?: string;
43
- /** Free-form guidance from the user, injected mid-turn to steer the agent. */
44
- userGuidance?: string;
45
- }
46
-
47
7
  export interface TaskSubmit {
48
8
  type: "task_submit";
49
9
  task: string;
@@ -55,22 +15,6 @@ export interface TaskSubmit {
55
15
  commandIntent?: CommandIntent;
56
16
  }
57
17
 
58
- export interface RideShotgunStart {
59
- type: "ride_shotgun_start";
60
- durationSeconds: number;
61
- intervalSeconds: number;
62
- mode?: "observe" | "learn";
63
- targetDomain?: string;
64
- /** Domain to auto-navigate (may differ from targetDomain, e.g. open.spotify.com vs spotify.com). */
65
- navigateDomain?: string;
66
- autoNavigate?: boolean;
67
- }
68
-
69
- export interface RideShotgunStop {
70
- type: "ride_shotgun_stop";
71
- watchId: string;
72
- }
73
-
74
18
  export interface WatchObservation {
75
19
  type: "watch_observation";
76
20
  watchId: string;
@@ -145,58 +89,6 @@ export interface RecordingResume {
145
89
  recordingId: string;
146
90
  }
147
91
 
148
- export interface CuAction {
149
- type: "cu_action";
150
- sessionId: string;
151
- toolName: string;
152
- input: Record<string, unknown>;
153
- reasoning?: string;
154
- stepNumber: number;
155
- }
156
-
157
- export interface CuComplete {
158
- type: "cu_complete";
159
- sessionId: string;
160
- summary: string;
161
- stepCount: number;
162
- isResponse?: boolean;
163
- }
164
-
165
- export interface CuError {
166
- type: "cu_error";
167
- sessionId: string;
168
- message: string;
169
- }
170
-
171
- export interface TaskRouted {
172
- type: "task_routed";
173
- sessionId: string;
174
- interactionType: "computer_use" | "text_qa";
175
- /** The task text passed to the escalated session. */
176
- task?: string;
177
- /** Set when a text_qa session escalates to computer_use via computer_use_request_control. */
178
- escalatedFrom?: string;
179
- }
180
-
181
- export interface RideShotgunProgress {
182
- type: "ride_shotgun_progress";
183
- watchId: string;
184
- message: string;
185
- networkEntryCount?: number;
186
- statusMessage?: string;
187
- idleHint?: boolean;
188
- }
189
-
190
- export interface RideShotgunResult {
191
- type: "ride_shotgun_result";
192
- sessionId: string;
193
- watchId: string;
194
- summary: string;
195
- observationCount: number;
196
- recordingId?: string;
197
- recordingPath?: string;
198
- }
199
-
200
92
  export interface WatchStarted {
201
93
  type: "watch_started";
202
94
  sessionId: string;
@@ -211,34 +103,14 @@ export interface WatchCompleteRequest {
211
103
  watchId: string;
212
104
  }
213
105
 
214
- /** Server → Client: bootstrap failure during learn-mode recording setup. */
215
- export interface RideShotgunError {
216
- type: "ride_shotgun_error";
217
- watchId: string;
218
- sessionId: string;
219
- message: string;
220
- }
221
-
222
106
  // --- Domain-level union aliases (consumed by the barrel file) ---
223
107
 
224
108
  export type _ComputerUseClientMessages =
225
- | CuSessionCreate
226
- | CuSessionAbort
227
- | CuObservation
228
109
  | TaskSubmit
229
- | RideShotgunStart
230
- | RideShotgunStop
231
110
  | WatchObservation
232
111
  | RecordingStatus;
233
112
 
234
113
  export type _ComputerUseServerMessages =
235
- | CuAction
236
- | CuComplete
237
- | CuError
238
- | TaskRouted
239
- | RideShotgunProgress
240
- | RideShotgunResult
241
- | RideShotgunError
242
114
  | WatchStarted
243
115
  | WatchCompleteRequest
244
116
  | RecordingStart
@@ -0,0 +1,19 @@
1
+ // Host computer-use proxy types.
2
+ // Enables proxying computer-use actions (click, type, screenshot, etc.)
3
+ // to the desktop client when running as a managed assistant.
4
+
5
+ // === Server → Client ===
6
+
7
+ export interface HostCuRequest {
8
+ type: "host_cu_request";
9
+ requestId: string;
10
+ sessionId: string;
11
+ toolName: string; // "computer_use_click", "computer_use_type_text", etc.
12
+ input: Record<string, unknown>;
13
+ stepNumber: number;
14
+ reasoning?: string;
15
+ }
16
+
17
+ // --- Domain-level union aliases (consumed by the barrel file) ---
18
+
19
+ export type _HostCuServerMessages = HostCuRequest;
@@ -11,7 +11,6 @@ export interface MemoryRecalledCandidateDebug {
11
11
  type: string;
12
12
  kind: string;
13
13
  finalScore: number;
14
- lexical: number;
15
14
  semantic: number;
16
15
  recency: number;
17
16
  }
@@ -21,18 +20,14 @@ export interface MemoryRecalled {
21
20
  provider: string;
22
21
  model: string;
23
22
  degradation?: MemoryRecalledDegradation;
24
- lexicalHits: number;
25
23
  semanticHits: number;
26
24
  recencyHits: number;
27
- entityHits: number;
28
- relationSeedEntityCount?: number;
29
- relationTraversedEdgeCount?: number;
30
- relationNeighborEntityCount?: number;
31
- relationExpandedItemCount?: number;
32
- earlyTerminated?: boolean;
25
+ tier1Count: number;
26
+ tier2Count: number;
27
+ hybridSearchLatencyMs: number;
28
+ sparseVectorUsed: boolean;
33
29
  mergedCount: number;
34
30
  selectedCount: number;
35
- rerankApplied: boolean;
36
31
  injectedTokens: number;
37
32
  latencyMs: number;
38
33
  topCandidates: MemoryRecalledCandidateDebug[];
@@ -46,13 +41,6 @@ export interface MemoryStatus {
46
41
  reason?: string;
47
42
  provider?: string;
48
43
  model?: string;
49
- conflictsPending: number;
50
- conflictsResolved: number;
51
- oldestPendingConflictAgeMs: number | null;
52
- cleanupResolvedJobsPending: number;
53
- cleanupSupersededJobsPending: number;
54
- cleanupResolvedJobsCompleted24h: number;
55
- cleanupSupersededJobsCompleted24h: number;
56
44
  }
57
45
 
58
46
  // --- Domain-level union aliases (consumed by the barrel file) ---
@@ -88,6 +88,7 @@ export interface ToolOutputChunk {
88
88
  type: "tool_output_chunk";
89
89
  chunk: string;
90
90
  sessionId?: string;
91
+ toolUseId?: string;
91
92
  subType?: "tool_start" | "tool_complete" | "status";
92
93
  subToolName?: string;
93
94
  subToolInput?: string;
@@ -155,6 +156,8 @@ export interface ConfirmationRequest {
155
156
  persistentDecisionsAllowed?: boolean;
156
157
  /** Which temporary approval options the client should render (e.g. "Allow for 10 minutes", "Allow for this thread"). */
157
158
  temporaryOptionsAvailable?: Array<"allow_10m" | "allow_thread">;
159
+ /** The tool_use block ID for client-side correlation with specific tool calls. */
160
+ toolUseId?: string;
158
161
  }
159
162
 
160
163
  export interface SecretRequest {
@@ -287,6 +290,7 @@ export interface AssistantActivityState {
287
290
  | "tool_result_received"
288
291
  | "confirmation_requested"
289
292
  | "confirmation_resolved"
293
+ | "context_compacting"
290
294
  | "message_complete"
291
295
  | "generation_cancelled"
292
296
  | "error_terminal";
@@ -394,6 +394,8 @@ export type SessionErrorCode =
394
394
  | "PROVIDER_RATE_LIMIT"
395
395
  | "PROVIDER_API"
396
396
  | "PROVIDER_BILLING"
397
+ | "PROVIDER_ORDERING"
398
+ | "PROVIDER_WEB_SEARCH"
397
399
  | "CONTEXT_TOO_LARGE"
398
400
  | "SESSION_ABORTED"
399
401
  | "SESSION_PROCESSING_FAILED"
@@ -407,6 +409,8 @@ export interface SessionErrorMessage {
407
409
  userMessage: string;
408
410
  retryable: boolean;
409
411
  debugDetails?: string;
412
+ /** Machine-readable error category for log report metadata and triage. */
413
+ errorCategory?: string;
410
414
  }
411
415
 
412
416
  /** Server push — broadcast when a schedule creates a conversation, so the client can show it as a chat thread. */
@@ -48,7 +48,6 @@ import {
48
48
  getWorkspacePromptPath,
49
49
  } from "../util/platform.js";
50
50
  import { registerDaemonCallbacks } from "../work-items/work-item-runner.js";
51
- import { ComputerUseSession } from "./computer-use-session.js";
52
51
  import { ConfigWatcher } from "./config-watcher.js";
53
52
  import { parseIdentityFields } from "./handlers/identity.js";
54
53
  import type {
@@ -57,7 +56,9 @@ import type {
57
56
  } from "./handlers/shared.js";
58
57
  import type { SkillOperationContext } from "./handlers/skills.js";
59
58
  import { HostBashProxy } from "./host-bash-proxy.js";
59
+ import { HostCuProxy } from "./host-cu-proxy.js";
60
60
  import { HostFileProxy } from "./host-file-proxy.js";
61
+ import { reloadMcpServers } from "./mcp-reload-service.js";
61
62
  import type { ServerMessage } from "./message-protocol.js";
62
63
  import {
63
64
  DEFAULT_MEMORY_POLICY,
@@ -214,14 +215,18 @@ function makePendingInteractionRegistrar(
214
215
  conversationId,
215
216
  kind: "host_file",
216
217
  });
218
+ } else if (msg.type === "host_cu_request") {
219
+ pendingInteractions.register(msg.requestId, {
220
+ session,
221
+ conversationId,
222
+ kind: "host_cu",
223
+ });
217
224
  }
218
225
  };
219
226
  }
220
227
 
221
228
  export class DaemonServer {
222
229
  private sessions = new Map<string, Session>();
223
- private cuSessions = new Map<string, ComputerUseSession>();
224
- private cuObservationParseSequence = new Map<string, number>();
225
230
  private sessionOptions = new Map<string, SessionCreateOptions>();
226
231
  private sessionCreating = new Map<string, Promise<Session>>();
227
232
  private sharedRequestTimestamps: number[] = [];
@@ -388,6 +393,11 @@ export class DaemonServer {
388
393
  this.configWatcher.start(
389
394
  () => this.evictSessionsForReload(),
390
395
  () => this.broadcastIdentityChanged(),
396
+ () => {
397
+ reloadMcpServers().catch((err: unknown) => {
398
+ log.error({ err }, "MCP reload triggered by config change failed");
399
+ });
400
+ },
391
401
  );
392
402
 
393
403
  // Broadcast contacts_changed to all clients when any contact mutation occurs.
@@ -412,11 +422,6 @@ export class DaemonServer {
412
422
  }
413
423
  this.sessions.clear();
414
424
 
415
- for (const cuSession of this.cuSessions.values()) {
416
- cuSession.abort();
417
- }
418
- this.cuSessions.clear();
419
-
420
425
  log.info("Daemon server stopped");
421
426
  }
422
427
 
@@ -563,8 +568,6 @@ export class DaemonServer {
563
568
  private handlerContext(): HandlerContext {
564
569
  return {
565
570
  sessions: this.sessions,
566
- cuSessions: this.cuSessions,
567
- cuObservationParseSequence: this.cuObservationParseSequence,
568
571
  sharedRequestTimestamps: this.sharedRequestTimestamps,
569
572
  debounceTimers: this.configWatcher.timers,
570
573
  suppressConfigReload: this.configWatcher.suppressConfigReload,
@@ -665,9 +668,18 @@ export class DaemonServer {
665
668
  }),
666
669
  );
667
670
  }
671
+ if (!session.isProcessing() || !session.hostCuProxy) {
672
+ session.setHostCuProxy(
673
+ new HostCuProxy(session.getCurrentSender(), (requestId) => {
674
+ pendingInteractions.resolve(requestId);
675
+ }),
676
+ );
677
+ }
678
+ session.addPreactivatedSkillId("computer-use");
668
679
  } else if (!session.isProcessing()) {
669
680
  session.setHostBashProxy(undefined);
670
681
  session.setHostFileProxy(undefined);
682
+ session.setHostCuProxy(undefined);
671
683
  }
672
684
  session.setCommandIntent(options?.commandIntent ?? null);
673
685
  session.setTurnChannelContext({
@@ -907,23 +919,15 @@ export class DaemonServer {
907
919
 
908
920
  /**
909
921
  * Look up an active session by ID without creating one.
910
- * Checks both normal sessions and computer-use sessions so the HTTP
911
- * surface-action path is consistent with dispatch.
912
922
  */
913
- findSession(sessionId: string): Session | ComputerUseSession | undefined {
914
- return this.cuSessions.get(sessionId) ?? this.sessions.get(sessionId);
923
+ findSession(sessionId: string): Session | undefined {
924
+ return this.sessions.get(sessionId);
915
925
  }
916
926
 
917
927
  /**
918
928
  * Look up an active session that owns a given surfaceId.
919
- * Falls back across both normal and computer-use sessions.
920
929
  */
921
- findSessionBySurfaceId(
922
- surfaceId: string,
923
- ): Session | ComputerUseSession | undefined {
924
- for (const s of this.cuSessions.values()) {
925
- if (s.surfaceState.has(surfaceId)) return s;
926
- }
930
+ findSessionBySurfaceId(surfaceId: string): Session | undefined {
927
931
  for (const s of this.sessions.values()) {
928
932
  if (s.surfaceState.has(surfaceId)) return s;
929
933
  }
@@ -57,6 +57,8 @@ export interface EventHandlerState {
57
57
  orderingErrorDetected: boolean;
58
58
  deferredOrderingError: string | null;
59
59
  contextTooLargeDetected: boolean;
60
+ /** The raw error message from the provider when context_too_large is detected. */
61
+ contextTooLargeErrorMessage: string | null;
60
62
  providerErrorUserMessage: string | null;
61
63
  lastAssistantMessageId: string | undefined;
62
64
  readonly pendingToolResults: Map<string, PendingToolResult>;
@@ -121,6 +123,7 @@ export function createEventHandlerState(): EventHandlerState {
121
123
  orderingErrorDetected: false,
122
124
  deferredOrderingError: null,
123
125
  contextTooLargeDetected: false,
126
+ contextTooLargeErrorMessage: null,
124
127
  providerErrorUserMessage: null,
125
128
  lastAssistantMessageId: undefined,
126
129
  pendingToolResults: new Map(),
@@ -384,6 +387,7 @@ export function handleToolOutputChunk(
384
387
  type: "tool_output_chunk",
385
388
  chunk: event.chunk,
386
389
  sessionId: deps.ctx.conversationId,
390
+ toolUseId: event.toolUseId,
387
391
  subType: structured.subType,
388
392
  subToolName: structured.subToolName,
389
393
  subToolInput: structured.subToolInput,
@@ -395,6 +399,7 @@ export function handleToolOutputChunk(
395
399
  type: "tool_output_chunk",
396
400
  chunk: event.chunk,
397
401
  sessionId: deps.ctx.conversationId,
402
+ toolUseId: event.toolUseId,
398
403
  });
399
404
  }
400
405
  }
@@ -593,12 +598,22 @@ export function handleError(
593
598
  state.deferredOrderingError = event.error.message;
594
599
  } else if (isContextTooLarge(event.error.message)) {
595
600
  state.contextTooLargeDetected = true;
601
+ state.contextTooLargeErrorMessage = event.error.message;
596
602
  } else {
597
603
  const classified = classifySessionError(event.error, {
598
604
  phase: "agent_loop",
599
605
  });
600
606
  if (classified.code === "CONTEXT_TOO_LARGE") {
601
607
  state.contextTooLargeDetected = true;
608
+ state.contextTooLargeErrorMessage = event.error.message;
609
+ } else if (
610
+ classified.code === "PROVIDER_ORDERING" ||
611
+ classified.code === "PROVIDER_WEB_SEARCH"
612
+ ) {
613
+ // Ordering errors detected via classifySessionError (e.g. from ProviderError
614
+ // with statusCode 400 and ordering message) — trigger the retry path.
615
+ state.orderingErrorDetected = true;
616
+ state.deferredOrderingError = event.error.message;
602
617
  } else {
603
618
  deps.onEvent(
604
619
  buildSessionErrorMessage(deps.ctx.conversationId, classified),
@@ -829,6 +844,31 @@ export async function dispatchAgentEvent(
829
844
  deps.reqId,
830
845
  statusText,
831
846
  );
847
+ // Emit tool_use_start so the client renders a tool chip (like other tools)
848
+ deps.onEvent({
849
+ type: "tool_use_start",
850
+ toolName: event.name,
851
+ input: event.input,
852
+ sessionId: deps.ctx.conversationId,
853
+ toolUseId: event.toolUseId,
854
+ });
855
+ break;
856
+ }
857
+ case "server_tool_complete": {
858
+ deps.ctx.emitActivityState(
859
+ "streaming",
860
+ "tool_result_received",
861
+ "assistant_turn",
862
+ deps.reqId,
863
+ );
864
+ deps.onEvent({
865
+ type: "tool_result",
866
+ toolName: "",
867
+ result: "",
868
+ isError: false,
869
+ sessionId: deps.ctx.conversationId,
870
+ toolUseId: event.toolUseId,
871
+ });
832
872
  break;
833
873
  }
834
874
  case "error":