@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
@@ -207,7 +207,7 @@ export function isDaemonRunning(): boolean {
207
207
  return true;
208
208
  }
209
209
 
210
- export async function getDaemonStatus(): Promise<{
210
+ async function getDaemonStatus(): Promise<{
211
211
  running: boolean;
212
212
  pid?: number;
213
213
  }> {
@@ -287,7 +287,7 @@ function releaseStartupLock(): void {
287
287
  // NOTE: startDaemon() is the assistant-side daemon lifecycle manager.
288
288
  // It should eventually converge with cli/src/lib/local.ts::startLocalDaemon
289
289
  // which is the CLI-side equivalent.
290
- export async function startDaemon(): Promise<{
290
+ async function startDaemon(): Promise<{
291
291
  pid: number;
292
292
  alreadyRunning: boolean;
293
293
  }> {
@@ -339,7 +339,7 @@ export async function startDaemon(): Promise<{
339
339
  }
340
340
  }
341
341
 
342
- export async function startDaemonLocked(): Promise<{
342
+ async function startDaemonLocked(): Promise<{
343
343
  pid: number;
344
344
  alreadyRunning: boolean;
345
345
  }> {
@@ -447,74 +447,6 @@ export type StopResult =
447
447
  | { stopped: true }
448
448
  | { stopped: false; reason: "not_running" | "stop_failed" };
449
449
 
450
- export async function stopDaemon(): Promise<StopResult> {
451
- const pid = readPid();
452
- if (pid == null || !isProcessRunning(pid)) {
453
- cleanupPidFile();
454
- return { stopped: false, reason: "not_running" };
455
- }
456
-
457
- // Guard against stale PID reuse: if the PID has been recycled by the OS
458
- // and now belongs to an unrelated process, clean up the PID file but
459
- // never signal it.
460
- if (!isVellumDaemonProcess(pid)) {
461
- log.info(
462
- { pid },
463
- "PID file references a non-vellum process (stale PID reuse) — cleaning up PID file only",
464
- );
465
- cleanupPidFile();
466
- return { stopped: false, reason: "not_running" };
467
- }
468
-
469
- process.kill(pid, "SIGTERM");
470
-
471
- const timeouts = readDaemonTimeouts();
472
-
473
- // Wait for process to exit
474
- const maxWait = timeouts.stopTimeoutMs;
475
- const interval = 100;
476
- let waited = 0;
477
- while (waited < maxWait) {
478
- if (!isProcessRunning(pid)) {
479
- cleanupPidFile();
480
- return { stopped: true };
481
- }
482
- await new Promise((r) => setTimeout(r, interval));
483
- waited += interval;
484
- }
485
-
486
- // Force kill
487
- try {
488
- process.kill(pid, "SIGKILL");
489
- } catch (err) {
490
- log.debug({ err, pid }, "SIGKILL failed, process already exited");
491
- }
492
-
493
- // Wait for the process to actually die after SIGKILL. Without this,
494
- // startDaemon() can race with the dying process's shutdown handler.
495
- const killMaxWait = timeouts.sigkillGracePeriodMs;
496
- let killWaited = 0;
497
- while (killWaited < killMaxWait && isProcessRunning(pid)) {
498
- await new Promise((r) => setTimeout(r, 100));
499
- killWaited += 100;
500
- }
501
-
502
- // Only clean up if the process has actually exited.
503
- // If it's still alive after SIGKILL + timeout, preserve the PID file
504
- // so isDaemonRunning() still reports true and prevents a duplicate
505
- // daemon from being spawned.
506
- if (!isProcessRunning(pid)) {
507
- cleanupPidFile();
508
- return { stopped: true };
509
- }
510
-
511
- log.warn(
512
- { pid },
513
- "Daemon process still running after SIGKILL + timeout, leaving PID file intact",
514
- );
515
- return { stopped: false, reason: "stop_failed" };
516
- }
517
-
518
450
  export async function ensureDaemonRunning(): Promise<void> {
519
451
  const status = await getDaemonStatus();
520
452
  if (status.running) return;
@@ -13,7 +13,7 @@
13
13
  * — pino's `(meta, msg)` log methods vs the contract's `(msg, meta)`,
14
14
  * `getAssistantName()` returning `null` vs the contract's `undefined`,
15
15
  * `getProviderKeyAsync()` returning `undefined` vs the contract's `null`,
16
- * `buildAssistantEvent()` taking an assistantId first arg, etc. — the
16
+ * `buildAssistantEvent()` signature differences, etc. — the
17
17
  * adaptation happens inside this file so the contract stays narrow and the
18
18
  * underlying daemon APIs stay unchanged.
19
19
  */
@@ -69,7 +69,6 @@ import { resolveStreamingTranscriber as sttResolveStreamingTranscriber } from ".
69
69
  import { wakeAgentForOpportunity } from "../runtime/agent-wake.js";
70
70
  import { buildAssistantEvent } from "../runtime/assistant-event.js";
71
71
  import { assistantEventHub } from "../runtime/assistant-event-hub.js";
72
- import { DAEMON_INTERNAL_ASSISTANT_ID } from "../runtime/assistant-scope.js";
73
72
  import { getDaemonRuntimeMode } from "../runtime/runtime-mode.js";
74
73
  import { registerSkillRoute } from "../runtime/skill-route-registry.js";
75
74
  import { getProviderKeyAsync } from "../security/secure-keys.js";
@@ -118,7 +117,6 @@ function buildIdentityFacet(): IdentityFacet {
118
117
  return {
119
118
  // Contract uses `undefined`; delegate returns `null`. Normalize here.
120
119
  getAssistantName: () => getAssistantName() ?? undefined,
121
- internalAssistantId: DAEMON_INTERNAL_ASSISTANT_ID,
122
120
  };
123
121
  }
124
122
 
@@ -204,15 +202,14 @@ function buildEventsFacet(): EventsFacet {
204
202
  publish: (event: AssistantEvent) =>
205
203
  assistantEventHub.publish(event as never),
206
204
  subscribe: (filter: Filter, cb: AssistantEventCallback): Subscription =>
207
- assistantEventHub.subscribe(filter, cb as never),
208
- // `buildAssistantEvent` takes `(assistantId, message, conversationId?)`.
209
- // Skills always publish as the internal assistant, so curry that arg.
205
+ assistantEventHub.subscribe({
206
+ type: "process",
207
+ filter,
208
+ callback: cb,
209
+ }),
210
+ // `buildAssistantEvent` takes `(message, conversationId?)`.
210
211
  buildEvent: (message: ServerMessage, conversationId?: string) =>
211
- buildAssistantEvent(
212
- DAEMON_INTERNAL_ASSISTANT_ID,
213
- message as never,
214
- conversationId,
215
- ) as AssistantEvent,
212
+ buildAssistantEvent(message as never, conversationId) as AssistantEvent,
216
213
  };
217
214
  }
218
215
 
@@ -5,15 +5,8 @@
5
5
  * atomic-write pattern (write .tmp → rename → chmod).
6
6
  */
7
7
 
8
- import {
9
- chmodSync,
10
- existsSync,
11
- mkdirSync,
12
- readFileSync,
13
- renameSync,
14
- writeFileSync,
15
- } from "node:fs";
16
- import { dirname, join } from "node:path";
8
+ import { existsSync, readFileSync } from "node:fs";
9
+ import { join } from "node:path";
17
10
 
18
11
  import { getLogger } from "../util/logger.js";
19
12
  import { getWorkspaceDir } from "../util/platform.js";
@@ -250,18 +243,6 @@ function loadFromDisk(): DictationProfilesConfig {
250
243
  }
251
244
  }
252
245
 
253
- function saveToDisk(config: DictationProfilesConfig): void {
254
- const path = getStorePath();
255
- const dir = dirname(path);
256
- if (!existsSync(dir)) {
257
- mkdirSync(dir, { recursive: true });
258
- }
259
- const tmpPath = path + ".tmp." + process.pid;
260
- writeFileSync(tmpPath, JSON.stringify(config, null, 2), { mode: 0o600 });
261
- renameSync(tmpPath, path);
262
- chmodSync(path, 0o600);
263
- }
264
-
265
246
  // --- Public API ---
266
247
 
267
248
  export function loadConfig(): DictationProfilesConfig {
@@ -271,11 +252,6 @@ export function loadConfig(): DictationProfilesConfig {
271
252
  return cachedConfig;
272
253
  }
273
254
 
274
- export function saveConfig(config: DictationProfilesConfig): void {
275
- cachedConfig = config;
276
- saveToDisk(config);
277
- }
278
-
279
255
  function isProfileEnabled(profile: DictationProfile): boolean {
280
256
  return profile.enabled !== false;
281
257
  }
@@ -2,18 +2,21 @@ import { existsSync } from "node:fs";
2
2
 
3
3
  import { getWorkspacePromptPath } from "../util/platform.js";
4
4
 
5
+ type Tone = "grounded" | "warm" | "energetic" | "poetic";
6
+
5
7
  export interface OnboardingGreetingContext {
6
8
  tools: string[];
7
9
  tasks: string[];
10
+ /** Valid values: "grounded" | "warm" | "energetic" | "poetic" */
8
11
  tone: string;
9
12
  userName?: string;
10
13
  assistantName?: string;
11
14
  }
12
15
 
13
16
  export const CANNED_FIRST_GREETING = [
14
- "Hey — brand new, no name, no memories, no idea who you are yet. I'll get sharper the more we work together.",
17
+ "Hey,",
15
18
  "",
16
- "What can I do for you? Or I can ask you some questions to get started.",
19
+ "We can get into whatever you've got, or just talk first that tends to go better. Up to you.",
17
20
  ].join("\n");
18
21
 
19
22
  /**
@@ -45,174 +48,59 @@ export function getCannedFirstGreeting(
45
48
  return CANNED_FIRST_GREETING;
46
49
  }
47
50
 
48
- const TOOL_LABELS: Record<string, string> = {
49
- gmail: "Gmail",
50
- outlook: "Outlook",
51
- "google-calendar": "Google Calendar",
52
- slack: "Slack",
53
- notion: "Notion",
54
- linear: "Linear",
55
- jira: "Jira",
56
- github: "GitHub",
57
- figma: "Figma",
58
- "google-drive": "Google Drive",
59
- excel: "Excel",
60
- "apple-notes": "Apple Notes",
51
+ const TONE_INTRO_CLOSE: Record<Tone, string> = {
52
+ grounded: "",
53
+ warm: "Good to meet you.",
54
+ energetic: "Let's see what you've got.",
55
+ poetic: "",
61
56
  };
62
57
 
63
- const TASK_PRIORITY: string[] = [
64
- "code-building",
65
- "project-management",
66
- "writing",
67
- "research",
68
- "scheduling",
69
- "personal",
70
- ];
71
-
72
- interface Guess {
73
- text: string;
74
- preferredTools: string[];
58
+ function buildIntroLine(
59
+ name?: string,
60
+ assistant?: string,
61
+ tone: Tone = "grounded",
62
+ ): string {
63
+ const greeting = name ? `Hey ${name},` : "Hey,";
64
+ const who = assistant ? `I'm ${assistant}.` : "";
65
+ const close = assistant ? TONE_INTRO_CLOSE[tone] : "";
66
+ return [greeting, who, close].filter(Boolean).join(" ");
75
67
  }
76
68
 
77
- const SINGLE_GUESSES: Record<string, Guess> = {
78
- "code-building": {
79
- text: "shipping something or debugging",
80
- preferredTools: ["github", "linear", "jira"],
81
- },
82
- writing: {
83
- text: "drafting something or cleaning up docs",
84
- preferredTools: ["notion", "google-drive", "apple-notes"],
85
- },
86
- research: {
87
- text: "digging into a topic or making sense of something",
88
- preferredTools: ["notion", "google-drive"],
89
- },
90
- "project-management": {
91
- text: "planning the week, writing a spec, or pushing something forward",
92
- preferredTools: ["notion", "linear", "google-drive"],
93
- },
94
- scheduling: {
95
- text: "planning the week or prepping for meetings",
96
- preferredTools: ["google-calendar", "outlook", "linear"],
97
- },
98
- personal: {
99
- text: "juggling travel, bills, or household stuff",
100
- preferredTools: ["gmail", "google-calendar", "apple-notes"],
101
- },
69
+ const TONE_INVITE: Record<Tone, string> = {
70
+ grounded:
71
+ "We can get into whatever you've got, or just talk first — that tends to go better. Up to you.",
72
+ warm: "We can start on something specific, or just talk for a bit first — honestly that tends to work out better. Either way, I'm here.",
73
+ energetic:
74
+ "We can jump straight into whatever you've got, or take a few minutes to just talk first. What sounds right?",
75
+ poetic:
76
+ "We can start with whatever's in front of you, or just talk for a bit first. Either way.",
102
77
  };
103
78
 
104
- const COMBO_GUESSES: Record<string, Guess> = {
105
- "code-building+project-management": {
106
- text: "shipping code or figuring out what to ship next",
107
- preferredTools: ["github", "linear", "jira"],
108
- },
109
- "code-building+writing": {
110
- text: "shipping code or writing something up",
111
- preferredTools: ["github", "linear", "jira"],
112
- },
113
- "project-management+writing": {
114
- text: "writing a spec or pushing something forward",
115
- preferredTools: ["notion", "linear", "google-drive"],
116
- },
117
- "research+writing": {
118
- text: "drafting something or digging into a topic",
119
- preferredTools: ["notion", "google-drive"],
120
- },
121
- "project-management+scheduling": {
122
- text: "planning the week or prepping for something",
123
- preferredTools: ["google-calendar", "outlook", "linear"],
124
- },
125
- };
126
-
127
- function comboKey(a: string, b: string): string {
128
- return [a, b].sort().join("+");
129
- }
130
-
131
- function highestPriorityTask(tasks: string[]): string | undefined {
132
- for (const t of TASK_PRIORITY) {
133
- if (tasks.includes(t)) return t;
134
- }
135
- return tasks[0];
136
- }
137
-
138
- function buildIntroLine(userName?: string, assistantName?: string): string {
139
- const namepart = userName ? `Hey ${userName},` : "Hey,";
140
- const who = assistantName
141
- ? `I'm ${assistantName}. Brand new, and I'll get sharper the more we work together.`
142
- : "brand new, and I'll get sharper the more we work together.";
143
- return `${namepart} ${who}`;
79
+ function buildInvite(tone: Tone = "grounded"): string {
80
+ return TONE_INVITE[tone];
144
81
  }
145
82
 
146
- function pickRelevantTools(
147
- preferredTools: string[],
148
- userTools: string[],
149
- ): string[] {
150
- const userSet = new Set(userTools);
151
- const matched: string[] = [];
152
- for (const t of preferredTools) {
153
- if (userSet.has(t)) {
154
- matched.push(TOOL_LABELS[t] ?? t);
155
- if (matched.length === 2) break;
156
- }
157
- }
158
- return matched;
159
- }
160
-
161
- function buildSpecificGuess(tasks: string[], tools: string[]): string {
162
- let guess: Guess | undefined;
163
-
164
- if (tasks.length === 2) {
165
- guess = COMBO_GUESSES[comboKey(tasks[0], tasks[1])];
166
- }
167
-
168
- if (!guess) {
169
- const top = highestPriorityTask(tasks);
170
- guess = top ? SINGLE_GUESSES[top] : undefined;
171
- }
172
-
173
- if (!guess) return "";
174
-
175
- const relevant = pickRelevantTools(guess.preferredTools, tools);
176
-
177
- if (relevant.length === 2) {
178
- return `You mentioned using ${relevant[0]} and ${relevant[1]} — probably ${guess.text}? Am I on the right track, or something else on your mind?`;
179
- }
180
- if (relevant.length === 1) {
181
- return `You mentioned using ${relevant[0]} — probably ${guess.text}? Am I on the right track, or something else on your mind?`;
182
- }
83
+ const VALID_TONES = new Set<string>([
84
+ "grounded",
85
+ "warm",
86
+ "energetic",
87
+ "poetic",
88
+ ]);
183
89
 
184
- return `Probably ${guess.text}? Am I on the right track, or something else on your mind?`;
90
+ function resolveTone(raw?: string): Tone {
91
+ return raw && VALID_TONES.has(raw) ? (raw as Tone) : "grounded";
185
92
  }
186
93
 
187
94
  function buildPersonalizedGreeting(ctx: OnboardingGreetingContext): string {
188
- const userName = ctx.userName?.trim();
189
- const assistantName = ctx.assistantName?.trim();
190
-
191
- const hasName = userName && userName.length > 0;
192
- const hasTasks = ctx.tasks.length > 0;
193
- const hasTools = ctx.tools.length > 0;
95
+ const name = ctx.userName?.trim();
96
+ const assistant = ctx.assistantName?.trim();
97
+ const tone = resolveTone(ctx.tone);
194
98
 
195
- const hasAssistantName = assistantName && assistantName.length > 0;
196
-
197
- if (!hasName && !hasTasks && !hasTools && !hasAssistantName) {
99
+ if (!name && !assistant && !VALID_TONES.has(ctx.tone)) {
198
100
  return CANNED_FIRST_GREETING;
199
101
  }
200
102
 
201
- const intro = buildIntroLine(hasName ? userName : undefined, assistantName);
202
-
203
- let secondParagraph: string;
204
-
205
- if (ctx.tasks.length >= 4) {
206
- secondParagraph =
207
- "Looks like you wear a lot of hats. Where should we start?";
208
- } else if (ctx.tasks.length === 0) {
209
- secondParagraph =
210
- "What's on your plate? Or if it's easier, I can ask you a few questions to get oriented.";
211
- } else {
212
- secondParagraph =
213
- buildSpecificGuess(ctx.tasks, ctx.tools) ||
214
- "What's on your plate? Or if it's easier, I can ask you a few questions to get oriented.";
215
- }
216
-
217
- return [intro, "", secondParagraph].join("\n");
103
+ const intro = buildIntroLine(name, assistant, tone);
104
+ const invite = buildInvite(tone);
105
+ return [intro, "", invite].join("\n");
218
106
  }
@@ -12,6 +12,7 @@ import { revokeMember } from "../../contacts/contacts-write.js";
12
12
  import type { ChannelStatus } from "../../contacts/types.js";
13
13
  import { getBindingByChannelChat } from "../../memory/external-conversation-store.js";
14
14
  import { resolveGuardianName } from "../../prompts/user-reference.js";
15
+ import { broadcastMessage } from "../../runtime/assistant-event-hub.js";
15
16
  import { DAEMON_INTERNAL_ASSISTANT_ID } from "../../runtime/assistant-scope.js";
16
17
  import {
17
18
  type ChannelReadinessService,
@@ -49,7 +50,7 @@ import type {
49
50
  ChannelVerificationSessionRequest,
50
51
  ChannelVerificationSessionResponse,
51
52
  } from "../message-protocol.js";
52
- import { type HandlerContext, log } from "./shared.js";
53
+ import { log } from "./shared.js";
53
54
 
54
55
  // -- Transport-agnostic result type (omits the `type` discriminant) --
55
56
 
@@ -522,14 +523,13 @@ export async function verifyTrustedContact(
522
523
 
523
524
  export async function handleChannelVerificationSession(
524
525
  msg: ChannelVerificationSessionRequest,
525
- ctx: HandlerContext,
526
526
  ): Promise<void> {
527
527
  const channel = msg.channel ?? "telegram";
528
528
 
529
529
  try {
530
530
  if (msg.action === "create_session") {
531
531
  if (msg.purpose === "trusted_contact" && !msg.contactChannelId) {
532
- ctx.send({
532
+ broadcastMessage({
533
533
  type: "channel_verification_session_response",
534
534
  success: false,
535
535
  error: "contactChannelId is required for trusted_contact purpose",
@@ -540,7 +540,7 @@ export async function handleChannelVerificationSession(
540
540
  msg.contactChannelId!,
541
541
  DAEMON_INTERNAL_ASSISTANT_ID,
542
542
  );
543
- ctx.send({
543
+ broadcastMessage({
544
544
  type: "channel_verification_session_response",
545
545
  ...result,
546
546
  });
@@ -556,7 +556,7 @@ export async function handleChannelVerificationSession(
556
556
  deliverVerificationSlack(userId, text, aid);
557
557
  }
558
558
  const { _pendingSlackDm: _, ...publicResult } = result;
559
- ctx.send({
559
+ broadcastMessage({
560
560
  type: "channel_verification_session_response",
561
561
  ...publicResult,
562
562
  });
@@ -566,28 +566,28 @@ export async function handleChannelVerificationSession(
566
566
  msg.rebind,
567
567
  msg.conversationId,
568
568
  );
569
- ctx.send({
569
+ broadcastMessage({
570
570
  type: "channel_verification_session_response",
571
571
  ...result,
572
572
  });
573
573
  }
574
574
  } else if (msg.action === "status") {
575
575
  const result = getVerificationStatus(channel);
576
- ctx.send({
576
+ broadcastMessage({
577
577
  type: "channel_verification_session_response",
578
578
  ...result,
579
579
  });
580
580
  } else if (msg.action === "cancel_session") {
581
581
  cancelOutbound({ channel });
582
582
  revokePendingSessions(channel);
583
- ctx.send({
583
+ broadcastMessage({
584
584
  type: "channel_verification_session_response",
585
585
  success: true,
586
586
  channel,
587
587
  });
588
588
  } else if (msg.action === "revoke") {
589
589
  const result = revokeVerificationForChannel(channel);
590
- ctx.send({
590
+ broadcastMessage({
591
591
  type: "channel_verification_session_response",
592
592
  ...result,
593
593
  });
@@ -601,12 +601,12 @@ export async function handleChannelVerificationSession(
601
601
  deliverVerificationSlack(userId, text, aid);
602
602
  }
603
603
  const { _pendingSlackDm: _, ...publicResult } = result;
604
- ctx.send({
604
+ broadcastMessage({
605
605
  type: "channel_verification_session_response",
606
606
  ...publicResult,
607
607
  });
608
608
  } else {
609
- ctx.send({
609
+ broadcastMessage({
610
610
  type: "channel_verification_session_response",
611
611
  success: false,
612
612
  error: `Unknown action: ${String(msg.action)}`,
@@ -616,7 +616,7 @@ export async function handleChannelVerificationSession(
616
616
  } catch (err) {
617
617
  const message = err instanceof Error ? err.message : String(err);
618
618
  log.error({ err }, "Failed to handle channel verification session");
619
- ctx.send({
619
+ broadcastMessage({
620
620
  type: "channel_verification_session_response",
621
621
  success: false,
622
622
  error: message,