@vellumai/assistant 0.8.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. package/AGENTS.md +11 -0
  2. package/Dockerfile +5 -4
  3. package/README.md +2 -2
  4. package/docker-entrypoint.sh +16 -0
  5. package/eslint-rules/__tests__/cli-no-daemon-internals.test.ts +420 -0
  6. package/eslint-rules/cli-no-daemon-internals.js +283 -0
  7. package/eslint.config.mjs +12 -0
  8. package/knip.json +2 -1
  9. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -1
  10. package/openapi.yaml +4847 -1698
  11. package/package.json +3 -1
  12. package/scripts/generate-openapi.ts +52 -4
  13. package/scripts/sync-llm-catalog.ts +165 -0
  14. package/scripts/sync-web-search-catalog.ts +107 -0
  15. package/src/__tests__/actor-trust-resolver-address-fallback.test.ts +169 -0
  16. package/src/__tests__/agent-loop-override-profile.test.ts +26 -1
  17. package/src/__tests__/anthropic-provider.test.ts +92 -2
  18. package/src/__tests__/app-control-flow.test.ts +7 -0
  19. package/src/__tests__/assistant-events-sse-shed.test.ts +232 -0
  20. package/src/__tests__/avatar-identity-sync.test.ts +87 -0
  21. package/src/__tests__/background-workers-disk-pressure.test.ts +11 -22
  22. package/src/__tests__/btw-routes.test.ts +1 -0
  23. package/src/__tests__/call-site-routing-provider.test.ts +172 -45
  24. package/src/__tests__/cancel-resolves-conversation-key.test.ts +44 -3
  25. package/src/__tests__/channel-policy.test.ts +12 -0
  26. package/src/__tests__/checker.test.ts +89 -0
  27. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +35 -7
  28. package/src/__tests__/compact-event-conversation-id-guard.test.ts +33 -5
  29. package/src/__tests__/compaction-strip-metadata-clear.test.ts +26 -1
  30. package/src/__tests__/config-loader-backfill.test.ts +526 -102
  31. package/src/__tests__/config-loader-corrupt.test.ts +68 -0
  32. package/src/__tests__/config-loader-platform-defaults.test.ts +77 -23
  33. package/src/__tests__/config-schema-cmd.test.ts +63 -29
  34. package/src/__tests__/config-schema.test.ts +14 -3
  35. package/src/__tests__/config-set-platform-guard.test.ts +75 -152
  36. package/src/__tests__/config-set-route.test.ts +198 -0
  37. package/src/__tests__/config-watcher.test.ts +6 -0
  38. package/src/__tests__/contacts-tools.test.ts +51 -199
  39. package/src/__tests__/context-search-agent-protocol.test.ts +21 -2
  40. package/src/__tests__/context-search-agent-runner.test.ts +22 -138
  41. package/src/__tests__/context-search-conversations-source.test.ts +42 -16
  42. package/src/__tests__/context-search-fanout.test.ts +20 -157
  43. package/src/__tests__/context-search-memory-v2-source.test.ts +3 -3
  44. package/src/__tests__/context-search-types.test.ts +7 -2
  45. package/src/__tests__/context-window-manager.test.ts +389 -1
  46. package/src/__tests__/conversation-agent-loop-overflow.test.ts +1 -0
  47. package/src/__tests__/conversation-crud-inference-profile.test.ts +100 -0
  48. package/src/__tests__/conversation-error.test.ts +38 -0
  49. package/src/__tests__/conversation-fork-crud.test.ts +241 -1
  50. package/src/__tests__/conversation-inference-profile-route.test.ts +14 -14
  51. package/src/__tests__/conversation-init.benchmark.test.ts +1 -0
  52. package/src/__tests__/conversation-lifecycle.test.ts +124 -0
  53. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +100 -1
  54. package/src/__tests__/conversation-process-callsite.test.ts +21 -1
  55. package/src/__tests__/conversation-runtime-assembly.test.ts +4 -4
  56. package/src/__tests__/conversation-slash-commands.test.ts +194 -2
  57. package/src/__tests__/conversation-surfaces-app-control.test.ts +323 -3
  58. package/src/__tests__/credential-security-invariants.test.ts +5 -6
  59. package/src/__tests__/daemon-credential-client.test.ts +56 -1
  60. package/src/__tests__/db-activation-state-fk-cascade.test.ts +132 -0
  61. package/src/__tests__/db-conversation-inference-profile-migration.test.ts +37 -0
  62. package/src/__tests__/db-memory-graph-event-date-repair.test.ts +43 -20
  63. package/src/__tests__/db-proxy-transaction.test.ts +206 -0
  64. package/src/__tests__/external-plugin-loader.test.ts +458 -0
  65. package/src/__tests__/filing-service.test.ts +23 -3
  66. package/src/__tests__/fixtures/mock-chrome-extension.ts +5 -0
  67. package/src/__tests__/gateway-only-guard.test.ts +0 -1
  68. package/src/__tests__/graph-extraction-event-date.test.ts +34 -0
  69. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +0 -8
  70. package/src/__tests__/heartbeat-disk-pressure.test.ts +21 -8
  71. package/src/__tests__/heartbeat-service.test.ts +50 -233
  72. package/src/__tests__/history-repair.test.ts +89 -0
  73. package/src/__tests__/host-app-control-proxy.test.ts +109 -1
  74. package/src/__tests__/host-app-control-routes.test.ts +247 -1
  75. package/src/__tests__/host-browser-proxy.test.ts +416 -20
  76. package/src/__tests__/host-browser-routes.test.ts +325 -33
  77. package/src/__tests__/host-proxy-preactivation.test.ts +211 -0
  78. package/src/__tests__/inference-no-mode-boot-e2e.test.ts +246 -0
  79. package/src/__tests__/inference-profile-reaper.test.ts +154 -0
  80. package/src/__tests__/inference-profile-session-handler.test.ts +398 -0
  81. package/src/__tests__/inference-profile-session-ipc.test.ts +236 -0
  82. package/src/__tests__/inline-skill-load-permissions.test.ts +6 -1
  83. package/src/__tests__/install-skill-routing.test.ts +2 -2
  84. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +15 -0
  85. package/src/__tests__/llm-callsite-catalog.test.ts +20 -1
  86. package/src/__tests__/llm-catalog-parity.test.ts +146 -0
  87. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +188 -0
  88. package/src/__tests__/llm-request-log-source-factory.test.ts +124 -0
  89. package/src/__tests__/llm-resolver.test.ts +46 -0
  90. package/src/__tests__/managed-profile-guard.test.ts +131 -2
  91. package/src/__tests__/mcp-auth-routes.test.ts +1 -0
  92. package/src/__tests__/mcp-cli.test.ts +182 -220
  93. package/src/__tests__/mcp-health-check.test.ts +56 -27
  94. package/src/__tests__/memory-jobs-worker-lanes.test.ts +18 -11
  95. package/src/__tests__/message-complete-display-id.test.ts +175 -0
  96. package/src/__tests__/notification-platform-adapter.test.ts +229 -0
  97. package/src/__tests__/oauth-cli.test.ts +38 -2009
  98. package/src/__tests__/oauth-commands-routes.test.ts +711 -0
  99. package/src/__tests__/oauth-connect-routes.test.ts +174 -11
  100. package/src/__tests__/oauth-providers-routes.test.ts +14 -10
  101. package/src/__tests__/openai-responses-cutover-guard.test.ts +33 -12
  102. package/src/__tests__/openai-responses-provider.test.ts +17 -0
  103. package/src/__tests__/plugin-bootstrap.test.ts +31 -2
  104. package/src/__tests__/plugin-route-contribution.test.ts +31 -3
  105. package/src/__tests__/plugin-tool-contribution.test.ts +31 -3
  106. package/src/__tests__/plugin-types.test.ts +13 -11
  107. package/src/__tests__/process-message-background-slack.test.ts +46 -0
  108. package/src/__tests__/profile-entry-status.test.ts +43 -0
  109. package/src/__tests__/provider-managed-proxy-integration.test.ts +12 -4
  110. package/src/__tests__/provider-registry-ollama.test.ts +12 -4
  111. package/src/__tests__/provider-send-message-override-profile.test.ts +10 -4
  112. package/src/__tests__/relay-server.test.ts +118 -0
  113. package/src/__tests__/retry-thinking-tool-choice.test.ts +15 -0
  114. package/src/__tests__/schedule-retry.test.ts +56 -4
  115. package/src/__tests__/schedule-routes.test.ts +104 -0
  116. package/src/__tests__/scheduler-disk-pressure.test.ts +0 -4
  117. package/src/__tests__/scheduler-recurrence.test.ts +87 -34
  118. package/src/__tests__/scheduler-reuse-conversation.test.ts +161 -5
  119. package/src/__tests__/scheduler-wake.test.ts +0 -63
  120. package/src/__tests__/secret-allowlist.test.ts +1 -0
  121. package/src/__tests__/secret-routes-managed-proxy.test.ts +12 -4
  122. package/src/__tests__/shell-credential-ref.test.ts +95 -3
  123. package/src/__tests__/shell-tool-proxy-mode.test.ts +14 -0
  124. package/src/__tests__/skill-load-feature-flag.test.ts +1 -0
  125. package/src/__tests__/skill-load-tool.test.ts +2 -4
  126. package/src/__tests__/subagent-call-site-routing.test.ts +78 -16
  127. package/src/__tests__/suggestion-routes.test.ts +3 -3
  128. package/src/__tests__/sync-message-contract.test.ts +63 -0
  129. package/src/__tests__/task-scheduler.test.ts +88 -23
  130. package/src/__tests__/update-bulletin-job.test.ts +96 -193
  131. package/src/__tests__/usage-cli.test.ts +11 -73
  132. package/src/__tests__/user-plugin-loader.test.ts +145 -0
  133. package/src/__tests__/vercel-config.test.ts +168 -0
  134. package/src/__tests__/web-search-catalog-parity.test.ts +86 -0
  135. package/src/__tests__/web-search.test.ts +303 -2
  136. package/src/__tests__/workspace-migration-039-drop-legacy-llm-keys.test.ts +1 -21
  137. package/src/__tests__/workspace-migration-057-repair-stale-gemini-model-ids.test.ts +58 -0
  138. package/src/__tests__/workspace-migration-069-seed-onboarding-threads.test.ts +53 -20
  139. package/src/__tests__/workspace-migration-072-seed-reply-suggestion-callsite.test.ts +191 -0
  140. package/src/__tests__/workspace-migration-076-drop-services-inference-mode.test.ts +211 -0
  141. package/src/__tests__/workspace-migration-077-seed-memory-router-callsite.test.ts +174 -0
  142. package/src/__tests__/workspace-migration-079-home-feed-notification-only.test.ts +323 -0
  143. package/src/__tests__/workspace-migration-080-restrict-vercel-api-token-metadata.test.ts +299 -0
  144. package/src/__tests__/workspace-migration-081-backfill-bash-allowed-tools.test.ts +410 -0
  145. package/src/__tests__/workspace-migration-082-backfill-managed-profile-labels.test.ts +268 -0
  146. package/src/__tests__/workspace-migration-unify-llm-callsite-configs.test.ts +3 -3
  147. package/src/__tests__/workspace-release-notes-feature-flag-guard.test.ts +115 -0
  148. package/src/acp/__tests__/helpers/which-stub.ts +4 -2
  149. package/src/acp/resolve-agent.test.ts +25 -0
  150. package/src/acp/resolve-agent.ts +13 -2
  151. package/src/acp/session-manager.ts +14 -0
  152. package/src/approvals/guardian-request-resolvers.ts +32 -87
  153. package/src/calls/relay-server.ts +35 -0
  154. package/src/calls/relay-setup-router.ts +36 -0
  155. package/src/calls/types.ts +1 -0
  156. package/src/calls/voice-session-bridge.ts +23 -4
  157. package/src/channels/config.ts +14 -1
  158. package/src/channels/types.ts +1 -0
  159. package/src/cli/AGENTS.md +164 -4
  160. package/src/cli/__tests__/notifications.test.ts +54 -0
  161. package/src/cli/commands/__tests__/avatar.test.ts +540 -0
  162. package/src/cli/commands/__tests__/backup.test.ts +236 -776
  163. package/src/cli/commands/__tests__/cache.test.ts +1 -1
  164. package/src/cli/commands/__tests__/changelog.test.ts +593 -0
  165. package/src/cli/commands/__tests__/channel-verification-sessions.test.ts +503 -0
  166. package/src/cli/commands/__tests__/conversations-import.test.ts +515 -0
  167. package/src/cli/commands/__tests__/domain-register.test.ts +140 -167
  168. package/src/cli/commands/__tests__/domain-status.test.ts +137 -76
  169. package/src/cli/commands/__tests__/email-attachment.test.ts +314 -337
  170. package/src/cli/commands/__tests__/email-core.test.ts +579 -0
  171. package/src/cli/commands/__tests__/image-generation.test.ts +87 -824
  172. package/src/cli/commands/__tests__/inference-send.test.ts +30 -266
  173. package/src/cli/commands/__tests__/inference-session.test.ts +423 -0
  174. package/src/cli/commands/__tests__/memory-v2.test.ts +81 -110
  175. package/src/cli/commands/__tests__/skills.test.ts +563 -0
  176. package/src/cli/commands/__tests__/status.test.ts +249 -0
  177. package/src/cli/commands/__tests__/stt.test.ts +320 -0
  178. package/src/cli/commands/__tests__/tts-synthesize.test.ts +4 -603
  179. package/src/cli/commands/__tests__/tts.test.ts +321 -0
  180. package/src/cli/commands/__tests__/webhooks.test.ts +86 -511
  181. package/src/cli/commands/attachment.ts +8 -3
  182. package/src/cli/commands/audit.ts +95 -64
  183. package/src/cli/commands/auth.ts +61 -58
  184. package/src/cli/commands/avatar.ts +276 -390
  185. package/src/cli/commands/backup.ts +409 -505
  186. package/src/cli/commands/bash.ts +9 -5
  187. package/src/cli/commands/browser.ts +28 -9
  188. package/src/cli/commands/cache.ts +9 -4
  189. package/src/cli/commands/changelog.ts +414 -0
  190. package/src/cli/commands/channel-verification-sessions.ts +238 -317
  191. package/src/cli/commands/clients.ts +8 -3
  192. package/src/cli/commands/completions.ts +9 -9
  193. package/src/cli/commands/config.ts +102 -72
  194. package/src/cli/commands/contacts.ts +575 -696
  195. package/src/cli/commands/conversations-defer.ts +17 -69
  196. package/src/cli/commands/conversations-import.ts +90 -253
  197. package/src/cli/commands/conversations.ts +346 -436
  198. package/src/cli/commands/credential-execution.ts +9 -6
  199. package/src/cli/commands/credentials.ts +456 -736
  200. package/src/cli/commands/domain.ts +128 -206
  201. package/src/cli/commands/email.ts +606 -794
  202. package/src/cli/commands/gateway.ts +8 -1
  203. package/src/cli/commands/image-generation.ts +157 -205
  204. package/src/cli/commands/inference-providers.ts +352 -0
  205. package/src/cli/commands/inference-session.ts +415 -0
  206. package/src/cli/commands/inference.ts +87 -65
  207. package/src/cli/commands/keys.ts +8 -3
  208. package/src/cli/commands/mcp.ts +103 -287
  209. package/src/cli/commands/memory-v2.ts +162 -516
  210. package/src/cli/commands/notifications.ts +33 -7
  211. package/src/cli/commands/oauth/apps.ts +292 -261
  212. package/src/cli/commands/oauth/connect.ts +176 -297
  213. package/src/cli/commands/oauth/disconnect.ts +16 -215
  214. package/src/cli/commands/oauth/index.ts +49 -45
  215. package/src/cli/commands/oauth/mode.ts +43 -199
  216. package/src/cli/commands/oauth/ping.ts +17 -125
  217. package/src/cli/commands/oauth/providers.ts +732 -921
  218. package/src/cli/commands/oauth/request.ts +60 -350
  219. package/src/cli/commands/oauth/shared.ts +11 -121
  220. package/src/cli/commands/oauth/status.ts +31 -121
  221. package/src/cli/commands/oauth/token.ts +13 -55
  222. package/src/cli/commands/pending.ts +19 -10
  223. package/src/cli/commands/platform/__tests__/callback-routes-list.test.ts +133 -183
  224. package/src/cli/commands/platform/__tests__/connect.test.ts +66 -181
  225. package/src/cli/commands/platform/__tests__/disconnect.test.ts +71 -227
  226. package/src/cli/commands/platform/__tests__/status.test.ts +169 -287
  227. package/src/cli/commands/platform/connect.ts +16 -80
  228. package/src/cli/commands/platform/disconnect.ts +14 -112
  229. package/src/cli/commands/platform/index.ts +177 -246
  230. package/src/cli/commands/routes.ts +153 -336
  231. package/src/cli/commands/sequence.ts +316 -360
  232. package/src/cli/commands/skills.ts +449 -671
  233. package/src/cli/commands/status.ts +58 -37
  234. package/src/cli/commands/stt.ts +94 -262
  235. package/src/cli/commands/task.ts +14 -40
  236. package/src/cli/commands/trust.ts +8 -3
  237. package/src/cli/commands/tts.ts +162 -167
  238. package/src/cli/commands/ui.ts +35 -42
  239. package/src/cli/commands/usage.ts +188 -126
  240. package/src/cli/commands/watchers.ts +8 -3
  241. package/src/cli/commands/webhooks.ts +99 -193
  242. package/src/cli/lib/__tests__/register-command.test.ts +85 -0
  243. package/src/cli/lib/daemon-credential-client.ts +4 -5
  244. package/src/cli/lib/nested-value.ts +44 -0
  245. package/src/cli/lib/open-browser.ts +36 -0
  246. package/src/cli/lib/register-command.ts +19 -0
  247. package/src/cli/lib/time-ago.ts +34 -0
  248. package/src/cli/program.ts +2 -4
  249. package/src/cli/utils/__tests__/conversation-id.test.ts +66 -0
  250. package/src/cli/utils/__tests__/parse-duration.test.ts +49 -0
  251. package/src/cli/utils/conversation-id.ts +30 -0
  252. package/src/cli/utils/parse-duration.ts +41 -0
  253. package/src/config/acp-defaults.test.ts +5 -1
  254. package/src/config/acp-defaults.ts +11 -4
  255. package/src/config/bundled-skills/acp/TOOLS.json +2 -2
  256. package/src/config/bundled-skills/app-control/TOOLS.json +32 -0
  257. package/src/config/bundled-skills/contacts/SKILL.md +12 -45
  258. package/src/config/bundled-skills/contacts/TOOLS.json +0 -57
  259. package/src/config/bundled-skills/messaging/tools/messaging-archive-by-sender.ts +0 -12
  260. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +0 -58
  261. package/src/config/bundled-tool-registry.ts +0 -2
  262. package/src/config/feature-flag-registry.json +16 -0
  263. package/src/config/llm-resolver.ts +16 -1
  264. package/src/config/loader.ts +76 -14
  265. package/src/config/raw-config-utils.ts +2 -30
  266. package/src/config/schema.ts +4 -0
  267. package/src/config/schemas/__tests__/memory-v2.test.ts +49 -0
  268. package/src/config/schemas/call-site-catalog.ts +29 -7
  269. package/src/config/schemas/llm-request-logs.ts +57 -0
  270. package/src/config/schemas/llm.ts +52 -2
  271. package/src/config/schemas/memory-retrospective.ts +48 -0
  272. package/src/config/schemas/memory-v2.ts +32 -1
  273. package/src/config/schemas/memory.ts +4 -0
  274. package/src/config/schemas/services.ts +15 -12
  275. package/src/config/seed-inference-profiles.ts +195 -134
  276. package/src/contacts/contact-store.ts +0 -61
  277. package/src/context/window-manager.ts +191 -5
  278. package/src/daemon/__tests__/conversation-lifecycle-auto-analyze.test.ts +79 -0
  279. package/src/daemon/__tests__/conversation-tool-setup.test.ts +109 -4
  280. package/src/daemon/__tests__/daemon-skill-host.test.ts +10 -4
  281. package/src/daemon/approval-generators.ts +23 -29
  282. package/src/daemon/config-watcher.ts +2 -0
  283. package/src/daemon/conversation-agent-loop-handlers.ts +24 -0
  284. package/src/daemon/conversation-agent-loop.ts +127 -97
  285. package/src/daemon/conversation-error.ts +21 -0
  286. package/src/daemon/conversation-lifecycle.ts +46 -5
  287. package/src/daemon/conversation-process.ts +36 -19
  288. package/src/daemon/conversation-runtime-assembly.ts +14 -5
  289. package/src/daemon/conversation-slash.ts +175 -23
  290. package/src/daemon/conversation-store.ts +17 -10
  291. package/src/daemon/conversation-surfaces.ts +76 -12
  292. package/src/daemon/conversation-tool-setup.ts +24 -14
  293. package/src/daemon/conversation.ts +48 -9
  294. package/src/daemon/external-plugins-bootstrap.ts +18 -8
  295. package/src/daemon/guardian-action-generators.ts +7 -22
  296. package/src/daemon/handlers/config-model.ts +8 -126
  297. package/src/daemon/handlers/config-slack-channel.ts +10 -7
  298. package/src/daemon/handlers/config-vercel.ts +3 -1
  299. package/src/daemon/handlers/skills.ts +84 -5
  300. package/src/daemon/history-repair.ts +33 -6
  301. package/src/daemon/host-app-control-proxy.ts +44 -19
  302. package/src/daemon/host-bash-proxy.ts +85 -158
  303. package/src/daemon/host-browser-proxy.ts +96 -35
  304. package/src/daemon/host-proxy-base.ts +13 -1
  305. package/src/daemon/host-proxy-preactivation.ts +25 -1
  306. package/src/daemon/identity-helpers.ts +19 -0
  307. package/src/daemon/lifecycle.ts +42 -43
  308. package/src/daemon/meet-host-supervisor.ts +15 -15
  309. package/src/daemon/memory-v2-startup.ts +9 -2
  310. package/src/daemon/message-protocol.ts +6 -0
  311. package/src/daemon/message-types/bookmarks.ts +18 -0
  312. package/src/daemon/message-types/conversations.ts +12 -9
  313. package/src/daemon/message-types/messages.ts +9 -1
  314. package/src/daemon/message-types/sync.ts +60 -0
  315. package/src/daemon/pkb-reminder-builder.test.ts +54 -13
  316. package/src/daemon/pkb-reminder-builder.ts +21 -7
  317. package/src/daemon/process-message.ts +56 -23
  318. package/src/daemon/server.ts +23 -18
  319. package/src/daemon/shutdown-handlers.ts +0 -2
  320. package/src/daemon/tool-setup-types.ts +9 -0
  321. package/src/daemon/tool-side-effects.ts +6 -4
  322. package/src/daemon/wake-target-adapter.ts +11 -0
  323. package/src/export/transcript-formatter.ts +61 -2
  324. package/src/filing/filing-service.ts +40 -53
  325. package/src/heartbeat/__tests__/heartbeat-service.test.ts +359 -0
  326. package/src/heartbeat/heartbeat-run-store.ts +2 -1
  327. package/src/heartbeat/heartbeat-service.ts +148 -127
  328. package/src/home/__tests__/feed-types.test.ts +63 -131
  329. package/src/home/__tests__/feed-writer.test.ts +77 -278
  330. package/src/home/__tests__/post-connect-feed.test.ts +9 -12
  331. package/src/home/feed-types.ts +19 -73
  332. package/src/home/feed-writer.ts +25 -156
  333. package/src/home/post-connect-feed.ts +1 -3
  334. package/src/ipc/__tests__/cli-ipc.test.ts +2 -0
  335. package/src/ipc/__tests__/email-ipc.test.ts +506 -0
  336. package/src/ipc/__tests__/exit-helper.test.ts +104 -0
  337. package/src/ipc/__tests__/streaming-client.test.ts +237 -0
  338. package/src/ipc/__tests__/streaming-framing.test.ts +142 -0
  339. package/src/ipc/assistant-server.ts +55 -6
  340. package/src/ipc/cli-client.ts +370 -50
  341. package/src/ipc/routes/db-proxy-transaction.ts +151 -0
  342. package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +60 -0
  343. package/src/ipc/skill-routes/events.ts +30 -3
  344. package/src/live-voice/__tests__/live-voice-session-manager.test.ts +46 -0
  345. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +1 -0
  346. package/src/live-voice/live-voice-session-manager.ts +11 -4
  347. package/src/live-voice/live-voice-session.ts +14 -6
  348. package/src/memory/__tests__/bookmark-crud.test.ts +258 -0
  349. package/src/memory/__tests__/bookmark-schema.test.ts +181 -0
  350. package/src/memory/__tests__/conversation-types.test.ts +36 -0
  351. package/src/memory/__tests__/find-most-recent-retrospective-for.test.ts +130 -0
  352. package/src/memory/__tests__/memory-retrospective-enqueue.test.ts +177 -0
  353. package/src/memory/__tests__/memory-retrospective-job.test.ts +328 -0
  354. package/src/memory/__tests__/memory-retrospective-startup-cleanup.test.ts +213 -0
  355. package/src/memory/__tests__/memory-retrospective-trigger-check.test.ts +90 -0
  356. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +69 -0
  357. package/src/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -0
  358. package/src/memory/bookmark-crud.ts +179 -0
  359. package/src/memory/context-search/__tests__/agent-runner-redaction.test.ts +31 -9
  360. package/src/memory/context-search/agent-protocol.ts +5 -1
  361. package/src/memory/context-search/agent-runner.ts +60 -85
  362. package/src/memory/context-search/limits.ts +1 -4
  363. package/src/memory/context-search/search.ts +23 -113
  364. package/src/memory/context-search/sources/conversations.ts +18 -6
  365. package/src/memory/context-search/sources/memory-v2.ts +39 -14
  366. package/src/memory/context-search/sources/memory.ts +7 -0
  367. package/src/memory/context-search/sources/workspace.ts +13 -10
  368. package/src/memory/context-search/types.ts +1 -1
  369. package/src/memory/conversation-bootstrap.ts +11 -0
  370. package/src/memory/conversation-crud.ts +312 -10
  371. package/src/memory/conversation-queries.ts +9 -5
  372. package/src/memory/conversation-title-service.ts +1 -0
  373. package/src/memory/conversation-types.ts +16 -0
  374. package/src/memory/db-init.ts +14 -0
  375. package/src/memory/embedding-backend.ts +2 -1
  376. package/src/memory/embedding-runtime-manager.ts +1 -2
  377. package/src/memory/graph/__tests__/remember-description.test.ts +55 -0
  378. package/src/memory/graph/conversation-graph-memory.ts +76 -5
  379. package/src/memory/graph/extraction.ts +4 -0
  380. package/src/memory/graph/graph-memory-state-store.ts +16 -3
  381. package/src/memory/graph/tool-handlers.ts +17 -7
  382. package/src/memory/graph/tools.ts +44 -5
  383. package/src/memory/indexer.ts +17 -0
  384. package/src/memory/jobs/__tests__/embed-concept-page.test.ts +13 -15
  385. package/src/memory/jobs/embed-concept-page.ts +45 -9
  386. package/src/memory/jobs-store.ts +51 -1
  387. package/src/memory/jobs-worker.ts +52 -3
  388. package/src/memory/llm-request-log-source-clickhouse.ts +317 -0
  389. package/src/memory/llm-request-log-source-local.ts +26 -0
  390. package/src/memory/llm-request-log-source.ts +97 -0
  391. package/src/memory/llm-request-log-store.ts +1 -1
  392. package/src/memory/memory-retrospective-constants.ts +13 -0
  393. package/src/memory/memory-retrospective-enqueue.ts +114 -0
  394. package/src/memory/memory-retrospective-job.ts +351 -0
  395. package/src/memory/memory-retrospective-startup-cleanup.ts +108 -0
  396. package/src/memory/memory-retrospective-state.ts +162 -0
  397. package/src/memory/memory-retrospective-trigger-check.ts +91 -0
  398. package/src/memory/memory-v2-activation-log-store.ts +49 -5
  399. package/src/memory/memory-v2-concept-frequency.ts +4 -0
  400. package/src/memory/message-content.ts +38 -1
  401. package/src/memory/migrations/227-add-conversation-inference-profile.ts +6 -1
  402. package/src/memory/migrations/228-rename-inference-profile-snake-case.ts +20 -7
  403. package/src/memory/migrations/229-delete-private-conversations.test.ts +70 -1
  404. package/src/memory/migrations/229-delete-private-conversations.ts +12 -0
  405. package/src/memory/migrations/231-repair-memory-graph-event-dates.ts +16 -2
  406. package/src/memory/migrations/240-conversation-inference-profile-session.ts +25 -0
  407. package/src/memory/migrations/241-activation-state-fk-cascade.ts +50 -0
  408. package/src/memory/migrations/242-message-bookmarks.ts +38 -0
  409. package/src/memory/migrations/243-provider-connections.ts +68 -0
  410. package/src/memory/migrations/244-provider-connection-status-label.ts +23 -0
  411. package/src/memory/migrations/245-memory-retrospective-state.ts +36 -0
  412. package/src/memory/migrations/246-backfill-provider-connection-label.ts +81 -0
  413. package/src/memory/migrations/__tests__/244-provider-connection-status-label.test.ts +84 -0
  414. package/src/memory/migrations/__tests__/245-memory-retrospective-state.test.ts +125 -0
  415. package/src/memory/migrations/__tests__/246-backfill-provider-connection-label.test.ts +192 -0
  416. package/src/memory/migrations/index.ts +7 -0
  417. package/src/memory/published-pages-store.ts +16 -0
  418. package/src/memory/schema/bookmarks.ts +38 -0
  419. package/src/memory/schema/conversations.ts +2 -0
  420. package/src/memory/schema/index.ts +2 -0
  421. package/src/memory/schema/inference.ts +29 -0
  422. package/src/memory/schema/memory-core.ts +9 -0
  423. package/src/memory/search/semantic.ts +1 -4
  424. package/src/memory/v2/__tests__/__snapshots__/prompts-router.test.ts.snap +27 -0
  425. package/src/memory/v2/__tests__/activation-store.test.ts +5 -5
  426. package/src/memory/v2/__tests__/activation.test.ts +11 -4
  427. package/src/memory/v2/__tests__/backfill-jobs.test.ts +38 -21
  428. package/src/memory/v2/__tests__/consolidation-job.test.ts +123 -135
  429. package/src/memory/v2/__tests__/edge-index.test.ts +1 -1
  430. package/src/memory/v2/__tests__/frontmatter-sweep.test.ts +111 -0
  431. package/src/memory/v2/__tests__/injection.test.ts +628 -10
  432. package/src/memory/v2/__tests__/migration.test.ts +7 -3
  433. package/src/memory/v2/__tests__/page-index.test.ts +277 -0
  434. package/src/memory/v2/__tests__/page-store.test.ts +14 -1
  435. package/src/memory/v2/__tests__/prompts-router.test.ts +257 -0
  436. package/src/memory/v2/__tests__/qdrant.test.ts +72 -0
  437. package/src/memory/v2/__tests__/reranker.test.ts +4 -4
  438. package/src/memory/v2/__tests__/router.test.ts +516 -0
  439. package/src/memory/v2/__tests__/sim.test.ts +45 -1
  440. package/src/memory/v2/__tests__/skill-store.test.ts +58 -3
  441. package/src/memory/v2/__tests__/static-context.test.ts +7 -22
  442. package/src/memory/v2/__tests__/sweep-job.test.ts +95 -0
  443. package/src/memory/v2/activation-store.ts +34 -5
  444. package/src/memory/v2/activation.ts +40 -27
  445. package/src/memory/v2/backfill-jobs.ts +17 -84
  446. package/src/memory/v2/consolidation-job.ts +85 -78
  447. package/src/memory/v2/frontmatter-sweep.ts +91 -0
  448. package/src/memory/v2/injection.ts +440 -109
  449. package/src/memory/v2/migration.ts +117 -20
  450. package/src/memory/v2/page-index.ts +191 -0
  451. package/src/memory/v2/page-store.ts +3 -0
  452. package/src/memory/v2/prompts/consolidation.ts +9 -7
  453. package/src/memory/v2/prompts/router.ts +192 -0
  454. package/src/memory/v2/qdrant.ts +100 -87
  455. package/src/memory/v2/reranker.ts +14 -7
  456. package/src/memory/v2/router.ts +322 -0
  457. package/src/memory/v2/sim.ts +25 -12
  458. package/src/memory/v2/skill-store.ts +118 -29
  459. package/src/memory/v2/static-context.ts +16 -9
  460. package/src/memory/v2/sweep-job.ts +122 -96
  461. package/src/memory/v2/types.ts +10 -6
  462. package/src/memory/validation.ts +13 -0
  463. package/src/notifications/__tests__/emit-signal-home-feed.test.ts +182 -0
  464. package/src/notifications/__tests__/home-feed-side-effect.test.ts +199 -0
  465. package/src/notifications/__tests__/signal-registry.test.ts +17 -0
  466. package/src/notifications/adapters/platform.ts +171 -0
  467. package/src/notifications/conversation-pairing.ts +2 -2
  468. package/src/notifications/copy-composer.ts +15 -0
  469. package/src/notifications/destination-resolver.ts +21 -0
  470. package/src/notifications/emit-signal.ts +28 -1
  471. package/src/notifications/home-feed-side-effect.ts +111 -0
  472. package/src/notifications/signal.ts +5 -0
  473. package/src/permissions/checker.ts +12 -0
  474. package/src/permissions/ipc-risk-types.ts +2 -0
  475. package/src/plugin-api/index.ts +13 -0
  476. package/src/plugin-api/package.json +12 -0
  477. package/src/plugin-api/types.ts +62 -0
  478. package/src/plugins/defaults/injectors.ts +19 -3
  479. package/src/plugins/external-plugin-loader.ts +294 -0
  480. package/src/plugins/types.ts +46 -30
  481. package/src/plugins/user-loader.ts +64 -41
  482. package/src/proactive-artifact/job.test.ts +12 -4
  483. package/src/proactive-artifact/job.ts +4 -0
  484. package/src/proactive-artifact/trigger-state.test.ts +9 -0
  485. package/src/proactive-artifact/trigger-state.ts +4 -0
  486. package/src/prompts/__tests__/system-prompt.test.ts +105 -0
  487. package/src/prompts/system-prompt.ts +22 -1
  488. package/src/prompts/update-bulletin-job.ts +61 -73
  489. package/src/providers/__tests__/dispatch-connection-routing.test.ts +279 -0
  490. package/src/providers/__tests__/inference.test.ts +288 -0
  491. package/src/providers/__tests__/provider-env-vars.test.ts +6 -0
  492. package/src/providers/__tests__/provider-secret-catalog.test.ts +6 -0
  493. package/src/providers/__tests__/retry-callsite.test.ts +14 -32
  494. package/src/providers/__tests__/satellite-connection-routing.test.ts +510 -0
  495. package/src/providers/__tests__/search-provider-catalog.test.ts +80 -0
  496. package/src/providers/anthropic/client.ts +95 -26
  497. package/src/providers/call-site-routing.ts +94 -16
  498. package/src/providers/connection-resolution.ts +163 -0
  499. package/src/providers/inference/__tests__/connections-status-label.test.ts +250 -0
  500. package/src/providers/inference/adapter-factory.ts +173 -0
  501. package/src/providers/inference/auth.ts +112 -0
  502. package/src/providers/inference/backfill.ts +196 -0
  503. package/src/providers/inference/connections.ts +356 -0
  504. package/src/providers/inference/resolve-auth.ts +65 -0
  505. package/src/providers/model-catalog.ts +104 -6
  506. package/src/providers/openai/responses-provider.ts +4 -2
  507. package/src/providers/provider-env-vars.ts +17 -7
  508. package/src/providers/provider-secret-catalog.ts +49 -30
  509. package/src/providers/provider-send-message.ts +41 -20
  510. package/src/providers/registry.ts +143 -159
  511. package/src/providers/retry.ts +18 -10
  512. package/src/providers/search-provider-catalog.ts +121 -0
  513. package/src/runtime/AGENTS.md +18 -5
  514. package/src/runtime/__tests__/background-job-runner.test.ts +357 -0
  515. package/src/runtime/__tests__/pre-first-message-gate.test.ts +82 -0
  516. package/src/runtime/actor-trust-resolver.ts +32 -10
  517. package/src/runtime/agent-wake.ts +35 -6
  518. package/src/runtime/assistant-event-hub.ts +3 -85
  519. package/src/runtime/auth/route-policy.ts +303 -8
  520. package/src/runtime/auth/same-actor.ts +2 -0
  521. package/src/runtime/background-job-runner.ts +339 -0
  522. package/src/runtime/btw-sidechain.ts +1 -0
  523. package/src/runtime/http-router.ts +36 -1
  524. package/src/runtime/http-server.ts +31 -5
  525. package/src/runtime/http-types.ts +2 -0
  526. package/src/runtime/middleware/__tests__/request-logger.test.ts +162 -0
  527. package/src/runtime/middleware/request-logger.ts +62 -1
  528. package/src/runtime/pre-first-message-gate.ts +83 -0
  529. package/src/runtime/routes/__tests__/backup-routes.test.ts +8 -1
  530. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +251 -0
  531. package/src/runtime/routes/__tests__/connection-routes-vs-cli-parity.test.ts +142 -0
  532. package/src/runtime/routes/__tests__/conversation-management-routes.test.ts +315 -0
  533. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +189 -0
  534. package/src/runtime/routes/__tests__/home-feed-routes.test.ts +15 -136
  535. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +736 -0
  536. package/src/runtime/routes/__tests__/memory-v2-routes.test.ts +4 -4
  537. package/src/runtime/routes/__tests__/stt-routes.test.ts +5 -1
  538. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +384 -0
  539. package/src/runtime/routes/__tests__/tts-routes.test.ts +6 -2
  540. package/src/runtime/routes/acp-routes.ts +10 -8
  541. package/src/runtime/routes/app-management-routes.ts +228 -3
  542. package/src/runtime/routes/approval-routes.ts +0 -18
  543. package/src/runtime/routes/audit-routes.ts +43 -0
  544. package/src/runtime/routes/auth-routes.ts +72 -0
  545. package/src/runtime/routes/avatar-routes.ts +273 -20
  546. package/src/runtime/routes/backup-routes.ts +406 -2
  547. package/src/runtime/routes/bookmark-routes.ts +154 -0
  548. package/src/runtime/routes/channel-verification-routes.ts +2 -1
  549. package/src/runtime/routes/contact-routes.ts +0 -160
  550. package/src/runtime/routes/conversation-cli-routes.ts +192 -0
  551. package/src/runtime/routes/conversation-management-routes.ts +30 -43
  552. package/src/runtime/routes/conversation-query-routes.ts +334 -86
  553. package/src/runtime/routes/conversation-routes.ts +31 -10
  554. package/src/runtime/routes/conversations-import-routes.ts +229 -0
  555. package/src/runtime/routes/credential-routes.ts +540 -0
  556. package/src/runtime/routes/debug-routes.ts +2 -2
  557. package/src/runtime/routes/document-pdf-renderer.ts +5 -1
  558. package/src/runtime/routes/domain-routes.ts +167 -0
  559. package/src/runtime/routes/email-routes.ts +603 -0
  560. package/src/runtime/routes/errors.ts +2 -2
  561. package/src/runtime/routes/events-routes.ts +192 -0
  562. package/src/runtime/routes/home-feed-routes.ts +6 -78
  563. package/src/runtime/routes/host-app-control-routes.ts +44 -2
  564. package/src/runtime/routes/host-browser-routes.ts +103 -22
  565. package/src/runtime/routes/http-adapter.ts +2 -0
  566. package/src/runtime/routes/identity-routes.ts +5 -0
  567. package/src/runtime/routes/image-generation-routes.ts +99 -0
  568. package/src/runtime/routes/inbound-stages/background-dispatch.test.ts +137 -1
  569. package/src/runtime/routes/inbound-stages/background-dispatch.ts +87 -7
  570. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +156 -0
  571. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +22 -4
  572. package/src/runtime/routes/index.ts +36 -0
  573. package/src/runtime/routes/inference-profile-session-handler.ts +312 -0
  574. package/src/runtime/routes/inference-profile-session-reaper.ts +98 -0
  575. package/src/runtime/routes/inference-profile-session-routes.ts +146 -0
  576. package/src/runtime/routes/inference-provider-connection-routes.ts +317 -0
  577. package/src/runtime/routes/inference-send-routes.ts +115 -0
  578. package/src/runtime/routes/integrations/twilio.ts +1 -0
  579. package/src/runtime/routes/mcp-auth-routes.ts +283 -9
  580. package/src/runtime/routes/memory-v2-routes.ts +13 -398
  581. package/src/runtime/routes/notification-routes.ts +2 -0
  582. package/src/runtime/routes/oauth-apps.ts +112 -7
  583. package/src/runtime/routes/oauth-commands-routes.ts +1007 -0
  584. package/src/runtime/routes/oauth-connect-routes.ts +67 -5
  585. package/src/runtime/routes/oauth-providers.ts +298 -8
  586. package/src/runtime/routes/platform-routes.ts +336 -0
  587. package/src/runtime/routes/playground/inject-failures.ts +2 -1
  588. package/src/runtime/routes/playground/reset-circuit.ts +2 -1
  589. package/src/runtime/routes/playground/state.ts +2 -1
  590. package/src/runtime/routes/publish-routes.ts +221 -0
  591. package/src/runtime/routes/schedule-routes.ts +82 -0
  592. package/src/runtime/routes/sequence-routes.ts +291 -0
  593. package/src/runtime/routes/settings-routes.ts +2 -10
  594. package/src/runtime/routes/skills-routes.ts +31 -1
  595. package/src/runtime/routes/stt-routes.ts +240 -3
  596. package/src/runtime/routes/surface-action-routes.ts +43 -7
  597. package/src/runtime/routes/tts-routes.ts +67 -0
  598. package/src/runtime/routes/types.ts +32 -0
  599. package/src/runtime/routes/user-routes-cli.ts +243 -0
  600. package/src/runtime/routes/webhook-routes.ts +165 -0
  601. package/src/runtime/sync/resource-sync-events.ts +25 -0
  602. package/src/runtime/sync/sync-publisher.test.ts +105 -0
  603. package/src/runtime/sync/sync-publisher.ts +21 -0
  604. package/src/schedule/scheduler.ts +200 -123
  605. package/src/security/__tests__/provider-key-env-fallback.test.ts +12 -6
  606. package/src/security/secret-patterns.ts +3 -0
  607. package/src/sequence/engine.ts +38 -40
  608. package/src/subagent/manager.ts +20 -15
  609. package/src/tools/browser/__tests__/browser-execution-acquire.test.ts +206 -0
  610. package/src/tools/browser/browser-execution.ts +15 -4
  611. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +174 -0
  612. package/src/tools/browser/cdp-client/cdp-inspect/__tests__/ws-transport.test.ts +16 -13
  613. package/src/tools/browser/cdp-client/extension-cdp-client.ts +24 -1
  614. package/src/tools/browser/cdp-client/factory.ts +66 -5
  615. package/src/tools/browser/runtime-check.ts +77 -0
  616. package/src/tools/memory/register.test.ts +3 -3
  617. package/src/tools/memory/register.ts +9 -1
  618. package/src/tools/network/__tests__/web-search.test.ts +156 -0
  619. package/src/tools/network/web-search.ts +280 -37
  620. package/src/tools/permission-checker.ts +13 -5
  621. package/src/tools/subagent/spawn.ts +3 -3
  622. package/src/tools/terminal/shell.ts +44 -0
  623. package/src/usage/attribution.ts +3 -2
  624. package/src/util/pricing.ts +86 -160
  625. package/src/watcher/__tests__/engine.test.ts +301 -0
  626. package/src/watcher/constants.ts +7 -0
  627. package/src/watcher/engine.ts +90 -90
  628. package/src/workspace/migrations/046-seed-conversation-starters-callsite.ts +6 -9
  629. package/src/workspace/migrations/054-seed-recall-callsite.ts +10 -1
  630. package/src/workspace/migrations/057-repair-stale-gemini-model-ids.ts +28 -4
  631. package/src/workspace/migrations/069-seed-onboarding-threads.ts +8 -2
  632. package/src/workspace/migrations/072-seed-reply-suggestion-callsite.ts +104 -0
  633. package/src/workspace/migrations/073-repair-recall-callsite-empty-profile.ts +93 -0
  634. package/src/workspace/migrations/074-drop-deprecated-secret-detection-keys.ts +117 -0
  635. package/src/workspace/migrations/075-memory-v2-bm25-b-default-reembed.ts +61 -0
  636. package/src/workspace/migrations/076-drop-services-inference-mode.ts +62 -0
  637. package/src/workspace/migrations/077-seed-memory-router-callsite.ts +89 -0
  638. package/src/workspace/migrations/078-release-notes-tavily-web-search.ts +66 -0
  639. package/src/workspace/migrations/079-home-feed-notification-only.ts +197 -0
  640. package/src/workspace/migrations/080-restrict-vercel-api-token-metadata.ts +182 -0
  641. package/src/workspace/migrations/081-backfill-bash-allowed-tools-for-injection-credentials.ts +160 -0
  642. package/src/workspace/migrations/082-backfill-managed-profile-labels.ts +154 -0
  643. package/src/workspace/migrations/registry.ts +22 -0
  644. package/src/workspace/migrations/runner.ts +13 -2
  645. package/src/workspace/migrations/types.ts +13 -3
  646. package/src/workspace/provider-commit-message-generator.ts +3 -2
  647. package/src/__tests__/context-search-pkb-source.test.ts +0 -498
  648. package/src/__tests__/credentials-cli.test.ts +0 -1225
  649. package/src/__tests__/memory-admin-recall.test.ts +0 -213
  650. package/src/approvals/__tests__/guardian-feed-event.test.ts +0 -303
  651. package/src/cli/commands/__tests__/email-download.test.ts +0 -260
  652. package/src/cli/commands/__tests__/email-list.test.ts +0 -216
  653. package/src/cli/commands/__tests__/email-register.test.ts +0 -186
  654. package/src/cli/commands/__tests__/email-send.test.ts +0 -416
  655. package/src/cli/commands/__tests__/email-status.test.ts +0 -185
  656. package/src/cli/commands/__tests__/email-unregister.test.ts +0 -168
  657. package/src/cli/commands/__tests__/routes.test.ts +0 -562
  658. package/src/cli/commands/__tests__/stt-transcribe.test.ts +0 -454
  659. package/src/cli/commands/autonomy.ts +0 -365
  660. package/src/cli/commands/memory.ts +0 -424
  661. package/src/cli/commands/oauth/__tests__/connect.test.ts +0 -947
  662. package/src/cli/commands/oauth/__tests__/disconnect.test.ts +0 -686
  663. package/src/cli/commands/oauth/__tests__/mode.test.ts +0 -632
  664. package/src/cli/commands/oauth/__tests__/ping.test.ts +0 -631
  665. package/src/cli/commands/oauth/__tests__/providers-delete.test.ts +0 -573
  666. package/src/cli/commands/oauth/__tests__/providers-register.test.ts +0 -330
  667. package/src/cli/commands/oauth/__tests__/providers-update.test.ts +0 -521
  668. package/src/cli/commands/oauth/__tests__/status.test.ts +0 -551
  669. package/src/cli/commands/oauth/__tests__/token.test.ts +0 -420
  670. package/src/cli/lib/daemon-avatar-client.ts +0 -37
  671. package/src/config/bundled-skills/contacts/tools/contact-upsert.ts +0 -87
  672. package/src/config/bundled-skills/messaging/tools/__tests__/messaging-feed-events.test.ts +0 -207
  673. package/src/daemon/__tests__/conversation-feed-event.test.ts +0 -304
  674. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +0 -233
  675. package/src/home/__tests__/assistant-feed-authoring.test.ts +0 -156
  676. package/src/home/__tests__/emit-feed-event.test.ts +0 -169
  677. package/src/home/__tests__/feed-population-integration.test.ts +0 -312
  678. package/src/home/__tests__/feed-scheduler.test.ts +0 -222
  679. package/src/home/__tests__/phase5-exit-criteria.test.ts +0 -229
  680. package/src/home/__tests__/platform-gmail-digest.test.ts +0 -222
  681. package/src/home/__tests__/rollup-producer.test.ts +0 -507
  682. package/src/home/assistant-feed-authoring.ts +0 -135
  683. package/src/home/emit-feed-event.ts +0 -169
  684. package/src/home/feed-scheduler.ts +0 -281
  685. package/src/home/platform-gmail-digest.ts +0 -163
  686. package/src/home/rewrite-command-preview.ts +0 -66
  687. package/src/home/rewrite-feed-title.ts +0 -58
  688. package/src/home/rollup-producer.ts +0 -426
  689. package/src/memory/admin.ts +0 -326
  690. package/src/memory/context-search/sources/pkb.ts +0 -476
  691. package/src/memory/graph/compaction.ts +0 -299
  692. /package/src/cli/{commands → lib}/cache-fs.ts +0 -0
@@ -2,19 +2,8 @@ import { readFileSync, writeFileSync } from "node:fs";
2
2
 
3
3
  import type { Command } from "commander";
4
4
 
5
- import type { OAuthConnectionRequest } from "../../../oauth/connection.js";
6
- import {
7
- resolveOAuthConnection,
8
- type ResolveOAuthConnectionOptions,
9
- } from "../../../oauth/connection-resolver.js";
10
- import {
11
- getActiveConnection,
12
- getAppByProviderAndClientId,
13
- getProvider,
14
- } from "../../../oauth/oauth-store.js";
15
- import { VellumPlatformClient } from "../../../platform/client.js";
5
+ import { cliIpcCall, exitFromIpcResult } from "../../../ipc/cli-client.js";
16
6
  import { shouldOutputJson, writeOutput } from "../../output.js";
17
- import { isManagedMode } from "./shared.js";
18
7
 
19
8
  // ---------------------------------------------------------------------------
20
9
  // Helpers
@@ -60,11 +49,12 @@ function tryJsonParse(raw: string): unknown {
60
49
  * - `@<path>` reads a file
61
50
  * - Otherwise treats as inline data
62
51
  *
63
- * All sources attempt JSON parse with fallback to raw string.
52
+ * File/stdin reading must happen on the CLI side (not the daemon)
53
+ * since stdin is attached to the CLI process and file paths are
54
+ * relative to the user's cwd.
64
55
  */
65
56
  function readBodyData(data: string): unknown {
66
57
  if (data === "@-") {
67
- // Read stdin synchronously. Bun supports readFileSync("/dev/stdin").
68
58
  const raw = readFileSync("/dev/stdin", "utf-8");
69
59
  return tryJsonParse(raw);
70
60
  }
@@ -174,348 +164,95 @@ Examples:
174
164
  };
175
165
 
176
166
  try {
177
- // -----------------------------------------------------------------
178
- // Pre-flight check 1: Provider not found
179
- // -----------------------------------------------------------------
180
- const providerRow = getProvider(opts.provider);
181
- if (!providerRow) {
182
- writeError(
183
- `Error: Unknown provider "${opts.provider}".\n\n` +
184
- `Run 'assistant oauth providers list' to see available providers.\n` +
185
- `If this is a custom provider, register it first with 'assistant oauth providers register --help'.`,
186
- );
187
- return;
188
- }
189
-
190
- // -----------------------------------------------------------------
191
- // Pre-flight check 2: Determine managed vs BYO mode
192
- // -----------------------------------------------------------------
193
- const managed = isManagedMode(opts.provider);
194
-
195
- // -----------------------------------------------------------------
196
- // Pre-flight check 3: Client ID not found (BYO only)
197
- // -----------------------------------------------------------------
198
- if (opts.clientId) {
199
- if (managed) {
200
- writeInfo(
201
- `Warning: --client-id is ignored for platform-managed providers. The platform manages OAuth apps for "${opts.provider}".`,
202
- );
203
- } else {
204
- const app = getAppByProviderAndClientId(
205
- opts.provider,
206
- opts.clientId,
207
- );
208
- if (!app) {
209
- writeError(
210
- `Error: No registered OAuth app found for "${opts.provider}" with client ID "${opts.clientId}".\n\n` +
211
- `Run 'assistant oauth apps list' to see registered apps for this provider.\n` +
212
- `To register a new app, run 'assistant oauth apps upsert --help'.`,
213
- );
214
- return;
215
- }
216
- }
217
- }
218
-
219
- // -----------------------------------------------------------------
220
- // Pre-flight check 4: Account not found
221
- // -----------------------------------------------------------------
222
- if (opts.account) {
223
- if (managed) {
224
- // Query platform connections to validate account
225
- const client = await VellumPlatformClient.create();
226
- if (client && client.platformAssistantId) {
227
- const params = new URLSearchParams();
228
- params.set("provider", opts.provider);
229
- params.set("status", "ACTIVE");
230
- params.set("account_identifier", opts.account);
231
-
232
- const path = `/v1/assistants/${encodeURIComponent(client.platformAssistantId)}/oauth/connections/?${params.toString()}`;
233
- const response = await client.fetch(path);
234
-
235
- if (response.ok) {
236
- const body = (await response.json()) as unknown;
237
- const connections = (
238
- Array.isArray(body)
239
- ? body
240
- : ((body as Record<string, unknown>).results ?? [])
241
- ) as Array<{ id: string }>;
242
-
243
- if (connections.length === 0) {
244
- writeError(
245
- `Error: No active platform connection found for "${opts.provider}" with account "${opts.account}".\n\n` +
246
- `Run 'assistant oauth status ${opts.provider}' to see connected accounts for this provider.\n` +
247
- `To connect a new account, run 'assistant oauth connect --help'.`,
248
- );
249
- return;
250
- }
251
- }
252
- } else {
253
- writeInfo(
254
- `Warning: Could not validate account "${opts.account}" — platform client not available. Proceeding without account validation.`,
255
- );
256
- }
257
- } else {
258
- const conn = getActiveConnection(opts.provider, {
259
- clientId: opts.clientId,
260
- account: opts.account,
261
- });
262
- if (!conn) {
263
- writeError(
264
- `Error: No active OAuth connection found for "${opts.provider}" with account "${opts.account}"${opts.clientId ? ` and client ID "${opts.clientId}"` : ""}.\n\n` +
265
- `Run 'assistant oauth status ${opts.provider}' to see active connections.\n` +
266
- `To connect a new account, run 'assistant oauth connect --help'.`,
267
- );
268
- return;
269
- }
270
- }
271
- }
272
-
273
- // -----------------------------------------------------------------
274
- // Parse URL
275
- // -----------------------------------------------------------------
276
- let baseUrl: string | undefined;
277
- let requestPath: string;
278
- const queryFromUrl: Record<string, string | string[]> = {};
279
-
280
- if (url.startsWith("http://") || url.startsWith("https://")) {
281
- const parsed = new URL(url);
282
- baseUrl = `${parsed.protocol}//${parsed.host}`;
283
- requestPath = parsed.pathname;
284
- for (const [key, value] of parsed.searchParams.entries()) {
285
- const existing = queryFromUrl[key];
286
- if (existing !== undefined) {
287
- queryFromUrl[key] = Array.isArray(existing)
288
- ? [...existing, value]
289
- : [existing, value];
290
- } else {
291
- queryFromUrl[key] = value;
292
- }
293
- }
294
- } else {
295
- // Relative URL — extract embedded query params if present
296
- const qIdx = url.indexOf("?");
297
- if (qIdx !== -1) {
298
- requestPath = url.slice(0, qIdx);
299
- const embeddedParams = new URLSearchParams(url.slice(qIdx + 1));
300
- for (const [key, value] of embeddedParams.entries()) {
301
- const existing = queryFromUrl[key];
302
- if (existing !== undefined) {
303
- queryFromUrl[key] = Array.isArray(existing)
304
- ? [...existing, value]
305
- : [existing, value];
306
- } else {
307
- queryFromUrl[key] = value;
308
- }
309
- }
310
- } else {
311
- requestPath = url;
312
- }
313
- }
314
-
315
- // -----------------------------------------------------------------
316
- // Parse headers
317
- // -----------------------------------------------------------------
318
- const headers: Record<string, string> = {};
167
+ // Parse headers for verbose output (before sending to daemon)
168
+ const parsedHeaders: Record<string, string> = {};
319
169
  for (const raw of opts.header) {
320
170
  const [key, value] = parseHeader(raw);
321
- headers[key] = value;
322
- }
323
-
324
- // -----------------------------------------------------------------
325
- // Resolve method
326
- // -----------------------------------------------------------------
327
- let method: string;
328
- if (opts.head) {
329
- method = "HEAD";
330
- } else if (opts.request) {
331
- method = opts.request.toUpperCase();
332
- } else if (opts.get) {
333
- method = "GET";
334
- } else if (opts.data !== undefined) {
335
- method = "POST";
336
- } else {
337
- method = "GET";
338
- }
339
-
340
- // -----------------------------------------------------------------
341
- // Handle body / query params
342
- // -----------------------------------------------------------------
343
- let body: unknown = undefined;
344
- const query: Record<string, string | string[]> = { ...queryFromUrl };
345
-
346
- if (opts.data !== undefined) {
347
- const rawBody = readBodyData(opts.data);
348
-
349
- if (opts.get) {
350
- // With -G, body data becomes query params
351
- if (typeof rawBody === "string") {
352
- // Parse as URL-encoded query params
353
- const bodyParams = new URLSearchParams(rawBody);
354
- for (const [key, value] of bodyParams.entries()) {
355
- const existing = query[key];
356
- if (existing !== undefined) {
357
- query[key] = Array.isArray(existing)
358
- ? [...existing, value]
359
- : [existing, value];
360
- } else {
361
- query[key] = value;
362
- }
363
- }
364
- } else if (
365
- rawBody !== null &&
366
- typeof rawBody === "object" &&
367
- !Array.isArray(rawBody)
368
- ) {
369
- for (const [key, value] of Object.entries(
370
- rawBody as Record<string, unknown>,
371
- )) {
372
- const existing = query[key];
373
- const strValue = String(value);
374
- if (existing !== undefined) {
375
- query[key] = Array.isArray(existing)
376
- ? [...existing, strValue]
377
- : [existing, strValue];
378
- } else {
379
- query[key] = strValue;
380
- }
381
- }
382
- }
383
- } else {
384
- body = rawBody;
385
- }
171
+ parsedHeaders[key] = value;
386
172
  }
387
173
 
388
- // -----------------------------------------------------------------
389
174
  // Verbose: show request details
390
- // -----------------------------------------------------------------
391
175
  if (opts.verbose) {
392
- writeInfo(`> ${method} ${requestPath}`);
393
- for (const [key, value] of Object.entries(headers)) {
176
+ const method = opts.head
177
+ ? "HEAD"
178
+ : opts.request
179
+ ? opts.request.toUpperCase()
180
+ : opts.get
181
+ ? "GET"
182
+ : opts.data !== undefined
183
+ ? "POST"
184
+ : "GET";
185
+ writeInfo(`> ${method} ${url}`);
186
+ for (const [key, value] of Object.entries(parsedHeaders)) {
394
187
  writeInfo(`> ${key}: ${value}`);
395
188
  }
396
- if (baseUrl) {
397
- writeInfo(`> Host: ${baseUrl}`);
398
- }
399
189
  writeInfo(`> Authorization: Bearer [REDACTED]`);
400
190
  writeInfo(`>`);
401
191
  }
402
192
 
403
- // -----------------------------------------------------------------
404
- // Resolve connection and make request
405
- // -----------------------------------------------------------------
406
- const resolveOptions: ResolveOAuthConnectionOptions = {};
407
- if (opts.clientId && !managed) {
408
- resolveOptions.clientId = opts.clientId;
409
- }
410
- if (opts.account) {
411
- resolveOptions.account = opts.account;
412
- }
413
-
414
- let connection;
415
- try {
416
- connection = await resolveOAuthConnection(
417
- opts.provider,
418
- resolveOptions,
419
- );
420
- } catch (resolveErr) {
421
- // Error case 5: Connection resolution failure — preserve the
422
- // original error message so callers can see the actual cause
423
- // (e.g. missing platform login, missing access token, provider
424
- // misconfiguration) rather than a generic "no connection" hint.
425
- const resolveMessage =
426
- resolveErr instanceof Error
427
- ? resolveErr.message
428
- : String(resolveErr);
429
-
430
- if (managed) {
431
- writeError(
432
- `Error: ${resolveMessage}\n\n` +
433
- `Run 'assistant oauth status ${opts.provider}' to check connection status.\n` +
434
- `To connect, run 'assistant oauth connect --help'.`,
435
- );
436
- } else {
437
- writeError(
438
- `Error: ${resolveMessage}\n\n` +
439
- `Run 'assistant oauth status ${opts.provider}' to see active connections.\n` +
440
- `To connect, run 'assistant oauth connect --help'.`,
441
- );
442
- }
443
- return;
193
+ // Read body data on the CLI side (file/stdin reading must happen here)
194
+ let parsedData: unknown;
195
+ if (opts.data !== undefined) {
196
+ parsedData = readBodyData(opts.data);
444
197
  }
445
198
 
446
- const req: OAuthConnectionRequest = {
447
- method,
448
- path: requestPath,
449
- ...(Object.keys(query).length > 0 ? { query } : {}),
450
- ...(Object.keys(headers).length > 0 ? { headers } : {}),
451
- ...(body !== undefined ? { body } : {}),
452
- ...(baseUrl ? { baseUrl } : {}),
199
+ // Build IPC request body
200
+ const body: Record<string, unknown> = {
201
+ provider: opts.provider,
202
+ url,
453
203
  };
204
+ if (opts.request) body.method = opts.request;
205
+ if (Object.keys(parsedHeaders).length > 0)
206
+ body.headers = parsedHeaders;
207
+ if (parsedData !== undefined) body.parsed_data = parsedData;
208
+ if (opts.get) body.force_get = true;
209
+ if (opts.head) body.head = true;
210
+ if (opts.account) body.account = opts.account;
211
+ if (opts.clientId) body.client_id = opts.clientId;
212
+
213
+ const r = await cliIpcCall<{
214
+ ok: boolean;
215
+ status: number;
216
+ headers: Record<string, string>;
217
+ body: unknown;
218
+ hint?: string;
219
+ }>("oauth_request", { body });
220
+
221
+ if (!r.ok) return exitFromIpcResult(r);
222
+
223
+ const result = r.result!;
454
224
 
455
- const response = await connection.request(req);
456
-
457
- // -----------------------------------------------------------------
458
225
  // Non-2xx exit code
459
- // -----------------------------------------------------------------
460
- if (response.status < 200 || response.status >= 300) {
226
+ if (result.status < 200 || result.status >= 300) {
461
227
  process.exitCode = 1;
462
228
  }
463
229
 
464
- // -----------------------------------------------------------------
465
- // Error case 6: Auth errors (401/403) — add diagnostic hint
466
- // -----------------------------------------------------------------
467
- let authHint: string | undefined;
468
- if (response.status === 401 || response.status === 403) {
469
- if (managed) {
470
- authHint =
471
- `Hint: Request returned HTTP ${response.status}. The OAuth token may be expired or revoked.\n\n` +
472
- `Run 'assistant oauth status ${opts.provider}' to check connection health.\n` +
473
- `To reconnect, run 'assistant oauth connect --help'.`;
474
- } else {
475
- authHint =
476
- `Hint: Request returned HTTP ${response.status}. The OAuth token may be expired or revoked.\n\n` +
477
- `Run 'assistant oauth status ${opts.provider}' to check connection status.\n` +
478
- `To reconnect, run 'assistant oauth connect --help'.`;
479
- }
480
- writeInfo(authHint);
230
+ // Auth hint
231
+ if (result.hint) {
232
+ writeInfo(result.hint);
481
233
  }
482
234
 
483
- // -----------------------------------------------------------------
484
- // Output: --json mode
485
- // -----------------------------------------------------------------
235
+ // JSON output mode
486
236
  if (jsonMode) {
487
- const payload: Record<string, unknown> = {
488
- ok: response.status >= 200 && response.status < 300,
489
- status: response.status,
490
- headers: response.headers,
491
- body: response.body,
492
- };
493
- if (authHint) {
494
- payload.hint = authHint;
495
- }
496
- writeOutput(cmd, payload);
237
+ writeOutput(cmd, result);
497
238
  return;
498
239
  }
499
240
 
500
- // -----------------------------------------------------------------
501
- // Output: verbose / include — response headers to stderr
502
- // -----------------------------------------------------------------
241
+ // Verbose / include — response headers to stderr
503
242
  if (opts.verbose || opts.include) {
504
- writeInfo(`< HTTP ${response.status}`);
505
- for (const [key, value] of Object.entries(response.headers)) {
243
+ writeInfo(`< HTTP ${result.status}`);
244
+ for (const [key, value] of Object.entries(result.headers)) {
506
245
  writeInfo(`< ${key}: ${value}`);
507
246
  }
508
247
  writeInfo(`<`);
509
248
  }
510
249
 
511
- // -----------------------------------------------------------------
512
- // Output: body (skip for null bodies — HEAD requests, 204, etc.)
513
- // -----------------------------------------------------------------
514
- if (response.body != null) {
250
+ // Body output (skip for null bodies — HEAD requests, 204, etc.)
251
+ if (result.body != null) {
515
252
  const bodyStr =
516
- typeof response.body === "string"
517
- ? response.body
518
- : JSON.stringify(response.body, null, 2);
253
+ typeof result.body === "string"
254
+ ? result.body
255
+ : JSON.stringify(result.body, null, 2);
519
256
 
520
257
  if (opts.output) {
521
258
  writeFileSync(opts.output, bodyStr, "utf-8");
@@ -523,37 +260,10 @@ Examples:
523
260
  process.stdout.write(bodyStr + "\n");
524
261
  }
525
262
  } else if (opts.output) {
526
- // Truncate the output file so stale content from a previous run
527
- // doesn't persist when the response has no body (HEAD, 204, etc.)
528
263
  writeFileSync(opts.output, "", "utf-8");
529
264
  }
530
265
  } catch (err) {
531
- // Error case 7: Generic/unexpected errors
532
266
  const message = err instanceof Error ? err.message : String(err);
533
-
534
- // BYO connections throw on persistent 401 (after refresh retry
535
- // exhaustion) with a `status` property. Detect this and show the
536
- // same auth hint that the response-level 401/403 check would give.
537
- const errStatus =
538
- err && typeof err === "object" && "status" in err
539
- ? (err as { status: unknown }).status
540
- : undefined;
541
-
542
- if (errStatus === 401 || errStatus === 403) {
543
- const managed = isManagedMode(opts.provider);
544
- const authHint = managed
545
- ? `Hint: Request returned HTTP ${errStatus}. The OAuth token may be expired or revoked.\n\n` +
546
- `Run 'assistant oauth status ${opts.provider}' to check connection health.\n` +
547
- `To reconnect, run 'assistant oauth connect --help'.`
548
- : `Hint: Request returned HTTP ${errStatus}. The OAuth token may be expired or revoked.\n\n` +
549
- `Run 'assistant oauth status ${opts.provider}' to check connection status.\n` +
550
- `To reconnect, run 'assistant oauth connect --help'.`;
551
-
552
- writeError(`Error: ${message}`, authHint);
553
- writeInfo(authHint);
554
- return;
555
- }
556
-
557
267
  writeError(
558
268
  `Error: ${message}\n\n` +
559
269
  `For provider diagnostics, run 'assistant oauth providers get ${opts.provider}'.`,
@@ -1,92 +1,28 @@
1
+ /**
2
+ * Shared types and helpers for OAuth CLI commands.
3
+ *
4
+ * This module provides types used across oauth CLI commands and utility
5
+ * functions consumed by non-oauth commands (e.g. config.ts).
6
+ */
7
+
1
8
  import type { Command } from "commander";
2
9
 
3
- import { getConfig } from "../../../config/loader.js";
4
- import {
5
- getServiceMode,
6
- type Services,
7
- ServicesSchema,
8
- } from "../../../config/schemas/services.js";
9
- import { getProvider } from "../../../oauth/oauth-store.js";
10
10
  import { VellumPlatformClient } from "../../../platform/client.js";
11
11
  import { writeOutput } from "../../output.js";
12
12
 
13
13
  // ---------------------------------------------------------------------------
14
- // Shared types
14
+ // Platform connection helpers
15
15
  // ---------------------------------------------------------------------------
16
16
 
17
- export interface PlatformConnectionEntry {
18
- id: string;
19
- account_label?: string;
20
- scopes_granted?: string[];
21
- status?: string;
22
- }
23
-
24
- // ---------------------------------------------------------------------------
25
- // Shared helpers
26
- // ---------------------------------------------------------------------------
27
-
28
- /**
29
- * Return the provider's `managedServiceConfigKey` if it exists and is a valid
30
- * key in `ServicesSchema.shape`, or `null` otherwise. This centralises the
31
- * lookup so that callers (e.g. `isManagedMode`, `mode.ts`) don't duplicate the
32
- * validation.
33
- */
34
- export function getManagedServiceConfigKey(provider: string): string | null {
35
- const providerRow = getProvider(provider);
36
- const managedKey = providerRow?.managedServiceConfigKey;
37
- if (!managedKey || !(managedKey in ServicesSchema.shape)) return null;
38
- return managedKey;
39
- }
40
-
41
- /**
42
- * Determine whether a provider is running in platform-managed mode.
43
- * Returns false if config is unavailable (e.g. in test environments).
44
- */
45
- export function isManagedMode(provider: string): boolean {
46
- const managedKey = getManagedServiceConfigKey(provider);
47
- if (!managedKey) return false;
48
- try {
49
- const services: Services = getConfig().services;
50
- return getServiceMode(services, managedKey as keyof Services) === "managed";
51
- } catch {
52
- return false;
53
- }
54
- }
55
-
56
- /**
57
- * Create an authenticated platform client, or write an error and return null.
58
- */
59
- export async function requirePlatformClient(
60
- cmd: Command,
61
- ): Promise<VellumPlatformClient | null> {
62
- const client = await VellumPlatformClient.create();
63
- if (!client) {
64
- writeOutput(cmd, {
65
- ok: false,
66
- error:
67
- "Not connected to Vellum platform. Run `vellum platform connect` to connect first.",
68
- });
69
- process.exitCode = 1;
70
- return null;
71
- }
72
- if (!client.platformAssistantId) {
73
- writeOutput(cmd, {
74
- ok: false,
75
- error:
76
- "Connected to Vellum platform but no assistant ID is configured. Ensure the assistant is registered on the platform.",
77
- });
78
- process.exitCode = 1;
79
- return null;
80
- }
81
- return client;
82
- }
83
-
84
17
  /**
85
18
  * Verify that the user has connected to the Vellum platform (has stored
86
19
  * credentials). Unlike `requirePlatformClient`, this does NOT require a
87
20
  * platform assistant ID — it only checks that credentials exist.
88
21
  *
89
22
  * Writes an error and sets exitCode=1 when the user is not connected.
23
+ *
24
+ * NOTE: This is consumed by config.ts (a local-tagged command) for managed
25
+ * mode validation, so it must remain exported here.
90
26
  */
91
27
  export async function requirePlatformConnection(
92
28
  cmd: Command,
@@ -103,49 +39,3 @@ export async function requirePlatformConnection(
103
39
  }
104
40
  return true;
105
41
  }
106
-
107
- /**
108
- * Fetch active platform connections for a provider. Returns the parsed entries
109
- * or writes an error and returns null.
110
- *
111
- * When `silent` is true the helper returns null on HTTP errors without writing
112
- * any output — useful inside polling loops where transient failures should be
113
- * quietly retried rather than emitting multiple error lines.
114
- */
115
- export async function fetchActiveConnections(
116
- client: VellumPlatformClient,
117
- provider: string,
118
- cmd: Command,
119
- options?: { silent?: boolean },
120
- ): Promise<PlatformConnectionEntry[] | null> {
121
- const params = new URLSearchParams();
122
- params.set("provider", provider);
123
- params.set("status", "ACTIVE");
124
-
125
- const path = `/v1/assistants/${encodeURIComponent(client.platformAssistantId)}/oauth/connections/?${params.toString()}`;
126
- const response = await client.fetch(path);
127
-
128
- if (!response.ok) {
129
- if (!options?.silent) {
130
- const hint =
131
- response.status === 401 || response.status === 403
132
- ? `. Your platform session may have expired. Run \`vellum platform connect\` to reconnect.`
133
- : "";
134
- writeOutput(cmd, {
135
- ok: false,
136
- error: `Platform returned HTTP ${response.status}${hint}`,
137
- });
138
- process.exitCode = 1;
139
- }
140
- return null;
141
- }
142
-
143
- const body = (await response.json()) as unknown;
144
-
145
- // The platform returns either a flat array or a {results: [...]} wrapper.
146
- return (
147
- Array.isArray(body)
148
- ? body
149
- : ((body as Record<string, unknown>).results ?? [])
150
- ) as PlatformConnectionEntry[];
151
- }