@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
@@ -39,7 +39,6 @@ mock.module("../../../../inbound/platform-callback-registration.js", () => ({
39
39
  isPlatform: false,
40
40
  platformBaseUrl: "",
41
41
  assistantId: "",
42
- hasInternalApiKey: false,
43
42
  hasAssistantApiKey: false,
44
43
  authHeader: null,
45
44
  enabled: false,
@@ -64,6 +63,13 @@ mock.module("../../../../security/secure-keys.js", () => ({
64
63
  onCesClientChanged: () => ({ unsubscribe: () => {} }),
65
64
  setCesReconnect: () => {},
66
65
  getActiveBackendName: () => "file",
66
+ getActiveBackendInfoAsync: async () => ({
67
+ backend: "encrypted-store",
68
+ storePath: "/tmp/keys.enc",
69
+ storeKeyPath: "/tmp/store.key",
70
+ storeExists: false,
71
+ storeKeyExists: false,
72
+ }),
67
73
  _resetBackend: () => {},
68
74
  }));
69
75
 
@@ -109,13 +115,11 @@ mock.module("../../../../config/loader.js", () => ({
109
115
  }),
110
116
  loadConfig: () => ({}),
111
117
  invalidateConfigCache: () => {},
112
- saveConfig: () => {},
113
118
  loadRawConfig: () => ({}),
114
119
  saveRawConfig: () => {},
115
120
  getNestedValue: () => undefined,
116
121
  setNestedValue: () => {},
117
122
  applyNestedDefaults: (config: unknown) => config,
118
- deepMergeMissing: () => false,
119
123
  deepMergeOverwrite: () => {},
120
124
  mergeDefaultWorkspaceConfig: () => {},
121
125
  }));
@@ -14,12 +14,16 @@ let mockResolvePlatformCallbackRegistrationContext: () => Promise<
14
14
  isPlatform: false,
15
15
  platformBaseUrl: "",
16
16
  assistantId: "",
17
- hasInternalApiKey: false,
18
17
  hasAssistantApiKey: false,
19
18
  authHeader: null,
20
19
  enabled: false,
21
20
  });
22
21
 
22
+ let mockIpcGetVelayStatus: () => Promise<{
23
+ connected: boolean;
24
+ publicUrl: string | null;
25
+ } | null> = async () => null;
26
+
23
27
  // ---------------------------------------------------------------------------
24
28
  // Mocks
25
29
  // ---------------------------------------------------------------------------
@@ -47,6 +51,13 @@ mock.module("../../../../security/secure-keys.js", () => ({
47
51
  onCesClientChanged: () => ({ unsubscribe: () => {} }),
48
52
  setCesReconnect: () => {},
49
53
  getActiveBackendName: () => "file",
54
+ getActiveBackendInfoAsync: async () => ({
55
+ backend: "encrypted-store",
56
+ storePath: "/tmp/keys.enc",
57
+ storeKeyPath: "/tmp/store.key",
58
+ storeExists: false,
59
+ storeKeyExists: false,
60
+ }),
50
61
  _resetBackend: () => {},
51
62
  }));
52
63
 
@@ -75,6 +86,8 @@ mock.module("../../../../util/logger.js", () => ({
75
86
  LOG_FILE_PATTERN: /^assistant-(\d{4}-\d{2}-\d{2})\.log$/,
76
87
  }));
77
88
 
89
+ // Also mock the CLI logger singleton so log.info calls do not write to stdout.
90
+
78
91
  mock.module("../../../../config/loader.js", () => ({
79
92
  API_KEY_PROVIDERS: [] as const,
80
93
  getConfig: () => ({
@@ -89,17 +102,24 @@ mock.module("../../../../config/loader.js", () => ({
89
102
  }),
90
103
  loadConfig: () => ({}),
91
104
  invalidateConfigCache: () => {},
92
- saveConfig: () => {},
93
105
  loadRawConfig: () => ({}),
94
106
  saveRawConfig: () => {},
95
107
  getNestedValue: () => undefined,
96
108
  setNestedValue: () => {},
97
109
  applyNestedDefaults: (config: unknown) => config,
98
- deepMergeMissing: () => false,
99
110
  deepMergeOverwrite: () => {},
100
111
  mergeDefaultWorkspaceConfig: () => {},
101
112
  }));
102
113
 
114
+ mock.module("../../../../ipc/gateway-client.js", () => ({
115
+ ipcGetVelayStatus: () => mockIpcGetVelayStatus(),
116
+ ipcCall: async () => undefined,
117
+ ipcCallPersistent: async () => undefined,
118
+ resetPersistentClient: () => {},
119
+ ipcGetFeatureFlags: async () => ({}),
120
+ ipcClassifyRisk: async () => undefined,
121
+ }));
122
+
103
123
  // ---------------------------------------------------------------------------
104
124
  // Import module under test (after mocks are registered)
105
125
  // ---------------------------------------------------------------------------
@@ -158,38 +178,35 @@ describe("assistant platform status", () => {
158
178
  isPlatform: false,
159
179
  platformBaseUrl: "",
160
180
  assistantId: "",
161
- hasInternalApiKey: false,
162
181
  hasAssistantApiKey: false,
163
182
  authHeader: null,
164
183
  enabled: false,
165
184
  });
185
+ mockIpcGetVelayStatus = async () => null;
166
186
  process.exitCode = 0;
167
187
  });
168
188
 
169
- test("connected platform returns full status with stored credentials", async () => {
189
+ test("platform pod returns full status from context", async () => {
170
190
  /**
171
- * When the assistant has stored platform credentials and a valid
172
- * registration context, the status command should report connected
173
- * with all context fields populated.
191
+ * When the assistant is running as a platform-managed pod, the status
192
+ * command reports all fields from the registration context plus
193
+ * organizationId and userId from the keychain. The connected field
194
+ * is absent — platform status does not expose it.
174
195
  */
175
196
 
176
- // GIVEN a containerized environment with platform configuration
197
+ // GIVEN a containerized platform environment
177
198
  mockResolvePlatformCallbackRegistrationContext = async () => ({
178
199
  isPlatform: true,
179
200
  platformBaseUrl: "https://platform.vellum.ai",
180
201
  assistantId: "asst-abc-123",
181
- hasInternalApiKey: true,
182
202
  hasAssistantApiKey: true,
183
- authHeader: "Bearer internal-key",
203
+ authHeader: "Api-Key assistant-key",
184
204
  enabled: true,
185
205
  });
186
206
 
187
- // AND stored platform credentials exist
207
+ // AND credentials are stored in the keychain
188
208
  mockGetSecureKeyAsync = async (account: string) => {
189
- if (account === "credential/vellum/platform_base_url")
190
- return "https://platform.vellum.ai";
191
- if (account === "credential/vellum/assistant_api_key")
192
- return "sk-test-key";
209
+ if (account === "credential/vellum/webhook_secret") return "wh-secret";
193
210
  if (account === "credential/vellum/platform_organization_id")
194
211
  return "org-456";
195
212
  if (account === "credential/vellum/platform_user_id") return "user-789";
@@ -211,12 +228,91 @@ describe("assistant platform status", () => {
211
228
  expect(parsed.isPlatform).toBe(true);
212
229
  expect(parsed.baseUrl).toBe("https://platform.vellum.ai");
213
230
  expect(parsed.assistantId).toBe("asst-abc-123");
214
- expect(parsed.hasInternalApiKey).toBe(true);
215
231
  expect(parsed.hasAssistantApiKey).toBe(true);
232
+ expect(parsed.hasWebhookSecret).toBe(true);
216
233
  expect(parsed.available).toBe(true);
217
- expect(parsed.connected).toBe(true);
218
234
  expect(parsed.organizationId).toBe("org-456");
219
235
  expect(parsed.userId).toBe("user-789");
236
+ // velayTunnel is null when gateway is unreachable
237
+ expect(parsed.velayTunnel).toBeNull();
238
+ });
239
+
240
+ test("velayTunnel connected with publicUrl is returned when gateway is live", async () => {
241
+ /**
242
+ * When the gateway is running and the Velay tunnel is connected, the
243
+ * status command includes velayTunnel.connected=true and the public URL.
244
+ */
245
+
246
+ // GIVEN a connected Velay tunnel reported by the gateway IPC
247
+ mockIpcGetVelayStatus = async () => ({
248
+ connected: true,
249
+ publicUrl: "https://abc123.vellum.ai",
250
+ });
251
+
252
+ // WHEN the status command is run with --json
253
+ const { exitCode, stdout } = await runCommand([
254
+ "platform",
255
+ "status",
256
+ "--json",
257
+ ]);
258
+
259
+ // THEN the command succeeds
260
+ expect(exitCode).toBe(0);
261
+
262
+ // AND velayTunnel reflects the live connection
263
+ const parsed = JSON.parse(stdout);
264
+ expect(parsed.velayTunnel).toEqual({
265
+ connected: true,
266
+ publicUrl: "https://abc123.vellum.ai",
267
+ });
268
+ });
269
+
270
+ test("velayTunnel disconnected when gateway reports no active connection", async () => {
271
+ /**
272
+ * When the gateway is running but Velay is not connected (e.g.
273
+ * reconnecting after disconnect), velayTunnel.connected is false.
274
+ */
275
+
276
+ // GIVEN a disconnected Velay tunnel
277
+ mockIpcGetVelayStatus = async () => ({
278
+ connected: false,
279
+ publicUrl: null,
280
+ });
281
+
282
+ // WHEN the status command is run with --json
283
+ const { exitCode, stdout } = await runCommand([
284
+ "platform",
285
+ "status",
286
+ "--json",
287
+ ]);
288
+
289
+ expect(exitCode).toBe(0);
290
+ const parsed = JSON.parse(stdout);
291
+ expect(parsed.velayTunnel).toEqual({ connected: false, publicUrl: null });
292
+ });
293
+
294
+ test("velayTunnel is null when gateway IPC is unreachable", async () => {
295
+ /**
296
+ * When the gateway IPC socket is not available (assistant not running),
297
+ * velayTunnel is null rather than causing the status command to fail.
298
+ */
299
+
300
+ // GIVEN the gateway IPC throws
301
+ mockIpcGetVelayStatus = async () => {
302
+ throw new Error("ENOENT");
303
+ };
304
+
305
+ // WHEN the status command is run with --json
306
+ const { exitCode, stdout } = await runCommand([
307
+ "platform",
308
+ "status",
309
+ "--json",
310
+ ]);
311
+
312
+ // THEN the command still succeeds (graceful fallback)
313
+ expect(exitCode).toBe(0);
314
+ const parsed = JSON.parse(stdout);
315
+ expect(parsed.velayTunnel).toBeNull();
220
316
  });
221
317
 
222
318
  test("plain text mode does not emit JSON to stdout", async () => {
@@ -231,7 +327,6 @@ describe("assistant platform status", () => {
231
327
  isPlatform: false,
232
328
  platformBaseUrl: "",
233
329
  assistantId: "",
234
- hasInternalApiKey: false,
235
330
  hasAssistantApiKey: false,
236
331
  authHeader: null,
237
332
  enabled: false,
@@ -243,7 +338,7 @@ describe("assistant platform status", () => {
243
338
  // THEN the command succeeds
244
339
  expect(exitCode).toBe(0);
245
340
 
246
- // AND stdout contains no JSON (writeOutput is skipped in plain text mode)
247
- expect(stdout.trim()).toBe("");
341
+ // Plain-text mode logs via log.info verify writeOutput (JSON) was NOT called
342
+ expect(() => JSON.parse(stdout.trim())).toThrow();
248
343
  });
249
344
  });
@@ -95,17 +95,18 @@ Examples:
95
95
 
96
96
  const failedKeys: string[] = [];
97
97
  for (const key of keysToDelete) {
98
- const result = await deleteSecureKeyViaDaemon(
98
+ const delResult = await deleteSecureKeyViaDaemon(
99
99
  "credential",
100
100
  `${key.service}:${key.field}`,
101
101
  );
102
- if (result === "error") {
103
- failedKeys.push(`${key.service}:${key.field}`);
102
+ if (delResult.result === "error") {
103
+ const detail = delResult.error ? `: ${delResult.error}` : "";
104
+ failedKeys.push(`${key.service}:${key.field}${detail}`);
104
105
  }
105
106
  }
106
107
 
107
108
  if (failedKeys.length > 0) {
108
- writeError(`Failed to delete credentials: ${failedKeys.join(", ")}`);
109
+ writeError(`Failed to delete credentials: ${failedKeys.join("; ")}`);
109
110
  return;
110
111
  }
111
112
 
@@ -4,6 +4,7 @@ import {
4
4
  registerCallbackRoute,
5
5
  resolvePlatformCallbackRegistrationContext,
6
6
  } from "../../../inbound/platform-callback-registration.js";
7
+ import { ipcGetVelayStatus } from "../../../ipc/gateway-client.js";
7
8
  import { credentialKey } from "../../../security/credential-key.js";
8
9
  import { getSecureKeyAsync } from "../../../security/secure-keys.js";
9
10
  import { log } from "../../logger.js";
@@ -62,15 +63,14 @@ Fields:
62
63
  isPlatform Whether IS_PLATFORM is set (boolean)
63
64
  baseUrl VELLUM_PLATFORM_URL — the platform gateway base URL
64
65
  assistantId This assistant's platform UUID
65
- hasInternalApiKey Whether PLATFORM_INTERNAL_API_KEY is set (boolean,
66
- value not disclosed)
67
66
  hasAssistantApiKey Whether a stored assistant API key is available
68
67
  hasWebhookSecret Whether a stored webhook secret is available (needed
69
68
  for email and other inbound webhook channels)
70
69
  available Whether callback registration prerequisites are satisfied
71
- connected Whether platform credentials are stored (boolean)
72
70
  organizationId The platform organization ID (from stored credentials)
73
71
  userId The platform user ID (from stored credentials)
72
+ velayTunnel Live Velay tunnel status from the gateway IPC socket
73
+ (null when the gateway is not running)
74
74
 
75
75
  Examples:
76
76
  $ assistant platform status
@@ -78,21 +78,11 @@ Examples:
78
78
  )
79
79
  .action(async (_opts: Record<string, unknown>, cmd: Command) => {
80
80
  try {
81
- const context = await resolvePlatformCallbackRegistrationContext();
81
+ const [context, velayTunnel] = await Promise.all([
82
+ resolvePlatformCallbackRegistrationContext(),
83
+ ipcGetVelayStatus().catch(() => null),
84
+ ]);
82
85
 
83
- const storedBaseUrl =
84
- (await getSecureKeyAsync(
85
- credentialKey(
86
- CREDENTIAL_KEYS.baseUrl.service,
87
- CREDENTIAL_KEYS.baseUrl.field,
88
- ),
89
- )) ?? "";
90
- const hasStoredApiKey = !!(await getSecureKeyAsync(
91
- credentialKey(
92
- CREDENTIAL_KEYS.apiKey.service,
93
- CREDENTIAL_KEYS.apiKey.field,
94
- ),
95
- ));
96
86
  const organizationId =
97
87
  (
98
88
  await getSecureKeyAsync(
@@ -116,19 +106,16 @@ Examples:
116
106
  credentialKey("vellum", "webhook_secret"),
117
107
  ));
118
108
 
119
- const connected = !!storedBaseUrl && hasStoredApiKey;
120
-
121
109
  const result = {
122
110
  isPlatform: context.isPlatform,
123
111
  baseUrl: context.platformBaseUrl,
124
112
  assistantId: context.assistantId,
125
- hasInternalApiKey: context.hasInternalApiKey,
126
113
  hasAssistantApiKey: context.hasAssistantApiKey,
127
114
  hasWebhookSecret,
128
115
  available: context.enabled,
129
- connected,
130
116
  organizationId: organizationId || null,
131
117
  userId: userId || null,
118
+ velayTunnel,
132
119
  };
133
120
 
134
121
  if (shouldOutputJson(cmd)) {
@@ -137,9 +124,6 @@ Examples:
137
124
  log.info(`Platform: ${result.isPlatform}`);
138
125
  log.info(`Base URL: ${result.baseUrl || "(not set)"}`);
139
126
  log.info(`Assistant ID: ${result.assistantId || "(not set)"}`);
140
- log.info(
141
- `Internal API key: ${result.hasInternalApiKey ? "set" : "not set"}`,
142
- );
143
127
  log.info(
144
128
  `Assistant API key: ${result.hasAssistantApiKey ? "set" : "not set"}`,
145
129
  );
@@ -149,9 +133,16 @@ Examples:
149
133
  log.info(
150
134
  `Callback registration available: ${result.available ? "yes" : "no"}`,
151
135
  );
152
- log.info(`Connected: ${connected}`);
153
136
  log.info(`Organization ID: ${organizationId || "(not set)"}`);
154
137
  log.info(`User ID: ${userId || "(not set)"}`);
138
+ if (result.velayTunnel !== null) {
139
+ const tunnelState = result.velayTunnel.connected
140
+ ? `connected${result.velayTunnel.publicUrl ? ` (${result.velayTunnel.publicUrl})` : ""}`
141
+ : "disconnected";
142
+ log.info(`Velay tunnel: ${tunnelState}`);
143
+ } else {
144
+ log.info(`Velay tunnel: (gateway not running)`);
145
+ }
155
146
  }
156
147
  } catch (err) {
157
148
  const message = err instanceof Error ? err.message : String(err);
@@ -0,0 +1,57 @@
1
+ import type { Command } from "commander";
2
+
3
+ import { cliIpcCall } from "../../ipc/cli-client.js";
4
+ import { getWorkspaceDirDisplay } from "../../util/platform.js";
5
+ import { log } from "../logger.js";
6
+
7
+ interface HealthResponse {
8
+ version: string;
9
+ memory: { currentMb: number; maxMb: number };
10
+ disk: { freeMb: number; totalMb: number } | null;
11
+ }
12
+
13
+ function fmtMb(mb: number): string {
14
+ if (mb >= 1024) return `${(mb / 1024).toFixed(1)} GB`;
15
+ return `${Math.round(mb)} MB`;
16
+ }
17
+
18
+ export function registerStatusCommand(program: Command): void {
19
+ program
20
+ .command("status")
21
+ .description("Show assistant version, workspace, and runtime health")
22
+ .action(async () => {
23
+ const result = await cliIpcCall<HealthResponse>("health");
24
+
25
+ if (!result.ok || !result.result) {
26
+ log.error(
27
+ result.error ??
28
+ "Assistant not running — could not connect to IPC socket.",
29
+ );
30
+ process.exit(1);
31
+ }
32
+
33
+ const h = result.result;
34
+ const workspace = getWorkspaceDirDisplay();
35
+
36
+ const rows: [string, string][] = [
37
+ ["Version", h.version],
38
+ ["Workspace", workspace],
39
+ ["", ""],
40
+ ["Memory", `${fmtMb(h.memory.currentMb)} / ${fmtMb(h.memory.maxMb)}`],
41
+ ...(h.disk
42
+ ? ([["Disk", `${fmtMb(h.disk.freeMb)} free`]] as [string, string][])
43
+ : []),
44
+ ];
45
+
46
+ const labelWidth = Math.max(
47
+ ...rows.filter(([l]) => l).map(([l]) => l.length),
48
+ );
49
+ for (const [label, value] of rows) {
50
+ if (!label) {
51
+ log.info("");
52
+ continue;
53
+ }
54
+ log.info(`${label.padEnd(labelWidth)} ${value}`);
55
+ }
56
+ });
57
+ }
@@ -3,6 +3,7 @@ import type { DeleteResult } from "../../security/credential-backend.js";
3
3
  import { credentialKey } from "../../security/credential-key.js";
4
4
  import {
5
5
  deleteSecureKeyAsync,
6
+ getActiveBackendName,
6
7
  setSecureKeyAsync,
7
8
  } from "../../security/secure-keys.js";
8
9
  import { getLogger } from "../../util/logger.js";
@@ -16,6 +17,26 @@ function isDaemonUnreachable(error: string): boolean {
16
17
  return error === DAEMON_UNREACHABLE;
17
18
  }
18
19
 
20
+ // ---------------------------------------------------------------------------
21
+ // Result types — include error context so the CLI can surface it
22
+ // ---------------------------------------------------------------------------
23
+
24
+ export interface SetSecureKeyResult {
25
+ ok: boolean;
26
+ /** Human-readable error reason when ok=false. */
27
+ error?: string;
28
+ }
29
+
30
+ export interface DeleteSecureKeyResult {
31
+ result: DeleteResult;
32
+ /** Human-readable error reason when result="error". */
33
+ error?: string;
34
+ }
35
+
36
+ // ---------------------------------------------------------------------------
37
+ // Set
38
+ // ---------------------------------------------------------------------------
39
+
19
40
  /**
20
41
  * Store a secret via the daemon IPC socket (so daemon-side singletons
21
42
  * stay in sync). Falls back to direct `setSecureKeyAsync()` when the
@@ -25,37 +46,61 @@ export async function setSecureKeyViaDaemon(
25
46
  type: string,
26
47
  name: string,
27
48
  value: string,
28
- ): Promise<boolean> {
29
- const ipc = await cliIpcCall<{ success: boolean }>("secrets/write", {
30
- type,
31
- name,
32
- value,
33
- });
49
+ ): Promise<SetSecureKeyResult> {
50
+ const ipc = await cliIpcCall<{ success: boolean; error?: string }>(
51
+ "secrets/write",
52
+ { type, name, value },
53
+ );
34
54
 
35
- if (ipc.ok && ipc.result) {
36
- return ipc.result.success;
55
+ if (ipc.ok && ipc.result?.success) {
56
+ return { ok: true };
37
57
  }
38
58
 
59
+ // Daemon returned an IPC-level error (thrown InternalError, etc.)
39
60
  if (ipc.error && !isDaemonUnreachable(ipc.error)) {
40
61
  log.warn({ type, name, error: ipc.error }, "Daemon secret write failed");
41
- return false;
62
+ return { ok: false, error: ipc.error };
63
+ }
64
+
65
+ // Daemon returned success=false (e.g. validation error, backend failure)
66
+ if (ipc.ok && ipc.result && !ipc.result.success) {
67
+ return {
68
+ ok: false,
69
+ error: ipc.result.error || "Credential write rejected by assistant",
70
+ };
42
71
  }
43
72
 
44
73
  // Daemon unreachable — fall back to direct write.
74
+ let account: string;
45
75
  if (type === "api_key") {
46
- return setSecureKeyAsync(credentialKey(name, "api_key"), value);
47
- }
48
- if (type === "credential" && !name.startsWith("credential/")) {
76
+ account = credentialKey(name, "api_key");
77
+ } else if (type === "credential" && !name.startsWith("credential/")) {
49
78
  const colonIdx = name.lastIndexOf(":");
50
79
  if (colonIdx > 0 && colonIdx < name.length - 1) {
51
80
  const service = name.slice(0, colonIdx);
52
81
  const field = name.slice(colonIdx + 1);
53
- return setSecureKeyAsync(credentialKey(service, field), value);
82
+ account = credentialKey(service, field);
83
+ } else {
84
+ account = name;
54
85
  }
86
+ } else {
87
+ account = name;
88
+ }
89
+
90
+ const ok = await setSecureKeyAsync(account, value);
91
+ if (!ok) {
92
+ return {
93
+ ok: false,
94
+ error: `Failed to store credential (backend: ${getActiveBackendName()})`,
95
+ };
55
96
  }
56
- return setSecureKeyAsync(name, value);
97
+ return { ok: true };
57
98
  }
58
99
 
100
+ // ---------------------------------------------------------------------------
101
+ // Delete
102
+ // ---------------------------------------------------------------------------
103
+
59
104
  /**
60
105
  * Delete a secret via the daemon IPC socket. Falls back to direct
61
106
  * `deleteSecureKeyAsync()` when the daemon is not running.
@@ -63,42 +108,79 @@ export async function setSecureKeyViaDaemon(
63
108
  export async function deleteSecureKeyViaDaemon(
64
109
  type: string,
65
110
  name: string,
66
- ): Promise<DeleteResult> {
111
+ ): Promise<DeleteSecureKeyResult> {
67
112
  const ipc = await cliIpcCall<{ success: boolean }>("secrets/delete", {
68
113
  type,
69
114
  name,
70
115
  });
71
116
 
72
- if (ipc.ok && ipc.result) {
73
- return ipc.result.success ? "deleted" : "error";
117
+ if (ipc.ok && ipc.result?.success) {
118
+ return { result: "deleted" };
74
119
  }
75
120
 
121
+ // Daemon returned an IPC-level error
76
122
  if (ipc.error && !isDaemonUnreachable(ipc.error)) {
77
123
  if (ipc.error.includes("not found") || ipc.error.includes("404")) {
78
- return "not-found";
124
+ return { result: "not-found" };
79
125
  }
80
- return "error";
126
+ return { result: "error", error: ipc.error };
127
+ }
128
+
129
+ // Daemon returned success=false
130
+ if (ipc.ok && ipc.result && !ipc.result.success) {
131
+ return {
132
+ result: "error",
133
+ error: "Credential delete rejected by assistant",
134
+ };
81
135
  }
82
136
 
83
137
  // Daemon unreachable — fall back to direct delete.
84
138
  if (type === "api_key") {
85
139
  // Delete from both locations; during migration overlap both may exist.
86
- // Ignore "not-found" on each — one location may already be empty.
87
- const credResult = await deleteSecureKeyAsync(credentialKey(name, "api_key"));
88
- if (credResult === "error") return "error";
140
+ const credResult = await deleteSecureKeyAsync(
141
+ credentialKey(name, "api_key"),
142
+ );
143
+ if (credResult === "error") {
144
+ return {
145
+ result: "error",
146
+ error: `Failed to delete credential (backend: ${getActiveBackendName()})`,
147
+ };
148
+ }
89
149
  const bareResult = await deleteSecureKeyAsync(name);
90
- if (bareResult === "error") return "error";
91
- return credResult === "deleted" || bareResult === "deleted"
92
- ? "deleted"
93
- : "not-found";
150
+ if (bareResult === "error") {
151
+ return {
152
+ result: "error",
153
+ error: `Failed to delete credential (backend: ${getActiveBackendName()})`,
154
+ };
155
+ }
156
+ return {
157
+ result:
158
+ credResult === "deleted" || bareResult === "deleted"
159
+ ? "deleted"
160
+ : "not-found",
161
+ };
94
162
  }
163
+
164
+ let account: string;
95
165
  if (type === "credential" && !name.startsWith("credential/")) {
96
166
  const colonIdx = name.lastIndexOf(":");
97
167
  if (colonIdx > 0 && colonIdx < name.length - 1) {
98
168
  const service = name.slice(0, colonIdx);
99
169
  const field = name.slice(colonIdx + 1);
100
- return deleteSecureKeyAsync(credentialKey(service, field));
170
+ account = credentialKey(service, field);
171
+ } else {
172
+ account = name;
101
173
  }
174
+ } else {
175
+ account = name;
176
+ }
177
+
178
+ const result = await deleteSecureKeyAsync(account);
179
+ if (result === "error") {
180
+ return {
181
+ result: "error",
182
+ error: `Failed to delete credential (backend: ${getActiveBackendName()})`,
183
+ };
102
184
  }
103
- return deleteSecureKeyAsync(name);
185
+ return { result };
104
186
  }