@vellumai/assistant 0.8.3 → 0.8.5

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 (665) hide show
  1. package/ARCHITECTURE.md +2 -2
  2. package/docker-entrypoint.sh +0 -1
  3. package/docs/browser-use-architecture-phase2.md +1 -1
  4. package/knip.json +2 -1
  5. package/node_modules/@vellumai/gateway-client/src/types.ts +2 -0
  6. package/openapi.yaml +1492 -100
  7. package/package.json +1 -1
  8. package/src/__tests__/agent-loop-exit-reason.test.ts +4 -5
  9. package/src/__tests__/agent-loop-override-profile.test.ts +1 -1
  10. package/src/__tests__/agent-loop.test.ts +88 -3
  11. package/src/__tests__/anthropic-provider.test.ts +302 -33
  12. package/src/__tests__/approval-cascade.test.ts +1 -1
  13. package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +293 -0
  14. package/src/__tests__/assistant-feature-flags-integration.test.ts +3 -3
  15. package/src/__tests__/audit-log-rotation.test.ts +70 -16
  16. package/src/__tests__/background-workers-disk-pressure.test.ts +4 -3
  17. package/src/__tests__/btw-routes.test.ts +2 -3
  18. package/src/__tests__/call-controller.test.ts +0 -1
  19. package/src/__tests__/cancel-resolves-conversation-key.test.ts +1 -1
  20. package/src/__tests__/channel-delivery-store.test.ts +193 -0
  21. package/src/__tests__/channel-guardian.test.ts +3 -3
  22. package/src/__tests__/channel-reply-delivery.test.ts +284 -5
  23. package/src/__tests__/channel-retry-sweep.test.ts +274 -1
  24. package/src/__tests__/checker.test.ts +6 -15
  25. package/src/__tests__/compaction-events.test.ts +2 -1
  26. package/src/__tests__/compactor-call-site-logging.test.ts +214 -0
  27. package/src/__tests__/compactor-preserved-tail-count.test.ts +110 -0
  28. package/src/__tests__/computer-use-skill-manifest-regression.test.ts +5 -11
  29. package/src/__tests__/computer-use-tools.test.ts +2 -4
  30. package/src/__tests__/config-watcher.test.ts +1 -1
  31. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +0 -1
  32. package/src/__tests__/context-token-estimator.test.ts +91 -1
  33. package/src/__tests__/conversation-abort-tool-results.test.ts +1 -1
  34. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +1 -1
  35. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +55 -4
  36. package/src/__tests__/conversation-agent-loop-overflow.test.ts +228 -8
  37. package/src/__tests__/conversation-agent-loop.test.ts +188 -129
  38. package/src/__tests__/conversation-app-control-instantiation.test.ts +2 -5
  39. package/src/__tests__/conversation-app-control-lifecycle.test.ts +1 -1
  40. package/src/__tests__/conversation-clean-command.test.ts +137 -0
  41. package/src/__tests__/conversation-clear-safety.test.ts +25 -25
  42. package/src/__tests__/conversation-confirmation-signals.test.ts +1 -1
  43. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +1 -1
  44. package/src/__tests__/conversation-disk-view-integration.test.ts +2 -2
  45. package/src/__tests__/conversation-error.test.ts +31 -0
  46. package/src/__tests__/conversation-fork-crud.test.ts +324 -0
  47. package/src/__tests__/conversation-lifecycle.test.ts +53 -12
  48. package/src/__tests__/conversation-load-history-repair.test.ts +1 -1
  49. package/src/__tests__/conversation-load-history-stripped.test.ts +279 -0
  50. package/src/__tests__/conversation-pairing.test.ts +2 -2
  51. package/src/__tests__/conversation-process-callsite.test.ts +1 -1
  52. package/src/__tests__/conversation-provider-retry-repair.test.ts +2 -1
  53. package/src/__tests__/conversation-queue.test.ts +1 -1
  54. package/src/__tests__/conversation-routes-disk-view.test.ts +109 -0
  55. package/src/__tests__/conversation-routes-slash-commands.test.ts +35 -0
  56. package/src/__tests__/conversation-runtime-assembly.test.ts +264 -81
  57. package/src/__tests__/conversation-seed-composer.test.ts +66 -4
  58. package/src/__tests__/conversation-skill-tools.test.ts +2 -5
  59. package/src/__tests__/conversation-slash-commands.test.ts +36 -8
  60. package/src/__tests__/conversation-slash-queue.test.ts +1 -1
  61. package/src/__tests__/conversation-slash-unknown.test.ts +1 -1
  62. package/src/__tests__/conversation-speed-override.test.ts +1 -1
  63. package/src/__tests__/conversation-store.test.ts +1 -1
  64. package/src/__tests__/conversation-surfaces-task-progress.test.ts +220 -0
  65. package/src/__tests__/conversation-sync-tags.test.ts +99 -32
  66. package/src/__tests__/conversation-workspace-cache-state.test.ts +2 -1
  67. package/src/__tests__/conversation-workspace-injection.test.ts +5 -1
  68. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +5 -1
  69. package/src/__tests__/credential-execution-feature-gates.test.ts +9 -7
  70. package/src/__tests__/credential-execution-tools.test.ts +6 -6
  71. package/src/__tests__/credential-security-invariants.test.ts +7 -0
  72. package/src/__tests__/credential-vault-unit.test.ts +2 -2
  73. package/src/__tests__/cu-unified-flow.test.ts +10 -1
  74. package/src/__tests__/dm-backfill.test.ts +64 -0
  75. package/src/__tests__/dm-persistence.test.ts +33 -0
  76. package/src/__tests__/document-find-replace.test.ts +501 -0
  77. package/src/__tests__/dynamic-page-surface.test.ts +2 -2
  78. package/src/__tests__/email-html-renderer.test.ts +12 -0
  79. package/src/__tests__/first-greeting.test.ts +23 -2
  80. package/src/__tests__/gateway-flag-listener.test.ts +237 -0
  81. package/src/__tests__/gemini-provider.test.ts +78 -0
  82. package/src/__tests__/guardian-dispatch.test.ts +0 -1
  83. package/src/__tests__/guardian-outbound-http.test.ts +7 -5
  84. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +1 -1
  85. package/src/__tests__/headless-browser-navigate.test.ts +172 -0
  86. package/src/__tests__/heartbeat-disk-pressure.test.ts +4 -0
  87. package/src/__tests__/heartbeat-service.test.ts +4 -0
  88. package/src/__tests__/host-bash-proxy.test.ts +6 -0
  89. package/src/__tests__/host-browser-proxy.test.ts +10 -0
  90. package/src/__tests__/host-cu-proxy.test.ts +8 -1
  91. package/src/__tests__/host-file-proxy.test.ts +8 -1
  92. package/src/__tests__/host-shell-tool.test.ts +1 -1
  93. package/src/__tests__/host-transfer-proxy.test.ts +8 -1
  94. package/src/__tests__/identity-routes.test.ts +57 -0
  95. package/src/__tests__/inbound-slack-persistence.test.ts +3 -0
  96. package/src/__tests__/init-feature-flag-overrides.test.ts +5 -6
  97. package/src/__tests__/injector-chain.test.ts +2 -0
  98. package/src/__tests__/injector-document-comments.test.ts +378 -0
  99. package/src/__tests__/injector-pkb-v2-silenced.test.ts +4 -25
  100. package/src/__tests__/list-messages-attachments.test.ts +21 -17
  101. package/src/__tests__/list-messages-hidden-metadata.test.ts +217 -0
  102. package/src/__tests__/list-messages-page-latest.test.ts +130 -14
  103. package/src/__tests__/list-messages-tool-merge.test.ts +77 -17
  104. package/src/__tests__/llm-context-normalization.test.ts +0 -2
  105. package/src/__tests__/llm-request-log-call-site.test.ts +136 -0
  106. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +26 -0
  107. package/src/__tests__/llm-resolver.test.ts +161 -9
  108. package/src/__tests__/llm-usage-store.test.ts +66 -0
  109. package/src/__tests__/log-export-routes.test.ts +99 -2
  110. package/src/__tests__/logger.test.ts +89 -0
  111. package/src/__tests__/mcp-abort-signal.test.ts +2 -2
  112. package/src/__tests__/media-generate-image.test.ts +31 -0
  113. package/src/__tests__/memory-v2-static-injector.test.ts +7 -7
  114. package/src/__tests__/message-queue-steer.test.ts +114 -0
  115. package/src/__tests__/model-intents.test.ts +2 -4
  116. package/src/__tests__/notification-guardian-path.test.ts +0 -1
  117. package/src/__tests__/onboarding-template-contract.test.ts +1 -1
  118. package/src/__tests__/openai-provider.test.ts +151 -0
  119. package/src/__tests__/openai-responses-provider.test.ts +118 -16
  120. package/src/__tests__/outbound-slack-persistence.test.ts +187 -20
  121. package/src/__tests__/pending-interactions-resolved-event.test.ts +189 -0
  122. package/src/__tests__/platform-bash-auto-approve.test.ts +2 -2
  123. package/src/__tests__/platform.test.ts +2 -5
  124. package/src/__tests__/plugin-api-tool-definition.test.ts +92 -0
  125. package/src/__tests__/plugin-bootstrap.test.ts +2 -2
  126. package/src/__tests__/plugin-source-watcher.test.ts +302 -0
  127. package/src/__tests__/plugin-tool-contribution.test.ts +13 -6
  128. package/src/__tests__/plugin-types.test.ts +3 -2
  129. package/src/__tests__/prechat-onboarding-contract.test.ts +131 -98
  130. package/src/__tests__/pricing.test.ts +12 -0
  131. package/src/__tests__/process-message-background-slack.test.ts +1 -51
  132. package/src/__tests__/process-message-display-content.test.ts +21 -16
  133. package/src/__tests__/prune-jobs-changes-parser.test.ts +61 -0
  134. package/src/__tests__/registry.test.ts +2 -8
  135. package/src/__tests__/require-fresh-approval.test.ts +2 -2
  136. package/src/__tests__/runtime-events-sse-bilingual.test.ts +154 -0
  137. package/src/__tests__/server-history-render.test.ts +83 -4
  138. package/src/__tests__/shell-tool-proxy-mode.test.ts +1 -1
  139. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  140. package/src/__tests__/skill-projection-feature-flag.test.ts +4 -7
  141. package/src/__tests__/skill-projection.benchmark.test.ts +2 -6
  142. package/src/__tests__/skill-tool-factory.test.ts +1 -1
  143. package/src/__tests__/steer-tool-repair.test.ts +249 -0
  144. package/src/__tests__/subagent-notify-parent.test.ts +1 -1
  145. package/src/__tests__/suggestion-routes.test.ts +1 -0
  146. package/src/__tests__/sync-message-contract.test.ts +59 -0
  147. package/src/__tests__/system-prompt.test.ts +161 -124
  148. package/src/__tests__/terminal-tools.test.ts +12 -2
  149. package/src/__tests__/thinking-block-replay.test.ts +113 -0
  150. package/src/__tests__/thread-backfill.test.ts +370 -22
  151. package/src/__tests__/tool-approval-handler.test.ts +1 -5
  152. package/src/__tests__/tool-execute-pipeline.test.ts +2 -2
  153. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +2 -5
  154. package/src/__tests__/tool-executor-lifecycle-events.test.ts +15 -5
  155. package/src/__tests__/tool-executor.test.ts +89 -53
  156. package/src/__tests__/tool-grant-request-escalation.test.ts +1 -6
  157. package/src/__tests__/tool-result-metadata-plumbing.test.ts +167 -0
  158. package/src/__tests__/trusted-contact-approval-notifier.test.ts +0 -1
  159. package/src/__tests__/trusted-contact-inline-approval-integration.test.ts +1 -6
  160. package/src/__tests__/trusted-contact-multichannel.test.ts +0 -1
  161. package/src/__tests__/twilio-routes.test.ts +1 -1
  162. package/src/__tests__/ui-file-upload-surface.test.ts +2 -2
  163. package/src/__tests__/usage-routes.test.ts +3 -0
  164. package/src/__tests__/verification-control-plane-policy.test.ts +2 -2
  165. package/src/__tests__/web-fetch.test.ts +2 -2
  166. package/src/__tests__/workspace-git-service.test.ts +94 -10
  167. package/src/__tests__/workspace-migration-088-deprecate-background-conversation-override.test.ts +158 -0
  168. package/src/__tests__/workspace-migration-089-move-memory-tree-out-of-v3.test.ts +86 -0
  169. package/src/acp/__tests__/prepare-agent-env.test.ts +146 -0
  170. package/src/acp/prepare-agent-env.ts +78 -0
  171. package/src/acp/session-manager.ts +1 -1
  172. package/src/agent/attachments.ts +1 -0
  173. package/src/agent/loop.ts +65 -20
  174. package/src/api/README.md +5 -0
  175. package/src/api/index.ts +4 -0
  176. package/src/api/package.json +10 -0
  177. package/src/background-wake/background-wake-routes.test.ts +233 -0
  178. package/src/background-wake/next-wake.test.ts +289 -0
  179. package/src/background-wake/next-wake.ts +172 -0
  180. package/src/background-wake/runtime-registry.ts +24 -0
  181. package/src/browser/operations.ts +15 -0
  182. package/src/cli/commands/__tests__/browser.test.ts +23 -5
  183. package/src/cli/commands/__tests__/conversations-slack.test.ts +572 -0
  184. package/src/cli/commands/__tests__/domain-register.test.ts +110 -0
  185. package/src/cli/commands/__tests__/domain-status.test.ts +33 -33
  186. package/src/cli/commands/__tests__/inference-send.test.ts +108 -5
  187. package/src/cli/commands/__tests__/memory-v2-compare-render.test.ts +98 -0
  188. package/src/cli/commands/__tests__/memory-v2.test.ts +10 -12
  189. package/src/cli/commands/__tests__/memory-v3-render.test.ts +340 -0
  190. package/src/cli/commands/browser.ts +247 -0
  191. package/src/cli/commands/conversations.ts +128 -1
  192. package/src/cli/commands/domain.ts +91 -41
  193. package/src/cli/commands/inference-providers.ts +147 -1
  194. package/src/cli/commands/inference.ts +93 -40
  195. package/src/cli/commands/memory-v2-compare-render.ts +115 -0
  196. package/src/cli/commands/memory-v2.ts +483 -0
  197. package/src/cli/commands/memory-v3-render.ts +344 -0
  198. package/src/cli/commands/memory-v3.ts +316 -0
  199. package/src/cli/commands/notifications.ts +24 -2
  200. package/src/cli/program.ts +2 -0
  201. package/src/cli/utils/conversation-id.ts +17 -5
  202. package/src/config/assistant-feature-flags.ts +21 -9
  203. package/src/config/bundled-skills/app-builder/SKILL.md +2 -2
  204. package/src/config/bundled-skills/document-editor/SKILL.md +124 -0
  205. package/src/config/bundled-skills/document-editor/TOOLS.json +258 -0
  206. package/src/config/bundled-skills/document-editor/tools/comment-list.ts +12 -0
  207. package/src/config/bundled-skills/document-editor/tools/comment-reply.ts +12 -0
  208. package/src/config/bundled-skills/document-editor/tools/comment-resolve.ts +12 -0
  209. package/src/config/bundled-skills/document-editor/tools/document-find.ts +12 -0
  210. package/src/config/bundled-skills/document-editor/tools/document-open.ts +12 -0
  211. package/src/config/bundled-skills/document-editor/tools/document-replace-text.ts +12 -0
  212. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  213. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +2 -2
  214. package/src/config/bundled-skills/media-processing/SKILL.md +8 -0
  215. package/src/config/bundled-skills/media-processing/tools/ingest-media.ts +13 -8
  216. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +10 -3
  217. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +16 -14
  218. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +7 -2
  219. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +7 -2
  220. package/src/config/bundled-skills/schedule/SKILL.md +8 -0
  221. package/src/config/bundled-tool-registry.ts +24 -12
  222. package/src/config/call-site-defaults.ts +20 -0
  223. package/src/config/feature-flag-registry.json +115 -3
  224. package/src/config/llm-resolver.ts +16 -2
  225. package/src/config/schemas/__tests__/memory-v2.test.ts +217 -1
  226. package/src/config/schemas/call-site-catalog.ts +35 -0
  227. package/src/config/schemas/llm.ts +14 -0
  228. package/src/config/schemas/memory-v2.ts +294 -1
  229. package/src/config/schemas/memory.ts +2 -1
  230. package/src/context/compactor.ts +60 -1
  231. package/src/context/token-estimator.ts +47 -4
  232. package/src/context/window-manager.ts +25 -0
  233. package/src/conversations/__tests__/message-consolidation.test.ts +350 -0
  234. package/src/conversations/message-consolidation.ts +404 -0
  235. package/src/credential-health/credential-health-service.ts +34 -19
  236. package/src/daemon/__tests__/conversation-tool-setup-exclude.test.ts +1 -1
  237. package/src/daemon/__tests__/conversation-tool-setup.test.ts +66 -6
  238. package/src/daemon/__tests__/meet-manifest-loader.test.ts +1 -1
  239. package/src/daemon/__tests__/native-web-search-metadata.test.ts +357 -0
  240. package/src/daemon/__tests__/web-search-status-text.test.ts +287 -0
  241. package/src/daemon/conversation-agent-loop-handlers.ts +155 -36
  242. package/src/daemon/conversation-agent-loop.ts +307 -88
  243. package/src/daemon/conversation-error.ts +31 -1
  244. package/src/daemon/conversation-lifecycle.ts +149 -118
  245. package/src/daemon/conversation-messaging.ts +3 -0
  246. package/src/daemon/conversation-process.ts +273 -0
  247. package/src/daemon/conversation-queue-manager.ts +14 -0
  248. package/src/daemon/conversation-runtime-assembly.ts +145 -84
  249. package/src/daemon/conversation-slash.ts +37 -5
  250. package/src/daemon/conversation-surfaces.ts +45 -2
  251. package/src/daemon/conversation-tool-setup.ts +70 -3
  252. package/src/daemon/conversation-usage.ts +2 -0
  253. package/src/daemon/conversation.ts +54 -32
  254. package/src/daemon/disk-pressure-guard.ts +14 -2
  255. package/src/daemon/first-greeting.ts +10 -0
  256. package/src/daemon/handlers/__tests__/config-a2a-accept.test.ts +498 -0
  257. package/src/daemon/handlers/config-a2a.ts +160 -0
  258. package/src/daemon/handlers/config-model.test.ts +2 -0
  259. package/src/daemon/handlers/conversations.ts +90 -3
  260. package/src/daemon/handlers/shared.ts +92 -29
  261. package/src/daemon/host-bash-proxy.ts +1 -1
  262. package/src/daemon/host-browser-proxy.ts +5 -5
  263. package/src/daemon/host-cu-proxy.ts +5 -5
  264. package/src/daemon/host-file-proxy.ts +5 -5
  265. package/src/daemon/host-proxy-base.ts +4 -4
  266. package/src/daemon/host-transfer-proxy.ts +11 -11
  267. package/src/daemon/lifecycle.ts +40 -23
  268. package/src/daemon/meet-manifest-loader.ts +1 -7
  269. package/src/daemon/message-protocol.ts +4 -0
  270. package/src/daemon/message-types/conversations.ts +14 -9
  271. package/src/daemon/message-types/document-comments.ts +50 -0
  272. package/src/daemon/message-types/home.ts +1 -13
  273. package/src/daemon/message-types/messages.ts +66 -7
  274. package/src/daemon/message-types/surfaces.ts +3 -1
  275. package/src/daemon/message-types/sync.ts +14 -0
  276. package/src/daemon/message-types/web-activity.ts +57 -0
  277. package/src/daemon/plugin-source-watcher.ts +135 -3
  278. package/src/daemon/process-message.ts +69 -12
  279. package/src/daemon/shutdown-handlers.ts +24 -5
  280. package/src/daemon/switch-inference-profile-tool.ts +52 -0
  281. package/src/daemon/tool-setup-types.ts +13 -0
  282. package/src/daemon/trust-context.ts +6 -0
  283. package/src/documents/document-comments-store.test.ts +338 -0
  284. package/src/documents/document-comments-store.ts +237 -0
  285. package/src/documents/document-store.ts +202 -0
  286. package/src/events/relationship-state-updated.ts +25 -0
  287. package/src/heartbeat/__tests__/heartbeat-service.test.ts +1 -2
  288. package/src/heartbeat/heartbeat-service.ts +1 -0
  289. package/src/home/__tests__/suggested-prompts.test.ts +33 -2
  290. package/src/home/feed-types.ts +6 -1
  291. package/src/home/home-content-refresh.ts +52 -0
  292. package/src/home/home-greeting-cache.ts +69 -0
  293. package/src/home/home-greeting.ts +85 -0
  294. package/src/home/suggested-prompts.ts +168 -9
  295. package/src/ipc/gateway-flag-listener.ts +123 -0
  296. package/src/ipc/skill-routes/registries.ts +8 -12
  297. package/src/memory/__tests__/db-async-query.test.ts +165 -0
  298. package/src/memory/__tests__/db-maintenance.test.ts +115 -0
  299. package/src/memory/__tests__/jobs-store-enqueue-gate.test.ts +241 -0
  300. package/src/memory/__tests__/jobs-store-job-classes.test.ts +28 -1
  301. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +135 -2
  302. package/src/memory/__tests__/memory-retrospective-job.test.ts +327 -6
  303. package/src/memory/auto-analysis-enqueue.ts +5 -1
  304. package/src/memory/conversation-crud.ts +191 -100
  305. package/src/memory/conversation-starters-cadence.ts +3 -1
  306. package/src/memory/conversation-title-service.ts +19 -3
  307. package/src/memory/db-async-query.ts +214 -0
  308. package/src/memory/db-init.ts +26 -0
  309. package/src/memory/db-maintenance.ts +30 -21
  310. package/src/memory/delivery-crud.ts +41 -0
  311. package/src/memory/delivery-status.ts +141 -15
  312. package/src/memory/external-conversation-store.ts +32 -1
  313. package/src/memory/graph/bootstrap.ts +8 -1
  314. package/src/memory/graph/capability-seed.ts +7 -3
  315. package/src/memory/graph/conversation-graph-memory.ts +100 -17
  316. package/src/memory/graph/extraction.ts +1 -5
  317. package/src/memory/graph/graph-search.ts +7 -1
  318. package/src/memory/indexer.ts +28 -18
  319. package/src/memory/job-handlers/cleanup.ts +76 -18
  320. package/src/memory/job-handlers/conversation-starters.ts +1 -4
  321. package/src/memory/jobs/embed-pkb-file.ts +6 -1
  322. package/src/memory/jobs-store.ts +14 -0
  323. package/src/memory/jobs-worker.ts +68 -15
  324. package/src/memory/llm-request-log-source-clickhouse.ts +42 -2
  325. package/src/memory/llm-request-log-source-local.ts +7 -0
  326. package/src/memory/llm-request-log-source.ts +9 -2
  327. package/src/memory/llm-request-log-store.ts +43 -1
  328. package/src/memory/llm-usage-store.ts +24 -0
  329. package/src/memory/memory-retrospective-constants.ts +28 -0
  330. package/src/memory/memory-retrospective-enqueue.ts +11 -3
  331. package/src/memory/memory-retrospective-job.ts +413 -18
  332. package/src/memory/memory-retrospective-startup-cleanup.ts +3 -3
  333. package/src/memory/memory-v2-activation-log-store.ts +41 -14
  334. package/src/memory/migrations/100-core-tables.ts +1 -0
  335. package/src/memory/migrations/109-external-conversation-bindings.ts +1 -0
  336. package/src/memory/migrations/253-conversation-last-notified-profile.ts +15 -0
  337. package/src/memory/migrations/253-document-comments.ts +47 -0
  338. package/src/memory/migrations/254-external-conversation-binding-chat-name.ts +43 -0
  339. package/src/memory/migrations/255-channel-inbound-delivery-attempts.ts +24 -0
  340. package/src/memory/migrations/256-memory-v2-injection-events.ts +113 -0
  341. package/src/memory/migrations/257-strip-base-url-non-openai-compatible.ts +22 -0
  342. package/src/memory/migrations/258-onboarding-events-prior-assistants.ts +13 -0
  343. package/src/memory/migrations/259-conversation-cleaned-at.ts +33 -0
  344. package/src/memory/migrations/260-rename-cleaned-at.ts +44 -0
  345. package/src/memory/migrations/261-llm-usage-add-raw-usage.ts +36 -0
  346. package/src/memory/migrations/262-memory-v3-coactivation.ts +57 -0
  347. package/src/memory/migrations/263-memory-v3-auto-edges.ts +50 -0
  348. package/src/memory/migrations/264-llm-request-log-call-site.ts +29 -0
  349. package/src/memory/migrations/index.ts +34 -0
  350. package/src/memory/migrations/registry.ts +58 -0
  351. package/src/memory/onboarding-events-store.ts +7 -0
  352. package/src/memory/schema/calls.ts +1 -0
  353. package/src/memory/schema/conversations.ts +3 -0
  354. package/src/memory/schema/infrastructure.ts +22 -0
  355. package/src/memory/tool-usage-store.ts +36 -8
  356. package/src/memory/v2/__tests__/consolidation-job.test.ts +1 -0
  357. package/src/memory/v2/__tests__/harness-compare.test.ts +186 -0
  358. package/src/memory/v2/__tests__/harness-metrics.test.ts +74 -0
  359. package/src/memory/v2/__tests__/harness-oracle.test.ts +257 -0
  360. package/src/memory/v2/__tests__/harness-replay-input.test.ts +225 -0
  361. package/src/memory/v2/__tests__/harness-runner.test.ts +109 -0
  362. package/src/memory/v2/__tests__/injection-events.test.ts +318 -0
  363. package/src/memory/v2/__tests__/injection.test.ts +158 -112
  364. package/src/memory/v2/__tests__/page-index.test.ts +365 -1
  365. package/src/memory/v2/__tests__/qdrant.test.ts +36 -0
  366. package/src/memory/v2/__tests__/router.test.ts +660 -4
  367. package/src/memory/v2/consolidation-job.ts +14 -0
  368. package/src/memory/v2/harness/compare.ts +57 -0
  369. package/src/memory/v2/harness/metrics.ts +124 -0
  370. package/src/memory/v2/harness/oracle.ts +145 -0
  371. package/src/memory/v2/harness/replay-input.ts +224 -0
  372. package/src/memory/v2/harness/retriever.ts +74 -0
  373. package/src/memory/v2/harness/router-retriever.ts +43 -0
  374. package/src/memory/v2/harness/runner.ts +106 -0
  375. package/src/memory/v2/harness/trace.ts +58 -0
  376. package/src/memory/v2/injection-events.ts +101 -0
  377. package/src/memory/v2/injection.ts +42 -25
  378. package/src/memory/v2/page-index.ts +209 -7
  379. package/src/memory/v2/page-store.ts +18 -0
  380. package/src/memory/v2/prompts/router.ts +26 -1
  381. package/src/memory/v2/qdrant.ts +14 -2
  382. package/src/memory/v2/router.ts +369 -62
  383. package/src/memory/v3/__tests__/coactivation-store.test.ts +422 -0
  384. package/src/memory/v3/__tests__/consolidation-job.test.ts +468 -0
  385. package/src/memory/v3/__tests__/edge-learning-job.test.ts +324 -0
  386. package/src/memory/v3/__tests__/edges.test.ts +563 -0
  387. package/src/memory/v3/__tests__/filter.test.ts +512 -0
  388. package/src/memory/v3/__tests__/gate.test.ts +574 -0
  389. package/src/memory/v3/__tests__/index-composition.test.ts +233 -0
  390. package/src/memory/v3/__tests__/loop.test.ts +530 -0
  391. package/src/memory/v3/__tests__/retriever.test.ts +226 -0
  392. package/src/memory/v3/__tests__/scouts.test.ts +440 -0
  393. package/src/memory/v3/__tests__/shadow-middleware.test.ts +312 -0
  394. package/src/memory/v3/__tests__/system-prompts.test.ts +154 -0
  395. package/src/memory/v3/__tests__/traversal.test.ts +469 -0
  396. package/src/memory/v3/__tests__/tree-index.test.ts +280 -0
  397. package/src/memory/v3/__tests__/tree-store.test.ts +529 -0
  398. package/src/memory/v3/__tests__/tree-walk.test.ts +707 -0
  399. package/src/memory/v3/__tests__/validate.test.ts +245 -0
  400. package/src/memory/v3/auto-edges.ts +223 -0
  401. package/src/memory/v3/coactivation-store.ts +124 -0
  402. package/src/memory/v3/consolidation-job.ts +323 -0
  403. package/src/memory/v3/edge-learning-job.ts +160 -0
  404. package/src/memory/v3/edges.ts +249 -0
  405. package/src/memory/v3/filter.ts +281 -0
  406. package/src/memory/v3/gate.ts +334 -0
  407. package/src/memory/v3/index-composition.ts +113 -0
  408. package/src/memory/v3/llm-capture.ts +46 -0
  409. package/src/memory/v3/loop.ts +382 -0
  410. package/src/memory/v3/maintenance.ts +144 -0
  411. package/src/memory/v3/prompt-context.ts +33 -0
  412. package/src/memory/v3/prompts/consolidation.ts +458 -0
  413. package/src/memory/v3/prompts/system-prompts.ts +196 -0
  414. package/src/memory/v3/retriever.ts +33 -0
  415. package/src/memory/v3/scouts.ts +420 -0
  416. package/src/memory/v3/shadow-middleware.ts +305 -0
  417. package/src/memory/v3/traversal.ts +206 -0
  418. package/src/memory/v3/tree-index.ts +237 -0
  419. package/src/memory/v3/tree-store.ts +394 -0
  420. package/src/memory/v3/tree-walk.ts +351 -0
  421. package/src/memory/v3/types.ts +65 -0
  422. package/src/memory/v3/validate.ts +300 -0
  423. package/src/messaging/providers/index.ts +7 -1
  424. package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +329 -3
  425. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +34 -1
  426. package/src/messaging/providers/slack/adapter.ts +178 -25
  427. package/src/messaging/providers/slack/api.test.ts +54 -0
  428. package/src/messaging/providers/slack/api.ts +119 -3
  429. package/src/messaging/providers/slack/client.ts +12 -0
  430. package/src/messaging/providers/slack/deep-link.ts +20 -1
  431. package/src/messaging/providers/slack/message-metadata.test.ts +48 -0
  432. package/src/messaging/providers/slack/message-metadata.ts +156 -0
  433. package/src/messaging/providers/slack/render-transcript.test.ts +107 -75
  434. package/src/messaging/providers/slack/render-transcript.ts +176 -49
  435. package/src/messaging/providers/slack/send.test.ts +77 -0
  436. package/src/messaging/providers/slack/send.ts +8 -2
  437. package/src/messaging/providers/slack/types.ts +14 -0
  438. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +4 -1
  439. package/src/notifications/__tests__/home-feed-side-effect.test.ts +116 -54
  440. package/src/notifications/adapters/macos.ts +18 -1
  441. package/src/notifications/adapters/platform.ts +1 -1
  442. package/src/notifications/conversation-seed-composer.ts +14 -2
  443. package/src/notifications/decision-engine.ts +1 -4
  444. package/src/notifications/deferred-emit.ts +135 -0
  445. package/src/notifications/emit-signal.ts +38 -50
  446. package/src/notifications/home-feed-side-effect.ts +60 -30
  447. package/src/oauth/connect-orchestrator.ts +3 -0
  448. package/src/oauth/credential-token-resolver.ts +2 -0
  449. package/src/oauth/manual-token-connection.ts +19 -0
  450. package/src/oauth/oauth-store.ts +12 -0
  451. package/src/oauth/seed-providers.ts +22 -0
  452. package/src/permissions/prompter.ts +8 -5
  453. package/src/permissions/question-prompter.ts +5 -2
  454. package/src/permissions/secret-prompter.ts +6 -3
  455. package/src/plugin-api/index.ts +4 -0
  456. package/src/plugin-api/types.ts +7 -33
  457. package/src/plugins/defaults/index.ts +6 -0
  458. package/src/plugins/defaults/injectors.ts +100 -20
  459. package/src/plugins/external-plugin-loader.ts +5 -68
  460. package/src/plugins/types.ts +11 -16
  461. package/src/proactive-artifact/aux-message-injector.ts +17 -4
  462. package/src/prompts/__tests__/system-prompt.test.ts +46 -2
  463. package/src/prompts/__tests__/task-progress-hint-section.test.ts +3 -9
  464. package/src/prompts/normalize-onboarding.ts +40 -0
  465. package/src/prompts/persona-resolver.ts +36 -21
  466. package/src/prompts/sections.ts +69 -19
  467. package/src/prompts/system-prompt.ts +118 -216
  468. package/src/prompts/template-detection.ts +37 -0
  469. package/src/prompts/templates/BOOTSTRAP-CONTENT-AUTOMATION.md +141 -0
  470. package/src/prompts/templates/BOOTSTRAP.md +10 -2
  471. package/src/prompts/templates/VOICE.md +3 -0
  472. package/src/prompts/templates/system-sections.ts +281 -9
  473. package/src/providers/__tests__/connection-model-compat.test.ts +234 -0
  474. package/src/providers/__tests__/retry-callsite.test.ts +85 -5
  475. package/src/providers/anthropic/client.ts +159 -66
  476. package/src/providers/call-site-routing.ts +14 -2
  477. package/src/providers/connection-model-compat.ts +38 -0
  478. package/src/providers/connection-resolution.ts +16 -2
  479. package/src/providers/fireworks/client.ts +20 -2
  480. package/src/providers/gemini/client.ts +49 -6
  481. package/src/providers/inference/__tests__/base-url-route-validation.test.ts +342 -0
  482. package/src/providers/inference/__tests__/base-url-security.test.ts +189 -0
  483. package/src/providers/inference/__tests__/codex-token-refresh.test.ts +254 -0
  484. package/src/providers/inference/adapter-factory.ts +18 -1
  485. package/src/providers/inference/auth.ts +3 -3
  486. package/src/providers/inference/codex-token-refresh.ts +128 -0
  487. package/src/providers/inference/resolve-auth.ts +49 -6
  488. package/src/providers/minimax/client.ts +106 -0
  489. package/src/providers/model-catalog.ts +91 -1
  490. package/src/providers/model-intents.ts +1 -1
  491. package/src/providers/openai/chat-completions-provider.ts +63 -23
  492. package/src/providers/openai/codex-models.ts +18 -0
  493. package/src/providers/openai/responses-provider.ts +86 -23
  494. package/src/providers/openrouter/client.ts +5 -1
  495. package/src/providers/provider-send-message.ts +7 -1
  496. package/src/providers/retry.ts +34 -3
  497. package/src/providers/thinking-config.ts +26 -1
  498. package/src/providers/types.ts +25 -0
  499. package/src/providers/usage-tracking.ts +2 -0
  500. package/src/runtime/AGENTS.md +2 -2
  501. package/src/runtime/__tests__/agent-wake.test.ts +214 -0
  502. package/src/runtime/__tests__/background-job-runner.test.ts +128 -0
  503. package/src/runtime/agent-wake.ts +152 -56
  504. package/src/runtime/assistant-event-hub.ts +76 -6
  505. package/src/runtime/auth/route-policy.ts +43 -3
  506. package/src/runtime/background-job-runner.ts +26 -0
  507. package/src/runtime/btw-sidechain.ts +0 -6
  508. package/src/runtime/channel-reply-delivery.ts +182 -47
  509. package/src/runtime/channel-retry-sweep.ts +141 -16
  510. package/src/runtime/http-types.ts +7 -6
  511. package/src/runtime/migrations/vbundle-builder.ts +10 -3
  512. package/src/runtime/pending-interactions.ts +50 -8
  513. package/src/runtime/routes/__tests__/content-source-routes.test.ts +162 -0
  514. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +161 -1
  515. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +14 -0
  516. package/src/runtime/routes/__tests__/memory-v2-simulate-route.test.ts +290 -0
  517. package/src/runtime/routes/__tests__/plugins-routes.test.ts +512 -0
  518. package/src/runtime/routes/__tests__/sanity-routes.test.ts +280 -0
  519. package/src/runtime/routes/__tests__/slack-channel-routes.test.ts +266 -0
  520. package/src/runtime/routes/acp-routes.test.ts +255 -6
  521. package/src/runtime/routes/acp-routes.ts +8 -1
  522. package/src/runtime/routes/approval-routes.ts +4 -1
  523. package/src/runtime/routes/avatar-routes.ts +10 -10
  524. package/src/runtime/routes/background-wake-routes.ts +188 -0
  525. package/src/runtime/routes/browser-tabs-routes.ts +200 -0
  526. package/src/runtime/routes/btw-routes.ts +0 -6
  527. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +246 -0
  528. package/src/runtime/routes/content-source-routes.ts +78 -0
  529. package/src/runtime/routes/conversation-cli-routes.ts +147 -2
  530. package/src/runtime/routes/conversation-list-routes.ts +12 -4
  531. package/src/runtime/routes/conversation-management-routes.ts +77 -20
  532. package/src/runtime/routes/conversation-query-routes.ts +196 -31
  533. package/src/runtime/routes/conversation-routes.ts +472 -425
  534. package/src/runtime/routes/conversation-starter-routes.ts +6 -3
  535. package/src/runtime/routes/disk-pressure-routes.ts +1 -1
  536. package/src/runtime/routes/document-comments-routes.ts +287 -0
  537. package/src/runtime/routes/documents-routes.ts +33 -0
  538. package/src/runtime/routes/domain-routes.ts +60 -10
  539. package/src/runtime/routes/email-routes.ts +5 -2
  540. package/src/runtime/routes/events-routes.ts +54 -10
  541. package/src/runtime/routes/group-routes.ts +24 -8
  542. package/src/runtime/routes/home-feed-routes.ts +6 -3
  543. package/src/runtime/routes/host-app-control-routes.ts +1 -1
  544. package/src/runtime/routes/host-browser-routes.ts +17 -2
  545. package/src/runtime/routes/host-cu-routes.ts +2 -2
  546. package/src/runtime/routes/identity-routes.ts +21 -0
  547. package/src/runtime/routes/inbound-message-handler.ts +288 -58
  548. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +96 -3
  549. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +365 -6
  550. package/src/runtime/routes/inbound-stages/background-dispatch.ts +283 -82
  551. package/src/runtime/routes/index.ts +20 -4
  552. package/src/runtime/routes/inference-profile-session-handler.ts +22 -12
  553. package/src/runtime/routes/inference-profile-session-routes.ts +7 -1
  554. package/src/runtime/routes/inference-provider-connection-routes.ts +63 -7
  555. package/src/runtime/routes/integrations/a2a.ts +60 -1
  556. package/src/runtime/routes/llm-call-sites-routes.ts +32 -5
  557. package/src/runtime/routes/log-export-routes.ts +39 -0
  558. package/src/runtime/routes/memory-item-routes.ts +8 -3
  559. package/src/runtime/routes/memory-v2-routes.ts +427 -0
  560. package/src/runtime/routes/memory-v3-routes.ts +316 -0
  561. package/src/runtime/routes/migration-routes.ts +21 -24
  562. package/src/runtime/routes/notification-routes.ts +19 -2
  563. package/src/runtime/routes/plugins-routes.ts +337 -0
  564. package/src/runtime/routes/question-routes.ts +4 -1
  565. package/src/runtime/routes/rename-conversation-routes.ts +6 -2
  566. package/src/runtime/routes/sanity-routes.ts +159 -0
  567. package/src/runtime/routes/secret-routes.ts +25 -5
  568. package/src/runtime/routes/settings-routes.ts +12 -11
  569. package/src/runtime/routes/slack-channel-routes.ts +188 -0
  570. package/src/runtime/routes/workspace-routes.ts +25 -10
  571. package/src/runtime/services/conversation-serializer.ts +30 -4
  572. package/src/runtime/sync/resource-sync-events.ts +106 -38
  573. package/src/runtime/sync/sync-publisher.test.ts +49 -0
  574. package/src/runtime/sync/sync-publisher.ts +2 -1
  575. package/src/runtime/verification-outbound-actions.ts +73 -1
  576. package/src/schedule/integration-status.ts +3 -1
  577. package/src/security/__tests__/oauth2-device-code.test.ts +479 -0
  578. package/src/security/oauth2-device-code.ts +307 -0
  579. package/src/security/oauth2.ts +26 -9
  580. package/src/security/secure-keys.ts +5 -0
  581. package/src/skills/catalog-install.ts +6 -2
  582. package/src/telemetry/types.ts +12 -0
  583. package/src/telemetry/usage-telemetry-reporter.test.ts +48 -0
  584. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  585. package/src/tools/acp/spawn.test.ts +119 -0
  586. package/src/tools/acp/spawn.ts +15 -2
  587. package/src/tools/apps/definitions.ts +2 -8
  588. package/src/tools/ask-question/ask-question-tool.test.ts +3 -3
  589. package/src/tools/ask-question/ask-question-tool.ts +38 -45
  590. package/src/tools/browser/__tests__/pinned-tabs.test.ts +150 -0
  591. package/src/tools/browser/browser-execution.ts +106 -0
  592. package/src/tools/browser/cdp-client/__tests__/browser-tabs-factory.test.ts +402 -0
  593. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +28 -0
  594. package/src/tools/browser/cdp-client/__tests__/types.test.ts +4 -0
  595. package/src/tools/browser/cdp-client/cdp-inspect-client.ts +22 -0
  596. package/src/tools/browser/cdp-client/extension-cdp-client.ts +42 -2
  597. package/src/tools/browser/cdp-client/factory.ts +171 -4
  598. package/src/tools/browser/cdp-client/local-cdp-client.ts +21 -0
  599. package/src/tools/browser/cdp-client/types.ts +101 -0
  600. package/src/tools/browser/pinned-tabs.ts +146 -0
  601. package/src/tools/computer-use/definitions.ts +22 -78
  602. package/src/tools/credential-execution/make-authenticated-request.ts +3 -9
  603. package/src/tools/credential-execution/manage-secure-command-tool.ts +3 -9
  604. package/src/tools/credential-execution/run-authenticated-command.ts +3 -9
  605. package/src/tools/credentials/vault.ts +3 -9
  606. package/src/tools/document/document-comment-tool.test.ts +379 -0
  607. package/src/tools/document/document-comment-tool.ts +156 -0
  608. package/src/tools/document/document-tool.ts +187 -2
  609. package/src/tools/execution-target.ts +21 -23
  610. package/src/tools/executor.ts +6 -1
  611. package/src/tools/filesystem/edit.ts +3 -9
  612. package/src/tools/filesystem/list.ts +3 -9
  613. package/src/tools/filesystem/read.ts +3 -9
  614. package/src/tools/filesystem/write.ts +3 -9
  615. package/src/tools/host-filesystem/edit.ts +3 -9
  616. package/src/tools/host-filesystem/read.ts +3 -9
  617. package/src/tools/host-filesystem/transfer.ts +3 -9
  618. package/src/tools/host-filesystem/write.ts +3 -9
  619. package/src/tools/host-terminal/host-shell.ts +3 -9
  620. package/src/tools/mcp/mcp-tool-factory.ts +1 -8
  621. package/src/tools/memory/register.test.ts +1 -1
  622. package/src/tools/memory/register.ts +4 -9
  623. package/src/tools/network/__tests__/web-fetch-metadata.test.ts +229 -0
  624. package/src/tools/network/__tests__/web-search-metadata.test.ts +346 -0
  625. package/src/tools/network/domain-normalize.ts +17 -0
  626. package/src/tools/network/web-fetch.ts +216 -73
  627. package/src/tools/network/web-search.ts +216 -98
  628. package/src/tools/registry.ts +7 -23
  629. package/src/tools/schema-transforms.ts +1 -1
  630. package/src/tools/skills/execute.ts +3 -9
  631. package/src/tools/skills/load.ts +3 -9
  632. package/src/tools/skills/skill-tool-factory.ts +1 -8
  633. package/src/tools/subagent/notify-parent.ts +3 -9
  634. package/src/tools/system/request-permission.ts +3 -9
  635. package/src/tools/terminal/safe-env.ts +3 -2
  636. package/src/tools/terminal/shell.ts +3 -9
  637. package/src/tools/tool-approval-handler.ts +19 -12
  638. package/src/tools/tool-defaults.ts +94 -0
  639. package/src/tools/types.ts +31 -98
  640. package/src/tools/ui-surface/definitions.ts +9 -23
  641. package/src/types/onboarding-context.ts +4 -0
  642. package/src/usage/pricing.ts +23 -0
  643. package/src/usage/types.ts +12 -0
  644. package/src/util/__tests__/favicon.test.ts +84 -0
  645. package/src/util/favicon.ts +40 -0
  646. package/src/util/logger.ts +16 -7
  647. package/src/util/platform.ts +7 -7
  648. package/src/util/sqlite3-runtime.ts +65 -0
  649. package/src/workspace/git-service.ts +75 -4
  650. package/src/workspace/migrations/086-revert-stale-gemini-mis-rewrites.ts +1 -0
  651. package/src/workspace/migrations/088-deprecate-background-conversation-override.ts +103 -0
  652. package/src/workspace/migrations/089-move-memory-tree-out-of-v3.ts +86 -0
  653. package/src/workspace/migrations/registry.ts +4 -0
  654. package/src/__tests__/compaction-strip-metadata-clear.test.ts +0 -206
  655. package/src/__tests__/message-complete-display-id.test.ts +0 -175
  656. package/src/config/bundled-skills/document/SKILL.md +0 -54
  657. package/src/config/bundled-skills/document/TOOLS.json +0 -106
  658. package/src/daemon/seed-files.ts +0 -18
  659. package/src/prompts/cache-boundary.ts +0 -8
  660. package/src/runtime/routes/interface-routes.ts +0 -43
  661. /package/src/config/bundled-skills/{document → document-editor}/tools/document-create.ts +0 -0
  662. /package/src/config/bundled-skills/{document → document-editor}/tools/document-delete.ts +0 -0
  663. /package/src/config/bundled-skills/{document → document-editor}/tools/document-list.ts +0 -0
  664. /package/src/config/bundled-skills/{document → document-editor}/tools/document-read.ts +0 -0
  665. /package/src/config/bundled-skills/{document → document-editor}/tools/document-update.ts +0 -0
@@ -36,7 +36,15 @@ export function handleConfirmationResponse(msg: ConfirmationResponse): void {
36
36
  undefined,
37
37
  { source: "button" },
38
38
  );
39
- pendingInteractions.resolve(msg.requestId);
39
+ // Idempotent cleanup: the prompter's `resolveConfirmation` already
40
+ // resolved the interaction with the correct approved/rejected state
41
+ // before we reach here, so the entry is typically gone. This call is
42
+ // a safety net for paths where the prompter no-ops; map decision to
43
+ // state to keep the emitted event accurate when it does fire.
44
+ pendingInteractions.resolve(
45
+ msg.requestId,
46
+ decision === "allow" ? "approved" : "rejected",
47
+ );
40
48
  return;
41
49
  }
42
50
  }
@@ -49,13 +57,13 @@ export function handleConfirmationResponse(msg: ConfirmationResponse): void {
49
57
  /**
50
58
  * Clear all conversations and DB conversations. Returns the number of conversations cleared.
51
59
  */
52
- export function clearAllConversations(): number {
60
+ export async function clearAllConversations(): Promise<number> {
53
61
  const cleared = clearAllActiveConversations();
54
62
  // Also clear DB conversations. When a new local connection triggers
55
63
  // sendInitialConversation, it auto-creates a conversation if none exist.
56
64
  // Without this DB clear, that auto-created row survives, contradicting
57
65
  // the "clear all conversations" intent.
58
- clearAll();
66
+ await clearAll();
59
67
  return cleared;
60
68
  }
61
69
 
@@ -202,6 +210,85 @@ export function deleteQueuedMessage(
202
210
  return { removed: false, reason: "message_not_found" };
203
211
  }
204
212
 
213
+ /**
214
+ * Steer a conversation to a specific queued message.
215
+ * Promotes the message to the head of the queue, marks the conversation
216
+ * as needing tool-result repair, and aborts the current generation so the
217
+ * drain path picks up the promoted message.
218
+ *
219
+ * Returns `{ steered: true }` on success, or `{ steered: false, reason }` on failure.
220
+ */
221
+ export function steerToMessage(
222
+ conversationId: string,
223
+ requestId: string,
224
+ ):
225
+ | { steered: true }
226
+ | {
227
+ steered: false;
228
+ reason:
229
+ | "conversation_not_found"
230
+ | "message_not_found"
231
+ | "not_processing";
232
+ } {
233
+ const conversation = findConversation(conversationId);
234
+ if (!conversation) {
235
+ log.warn(
236
+ { conversationId, requestId },
237
+ "No conversation found for steer_to_message",
238
+ );
239
+ return { steered: false, reason: "conversation_not_found" };
240
+ }
241
+
242
+ if (!conversation.isProcessing()) {
243
+ log.warn(
244
+ { conversationId, requestId },
245
+ "Cannot steer: conversation is not processing",
246
+ );
247
+ return { steered: false, reason: "not_processing" };
248
+ }
249
+
250
+ const promoted = conversation.queue.promoteToHead(requestId);
251
+ if (!promoted) {
252
+ log.warn(
253
+ { conversationId, requestId },
254
+ "Queued message not found for steering",
255
+ );
256
+ return { steered: false, reason: "message_not_found" };
257
+ }
258
+
259
+ // Mark the conversation for tool-result repair so the drain path can
260
+ // inject synthetic tool results for any pending tool_use blocks that
261
+ // were abandoned by the aborted generation.
262
+ conversation.pendingSteerRepair = true;
263
+
264
+ // Broadcast the steer event so clients can update their UI.
265
+ broadcastMessage({
266
+ type: "message_steered",
267
+ conversationId,
268
+ requestId,
269
+ });
270
+
271
+ log.info(
272
+ { conversationId, requestId },
273
+ "Steering to queued message — aborting current generation",
274
+ );
275
+
276
+ // Abort the in-flight generation. The agent loop's finally block calls
277
+ // drainQueue, which will pick up the promoted message at the head.
278
+ // Unlike abortConversation, we do NOT clear the queue or dispose
279
+ // prompters — we want the queue to drain with the promoted message first.
280
+ const reason = createAbortReason(
281
+ "preempted_by_new_message",
282
+ "steerToMessage",
283
+ conversationId,
284
+ );
285
+ conversation.abortController?.abort(reason);
286
+ // Deny pending confirmations so the abort unblocks immediately.
287
+ conversation.denyAllPendingConfirmations();
288
+
289
+ return { steered: true };
290
+ }
291
+
205
292
  // ---------------------------------------------------------------------------
206
293
  // HTTP handler (delegates to shared logic)
207
294
  // ---------------------------------------------------------------------------
@@ -92,6 +92,19 @@ export interface HistorySurface {
92
92
  completionSummary?: string;
93
93
  }
94
94
 
95
+ /**
96
+ * Positional reference to a file attachment captured while walking the
97
+ * content array. The index of an entry in `RenderedHistoryContent.attachments`
98
+ * is what `contentOrder` references as `attachment:N`.
99
+ */
100
+ export interface HistoryAttachmentRef {
101
+ /** Stable DB attachment id when persisted on the file block (`_attachmentId`). */
102
+ attachmentId?: string;
103
+ filename: string;
104
+ mimeType: string;
105
+ sizeBytes: number;
106
+ }
107
+
95
108
  export interface RenderedHistoryContent {
96
109
  text: string;
97
110
  toolCalls: HistoryToolCall[];
@@ -99,12 +112,18 @@ export interface RenderedHistoryContent {
99
112
  toolCallsBeforeText: boolean;
100
113
  /** Text segments split by tool-call boundaries. */
101
114
  textSegments: string[];
102
- /** Content block ordering using "text:N", "tool:N", "surface:N" encoding. */
115
+ /** Content block ordering using "text:N", "tool:N", "surface:N", "attachment:N" encoding. */
103
116
  contentOrder: string[];
104
117
  /** UI surfaces (widgets) embedded in the message. */
105
118
  surfaces: HistorySurface[];
106
119
  /** Thinking segments extracted from thinking blocks. */
107
120
  thinkingSegments: string[];
121
+ /**
122
+ * File attachments captured in content order. Index `N` matches an
123
+ * `attachment:N` entry in `contentOrder`. Callers align their DB-sourced
124
+ * attachment metadata to this ordering for inline placement.
125
+ */
126
+ attachments: HistoryAttachmentRef[];
108
127
  }
109
128
 
110
129
  /**
@@ -115,6 +134,8 @@ export interface RenderedHistoryContent {
115
134
  export interface SlackInboundMessageMetadata {
116
135
  /** Slack channel id (conversation external id) — recorded as `channelId`. */
117
136
  channelId: string;
137
+ /** Human-readable Slack channel name, when the gateway supplied it. */
138
+ channelName?: string;
118
139
  /** Slack `ts` for this message — required so persistence can record `channelTs`. */
119
140
  channelTs: string;
120
141
  /** Parent `thread_ts` when the message lives inside a thread; absent for top-level. */
@@ -123,6 +144,18 @@ export interface SlackInboundMessageMetadata {
123
144
  displayName?: string;
124
145
  /** Canonical Slack external user id for the sender, when available. */
125
146
  actorExternalUserId?: string;
147
+ /** Raw Slack profile timezone for the sender, when supplied. */
148
+ actorTimezone?: string;
149
+ /** Compact Slack profile timezone label for the sender, when supplied. */
150
+ actorTimezoneLabel?: string;
151
+ /** Raw Slack profile timezone offset in seconds, when supplied. */
152
+ actorTimezoneOffsetSeconds?: number;
153
+ /** Timezone used to render this message's timestamp. */
154
+ timestampTimezone?: string;
155
+ /** Compact label for the rendered timestamp timezone. */
156
+ timestampTimezoneLabel?: string;
157
+ /** Compact timezone label appended to the rendered speaker name. */
158
+ speakerTimezoneLabel?: string;
126
159
  }
127
160
 
128
161
  /**
@@ -144,8 +177,6 @@ export interface ConversationCreateOptions {
144
177
  authContext?: AuthContext;
145
178
  /** Whether this turn can block on interactive approval prompts. */
146
179
  isInteractive?: boolean;
147
- /** Slack-only non-persisted notice injected into the active model turn. */
148
- slackRuntimeContextNotice?: string;
149
180
  /**
150
181
  * Persisted user-facing content. When present, storage/UI use this value
151
182
  * while the model-facing turn continues to use `content`.
@@ -192,22 +223,42 @@ function clampAttachmentText(text: string): string {
192
223
  return `${text.slice(0, HISTORY_ATTACHMENT_TEXT_LIMIT)}<truncated />`;
193
224
  }
194
225
 
195
- function renderFileBlockForHistory(block: Record<string, unknown>): string {
226
+ interface FileBlockMetadata {
227
+ mediaType: string;
228
+ filename: string;
229
+ sizeBytes: number;
230
+ }
231
+
232
+ function extractFileBlockMetadata(
233
+ block: Record<string, unknown>,
234
+ ): FileBlockMetadata {
196
235
  const source = isRecord(block.source) ? block.source : null;
197
- const mediaType =
198
- source && typeof source.media_type === "string"
199
- ? source.media_type
200
- : "application/octet-stream";
201
- const filename =
202
- source && typeof source.filename === "string"
203
- ? source.filename
204
- : "attachment";
205
- const sizeBytes =
206
- source && typeof source.data === "string"
207
- ? estimateBase64Bytes(source.data)
208
- : 0;
209
- const summaryParts = [`[File attachment] ${filename}`, `type=${mediaType}`];
210
- if (sizeBytes > 0) summaryParts.push(`size=${formatBytes(sizeBytes)}`);
236
+ return {
237
+ mediaType:
238
+ source && typeof source.media_type === "string"
239
+ ? source.media_type
240
+ : "application/octet-stream",
241
+ filename:
242
+ source && typeof source.filename === "string"
243
+ ? source.filename
244
+ : "attachment",
245
+ sizeBytes:
246
+ source && typeof source.data === "string"
247
+ ? estimateBase64Bytes(source.data)
248
+ : 0,
249
+ };
250
+ }
251
+
252
+ function renderFileBlockForHistory(
253
+ block: Record<string, unknown>,
254
+ meta: FileBlockMetadata,
255
+ ): string {
256
+ const summaryParts = [
257
+ `[File attachment] ${meta.filename}`,
258
+ `type=${meta.mediaType}`,
259
+ ];
260
+ if (meta.sizeBytes > 0)
261
+ summaryParts.push(`size=${formatBytes(meta.sizeBytes)}`);
211
262
 
212
263
  const extractedText =
213
264
  typeof block.extracted_text === "string" ? block.extracted_text.trim() : "";
@@ -237,11 +288,13 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
237
288
  contentOrder: text ? ["text:0"] : [],
238
289
  surfaces: [],
239
290
  thinkingSegments: [],
291
+ attachments: [],
240
292
  };
241
293
  }
242
294
 
243
295
  const textParts: string[] = [];
244
296
  const attachmentParts: string[] = [];
297
+ const attachments: HistoryAttachmentRef[] = [];
245
298
  const toolCalls: HistoryToolCall[] = [];
246
299
  const surfaces: HistorySurface[] = [];
247
300
  const thinkingSegments: string[] = [];
@@ -351,7 +404,19 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
351
404
  continue;
352
405
  }
353
406
  if (block.type === "file") {
354
- attachmentParts.push(renderFileBlockForHistory(block));
407
+ const meta = extractFileBlockMetadata(block);
408
+ attachmentParts.push(renderFileBlockForHistory(block, meta));
409
+ finalizeSegment();
410
+ const ref: HistoryAttachmentRef = {
411
+ filename: meta.filename,
412
+ mimeType: meta.mediaType,
413
+ sizeBytes: meta.sizeBytes,
414
+ };
415
+ if (typeof block._attachmentId === "string" && block._attachmentId) {
416
+ ref.attachmentId = block._attachmentId;
417
+ }
418
+ attachments.push(ref);
419
+ contentOrder.push(`attachment:${attachments.length - 1}`);
355
420
  continue;
356
421
  }
357
422
  if (block.type === "image") {
@@ -495,17 +560,14 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
495
560
  matched.imageData = imageDataList[0];
496
561
  matched.imageDataList = imageDataList;
497
562
  }
498
- } else {
499
- toolCalls.push({
500
- name: "unknown",
501
- input: {},
502
- result: resultContent,
503
- isError,
504
- ...(imageDataList.length > 0
505
- ? { imageData: imageDataList[0], imageDataList }
506
- : {}),
507
- });
508
563
  }
564
+ // Orphan tool_result with no matching tool_use — drop it. Synthesizing
565
+ // a "name: 'unknown'" phantom entry rendered in chat as "Used unknown"
566
+ // / "Completed 1 step" with no context, with a timestamp later than
567
+ // the assistant's final answer. Most commonly orphans appear when
568
+ // context-window compaction trims the parent tool_use block while
569
+ // leaving the paired tool_result. Losing the orphan's result content
570
+ // is correct: without the parent we can't tell the user what tool ran.
509
571
  continue;
510
572
  }
511
573
  }
@@ -541,6 +603,7 @@ export function renderHistoryContent(content: unknown): RenderedHistoryContent {
541
603
  contentOrder,
542
604
  surfaces,
543
605
  thinkingSegments,
606
+ attachments,
544
607
  };
545
608
  }
546
609
 
@@ -185,7 +185,7 @@ export class HostBashProxy extends HostProxyBase<
185
185
  timedOut: boolean;
186
186
  },
187
187
  ): void {
188
- pendingInteractions.resolve(requestId);
188
+ pendingInteractions.resolve(requestId, "answered");
189
189
  this.resolve(requestId, response);
190
190
  }
191
191
  }
@@ -185,7 +185,7 @@ export class HostBrowserProxy {
185
185
  let detachAbort: () => void = () => {};
186
186
 
187
187
  const timer = setTimeout(() => {
188
- pendingInteractions.resolve(requestId);
188
+ pendingInteractions.resolve(requestId, "cancelled");
189
189
  log.warn(
190
190
  { requestId, cdpMethod: input.cdpMethod },
191
191
  "Host browser proxy request timed out",
@@ -200,7 +200,7 @@ export class HostBrowserProxy {
200
200
  if (signal) {
201
201
  const onAbort = () => {
202
202
  if (pendingInteractions.get(requestId)) {
203
- pendingInteractions.resolve(requestId);
203
+ pendingInteractions.resolve(requestId, "cancelled");
204
204
  try {
205
205
  broadcastMessage({
206
206
  type: "host_browser_cancel",
@@ -229,7 +229,7 @@ export class HostBrowserProxy {
229
229
 
230
230
  try {
231
231
  if (!preferredClient) {
232
- pendingInteractions.resolve(requestId);
232
+ pendingInteractions.resolve(requestId, "cancelled");
233
233
  reject(
234
234
  new Error(
235
235
  "host_browser send failed: no active extension connection",
@@ -244,7 +244,7 @@ export class HostBrowserProxy {
244
244
  { targetClientId: preferredClient.clientId },
245
245
  );
246
246
  } catch (err) {
247
- pendingInteractions.resolve(requestId);
247
+ pendingInteractions.resolve(requestId, "cancelled");
248
248
  log.warn(
249
249
  { requestId, cdpMethod: input.cdpMethod, err },
250
250
  "Host browser proxy send failed",
@@ -256,7 +256,7 @@ export class HostBrowserProxy {
256
256
 
257
257
  dispose(): void {
258
258
  for (const entry of pendingInteractions.getByKind("host_browser")) {
259
- pendingInteractions.resolve(entry.requestId);
259
+ pendingInteractions.resolve(entry.requestId, "cancelled");
260
260
  try {
261
261
  broadcastMessage({
262
262
  type: "host_browser_cancel",
@@ -195,7 +195,7 @@ export class HostCuProxy {
195
195
 
196
196
  const timer = setTimeout(() => {
197
197
  this._ownedRequests.delete(requestId);
198
- pendingInteractions.resolve(requestId);
198
+ pendingInteractions.resolve(requestId, "cancelled");
199
199
  log.warn({ requestId, toolName }, "Host CU proxy request timed out");
200
200
  resolve({
201
201
  content: "Host CU proxy timed out waiting for client response",
@@ -207,7 +207,7 @@ export class HostCuProxy {
207
207
  const onAbort = () => {
208
208
  if (pendingInteractions.get(requestId)) {
209
209
  this._ownedRequests.delete(requestId);
210
- pendingInteractions.resolve(requestId);
210
+ pendingInteractions.resolve(requestId, "cancelled");
211
211
  try {
212
212
  broadcastMessage(
213
213
  {
@@ -263,7 +263,7 @@ export class HostCuProxy {
263
263
  );
264
264
  } catch (err) {
265
265
  this._ownedRequests.delete(requestId);
266
- pendingInteractions.resolve(requestId);
266
+ pendingInteractions.resolve(requestId, "cancelled");
267
267
  log.warn({ requestId, toolName, err }, "Host CU proxy send failed");
268
268
  reject(err instanceof Error ? err : new Error(String(err)));
269
269
  }
@@ -280,7 +280,7 @@ export class HostCuProxy {
280
280
  observation: CuObservationResult,
281
281
  ): ToolExecutionResult | undefined {
282
282
  this._ownedRequests.delete(requestId);
283
- const interaction = pendingInteractions.resolve(requestId);
283
+ const interaction = pendingInteractions.resolve(requestId, "answered");
284
284
  if (!interaction?.rpcResolve) {
285
285
  log.warn({ requestId }, "No pending host CU request for response");
286
286
  return undefined;
@@ -447,7 +447,7 @@ export class HostCuProxy {
447
447
 
448
448
  dispose(): void {
449
449
  for (const requestId of this._ownedRequests) {
450
- const entry = pendingInteractions.resolve(requestId);
450
+ const entry = pendingInteractions.resolve(requestId, "cancelled");
451
451
  if (!entry) continue;
452
452
  try {
453
453
  broadcastMessage(
@@ -136,7 +136,7 @@ export class HostFileProxy {
136
136
  let detachAbort: () => void = () => {};
137
137
 
138
138
  const timer = setTimeout(() => {
139
- pendingInteractions.resolve(requestId);
139
+ pendingInteractions.resolve(requestId, "cancelled");
140
140
  log.warn(
141
141
  { requestId, operation: input.operation },
142
142
  "Host file proxy request timed out",
@@ -152,7 +152,7 @@ export class HostFileProxy {
152
152
  if (signal) {
153
153
  const onAbort = () => {
154
154
  if (pendingInteractions.get(requestId)) {
155
- pendingInteractions.resolve(requestId);
155
+ pendingInteractions.resolve(requestId, "cancelled");
156
156
  try {
157
157
  broadcastMessage(
158
158
  {
@@ -210,7 +210,7 @@ export class HostFileProxy {
210
210
  { targetClientId: resolvedTargetClientId },
211
211
  );
212
212
  } catch (err) {
213
- pendingInteractions.resolve(requestId);
213
+ pendingInteractions.resolve(requestId, "cancelled");
214
214
  log.warn(
215
215
  { requestId, operation: input.operation, err },
216
216
  "Host file proxy send failed",
@@ -227,7 +227,7 @@ export class HostFileProxy {
227
227
  requestId: string,
228
228
  response: { content: string; isError: boolean; imageData?: string },
229
229
  ): void {
230
- const interaction = pendingInteractions.resolve(requestId);
230
+ const interaction = pendingInteractions.resolve(requestId, "answered");
231
231
  if (!interaction?.rpcResolve) {
232
232
  log.warn({ requestId }, "No pending host file request for response");
233
233
  return;
@@ -252,7 +252,7 @@ export class HostFileProxy {
252
252
 
253
253
  dispose(): void {
254
254
  for (const entry of pendingInteractions.getByKind("host_file")) {
255
- pendingInteractions.resolve(entry.requestId);
255
+ pendingInteractions.resolve(entry.requestId, "cancelled");
256
256
  try {
257
257
  broadcastMessage(
258
258
  {
@@ -154,7 +154,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
154
154
  const timer = setTimeout(() => {
155
155
  this.pending.delete(requestId);
156
156
  detachAbort();
157
- pendingInteractions.resolve(requestId);
157
+ pendingInteractions.resolve(requestId, "cancelled");
158
158
  log.warn(
159
159
  { requestId, toolName, kind: this.resultPendingKind },
160
160
  "Host proxy request timed out",
@@ -168,7 +168,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
168
168
  clearTimeout(timer);
169
169
  this.pending.delete(requestId);
170
170
  detachAbort();
171
- pendingInteractions.resolve(requestId);
171
+ pendingInteractions.resolve(requestId, "cancelled");
172
172
  try {
173
173
  broadcastDynamic(
174
174
  {
@@ -239,7 +239,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
239
239
  clearTimeout(timer);
240
240
  this.pending.delete(requestId);
241
241
  detachAbort();
242
- pendingInteractions.resolve(requestId);
242
+ pendingInteractions.resolve(requestId, "cancelled");
243
243
  log.warn(
244
244
  { requestId, toolName, kind: this.resultPendingKind, err },
245
245
  "Host proxy send failed",
@@ -285,7 +285,7 @@ export abstract class HostProxyBase<TRequest, TResultPayload> {
285
285
  for (const [requestId, entry] of this.pending) {
286
286
  clearTimeout(entry.timer);
287
287
  entry.detachAbort();
288
- pendingInteractions.resolve(requestId);
288
+ pendingInteractions.resolve(requestId, "cancelled");
289
289
  try {
290
290
  broadcastDynamic(
291
291
  {
@@ -205,7 +205,7 @@ export class HostTransferProxy {
205
205
 
206
206
  const timer = setTimeout(() => {
207
207
  this.transfers.delete(transferId);
208
- pendingInteractions.resolve(requestId);
208
+ pendingInteractions.resolve(requestId, "cancelled");
209
209
  log.warn(
210
210
  { requestId, transferId, direction: "to_host" },
211
211
  "Host transfer proxy request timed out",
@@ -222,7 +222,7 @@ export class HostTransferProxy {
222
222
  const onAbort = () => {
223
223
  if (pendingInteractions.get(requestId)) {
224
224
  this.transfers.delete(transferId);
225
- pendingInteractions.resolve(requestId);
225
+ pendingInteractions.resolve(requestId, "cancelled");
226
226
  try {
227
227
  broadcastMessage(
228
228
  {
@@ -301,7 +301,7 @@ export class HostTransferProxy {
301
301
  );
302
302
  } catch (err) {
303
303
  this.transfers.delete(transferId);
304
- pendingInteractions.resolve(requestId);
304
+ pendingInteractions.resolve(requestId, "cancelled");
305
305
  log.warn(
306
306
  { requestId, transferId, err },
307
307
  "Host transfer proxy send failed",
@@ -396,7 +396,7 @@ export class HostTransferProxy {
396
396
 
397
397
  const timer = setTimeout(() => {
398
398
  this.transfers.delete(transferId);
399
- pendingInteractions.resolve(requestId);
399
+ pendingInteractions.resolve(requestId, "cancelled");
400
400
  log.warn(
401
401
  { requestId, transferId, direction: "to_sandbox" },
402
402
  "Host transfer proxy request timed out",
@@ -413,7 +413,7 @@ export class HostTransferProxy {
413
413
  const onAbort = () => {
414
414
  if (pendingInteractions.get(requestId)) {
415
415
  this.transfers.delete(transferId);
416
- pendingInteractions.resolve(requestId);
416
+ pendingInteractions.resolve(requestId, "cancelled");
417
417
  try {
418
418
  broadcastMessage(
419
419
  {
@@ -487,7 +487,7 @@ export class HostTransferProxy {
487
487
  );
488
488
  } catch (err) {
489
489
  this.transfers.delete(transferId);
490
- pendingInteractions.resolve(requestId);
490
+ pendingInteractions.resolve(requestId, "cancelled");
491
491
  log.warn(
492
492
  { requestId, transferId, err },
493
493
  "Host transfer proxy send failed",
@@ -508,7 +508,7 @@ export class HostTransferProxy {
508
508
  errorMessage?: string;
509
509
  },
510
510
  ): void {
511
- const interaction = pendingInteractions.resolve(requestId);
511
+ const interaction = pendingInteractions.resolve(requestId, "answered");
512
512
  if (!interaction?.rpcResolve) {
513
513
  log.warn({ requestId }, "No pending host transfer request for response");
514
514
  return;
@@ -622,14 +622,14 @@ export class HostTransferProxy {
622
622
 
623
623
  if (entry.overwrite !== true && existsSync(entry.filePath)) {
624
624
  const errorMsg = `Destination file already exists: ${entry.filePath}. Set overwrite to true to replace it.`;
625
- const interaction = pendingInteractions.resolve(requestId);
625
+ const interaction = pendingInteractions.resolve(requestId, "answered");
626
626
  this.transfers.delete(transferId);
627
627
  interaction?.rpcResolve?.({ content: errorMsg, isError: true });
628
628
  return { accepted: false, error: errorMsg };
629
629
  }
630
630
 
631
631
  const cleanup = () => {
632
- pendingInteractions.resolve(requestId);
632
+ pendingInteractions.resolve(requestId, "answered");
633
633
  this.transfers.delete(transferId);
634
634
  };
635
635
 
@@ -662,7 +662,7 @@ export class HostTransferProxy {
662
662
  if (!interaction) return;
663
663
  const transferId = interaction.metadata?.transferId as string | undefined;
664
664
  if (transferId) this.transfers.delete(transferId);
665
- pendingInteractions.resolve(requestId);
665
+ pendingInteractions.resolve(requestId, "cancelled");
666
666
  try {
667
667
  broadcastMessage(
668
668
  {
@@ -718,7 +718,7 @@ export class HostTransferProxy {
718
718
  for (const entry of pendingInteractions.getByKind("host_transfer")) {
719
719
  const transferId = entry.metadata?.transferId as string | undefined;
720
720
  if (transferId) this.transfers.delete(transferId);
721
- pendingInteractions.resolve(entry.requestId);
721
+ pendingInteractions.resolve(entry.requestId, "cancelled");
722
722
  try {
723
723
  broadcastMessage(
724
724
  {