@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
@@ -1,13 +1,8 @@
1
- import { existsSync, readFileSync, statSync } from "node:fs";
1
+ import { existsSync, readFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
 
4
- import {
5
- disposeAcpSessionManager,
6
- getAcpSessionManager,
7
- setBroadcastToAllClients,
8
- } from "../acp/index.js";
4
+ import { disposeAcpSessionManager } from "../acp/index.js";
9
5
  import { compileApp } from "../bundler/app-compiler.js";
10
- import { supportsHostProxy } from "../channels/types.js";
11
6
  import { getConfig } from "../config/loader.js";
12
7
  import { onContactChange } from "../contacts/contact-events.js";
13
8
  import type { CesClient } from "../credential-execution/client.js";
@@ -15,31 +10,17 @@ import type { CesProcessManager } from "../credential-execution/process-manager.
15
10
  import { AssistantIpcServer } from "../ipc/assistant-server.js";
16
11
  import { SkillIpcServer } from "../ipc/skill-server.js";
17
12
  import { getApp, getAppDirPath, isMultifileApp } from "../memory/app-store.js";
18
- import {
19
- uploadFileBackedAttachment,
20
- validateAttachmentUpload,
21
- } from "../memory/attachments-store.js";
22
- import { getOrCreateConversation } from "../memory/conversation-key-store.js";
23
13
  import { syncIdentityNameToPlatform } from "../platform/sync-identity.js";
24
14
  import { initializeProviders } from "../providers/registry.js";
25
- import { buildAssistantEvent } from "../runtime/assistant-event.js";
26
- import { assistantEventHub } from "../runtime/assistant-event-hub.js";
27
- import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
15
+ import { broadcastMessage } from "../runtime/assistant-event-hub.js";
28
16
  import { getSigningKeyFingerprint } from "../runtime/auth/token-service.js";
29
- import { checkIngressForSecrets } from "../security/secret-ingress.js";
30
17
  import { updatePublishedAppDeployment } from "../services/published-app-updater.js";
31
- import { registerCancelCallback } from "../signals/cancel.js";
32
- import { registerConversationUndoCallback } from "../signals/conversation-undo.js";
33
- import { appendEventToStream } from "../signals/event-stream.js";
34
- import { registerUserMessageCallback } from "../signals/user-message.js";
35
18
  import { getSubagentManager } from "../subagent/index.js";
36
- import { createAbortReason } from "../util/abort-reasons.js";
37
19
  import { getLogger } from "../util/logger.js";
38
20
  import {
39
21
  getAvatarImagePath,
40
22
  getWorkspacePromptPath,
41
23
  } from "../util/platform.js";
42
- import { registerDaemonCallbacks } from "../work-items/work-item-runner.js";
43
24
  import {
44
25
  AppSourceWatcher,
45
26
  setEnsureAppSourceWatcher,
@@ -47,37 +28,20 @@ import {
47
28
  import { getConfigWatcher } from "./config-watcher.js";
48
29
  import { Conversation } from "./conversation.js";
49
30
  import { ConversationEvictor } from "./conversation-evictor.js";
50
- import { registerLaunchConversationDeps } from "./conversation-launch.js";
51
31
  import {
52
32
  allConversations,
53
- clearAllActiveConversations,
54
33
  clearConversations,
55
34
  conversationEntries,
56
35
  deleteConversation,
57
- findConversation,
58
36
  getConversationMap,
59
37
  getOrCreateConversation as getOrCreateActiveConversation,
60
38
  initConversationLifecycle,
61
39
  setCesClientPromise,
62
40
  } from "./conversation-store.js";
63
41
  import { refreshSurfacesForApp } from "./conversation-surfaces.js";
64
- import { undoLastMessage } from "./handlers/conversations.js";
65
42
  import { parseIdentityFields } from "./handlers/identity.js";
66
- import {
67
- type ConversationCreateOptions,
68
- type HandlerContext,
69
- } from "./handlers/shared.js";
43
+ import type { ConversationCreateOptions } from "./handlers/shared.js";
70
44
  import { setGlobalSkillIpcSender } from "./meet-host-supervisor.js";
71
- import type {
72
- ServerMessage,
73
- UserMessageAttachment,
74
- } from "./message-protocol.js";
75
- import {
76
- makePendingInteractionRegistrar,
77
- prepareConversationForMessage,
78
- resolveTurnChannel,
79
- resolveTurnInterface,
80
- } from "./process-message.js";
81
45
 
82
46
  const log = getLogger("server");
83
47
 
@@ -99,7 +63,6 @@ export class DaemonServer {
99
63
  private sharedRequestTimestamps: number[] = [];
100
64
  private unsubscribeContactChange: (() => void) | null = null;
101
65
  private evictor: ConversationEvictor;
102
- private _hubChain: Promise<void> = Promise.resolve();
103
66
 
104
67
  // Composed subsystems
105
68
  private configWatcher = getConfigWatcher();
@@ -117,11 +80,6 @@ export class DaemonServer {
117
80
  /** Monotonically increasing counter to detect stale client updates. */
118
81
  private cesClientGeneration = 0;
119
82
 
120
- /**
121
- * Logical assistant identifier used when publishing to the assistant-events hub.
122
- */
123
- assistantId: string = DAEMON_INTERNAL_ASSISTANT_ID;
124
-
125
83
  /**
126
84
  * Inject the CES client and process manager from the caller (lifecycle.ts).
127
85
  * Must be called before start().
@@ -175,12 +133,12 @@ export class DaemonServer {
175
133
  constructor() {
176
134
  this.evictor = new ConversationEvictor(getConversationMap());
177
135
  getSubagentManager().sharedRequestTimestamps = this.sharedRequestTimestamps;
178
- getSubagentManager().broadcastToAllClients = (msg) => this.broadcast(msg);
136
+
179
137
  initConversationLifecycle({
180
138
  evictor: this.evictor,
181
139
  sharedRequestTimestamps: this.sharedRequestTimestamps,
182
140
  });
183
- setBroadcastToAllClients((msg) => this.broadcast(msg));
141
+
184
142
  setEnsureAppSourceWatcher(() => this.appSourceWatcher.ensureStarted());
185
143
  // Wire the skill IPC server into the meet-host supervisor's lazy
186
144
  // dispatch path. The supervisor is constructed in
@@ -197,121 +155,6 @@ export class DaemonServer {
197
155
  (c) => c.status === "running" || c.status === "pending",
198
156
  );
199
157
  };
200
- getSubagentManager().onSubagentFinished = async (
201
- parentConversationId,
202
- message,
203
- sendToClient,
204
- notification,
205
- ) => {
206
- const parentConversation = findConversation(parentConversationId);
207
- if (!parentConversation) {
208
- log.warn(
209
- { parentConversationId },
210
- "Subagent finished but parent conversation not found",
211
- );
212
- return;
213
- }
214
- const requestId = `subagent-notify-${Date.now()}`;
215
- const metadata = { subagentNotification: notification };
216
- const enqueueResult = parentConversation.enqueueMessage(
217
- message,
218
- [],
219
- sendToClient,
220
- requestId,
221
- undefined,
222
- undefined,
223
- metadata,
224
- );
225
- if (!enqueueResult.queued && !enqueueResult.rejected) {
226
- const messageId = await parentConversation.persistUserMessage(
227
- message,
228
- [],
229
- undefined,
230
- metadata,
231
- );
232
- parentConversation
233
- .runAgentLoop(message, messageId, sendToClient)
234
- .catch((err) => {
235
- log.error(
236
- { parentConversationId, err },
237
- "Failed to process subagent notification in parent",
238
- );
239
- });
240
- }
241
- };
242
- getAcpSessionManager().onAcpSessionFinished = async (
243
- parentConversationId,
244
- message,
245
- sendToClient,
246
- ) => {
247
- const parentConversation = findConversation(parentConversationId);
248
- if (!parentConversation) {
249
- log.warn(
250
- { parentConversationId },
251
- "ACP agent finished but parent conversation not found",
252
- );
253
- return;
254
- }
255
- const requestId = `acp-notify-${Date.now()}`;
256
- const enqueueResult = parentConversation.enqueueMessage(
257
- message,
258
- [],
259
- sendToClient,
260
- requestId,
261
- );
262
- if (!enqueueResult.queued && !enqueueResult.rejected) {
263
- const messageId = await parentConversation.persistUserMessage(
264
- message,
265
- [],
266
- );
267
- parentConversation
268
- .runAgentLoop(message, messageId, sendToClient)
269
- .catch((err: unknown) => {
270
- log.error(
271
- { parentConversationId, err },
272
- "Failed to process ACP notification in parent",
273
- );
274
- });
275
- }
276
- };
277
- }
278
-
279
- // ── Broadcast / Event publishing ──────────────────────────────────
280
-
281
- /**
282
- * Publish `msg` as an `AssistantEvent` to the process-level hub.
283
- * Publications are serialized via a promise chain so subscribers
284
- * always observe events in send order.
285
- */
286
- private publishAssistantEvent(
287
- msg: ServerMessage,
288
- conversationId?: string,
289
- ): void {
290
- const id = this.assistantId ?? DAEMON_INTERNAL_ASSISTANT_ID;
291
- const event = buildAssistantEvent(id, msg, conversationId);
292
- this._hubChain = this._hubChain
293
- .then(() => assistantEventHub.publish(event))
294
- .catch((err: unknown) => {
295
- log.warn(
296
- { err },
297
- "assistant-events hub subscriber threw during broadcast",
298
- );
299
- });
300
-
301
- // Dual-write to file-based stream for cross-process consumers.
302
- // No-op when no subscriber files exist for this conversation.
303
- if (conversationId) {
304
- try {
305
- appendEventToStream(conversationId, event);
306
- } catch {
307
- // Best-effort; file I/O failures must not block the hub chain.
308
- }
309
- }
310
- }
311
-
312
- broadcast(msg: ServerMessage): void {
313
- const conversationId = extractConversationId(msg);
314
- this.publishAssistantEvent(msg, conversationId);
315
158
  }
316
159
 
317
160
  private broadcastIdentityChanged(): void {
@@ -321,7 +164,7 @@ export class DaemonServer {
321
164
  ? readFileSync(identityPath, "utf-8")
322
165
  : "";
323
166
  const fields = parseIdentityFields(content);
324
- this.broadcast({
167
+ broadcastMessage({
325
168
  type: "identity_changed",
326
169
  name: fields.name,
327
170
  role: fields.role,
@@ -356,15 +199,15 @@ export class DaemonServer {
356
199
  }
357
200
 
358
201
  private broadcastConfigChanged(): void {
359
- this.broadcast({ type: "config_changed" });
202
+ broadcastMessage({ type: "config_changed" });
360
203
  }
361
204
 
362
205
  private broadcastSoundsConfigUpdated(): void {
363
- this.broadcast({ type: "sounds_config_updated" });
206
+ broadcastMessage({ type: "sounds_config_updated" });
364
207
  }
365
208
 
366
209
  private broadcastAvatarUpdated(): void {
367
- this.broadcast({
210
+ broadcastMessage({
368
211
  type: "avatar_updated",
369
212
  avatarPath: getAvatarImagePath(),
370
213
  });
@@ -382,7 +225,7 @@ export class DaemonServer {
382
225
  for (const conversation of allConversations()) {
383
226
  refreshSurfacesForApp(conversation, appId, { fileChange: true });
384
227
  }
385
- this.broadcast({ type: "app_files_changed", appId });
228
+ broadcastMessage({ type: "app_files_changed", appId });
386
229
  void updatePublishedAppDeployment(appId);
387
230
  };
388
231
 
@@ -417,146 +260,6 @@ export class DaemonServer {
417
260
 
418
261
  this.evictor.start();
419
262
 
420
- registerDaemonCallbacks({
421
- getOrCreateConversation: (conversationId) =>
422
- getOrCreateActiveConversation(conversationId),
423
- broadcast: (msg) => this.broadcast(msg),
424
- });
425
-
426
- registerCancelCallback((conversationId) => {
427
- const conversation = findConversation(conversationId);
428
- if (!conversation) return false;
429
- this.evictor.touch(conversationId);
430
- conversation.abort(
431
- createAbortReason(
432
- "signal_cancel",
433
- "registerCancelCallback",
434
- conversationId,
435
- ),
436
- );
437
- getSubagentManager().abortAllForParent(conversationId);
438
- return true;
439
- });
440
-
441
- registerConversationUndoCallback((conversationId) =>
442
- undoLastMessage(conversationId),
443
- );
444
-
445
- registerUserMessageCallback(async (params) => {
446
- // Block messages containing known-format secrets before persistence
447
- if (!params.bypassSecretCheck) {
448
- const ingressResult = checkIngressForSecrets(params.content);
449
- if (ingressResult.blocked) {
450
- return {
451
- accepted: false,
452
- error: "secret_blocked" as const,
453
- message: ingressResult.userNotice,
454
- };
455
- }
456
- }
457
-
458
- const { conversationId } = getOrCreateConversation(
459
- params.conversationKey,
460
- );
461
- const conversation = await getOrCreateActiveConversation(conversationId);
462
-
463
- // Register file-backed attachments so they flow through the send
464
- // pipeline as images the LLM can see directly.
465
- const attachmentIds: string[] = [];
466
- const resolvedAttachments: UserMessageAttachment[] = [];
467
- if (params.attachments && params.attachments.length > 0) {
468
- for (const a of params.attachments) {
469
- try {
470
- const validation = validateAttachmentUpload(a.filename, a.mimeType);
471
- if (!validation.ok) {
472
- log.warn(
473
- { error: validation.error, path: a.path },
474
- "Signal attachment rejected by validation",
475
- );
476
- continue;
477
- }
478
- const size = statSync(a.path).size;
479
- const stored = uploadFileBackedAttachment(
480
- a.filename,
481
- a.mimeType,
482
- a.path,
483
- size,
484
- );
485
- attachmentIds.push(stored.id);
486
- resolvedAttachments.push({
487
- id: stored.id,
488
- filename: a.filename,
489
- mimeType: a.mimeType,
490
- data: "",
491
- filePath: a.path,
492
- });
493
- } catch (err) {
494
- log.warn(
495
- { err, path: a.path },
496
- "Failed to register signal attachment",
497
- );
498
- }
499
- }
500
- }
501
-
502
- // Build a hub-publishing sender so events reach SSE clients.
503
- const hubSender = (msg: ServerMessage) => {
504
- const msgConversationId =
505
- "conversationId" in msg &&
506
- typeof (msg as { conversationId?: unknown }).conversationId ===
507
- "string"
508
- ? (msg as { conversationId: string }).conversationId
509
- : undefined;
510
- this.publishAssistantEvent(msg, msgConversationId ?? conversationId);
511
- };
512
-
513
- if (conversation.isProcessing()) {
514
- // Hydrate file data now — the queue path won't re-read from
515
- // the attachment store, so base64 content must be inline.
516
- for (let i = resolvedAttachments.length - 1; i >= 0; i--) {
517
- const att = resolvedAttachments[i];
518
- if (att.filePath && !att.data) {
519
- try {
520
- att.data = readFileSync(att.filePath).toString("base64");
521
- } catch (err) {
522
- log.warn(
523
- { err, path: att.filePath },
524
- "Failed to read queued signal attachment, skipping",
525
- );
526
- resolvedAttachments.splice(i, 1);
527
- }
528
- }
529
- }
530
- const requestId = crypto.randomUUID();
531
- const resolvedChannel = resolveTurnChannel(params.sourceChannel);
532
- const resolvedInterface = resolveTurnInterface(params.sourceInterface);
533
- const result = conversation.enqueueMessage(
534
- params.content,
535
- resolvedAttachments,
536
- hubSender,
537
- requestId,
538
- undefined,
539
- undefined,
540
- {
541
- userMessageChannel: resolvedChannel,
542
- assistantMessageChannel: resolvedChannel,
543
- userMessageInterface: resolvedInterface,
544
- assistantMessageInterface: resolvedInterface,
545
- },
546
- );
547
- return { accepted: !result.rejected };
548
- }
549
- await this.persistAndProcessMessage(
550
- conversationId,
551
- params.content,
552
- attachmentIds.length > 0 ? attachmentIds : undefined,
553
- { onEvent: hubSender },
554
- params.sourceChannel,
555
- params.sourceInterface,
556
- );
557
- return { accepted: true };
558
- });
559
-
560
263
  await this.cliIpc.start();
561
264
 
562
265
  // Start the skill IPC server. First-party skill processes connect to this
@@ -565,32 +268,6 @@ export class DaemonServer {
565
268
  // subsequent PRs in the skill-isolation plan.
566
269
  await this.skillIpc.start();
567
270
 
568
- // Wire the launchConversation helper to daemon-side state so
569
- // handleSurfaceAction can spawn conversations through it.
570
- registerLaunchConversationDeps({
571
- getOrCreateConversation: (id, options) =>
572
- getOrCreateActiveConversation(id, options),
573
- persistAndProcessMessage: (
574
- conversationId,
575
- content,
576
- attachmentIds,
577
- options,
578
- sourceChannel,
579
- sourceInterface,
580
- ) =>
581
- this.persistAndProcessMessage(
582
- conversationId,
583
- content,
584
- attachmentIds,
585
- options,
586
- sourceChannel,
587
- sourceInterface,
588
- ),
589
- publishAssistantEvent: (msg, conversationId) =>
590
- this.publishAssistantEvent(msg, conversationId),
591
- getAssistantId: () => this.assistantId,
592
- });
593
-
594
271
  this.configWatcher.start(
595
272
  () => this.evictConversationsForReload(),
596
273
  () => this.broadcastIdentityChanged(),
@@ -605,7 +282,7 @@ export class DaemonServer {
605
282
 
606
283
  // Broadcast contacts_changed to all clients when any contact mutation occurs.
607
284
  this.unsubscribeContactChange = onContactChange(() => {
608
- this.broadcast({ type: "contacts_changed" });
285
+ broadcastMessage({ type: "contacts_changed" });
609
286
  });
610
287
 
611
288
  log.info("DaemonServer started (HTTP-only mode)");
@@ -664,7 +341,7 @@ export class DaemonServer {
664
341
  // ── Conversation management ──────────────────────────────────────────────
665
342
 
666
343
  broadcastStatus(): void {
667
- this.broadcast({
344
+ broadcastMessage({
668
345
  type: "assistant_status",
669
346
  version: daemonVersion,
670
347
  keyFingerprint: getSigningKeyFingerprint(),
@@ -707,115 +384,6 @@ export class DaemonServer {
707
384
  this.evictConversationsForReload();
708
385
  }
709
386
 
710
- // ── Handler context ────────────────────────────────────────────────
711
-
712
- private handlerContext(): HandlerContext {
713
- return {
714
- sharedRequestTimestamps: this.sharedRequestTimestamps,
715
- debounceTimers: this.configWatcher.timers,
716
- suppressConfigReload: this.configWatcher.suppressConfigReload,
717
- setSuppressConfigReload: (value: boolean) => {
718
- this.configWatcher.suppressConfigReload = value;
719
- },
720
- updateConfigFingerprint: () => {
721
- this.configWatcher.updateFingerprint();
722
- },
723
- send: (msg) => this.broadcast(msg),
724
- broadcast: (msg) => this.broadcast(msg),
725
- clearAllConversations: () => clearAllActiveConversations(),
726
- getOrCreateConversation: (id, options?) =>
727
- getOrCreateActiveConversation(id, options),
728
- touchConversation: (id) => this.evictor.touch(id),
729
- };
730
- }
731
-
732
- // ── HTTP message processing ─────────────────────────────────────────
733
-
734
- async persistAndProcessMessage(
735
- conversationId: string,
736
- content: string,
737
- attachmentIds?: string[],
738
- options?: ConversationCreateOptions,
739
- sourceChannel?: string,
740
- sourceInterface?: string,
741
- ): Promise<{ messageId: string }> {
742
- const { conversation, attachments } = await prepareConversationForMessage(
743
- conversationId,
744
- content,
745
- attachmentIds,
746
- options,
747
- sourceChannel,
748
- sourceInterface,
749
- );
750
-
751
- const requestId = crypto.randomUUID();
752
- const messageId = await conversation.persistUserMessage(
753
- content,
754
- attachments,
755
- requestId,
756
- );
757
-
758
- // Register pending interactions so channel approval interception can
759
- // find the conversation by requestId when confirmation/secret events fire.
760
- const registrar = makePendingInteractionRegistrar(
761
- conversation,
762
- conversationId,
763
- );
764
- const onEvent = options?.onEvent
765
- ? (msg: ServerMessage) => {
766
- registrar(msg);
767
- try {
768
- options.onEvent!(msg);
769
- } catch (err) {
770
- log.error(
771
- { err, conversationId },
772
- "onEvent callback failed; continuing agent loop",
773
- );
774
- }
775
- }
776
- : registrar;
777
- // Non-interactive interfaces that still have a connected client capable
778
- // of handling host_browser_request events (e.g. chrome-extension) need
779
- // their hostBrowserProxy explicitly marked connected. The proxy
780
- // constructor defaults clientConnected = false, so without an explicit
781
- // sender update the chrome-extension proxy would be created and
782
- // immediately unavailable. We do NOT call updateClient(onEvent, false)
783
- // for that case, because flipping hasNoClient false would also enable
784
- // host_bash/host_file/host_cu tool gating for an interface that can't
785
- // service them. Instead, provision just the browser proxy's sender.
786
- const persistInterfaceCtx = conversation.getTurnInterfaceContext();
787
- const persistInterface = persistInterfaceCtx?.userMessageInterface;
788
- if (options?.isInteractive === true) {
789
- conversation.updateClient(onEvent, false);
790
- } else if (
791
- persistInterface &&
792
- !supportsHostProxy(persistInterface) &&
793
- supportsHostProxy(persistInterface, "host_browser")
794
- ) {
795
- conversation.hostBrowserProxy?.updateSender(onEvent, true);
796
- }
797
-
798
- conversation
799
- .runAgentLoop(content, messageId, onEvent, {
800
- isInteractive: options?.isInteractive ?? false,
801
- isUserMessage: true,
802
- ...(options?.callSite ? { callSite: options.callSite } : {}),
803
- })
804
- .finally(() => {
805
- if (
806
- options?.isInteractive === true &&
807
- conversation.getCurrentSender() === onEvent
808
- ) {
809
- conversation.updateClient(() => {}, true);
810
- }
811
- })
812
- .catch((err) => {
813
- log.error({ err, conversationId }, "Background agent loop failed");
814
- });
815
-
816
- return { messageId };
817
- }
818
-
819
387
  /**
820
388
  * Expose conversation lookup for the POST /v1/messages handler.
821
389
  * The handler manages busy-state checking and queueing itself.
@@ -826,21 +394,4 @@ export class DaemonServer {
826
394
  ): Promise<Conversation> {
827
395
  return getOrCreateActiveConversation(conversationId, options);
828
396
  }
829
-
830
- /**
831
- * Expose the handler context for use by conversation management HTTP routes.
832
- * The context is built on-the-fly so it always reflects the current server state.
833
- */
834
- getHandlerContext(): HandlerContext {
835
- return this.handlerContext();
836
- }
837
- }
838
-
839
- /** Extract conversationId from a ServerMessage if present. */
840
- function extractConversationId(msg: ServerMessage): string | undefined {
841
- const record = msg as unknown as Record<string, unknown>;
842
- if ("conversationId" in msg && typeof record.conversationId === "string") {
843
- return record.conversationId as string;
844
- }
845
- return undefined;
846
397
  }
@@ -21,7 +21,7 @@ export interface ShutdownDeps {
21
21
  server: DaemonServer;
22
22
  workspaceHeartbeat: WorkspaceHeartbeatService;
23
23
  heartbeat: HeartbeatService;
24
- filing: FilingService;
24
+ filing: FilingService | null;
25
25
  runtimeHttp: RuntimeHttpServer | null;
26
26
  scheduler: { stop(): void };
27
27
  feedScheduler: { stop(): void } | null;
@@ -61,7 +61,7 @@ export function installShutdownHandlers(deps: ShutdownDeps): void {
61
61
 
62
62
  await deps.workspaceHeartbeat.stop();
63
63
  await deps.heartbeat.stop();
64
- await deps.filing.stop();
64
+ if (deps.filing) await deps.filing.stop();
65
65
 
66
66
  // Run registered skill shutdown hooks (e.g. meet-join session teardown)
67
67
  // before stopping the server so any HTTP round-trips and SSE emissions