@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
@@ -9,13 +9,13 @@
9
9
  * - conversation-tool-setup.ts — tool definitions, executor, resolveTools callback
10
10
  * - conversation-media-retry.ts — media trimming + raceWithTimeout
11
11
  * - conversation-process.ts — drainQueue, processMessage
12
- * - conversation-history.ts — undo, regenerate, consolidateAssistantMessages
12
+ * - conversation-history.ts — undo, consolidateAssistantMessages
13
13
  * - conversation-surfaces.ts — handleSurfaceAction, handleSurfaceUndo
14
14
  * - conversation-workspace.ts — refreshWorkspaceTopLevelContext
15
15
  * - conversation-usage.ts — recordUsage
16
16
  */
17
17
 
18
- import type { ResolvedSystemPrompt } from "../agent/loop.js";
18
+ import type { AgentLoopConfig, ResolvedSystemPrompt } from "../agent/loop.js";
19
19
  import { AgentLoop } from "../agent/loop.js";
20
20
  import type {
21
21
  InterfaceId,
@@ -23,8 +23,13 @@ import type {
23
23
  TurnInterfaceContext,
24
24
  } from "../channels/types.js";
25
25
  import { isAssistantFeatureFlagEnabled } from "../config/assistant-feature-flags.js";
26
+ import {
27
+ contextWindowConfigFromEffective,
28
+ resolveEffectiveContextWindow,
29
+ } from "../config/llm-context-resolution.js";
26
30
  import { getConfig } from "../config/loader.js";
27
31
  import type { LLMCallSite, Speed } from "../config/schemas/llm.js";
32
+ import type { ContextWindowConfig } from "../config/types.js";
28
33
  import {
29
34
  ContextWindowManager,
30
35
  type ContextWindowResult,
@@ -36,7 +41,6 @@ import type { AssistantDomainEvents } from "../events/domain-events.js";
36
41
  import { createToolAuditListener } from "../events/tool-audit-listener.js";
37
42
  import { createToolDomainEventPublisher } from "../events/tool-domain-event-publisher.js";
38
43
  import { registerToolMetricsLoggingListener } from "../events/tool-metrics-listener.js";
39
- import { registerToolNotificationListener } from "../events/tool-notification-listener.js";
40
44
  import { registerToolPermissionTelemetryListener } from "../events/tool-permission-telemetry-listener.js";
41
45
  import {
42
46
  registerToolProfilingListener,
@@ -44,7 +48,11 @@ import {
44
48
  } from "../events/tool-profiling-listener.js";
45
49
  import { registerToolTraceListener } from "../events/tool-trace-listener.js";
46
50
  import { resolveCanonicalGuardianRequest } from "../memory/canonical-guardian-store.js";
47
- import { getConversationOriginChannel } from "../memory/conversation-crud.js";
51
+ import {
52
+ getConversation,
53
+ getConversationOriginChannel,
54
+ getConversationOverrideProfileFromRow,
55
+ } from "../memory/conversation-crud.js";
48
56
  import { ConversationGraphMemory } from "../memory/graph/conversation-graph-memory.js";
49
57
  import { PermissionPrompter } from "../permissions/prompter.js";
50
58
  import { SecretPrompter } from "../permissions/secret-prompter.js";
@@ -54,6 +62,7 @@ import { buildSystemPrompt } from "../prompts/system-prompt.js";
54
62
  import type { Message } from "../providers/types.js";
55
63
  import type { Provider } from "../providers/types.js";
56
64
  import type { TrustClass } from "../runtime/actor-trust-resolver.js";
65
+ import { broadcastMessage } from "../runtime/assistant-event-hub.js";
57
66
  import type { AuthContext } from "../runtime/auth/types.js";
58
67
  import type { InteractiveUiResult } from "../runtime/interactive-ui.js";
59
68
  import { ToolExecutor } from "../tools/executor.js";
@@ -68,10 +77,7 @@ import {
68
77
  trackCompactionOutcome,
69
78
  } from "./conversation-agent-loop.js";
70
79
  import type { HistoryConversationContext } from "./conversation-history.js";
71
- import {
72
- regenerate as regenerateImpl,
73
- undo as undoImpl,
74
- } from "./conversation-history.js";
80
+ import { undo as undoImpl } from "./conversation-history.js";
75
81
  import {
76
82
  abortConversation,
77
83
  disposeConversation,
@@ -92,7 +98,11 @@ import {
92
98
  } from "./conversation-process.js";
93
99
  import type { QueueDrainReason } from "./conversation-queue-manager.js";
94
100
  import { MessageQueue } from "./conversation-queue-manager.js";
95
- import type { ChannelCapabilities } from "./conversation-runtime-assembly.js";
101
+ import {
102
+ type ChannelCapabilities,
103
+ getSlackCompactionWatermarkForPrefix,
104
+ loadSlackChronologicalContext,
105
+ } from "./conversation-runtime-assembly.js";
96
106
  import type { SkillProjectionCache } from "./conversation-skill-tools.js";
97
107
  import {
98
108
  createSurfaceMutex,
@@ -107,12 +117,7 @@ import {
107
117
  createToolExecutor,
108
118
  } from "./conversation-tool-setup.js";
109
119
  import { refreshWorkspaceTopLevelContextIfNeeded as refreshWorkspaceImpl } from "./conversation-workspace.js";
110
- import { HostBashProxy } from "./host-bash-proxy.js";
111
- import { HostBrowserProxy } from "./host-browser-proxy.js";
112
- import type { CuObservationResult } from "./host-cu-proxy.js";
113
120
  import { HostCuProxy } from "./host-cu-proxy.js";
114
- import { HostFileProxy } from "./host-file-proxy.js";
115
- import { HostTransferProxy } from "./host-transfer-proxy.js";
116
121
  import type {
117
122
  ServerMessage,
118
123
  SurfaceData,
@@ -198,24 +203,7 @@ export class Conversation {
198
203
  /** @internal */ headlessLock = false;
199
204
  /** @internal */ taskRunId?: string;
200
205
  /** @internal */ callSessionId?: string;
201
- /** @internal */ hostBashProxy?: HostBashProxy;
202
- /** @internal */ hostBrowserProxy?: HostBrowserProxy;
203
206
  /** @internal */ hostCuProxy?: HostCuProxy;
204
- /** @internal */ hostFileProxy?: HostFileProxy;
205
- /** @internal */ hostTransferProxy?: HostTransferProxy;
206
- /**
207
- * Optional override sender used by `restoreBrowserProxyAvailability` so
208
- * registry-routed transports can preserve their sender across drain queue
209
- * restores. When set, `restoreBrowserProxyAvailability()` uses this
210
- * function instead of `sendToClient` so the drain-queue path doesn't
211
- * clobber the registry-routed sender with the SSE hub emitter.
212
- *
213
- * Populated by the POST /messages handler when the guardian has an active
214
- * extension connection in the `ChromeExtensionRegistry`, regardless of
215
- * interface (chrome-extension, macOS, etc.). Cleared when a turn without
216
- * an active extension connection takes over.
217
- */
218
- /** @internal */ hostBrowserSenderOverride?: (msg: ServerMessage) => void;
219
207
  /** @internal */ cesClient?: CesClient;
220
208
  /** @internal */ readonly queue = new MessageQueue();
221
209
  /** @internal */ currentActiveSurfaceId?: string;
@@ -235,6 +223,7 @@ export class Conversation {
235
223
  /** @internal */ loadedHistoryTrustClass?: TrustClass;
236
224
  /** @internal */ voiceCallControlPrompt?: string;
237
225
  /** @internal */ transportHints?: string[];
226
+ /** @internal */ slackRuntimeContextNotice?: string;
238
227
  /** @internal */ assistantId?: string;
239
228
  /** @internal */ commandIntent?: {
240
229
  type: string;
@@ -292,7 +281,6 @@ export class Conversation {
292
281
  string,
293
282
  ReturnType<typeof setTimeout>
294
283
  >();
295
- /** @internal */ broadcastToAllClients?: (msg: ServerMessage) => void;
296
284
  /** @internal */ withSurface = createSurfaceMutex();
297
285
  /** @internal */ currentTurnSurfaces: Array<{
298
286
  surfaceId: string;
@@ -358,10 +346,9 @@ export class Conversation {
358
346
  conversationId: string,
359
347
  provider: Provider,
360
348
  systemPrompt: string,
361
- maxTokens: number,
349
+ maxTokens: number | undefined,
362
350
  sendToClient: (msg: ServerMessage) => void,
363
351
  workingDir: string,
364
- broadcastToAllClients?: (msg: ServerMessage) => void,
365
352
  memoryPolicy?: ConversationMemoryPolicy,
366
353
  sharedCesClient?: CesClient,
367
354
  speedOverride?: Speed,
@@ -373,7 +360,6 @@ export class Conversation {
373
360
  this.provider = provider;
374
361
  this.workingDir = workingDir;
375
362
  this.sendToClient = sendToClient;
376
- this.broadcastToAllClients = broadcastToAllClients;
377
363
  this.memoryPolicy = memoryPolicy
378
364
  ? { ...memoryPolicy }
379
365
  : { ...DEFAULT_MEMORY_POLICY };
@@ -413,10 +399,7 @@ export class Conversation {
413
399
  );
414
400
  }
415
401
  });
416
- this.secretPrompter = new SecretPrompter(
417
- sendToClient,
418
- broadcastToAllClients,
419
- );
402
+ this.secretPrompter = new SecretPrompter();
420
403
 
421
404
  // Register call notifiers (reads ctx properties lazily)
422
405
  registerConversationNotifiers(conversationId, this);
@@ -425,9 +408,6 @@ export class Conversation {
425
408
  this.executor = new ToolExecutor(this.prompter);
426
409
  this.profiler = new ToolProfiler();
427
410
  registerToolMetricsLoggingListener(this.eventBus);
428
- registerToolNotificationListener(this.eventBus, (msg) =>
429
- this.sendToClient(msg),
430
- );
431
411
  registerToolTraceListener(this.eventBus, this.traceEmitter);
432
412
  registerToolProfilingListener(this.eventBus, this.profiler);
433
413
  registerToolPermissionTelemetryListener(this.eventBus);
@@ -448,7 +428,6 @@ export class Conversation {
448
428
  this.secretPrompter,
449
429
  this as ToolSetupContext,
450
430
  handleToolLifecycleEvent,
451
- broadcastToAllClients,
452
431
  );
453
432
 
454
433
  const config = getConfig();
@@ -493,8 +472,10 @@ export class Conversation {
493
472
  onboardingContext: this.getOnboardingContext(),
494
473
  });
495
474
  })(),
496
- maxTokens: configuredMaxTokens,
497
475
  };
476
+ if (configuredMaxTokens !== undefined) {
477
+ resolved.maxTokens = configuredMaxTokens;
478
+ }
498
479
  if (resolvedModel !== undefined) {
499
480
  resolved.model = resolvedModel;
500
481
  }
@@ -504,20 +485,31 @@ export class Conversation {
504
485
  const fastModeEnabled = isAssistantFeatureFlagEnabled("fast-mode", config);
505
486
  const resolvedSpeed = speedOverride ?? config.llm.default.speed;
506
487
  const llmDefault = config.llm.default;
488
+ const initialContextWindow = resolveEffectiveContextWindow({
489
+ llm: config.llm,
490
+ callSite: "mainAgent",
491
+ });
492
+ const initialContextWindowConfig = contextWindowConfigFromEffective(
493
+ llmDefault.contextWindow,
494
+ initialContextWindow,
495
+ );
496
+
497
+ const agentLoopConfig: Partial<AgentLoopConfig> = {
498
+ thinking: llmDefault.thinking,
499
+ effort: llmDefault.effort,
500
+ ...(fastModeEnabled && resolvedSpeed === "fast"
501
+ ? { speed: resolvedSpeed }
502
+ : {}),
503
+ ...(cacheTtl ? { cacheTtl } : {}),
504
+ };
505
+ if (configuredMaxTokens !== undefined) {
506
+ agentLoopConfig.maxTokens = configuredMaxTokens;
507
+ }
507
508
 
508
509
  this.agentLoop = new AgentLoop(
509
510
  provider,
510
511
  systemPrompt,
511
- {
512
- maxTokens,
513
- maxInputTokens: llmDefault.contextWindow.maxInputTokens,
514
- thinking: llmDefault.thinking,
515
- effort: llmDefault.effort,
516
- ...(fastModeEnabled && resolvedSpeed === "fast"
517
- ? { speed: resolvedSpeed }
518
- : {}),
519
- ...(cacheTtl ? { cacheTtl } : {}),
520
- },
512
+ agentLoopConfig,
521
513
  toolDefs.length > 0 ? toolDefs : undefined,
522
514
  toolDefs.length > 0 ? toolExecutor : undefined,
523
515
  resolveTools,
@@ -526,7 +518,7 @@ export class Conversation {
526
518
  this.contextWindowManager = new ContextWindowManager({
527
519
  provider,
528
520
  systemPrompt: () => resolveSystemPromptCallback([]).systemPrompt,
529
- config: llmDefault.contextWindow,
521
+ config: initialContextWindowConfig,
530
522
  toolTokenBudget: this.agentLoop.getToolTokenBudget(),
531
523
  });
532
524
  }
@@ -578,7 +570,11 @@ export class Conversation {
578
570
 
579
571
  provider
580
572
  .sendMessage([warmMessage], tools, systemPrompt, {
581
- config: { max_tokens: 1, callSite: "mainAgent" },
573
+ config: {
574
+ max_tokens: 1,
575
+ callSite: "mainAgent",
576
+ usageTracking: "manual",
577
+ },
582
578
  signal: abort.signal,
583
579
  })
584
580
  .then(() => {
@@ -648,20 +644,11 @@ export class Conversation {
648
644
  updateClient(
649
645
  sendToClient: (msg: ServerMessage) => void,
650
646
  hasNoClient = false,
651
- opts?: { skipProxySenderUpdate?: boolean },
652
647
  ): void {
653
648
  this.sendToClient = sendToClient;
654
649
  this.hasNoClient = hasNoClient;
655
650
  this.prompter.updateSender(sendToClient);
656
- this.secretPrompter.updateSender(sendToClient);
657
651
  this.traceEmitter.updateSender(sendToClient);
658
- if (!opts?.skipProxySenderUpdate) {
659
- this.hostBashProxy?.updateSender(sendToClient, !hasNoClient);
660
- this.hostBrowserProxy?.updateSender(sendToClient, !hasNoClient);
661
- this.hostCuProxy?.updateSender(sendToClient, !hasNoClient);
662
- this.hostFileProxy?.updateSender(sendToClient, !hasNoClient);
663
- this.hostTransferProxy?.updateSender(sendToClient, !hasNoClient);
664
- }
665
652
 
666
653
  // Replay last activity state so a reconnecting client sees the current phase
667
654
  // instead of being stuck on the last state it received before disconnection.
@@ -682,72 +669,6 @@ export class Conversation {
682
669
  return this.sendToClient;
683
670
  }
684
671
 
685
- /** Mark host proxies as unavailable so tool execution uses local fallback. */
686
- clearProxyAvailability(): void {
687
- this.hostBashProxy?.updateSender(this.sendToClient, false);
688
- this.hostBrowserProxy?.updateSender(this.sendToClient, false);
689
- this.hostCuProxy?.updateSender(this.sendToClient, false);
690
- this.hostFileProxy?.updateSender(this.sendToClient, false);
691
- this.hostTransferProxy?.updateSender(this.sendToClient, false);
692
- }
693
-
694
- /**
695
- * Restore host proxy availability based on whether a real client is connected.
696
- * When `skipBrowser` is true, the browser proxy is left untouched — use this
697
- * when `restoreBrowserProxyAvailability()` will handle the browser proxy
698
- * separately with the correct registry-routed sender.
699
- */
700
- restoreProxyAvailability(options?: { skipBrowser?: boolean }): void {
701
- if (!this.hasNoClient) {
702
- this.hostBashProxy?.updateSender(this.sendToClient, true);
703
- if (!options?.skipBrowser) {
704
- this.hostBrowserProxy?.updateSender(this.sendToClient, true);
705
- }
706
- this.hostCuProxy?.updateSender(this.sendToClient, true);
707
- this.hostFileProxy?.updateSender(this.sendToClient, true);
708
- this.hostTransferProxy?.updateSender(this.sendToClient, true);
709
- }
710
- }
711
-
712
- /**
713
- * Restore host browser proxy availability only. Used in two scenarios:
714
- *
715
- * 1. **Chrome-extension turns** — only support host_browser (not the full
716
- * desktop proxy set), so calling restoreProxyAvailability() would
717
- * incorrectly re-enable bash/file/CU proxies.
718
- * 2. **macOS turns** — when called from queue-drain, the browser proxy
719
- * sender needs to be either the registry-routed sender (when an
720
- * extension connection is present) or the SSE hub sender (when no
721
- * extension is connected). This helper resolves the correct sender
722
- * via `hostBrowserSenderOverride ?? sendToClient`.
723
- *
724
- * Unlike `restoreProxyAvailability()`, this helper does NOT gate on
725
- * `hasNoClient`. The chrome-extension interface is non-interactive (so
726
- * `hasNoClient === true`), but it DOES have a connected client that can
727
- * service `host_browser_request` events. Gating on `hasNoClient` would
728
- * leave the just-constructed proxy unavailable and the only way to make
729
- * it available would be to flip `hasNoClient` false, which would
730
- * incorrectly enable host_bash/host_file/host_cu tool gating downstream.
731
- *
732
- * When `hostBrowserSenderOverride` is set, that function is used as the
733
- * sender instead of `sendToClient`. This is required for any interface
734
- * whose host_browser frames route through the ChromeExtensionRegistry
735
- * WebSocket rather than the SSE hub: if the queue-drain path called this
736
- * helper with `sendToClient`, the registry-routed sender established at
737
- * turn-start would be clobbered by the SSE hub emitter and
738
- * host_browser_request frames would stop reaching the extension. When
739
- * no override is set (macOS without extension), `sendToClient` is used
740
- * so frames reach the desktop client via SSE.
741
- *
742
- * Callers must only invoke this when they know the current interface
743
- * supports host_browser (see `supportsHostProxy(id, "host_browser")`)
744
- * or has an active extension connection with a registry-routed sender.
745
- */
746
- restoreBrowserProxyAvailability(): void {
747
- const sender = this.hostBrowserSenderOverride ?? this.sendToClient;
748
- this.hostBrowserProxy?.updateSender(sender, true);
749
- }
750
-
751
672
  setSubagentAllowedTools(tools: Set<string> | undefined): void {
752
673
  this.subagentAllowedTools = tools;
753
674
  }
@@ -811,12 +732,10 @@ export class Conversation {
811
732
  // cancellation instead of hanging forever. Emit dismiss notifications
812
733
  // to the client so surfaces don't remain visually active if the client
813
734
  // reconnects after dispose.
814
- const emitDispose =
815
- this.broadcastToAllClients ?? this.sendToClient.bind(this);
816
735
  for (const [surfaceId, entry] of this.pendingStandaloneSurfaces) {
817
736
  clearTimeout(entry.timer);
818
737
  try {
819
- emitDispose({
738
+ broadcastMessage({
820
739
  type: "ui_surface_dismiss",
821
740
  conversationId: this.conversationId,
822
741
  surfaceId,
@@ -836,11 +755,9 @@ export class Conversation {
836
755
  clearTimeout(timer);
837
756
  }
838
757
  this.recentlyCompletedStandaloneSurfaces.clear();
839
- this.hostBashProxy?.dispose();
840
- this.hostBrowserProxy?.dispose();
758
+ // Only dispose the per-conversation CU proxy. Bash/File/Transfer are
759
+ // singletons — their lifecycle is managed by static disposeInstance().
841
760
  this.hostCuProxy?.dispose();
842
- this.hostFileProxy?.dispose();
843
- this.hostTransferProxy?.dispose();
844
761
  // CES client is owned by DaemonServer — just drop the reference.
845
762
  // Do NOT close it here; the server manages the CES lifecycle.
846
763
  this.cesClient = undefined;
@@ -867,8 +784,8 @@ export class Conversation {
867
784
  enqueueMessage(
868
785
  content: string,
869
786
  attachments: UserMessageAttachment[],
870
- onEvent: (msg: ServerMessage) => void,
871
- requestId: string,
787
+ onEvent?: (msg: ServerMessage) => void,
788
+ requestId?: string,
872
789
  activeSurfaceId?: string,
873
790
  currentPage?: string,
874
791
  metadata?: Record<string, unknown>,
@@ -881,8 +798,8 @@ export class Conversation {
881
798
  this,
882
799
  content,
883
800
  attachments,
884
- onEvent,
885
- requestId,
801
+ onEvent ?? this.sendToClient,
802
+ requestId ?? crypto.randomUUID(),
886
803
  activeSurfaceId,
887
804
  currentPage,
888
805
  metadata,
@@ -1002,7 +919,6 @@ export class Conversation {
1002
919
  } catch {
1003
920
  // Canonical request tracking should not break the primary approval flow.
1004
921
  }
1005
-
1006
922
  }
1007
923
 
1008
924
  handleSecretResponse(
@@ -1013,79 +929,6 @@ export class Conversation {
1013
929
  this.secretPrompter.resolveSecret(requestId, value, delivery);
1014
930
  }
1015
931
 
1016
- resolveHostBash(
1017
- requestId: string,
1018
- response: {
1019
- stdout: string;
1020
- stderr: string;
1021
- exitCode: number | null;
1022
- timedOut: boolean;
1023
- },
1024
- ): void {
1025
- this.hostBashProxy?.resolve(requestId, response);
1026
- }
1027
-
1028
- setHostBashProxy(proxy: HostBashProxy | undefined): void {
1029
- if (this.hostBashProxy && this.hostBashProxy !== proxy) {
1030
- this.hostBashProxy.dispose();
1031
- }
1032
- this.hostBashProxy = proxy;
1033
- }
1034
-
1035
- resolveHostBrowser(
1036
- requestId: string,
1037
- response: { content: string; isError: boolean },
1038
- ): void {
1039
- this.hostBrowserProxy?.resolve(requestId, response);
1040
- }
1041
-
1042
- setHostBrowserProxy(proxy: HostBrowserProxy | undefined): void {
1043
- if (this.hostBrowserProxy && this.hostBrowserProxy !== proxy) {
1044
- this.hostBrowserProxy.dispose();
1045
- }
1046
- this.hostBrowserProxy = proxy;
1047
- }
1048
-
1049
- resolveHostFile(
1050
- requestId: string,
1051
- response: { content: string; isError: boolean; imageData?: string },
1052
- ): void {
1053
- this.hostFileProxy?.resolve(requestId, response);
1054
- }
1055
-
1056
- setHostFileProxy(proxy: HostFileProxy | undefined): void {
1057
- if (this.hostFileProxy && this.hostFileProxy !== proxy) {
1058
- this.hostFileProxy.dispose();
1059
- }
1060
- this.hostFileProxy = proxy;
1061
- }
1062
-
1063
- resolveHostTransfer(
1064
- requestId: string,
1065
- result: {
1066
- isError: boolean;
1067
- bytesWritten?: number;
1068
- errorMessage?: string;
1069
- },
1070
- ): void {
1071
- this.hostTransferProxy?.resolveTransferResult(requestId, result);
1072
- }
1073
-
1074
- setHostTransferProxy(proxy: HostTransferProxy | undefined): void {
1075
- if (this.hostTransferProxy && this.hostTransferProxy !== proxy) {
1076
- this.hostTransferProxy.dispose();
1077
- }
1078
- this.hostTransferProxy = proxy;
1079
- }
1080
-
1081
- getHostTransferProxy(): HostTransferProxy | undefined {
1082
- return this.hostTransferProxy;
1083
- }
1084
-
1085
- resolveHostCu(requestId: string, observation: CuObservationResult): void {
1086
- this.hostCuProxy?.resolve(requestId, observation);
1087
- }
1088
-
1089
932
  setHostCuProxy(proxy: HostCuProxy | undefined): void {
1090
933
  if (this.hostCuProxy && this.hostCuProxy !== proxy) {
1091
934
  this.hostCuProxy.dispose();
@@ -1142,14 +985,51 @@ export class Conversation {
1142
985
  }
1143
986
 
1144
987
  async forceCompact(): Promise<ContextWindowResult> {
988
+ const conversationRow = getConversation(this.conversationId);
989
+ const overrideProfile =
990
+ getConversationOverrideProfileFromRow(conversationRow) ?? null;
991
+ const config = getConfig();
992
+ const effectiveContextWindow = resolveEffectiveContextWindow({
993
+ llm: config.llm,
994
+ callSite: "mainAgent",
995
+ overrideProfile: overrideProfile ?? undefined,
996
+ });
997
+ (
998
+ this.contextWindowManager as ContextWindowManager & {
999
+ updateConfig?: (config: ContextWindowConfig) => void;
1000
+ }
1001
+ ).updateConfig?.(
1002
+ contextWindowConfigFromEffective(
1003
+ config.llm.default.contextWindow,
1004
+ effectiveContextWindow,
1005
+ ),
1006
+ );
1007
+ const slackChronologicalContext =
1008
+ this.channelCapabilities?.channel === "slack"
1009
+ ? loadSlackChronologicalContext(
1010
+ this.conversationId,
1011
+ this.channelCapabilities,
1012
+ {
1013
+ trustClass: this.trustContext?.trustClass,
1014
+ contextSummary: conversationRow?.contextSummary,
1015
+ contextCompactedMessageCount:
1016
+ conversationRow?.contextCompactedMessageCount,
1017
+ slackContextCompactionWatermarkTs:
1018
+ conversationRow?.slackContextCompactionWatermarkTs,
1019
+ },
1020
+ )
1021
+ : null;
1022
+ const messagesToCompact =
1023
+ slackChronologicalContext?.messages ?? this.messages;
1145
1024
  const result = await this.contextWindowManager.maybeCompact(
1146
- this.messages,
1025
+ messagesToCompact,
1147
1026
  this.abortController?.signal ?? undefined,
1148
1027
  {
1149
1028
  force: true,
1150
1029
  lastCompactedAt: this.contextCompactedAt ?? undefined,
1151
1030
  conversationOriginChannel:
1152
1031
  getConversationOriginChannel(this.conversationId) ?? undefined,
1032
+ overrideProfile,
1153
1033
  },
1154
1034
  );
1155
1035
  // Track circuit-breaker state for user-initiated `/compact` and other
@@ -1165,7 +1045,12 @@ export class Conversation {
1165
1045
  );
1166
1046
  }
1167
1047
  if (result.compacted) {
1168
- applyCompactionResult(this, result, this.sendToClient, null);
1048
+ applyCompactionResult(this, result, this.sendToClient, null, {
1049
+ slackContextCompactionWatermarkTs: getSlackCompactionWatermarkForPrefix(
1050
+ slackChronologicalContext,
1051
+ result.compactedMessages,
1052
+ ),
1053
+ });
1169
1054
  }
1170
1055
  return result;
1171
1056
  }
@@ -1202,6 +1087,10 @@ export class Conversation {
1202
1087
  this.transportHints = hints;
1203
1088
  }
1204
1089
 
1090
+ setSlackRuntimeContextNotice(notice: string | undefined): void {
1091
+ this.slackRuntimeContextNotice = notice;
1092
+ }
1093
+
1205
1094
  /**
1206
1095
  * Apply client-reported host environment (home dir, username) from
1207
1096
  * transport metadata onto the conversation. Only interfaces whose
@@ -1313,7 +1202,7 @@ export class Conversation {
1313
1202
  async runAgentLoop(
1314
1203
  content: string,
1315
1204
  userMessageId: string,
1316
- onEvent: (msg: ServerMessage) => void,
1205
+ onEvent?: (msg: ServerMessage) => void,
1317
1206
  options?: {
1318
1207
  isInteractive?: boolean;
1319
1208
  isUserMessage?: boolean;
@@ -1330,7 +1219,13 @@ export class Conversation {
1330
1219
  overrideProfile?: string;
1331
1220
  },
1332
1221
  ): Promise<void> {
1333
- return runAgentLoopImpl(this, content, userMessageId, onEvent, options);
1222
+ return runAgentLoopImpl(
1223
+ this,
1224
+ content,
1225
+ userMessageId,
1226
+ onEvent ?? this.sendToClient,
1227
+ options,
1228
+ );
1334
1229
  }
1335
1230
 
1336
1231
  drainQueue(reason: QueueDrainReason = "loop_complete"): Promise<void> {
@@ -1340,7 +1235,7 @@ export class Conversation {
1340
1235
  async processMessage(
1341
1236
  content: string,
1342
1237
  attachments: UserMessageAttachment[],
1343
- onEvent: (msg: ServerMessage) => void,
1238
+ onEvent?: (msg: ServerMessage) => void,
1344
1239
  requestId?: string,
1345
1240
  activeSurfaceId?: string,
1346
1241
  currentPage?: string,
@@ -1353,7 +1248,7 @@ export class Conversation {
1353
1248
  this as ProcessConversationContext,
1354
1249
  content,
1355
1250
  attachments,
1356
- onEvent,
1251
+ onEvent ?? this.sendToClient,
1357
1252
  requestId,
1358
1253
  activeSurfaceId,
1359
1254
  currentPage,
@@ -1372,17 +1267,6 @@ export class Conversation {
1372
1267
  return undoImpl(this as HistoryConversationContext);
1373
1268
  }
1374
1269
 
1375
- async regenerate(
1376
- onEvent: (msg: ServerMessage) => void,
1377
- requestId?: string,
1378
- ): Promise<void> {
1379
- return regenerateImpl(
1380
- this as HistoryConversationContext,
1381
- onEvent,
1382
- requestId,
1383
- );
1384
- }
1385
-
1386
1270
  // ── Surfaces ─────────────────────────────────────────────────────
1387
1271
 
1388
1272
  handleSurfaceAction(