@vellumai/assistant 0.7.0 → 0.7.1

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 (666) hide show
  1. package/ARCHITECTURE.md +6 -7
  2. package/Dockerfile +1 -0
  3. package/README.md +2 -2
  4. package/__tests__/permissions/gateway-threshold-reader.test.ts +79 -139
  5. package/bun.lock +3 -0
  6. package/docs/architecture/security.md +18 -16
  7. package/knip.json +1 -0
  8. package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
  9. package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -5
  10. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
  11. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
  12. package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
  13. package/node_modules/@vellumai/slack-text/bun.lock +24 -0
  14. package/node_modules/@vellumai/slack-text/package.json +18 -0
  15. package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
  16. package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
  17. package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
  18. package/openapi.yaml +294 -107
  19. package/package.json +4 -2
  20. package/scripts/generate-openapi.ts +16 -111
  21. package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
  22. package/src/__tests__/anthropic-provider.test.ts +56 -13
  23. package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
  24. package/src/__tests__/app-conversation-ids.test.ts +151 -0
  25. package/src/__tests__/approval-cascade.test.ts +0 -15
  26. package/src/__tests__/approval-routes-http.test.ts +6 -17
  27. package/src/__tests__/assistant-event-hub.test.ts +126 -77
  28. package/src/__tests__/assistant-event.test.ts +0 -5
  29. package/src/__tests__/assistant-events-sse-hardening.test.ts +37 -15
  30. package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -29
  31. package/src/__tests__/background-shell-host-bash.test.ts +34 -43
  32. package/src/__tests__/call-controller.test.ts +1 -1
  33. package/src/__tests__/call-site-routing-provider.test.ts +193 -0
  34. package/src/__tests__/channel-approval-routes.test.ts +10 -296
  35. package/src/__tests__/channel-approvals.test.ts +25 -17
  36. package/src/__tests__/channel-guardian.test.ts +100 -146
  37. package/src/__tests__/checker.test.ts +20 -34
  38. package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
  39. package/src/__tests__/compaction-events.test.ts +2 -0
  40. package/src/__tests__/config-schema.test.ts +6 -48
  41. package/src/__tests__/config-watcher.test.ts +12 -0
  42. package/src/__tests__/connection-policy.test.ts +1 -52
  43. package/src/__tests__/contacts-write.test.ts +2 -64
  44. package/src/__tests__/context-image-dimensions.test.ts +1 -1
  45. package/src/__tests__/context-search-memory-source.test.ts +120 -1
  46. package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
  47. package/src/__tests__/context-search-pkb-source.test.ts +49 -0
  48. package/src/__tests__/context-search-workspace-source.test.ts +9 -22
  49. package/src/__tests__/context-window-manager.test.ts +46 -0
  50. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
  51. package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
  52. package/src/__tests__/conversation-agent-loop.test.ts +980 -13
  53. package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
  54. package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
  55. package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
  56. package/src/__tests__/conversation-history-web-search.test.ts +4 -3
  57. package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
  58. package/src/__tests__/conversation-lifecycle.test.ts +4 -4
  59. package/src/__tests__/conversation-process-callsite.test.ts +79 -2
  60. package/src/__tests__/conversation-queue.test.ts +3 -8
  61. package/src/__tests__/conversation-routes-disk-view.test.ts +1 -161
  62. package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -32
  63. package/src/__tests__/conversation-routes-slash-commands.test.ts +75 -66
  64. package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
  65. package/src/__tests__/conversation-slash-commands.test.ts +24 -4
  66. package/src/__tests__/conversation-slash-queue.test.ts +2 -0
  67. package/src/__tests__/conversation-speed-override.test.ts +0 -3
  68. package/src/__tests__/conversation-starter-routes.test.ts +79 -2
  69. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
  70. package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
  71. package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
  72. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
  73. package/src/__tests__/conversation-usage.test.ts +253 -3
  74. package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
  75. package/src/__tests__/credential-health-service.test.ts +68 -0
  76. package/src/__tests__/credential-security-e2e.test.ts +4 -3
  77. package/src/__tests__/credential-security-invariants.test.ts +1 -5
  78. package/src/__tests__/credential-token-resolver.test.ts +180 -0
  79. package/src/__tests__/cu-unified-flow.test.ts +33 -16
  80. package/src/__tests__/daemon-assistant-events.test.ts +34 -21
  81. package/src/__tests__/daemon-credential-client.test.ts +4 -1
  82. package/src/__tests__/db-connection-isolation.test.ts +125 -0
  83. package/src/__tests__/db-migration-rollback.test.ts +101 -0
  84. package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
  85. package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
  86. package/src/__tests__/document-conversations.test.ts +332 -0
  87. package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
  88. package/src/__tests__/emit-event-signal.test.ts +4 -6
  89. package/src/__tests__/events-client-registration.test.ts +193 -49
  90. package/src/__tests__/filing-service.test.ts +58 -7
  91. package/src/__tests__/first-greeting.test.ts +156 -150
  92. package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
  93. package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
  94. package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
  95. package/src/__tests__/guardian-dispatch.test.ts +1 -1
  96. package/src/__tests__/guardian-grant-minting.test.ts +7 -2
  97. package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
  98. package/src/__tests__/guardian-routing-state.test.ts +1 -1
  99. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +32 -11
  100. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -83
  101. package/src/__tests__/headless-browser-mode.test.ts +4 -9
  102. package/src/__tests__/headless-browser-navigate.test.ts +21 -20
  103. package/src/__tests__/heartbeat-service.test.ts +289 -7
  104. package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
  105. package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
  106. package/src/__tests__/host-bash-proxy.test.ts +46 -122
  107. package/src/__tests__/host-browser-e2e-cloud.test.ts +36 -497
  108. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +26 -96
  109. package/src/__tests__/host-browser-proxy.test.ts +111 -185
  110. package/src/__tests__/host-browser-routes.test.ts +45 -75
  111. package/src/__tests__/host-browser-ws-events-e2e.test.ts +26 -30
  112. package/src/__tests__/host-cu-proxy.test.ts +56 -111
  113. package/src/__tests__/host-file-proxy.test.ts +44 -98
  114. package/src/__tests__/host-file-read-tool.test.ts +42 -21
  115. package/src/__tests__/host-shell-tool.test.ts +33 -68
  116. package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
  117. package/src/__tests__/host-transfer-proxy.test.ts +43 -53
  118. package/src/__tests__/http-user-message-parity.test.ts +0 -6
  119. package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
  120. package/src/__tests__/injector-chain.test.ts +10 -5
  121. package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
  122. package/src/__tests__/inline-command-runner.test.ts +0 -66
  123. package/src/__tests__/inline-skill-load-permissions.test.ts +0 -2
  124. package/src/__tests__/install-skill-routing.test.ts +1 -13
  125. package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
  126. package/src/__tests__/llm-catalog-parity.test.ts +90 -0
  127. package/src/__tests__/llm-context-resolution.test.ts +180 -0
  128. package/src/__tests__/llm-resolver.test.ts +80 -12
  129. package/src/__tests__/llm-usage-store.test.ts +269 -4
  130. package/src/__tests__/log-export-routes.test.ts +89 -0
  131. package/src/__tests__/managed-profile-guard.test.ts +225 -0
  132. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -10
  133. package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
  134. package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
  135. package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
  136. package/src/__tests__/migration-export-http.test.ts +33 -26
  137. package/src/__tests__/migration-export-streaming.test.ts +18 -10
  138. package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
  139. package/src/__tests__/migration-import-commit-http.test.ts +66 -21
  140. package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
  141. package/src/__tests__/migration-import-from-url.test.ts +20 -6
  142. package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
  143. package/src/__tests__/migration-parity-persistence.test.ts +62 -25
  144. package/src/__tests__/migration-transport.test.ts +115 -23
  145. package/src/__tests__/migration-validate-http.test.ts +105 -80
  146. package/src/__tests__/migration-wizard.test.ts +133 -27
  147. package/src/__tests__/non-member-access-request.test.ts +1 -1
  148. package/src/__tests__/notification-guardian-path.test.ts +1 -1
  149. package/src/__tests__/oauth-store.test.ts +19 -0
  150. package/src/__tests__/platform-bash-auto-approve.test.ts +21 -12
  151. package/src/__tests__/prechat-onboarding-contract.test.ts +31 -7
  152. package/src/__tests__/pricing.test.ts +68 -4
  153. package/src/__tests__/process-message-background-slack.test.ts +331 -0
  154. package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
  155. package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
  156. package/src/__tests__/provider-usage-tracking.test.ts +208 -0
  157. package/src/__tests__/reaction-persistence.test.ts +9 -6
  158. package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
  159. package/src/__tests__/recording-handler.test.ts +64 -81
  160. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
  161. package/src/__tests__/relay-server.test.ts +18 -13
  162. package/src/__tests__/require-fresh-approval.test.ts +13 -22
  163. package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
  164. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  165. package/src/__tests__/runtime-events-sse.test.ts +3 -12
  166. package/src/__tests__/search-skills-unified.test.ts +9 -15
  167. package/src/__tests__/secret-ingress-cli.test.ts +2 -5
  168. package/src/__tests__/secret-ingress-http.test.ts +0 -4
  169. package/src/__tests__/secret-onetime-send.test.ts +4 -2
  170. package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
  171. package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
  172. package/src/__tests__/secret-response-routing.test.ts +29 -15
  173. package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
  174. package/src/__tests__/secret-scanner.test.ts +2 -545
  175. package/src/__tests__/send-endpoint-busy.test.ts +9 -24
  176. package/src/__tests__/settings-routes.test.ts +1 -1
  177. package/src/__tests__/shell-credential-ref.test.ts +0 -8
  178. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -56
  179. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -11
  180. package/src/__tests__/skill-tool-factory.test.ts +97 -0
  181. package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
  182. package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
  183. package/src/__tests__/slack-inbound-verification.test.ts +1 -62
  184. package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
  185. package/src/__tests__/subagent-manager-notify.test.ts +70 -70
  186. package/src/__tests__/subagent-notify-parent.test.ts +80 -83
  187. package/src/__tests__/system-prompt.test.ts +115 -13
  188. package/src/__tests__/terminal-tools.test.ts +0 -89
  189. package/src/__tests__/thread-backfill.test.ts +945 -31
  190. package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
  191. package/src/__tests__/tool-execute-pipeline.test.ts +0 -6
  192. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -16
  193. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
  194. package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -7
  195. package/src/__tests__/tool-executor.test.ts +12 -19
  196. package/src/__tests__/tool-metrics-listener.test.ts +0 -35
  197. package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
  198. package/src/__tests__/tool-trace-listener.test.ts +0 -17
  199. package/src/__tests__/transfer-progress-screen.test.ts +63 -26
  200. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
  201. package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
  202. package/src/__tests__/trusted-contact-verification.test.ts +1 -1
  203. package/src/__tests__/tts-catalog-parity.test.ts +16 -5
  204. package/src/__tests__/usage-attribution.test.ts +247 -0
  205. package/src/__tests__/usage-cli.test.ts +143 -0
  206. package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
  207. package/src/__tests__/usage-routes.test.ts +150 -0
  208. package/src/__tests__/validation-results-screen.test.ts +39 -16
  209. package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
  210. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +49 -137
  211. package/src/__tests__/verification-control-plane-policy.test.ts +4 -7
  212. package/src/__tests__/voice-session-bridge.test.ts +5 -5
  213. package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
  214. package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
  215. package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
  216. package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
  217. package/src/acp/index.ts +0 -15
  218. package/src/acp/session-manager.ts +37 -34
  219. package/src/agent/loop.ts +16 -1
  220. package/src/approvals/AGENTS.md +4 -0
  221. package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
  222. package/src/approvals/guardian-request-resolvers.ts +10 -2
  223. package/src/backup/__tests__/backup-worker.test.ts +36 -8
  224. package/src/backup/__tests__/paths.test.ts +2 -2
  225. package/src/backup/__tests__/restore.test.ts +45 -28
  226. package/src/backup/backup-worker.ts +36 -2
  227. package/src/backup/paths.ts +9 -6
  228. package/src/browser-session/events.ts +0 -9
  229. package/src/calls/call-store.ts +1 -34
  230. package/src/calls/guardian-question-copy.ts +0 -108
  231. package/src/calls/relay-server.ts +0 -24
  232. package/src/calls/twilio-rest.ts +0 -38
  233. package/src/calls/twilio-routes.ts +1 -1
  234. package/src/calls/voice-session-bridge.ts +7 -38
  235. package/src/channels/types.ts +1 -36
  236. package/src/cli/commands/__tests__/cache.test.ts +152 -5
  237. package/src/cli/commands/__tests__/memory-v2.test.ts +14 -28
  238. package/src/cli/commands/__tests__/trust.test.ts +21 -387
  239. package/src/cli/commands/backup.ts +4 -4
  240. package/src/cli/commands/cache-fs.ts +8 -0
  241. package/src/cli/commands/cache.ts +153 -82
  242. package/src/cli/commands/clients.ts +63 -5
  243. package/src/cli/commands/completions.ts +3 -3
  244. package/src/cli/commands/contacts.ts +231 -76
  245. package/src/cli/commands/keys.ts +4 -1
  246. package/src/cli/commands/memory-v2.ts +24 -52
  247. package/src/cli/commands/oauth/shared.ts +2 -29
  248. package/src/cli/commands/pending.ts +102 -0
  249. package/src/cli/commands/skills.ts +77 -35
  250. package/src/cli/commands/trust.ts +70 -430
  251. package/src/cli/commands/usage.ts +25 -16
  252. package/src/cli/lib/daemon-credential-client.ts +14 -0
  253. package/src/cli/program.ts +2 -0
  254. package/src/cli.ts +0 -21
  255. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  256. package/src/config/bundled-skills/messaging/TOOLS.json +14 -4
  257. package/src/config/env-registry.ts +12 -2
  258. package/src/config/env.ts +3 -14
  259. package/src/config/feature-flag-registry.json +30 -30
  260. package/src/config/llm-callsite-catalog.ts +12 -0
  261. package/src/config/llm-context-resolution.ts +80 -0
  262. package/src/config/llm-resolver.ts +58 -22
  263. package/src/config/loader.ts +3 -3
  264. package/src/config/schema.ts +2 -158
  265. package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
  266. package/src/config/schemas/call-site-catalog.ts +271 -0
  267. package/src/config/schemas/calls.ts +5 -5
  268. package/src/config/schemas/inference.ts +1 -1
  269. package/src/config/schemas/ingress.ts +1 -1
  270. package/src/config/schemas/llm.ts +31 -3
  271. package/src/config/schemas/memory-retrieval.ts +2 -2
  272. package/src/config/schemas/memory-v2.ts +9 -0
  273. package/src/config/schemas/security.ts +1 -42
  274. package/src/config/schemas/services.ts +6 -6
  275. package/src/config/schemas/skills.ts +5 -5
  276. package/src/config/schemas/tts.ts +1 -1
  277. package/src/config/seed-inference-profiles.ts +117 -0
  278. package/src/config/skills.ts +0 -90
  279. package/src/config/types.ts +3 -6
  280. package/src/contacts/contact-store.ts +0 -17
  281. package/src/contacts/contacts-write.ts +1 -105
  282. package/src/context/window-manager.ts +44 -5
  283. package/src/credential-execution/process-manager.ts +34 -10
  284. package/src/credential-health/credential-health-service.ts +21 -16
  285. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
  286. package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
  287. package/src/daemon/connection-policy.ts +1 -26
  288. package/src/daemon/conversation-agent-loop-handlers.ts +53 -4
  289. package/src/daemon/conversation-agent-loop.ts +277 -36
  290. package/src/daemon/conversation-history.ts +8 -8
  291. package/src/daemon/conversation-launch.ts +20 -135
  292. package/src/daemon/conversation-lifecycle.ts +1 -1
  293. package/src/daemon/conversation-messaging.ts +1 -0
  294. package/src/daemon/conversation-process.ts +83 -163
  295. package/src/daemon/conversation-runtime-assembly.ts +219 -76
  296. package/src/daemon/conversation-slash.ts +47 -5
  297. package/src/daemon/conversation-store.ts +7 -31
  298. package/src/daemon/conversation-surfaces.ts +22 -28
  299. package/src/daemon/conversation-tool-setup.ts +3 -33
  300. package/src/daemon/conversation-usage.ts +36 -0
  301. package/src/daemon/conversation.ts +117 -233
  302. package/src/daemon/daemon-control.ts +3 -71
  303. package/src/daemon/daemon-skill-host.ts +8 -11
  304. package/src/daemon/dictation-profile-store.ts +2 -26
  305. package/src/daemon/first-greeting.ts +44 -156
  306. package/src/daemon/handlers/config-channels.ts +12 -12
  307. package/src/daemon/handlers/config-ingress.ts +4 -165
  308. package/src/daemon/handlers/config-model.ts +1 -1
  309. package/src/daemon/handlers/config-voice.ts +0 -42
  310. package/src/daemon/handlers/conversations.ts +11 -190
  311. package/src/daemon/handlers/recording.ts +26 -158
  312. package/src/daemon/handlers/shared.ts +23 -71
  313. package/src/daemon/handlers/skills.ts +42 -93
  314. package/src/daemon/host-bash-proxy.ts +67 -45
  315. package/src/daemon/host-browser-proxy.ts +65 -27
  316. package/src/daemon/host-cu-proxy.ts +40 -39
  317. package/src/daemon/host-file-proxy.ts +58 -37
  318. package/src/daemon/host-transfer-proxy.ts +84 -46
  319. package/src/daemon/lifecycle.ts +49 -15
  320. package/src/daemon/message-types/conversations.ts +7 -0
  321. package/src/daemon/message-types/host-bash.ts +1 -0
  322. package/src/daemon/message-types/host-cu.ts +1 -0
  323. package/src/daemon/message-types/host-file.ts +1 -0
  324. package/src/daemon/message-types/host-transfer.ts +1 -0
  325. package/src/daemon/message-types/messages.ts +10 -9
  326. package/src/daemon/message-types/workspace.ts +1 -1
  327. package/src/daemon/process-message.ts +102 -239
  328. package/src/daemon/server.ts +13 -462
  329. package/src/daemon/shutdown-handlers.ts +2 -2
  330. package/src/daemon/tool-side-effects.ts +125 -107
  331. package/src/daemon/trust-context.ts +13 -0
  332. package/src/daemon/wake-target-adapter.ts +4 -9
  333. package/src/events/domain-events.ts +0 -8
  334. package/src/events/tool-audit-listener.ts +3 -1
  335. package/src/events/tool-domain-event-publisher.ts +0 -10
  336. package/src/events/tool-metrics-listener.ts +0 -17
  337. package/src/events/tool-trace-listener.ts +0 -14
  338. package/src/filing/filing-service.ts +13 -1
  339. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +6 -2
  340. package/src/heartbeat/heartbeat-service.ts +23 -5
  341. package/src/home/__tests__/feed-writer.test.ts +0 -4
  342. package/src/home/__tests__/relationship-state-writer.test.ts +30 -0
  343. package/src/home/feed-writer.ts +1 -2
  344. package/src/home/relationship-state-writer.ts +16 -3
  345. package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
  346. package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
  347. package/src/ipc/assistant-server.ts +3 -10
  348. package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
  349. package/src/ipc/routes/route-adapter.ts +1 -1
  350. package/src/ipc/routes/trust-rules.test.ts +0 -95
  351. package/src/ipc/skill-ipc-types.ts +41 -0
  352. package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
  353. package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
  354. package/src/ipc/skill-routes/events.ts +12 -23
  355. package/src/ipc/skill-routes/identity.ts +4 -17
  356. package/src/ipc/skill-routes/index.ts +1 -1
  357. package/src/ipc/skill-server.ts +6 -39
  358. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
  359. package/src/live-voice/protocol.ts +4 -13
  360. package/src/mcp/manager.ts +0 -5
  361. package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
  362. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
  363. package/src/memory/app-git-service.ts +0 -32
  364. package/src/memory/app-store.ts +154 -0
  365. package/src/memory/attachments-store.ts +6 -0
  366. package/src/memory/context-search/sources/memory-v2.ts +578 -0
  367. package/src/memory/context-search/sources/memory.ts +5 -0
  368. package/src/memory/context-search/sources/pkb.ts +10 -1
  369. package/src/memory/context-search/sources/workspace.ts +3 -2
  370. package/src/memory/conversation-crud.ts +29 -4
  371. package/src/memory/conversation-disk-view.ts +1 -5
  372. package/src/memory/conversation-starter-checkpoints.ts +63 -0
  373. package/src/memory/db-connection.ts +62 -0
  374. package/src/memory/db-init.ts +14 -0
  375. package/src/memory/embedding-backend.ts +3 -21
  376. package/src/memory/embedding-gemini.ts +0 -2
  377. package/src/memory/embedding-local.ts +6 -6
  378. package/src/memory/embedding-ollama.ts +6 -6
  379. package/src/memory/embedding-openai.ts +6 -6
  380. package/src/memory/embedding-types.ts +21 -0
  381. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +3 -7
  382. package/src/memory/graph/conversation-graph-memory.ts +35 -13
  383. package/src/memory/graph/injection.test.ts +2 -2
  384. package/src/memory/graph/injection.ts +1 -1
  385. package/src/memory/guardian-action-store.ts +0 -83
  386. package/src/memory/guardian-approvals.ts +0 -48
  387. package/src/memory/indexer.ts +1 -15
  388. package/src/memory/job-handlers/conversation-starters.ts +36 -53
  389. package/src/memory/job-utils.ts +0 -6
  390. package/src/memory/jobs-store.ts +0 -1
  391. package/src/memory/jobs-worker.ts +2 -16
  392. package/src/memory/llm-request-log-store.ts +0 -41
  393. package/src/memory/llm-usage-store.ts +129 -43
  394. package/src/memory/memory-v2-activation-log-store.ts +115 -0
  395. package/src/memory/migrations/233-document-conversations.ts +54 -0
  396. package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
  397. package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
  398. package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
  399. package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
  400. package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
  401. package/src/memory/migrations/index.ts +14 -0
  402. package/src/memory/migrations/registry.ts +24 -0
  403. package/src/memory/raw-query.ts +2 -68
  404. package/src/memory/schema/conversations.ts +7 -0
  405. package/src/memory/schema/infrastructure.ts +25 -0
  406. package/src/memory/search/semantic.ts +5 -16
  407. package/src/memory/tool-usage-store.ts +2 -0
  408. package/src/memory/usage-buckets.ts +40 -1
  409. package/src/memory/usage-grouped-buckets.ts +127 -0
  410. package/src/memory/v2/__tests__/activation.test.ts +289 -90
  411. package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
  412. package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
  413. package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
  414. package/src/memory/v2/__tests__/injection.test.ts +384 -15
  415. package/src/memory/v2/__tests__/migration.test.ts +64 -36
  416. package/src/memory/v2/__tests__/page-store.test.ts +191 -8
  417. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
  418. package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
  419. package/src/memory/v2/__tests__/static-context.test.ts +153 -0
  420. package/src/memory/v2/activation.ts +168 -97
  421. package/src/memory/v2/backfill-jobs.ts +15 -100
  422. package/src/memory/v2/consolidation-job.ts +14 -12
  423. package/src/memory/v2/edge-index.ts +191 -0
  424. package/src/memory/v2/injection.ts +182 -58
  425. package/src/memory/v2/migration.ts +57 -64
  426. package/src/memory/v2/now-text.ts +2 -3
  427. package/src/memory/v2/page-store.ts +168 -31
  428. package/src/memory/v2/prompts/consolidation.ts +118 -42
  429. package/src/memory/v2/prompts/sweep.ts +3 -3
  430. package/src/memory/v2/skill-store.ts +55 -7
  431. package/src/memory/v2/static-context.ts +62 -0
  432. package/src/memory/v2/types.ts +10 -20
  433. package/src/memory/validation.ts +0 -11
  434. package/src/messaging/draft-store.ts +0 -6
  435. package/src/messaging/provider-types.ts +8 -0
  436. package/src/messaging/provider.ts +7 -0
  437. package/src/messaging/providers/gmail/client.ts +1 -121
  438. package/src/messaging/providers/outlook/client.ts +0 -73
  439. package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
  440. package/src/messaging/providers/slack/adapter.ts +122 -21
  441. package/src/messaging/providers/slack/backfill.test.ts +95 -6
  442. package/src/messaging/providers/slack/backfill.ts +89 -11
  443. package/src/messaging/providers/slack/client.ts +10 -124
  444. package/src/messaging/providers/slack/message-metadata.ts +12 -2
  445. package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
  446. package/src/messaging/providers/slack/render-transcript.ts +126 -25
  447. package/src/messaging/providers/slack/types.ts +1 -0
  448. package/src/oauth/connection-resolver.test.ts +8 -0
  449. package/src/oauth/connection-resolver.ts +8 -16
  450. package/src/oauth/credential-token-resolver.ts +97 -0
  451. package/src/oauth/manual-token-connection.ts +30 -34
  452. package/src/oauth/oauth-store.ts +6 -4
  453. package/src/outbound-proxy/certs.ts +0 -7
  454. package/src/outbound-proxy/config.ts +0 -74
  455. package/src/outbound-proxy/health.ts +0 -44
  456. package/src/outbound-proxy/index.ts +0 -22
  457. package/src/permissions/approval-provenance.test.ts +184 -0
  458. package/src/permissions/approval-provenance.ts +70 -0
  459. package/src/permissions/checker.ts +4 -1
  460. package/src/permissions/gateway-threshold-reader.ts +4 -1
  461. package/src/permissions/prompter.ts +9 -2
  462. package/src/permissions/secret-prompter.ts +21 -48
  463. package/src/permissions/types.ts +33 -0
  464. package/src/permissions/workspace-policy.ts +0 -5
  465. package/src/platform/sync-identity.ts +0 -8
  466. package/src/plugins/defaults/injectors.ts +69 -2
  467. package/src/plugins/defaults/overflow-reduce.ts +3 -2
  468. package/src/plugins/types.ts +8 -0
  469. package/src/prompts/system-prompt.ts +34 -70
  470. package/src/prompts/templates/BOOTSTRAP.md +52 -6
  471. package/src/prompts/update-bulletin-job.ts +2 -0
  472. package/src/providers/__tests__/retry-callsite.test.ts +138 -1
  473. package/src/providers/anthropic/client.ts +72 -33
  474. package/src/providers/call-site-routing.ts +42 -3
  475. package/src/providers/gemini/client.ts +18 -2
  476. package/src/providers/managed-proxy/context.ts +0 -5
  477. package/src/providers/model-catalog.ts +105 -19
  478. package/src/providers/openai/chat-completions-provider.ts +6 -0
  479. package/src/providers/openai/responses-provider.ts +7 -1
  480. package/src/providers/provider-send-message.ts +45 -2
  481. package/src/providers/ratelimit.ts +7 -2
  482. package/src/providers/registry.ts +14 -9
  483. package/src/providers/retry.ts +96 -8
  484. package/src/providers/types.ts +13 -0
  485. package/src/providers/usage-tracking.ts +96 -0
  486. package/src/runtime/AGENTS.md +10 -6
  487. package/src/runtime/__tests__/agent-wake.test.ts +89 -0
  488. package/src/runtime/agent-wake.ts +39 -2
  489. package/src/runtime/assistant-event-hub.ts +541 -45
  490. package/src/runtime/assistant-event.ts +1 -6
  491. package/src/runtime/auth/context.ts +0 -9
  492. package/src/runtime/auth/middleware.ts +1 -1
  493. package/src/runtime/auth/route-policy.ts +11 -9
  494. package/src/runtime/auth/token-service.ts +0 -11
  495. package/src/runtime/channel-approvals.ts +6 -2
  496. package/src/runtime/channel-verification-service.ts +3 -5
  497. package/src/runtime/http-errors.ts +0 -34
  498. package/src/runtime/http-router.ts +6 -3
  499. package/src/runtime/http-server.ts +22 -82
  500. package/src/runtime/http-types.ts +5 -0
  501. package/src/runtime/interactive-ui.ts +0 -1
  502. package/src/runtime/middleware/auth.ts +0 -20
  503. package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
  504. package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
  505. package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
  506. package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
  507. package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
  508. package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
  509. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +143 -79
  510. package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
  511. package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
  512. package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +371 -0
  513. package/src/runtime/migrations/migration-transport.ts +46 -13
  514. package/src/runtime/migrations/migration-wizard.ts +2 -2
  515. package/src/runtime/migrations/origin-mode.ts +40 -0
  516. package/src/runtime/migrations/vbundle-builder.ts +133 -79
  517. package/src/runtime/migrations/vbundle-import-analyzer.ts +9 -7
  518. package/src/runtime/migrations/vbundle-importer.ts +7 -7
  519. package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
  520. package/src/runtime/migrations/vbundle-streaming-importer.ts +3 -3
  521. package/src/runtime/migrations/vbundle-streaming-validator.ts +48 -26
  522. package/src/runtime/migrations/vbundle-validator.ts +214 -41
  523. package/src/runtime/pending-interactions.ts +13 -4
  524. package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
  525. package/src/runtime/routes/__tests__/backup-routes.test.ts +28 -19
  526. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +235 -0
  527. package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
  528. package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
  529. package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
  530. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
  531. package/src/runtime/routes/acp-routes.test.ts +0 -3
  532. package/src/runtime/routes/acp-routes.ts +3 -7
  533. package/src/runtime/routes/app-management-routes.ts +18 -9
  534. package/src/runtime/routes/approval-routes.ts +55 -14
  535. package/src/runtime/routes/avatar-routes.ts +3 -5
  536. package/src/runtime/routes/browser-routes.ts +1 -15
  537. package/src/runtime/routes/channel-guardian-routes.ts +1 -5
  538. package/src/runtime/routes/channel-readiness-routes.ts +3 -7
  539. package/src/runtime/routes/channel-route-shared.ts +2 -28
  540. package/src/runtime/routes/client-routes.ts +45 -12
  541. package/src/runtime/routes/consolidation-routes.ts +115 -0
  542. package/src/runtime/routes/conversation-list-routes.ts +12 -29
  543. package/src/runtime/routes/conversation-management-routes.ts +14 -51
  544. package/src/runtime/routes/conversation-query-routes.ts +120 -8
  545. package/src/runtime/routes/conversation-routes.ts +44 -528
  546. package/src/runtime/routes/conversation-starter-routes.ts +19 -40
  547. package/src/runtime/routes/documents-routes.ts +53 -18
  548. package/src/runtime/routes/events-routes.ts +59 -91
  549. package/src/runtime/routes/filing-routes.ts +18 -1
  550. package/src/runtime/routes/guardian-action-routes.ts +4 -9
  551. package/src/runtime/routes/host-bash-routes.ts +3 -2
  552. package/src/runtime/routes/host-browser-routes.ts +9 -33
  553. package/src/runtime/routes/host-cu-routes.ts +6 -1
  554. package/src/runtime/routes/host-file-routes.ts +3 -2
  555. package/src/runtime/routes/host-transfer-routes.ts +11 -15
  556. package/src/runtime/routes/identity-routes.ts +78 -6
  557. package/src/runtime/routes/inbound-message-handler.ts +580 -137
  558. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -88
  559. package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
  560. package/src/runtime/routes/index.ts +4 -0
  561. package/src/runtime/routes/integrations/slack/channel.ts +0 -24
  562. package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
  563. package/src/runtime/routes/memory-v2-routes.ts +10 -15
  564. package/src/runtime/routes/migration-routes.ts +188 -31
  565. package/src/runtime/routes/playground/guard.ts +1 -1
  566. package/src/runtime/routes/playground/index.ts +0 -2
  567. package/src/runtime/routes/recording-routes.ts +4 -24
  568. package/src/runtime/routes/rename-conversation-routes.ts +2 -6
  569. package/src/runtime/routes/schedule-routes.ts +3 -6
  570. package/src/runtime/routes/secret-routes.ts +87 -18
  571. package/src/runtime/routes/settings-routes.ts +29 -28
  572. package/src/runtime/routes/skills-routes.ts +12 -31
  573. package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
  574. package/src/runtime/routes/task-routes.ts +6 -6
  575. package/src/runtime/routes/trust-rules-routes.ts +3 -94
  576. package/src/runtime/routes/types.ts +4 -4
  577. package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
  578. package/src/runtime/routes/usage-routes.ts +87 -10
  579. package/src/runtime/routes/user-routes.ts +17 -31
  580. package/src/runtime/routes/work-items-routes.ts +1 -4
  581. package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
  582. package/src/runtime/services/analyze-conversation.ts +7 -17
  583. package/src/runtime/services/conversation-serializer.ts +2 -4
  584. package/src/runtime/verification-outbound-actions.ts +1 -1
  585. package/src/runtime/verification-rate-limiter.ts +1 -1
  586. package/src/schedule/schedule-store.ts +0 -16
  587. package/src/security/secret-scanner.ts +14 -547
  588. package/src/security/secure-keys.ts +31 -11
  589. package/src/security/token-manager.ts +7 -3
  590. package/src/signals/cancel.ts +16 -25
  591. package/src/signals/conversation-undo.ts +2 -27
  592. package/src/signals/emit-event.ts +1 -2
  593. package/src/signals/user-message.ts +108 -22
  594. package/src/skills/catalog-install.ts +1 -0
  595. package/src/skills/clawhub.ts +2 -2
  596. package/src/skills/inline-command-runner.ts +1 -7
  597. package/src/subagent/manager.ts +67 -84
  598. package/src/tasks/task-store.ts +1 -28
  599. package/src/telemetry/types.ts +6 -0
  600. package/src/telemetry/usage-telemetry-reporter.test.ts +38 -15
  601. package/src/telemetry/usage-telemetry-reporter.ts +3 -5
  602. package/src/tools/acp/spawn.test.ts +1 -2
  603. package/src/tools/acp/steer.test.ts +1 -2
  604. package/src/tools/browser/__tests__/browser-status.test.ts +44 -127
  605. package/src/tools/browser/browser-execution.ts +31 -147
  606. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +92 -68
  607. package/src/tools/browser/cdp-client/factory.ts +48 -76
  608. package/src/tools/browser/cdp-client/index.ts +1 -14
  609. package/src/tools/executor.ts +44 -31
  610. package/src/tools/host-filesystem/edit.ts +3 -2
  611. package/src/tools/host-filesystem/read.ts +3 -2
  612. package/src/tools/host-filesystem/transfer.test.ts +45 -42
  613. package/src/tools/host-filesystem/transfer.ts +4 -3
  614. package/src/tools/host-filesystem/write.ts +3 -2
  615. package/src/tools/host-terminal/host-shell.ts +4 -3
  616. package/src/tools/network/script-proxy/index.ts +1 -10
  617. package/src/tools/permission-checker.ts +66 -1
  618. package/src/tools/skills/sandbox-runner.ts +1 -6
  619. package/src/tools/skills/skill-tool-factory.ts +32 -0
  620. package/src/tools/terminal/safe-env.ts +1 -0
  621. package/src/tools/terminal/shell.ts +2 -78
  622. package/src/tools/types.ts +12 -39
  623. package/src/tts/__tests__/provider-catalog.test.ts +2 -2
  624. package/src/tts/provider-catalog.ts +1 -1
  625. package/src/usage/actors.ts +2 -1
  626. package/src/usage/attribution.ts +185 -0
  627. package/src/usage/pricing.ts +166 -0
  628. package/src/usage/types.ts +14 -0
  629. package/src/util/json.ts +13 -0
  630. package/src/util/logger.ts +3 -3
  631. package/src/util/pricing.ts +50 -3
  632. package/src/work-items/work-item-runner.ts +15 -42
  633. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +4 -3
  634. package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
  635. package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
  636. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +59 -0
  637. package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
  638. package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
  639. package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
  640. package/src/workspace/migrations/registry.ts +8 -0
  641. package/src/workspace/provider-commit-message-generator.ts +3 -3
  642. package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
  643. package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
  644. package/src/__tests__/secret-detection-handler.test.ts +0 -67
  645. package/src/__tests__/secret-scanner-executor.test.ts +0 -450
  646. package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
  647. package/src/__tests__/terminal-sandbox.test.ts +0 -374
  648. package/src/__tests__/tool-notification-listener.test.ts +0 -65
  649. package/src/context/__tests__/microcompact.test.ts +0 -805
  650. package/src/context/microcompact.ts +0 -443
  651. package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
  652. package/src/events/tool-notification-listener.ts +0 -17
  653. package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
  654. package/src/memory/v2/__tests__/edges.test.ts +0 -435
  655. package/src/memory/v2/edges.ts +0 -217
  656. package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
  657. package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
  658. package/src/runtime/__tests__/client-registry.test.ts +0 -271
  659. package/src/runtime/chrome-extension-registry.ts +0 -368
  660. package/src/runtime/client-registry.ts +0 -254
  661. package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
  662. package/src/tools/secret-detection-handler.ts +0 -269
  663. package/src/tools/terminal/backends/native.ts +0 -327
  664. package/src/tools/terminal/backends/types.ts +0 -37
  665. package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
  666. package/src/tools/terminal/sandbox.ts +0 -40
@@ -0,0 +1,235 @@
1
+ import { beforeEach, describe, expect, mock, test } from "bun:test";
2
+
3
+ mock.module("../../../util/logger.js", () => ({
4
+ getLogger: () =>
5
+ new Proxy({} as Record<string, unknown>, {
6
+ get: () => () => {},
7
+ }),
8
+ }));
9
+
10
+ import {
11
+ sampleConcepts as sharedSampleConcepts,
12
+ sampleConfig,
13
+ sampleSkills,
14
+ } from "../../../memory/__tests__/fixtures/memory-v2-activation-fixtures.js";
15
+
16
+ let rawConfigFixture: Record<string, unknown> = {};
17
+ let savedRawConfig: Record<string, unknown> | null = null;
18
+
19
+ mock.module("../../../config/loader.js", () => ({
20
+ loadRawConfig: () => structuredClone(rawConfigFixture),
21
+ saveRawConfig: (raw: Record<string, unknown>) => {
22
+ savedRawConfig = raw;
23
+ },
24
+ deepMergeOverwrite: (
25
+ target: Record<string, unknown>,
26
+ overrides: Record<string, unknown>,
27
+ ) => {
28
+ Object.assign(target, overrides);
29
+ },
30
+ }));
31
+
32
+ import { getDb } from "../../../memory/db-connection.js";
33
+ import { initializeDb } from "../../../memory/db-init.js";
34
+ import {
35
+ backfillMemoryV2ActivationMessageId,
36
+ type MemoryV2ConceptRowRecord,
37
+ type MemoryV2ConfigSnapshot,
38
+ type MemoryV2SkillRowRecord,
39
+ recordMemoryV2ActivationLog,
40
+ } from "../../../memory/memory-v2-activation-log-store.js";
41
+ import {
42
+ llmRequestLogs,
43
+ memoryV2ActivationLogs,
44
+ } from "../../../memory/schema.js";
45
+ import { ROUTES } from "../conversation-query-routes.js";
46
+
47
+ // Local subset: this test only exercises a single concept row.
48
+ const sampleConcepts: MemoryV2ConceptRowRecord[] = sharedSampleConcepts.slice(
49
+ 0,
50
+ 1,
51
+ );
52
+
53
+ initializeDb();
54
+
55
+ const llmContextRoute = ROUTES.find(
56
+ (r) => r.method === "GET" && r.endpoint === "messages/:id/llm-context",
57
+ )!;
58
+
59
+ const replaceProfileRoute = ROUTES.find(
60
+ (r) => r.operationId === "config_llm_profiles_replace",
61
+ )!;
62
+
63
+ function dispatchLlmContext(messageId: string) {
64
+ return llmContextRoute.handler({ pathParams: { id: messageId } });
65
+ }
66
+
67
+ function clearTables(): void {
68
+ const db = getDb();
69
+ db.delete(llmRequestLogs).run();
70
+ db.delete(memoryV2ActivationLogs).run();
71
+ }
72
+
73
+ function seedRequestLog(messageId: string, id: string): void {
74
+ getDb()
75
+ .insert(llmRequestLogs)
76
+ .values({
77
+ id,
78
+ conversationId: "conv-1",
79
+ messageId,
80
+ provider: "openai",
81
+ requestPayload: JSON.stringify({ model: "gpt-4.1", messages: [] }),
82
+ responsePayload: JSON.stringify({
83
+ choices: [{ message: { content: "hi" } }],
84
+ }),
85
+ createdAt: 1_700_000_000_000,
86
+ })
87
+ .run();
88
+ }
89
+
90
+ describe("GET /v1/messages/:id/llm-context — memoryV2Activation", () => {
91
+ beforeEach(() => {
92
+ clearTables();
93
+ });
94
+
95
+ test("returns null memoryV2Activation when no v2 log exists for the turn", async () => {
96
+ const messageId = "msg-no-v2";
97
+ seedRequestLog(messageId, "log-no-v2");
98
+
99
+ const body = (await dispatchLlmContext(messageId)) as {
100
+ memoryV2Activation: unknown;
101
+ memoryRecall: unknown;
102
+ };
103
+
104
+ expect(body.memoryV2Activation).toBeNull();
105
+ // Backwards-compat: memoryRecall remains.
106
+ expect(body).toHaveProperty("memoryRecall");
107
+ });
108
+
109
+ test("returns the recorded v2 activation log on the response", async () => {
110
+ const conversationId = "conv-v2";
111
+ const messageId = "msg-v2-present";
112
+
113
+ seedRequestLog(messageId, "log-v2-present");
114
+ recordMemoryV2ActivationLog({
115
+ conversationId,
116
+ turn: 4,
117
+ mode: "per-turn",
118
+ concepts: sampleConcepts,
119
+ skills: sampleSkills,
120
+ config: sampleConfig,
121
+ });
122
+ backfillMemoryV2ActivationMessageId(conversationId, messageId);
123
+
124
+ const body = (await dispatchLlmContext(messageId)) as {
125
+ memoryV2Activation: {
126
+ turn: number;
127
+ mode: "context-load" | "per-turn";
128
+ concepts: MemoryV2ConceptRowRecord[];
129
+ skills: MemoryV2SkillRowRecord[];
130
+ config: MemoryV2ConfigSnapshot;
131
+ } | null;
132
+ memoryRecall: unknown;
133
+ };
134
+
135
+ expect(body.memoryV2Activation).not.toBeNull();
136
+ expect(body.memoryV2Activation!.turn).toBe(4);
137
+ expect(body.memoryV2Activation!.mode).toBe("per-turn");
138
+ expect(body.memoryV2Activation!.concepts).toEqual(sampleConcepts);
139
+ expect(body.memoryV2Activation!.skills).toEqual(sampleSkills);
140
+ expect(body.memoryV2Activation!.config).toEqual(sampleConfig);
141
+ // Backwards-compat: memoryRecall field still present.
142
+ expect(body).toHaveProperty("memoryRecall");
143
+ });
144
+ });
145
+
146
+ describe("PUT /v1/config/llm/profiles/:name", () => {
147
+ beforeEach(() => {
148
+ savedRawConfig = null;
149
+ rawConfigFixture = {
150
+ llm: {
151
+ profiles: {
152
+ custom: {
153
+ provider: "anthropic",
154
+ model: "claude-sonnet-4-6",
155
+ maxTokens: 32000,
156
+ contextWindow: {
157
+ maxInputTokens: 900000,
158
+ targetBudgetRatio: 0.3,
159
+ summaryBudgetRatio: 0.08,
160
+ overflowRecovery: {
161
+ enabled: true,
162
+ maxAttempts: 4,
163
+ },
164
+ },
165
+ openrouter: {
166
+ only: ["anthropic"],
167
+ },
168
+ },
169
+ },
170
+ },
171
+ };
172
+ });
173
+
174
+ test("owns contextWindow maxInputTokens while preserving non-UI profile leaves", () => {
175
+ const result = replaceProfileRoute.handler({
176
+ pathParams: { name: "custom" },
177
+ body: {
178
+ provider: "openai",
179
+ model: "gpt-5.5",
180
+ },
181
+ });
182
+
183
+ expect(result).toEqual({ ok: true });
184
+ const savedProfile = (
185
+ savedRawConfig?.llm as {
186
+ profiles: Record<string, Record<string, unknown>>;
187
+ }
188
+ ).profiles.custom;
189
+
190
+ expect(savedProfile.provider).toBe("openai");
191
+ expect(savedProfile.model).toBe("gpt-5.5");
192
+ expect(savedProfile.maxTokens).toBeUndefined();
193
+ expect(savedProfile.contextWindow).toEqual({
194
+ targetBudgetRatio: 0.3,
195
+ summaryBudgetRatio: 0.08,
196
+ overflowRecovery: {
197
+ enabled: true,
198
+ maxAttempts: 4,
199
+ },
200
+ });
201
+ expect(savedProfile.openrouter).toEqual({ only: ["anthropic"] });
202
+ });
203
+
204
+ test("writes only the replacement contextWindow maxInputTokens override", () => {
205
+ const result = replaceProfileRoute.handler({
206
+ pathParams: { name: "custom" },
207
+ body: {
208
+ provider: "openai",
209
+ model: "gpt-5.5",
210
+ contextWindow: {
211
+ maxInputTokens: 150000,
212
+ summaryBudgetRatio: 0.2,
213
+ },
214
+ },
215
+ });
216
+
217
+ expect(result).toEqual({ ok: true });
218
+ const savedProfile = (
219
+ savedRawConfig?.llm as {
220
+ profiles: Record<string, Record<string, unknown>>;
221
+ }
222
+ ).profiles.custom;
223
+
224
+ expect(savedProfile.contextWindow).toEqual({
225
+ maxInputTokens: 150000,
226
+ targetBudgetRatio: 0.3,
227
+ summaryBudgetRatio: 0.08,
228
+ overflowRecovery: {
229
+ enabled: true,
230
+ maxAttempts: 4,
231
+ },
232
+ });
233
+ expect(savedProfile.openrouter).toEqual({ only: ["anthropic"] });
234
+ });
235
+ });
@@ -0,0 +1,58 @@
1
+ import { describe, expect, test } from "bun:test";
2
+
3
+ import { LLMCallSiteEnum } from "../../../config/schemas/llm.js";
4
+ import { ROUTES } from "../llm-call-sites-routes.js";
5
+
6
+ const route = ROUTES.find((r) => r.operationId === "llm_call_sites_list")!;
7
+
8
+ describe("llm-call-sites-routes", () => {
9
+ test("route is defined with correct method and endpoint", () => {
10
+ expect(route).toBeDefined();
11
+ expect(route.method).toBe("GET");
12
+ expect(route.endpoint).toBe("config/llm/call-sites");
13
+ });
14
+
15
+ test("response has domains and callSites arrays", async () => {
16
+ const result = (await route.handler({})) as {
17
+ domains: unknown[];
18
+ callSites: unknown[];
19
+ };
20
+ expect(Array.isArray(result.domains)).toBe(true);
21
+ expect(Array.isArray(result.callSites)).toBe(true);
22
+ });
23
+
24
+ test("all call site IDs match LLMCallSiteEnum", async () => {
25
+ const result = (await route.handler({})) as {
26
+ callSites: Array<{ id: string; displayName: string; description: string; domain: string }>;
27
+ };
28
+ const validIds = new Set(LLMCallSiteEnum.options);
29
+ for (const site of result.callSites) {
30
+ expect(validIds.has(site.id as never)).toBe(true);
31
+ expect(site.displayName).toBeTruthy();
32
+ expect(site.description).toBeTruthy();
33
+ }
34
+ expect(result.callSites.length).toBe(LLMCallSiteEnum.options.length);
35
+ });
36
+
37
+ test("all call site domain references match defined domains", async () => {
38
+ const result = (await route.handler({})) as {
39
+ domains: Array<{ id: string; displayName: string }>;
40
+ callSites: Array<{ id: string; domain: string }>;
41
+ };
42
+ const domainIds = new Set(result.domains.map((d) => d.id));
43
+ for (const site of result.callSites) {
44
+ expect(domainIds.has(site.domain)).toBe(true);
45
+ }
46
+ });
47
+
48
+ test("domains have non-empty id and displayName", async () => {
49
+ const result = (await route.handler({})) as {
50
+ domains: Array<{ id: string; displayName: string }>;
51
+ };
52
+ expect(result.domains.length).toBeGreaterThan(0);
53
+ for (const domain of result.domains) {
54
+ expect(domain.id).toBeTruthy();
55
+ expect(domain.displayName).toBeTruthy();
56
+ }
57
+ });
58
+ });
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Unit tests for `computeSecretsRedacted`.
3
+ *
4
+ * The helper decides whether the v1 manifest may truthfully claim
5
+ * `secrets_redacted: true`. Three signals feed in:
6
+ * - credentialCount: number of credentials actually included in the bundle.
7
+ * - storeUnreachable: top-level `listSecureKeysAsync()` failed — we never
8
+ * enumerated the accounts.
9
+ * - perAccountUnreachable: enumeration succeeded, but at least one
10
+ * `getSecureKeyResultAsync(account)` returned `unreachable: true`. Those
11
+ * accounts were silently skipped from the credentials array, so a zero
12
+ * count could be hiding real secrets we just couldn't read.
13
+ *
14
+ * Only the all-clear case (zero credentials, both flags false) may return
15
+ * true. Any failure mode forces false — claiming a clean redaction in those
16
+ * cases would lie about what's in the bundle.
17
+ */
18
+
19
+ import { describe, expect, test } from "bun:test";
20
+
21
+ import { computeSecretsRedacted } from "../migration-routes.js";
22
+
23
+ describe("computeSecretsRedacted", () => {
24
+ test("genuinely empty store + reachable + no per-account failures → true", () => {
25
+ expect(computeSecretsRedacted(0, false, false)).toBe(true);
26
+ });
27
+
28
+ test("top-level store unreachable → false (couldn't read at all)", () => {
29
+ expect(computeSecretsRedacted(0, true, false)).toBe(false);
30
+ });
31
+
32
+ test("per-account read failure → false (partial read failure)", () => {
33
+ expect(computeSecretsRedacted(0, false, true)).toBe(false);
34
+ });
35
+
36
+ test("both top-level and per-account failures → false", () => {
37
+ expect(computeSecretsRedacted(0, true, true)).toBe(false);
38
+ });
39
+
40
+ test("credentials included + no failures → false (creds in bundle)", () => {
41
+ expect(computeSecretsRedacted(3, false, false)).toBe(false);
42
+ });
43
+
44
+ test("credentials included + per-account failure → false (creds + partial failure)", () => {
45
+ expect(computeSecretsRedacted(3, false, true)).toBe(false);
46
+ });
47
+
48
+ test("credentials included + store unreachable → false", () => {
49
+ // Defensive: in practice `storeUnreachable` implies zero credentials,
50
+ // but the helper should still behave correctly if a caller passes a
51
+ // non-zero count alongside an unreachable flag.
52
+ expect(computeSecretsRedacted(3, true, false)).toBe(false);
53
+ });
54
+ });
@@ -51,16 +51,29 @@ function makeTarEntry(data: string): VBundleTarEntry {
51
51
 
52
52
  function makeManifest(paths: string[]): ManifestType {
53
53
  return {
54
- schema_version: "1.0.0",
54
+ schema_version: 1,
55
+ bundle_id: "00000000-0000-4000-8000-000000000000",
55
56
  created_at: new Date().toISOString(),
56
- source: "test",
57
- manifest_sha256: "test",
58
- files: paths.map((path) => ({
57
+ assistant: { id: "self", name: "Test", runtime_version: "0.0.0-test" },
58
+ origin: { mode: "self-hosted-local" },
59
+ compatibility: {
60
+ min_runtime_version: "0.0.0-test",
61
+ max_runtime_version: null,
62
+ },
63
+ contents: paths.map((path) => ({
59
64
  path,
60
- size: 0,
65
+ size_bytes: 0,
61
66
  sha256: "test",
62
67
  })),
63
- } as ManifestType;
68
+ checksum:
69
+ "0000000000000000000000000000000000000000000000000000000000000000",
70
+ secrets_redacted: false,
71
+ export_options: {
72
+ include_logs: false,
73
+ include_browser_state: false,
74
+ include_memory_vectors: false,
75
+ },
76
+ } as unknown as ManifestType;
64
77
  }
65
78
 
66
79
  /**
@@ -23,9 +23,7 @@ import { UserRouteDispatcher } from "../user-route-dispatcher.js";
23
23
  // ---------------------------------------------------------------------------
24
24
 
25
25
  /** Build a minimal UserRouteContext for tests. */
26
- function makeContext(
27
- overrides?: Partial<UserRouteContext>,
28
- ): UserRouteContext {
26
+ function makeContext(overrides?: Partial<UserRouteContext>): UserRouteContext {
29
27
  return {
30
28
  assistantEventHub: new AssistantEventHub(),
31
29
  assistantId: "test-assistant",
@@ -446,10 +444,12 @@ describe("context injection", () => {
446
444
 
447
445
  const hub = new AssistantEventHub();
448
446
  const received: unknown[] = [];
449
- hub.subscribe(
450
- { assistantId: "test-assistant" },
451
- (event) => { received.push(event); },
452
- );
447
+ hub.subscribe({
448
+ type: "process",
449
+ callback: (event) => {
450
+ received.push(event);
451
+ },
452
+ });
453
453
 
454
454
  const ctx = makeContext({ assistantEventHub: hub });
455
455
  const dispatcher = makeDispatcher({ context: ctx });
@@ -57,9 +57,6 @@ mock.module("../../acp/index.js", () => ({
57
57
  return state;
58
58
  },
59
59
  }),
60
- // Spawn and bulk-DELETE tests don't reach this code path, but the mock
61
- // factory must export every name the SUT imports.
62
- broadcastToAllClients: null,
63
60
  }));
64
61
 
65
62
  import { eq } from "drizzle-orm";
@@ -7,15 +7,13 @@
7
7
  import { desc, eq, inArray } from "drizzle-orm";
8
8
  import { z } from "zod";
9
9
 
10
- import {
11
- broadcastToAllClients,
12
- getAcpSessionManager,
13
- } from "../../acp/index.js";
10
+ import { getAcpSessionManager } from "../../acp/index.js";
14
11
  import { resolveAcpAgent } from "../../acp/resolve-agent.js";
15
12
  import type { AcpSessionState } from "../../acp/types.js";
16
13
  import { getDb } from "../../memory/db-connection.js";
17
14
  import { rawChanges } from "../../memory/raw-query.js";
18
15
  import { acpSessionHistory } from "../../memory/schema.js";
16
+ import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
19
17
  import { getLogger } from "../../util/logger.js";
20
18
  import {
21
19
  BadRequestError,
@@ -91,15 +89,13 @@ async function spawnSession({ body }: RouteHandlerArgs) {
91
89
  );
92
90
 
93
91
  const manager = getAcpSessionManager();
94
- const sendToVellum =
95
- broadcastToAllClients ?? ((_msg: unknown) => log.warn("No broadcast fn set"));
96
92
  const { acpSessionId, protocolSessionId } = await manager.spawn(
97
93
  agent,
98
94
  resolved.agent,
99
95
  task,
100
96
  cwd,
101
97
  conversationId,
102
- sendToVellum,
98
+ broadcastMessage,
103
99
  );
104
100
 
105
101
  log.info({ acpSessionId, protocolSessionId, agent }, "ACP spawn succeeded");
@@ -28,6 +28,7 @@ import {
28
28
  restoreAppVersion,
29
29
  } from "../../memory/app-git-service.js";
30
30
  import {
31
+ type AppDefinition,
31
32
  createApp,
32
33
  createAppRecord,
33
34
  deleteApp,
@@ -37,6 +38,7 @@ import {
37
38
  getAppPreview,
38
39
  isMultifileApp,
39
40
  listApps,
41
+ listAppsByConversation,
40
42
  queryAppRecords,
41
43
  resolveAppDir,
42
44
  resolveEffectiveAppHtml,
@@ -69,7 +71,7 @@ function getSharedAppsDir(): string {
69
71
  // Extracted business logic
70
72
  // ---------------------------------------------------------------------------
71
73
 
72
- function listAppsFiltered(): Array<{
74
+ function listAppsFiltered(apps?: AppDefinition[]): Array<{
73
75
  id: string;
74
76
  name: string;
75
77
  description?: string;
@@ -78,7 +80,7 @@ function listAppsFiltered(): Array<{
78
80
  version: string;
79
81
  contentId: string;
80
82
  }> {
81
- return listApps().map((a) => {
83
+ return (apps ?? listApps()).map((a) => {
82
84
  const version = a.version ?? "1.0.0";
83
85
  const contentId = computeContentId(a.name);
84
86
  return {
@@ -354,7 +356,11 @@ async function openBundle(filePath: string): Promise<Record<string, unknown>> {
354
356
  // Route handlers
355
357
  // ---------------------------------------------------------------------------
356
358
 
357
- function handleListApps() {
359
+ function handleListApps({ queryParams }: RouteHandlerArgs) {
360
+ const conversationId = queryParams?.conversationId;
361
+ if (conversationId) {
362
+ return { apps: listAppsFiltered(listAppsByConversation(conversationId)) };
363
+ }
358
364
  return { apps: listAppsFiltered() };
359
365
  }
360
366
 
@@ -511,10 +517,7 @@ function handleUpdatePreview({ pathParams, body }: RouteHandlerArgs) {
511
517
  return { success: true, appId };
512
518
  }
513
519
 
514
- async function handleGetHistory({
515
- pathParams,
516
- queryParams,
517
- }: RouteHandlerArgs) {
520
+ async function handleGetHistory({ pathParams, queryParams }: RouteHandlerArgs) {
518
521
  const appId = pathParams?.id as string;
519
522
  const limit = queryParams?.limit ? Number(queryParams.limit) : undefined;
520
523
  const versions = await getAppHistory(appId, limit);
@@ -578,6 +581,13 @@ export const ROUTES: RouteDefinition[] = [
578
581
  summary: "List apps",
579
582
  description: "Return all locally installed apps.",
580
583
  tags: ["apps"],
584
+ queryParams: [
585
+ {
586
+ name: "conversationId",
587
+ schema: { type: "string" },
588
+ description: "Filter apps by conversation ID",
589
+ },
590
+ ],
581
591
  responseBody: z.object({
582
592
  apps: z.array(z.unknown()).describe("Array of app summary objects"),
583
593
  }),
@@ -716,8 +726,7 @@ export const ROUTES: RouteDefinition[] = [
716
726
  policyKey: "apps/open",
717
727
  handler: handleOpenApp,
718
728
  summary: "Open an app",
719
- description:
720
- "Compile (if needed) and return the app's HTML for rendering.",
729
+ description: "Compile (if needed) and return the app's HTML for rendering.",
721
730
  tags: ["apps"],
722
731
  responseBody: z.object({
723
732
  appId: z.string(),
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import { z } from "zod";
11
11
 
12
+ import { findConversation } from "../../daemon/conversation-store.js";
12
13
  import { emitFeedEvent } from "../../home/emit-feed-event.js";
13
14
  import { getConversationByKey } from "../../memory/conversation-key-store.js";
14
15
  import type { UserDecision } from "../../permissions/types.js";
@@ -97,7 +98,14 @@ function handleConfirm({ body }: RouteHandlerArgs) {
97
98
  return { accepted: true };
98
99
  }
99
100
 
100
- interaction.conversation!.handleConfirmationResponse(
101
+ const conversation = findConversation(interaction.conversationId);
102
+ if (!conversation) {
103
+ throw new NotFoundError(
104
+ "Conversation not found for this pending confirmation",
105
+ );
106
+ }
107
+
108
+ conversation.handleConfirmationResponse(
101
109
  requestId,
102
110
  effectiveDecision as UserDecision,
103
111
  selectedPattern,
@@ -136,7 +144,14 @@ function handleSecret({ body }: RouteHandlerArgs) {
136
144
  throw new NotFoundError("No pending interaction found for this requestId");
137
145
  }
138
146
 
139
- interaction.conversation!.handleSecretResponse(
147
+ const conversation = findConversation(interaction.conversationId);
148
+ if (!conversation) {
149
+ throw new NotFoundError(
150
+ "Conversation not found for this pending secret request",
151
+ );
152
+ }
153
+
154
+ conversation.handleSecretResponse(
140
155
  requestId,
141
156
  value,
142
157
  delivery as "store" | "transient_send" | undefined,
@@ -147,24 +162,35 @@ function handleSecret({ body }: RouteHandlerArgs) {
147
162
  /**
148
163
  * GET /v1/pending-interactions?conversationKey=...&conversationId=...
149
164
  *
150
- * Returns pending confirmations and secrets for a conversation, allowing
151
- * polling-based clients (like the CLI) to discover approval requests
152
- * without SSE.
165
+ * Returns pending interactions. When conversationKey or conversationId is
166
+ * provided, returns the first pending confirmation and secret for that
167
+ * conversation. When neither is provided, returns all pending interactions
168
+ * across all conversations (diagnostic mode).
153
169
  */
154
170
  function handleListPendingInteractions({ queryParams }: RouteHandlerArgs) {
155
171
  const conversationKey = queryParams?.conversationKey;
156
172
  const conversationId = queryParams?.conversationId;
157
173
 
174
+ // When no filters are provided, return all interactions (diagnostic mode).
175
+ if (!conversationId && !conversationKey) {
176
+ const all = pendingInteractions.getAll();
177
+ return {
178
+ interactions: all.map((i) => ({
179
+ requestId: i.requestId,
180
+ conversationId: i.conversationId,
181
+ kind: i.kind,
182
+ toolName: i.confirmationDetails?.toolName,
183
+ riskLevel: i.confirmationDetails?.riskLevel,
184
+ })),
185
+ };
186
+ }
187
+
158
188
  let resolvedConversationId: string | undefined;
159
189
  if (conversationId) {
160
190
  resolvedConversationId = conversationId;
161
191
  } else if (conversationKey) {
162
192
  const mapping = getConversationByKey(conversationKey);
163
193
  resolvedConversationId = mapping?.conversationId;
164
- } else {
165
- throw new BadRequestError(
166
- "conversationKey or conversationId query parameter is required",
167
- );
168
194
  }
169
195
 
170
196
  if (!resolvedConversationId) {
@@ -266,27 +292,42 @@ export const ROUTES: RouteDefinition[] = [
266
292
  method: "GET",
267
293
  handler: handleListPendingInteractions,
268
294
  summary: "List pending interactions",
269
- description: "Return pending confirmations and secrets for a conversation.",
295
+ description:
296
+ "Return pending interactions. When conversationKey or conversationId is provided, returns details for that conversation. When neither is provided, returns all pending interactions.",
270
297
  tags: ["approvals"],
271
298
  queryParams: [
272
299
  {
273
300
  name: "conversationKey",
274
- description: "Conversation key",
301
+ description: "Conversation key (optional)",
275
302
  },
276
303
  {
277
304
  name: "conversationId",
278
- description: "Conversation ID",
305
+ description: "Conversation ID (optional)",
279
306
  },
280
307
  ],
281
308
  responseBody: z.object({
282
309
  pendingConfirmation: z
283
310
  .object({})
284
311
  .passthrough()
285
- .describe("Pending confirmation details or null"),
312
+ .describe("Pending confirmation details or null")
313
+ .optional(),
286
314
  pendingSecret: z
287
315
  .object({})
288
316
  .passthrough()
289
- .describe("Pending secret request or null"),
317
+ .describe("Pending secret request or null")
318
+ .optional(),
319
+ interactions: z
320
+ .array(
321
+ z.object({
322
+ requestId: z.string(),
323
+ conversationId: z.string(),
324
+ kind: z.string(),
325
+ toolName: z.string().optional(),
326
+ riskLevel: z.string().optional(),
327
+ }),
328
+ )
329
+ .describe("All pending interactions (returned when no filters given)")
330
+ .optional(),
290
331
  }),
291
332
  },
292
333
  ];