@vellumai/assistant 0.7.1 → 0.7.3

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 (739) hide show
  1. package/ARCHITECTURE.md +48 -50
  2. package/Dockerfile +1 -0
  3. package/README.md +1 -2
  4. package/__tests__/permissions/gateway-threshold-reader.test.ts +9 -3
  5. package/bun.lock +26 -26
  6. package/docs/architecture/memory.md +5 -2
  7. package/docs/architecture/security.md +20 -0
  8. package/docs/plugins.md +7 -9
  9. package/knip.json +1 -0
  10. package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
  11. package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +52 -5
  12. package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
  13. package/node_modules/@vellumai/service-contracts/package.json +2 -0
  14. package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
  15. package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
  16. package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
  17. package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
  18. package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
  19. package/node_modules/@vellumai/slack-text/src/index.test.ts +18 -35
  20. package/node_modules/@vellumai/slack-text/src/index.ts +2 -48
  21. package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
  22. package/node_modules/@vellumai/twilio-client/package.json +18 -0
  23. package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
  24. package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
  25. package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
  26. package/openapi.yaml +1020 -40
  27. package/package.json +6 -3
  28. package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
  29. package/src/__tests__/app-bundler.test.ts +170 -1
  30. package/src/__tests__/app-control-flow.test.ts +384 -0
  31. package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
  32. package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
  33. package/src/__tests__/app-executors.test.ts +30 -43
  34. package/src/__tests__/approval-routes-http.test.ts +23 -6
  35. package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
  36. package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
  37. package/src/__tests__/assistant-event-hub.test.ts +157 -2
  38. package/src/__tests__/assistant-feature-flags-integration.test.ts +29 -7
  39. package/src/__tests__/auto-analysis-end-to-end.test.ts +62 -1
  40. package/src/__tests__/background-shell-host-bash.test.ts +14 -15
  41. package/src/__tests__/background-workers-disk-pressure.test.ts +268 -0
  42. package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
  43. package/src/__tests__/btw-routes.test.ts +13 -4
  44. package/src/__tests__/call-controller.test.ts +49 -1
  45. package/src/__tests__/call-conversation-messages.test.ts +8 -2
  46. package/src/__tests__/call-domain.test.ts +0 -2
  47. package/src/__tests__/call-routes-http.test.ts +0 -2
  48. package/src/__tests__/channel-inbound-disk-pressure.test.ts +537 -0
  49. package/src/__tests__/channel-readiness-service.test.ts +62 -2
  50. package/src/__tests__/checker.test.ts +3 -4
  51. package/src/__tests__/config-loader-backfill.test.ts +461 -147
  52. package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
  53. package/src/__tests__/config-schema-cmd.test.ts +0 -1
  54. package/src/__tests__/config-schema.test.ts +1 -0
  55. package/src/__tests__/config-set-platform-guard.test.ts +48 -4
  56. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +20 -11
  57. package/src/__tests__/config-watcher.test.ts +142 -71
  58. package/src/__tests__/context-search-agent-runner.test.ts +61 -3
  59. package/src/__tests__/context-search-conversations-source.test.ts +0 -24
  60. package/src/__tests__/context-search-fanout.test.ts +0 -1
  61. package/src/__tests__/context-search-memory-source.test.ts +3 -7
  62. package/src/__tests__/context-search-memory-v2-source.test.ts +0 -2
  63. package/src/__tests__/context-search-pkb-source.test.ts +0 -1
  64. package/src/__tests__/context-search-workspace-source.test.ts +0 -1
  65. package/src/__tests__/conversation-abort-tool-results.test.ts +6 -0
  66. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +223 -0
  67. package/src/__tests__/conversation-agent-loop.test.ts +454 -5
  68. package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
  69. package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
  70. package/src/__tests__/conversation-error.test.ts +150 -3
  71. package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
  72. package/src/__tests__/conversation-lifecycle.test.ts +36 -0
  73. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
  74. package/src/__tests__/conversation-process-callsite.test.ts +43 -0
  75. package/src/__tests__/conversation-provider-retry-repair.test.ts +6 -0
  76. package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
  77. package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
  78. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
  79. package/src/__tests__/conversation-runtime-assembly.test.ts +65 -0
  80. package/src/__tests__/conversation-slash-commands.test.ts +0 -4
  81. package/src/__tests__/conversation-slash-unknown.test.ts +6 -0
  82. package/src/__tests__/conversation-speed-override.test.ts +0 -3
  83. package/src/__tests__/conversation-store.test.ts +0 -18
  84. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
  85. package/src/__tests__/conversation-surfaces-app-control.test.ts +328 -0
  86. package/src/__tests__/conversation-surfaces-data-persist.test.ts +404 -0
  87. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +2 -5
  88. package/src/__tests__/conversation-workspace-injection.test.ts +6 -0
  89. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +6 -0
  90. package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
  91. package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
  92. package/src/__tests__/credentials-cli.test.ts +12 -12
  93. package/src/__tests__/cu-unified-flow.test.ts +351 -23
  94. package/src/__tests__/daemon-credential-client.test.ts +101 -19
  95. package/src/__tests__/date-context.test.ts +164 -2
  96. package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
  97. package/src/__tests__/disk-pressure-guard.test.ts +262 -0
  98. package/src/__tests__/disk-pressure-lifecycle.test.ts +168 -0
  99. package/src/__tests__/disk-pressure-policy.test.ts +241 -0
  100. package/src/__tests__/disk-pressure-routes.test.ts +379 -0
  101. package/src/__tests__/disk-pressure-tools.test.ts +277 -0
  102. package/src/__tests__/disk-usage.test.ts +150 -0
  103. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  104. package/src/__tests__/events-client-registration.test.ts +52 -0
  105. package/src/__tests__/events-dev-bypass-actor.test.ts +162 -0
  106. package/src/__tests__/file-write-tool.test.ts +4 -10
  107. package/src/__tests__/filing-service.test.ts +3 -4
  108. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  109. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
  110. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
  111. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
  112. package/src/__tests__/heartbeat-disk-pressure.test.ts +183 -0
  113. package/src/__tests__/heartbeat-service.test.ts +968 -2
  114. package/src/__tests__/helpers/call-route-handler.ts +7 -1
  115. package/src/__tests__/host-app-control-proxy.test.ts +772 -0
  116. package/src/__tests__/host-app-control-routes.test.ts +263 -0
  117. package/src/__tests__/host-bash-proxy.test.ts +439 -47
  118. package/src/__tests__/host-bash-routes.test.ts +459 -0
  119. package/src/__tests__/host-browser-proxy.test.ts +24 -22
  120. package/src/__tests__/host-browser-routes.test.ts +39 -13
  121. package/src/__tests__/host-cu-proxy.test.ts +248 -52
  122. package/src/__tests__/host-cu-routes-targeted.test.ts +429 -0
  123. package/src/__tests__/host-file-edit-tool.test.ts +47 -1
  124. package/src/__tests__/host-file-proxy-targeted.test.ts +378 -0
  125. package/src/__tests__/host-file-proxy.test.ts +301 -45
  126. package/src/__tests__/host-file-read-tool.test.ts +17 -0
  127. package/src/__tests__/host-file-routes-targeted.test.ts +420 -0
  128. package/src/__tests__/host-file-write-tool.test.ts +42 -1
  129. package/src/__tests__/host-proxy-base.test.ts +312 -0
  130. package/src/__tests__/host-shell-tool.test.ts +22 -4
  131. package/src/__tests__/host-transfer-proxy-targeted.test.ts +932 -0
  132. package/src/__tests__/host-transfer-proxy.test.ts +121 -22
  133. package/src/__tests__/host-transfer-routes-targeted.test.ts +662 -0
  134. package/src/__tests__/http-user-message-parity.test.ts +108 -1
  135. package/src/__tests__/identity-intro-cache.test.ts +29 -0
  136. package/src/__tests__/identity-routes.test.ts +103 -1
  137. package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
  138. package/src/__tests__/injector-chain.test.ts +18 -6
  139. package/src/__tests__/injector-disk-pressure.test.ts +224 -0
  140. package/src/__tests__/inline-command-runner.test.ts +0 -1
  141. package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
  142. package/src/__tests__/integration-status.test.ts +85 -5
  143. package/src/__tests__/intent-routing.test.ts +0 -1
  144. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
  145. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
  146. package/src/__tests__/managed-profile-guard.test.ts +18 -0
  147. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
  148. package/src/__tests__/mcp-abort-signal.test.ts +130 -0
  149. package/src/__tests__/mcp-auth-routes.test.ts +197 -0
  150. package/src/__tests__/mcp-cli.test.ts +338 -2
  151. package/src/__tests__/memory-admin-recall.test.ts +3 -11
  152. package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
  153. package/src/__tests__/memory-retrieval-pipeline.test.ts +22 -1
  154. package/src/__tests__/migration-import-commit-http.test.ts +108 -2
  155. package/src/__tests__/mock-gateway-ipc.ts +1 -0
  156. package/src/__tests__/normalize-onboarding.test.ts +180 -0
  157. package/src/__tests__/oauth-cli.test.ts +0 -2
  158. package/src/__tests__/oauth-connect-routes.test.ts +316 -0
  159. package/src/__tests__/oauth-provider-seed-logos.test.ts +24 -2
  160. package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
  161. package/src/__tests__/onboarding-persona-write.test.ts +308 -0
  162. package/src/__tests__/openai-provider.test.ts +45 -8
  163. package/src/__tests__/persist-onboarding-artifacts.test.ts +44 -64
  164. package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
  165. package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
  166. package/src/__tests__/platform-callback-registration.test.ts +21 -4
  167. package/src/__tests__/platform.test.ts +2 -1
  168. package/src/__tests__/playbook-execution.test.ts +0 -43
  169. package/src/__tests__/plugin-tool-contribution.test.ts +47 -0
  170. package/src/__tests__/prechat-onboarding-contract.test.ts +214 -25
  171. package/src/__tests__/process-message-background-slack.test.ts +2 -0
  172. package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
  173. package/src/__tests__/provider-tool-name.test.ts +23 -0
  174. package/src/__tests__/public-ingress-urls.test.ts +97 -0
  175. package/src/__tests__/relay-server.test.ts +15 -4
  176. package/src/__tests__/require-fresh-approval.test.ts +0 -1
  177. package/src/__tests__/retry-backoff.test.ts +87 -0
  178. package/src/__tests__/runtime-events-sse.test.ts +2 -2
  179. package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
  180. package/src/__tests__/schedule-retry.test.ts +715 -0
  181. package/src/__tests__/scheduler-disk-pressure.test.ts +148 -0
  182. package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
  183. package/src/__tests__/secret-ingress-http.test.ts +1 -1
  184. package/src/__tests__/send-endpoint-busy.test.ts +3 -0
  185. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
  186. package/src/__tests__/skill-feature-flags.test.ts +43 -41
  187. package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
  188. package/src/__tests__/skill-load-inline-command.test.ts +0 -51
  189. package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
  190. package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
  191. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
  192. package/src/__tests__/slack-channel-config.test.ts +9 -14
  193. package/src/__tests__/suggestion-routes.test.ts +46 -0
  194. package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
  195. package/src/__tests__/system-prompt.test.ts +0 -1
  196. package/src/__tests__/telegram-config.test.ts +0 -1
  197. package/src/__tests__/test-preload.ts +8 -0
  198. package/src/__tests__/tool-approval-handler.test.ts +3 -4
  199. package/src/__tests__/tool-audit-listener.test.ts +48 -0
  200. package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
  201. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  202. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  203. package/src/__tests__/tool-executor.test.ts +0 -1
  204. package/src/__tests__/twilio-config.test.ts +3 -16
  205. package/src/__tests__/twilio-routes.test.ts +3 -5
  206. package/src/__tests__/twilio-validation.test.ts +93 -0
  207. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
  208. package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
  209. package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
  210. package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
  211. package/src/__tests__/workspace-migration-065-bump-stale-heartbeat-interval.test.ts +122 -0
  212. package/src/__tests__/workspace-migration-066-seed-heartbeat-callsite-cost-default.test.ts +285 -0
  213. package/src/__tests__/workspace-migration-068-release-notes-local-timezone.test.ts +90 -0
  214. package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
  215. package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
  216. package/src/__tests__/workspace-migration-safe-storage-limits-release.test.ts +90 -0
  217. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
  218. package/src/approvals/guardian-decision-primitive.ts +13 -0
  219. package/src/approvals/guardian-request-resolvers.ts +16 -17
  220. package/src/backup/__tests__/paths.test.ts +0 -22
  221. package/src/backup/__tests__/restore.test.ts +51 -151
  222. package/src/backup/paths.ts +2 -18
  223. package/src/backup/restore.ts +107 -231
  224. package/src/backup/snapshot-lock.ts +2 -27
  225. package/src/bundler/app-bundler.ts +51 -3
  226. package/src/bundler/compiler-tools.ts +3 -2
  227. package/src/calls/call-conversation-messages.ts +46 -10
  228. package/src/calls/relay-server.ts +4 -44
  229. package/src/calls/twilio-config.ts +2 -17
  230. package/src/calls/twilio-rest.ts +33 -105
  231. package/src/calls/twilio-routes.ts +11 -12
  232. package/src/channels/types.ts +8 -7
  233. package/src/cli/commands/__tests__/backup.test.ts +6 -277
  234. package/src/cli/commands/__tests__/gateway.test.ts +288 -0
  235. package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
  236. package/src/cli/commands/__tests__/webhooks.test.ts +0 -5
  237. package/src/cli/commands/backup.ts +6 -331
  238. package/src/cli/commands/bash.ts +35 -108
  239. package/src/cli/commands/clients.ts +36 -37
  240. package/src/cli/commands/contacts.ts +137 -25
  241. package/src/cli/commands/conversations.ts +2 -5
  242. package/src/cli/commands/credentials.ts +71 -7
  243. package/src/cli/commands/domain.ts +66 -15
  244. package/src/cli/commands/gateway.ts +183 -0
  245. package/src/cli/commands/keys.ts +9 -6
  246. package/src/cli/commands/mcp.ts +116 -156
  247. package/src/cli/commands/memory-v2.ts +303 -7
  248. package/src/cli/commands/oauth/__tests__/connect.test.ts +437 -1
  249. package/src/cli/commands/oauth/connect.ts +127 -1
  250. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -4
  251. package/src/cli/commands/platform/__tests__/connect.test.ts +7 -3
  252. package/src/cli/commands/platform/__tests__/disconnect.test.ts +7 -3
  253. package/src/cli/commands/platform/__tests__/status.test.ts +116 -21
  254. package/src/cli/commands/platform/disconnect.ts +5 -4
  255. package/src/cli/commands/platform/index.ts +16 -25
  256. package/src/cli/commands/status.ts +57 -0
  257. package/src/cli/lib/daemon-credential-client.ts +110 -28
  258. package/src/cli/program.ts +6 -2
  259. package/src/config/assistant-feature-flags.ts +79 -12
  260. package/src/config/bundled-skills/acp/SKILL.md +6 -0
  261. package/src/config/bundled-skills/acp/TOOLS.json +1 -22
  262. package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
  263. package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
  264. package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
  265. package/src/config/bundled-skills/app-control/SKILL.md +75 -0
  266. package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
  267. package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
  268. package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
  269. package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
  270. package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
  271. package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
  272. package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
  273. package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
  274. package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
  275. package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
  276. package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
  277. package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
  278. package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
  279. package/src/config/bundled-skills/document/TOOLS.json +0 -8
  280. package/src/config/bundled-skills/followups/TOOLS.json +0 -12
  281. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  282. package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
  283. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
  284. package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
  285. package/src/config/bundled-skills/messaging/tools/messaging-analyze-style.ts +4 -3
  286. package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
  287. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +25 -4
  288. package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
  289. package/src/config/bundled-skills/playbooks/tools/playbook-create.ts +2 -2
  290. package/src/config/bundled-skills/playbooks/tools/playbook-delete.ts +2 -2
  291. package/src/config/bundled-skills/playbooks/tools/playbook-list.ts +2 -2
  292. package/src/config/bundled-skills/playbooks/tools/playbook-update.ts +2 -2
  293. package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
  294. package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
  295. package/src/config/bundled-skills/settings/SKILL.md +4 -0
  296. package/src/config/bundled-skills/settings/TOOLS.json +0 -12
  297. package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
  298. package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
  299. package/src/config/bundled-skills/subagent/SKILL.md +6 -2
  300. package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
  301. package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
  302. package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
  303. package/src/config/bundled-tool-registry.ts +21 -0
  304. package/src/config/env-registry.ts +0 -2
  305. package/src/config/env.ts +19 -20
  306. package/src/config/feature-flag-registry.json +47 -135
  307. package/src/config/loader.ts +197 -104
  308. package/src/config/sanitize-for-transfer.ts +2 -0
  309. package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
  310. package/src/config/schemas/__tests__/memory-v2.test.ts +17 -9
  311. package/src/config/schemas/call-site-catalog.ts +14 -0
  312. package/src/config/schemas/calls.ts +0 -9
  313. package/src/config/schemas/channels.ts +0 -5
  314. package/src/config/schemas/heartbeat.ts +64 -1
  315. package/src/config/schemas/ingress.ts +10 -6
  316. package/src/config/schemas/llm.ts +7 -10
  317. package/src/config/schemas/memory-lifecycle.ts +90 -24
  318. package/src/config/schemas/memory-v2.ts +121 -13
  319. package/src/config/schemas/platform.ts +49 -3
  320. package/src/config/schemas/services.ts +29 -15
  321. package/src/config/schemas/skills.ts +0 -6
  322. package/src/config/seed-inference-profiles.ts +230 -33
  323. package/src/contacts/contact-store.ts +0 -55
  324. package/src/contacts/contacts-write.ts +0 -27
  325. package/src/context/window-manager.ts +1 -2
  326. package/src/credential-execution/feature-gates.ts +10 -10
  327. package/src/credential-execution/process-manager.ts +12 -41
  328. package/src/daemon/__tests__/conversation-tool-setup.test.ts +187 -5
  329. package/src/daemon/assistant-attachments.ts +4 -4
  330. package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
  331. package/src/daemon/config-watcher.ts +89 -60
  332. package/src/daemon/conversation-agent-loop-handlers.ts +27 -3
  333. package/src/daemon/conversation-agent-loop.ts +202 -61
  334. package/src/daemon/conversation-error.ts +87 -15
  335. package/src/daemon/conversation-lifecycle.ts +9 -4
  336. package/src/daemon/conversation-process.ts +24 -11
  337. package/src/daemon/conversation-runtime-assembly.ts +28 -2
  338. package/src/daemon/conversation-store.ts +2 -2
  339. package/src/daemon/conversation-surfaces.ts +305 -4
  340. package/src/daemon/conversation-tool-setup.ts +66 -62
  341. package/src/daemon/conversation.ts +38 -24
  342. package/src/daemon/date-context.ts +71 -22
  343. package/src/daemon/disk-pressure-background-gate.ts +73 -0
  344. package/src/daemon/disk-pressure-guard.ts +343 -0
  345. package/src/daemon/disk-pressure-policy.ts +163 -0
  346. package/src/daemon/doordash-steps.ts +1 -1
  347. package/src/daemon/handlers/shared.ts +4 -2
  348. package/src/daemon/handlers/skills.ts +3 -4
  349. package/src/daemon/host-app-control-proxy.ts +389 -0
  350. package/src/daemon/host-bash-proxy.ts +117 -82
  351. package/src/daemon/host-browser-proxy.ts +67 -82
  352. package/src/daemon/host-cu-proxy.ts +127 -86
  353. package/src/daemon/host-file-proxy.ts +129 -69
  354. package/src/daemon/host-proxy-base.ts +294 -0
  355. package/src/daemon/host-proxy-preactivation.ts +82 -0
  356. package/src/daemon/host-transfer-proxy.ts +338 -129
  357. package/src/daemon/lifecycle.ts +194 -145
  358. package/src/daemon/meet-host-supervisor.ts +4 -4
  359. package/src/daemon/meet-manifest-loader.ts +0 -1
  360. package/src/daemon/memory-v2-startup.ts +14 -4
  361. package/src/daemon/message-protocol.ts +6 -8
  362. package/src/daemon/message-types/contacts.ts +23 -1
  363. package/src/daemon/message-types/conversations.ts +15 -8
  364. package/src/daemon/message-types/disk-pressure.ts +9 -0
  365. package/src/daemon/message-types/host-app-control.ts +150 -0
  366. package/src/daemon/message-types/host-bash.ts +4 -0
  367. package/src/daemon/message-types/host-cu.ts +2 -0
  368. package/src/daemon/message-types/host-file.ts +4 -0
  369. package/src/daemon/message-types/host-transfer.ts +3 -0
  370. package/src/daemon/message-types/messages.ts +3 -0
  371. package/src/daemon/message-types/schedules.ts +8 -3
  372. package/src/daemon/message-types/skills.ts +2 -2
  373. package/src/daemon/process-message.ts +18 -1
  374. package/src/daemon/profiler-run-store.ts +5 -5
  375. package/src/daemon/shutdown-handlers.ts +0 -3
  376. package/src/daemon/tool-setup-types.ts +51 -0
  377. package/src/daemon/tool-side-effects.ts +1 -1
  378. package/src/documents/document-store.ts +85 -0
  379. package/src/events/tool-audit-listener.ts +2 -1
  380. package/src/filing/filing-service.ts +30 -5
  381. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +24 -23
  382. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +252 -0
  383. package/src/heartbeat/heartbeat-run-store.ts +249 -0
  384. package/src/heartbeat/heartbeat-service.ts +459 -54
  385. package/src/home/__tests__/post-connect-feed.test.ts +99 -0
  386. package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
  387. package/src/home/__tests__/suggested-prompts.test.ts +89 -0
  388. package/src/home/feed-scheduler.ts +18 -0
  389. package/src/home/post-connect-feed.ts +68 -0
  390. package/src/home/relationship-state-writer.ts +17 -92
  391. package/src/home/suggested-prompts.ts +46 -10
  392. package/src/inbound/platform-callback-registration.ts +8 -15
  393. package/src/inbound/public-ingress-urls.ts +32 -34
  394. package/src/ipc/__tests__/clients-list-ipc.test.ts +169 -0
  395. package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
  396. package/src/ipc/assistant-server.ts +70 -3
  397. package/src/ipc/cli-client.ts +32 -1
  398. package/src/ipc/gateway-client.ts +37 -3
  399. package/src/live-voice/live-voice-archive.ts +4 -4
  400. package/src/live-voice/live-voice-metrics.ts +10 -10
  401. package/src/live-voice/protocol.ts +5 -7
  402. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
  403. package/src/mcp/mcp-auth-orchestrator.ts +213 -0
  404. package/src/mcp/mcp-auth-state.ts +133 -0
  405. package/src/mcp/mcp-oauth-provider.ts +19 -0
  406. package/src/media/image-service.ts +1 -7
  407. package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +21 -13
  408. package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
  409. package/src/memory/__tests__/jobs-worker-v2-schedule.test.ts +52 -22
  410. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +0 -6
  411. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +272 -0
  412. package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
  413. package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
  414. package/src/memory/admin.ts +5 -9
  415. package/src/memory/anisotropy.test.ts +247 -0
  416. package/src/memory/anisotropy.ts +443 -0
  417. package/src/memory/auto-analysis-constants.ts +17 -0
  418. package/src/memory/auto-analysis-guard.ts +5 -15
  419. package/src/memory/canonical-guardian-store.ts +7 -7
  420. package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
  421. package/src/memory/context-search/agent-protocol.ts +6 -6
  422. package/src/memory/context-search/agent-runner.ts +51 -9
  423. package/src/memory/context-search/sources/conversations.ts +2 -11
  424. package/src/memory/context-search/sources/memory-v2.ts +22 -9
  425. package/src/memory/context-search/sources/memory.ts +0 -1
  426. package/src/memory/context-search/types.ts +0 -1
  427. package/src/memory/conversation-crud.ts +5 -13
  428. package/src/memory/conversation-key-store.ts +2 -15
  429. package/src/memory/db-init.ts +6 -0
  430. package/src/memory/embedding-backend.ts +9 -21
  431. package/src/memory/embedding-runtime-manager.ts +119 -5
  432. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +81 -25
  433. package/src/memory/graph/conversation-graph-memory.ts +43 -78
  434. package/src/memory/graph/extraction.ts +1 -3
  435. package/src/memory/graph/graph-search.test.ts +10 -67
  436. package/src/memory/graph/graph-search.ts +9 -20
  437. package/src/memory/graph/retriever.test.ts +6 -0
  438. package/src/memory/graph/retriever.ts +34 -10
  439. package/src/memory/graph/tools.ts +1 -1
  440. package/src/memory/indexer.ts +54 -45
  441. package/src/memory/job-handlers/backfill.ts +2 -11
  442. package/src/memory/job-handlers/cleanup.ts +43 -0
  443. package/src/memory/job-handlers/embedding.ts +6 -8
  444. package/src/memory/job-handlers/summarization.ts +2 -7
  445. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
  446. package/src/memory/jobs/embed-concept-page.ts +28 -2
  447. package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
  448. package/src/memory/jobs-store.ts +114 -22
  449. package/src/memory/jobs-worker.ts +193 -106
  450. package/src/memory/memory-v2-activation-log-store.ts +33 -15
  451. package/src/memory/memory-v2-concept-frequency.ts +169 -0
  452. package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
  453. package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
  454. package/src/memory/migrations/239-trace-events-created-at-index.ts +18 -0
  455. package/src/memory/migrations/index.ts +6 -0
  456. package/src/memory/migrations/registry.ts +8 -0
  457. package/src/memory/pkb/pkb-search.test.ts +6 -0
  458. package/src/memory/pkb/pkb-search.ts +7 -0
  459. package/src/memory/qdrant-client.ts +49 -32
  460. package/src/memory/rerank-local.ts +374 -0
  461. package/src/memory/schema/infrastructure.ts +15 -0
  462. package/src/memory/search/semantic.ts +13 -67
  463. package/src/memory/sparse-tokenize.ts +49 -0
  464. package/src/memory/trace-event-store.ts +1 -17
  465. package/src/memory/v2/__tests__/activation.test.ts +387 -344
  466. package/src/memory/v2/__tests__/consolidation-job.test.ts +40 -8
  467. package/src/memory/v2/__tests__/injection.test.ts +181 -169
  468. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +61 -2
  469. package/src/memory/v2/__tests__/qdrant.test.ts +16 -0
  470. package/src/memory/v2/__tests__/reranker.test.ts +338 -0
  471. package/src/memory/v2/__tests__/sim.test.ts +154 -188
  472. package/src/memory/v2/__tests__/skill-store.test.ts +71 -65
  473. package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
  474. package/src/memory/v2/__tests__/static-context.test.ts +76 -2
  475. package/src/memory/v2/activation.ts +213 -239
  476. package/src/memory/v2/consolidation-job.ts +65 -17
  477. package/src/memory/v2/constants.ts +7 -0
  478. package/src/memory/v2/injection.ts +123 -103
  479. package/src/memory/v2/prompts/consolidation.ts +348 -92
  480. package/src/memory/v2/qdrant.ts +198 -1
  481. package/src/memory/v2/reranker.ts +177 -0
  482. package/src/memory/v2/sim.ts +113 -77
  483. package/src/memory/v2/skill-content.ts +4 -3
  484. package/src/memory/v2/skill-store.ts +91 -53
  485. package/src/memory/v2/sparse-bm25.ts +245 -0
  486. package/src/memory/v2/static-context.ts +28 -5
  487. package/src/memory/v2/types.ts +10 -10
  488. package/src/messaging/providers/gmail/types.ts +0 -49
  489. package/src/messaging/providers/slack/adapter.ts +1 -31
  490. package/src/messaging/providers/slack/types.ts +0 -32
  491. package/src/notifications/README.md +10 -10
  492. package/src/notifications/broadcaster.ts +1 -1
  493. package/src/notifications/copy-composer.ts +13 -0
  494. package/src/notifications/guardian-question-mode.ts +5 -5
  495. package/src/notifications/signal.ts +4 -0
  496. package/src/oauth/AGENTS.md +3 -1
  497. package/src/oauth/__tests__/oauth-connect-state.test.ts +137 -0
  498. package/src/oauth/connect-orchestrator.ts +6 -0
  499. package/src/oauth/connection-resolver.test.ts +66 -1
  500. package/src/oauth/connection-resolver.ts +55 -1
  501. package/src/oauth/credential-token-resolver.ts +1 -3
  502. package/src/oauth/manual-token-connection.ts +0 -4
  503. package/src/oauth/oauth-connect-state.ts +77 -0
  504. package/src/oauth/seed-providers.ts +58 -1
  505. package/src/outbound-proxy/index.ts +1 -37
  506. package/src/outbound-proxy/logging.ts +1 -1
  507. package/src/outbound-proxy/policy.ts +6 -5
  508. package/src/outbound-proxy/router.ts +2 -1
  509. package/src/permissions/approval-policy.test.ts +6 -275
  510. package/src/permissions/approval-policy.ts +0 -51
  511. package/src/permissions/checker.test.ts +0 -1
  512. package/src/permissions/checker.ts +3 -17
  513. package/src/permissions/gateway-threshold-reader.ts +2 -0
  514. package/src/permissions/prompter.ts +34 -1
  515. package/src/permissions/secret-prompter.ts +6 -2
  516. package/src/plugins/defaults/injectors.ts +35 -2
  517. package/src/plugins/defaults/memory-retrieval.ts +5 -6
  518. package/src/plugins/types.ts +7 -0
  519. package/src/proactive-artifact/aux-message-injector.ts +74 -0
  520. package/src/proactive-artifact/decision.test.ts +226 -0
  521. package/src/proactive-artifact/decision.ts +165 -0
  522. package/src/proactive-artifact/index.ts +7 -0
  523. package/src/proactive-artifact/job.test.ts +867 -0
  524. package/src/proactive-artifact/job.ts +352 -0
  525. package/src/proactive-artifact/message-copy.ts +41 -0
  526. package/src/proactive-artifact/trigger-state.test.ts +277 -0
  527. package/src/proactive-artifact/trigger-state.ts +119 -0
  528. package/src/prompts/bootstrap-cleanup.ts +27 -0
  529. package/src/prompts/normalize-onboarding.ts +80 -0
  530. package/src/prompts/persona-resolver.ts +101 -9
  531. package/src/prompts/system-prompt.ts +23 -24
  532. package/src/prompts/templates/BOOTSTRAP.md +13 -5
  533. package/src/prompts/templates/SOUL.md +13 -1
  534. package/src/providers/__tests__/retry-callsite.test.ts +222 -1
  535. package/src/providers/model-intents.ts +7 -0
  536. package/src/providers/openrouter/client.ts +8 -0
  537. package/src/providers/retry.ts +50 -0
  538. package/src/providers/speech-to-text/provider-catalog.ts +7 -8
  539. package/src/providers/types.ts +1 -0
  540. package/src/runtime/__tests__/agent-wake.test.ts +456 -3
  541. package/src/runtime/agent-wake.ts +238 -100
  542. package/src/runtime/assistant-event-hub.ts +151 -99
  543. package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
  544. package/src/runtime/auth/__tests__/route-policy.test.ts +64 -0
  545. package/src/runtime/auth/middleware.ts +0 -96
  546. package/src/runtime/auth/route-policy.ts +32 -0
  547. package/src/runtime/auth/same-actor.ts +216 -0
  548. package/src/runtime/btw-sidechain.ts +2 -3
  549. package/src/runtime/channel-invite-transport.ts +2 -48
  550. package/src/runtime/channel-invite-transports/email.ts +1 -1
  551. package/src/runtime/channel-invite-transports/slack.ts +1 -1
  552. package/src/runtime/channel-invite-transports/telegram.ts +1 -1
  553. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  554. package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
  555. package/src/runtime/channel-invite-types.ts +54 -0
  556. package/src/runtime/channel-readiness-service.ts +32 -13
  557. package/src/runtime/channel-retry-sweep.ts +65 -1
  558. package/src/runtime/guardian-reply-router.ts +10 -0
  559. package/src/runtime/http-server.ts +3 -329
  560. package/src/runtime/http-types.ts +0 -5
  561. package/src/runtime/local-actor-identity.ts +52 -11
  562. package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
  563. package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
  564. package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
  565. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
  566. package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
  567. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
  568. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
  569. package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
  570. package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
  571. package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
  572. package/src/runtime/migrations/migration-transport.ts +7 -7
  573. package/src/runtime/migrations/vbundle-builder.ts +327 -60
  574. package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
  575. package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
  576. package/src/runtime/migrations/vbundle-importer.ts +245 -68
  577. package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
  578. package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
  579. package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
  580. package/src/runtime/migrations/vbundle-validator.ts +114 -0
  581. package/src/runtime/pending-interactions.ts +43 -9
  582. package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
  583. package/src/runtime/routes/__tests__/client-routes.test.ts +155 -0
  584. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -5
  585. package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
  586. package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
  587. package/src/runtime/routes/approval-interception-types.ts +13 -0
  588. package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
  589. package/src/runtime/routes/backup-routes.ts +15 -38
  590. package/src/runtime/routes/btw-routes.ts +14 -37
  591. package/src/runtime/routes/client-routes.ts +21 -2
  592. package/src/runtime/routes/contact-prompt-routes.ts +183 -0
  593. package/src/runtime/routes/contact-routes.ts +0 -25
  594. package/src/runtime/routes/conversation-query-routes.ts +36 -1
  595. package/src/runtime/routes/conversation-routes.ts +65 -39
  596. package/src/runtime/routes/debug-bash-routes.ts +163 -0
  597. package/src/runtime/routes/disk-pressure-routes.ts +121 -0
  598. package/src/runtime/routes/document-pdf-renderer.ts +169 -0
  599. package/src/runtime/routes/documents-routes.ts +32 -75
  600. package/src/runtime/routes/errors.ts +19 -4
  601. package/src/runtime/routes/events-routes.ts +38 -0
  602. package/src/runtime/routes/gateway-log-routes.ts +79 -0
  603. package/src/runtime/routes/guardian-approval-interception.ts +2 -8
  604. package/src/runtime/routes/heartbeat-routes.ts +103 -38
  605. package/src/runtime/routes/host-app-control-routes.ts +134 -0
  606. package/src/runtime/routes/host-bash-routes.ts +56 -6
  607. package/src/runtime/routes/host-browser-routes.ts +108 -13
  608. package/src/runtime/routes/host-cu-routes.ts +66 -9
  609. package/src/runtime/routes/host-file-routes.ts +54 -5
  610. package/src/runtime/routes/host-transfer-routes.ts +122 -19
  611. package/src/runtime/routes/http-adapter.ts +1 -0
  612. package/src/runtime/routes/identity-intro-cache.ts +30 -0
  613. package/src/runtime/routes/identity-routes.ts +21 -180
  614. package/src/runtime/routes/inbound-message-handler.ts +78 -21
  615. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
  616. package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
  617. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +3 -0
  618. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
  619. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
  620. package/src/runtime/routes/index.ts +14 -0
  621. package/src/runtime/routes/mcp-auth-routes.ts +132 -0
  622. package/src/runtime/routes/memory-item-routes.test.ts +41 -15
  623. package/src/runtime/routes/memory-item-routes.ts +10 -12
  624. package/src/runtime/routes/memory-v2-routes.ts +474 -1
  625. package/src/runtime/routes/migration-routes.ts +96 -0
  626. package/src/runtime/routes/oauth-connect-routes.ts +153 -0
  627. package/src/runtime/routes/schedule-routes.ts +7 -0
  628. package/src/runtime/verification-outbound-actions.ts +4 -4
  629. package/src/runtime/verification-templates.ts +4 -7
  630. package/src/schedule/integration-status.ts +66 -2
  631. package/src/schedule/recurrence-engine.ts +4 -1
  632. package/src/schedule/retry-backoff.ts +18 -0
  633. package/src/schedule/retry-policy.ts +82 -0
  634. package/src/schedule/run-script.ts +37 -5
  635. package/src/schedule/schedule-recovery.ts +64 -0
  636. package/src/schedule/schedule-store.ts +106 -2
  637. package/src/schedule/scheduler-types.ts +25 -0
  638. package/src/schedule/scheduler.ts +83 -39
  639. package/src/security/encrypted-store.ts +2 -0
  640. package/src/security/oauth-callback-registry.ts +8 -0
  641. package/src/security/secure-keys.ts +55 -0
  642. package/src/sequence/analytics.ts +5 -5
  643. package/src/sequence/engine.ts +1 -1
  644. package/src/skills/catalog-files.ts +2 -8
  645. package/src/skills/include-graph.ts +5 -5
  646. package/src/skills/remote-skill-policy.ts +10 -16
  647. package/src/skills/skill-file-provider.ts +1 -1
  648. package/src/skills/skill-file-types.ts +13 -0
  649. package/src/skills/skillssh-audit-types.ts +28 -0
  650. package/src/skills/skillssh-registry.ts +8 -21
  651. package/src/subagent/index.ts +1 -7
  652. package/src/subagent/manager.ts +1 -15
  653. package/src/tasks/task-runner.ts +0 -1
  654. package/src/tasks/task-store.ts +0 -3
  655. package/src/telemetry/types.ts +2 -0
  656. package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
  657. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  658. package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
  659. package/src/tools/apps/executors.ts +56 -69
  660. package/src/tools/background-tool-registry.ts +17 -3
  661. package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
  662. package/src/tools/browser/browser-execution.ts +2 -2
  663. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
  664. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
  665. package/src/tools/browser/cdp-client/factory.ts +23 -24
  666. package/src/tools/browser/cdp-client/index.ts +1 -14
  667. package/src/tools/computer-use/definitions.ts +42 -20
  668. package/src/tools/executor.ts +2 -0
  669. package/src/tools/host-filesystem/edit.test.ts +151 -0
  670. package/src/tools/host-filesystem/edit.ts +68 -0
  671. package/src/tools/host-filesystem/read.test.ts +129 -0
  672. package/src/tools/host-filesystem/read.ts +68 -0
  673. package/src/tools/host-filesystem/transfer.test.ts +127 -2
  674. package/src/tools/host-filesystem/transfer.ts +78 -3
  675. package/src/tools/host-filesystem/write.test.ts +134 -0
  676. package/src/tools/host-filesystem/write.ts +68 -0
  677. package/src/tools/host-terminal/host-shell.ts +66 -1
  678. package/src/tools/mcp/mcp-tool-factory.ts +2 -1
  679. package/src/tools/memory/register.test.ts +12 -9
  680. package/src/tools/memory/register.ts +1 -2
  681. package/src/tools/provider-tool-name.ts +28 -0
  682. package/src/tools/registry.ts +30 -9
  683. package/src/tools/schedule/create.ts +6 -0
  684. package/src/tools/schedule/list.ts +2 -0
  685. package/src/tools/schedule/update.ts +10 -0
  686. package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
  687. package/src/tools/shared/filesystem/path-policy.ts +25 -1
  688. package/src/tools/skills/load.ts +0 -32
  689. package/src/tools/terminal/shell.ts +9 -1
  690. package/src/tools/tool-approval-handler.ts +32 -11
  691. package/src/tools/types.ts +28 -2
  692. package/src/tts/provider-catalog.ts +3 -5
  693. package/src/usage/pricing.ts +1 -1
  694. package/src/util/disk-usage.ts +138 -0
  695. package/src/util/platform.ts +21 -11
  696. package/src/util/process-liveness.ts +26 -0
  697. package/src/workspace/hatched-date.ts +86 -0
  698. package/src/workspace/heartbeat-service.ts +19 -0
  699. package/src/workspace/migrations/003-seed-device-id.ts +1 -1
  700. package/src/workspace/migrations/006-services-config.ts +8 -5
  701. package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
  702. package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
  703. package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
  704. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
  705. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
  706. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
  707. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
  708. package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
  709. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
  710. package/src/workspace/migrations/065-bump-stale-heartbeat-interval.ts +60 -0
  711. package/src/workspace/migrations/066-seed-heartbeat-callsite-cost-default.ts +146 -0
  712. package/src/workspace/migrations/067-release-notes-safe-storage-limits.ts +72 -0
  713. package/src/workspace/migrations/068-release-notes-local-timezone.ts +65 -0
  714. package/src/workspace/migrations/AGENTS.md +1 -1
  715. package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
  716. package/src/workspace/migrations/registry.ts +8 -0
  717. package/src/workspace/migrations/utils.ts +21 -0
  718. package/src/__tests__/conversation-tool-setup-memory-scope.test.ts +0 -167
  719. package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
  720. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
  721. package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
  722. package/src/__tests__/twilio-rest.test.ts +0 -34
  723. package/src/backup/__tests__/backup-key.test.ts +0 -152
  724. package/src/backup/__tests__/backup-worker.test.ts +0 -782
  725. package/src/backup/__tests__/offsite-writer.test.ts +0 -641
  726. package/src/backup/__tests__/stream-crypt.test.ts +0 -228
  727. package/src/backup/backup-key.ts +0 -137
  728. package/src/backup/backup-worker.ts +0 -472
  729. package/src/backup/offsite-writer.ts +0 -222
  730. package/src/backup/stream-crypt.ts +0 -263
  731. package/src/daemon/message-types/pairing.ts +0 -58
  732. package/src/memory/v2/__tests__/skill-qdrant.test.ts +0 -657
  733. package/src/memory/v2/skill-qdrant.ts +0 -395
  734. package/src/outbound-proxy/config.ts +0 -20
  735. package/src/outbound-proxy/health.ts +0 -18
  736. package/src/outbound-proxy/types.ts +0 -150
  737. package/src/runtime/capability-tokens.ts +0 -190
  738. package/src/signals/bash.ts +0 -198
  739. package/src/signals/mcp-reload.ts +0 -18
@@ -151,8 +151,11 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
151
151
  { endpoint: "confirm", scopes: ["approval.write"] },
152
152
  { endpoint: "secret", scopes: ["approval.write"] },
153
153
  { endpoint: "trust-rules", scopes: ["approval.write"] },
154
+ { endpoint: "host-app-control-result", scopes: ["approval.write"] },
154
155
  { endpoint: "host-bash-result", scopes: ["approval.write"] },
155
156
  { endpoint: "host-browser-result", scopes: ["approval.write"] },
157
+ { endpoint: "host-browser-event", scopes: ["approval.write"] },
158
+ { endpoint: "host-browser-session-invalidated", scopes: ["approval.write"] },
156
159
  { endpoint: "host-cu-result", scopes: ["approval.write"] },
157
160
  { endpoint: "host-file-result", scopes: ["approval.write"] },
158
161
  { endpoint: "host-transfer-result", scopes: ["approval.write"] },
@@ -183,6 +186,9 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
183
186
  { endpoint: "calls/instruction", scopes: ["calls.write"] },
184
187
 
185
188
  // Settings / integrations / identity
189
+ { endpoint: "disk-pressure/status", scopes: ["settings.read"] },
190
+ { endpoint: "disk-pressure/acknowledge", scopes: ["settings.write"] },
191
+ { endpoint: "disk-pressure/override", scopes: ["settings.write"] },
186
192
  { endpoint: "ps", scopes: ["settings.read"] },
187
193
  { endpoint: "identity", scopes: ["settings.read"] },
188
194
  { endpoint: "identity/intro", scopes: ["settings.read"] },
@@ -204,6 +210,8 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
204
210
  { endpoint: "contacts/invites:POST", scopes: ["settings.write"] },
205
211
  { endpoint: "contacts/invites/redeem", scopes: ["settings.write"] },
206
212
  { endpoint: "contacts/invites:DELETE", scopes: ["settings.write"] },
213
+ { endpoint: "contacts/prompt:POST", scopes: ["settings.write"] },
214
+ { endpoint: "resolve_contact_prompt:POST", scopes: ["settings.write"] },
207
215
  { endpoint: "integrations/telegram/config", scopes: ["settings.read"] },
208
216
  { endpoint: "integrations/telegram/config:POST", scopes: ["settings.write"] },
209
217
  {
@@ -322,6 +330,7 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
322
330
  { endpoint: "clients", scopes: ["settings.read"] },
323
331
  { endpoint: "clients/disconnect", scopes: ["settings.write"] },
324
332
  { endpoint: "debug", scopes: ["settings.read"] },
333
+ { endpoint: "debug/bash", scopes: ["settings.write"] },
325
334
 
326
335
  // Workspace file browsing
327
336
  { endpoint: "workspace/tree", scopes: ["settings.read"] },
@@ -422,7 +431,16 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
422
431
  { endpoint: "memory-items:DELETE", scopes: ["settings.write"] },
423
432
  { endpoint: "memory/v2/backfill:POST", scopes: ["settings.write"] },
424
433
  { endpoint: "memory/v2/validate:POST", scopes: ["settings.read"] },
434
+ { endpoint: "memory/v2/concept-page:POST", scopes: ["settings.read"] },
425
435
  { endpoint: "memory/v2/reembed-skills:POST", scopes: ["settings.write"] },
436
+ { endpoint: "memory/v2/explain-similarity:POST", scopes: ["settings.read"] },
437
+ { endpoint: "memory/v2/fit-anisotropy:POST", scopes: ["settings.write"] },
438
+ {
439
+ endpoint: "memory/v2/rebuild-corpus-stats:POST",
440
+ scopes: ["settings.write"],
441
+ },
442
+ { endpoint: "memory/v2/concept-frequency:POST", scopes: ["settings.read"] },
443
+ { endpoint: "memory/v2/fit-anisotropy:POST", scopes: ["settings.write"] },
426
444
 
427
445
  // Trust rule listing
428
446
  { endpoint: "trust-rules/manage:GET", scopes: ["settings.read"] },
@@ -490,6 +508,9 @@ const ACTOR_ENDPOINTS: Array<{ endpoint: string; scopes: Scope[] }> = [
490
508
  { endpoint: "consolidation", scopes: ["settings.read"] },
491
509
  { endpoint: "consolidation:POST", scopes: ["settings.write"] },
492
510
 
511
+ // Gateway log proxy
512
+ { endpoint: "gateway/logs/tail", scopes: ["settings.read"] },
513
+
493
514
  // Heartbeat (config, runs, checklist — all share the "heartbeat" policyKey)
494
515
  { endpoint: "heartbeat:GET", scopes: ["settings.read"] },
495
516
  { endpoint: "heartbeat", scopes: ["settings.write"] },
@@ -551,6 +572,12 @@ registerPolicy("conversations/clear-all", {
551
572
  allowedPrincipalTypes: ["actor", "svc_gateway", "svc_daemon", "local"],
552
573
  });
553
574
 
575
+ // Event emission: gateway-only internal notification
576
+ registerPolicy("events/emit", {
577
+ requiredScopes: ["internal.write"],
578
+ allowedPrincipalTypes: ["svc_gateway"],
579
+ });
580
+
554
581
  // Channel inbound: gateway-only
555
582
  registerPolicy("channels/inbound", {
556
583
  requiredScopes: ["ingress.write"],
@@ -563,6 +590,11 @@ const INTERNAL_ENDPOINTS = [
563
590
  "internal/twilio/status",
564
591
  "internal/twilio/connect-action",
565
592
  "internal/oauth/callback",
593
+ "internal/mcp/auth/start",
594
+ "internal/mcp/auth/status",
595
+ "internal/mcp/reload", // ← new
596
+ "internal/oauth/connect/start",
597
+ "internal/oauth/connect/status",
566
598
  ];
567
599
  for (const endpoint of INTERNAL_ENDPOINTS) {
568
600
  registerPolicy(endpoint, {
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Same-actor (same-user) binding check used by host proxies and result
3
+ * routes.
4
+ *
5
+ * Verifies that the submitting (source) actor's principal id matches the
6
+ * actor principal id captured for the target client at SSE subscription
7
+ * time. This is the authoritative gate that prevents cross-user
8
+ * execution and cross-user result submission across all three host-proxy
9
+ * capabilities (host_bash, host_file, host_cu).
10
+ *
11
+ * Two entry points map onto the two control-flow styles in the codebase:
12
+ * - {@link enforceSameActorOrErrorResult} for proxies — returns a
13
+ * tool-execution error result on rejection, `null` on success.
14
+ * - {@link enforceSameActorOrThrow} for HTTP/IPC route handlers —
15
+ * throws {@link ForbiddenError} on rejection so the route adapter
16
+ * maps it to HTTP 403.
17
+ *
18
+ * Both paths log a single structured warn line on rejection with the
19
+ * shape `{ sourceActorPrincipalId, targetClientId, targetActorPrincipalId,
20
+ * op, reason }` so that bash, file, and CU rejections render identically
21
+ * in the audit log.
22
+ */
23
+ import type { HostProxyCapability } from "../../channels/types.js";
24
+ import { getLogger } from "../../util/logger.js";
25
+ import type { AssistantEventHub } from "../assistant-event-hub.js";
26
+ import { ForbiddenError } from "../routes/errors.js";
27
+
28
+ const log = getLogger("same-actor");
29
+
30
+ /**
31
+ * Canonical user-facing rejection message. Used by both the proxy and
32
+ * route paths so operators and auditors see identical wording regardless
33
+ * of whether the failure surfaced as a tool-execution result or an HTTP
34
+ * 403.
35
+ */
36
+ const REJECTION_MESSAGE =
37
+ "Submitting actor does not match the target client's actor for this request. The targeted client's authenticated user must submit the result.";
38
+
39
+ /** OpenAPI 403 description for `*-result` endpoints, kept identical. */
40
+ export const SAME_ACTOR_FORBIDDEN_DESCRIPTION =
41
+ "Submitting client does not match the targeted client, or the submitting actor's principal does not match the target client's actor.";
42
+
43
+ /** Per-capability scope for the structured warn log entry. */
44
+ export type SameActorOp =
45
+ | "host_bash"
46
+ | "host_file"
47
+ | "host_cu"
48
+ | "host_transfer";
49
+
50
+ /**
51
+ * Args for the live-lookup variant: caller supplies the hub + target client
52
+ * id, and the helper looks up the target's actor principal in real time.
53
+ * Used at proxy request time (registration), where the SSE subscription is
54
+ * present by definition.
55
+ */
56
+ export interface SameActorLiveArgs {
57
+ hub: Pick<AssistantEventHub, "getActorPrincipalIdForClient">;
58
+ sourceActorPrincipalId: string | undefined;
59
+ targetClientId: string;
60
+ op: SameActorOp;
61
+ }
62
+
63
+ /**
64
+ * Args for the persisted-value variant: caller supplies a target actor
65
+ * principal id captured at registration time. Used at result-submission
66
+ * time, where the SSE subscription may have briefly disconnected and the
67
+ * live hub lookup would falsely 403 a legitimate result.
68
+ */
69
+ export interface SameActorPersistedArgs {
70
+ sourceActorPrincipalId: string | undefined;
71
+ targetActorPrincipalId: string | undefined;
72
+ targetClientId: string;
73
+ op: SameActorOp;
74
+ }
75
+
76
+ export type SameActorArgs = SameActorLiveArgs;
77
+
78
+ type RejectionReason = "missing_source" | "missing_target" | "mismatch";
79
+
80
+ function isLive(
81
+ args: SameActorLiveArgs | SameActorPersistedArgs,
82
+ ): args is SameActorLiveArgs {
83
+ return (args as SameActorLiveArgs).hub != null;
84
+ }
85
+
86
+ /**
87
+ * Internal: returns the rejection reason or `undefined` when the source
88
+ * matches the target. Always logs on rejection so all callers share the
89
+ * same audit shape.
90
+ */
91
+ function detectRejection(
92
+ args: SameActorLiveArgs | SameActorPersistedArgs,
93
+ ): RejectionReason | undefined {
94
+ const { sourceActorPrincipalId, targetClientId, op } = args;
95
+ const targetActorPrincipalId = isLive(args)
96
+ ? args.hub.getActorPrincipalIdForClient(targetClientId)
97
+ : args.targetActorPrincipalId;
98
+
99
+ let reason: RejectionReason | undefined;
100
+ if (sourceActorPrincipalId == null) {
101
+ reason = "missing_source";
102
+ } else if (targetActorPrincipalId == null) {
103
+ reason = "missing_target";
104
+ } else if (sourceActorPrincipalId !== targetActorPrincipalId) {
105
+ reason = "mismatch";
106
+ }
107
+ if (reason == null) return undefined;
108
+
109
+ log.warn(
110
+ {
111
+ sourceActorPrincipalId,
112
+ targetClientId,
113
+ targetActorPrincipalId,
114
+ op,
115
+ reason,
116
+ },
117
+ "Rejecting cross-user host proxy request",
118
+ );
119
+ return reason;
120
+ }
121
+
122
+ /**
123
+ * Route-flavored variant: throws {@link ForbiddenError} on rejection so
124
+ * the existing route adapter maps it to HTTP 403. Returns void on
125
+ * success.
126
+ *
127
+ * Accepts EITHER {@link SameActorLiveArgs} (live hub lookup, used at
128
+ * proxy registration time) OR {@link SameActorPersistedArgs} (compare
129
+ * against a value captured earlier, used at result-submission time so a
130
+ * brief SSE reconnect doesn't 403 a legitimate result).
131
+ */
132
+ export function enforceSameActorOrThrow(
133
+ args: SameActorLiveArgs | SameActorPersistedArgs,
134
+ ): void {
135
+ if (detectRejection(args) != null) {
136
+ throw new ForbiddenError(REJECTION_MESSAGE);
137
+ }
138
+ }
139
+
140
+ /**
141
+ * Proxy-flavored variant: returns a tool-execution-shaped error result
142
+ * on rejection (so the proxy can pass it directly back to the agent),
143
+ * or `null` on success. Always uses the live hub lookup — proxy
144
+ * registration runs while the target SSE subscription is active.
145
+ */
146
+ export function enforceSameActorOrErrorResult(
147
+ args: SameActorLiveArgs,
148
+ ): { content: string; isError: true } | null {
149
+ if (detectRejection(args) == null) return null;
150
+ return { content: REJECTION_MESSAGE, isError: true };
151
+ }
152
+
153
+ /**
154
+ * Result of attempting to auto-resolve a single same-user target client.
155
+ *
156
+ * - `match`: exactly one same-user client supports the capability. Use the
157
+ * returned clientId.
158
+ * - `none`: no same-user client supports the capability. Caller's choice
159
+ * how to handle (typically: fall through to no-target, which broadcasts
160
+ * to nobody when no clients are connected).
161
+ * - `ambiguous`: more than one same-user client supports the capability.
162
+ * Caller MUST refuse to silently broadcast across them; instead surface
163
+ * an error asking the caller to specify `target_client_id`.
164
+ */
165
+ export type AutoResolveResult =
166
+ | { kind: "match"; clientId: string }
167
+ | { kind: "none" }
168
+ | { kind: "ambiguous" };
169
+
170
+ /**
171
+ * Filter capable clients by `actorPrincipalId === sourcePrincipalId` and
172
+ * report whether exactly one matched, zero matched, or more than one
173
+ * matched.
174
+ *
175
+ * Used by host proxies to auto-resolve a target client when the caller
176
+ * did not specify one. Skipping when the caller has no principal keeps
177
+ * the same-user binding closed: an unauthenticated caller cannot
178
+ * piggyback on a connected user's session.
179
+ *
180
+ * Why three outcomes (vs. just `string | undefined`)? Earlier revisions
181
+ * collapsed `none` and `ambiguous` into `undefined`, which caused the
182
+ * proxy to fall through to an untargeted broadcast — fanning a single
183
+ * targeted-style request out across every same-user machine. Surfacing
184
+ * `ambiguous` separately lets the proxy reject with a clear "specify
185
+ * target_client_id" error instead.
186
+ */
187
+ export function pickSameUserAutoResolve(args: {
188
+ hub: Pick<AssistantEventHub, "listClientsByCapability">;
189
+ capability: HostProxyCapability;
190
+ sourceActorPrincipalId: string | undefined;
191
+ }): AutoResolveResult {
192
+ const { hub, capability, sourceActorPrincipalId } = args;
193
+ if (sourceActorPrincipalId == null) return { kind: "none" };
194
+ const sameUser = hub
195
+ .listClientsByCapability(capability)
196
+ .filter((c) => c.actorPrincipalId === sourceActorPrincipalId);
197
+ if (sameUser.length === 0) return { kind: "none" };
198
+ if (sameUser.length === 1) {
199
+ return { kind: "match", clientId: sameUser[0].clientId };
200
+ }
201
+ return { kind: "ambiguous" };
202
+ }
203
+
204
+ /**
205
+ * Standard error result for proxies when {@link pickSameUserAutoResolve}
206
+ * returns `ambiguous`. Asks the caller to specify `target_client_id`.
207
+ */
208
+ export function ambiguousSameUserError(capability: HostProxyCapability): {
209
+ content: string;
210
+ isError: true;
211
+ } {
212
+ return {
213
+ content: `Multiple ${capability} clients are connected for this user. Specify target_client_id to disambiguate. Run \`assistant clients list --capability ${capability}\` to see client IDs.`,
214
+ isError: true,
215
+ };
216
+ }
@@ -1,5 +1,4 @@
1
1
  import type { LLMCallSite } from "../config/schemas/llm.js";
2
- import { buildToolDefinitions } from "../daemon/conversation-tool-setup.js";
3
2
  import { buildSystemPrompt } from "../prompts/system-prompt.js";
4
3
  import {
5
4
  createTimeout,
@@ -27,7 +26,7 @@ export interface RunBtwSidechainParams {
27
26
  provider?: Provider;
28
27
  messages?: Message[];
29
28
  systemPrompt?: string;
30
- tools?: ToolDefinition[];
29
+ tools: ToolDefinition[];
31
30
  maxTokens?: number;
32
31
  /**
33
32
  * Unified call-site identifier. The provider layer resolves
@@ -68,7 +67,7 @@ export async function runBtwSidechain(
68
67
  throw new Error("BTW side-chain requires a provider");
69
68
  }
70
69
 
71
- const tools = params.tools ?? buildToolDefinitions();
70
+ const tools = params.tools;
72
71
  const history = params.messages ?? params.conversation?.getMessages() ?? [];
73
72
  const messages = [...history, userMessage(trimmedContent)];
74
73
  const systemPrompt =
@@ -20,57 +20,11 @@ import { slackInviteAdapter } from "./channel-invite-transports/slack.js";
20
20
  import { telegramInviteAdapter } from "./channel-invite-transports/telegram.js";
21
21
  import { voiceInviteAdapter } from "./channel-invite-transports/voice.js";
22
22
  import { whatsappInviteAdapter } from "./channel-invite-transports/whatsapp.js";
23
-
24
23
  // ---------------------------------------------------------------------------
25
24
  // Types
26
25
  // ---------------------------------------------------------------------------
27
-
28
- export interface InviteShareLink {
29
- /** The full URL the recipient can open to redeem the invite. */
30
- url: string;
31
- /** Human-readable text suitable for display alongside the link. */
32
- displayText: string;
33
- }
34
-
35
- export interface ChannelInviteAdapter {
36
- /** The channel this adapter handles. */
37
- channel: ChannelId;
38
-
39
- /**
40
- * Build a channel-specific shareable link (e.g. Telegram deep link).
41
- * Optional — not all channels support link-based invites.
42
- */
43
- buildShareLink?(params: {
44
- rawToken: string;
45
- sourceChannel: ChannelId;
46
- }): InviteShareLink;
47
-
48
- /**
49
- * Extract a channel-specific invite token from an inbound message
50
- * (e.g. Telegram `/start iv_<token>`). Optional — only needed for
51
- * channels with link-based invites.
52
- */
53
- extractInboundToken?(params: {
54
- commandIntent?: Record<string, unknown>;
55
- content: string;
56
- sourceMetadata?: Record<string, unknown>;
57
- }): string | undefined;
58
-
59
- /**
60
- * Resolve the channel-specific handle to reach the assistant (e.g.
61
- * "@botName", "+15551234567", "hello@vellum.me").
62
- * Returns `undefined` when the handle cannot be resolved (e.g.
63
- * credentials not yet configured).
64
- */
65
- resolveChannelHandle?(): string | undefined;
66
-
67
- /**
68
- * Async variant of `resolveChannelHandle` for adapters that need to
69
- * perform I/O (e.g. querying a provider API for the assigned address).
70
- * When both are present, `resolveAdapterHandle()` prefers this method.
71
- */
72
- resolveChannelHandleAsync?(): Promise<string | undefined>;
73
- }
26
+ import type { ChannelInviteAdapter } from "./channel-invite-types.js";
27
+ export type { ChannelInviteAdapter, InviteShareLink } from "./channel-invite-types.js";
74
28
 
75
29
  // ---------------------------------------------------------------------------
76
30
  // Registry
@@ -12,7 +12,7 @@
12
12
  */
13
13
 
14
14
  import { getNestedValue, loadRawConfig } from "../../config/loader.js";
15
- import type { ChannelInviteAdapter } from "../channel-invite-transport.js";
15
+ import type { ChannelInviteAdapter } from "../channel-invite-types.js";
16
16
 
17
17
  // ---------------------------------------------------------------------------
18
18
  // Adapter implementation
@@ -9,7 +9,7 @@
9
9
 
10
10
  import type { ChannelId } from "../../channels/types.js";
11
11
  import { getConfig } from "../../config/loader.js";
12
- import type { ChannelInviteAdapter } from "../channel-invite-transport.js";
12
+ import type { ChannelInviteAdapter } from "../channel-invite-types.js";
13
13
 
14
14
  // ---------------------------------------------------------------------------
15
15
  // Slack bot info resolution
@@ -26,7 +26,7 @@ import { getLogger } from "../../util/logger.js";
26
26
  import type {
27
27
  ChannelInviteAdapter,
28
28
  InviteShareLink,
29
- } from "../channel-invite-transport.js";
29
+ } from "../channel-invite-types.js";
30
30
 
31
31
  // ---------------------------------------------------------------------------
32
32
  // Bot username resolution
@@ -15,7 +15,7 @@ import type { ChannelId } from "../../channels/types.js";
15
15
  import type {
16
16
  ChannelInviteAdapter,
17
17
  InviteShareLink,
18
- } from "../channel-invite-transport.js";
18
+ } from "../channel-invite-types.js";
19
19
 
20
20
  // ---------------------------------------------------------------------------
21
21
  // Adapter implementation
@@ -10,7 +10,7 @@
10
10
 
11
11
  import type { ChannelId } from "../../channels/types.js";
12
12
  import { getConfig } from "../../config/loader.js";
13
- import type { ChannelInviteAdapter } from "../channel-invite-transport.js";
13
+ import type { ChannelInviteAdapter } from "../channel-invite-types.js";
14
14
 
15
15
  // ---------------------------------------------------------------------------
16
16
  // Phone number resolution
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Types extracted from channel-invite-transport.ts to break the
3
+ * transport ↔ channel-invite-transports/* cycles (×5).
4
+ */
5
+
6
+ import type { ChannelId } from "../channels/types.js";
7
+
8
+ export interface InviteShareLink {
9
+ /** The full URL the recipient can open to redeem the invite. */
10
+ url: string;
11
+ /** Human-readable text suitable for display alongside the link. */
12
+ displayText: string;
13
+ }
14
+
15
+ export interface ChannelInviteAdapter {
16
+ /** The channel this adapter handles. */
17
+ channel: ChannelId;
18
+
19
+ /**
20
+ * Build a channel-specific shareable link (e.g. Telegram deep link).
21
+ * Optional — not all channels support link-based invites.
22
+ */
23
+ buildShareLink?(params: {
24
+ rawToken: string;
25
+ sourceChannel: ChannelId;
26
+ }): InviteShareLink;
27
+
28
+ /**
29
+ * Extract a channel-specific invite token from an inbound message
30
+ * (e.g. Telegram `/start iv_<token>`). Optional — only needed for
31
+ * channels with link-based invites.
32
+ */
33
+ extractInboundToken?(params: {
34
+ commandIntent?: Record<string, unknown>;
35
+ content: string;
36
+ sourceMetadata?: Record<string, unknown>;
37
+ }): string | undefined;
38
+
39
+ /**
40
+ * Resolve the channel-specific handle to reach the assistant (e.g.
41
+ * // generic-examples:ignore-next-line — reason: illustrative docstring examples, not real data
42
+ * "@botName", "+15551234567", "hello@vellum.me").
43
+ * Returns `undefined` when the handle cannot be resolved (e.g.
44
+ * credentials not yet configured).
45
+ */
46
+ resolveChannelHandle?(): string | undefined;
47
+
48
+ /**
49
+ * Async variant of `resolveChannelHandle` for adapters that need to
50
+ * perform I/O (e.g. querying a provider API for the assigned address).
51
+ * When both are present, `resolveAdapterHandle()` prefers this method.
52
+ */
53
+ resolveChannelHandleAsync?(): Promise<string | undefined>;
54
+ }
@@ -1,3 +1,8 @@
1
+ import {
2
+ normalizePublicBaseUrl,
3
+ resolveTwilioPublicBaseUrl,
4
+ } from "@vellumai/service-contracts/twilio-ingress";
5
+
1
6
  import { resolveTwilioPhoneNumber } from "../calls/twilio-config.js";
2
7
  import { hasTwilioCredentials } from "../calls/twilio-rest.js";
3
8
  import { getChannelInvitePolicy } from "../channels/config.js";
@@ -19,31 +24,35 @@ import type {
19
24
  /** Remote check results are cached for 5 minutes before being considered stale. */
20
25
  export const REMOTE_TTL_MS = 5 * 60 * 1000;
21
26
 
22
- function hasIngressConfigured(): boolean {
27
+ function hasIngressConfigured(options: { twilio?: boolean } = {}): boolean {
23
28
  try {
24
29
  const raw = loadRawConfig();
25
30
  const ingress = (raw?.ingress ?? {}) as Record<string, unknown>;
26
- const publicBaseUrl = (ingress.publicBaseUrl as string) ?? "";
31
+ const effectiveBaseUrl = options.twilio
32
+ ? (resolveTwilioPublicBaseUrl(ingress) ?? "")
33
+ : (normalizePublicBaseUrl(ingress.publicBaseUrl) ?? "");
27
34
  const enabled =
28
35
  (ingress.enabled as boolean | undefined) ??
29
- (publicBaseUrl ? true : false);
30
- return enabled && publicBaseUrl.length > 0;
36
+ (effectiveBaseUrl ? true : false);
37
+ return enabled && effectiveBaseUrl.trim().length > 0;
31
38
  } catch {
32
39
  return false;
33
40
  }
34
41
  }
35
42
 
36
- function hasWebhookRoutingConfigured(allowManagedCallbacks = false): {
43
+ function hasWebhookRoutingConfigured(
44
+ allowManagedCallbacks = false,
45
+ options: { twilio?: boolean } = {},
46
+ ): {
37
47
  configured: boolean;
38
48
  usesManagedCallbacks: boolean;
39
49
  } {
40
- const ingressConfigured = hasIngressConfigured();
50
+ const ingressConfigured = hasIngressConfigured(options);
41
51
  if (ingressConfigured) {
42
52
  return { configured: true, usesManagedCallbacks: false };
43
53
  }
44
54
 
45
- const usesManagedCallbacks =
46
- allowManagedCallbacks && getIsPlatform();
55
+ const usesManagedCallbacks = allowManagedCallbacks && getIsPlatform();
47
56
  return {
48
57
  configured: usesManagedCallbacks,
49
58
  usesManagedCallbacks,
@@ -79,19 +88,29 @@ async function checkCredential(
79
88
  }
80
89
 
81
90
  /** Check that public ingress is configured and enabled. */
82
- function checkIngress(allowManagedCallbacks = false): ReadinessCheckResult {
91
+ function checkIngress(
92
+ allowManagedCallbacks = false,
93
+ options: { twilio?: boolean } = {},
94
+ ): ReadinessCheckResult {
83
95
  const { configured, usesManagedCallbacks } = hasWebhookRoutingConfigured(
84
96
  allowManagedCallbacks,
97
+ options,
85
98
  );
86
99
  return check(
87
100
  "ingress",
88
101
  configured,
89
102
  usesManagedCallbacks
90
103
  ? "Managed platform callback routing is configured"
91
- : "Public ingress URL is configured",
104
+ : options.twilio
105
+ ? "Twilio public ingress URL is configured"
106
+ : "Public ingress URL is configured",
92
107
  allowManagedCallbacks
93
- ? "No public ingress URL or managed callback route is configured"
94
- : "Public ingress URL is not configured or disabled",
108
+ ? options.twilio
109
+ ? "No Twilio public ingress URL or managed callback route is configured"
110
+ : "No public ingress URL or managed callback route is configured"
111
+ : options.twilio
112
+ ? "Twilio public ingress URL is not configured or disabled"
113
+ : "Public ingress URL is not configured or disabled",
95
114
  );
96
115
  }
97
116
 
@@ -102,7 +121,7 @@ const voiceProbe: ChannelProbe = {
102
121
  async runLocalChecks(): Promise<ReadinessCheckResult[]> {
103
122
  const hasCreds = await hasTwilioCredentials();
104
123
  const hasPhone = !!resolveTwilioPhoneNumber();
105
- const ingress = checkIngress(true);
124
+ const ingress = checkIngress(true, { twilio: true });
106
125
 
107
126
  return [
108
127
  check(