@vellumai/assistant 0.7.1 → 0.7.2

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 (535) hide show
  1. package/ARCHITECTURE.md +32 -49
  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/security.md +20 -0
  7. package/docs/plugins.md +7 -9
  8. package/knip.json +1 -0
  9. package/node_modules/@vellumai/gateway-client/src/index.ts +1 -0
  10. package/node_modules/@vellumai/gateway-client/src/ipc-client.ts +39 -1
  11. package/node_modules/@vellumai/gateway-client/src/types.ts +11 -0
  12. package/node_modules/@vellumai/service-contracts/package.json +2 -0
  13. package/node_modules/@vellumai/service-contracts/src/__tests__/contracts.test.ts +4 -0
  14. package/node_modules/@vellumai/service-contracts/src/__tests__/ingress.test.ts +107 -0
  15. package/node_modules/@vellumai/service-contracts/src/index.ts +5 -1
  16. package/node_modules/@vellumai/service-contracts/src/ingress.ts +24 -0
  17. package/node_modules/@vellumai/service-contracts/src/twilio-ingress.ts +84 -0
  18. package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +9 -0
  19. package/node_modules/@vellumai/twilio-client/bun.lock +24 -0
  20. package/node_modules/@vellumai/twilio-client/package.json +18 -0
  21. package/node_modules/@vellumai/twilio-client/src/__tests__/twilio-client.test.ts +128 -0
  22. package/node_modules/@vellumai/twilio-client/src/index.ts +179 -0
  23. package/node_modules/@vellumai/twilio-client/tsconfig.json +20 -0
  24. package/openapi.yaml +565 -12
  25. package/package.json +6 -3
  26. package/src/__tests__/app-builder-tool-scripts.test.ts +3 -3
  27. package/src/__tests__/app-bundler.test.ts +170 -1
  28. package/src/__tests__/app-control-flow.test.ts +374 -0
  29. package/src/__tests__/app-control-no-global-cgevent.test.ts +98 -0
  30. package/src/__tests__/app-control-tool-schemas.test.ts +621 -0
  31. package/src/__tests__/app-executors.test.ts +30 -43
  32. package/src/__tests__/approval-routes-http.test.ts +23 -6
  33. package/src/__tests__/assistant-event-hub-machine-name.test.ts +146 -0
  34. package/src/__tests__/assistant-event-hub-targeted.test.ts +257 -0
  35. package/src/__tests__/assistant-event-hub.test.ts +109 -2
  36. package/src/__tests__/assistant-event.test.ts +10 -0
  37. package/src/__tests__/assistant-events-sse-hardening.test.ts +7 -2
  38. package/src/__tests__/assistant-feature-flags-integration.test.ts +11 -7
  39. package/src/__tests__/background-shell-host-bash.test.ts +14 -15
  40. package/src/__tests__/bootstrap-turn-cleanup.test.ts +44 -0
  41. package/src/__tests__/btw-routes.test.ts +13 -4
  42. package/src/__tests__/call-controller.test.ts +49 -1
  43. package/src/__tests__/call-domain.test.ts +0 -2
  44. package/src/__tests__/call-routes-http.test.ts +0 -2
  45. package/src/__tests__/channel-readiness-service.test.ts +59 -1
  46. package/src/__tests__/checker.test.ts +3 -4
  47. package/src/__tests__/config-loader-backfill.test.ts +90 -155
  48. package/src/__tests__/config-loader-platform-defaults.test.ts +196 -0
  49. package/src/__tests__/config-schema-cmd.test.ts +0 -1
  50. package/src/__tests__/config-set-platform-guard.test.ts +48 -4
  51. package/src/__tests__/config-watcher-cleanup-throttle.test.ts +2 -2
  52. package/src/__tests__/config-watcher.test.ts +2 -2
  53. package/src/__tests__/conversation-app-control-instantiation.test.ts +392 -0
  54. package/src/__tests__/conversation-app-control-lifecycle.test.ts +237 -0
  55. package/src/__tests__/conversation-init.benchmark.test.ts +0 -2
  56. package/src/__tests__/conversation-lifecycle.test.ts +36 -0
  57. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +283 -0
  58. package/src/__tests__/conversation-routes-disk-view.test.ts +6 -0
  59. package/src/__tests__/conversation-routes-guardian-reply.test.ts +120 -72
  60. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -0
  61. package/src/__tests__/conversation-slash-commands.test.ts +0 -4
  62. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +202 -0
  63. package/src/__tests__/conversation-surfaces-app-control.test.ts +317 -0
  64. package/src/__tests__/credential-execution-feature-gates.test.ts +5 -12
  65. package/src/__tests__/credential-execution-managed-contract.test.ts +3 -131
  66. package/src/__tests__/credentials-cli.test.ts +5 -12
  67. package/src/__tests__/cu-unified-flow.test.ts +185 -23
  68. package/src/__tests__/daemon-credential-client.test.ts +101 -19
  69. package/src/__tests__/db-schedule-syntax-migration.test.ts +2 -0
  70. package/src/__tests__/dynamic-skill-workflow-prompt.test.ts +0 -1
  71. package/src/__tests__/gateway-only-enforcement.test.ts +0 -1
  72. package/src/__tests__/guardian-verification-voice-binding.test.ts +0 -2
  73. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -2
  74. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +0 -1
  75. package/src/__tests__/heartbeat-service.test.ts +718 -1
  76. package/src/__tests__/helpers/call-route-handler.ts +7 -1
  77. package/src/__tests__/host-app-control-proxy.test.ts +602 -0
  78. package/src/__tests__/host-app-control-routes.test.ts +263 -0
  79. package/src/__tests__/host-bash-proxy.test.ts +246 -47
  80. package/src/__tests__/host-bash-routes.test.ts +294 -0
  81. package/src/__tests__/host-browser-proxy.test.ts +24 -22
  82. package/src/__tests__/host-browser-routes.test.ts +39 -13
  83. package/src/__tests__/host-cu-proxy.test.ts +41 -52
  84. package/src/__tests__/host-cu-routes-targeted.test.ts +300 -0
  85. package/src/__tests__/host-file-edit-tool.test.ts +47 -1
  86. package/src/__tests__/host-file-proxy-targeted.test.ts +339 -0
  87. package/src/__tests__/host-file-proxy.test.ts +37 -43
  88. package/src/__tests__/host-file-read-tool.test.ts +17 -0
  89. package/src/__tests__/host-file-routes-targeted.test.ts +262 -0
  90. package/src/__tests__/host-file-write-tool.test.ts +42 -1
  91. package/src/__tests__/host-proxy-base.test.ts +312 -0
  92. package/src/__tests__/host-shell-tool.test.ts +22 -4
  93. package/src/__tests__/host-transfer-proxy-targeted.test.ts +583 -0
  94. package/src/__tests__/host-transfer-proxy.test.ts +121 -22
  95. package/src/__tests__/host-transfer-routes-targeted.test.ts +447 -0
  96. package/src/__tests__/http-user-message-parity.test.ts +1 -0
  97. package/src/__tests__/identity-intro-cache.test.ts +29 -0
  98. package/src/__tests__/identity-routes.test.ts +103 -1
  99. package/src/__tests__/init-feature-flag-overrides.test.ts +26 -3
  100. package/src/__tests__/inline-command-runner.test.ts +0 -1
  101. package/src/__tests__/inline-skill-load-permissions.test.ts +5 -11
  102. package/src/__tests__/integration-status.test.ts +85 -5
  103. package/src/__tests__/intent-routing.test.ts +0 -1
  104. package/src/__tests__/jobs-store-qdrant-breaker.test.ts +95 -5
  105. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +17 -0
  106. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -1
  107. package/src/__tests__/mcp-auth-routes.test.ts +197 -0
  108. package/src/__tests__/mcp-cli.test.ts +338 -2
  109. package/src/__tests__/memory-jobs-worker-lanes.test.ts +188 -0
  110. package/src/__tests__/migration-import-commit-http.test.ts +108 -2
  111. package/src/__tests__/mock-gateway-ipc.ts +1 -0
  112. package/src/__tests__/oauth-cli.test.ts +0 -2
  113. package/src/__tests__/oauth2-gateway-transport.test.ts +0 -1
  114. package/src/__tests__/persistence-secret-redaction.test.ts +299 -0
  115. package/src/__tests__/platform-bash-auto-approve.test.ts +5 -9
  116. package/src/__tests__/prechat-onboarding-contract.test.ts +3 -1
  117. package/src/__tests__/process-message-background-slack.test.ts +2 -0
  118. package/src/__tests__/provider-commit-message-generator.test.ts +0 -1
  119. package/src/__tests__/public-ingress-urls.test.ts +97 -0
  120. package/src/__tests__/require-fresh-approval.test.ts +0 -1
  121. package/src/__tests__/retry-backoff.test.ts +87 -0
  122. package/src/__tests__/runtime-events-sse.test.ts +10 -6
  123. package/src/__tests__/sanitize-config-for-transfer.test.ts +24 -2
  124. package/src/__tests__/schedule-retry.test.ts +715 -0
  125. package/src/__tests__/script-proxy-mitm-handler.test.ts +1 -1
  126. package/src/__tests__/secret-ingress-http.test.ts +1 -0
  127. package/src/__tests__/send-endpoint-busy.test.ts +3 -0
  128. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -1
  129. package/src/__tests__/skill-feature-flags.test.ts +43 -41
  130. package/src/__tests__/skill-load-feature-flag.test.ts +13 -14
  131. package/src/__tests__/skill-load-inline-command.test.ts +0 -51
  132. package/src/__tests__/skill-load-inline-includes.test.ts +0 -43
  133. package/src/__tests__/skill-projection.benchmark.test.ts +0 -1
  134. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -1
  135. package/src/__tests__/slack-channel-config.test.ts +9 -14
  136. package/src/__tests__/system-prompt-ask-mode.test.ts +0 -1
  137. package/src/__tests__/system-prompt.test.ts +0 -1
  138. package/src/__tests__/telegram-config.test.ts +0 -1
  139. package/src/__tests__/test-preload.ts +8 -0
  140. package/src/__tests__/tool-approval-handler.test.ts +3 -4
  141. package/src/__tests__/tool-audit-listener.test.ts +48 -0
  142. package/src/__tests__/tool-execute-pipeline.test.ts +0 -1
  143. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -1
  144. package/src/__tests__/tool-executor-lifecycle-events.test.ts +0 -1
  145. package/src/__tests__/tool-executor.test.ts +0 -1
  146. package/src/__tests__/twilio-config.test.ts +3 -16
  147. package/src/__tests__/twilio-routes.test.ts +3 -5
  148. package/src/__tests__/twilio-validation.test.ts +93 -0
  149. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +1 -4
  150. package/src/__tests__/verification-control-plane-policy.test.ts +2 -4
  151. package/src/__tests__/voice-ingress-preflight.test.ts +19 -0
  152. package/src/__tests__/workspace-migration-006-services-config.test.ts +3 -2
  153. package/src/__tests__/workspace-migration-backfill-installation-id.test.ts +1 -5
  154. package/src/__tests__/workspace-migration-down-functions.test.ts +8 -8
  155. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +10 -6
  156. package/src/backup/__tests__/paths.test.ts +0 -22
  157. package/src/backup/__tests__/restore.test.ts +51 -151
  158. package/src/backup/paths.ts +2 -18
  159. package/src/backup/restore.ts +107 -231
  160. package/src/bundler/app-bundler.ts +51 -3
  161. package/src/calls/relay-server.ts +4 -44
  162. package/src/calls/twilio-config.ts +2 -17
  163. package/src/calls/twilio-rest.ts +33 -105
  164. package/src/calls/twilio-routes.ts +11 -12
  165. package/src/channels/types.ts +8 -7
  166. package/src/cli/commands/__tests__/backup.test.ts +6 -277
  167. package/src/cli/commands/__tests__/gateway.test.ts +288 -0
  168. package/src/cli/commands/__tests__/memory-v2.test.ts +4 -0
  169. package/src/cli/commands/__tests__/webhooks.test.ts +0 -1
  170. package/src/cli/commands/backup.ts +6 -331
  171. package/src/cli/commands/clients.ts +36 -37
  172. package/src/cli/commands/contacts.ts +73 -0
  173. package/src/cli/commands/conversations.ts +2 -5
  174. package/src/cli/commands/credentials.ts +15 -7
  175. package/src/cli/commands/domain.ts +66 -15
  176. package/src/cli/commands/gateway.ts +183 -0
  177. package/src/cli/commands/keys.ts +9 -6
  178. package/src/cli/commands/mcp.ts +116 -156
  179. package/src/cli/commands/memory-v2.ts +296 -1
  180. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +0 -1
  181. package/src/cli/commands/platform/__tests__/connect.test.ts +0 -2
  182. package/src/cli/commands/platform/__tests__/disconnect.test.ts +0 -2
  183. package/src/cli/commands/platform/__tests__/status.test.ts +13 -15
  184. package/src/cli/commands/platform/disconnect.ts +5 -4
  185. package/src/cli/commands/platform/index.ts +0 -18
  186. package/src/cli/lib/daemon-credential-client.ts +110 -28
  187. package/src/cli/program.ts +2 -0
  188. package/src/config/assistant-feature-flags.ts +67 -10
  189. package/src/config/bundled-skills/acp/SKILL.md +6 -0
  190. package/src/config/bundled-skills/acp/TOOLS.json +1 -22
  191. package/src/config/bundled-skills/app-builder/SKILL.md +14 -109
  192. package/src/config/bundled-skills/app-builder/TOOLS.json +1 -28
  193. package/src/config/bundled-skills/app-builder/tools/app-create.ts +1 -10
  194. package/src/config/bundled-skills/app-control/SKILL.md +75 -0
  195. package/src/config/bundled-skills/app-control/TOOLS.json +299 -0
  196. package/src/config/bundled-skills/app-control/tools/app-control-click.ts +12 -0
  197. package/src/config/bundled-skills/app-control/tools/app-control-combo.ts +12 -0
  198. package/src/config/bundled-skills/app-control/tools/app-control-drag.ts +12 -0
  199. package/src/config/bundled-skills/app-control/tools/app-control-observe.ts +12 -0
  200. package/src/config/bundled-skills/app-control/tools/app-control-press.ts +12 -0
  201. package/src/config/bundled-skills/app-control/tools/app-control-sequence.ts +12 -0
  202. package/src/config/bundled-skills/app-control/tools/app-control-start.ts +12 -0
  203. package/src/config/bundled-skills/app-control/tools/app-control-stop.ts +12 -0
  204. package/src/config/bundled-skills/app-control/tools/app-control-type.ts +12 -0
  205. package/src/config/bundled-skills/computer-use/SKILL.md +6 -0
  206. package/src/config/bundled-skills/computer-use/TOOLS.json +67 -43
  207. package/src/config/bundled-skills/contacts/TOOLS.json +0 -16
  208. package/src/config/bundled-skills/document/TOOLS.json +0 -8
  209. package/src/config/bundled-skills/followups/TOOLS.json +0 -12
  210. package/src/config/bundled-skills/image-studio/SKILL.md +4 -0
  211. package/src/config/bundled-skills/image-studio/TOOLS.json +0 -4
  212. package/src/config/bundled-skills/media-processing/TOOLS.json +0 -24
  213. package/src/config/bundled-skills/messaging/TOOLS.json +0 -40
  214. package/src/config/bundled-skills/phone-calls/TOOLS.json +0 -12
  215. package/src/config/bundled-skills/phone-calls/references/TROUBLESHOOTING.md +19 -4
  216. package/src/config/bundled-skills/playbooks/TOOLS.json +0 -16
  217. package/src/config/bundled-skills/schedule/TOOLS.json +14 -14
  218. package/src/config/bundled-skills/sequences/TOOLS.json +0 -36
  219. package/src/config/bundled-skills/settings/SKILL.md +4 -0
  220. package/src/config/bundled-skills/settings/TOOLS.json +0 -12
  221. package/src/config/bundled-skills/skill-management/SKILL.md +6 -0
  222. package/src/config/bundled-skills/skill-management/TOOLS.json +0 -8
  223. package/src/config/bundled-skills/subagent/SKILL.md +6 -2
  224. package/src/config/bundled-skills/subagent/TOOLS.json +0 -20
  225. package/src/config/bundled-skills/transcribe/SKILL.md +4 -0
  226. package/src/config/bundled-skills/transcribe/TOOLS.json +0 -4
  227. package/src/config/bundled-tool-registry.ts +21 -0
  228. package/src/config/env-registry.ts +0 -2
  229. package/src/config/env.ts +19 -12
  230. package/src/config/feature-flag-registry.json +21 -133
  231. package/src/config/loader.ts +73 -99
  232. package/src/config/sanitize-for-transfer.ts +2 -0
  233. package/src/config/schemas/__tests__/memory-lifecycle.test.ts +80 -0
  234. package/src/config/schemas/__tests__/memory-v2.test.ts +7 -4
  235. package/src/config/schemas/calls.ts +0 -9
  236. package/src/config/schemas/heartbeat.ts +63 -0
  237. package/src/config/schemas/ingress.ts +10 -6
  238. package/src/config/schemas/llm.ts +5 -10
  239. package/src/config/schemas/memory-lifecycle.ts +77 -24
  240. package/src/config/schemas/memory-v2.ts +48 -4
  241. package/src/config/schemas/platform.ts +6 -0
  242. package/src/config/schemas/services.ts +1 -15
  243. package/src/config/schemas/skills.ts +0 -6
  244. package/src/config/seed-inference-profiles.ts +1 -1
  245. package/src/contacts/contact-store.ts +0 -30
  246. package/src/contacts/contacts-write.ts +0 -27
  247. package/src/context/window-manager.ts +1 -2
  248. package/src/credential-execution/feature-gates.ts +10 -10
  249. package/src/credential-execution/process-manager.ts +12 -41
  250. package/src/daemon/__tests__/conversation-tool-setup.test.ts +126 -5
  251. package/src/daemon/bootstrap-turn-cleanup.ts +45 -0
  252. package/src/daemon/config-watcher.ts +4 -3
  253. package/src/daemon/conversation-agent-loop-handlers.ts +21 -3
  254. package/src/daemon/conversation-agent-loop.ts +32 -28
  255. package/src/daemon/conversation-lifecycle.ts +8 -1
  256. package/src/daemon/conversation-process.ts +16 -11
  257. package/src/daemon/conversation-runtime-assembly.ts +2 -2
  258. package/src/daemon/conversation-surfaces.ts +125 -4
  259. package/src/daemon/conversation-tool-setup.ts +16 -55
  260. package/src/daemon/conversation.ts +21 -2
  261. package/src/daemon/doordash-steps.ts +1 -1
  262. package/src/daemon/handlers/shared.ts +4 -1
  263. package/src/daemon/host-app-control-proxy.ts +293 -0
  264. package/src/daemon/host-bash-proxy.ts +84 -74
  265. package/src/daemon/host-browser-proxy.ts +67 -82
  266. package/src/daemon/host-cu-proxy.ts +81 -86
  267. package/src/daemon/host-file-proxy.ts +93 -69
  268. package/src/daemon/host-proxy-base.ts +294 -0
  269. package/src/daemon/host-proxy-preactivation.ts +82 -0
  270. package/src/daemon/host-transfer-proxy.ts +247 -129
  271. package/src/daemon/lifecycle.ts +115 -117
  272. package/src/daemon/message-protocol.ts +3 -8
  273. package/src/daemon/message-types/contacts.ts +23 -1
  274. package/src/daemon/message-types/conversations.ts +11 -8
  275. package/src/daemon/message-types/host-app-control.ts +150 -0
  276. package/src/daemon/message-types/host-bash.ts +4 -0
  277. package/src/daemon/message-types/host-cu.ts +2 -0
  278. package/src/daemon/message-types/host-file.ts +4 -0
  279. package/src/daemon/message-types/host-transfer.ts +3 -0
  280. package/src/daemon/message-types/schedules.ts +8 -3
  281. package/src/daemon/message-types/skills.ts +2 -2
  282. package/src/daemon/process-message.ts +18 -1
  283. package/src/daemon/shutdown-handlers.ts +0 -3
  284. package/src/daemon/tool-setup-types.ts +51 -0
  285. package/src/daemon/tool-side-effects.ts +1 -1
  286. package/src/events/tool-audit-listener.ts +2 -1
  287. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +15 -7
  288. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +216 -0
  289. package/src/heartbeat/heartbeat-run-store.ts +236 -0
  290. package/src/heartbeat/heartbeat-service.ts +280 -49
  291. package/src/home/__tests__/post-connect-feed.test.ts +99 -0
  292. package/src/home/__tests__/relationship-state-writer.test.ts +11 -9
  293. package/src/home/__tests__/suggested-prompts.test.ts +89 -0
  294. package/src/home/post-connect-feed.ts +68 -0
  295. package/src/home/relationship-state-writer.ts +17 -92
  296. package/src/home/suggested-prompts.ts +46 -10
  297. package/src/inbound/public-ingress-urls.ts +32 -34
  298. package/src/ipc/__tests__/route-error-envelope.test.ts +80 -0
  299. package/src/ipc/assistant-server.ts +14 -1
  300. package/src/ipc/cli-client.ts +32 -1
  301. package/src/live-voice/live-voice-metrics.ts +10 -10
  302. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +304 -0
  303. package/src/mcp/mcp-auth-orchestrator.ts +213 -0
  304. package/src/mcp/mcp-auth-state.ts +133 -0
  305. package/src/mcp/mcp-oauth-provider.ts +19 -0
  306. package/src/memory/__tests__/jobs-store-job-classes.test.ts +24 -0
  307. package/src/memory/__tests__/qdrant-client-sentinel.test.ts +49 -0
  308. package/src/memory/__tests__/sparse-tokenize.test.ts +66 -0
  309. package/src/memory/anisotropy.test.ts +247 -0
  310. package/src/memory/anisotropy.ts +443 -0
  311. package/src/memory/auto-analysis-constants.ts +17 -0
  312. package/src/memory/auto-analysis-guard.ts +5 -15
  313. package/src/memory/canonical-guardian-store.ts +7 -7
  314. package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +122 -0
  315. package/src/memory/context-search/agent-protocol.ts +6 -6
  316. package/src/memory/context-search/agent-runner.ts +32 -7
  317. package/src/memory/context-search/sources/memory-v2.ts +17 -5
  318. package/src/memory/conversation-crud.ts +1 -1
  319. package/src/memory/conversation-key-store.ts +2 -15
  320. package/src/memory/db-init.ts +4 -0
  321. package/src/memory/embedding-backend.ts +9 -21
  322. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +49 -4
  323. package/src/memory/graph/conversation-graph-memory.ts +1 -24
  324. package/src/memory/graph/graph-search.ts +8 -0
  325. package/src/memory/graph/retriever.ts +28 -0
  326. package/src/memory/graph/tools.ts +1 -1
  327. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +8 -2
  328. package/src/memory/jobs/embed-concept-page.ts +28 -2
  329. package/src/memory/jobs/embed-pkb-file.test.ts +2 -2
  330. package/src/memory/jobs-store.ts +66 -22
  331. package/src/memory/jobs-worker.ts +112 -63
  332. package/src/memory/memory-v2-activation-log-store.ts +1 -1
  333. package/src/memory/migrations/237-heartbeat-runs.ts +45 -0
  334. package/src/memory/migrations/238-schedule-retry-policy.ts +20 -0
  335. package/src/memory/migrations/index.ts +5 -0
  336. package/src/memory/migrations/registry.ts +8 -0
  337. package/src/memory/pkb/pkb-search.ts +7 -0
  338. package/src/memory/qdrant-client.ts +50 -20
  339. package/src/memory/schema/infrastructure.ts +15 -0
  340. package/src/memory/search/semantic.ts +7 -0
  341. package/src/memory/sparse-tokenize.ts +49 -0
  342. package/src/memory/v2/__tests__/activation.test.ts +77 -95
  343. package/src/memory/v2/__tests__/injection.test.ts +43 -21
  344. package/src/memory/v2/__tests__/sim.test.ts +166 -6
  345. package/src/memory/v2/__tests__/sparse-bm25.test.ts +292 -0
  346. package/src/memory/v2/__tests__/static-context.test.ts +0 -1
  347. package/src/memory/v2/activation.ts +69 -88
  348. package/src/memory/v2/consolidation-job.ts +3 -5
  349. package/src/memory/v2/constants.ts +7 -0
  350. package/src/memory/v2/injection.ts +86 -53
  351. package/src/memory/v2/prompts/consolidation.ts +312 -91
  352. package/src/memory/v2/qdrant.ts +99 -1
  353. package/src/memory/v2/sim.ts +126 -16
  354. package/src/memory/v2/skill-qdrant.ts +12 -3
  355. package/src/memory/v2/skill-store.ts +16 -1
  356. package/src/memory/v2/sparse-bm25.ts +245 -0
  357. package/src/memory/v2/static-context.ts +6 -5
  358. package/src/messaging/providers/gmail/types.ts +0 -49
  359. package/src/messaging/providers/slack/adapter.ts +1 -31
  360. package/src/messaging/providers/slack/types.ts +0 -32
  361. package/src/notifications/README.md +10 -10
  362. package/src/notifications/broadcaster.ts +1 -1
  363. package/src/notifications/guardian-question-mode.ts +5 -5
  364. package/src/oauth/connect-orchestrator.ts +4 -0
  365. package/src/oauth/credential-token-resolver.ts +1 -3
  366. package/src/oauth/manual-token-connection.ts +0 -4
  367. package/src/outbound-proxy/index.ts +1 -37
  368. package/src/outbound-proxy/logging.ts +1 -1
  369. package/src/outbound-proxy/policy.ts +6 -5
  370. package/src/outbound-proxy/router.ts +2 -1
  371. package/src/permissions/approval-policy.test.ts +6 -275
  372. package/src/permissions/approval-policy.ts +0 -51
  373. package/src/permissions/checker.test.ts +0 -1
  374. package/src/permissions/checker.ts +3 -17
  375. package/src/permissions/gateway-threshold-reader.ts +2 -0
  376. package/src/permissions/prompter.ts +34 -1
  377. package/src/permissions/secret-prompter.ts +6 -2
  378. package/src/prompts/bootstrap-cleanup.ts +27 -0
  379. package/src/prompts/system-prompt.ts +3 -18
  380. package/src/prompts/templates/SOUL.md +13 -1
  381. package/src/providers/speech-to-text/provider-catalog.ts +7 -8
  382. package/src/runtime/assistant-event-hub.ts +118 -96
  383. package/src/runtime/assistant-event.ts +1 -0
  384. package/src/runtime/auth/__tests__/middleware.test.ts +11 -56
  385. package/src/runtime/auth/middleware.ts +0 -96
  386. package/src/runtime/auth/route-policy.ts +19 -0
  387. package/src/runtime/btw-sidechain.ts +2 -3
  388. package/src/runtime/channel-invite-transport.ts +2 -48
  389. package/src/runtime/channel-invite-transports/email.ts +1 -1
  390. package/src/runtime/channel-invite-transports/slack.ts +1 -1
  391. package/src/runtime/channel-invite-transports/telegram.ts +1 -1
  392. package/src/runtime/channel-invite-transports/voice.ts +1 -1
  393. package/src/runtime/channel-invite-transports/whatsapp.ts +1 -1
  394. package/src/runtime/channel-invite-types.ts +54 -0
  395. package/src/runtime/channel-readiness-service.ts +32 -13
  396. package/src/runtime/http-server.ts +3 -329
  397. package/src/runtime/http-types.ts +0 -5
  398. package/src/runtime/migrations/__tests__/vbundle-import-parity.test.ts +413 -0
  399. package/src/runtime/migrations/__tests__/vbundle-import-policy.test.ts +260 -0
  400. package/src/runtime/migrations/__tests__/vbundle-import-version-compat.test.ts +189 -0
  401. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +153 -1
  402. package/src/runtime/migrations/__tests__/vbundle-symlink-importer.test.ts +451 -0
  403. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming-importer.test.ts +0 -0
  404. package/src/runtime/migrations/__tests__/vbundle-symlink-streaming.test.ts +515 -0
  405. package/src/runtime/migrations/__tests__/vbundle-symlink-tar.test.ts +437 -0
  406. package/src/runtime/migrations/__tests__/vbundle-symlink-walker.test.ts +319 -0
  407. package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +51 -1
  408. package/src/runtime/migrations/migration-transport.ts +7 -7
  409. package/src/runtime/migrations/vbundle-builder.ts +327 -60
  410. package/src/runtime/migrations/vbundle-import-analyzer.ts +4 -4
  411. package/src/runtime/migrations/vbundle-import-policy.ts +172 -0
  412. package/src/runtime/migrations/vbundle-importer.ts +245 -68
  413. package/src/runtime/migrations/vbundle-streaming-importer.ts +326 -35
  414. package/src/runtime/migrations/vbundle-streaming-validator.ts +157 -4
  415. package/src/runtime/migrations/vbundle-tar-stream.ts +15 -6
  416. package/src/runtime/migrations/vbundle-validator.ts +114 -0
  417. package/src/runtime/pending-interactions.ts +35 -9
  418. package/src/runtime/routes/__tests__/backup-routes.test.ts +22 -150
  419. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +98 -0
  420. package/src/runtime/routes/__tests__/gateway-log-routes.test.ts +242 -0
  421. package/src/runtime/routes/__tests__/heartbeat-routes.test.ts +112 -0
  422. package/src/runtime/routes/approval-interception-types.ts +13 -0
  423. package/src/runtime/routes/approval-strategies/guardian-text-engine-strategy.ts +1 -1
  424. package/src/runtime/routes/backup-routes.ts +15 -38
  425. package/src/runtime/routes/btw-routes.ts +14 -37
  426. package/src/runtime/routes/client-routes.ts +1 -0
  427. package/src/runtime/routes/contact-prompt-routes.ts +183 -0
  428. package/src/runtime/routes/conversation-query-routes.ts +36 -1
  429. package/src/runtime/routes/conversation-routes.ts +30 -13
  430. package/src/runtime/routes/document-pdf-renderer.ts +165 -0
  431. package/src/runtime/routes/documents-routes.ts +30 -0
  432. package/src/runtime/routes/errors.ts +19 -4
  433. package/src/runtime/routes/events-routes.ts +12 -6
  434. package/src/runtime/routes/gateway-log-routes.ts +79 -0
  435. package/src/runtime/routes/guardian-approval-interception.ts +2 -8
  436. package/src/runtime/routes/heartbeat-routes.ts +103 -38
  437. package/src/runtime/routes/host-app-control-routes.ts +134 -0
  438. package/src/runtime/routes/host-bash-routes.ts +36 -6
  439. package/src/runtime/routes/host-browser-routes.ts +108 -13
  440. package/src/runtime/routes/host-cu-routes.ts +44 -14
  441. package/src/runtime/routes/host-file-routes.ts +33 -10
  442. package/src/runtime/routes/host-transfer-routes.ts +64 -24
  443. package/src/runtime/routes/http-adapter.ts +1 -0
  444. package/src/runtime/routes/identity-intro-cache.ts +30 -0
  445. package/src/runtime/routes/identity-routes.ts +15 -43
  446. package/src/runtime/routes/inbound-message-handler.ts +1 -9
  447. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -7
  448. package/src/runtime/routes/inbound-stages/edit-intercept.ts +0 -8
  449. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +0 -20
  450. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +5 -13
  451. package/src/runtime/routes/index.ts +8 -0
  452. package/src/runtime/routes/mcp-auth-routes.ts +132 -0
  453. package/src/runtime/routes/memory-item-routes.ts +10 -12
  454. package/src/runtime/routes/memory-v2-routes.ts +441 -1
  455. package/src/runtime/routes/migration-routes.ts +96 -0
  456. package/src/runtime/routes/schedule-routes.ts +7 -0
  457. package/src/runtime/verification-templates.ts +4 -7
  458. package/src/schedule/integration-status.ts +66 -2
  459. package/src/schedule/recurrence-engine.ts +4 -1
  460. package/src/schedule/retry-backoff.ts +18 -0
  461. package/src/schedule/retry-policy.ts +82 -0
  462. package/src/schedule/schedule-recovery.ts +64 -0
  463. package/src/schedule/schedule-store.ts +106 -2
  464. package/src/schedule/scheduler-types.ts +25 -0
  465. package/src/schedule/scheduler.ts +63 -38
  466. package/src/security/oauth-callback-registry.ts +8 -0
  467. package/src/sequence/analytics.ts +5 -5
  468. package/src/sequence/engine.ts +1 -1
  469. package/src/skills/catalog-files.ts +2 -8
  470. package/src/skills/include-graph.ts +5 -5
  471. package/src/skills/remote-skill-policy.ts +5 -5
  472. package/src/skills/skill-file-provider.ts +1 -1
  473. package/src/skills/skill-file-types.ts +13 -0
  474. package/src/skills/skillssh-audit-types.ts +28 -0
  475. package/src/skills/skillssh-registry.ts +8 -21
  476. package/src/telemetry/types.ts +2 -0
  477. package/src/telemetry/usage-telemetry-reporter.test.ts +21 -0
  478. package/src/telemetry/usage-telemetry-reporter.ts +1 -0
  479. package/src/tools/app-control/skill-proxy-bridge.ts +28 -0
  480. package/src/tools/apps/executors.ts +56 -69
  481. package/src/tools/browser/__tests__/browser-status.test.ts +21 -18
  482. package/src/tools/browser/browser-execution.ts +2 -2
  483. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +55 -4
  484. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +12 -6
  485. package/src/tools/browser/cdp-client/factory.ts +23 -24
  486. package/src/tools/browser/cdp-client/index.ts +1 -14
  487. package/src/tools/computer-use/definitions.ts +42 -20
  488. package/src/tools/executor.ts +2 -0
  489. package/src/tools/host-filesystem/edit.ts +26 -0
  490. package/src/tools/host-filesystem/read.ts +26 -0
  491. package/src/tools/host-filesystem/transfer.ts +31 -1
  492. package/src/tools/host-filesystem/write.ts +26 -0
  493. package/src/tools/host-terminal/host-shell.ts +58 -0
  494. package/src/tools/schedule/create.ts +6 -0
  495. package/src/tools/schedule/list.ts +2 -0
  496. package/src/tools/schedule/update.ts +10 -0
  497. package/src/tools/shared/filesystem/file-ops-service.ts +2 -0
  498. package/src/tools/shared/filesystem/path-policy.ts +25 -1
  499. package/src/tools/skills/load.ts +0 -32
  500. package/src/tools/tool-approval-handler.ts +1 -5
  501. package/src/tools/types.ts +4 -0
  502. package/src/usage/pricing.ts +1 -1
  503. package/src/workspace/hatched-date.ts +86 -0
  504. package/src/workspace/migrations/003-seed-device-id.ts +1 -1
  505. package/src/workspace/migrations/006-services-config.ts +8 -5
  506. package/src/workspace/migrations/016-extract-feature-flags-to-protected.ts +3 -9
  507. package/src/workspace/migrations/021-move-signals-to-workspace.ts +4 -10
  508. package/src/workspace/migrations/022-move-hooks-to-workspace.ts +4 -10
  509. package/src/workspace/migrations/023-move-config-files-to-workspace.ts +4 -11
  510. package/src/workspace/migrations/024-move-runtime-files-to-workspace.ts +3 -10
  511. package/src/workspace/migrations/040-seed-latency-callsite-defaults.ts +3 -2
  512. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +2 -1
  513. package/src/workspace/migrations/059-move-pid-to-workspace.ts +3 -8
  514. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +3 -8
  515. package/src/workspace/migrations/AGENTS.md +1 -1
  516. package/src/workspace/migrations/migrate-to-workspace-volume.ts +4 -10
  517. package/src/workspace/migrations/utils.ts +21 -0
  518. package/src/__tests__/host-browser-e2e-cloud.test.ts +0 -443
  519. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +0 -226
  520. package/src/__tests__/host-browser-ws-events-e2e.test.ts +0 -427
  521. package/src/__tests__/twilio-rest.test.ts +0 -34
  522. package/src/backup/__tests__/backup-key.test.ts +0 -152
  523. package/src/backup/__tests__/backup-worker.test.ts +0 -782
  524. package/src/backup/__tests__/offsite-writer.test.ts +0 -641
  525. package/src/backup/__tests__/stream-crypt.test.ts +0 -228
  526. package/src/backup/backup-key.ts +0 -137
  527. package/src/backup/backup-worker.ts +0 -472
  528. package/src/backup/offsite-writer.ts +0 -222
  529. package/src/backup/stream-crypt.ts +0 -263
  530. package/src/daemon/message-types/pairing.ts +0 -58
  531. package/src/outbound-proxy/config.ts +0 -20
  532. package/src/outbound-proxy/health.ts +0 -18
  533. package/src/outbound-proxy/types.ts +0 -150
  534. package/src/runtime/capability-tokens.ts +0 -190
  535. package/src/signals/mcp-reload.ts +0 -18
@@ -1,4 +1,3 @@
1
- import type { LLMCallSite } from "../config/schemas/llm.js";
2
1
  import { emitFeedEvent } from "../home/emit-feed-event.js";
3
2
  import { bootstrapConversation } from "../memory/conversation-bootstrap.js";
4
3
  import { getConversation } from "../memory/conversation-crud.js";
@@ -12,40 +11,26 @@ import {
12
11
  type WatcherNotifier,
13
12
  } from "../watcher/engine.js";
14
13
  import { hasSetConstructs } from "./recurrence-engine.js";
14
+ import { applyRetryDecision, decideRetry } from "./retry-policy.js";
15
15
  import { runScript, type ScriptResult } from "./run-script.js";
16
16
  import {
17
17
  claimDueSchedules,
18
18
  completeOneShot,
19
19
  completeScheduleRun,
20
20
  createScheduleRun,
21
- failOneShot,
22
21
  failOneShotPermanently,
23
22
  getLastScheduleConversationId,
23
+ resetRetryCount,
24
24
  retryOneShot,
25
25
  type RoutingIntent,
26
+ type ScheduleJob,
27
+ scheduleRetry,
26
28
  } from "./schedule-store.js";
27
29
 
28
30
  const log = getLogger("scheduler");
29
31
 
30
- export interface ScheduleMessageOptions {
31
- trustClass?: "guardian" | "trusted_contact" | "unknown";
32
- taskRunId?: string;
33
- /**
34
- * Optional LLM call-site identifier propagated to the per-call provider
35
- * config. Schedule and sequence callers will start passing their own call-site
36
- * (e.g. for a future scheduled-agent profile) once PRs 7-11 migrate them off
37
- * the default `mainAgent` route.
38
- */
39
- callSite?: LLMCallSite;
40
- }
41
-
42
- export type ScheduleMessageProcessor = (
43
- conversationId: string,
44
- message: string,
45
- options?: ScheduleMessageOptions,
46
- ) => Promise<unknown>;
47
-
48
- export type ScheduleNotifyModeNotifier = (payload: {
32
+ import type { ScheduleMessageProcessor } from "./scheduler-types.js";
33
+ type ScheduleNotifyModeNotifier = (payload: {
49
34
  id: string;
50
35
  label: string;
51
36
  message: string;
@@ -53,7 +38,7 @@ export type ScheduleNotifyModeNotifier = (payload: {
53
38
  routingHints: Record<string, unknown>;
54
39
  }) => void | Promise<void>;
55
40
 
56
- export type ScheduleConversationCreatedNotifier = (info: {
41
+ type ScheduleConversationCreatedNotifier = (info: {
57
42
  conversationId: string;
58
43
  scheduleJobId: string;
59
44
  title: string;
@@ -73,6 +58,26 @@ const TICK_INTERVAL_MS = 15_000;
73
58
  */
74
59
  const WAKE_MAX_RETRIES = 20;
75
60
 
61
+ function handleExecutionFailure(params: {
62
+ job: ScheduleJob;
63
+ errorMsg: string;
64
+ isOneShot: boolean;
65
+ }): void {
66
+ const decision = decideRetry(params.job);
67
+ applyRetryDecision({
68
+ job: params.job,
69
+ isOneShot: params.isOneShot,
70
+ errorMsg: params.errorMsg,
71
+ decision,
72
+ scheduleRetry,
73
+ failOneShotPermanently,
74
+ resetRetryCount,
75
+ emitAlert: (title, summary, dedupKey) =>
76
+ emitScheduleFeedEvent({ title, summary, dedupKey }),
77
+ log,
78
+ });
79
+ }
80
+
76
81
  export function startScheduler(
77
82
  processMessage: ScheduleMessageProcessor,
78
83
  notifyScheduleOneShot: ScheduleNotifyModeNotifier,
@@ -154,6 +159,8 @@ async function runScheduleOnce(
154
159
  routingHints: job.routingHints,
155
160
  });
156
161
  if (isOneShot) {
162
+ const successRunId = createScheduleRun(job.id, `notify-ok:${job.id}`);
163
+ completeScheduleRun(successRunId, { status: "ok" });
157
164
  completeOneShot(job.id);
158
165
  emitScheduleFeedEvent({
159
166
  title: job.name,
@@ -176,15 +183,10 @@ async function runScheduleOnce(
176
183
  { err, jobId: job.id, name: job.name, isOneShot },
177
184
  "Schedule notification failed",
178
185
  );
179
- if (isOneShot) {
180
- failOneShot(job.id);
181
- } else {
182
- // Track recurring notify-mode failures via a schedule run so the
183
- // occurrence isn't silently lost and lastStatus/retryCount update.
184
- const errorMsg = err instanceof Error ? err.message : String(err);
185
- const runId = createScheduleRun(job.id, `notify-error:${job.id}`);
186
- completeScheduleRun(runId, { status: "error", error: errorMsg });
187
- }
186
+ const errorMsg = err instanceof Error ? err.message : String(err);
187
+ const errorRunId = createScheduleRun(job.id, `notify-error:${job.id}`);
188
+ completeScheduleRun(errorRunId, { status: "error", error: errorMsg });
189
+ handleExecutionFailure({ job, errorMsg, isOneShot });
188
190
  }
189
191
  processed += 1;
190
192
  continue;
@@ -222,7 +224,9 @@ async function runScheduleOnce(
222
224
  }
223
225
  if (isOneShot) completeOneShot(job.id);
224
226
  } else {
225
- if (isOneShot) failOneShot(job.id);
227
+ const errorMsg =
228
+ result.stderr || "Script exited with non-zero status";
229
+ handleExecutionFailure({ job, errorMsg, isOneShot });
226
230
  }
227
231
  } catch (err) {
228
232
  const errorMsg = err instanceof Error ? err.message : String(err);
@@ -231,7 +235,7 @@ async function runScheduleOnce(
231
235
  "Script schedule execution failed",
232
236
  );
233
237
  completeScheduleRun(runId, { status: "error", error: errorMsg });
234
- if (isOneShot) failOneShot(job.id);
238
+ handleExecutionFailure({ job, errorMsg, isOneShot });
235
239
  }
236
240
  processed += 1;
237
241
  continue;
@@ -309,7 +313,11 @@ async function runScheduleOnce(
309
313
  continue;
310
314
  }
311
315
 
312
- if (isOneShot) completeOneShot(job.id);
316
+ if (isOneShot) {
317
+ const successRunId = createScheduleRun(job.id, `wake-ok:${job.id}`);
318
+ completeScheduleRun(successRunId, { status: "ok" });
319
+ completeOneShot(job.id);
320
+ }
313
321
  if (!job.quiet) {
314
322
  emitScheduleFeedEvent({
315
323
  title: job.name,
@@ -322,7 +330,16 @@ async function runScheduleOnce(
322
330
  { err, jobId: job.id, name: job.name, wakeConversationId, isOneShot },
323
331
  "Wake schedule execution failed",
324
332
  );
325
- if (isOneShot) failOneShot(job.id);
333
+ const errorMsg = err instanceof Error ? err.message : String(err);
334
+ const wakeErrorRunId = createScheduleRun(
335
+ job.id,
336
+ `wake-error:${job.id}`,
337
+ );
338
+ completeScheduleRun(wakeErrorRunId, {
339
+ status: "error",
340
+ error: errorMsg,
341
+ });
342
+ handleExecutionFailure({ job, errorMsg, isOneShot });
326
343
  }
327
344
  processed += 1;
328
345
  continue;
@@ -380,7 +397,11 @@ async function runScheduleOnce(
380
397
  status: "error",
381
398
  error: result.error ?? "Task run failed",
382
399
  });
383
- if (isOneShot) failOneShot(job.id);
400
+ handleExecutionFailure({
401
+ job,
402
+ errorMsg: result.error ?? "Task run failed",
403
+ isOneShot,
404
+ });
384
405
  } else {
385
406
  completeScheduleRun(runId, { status: "ok" });
386
407
  if (!job.quiet) {
@@ -424,7 +445,11 @@ async function runScheduleOnce(
424
445
  });
425
446
  const runId = createScheduleRun(job.id, fallbackConversation.id);
426
447
  completeScheduleRun(runId, { status: "error", error: message });
427
- if (isOneShot) failOneShot(job.id);
448
+ handleExecutionFailure({
449
+ job,
450
+ errorMsg: message,
451
+ isOneShot,
452
+ });
428
453
  }
429
454
  continue;
430
455
  }
@@ -507,7 +532,7 @@ async function runScheduleOnce(
507
532
  : "Schedule execution failed",
508
533
  );
509
534
  completeScheduleRun(runId, { status: "error", error: message });
510
- if (isOneShot) failOneShot(job.id);
535
+ handleExecutionFailure({ job, errorMsg: message, isOneShot });
511
536
 
512
537
  // Only skip invalidation when the conversation was *actually* reused,
513
538
  // i.e. it contains prior successful context worth preserving. When
@@ -4,6 +4,14 @@
4
4
  * back to the runtime code that initiated the OAuth handshake.
5
5
  */
6
6
 
7
+ /**
8
+ * Sibling: `assistant/src/mcp/mcp-auth-state.ts`. The MCP auth state map sits
9
+ * one layer up from this registry — it tracks polling-visible status per
10
+ * MCP server, while this registry resolves the OAuth code-arrival promise
11
+ * keyed by OAuth `state`. The callback registry is shared by all
12
+ * gateway-transport OAuth flows (MCP and otherwise); the MCP state map is
13
+ * MCP-specific.
14
+ */
7
15
  interface PendingCallback {
8
16
  resolve: (code: string) => void;
9
17
  reject: (error: Error) => void;
@@ -15,7 +15,7 @@ import type { Sequence } from "./types.js";
15
15
 
16
16
  // ── Event tracking ──────────────────────────────────────────────────
17
17
 
18
- export type SequenceEventType =
18
+ type SequenceEventType =
19
19
  | "send"
20
20
  | "reply"
21
21
  | "complete"
@@ -24,7 +24,7 @@ export type SequenceEventType =
24
24
  | "pause"
25
25
  | "resume";
26
26
 
27
- export interface SequenceEvent {
27
+ interface SequenceEvent {
28
28
  id: string;
29
29
  sequenceId: string;
30
30
  enrollmentId: string;
@@ -74,7 +74,7 @@ function getRecentEvents(limit = 20): SequenceEvent[] {
74
74
 
75
75
  // ── Metrics ─────────────────────────────────────────────────────────
76
76
 
77
- export interface SequenceMetrics {
77
+ interface SequenceMetrics {
78
78
  sequenceId: string;
79
79
  sequenceName: string;
80
80
  status: string;
@@ -90,7 +90,7 @@ export interface SequenceMetrics {
90
90
  avgTimeToReplyMs: number | null;
91
91
  }
92
92
 
93
- export interface StepMetrics {
93
+ interface StepMetrics {
94
94
  stepIndex: number;
95
95
  subject: string;
96
96
  sends: number;
@@ -98,7 +98,7 @@ export interface StepMetrics {
98
98
  dropOff: number;
99
99
  }
100
100
 
101
- export interface DashboardData {
101
+ interface DashboardData {
102
102
  summary: {
103
103
  totalSequences: number;
104
104
  activeSequences: number;
@@ -9,7 +9,7 @@
9
9
  import { emitFeedEvent } from "../home/emit-feed-event.js";
10
10
  import { bootstrapConversation } from "../memory/conversation-bootstrap.js";
11
11
  import { getMessages } from "../memory/conversation-crud.js";
12
- import type { ScheduleMessageProcessor } from "../schedule/scheduler.js";
12
+ import type { ScheduleMessageProcessor } from "../schedule/scheduler-types.js";
13
13
  import { getLogger } from "../util/logger.js";
14
14
  import { recordEvent } from "./analytics.js";
15
15
  import { checkAllPreSend, recordSend } from "./guardrails.js";
@@ -64,14 +64,8 @@ function classifyByName(name: string): boolean {
64
64
  * depends on `catalog-cache.ts`, which would otherwise be reachable via
65
65
  * the handler module.
66
66
  */
67
- export interface SkillFileEntry {
68
- path: string; // relative to skill directory root (e.g. "SKILL.md", "tools/foo.ts")
69
- name: string; // basename
70
- size: number;
71
- mimeType: string;
72
- isBinary: boolean;
73
- content: string | null; // inline text if ≤ 2 MB and text MIME, else null
74
- }
67
+ import type { SkillFileEntry } from "./skill-file-types.js";
68
+ export type { SkillFileEntry } from "./skill-file-types.js";
75
69
 
76
70
  // ─── Platform response contracts ─────────────────────────────────────────────
77
71
  //
@@ -1,6 +1,6 @@
1
1
  import type { SkillSummary } from "../config/skills.js";
2
2
 
3
- export interface IncludeGraphResult {
3
+ interface IncludeGraphResult {
4
4
  /** Ordered list of all skill IDs visited during traversal (including the root). */
5
5
  visited: string[];
6
6
  }
@@ -37,12 +37,12 @@ export function getImmediateChildren(
37
37
  return children;
38
38
  }
39
39
 
40
- export interface IncludeValidationSuccess {
40
+ interface IncludeValidationSuccess {
41
41
  ok: true;
42
42
  visited: string[];
43
43
  }
44
44
 
45
- export interface IncludeValidationError {
45
+ interface IncludeValidationError {
46
46
  ok: false;
47
47
  error: "missing";
48
48
  missingChildId: string;
@@ -50,13 +50,13 @@ export interface IncludeValidationError {
50
50
  path: string[]; // full path from root to the parent that referenced the missing child
51
51
  }
52
52
 
53
- export interface IncludeValidationCycleError {
53
+ interface IncludeValidationCycleError {
54
54
  ok: false;
55
55
  error: "cycle";
56
56
  cyclePath: string[]; // the IDs forming the cycle, e.g. ['a', 'b', 'c', 'a']
57
57
  }
58
58
 
59
- export type IncludeValidationResult =
59
+ type IncludeValidationResult =
60
60
  | IncludeValidationSuccess
61
61
  | IncludeValidationError
62
62
  | IncludeValidationCycleError;
@@ -1,4 +1,4 @@
1
- export type RemoteSkillProvider = "clawhub" | "skillssh";
1
+ type RemoteSkillProvider = "clawhub" | "skillssh";
2
2
 
3
3
  export type SkillsShRisk =
4
4
  | "safe"
@@ -26,12 +26,12 @@ export interface RemoteSkillPolicy {
26
26
  maxSkillsShRisk: SkillsShRiskThreshold;
27
27
  }
28
28
 
29
- export interface ClawhubModerationState {
29
+ interface ClawhubModerationState {
30
30
  isSuspicious?: boolean;
31
31
  isMalwareBlocked?: boolean;
32
32
  }
33
33
 
34
- export interface SkillsShAuditState {
34
+ interface SkillsShAuditState {
35
35
  risk?: SkillsShRisk | null;
36
36
  }
37
37
 
@@ -40,12 +40,12 @@ interface RemoteSkillCandidateBase {
40
40
  slug: string;
41
41
  }
42
42
 
43
- export interface ClawhubRemoteSkillCandidate extends RemoteSkillCandidateBase {
43
+ interface ClawhubRemoteSkillCandidate extends RemoteSkillCandidateBase {
44
44
  provider: "clawhub";
45
45
  moderation?: ClawhubModerationState | null;
46
46
  }
47
47
 
48
- export interface SkillsShRemoteSkillCandidate extends RemoteSkillCandidateBase {
48
+ interface SkillsShRemoteSkillCandidate extends RemoteSkillCandidateBase {
49
49
  provider: "skillssh";
50
50
  audit?: SkillsShAuditState | null;
51
51
  }
@@ -1,5 +1,5 @@
1
1
  import type { SlimSkillResponse } from "../daemon/message-types/skills.js";
2
- import type { SkillFileEntry } from "./catalog-files.js";
2
+ import type { SkillFileEntry } from "./skill-file-types.js";
3
3
 
4
4
  /**
5
5
  * A file provider can resolve file listings and single-file content for
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Types extracted from catalog-files.ts to break the
3
+ * catalog-files ↔ skill-file-provider cycle.
4
+ */
5
+
6
+ export interface SkillFileEntry {
7
+ path: string; // relative to skill directory root (e.g. "SKILL.md", "tools/foo.ts")
8
+ name: string; // basename
9
+ size: number;
10
+ mimeType: string;
11
+ isBinary: boolean;
12
+ content: string | null; // inline text if ≤ 2 MB and text MIME, else null
13
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Audit types for SkillSSH partner security analysis.
3
+ *
4
+ * Extracted as a leaf module so daemon message types can reference
5
+ * PartnerAudit without pulling in the full skillssh-registry module
6
+ * (which transitively imports cli/program and the entire CLI graph).
7
+ */
8
+
9
+ export type RiskLevel =
10
+ | "safe"
11
+ | "low"
12
+ | "medium"
13
+ | "high"
14
+ | "critical"
15
+ | "unknown";
16
+
17
+ export interface PartnerAudit {
18
+ risk: RiskLevel;
19
+ alerts?: number;
20
+ score?: number;
21
+ analyzedAt: string;
22
+ }
23
+
24
+ /** Map from audit provider name (e.g. "ath", "socket", "snyk") to audit data */
25
+ export type SkillAuditData = Record<string, PartnerAudit>;
26
+
27
+ /** Map from skill slug to per-provider audit data */
28
+ export type AuditResponse = Record<string, SkillAuditData>;
@@ -6,6 +6,14 @@ import { dirname, join, resolve, sep } from "node:path";
6
6
  import { getWorkspaceSkillsDir } from "../util/platform.js";
7
7
  import { upsertSkillsIndex } from "./catalog-install.js";
8
8
  import { computeSkillHash, writeInstallMeta } from "./install-meta.js";
9
+ import type {
10
+ AuditResponse,
11
+ PartnerAudit,
12
+ RiskLevel,
13
+ SkillAuditData,
14
+ } from "./skillssh-audit-types.js";
15
+
16
+ export type { AuditResponse, PartnerAudit, RiskLevel, SkillAuditData };
9
17
 
10
18
  // ─── Types ───────────────────────────────────────────────────────────────────
11
19
 
@@ -17,27 +25,6 @@ export interface SkillsShSearchResult {
17
25
  source: string; // e.g. "vercel-labs/agent-skills"
18
26
  }
19
27
 
20
- export type RiskLevel =
21
- | "safe"
22
- | "low"
23
- | "medium"
24
- | "high"
25
- | "critical"
26
- | "unknown";
27
-
28
- export interface PartnerAudit {
29
- risk: RiskLevel;
30
- alerts?: number;
31
- score?: number;
32
- analyzedAt: string;
33
- }
34
-
35
- /** Map from audit provider name (e.g. "ath", "socket", "snyk") to audit data */
36
- export type SkillAuditData = Record<string, PartnerAudit>;
37
-
38
- /** Map from skill slug to per-provider audit data */
39
- export type AuditResponse = Record<string, SkillAuditData>;
40
-
41
28
  export interface ResolvedSkillSource {
42
29
  owner: string;
43
30
  repo: string;
@@ -21,6 +21,8 @@ export interface LlmUsageTelemetryEvent extends TelemetryEventBase {
21
21
  llm_call_site: LLMCallSite | null;
22
22
  inference_profile: string | null;
23
23
  inference_profile_source: UsageAttributionProfileSource | null;
24
+ /** Computed estimated cost in USD for this LLM call. Null when pricing data is unavailable. */
25
+ cost: number | null;
24
26
  }
25
27
 
26
28
  /** Turn event — one per user message. */
@@ -389,6 +389,7 @@ describe("UsageTelemetryReporter", () => {
389
389
  expect(e.llm_call_site).toBe("compactionAgent");
390
390
  expect(e.inference_profile).toBe("quality-optimized");
391
391
  expect(e.inference_profile_source).toBe("conversation");
392
+ expect(e.cost).toBe(0.001);
392
393
  expect(e.recorded_at).toBe(1700000099000);
393
394
  });
394
395
 
@@ -419,6 +420,26 @@ describe("UsageTelemetryReporter", () => {
419
420
  });
420
421
  });
421
422
 
423
+ test("cost is null when estimatedCostUsd is null (unpriced event)", async () => {
424
+ const event = makeUsageEvent({
425
+ id: "evt-unpriced",
426
+ estimatedCostUsd: null,
427
+ pricingStatus: "unpriced",
428
+ });
429
+ mockQueryUnreportedUsageEvents.mockReturnValue([event]);
430
+ mockFetch.mockImplementation(() =>
431
+ Promise.resolve(new Response('{"accepted":1}', { status: 200 })),
432
+ );
433
+
434
+ const reporter = new UsageTelemetryReporter();
435
+ await reporter.flush();
436
+
437
+ const body = JSON.parse(
438
+ (mockFetch.mock.calls[0] as [string, RequestInit])[1].body as string,
439
+ );
440
+ expect(body.events[0].cost).toBeNull();
441
+ });
442
+
422
443
  test("organization_id and user_id included in payload when available", async () => {
423
444
  mockGetPlatformOrganizationId.mockReturnValue("org-123");
424
445
  mockGetPlatformUserId.mockReturnValue("user-456");
@@ -194,6 +194,7 @@ export class UsageTelemetryReporter {
194
194
  llm_call_site: e.callSite,
195
195
  inference_profile: e.inferenceProfile,
196
196
  inference_profile_source: e.inferenceProfileSource,
197
+ cost: e.estimatedCostUsd ?? null,
197
198
  recorded_at: e.createdAt,
198
199
  }),
199
200
  ),
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Shared helper for app-control skill wrapper scripts.
3
+ *
4
+ * Each wrapper calls forwardAppControlProxyTool() to delegate execution to
5
+ * the proxy resolver, which forwards the call to the connected client.
6
+ */
7
+
8
+ import type { ToolContext, ToolExecutionResult } from "../types.js";
9
+
10
+ /**
11
+ * Forward an app-control proxy tool call through the context's proxyToolResolver.
12
+ *
13
+ * Returns a clear error result if the resolver is missing (e.g. when the tool
14
+ * is invoked outside a session with a connected client).
15
+ */
16
+ export function forwardAppControlProxyTool(
17
+ toolName: string,
18
+ input: Record<string, unknown>,
19
+ context: ToolContext,
20
+ ): Promise<ToolExecutionResult> {
21
+ if (!context.proxyToolResolver) {
22
+ return Promise.resolve({
23
+ content: `Cannot execute ${toolName}: no proxy resolver available. This tool requires a connected client.`,
24
+ isError: true,
25
+ });
26
+ }
27
+ return context.proxyToolResolver(toolName, input);
28
+ }