@vellumai/assistant 0.11.3 → 0.11.4-dev.202608190019.b94dbf2

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 (596) hide show
  1. package/AGENTS.md +9 -3
  2. package/ARCHITECTURE.md +32 -10
  3. package/docs/architecture/memory.md +43 -5
  4. package/docs/architecture/security.md +96 -152
  5. package/docs/architecture/turn-actor.md +70 -0
  6. package/docs/browser-use-architecture-phase2.md +128 -56
  7. package/docs/flux-turn-detection-spike.md +248 -0
  8. package/docs/guardian-request-flow.md +35 -0
  9. package/docs/stt-provider-onboarding.md +3 -1
  10. package/knip.json +3 -0
  11. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  12. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
  13. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
  14. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
  15. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
  16. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
  17. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  18. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
  19. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
  20. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
  21. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
  22. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
  23. package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +34 -0
  24. package/node_modules/@vellumai/gateway-client/src/gateway-ipc-contracts.ts +166 -1
  25. package/node_modules/@vellumai/gateway-client/src/index.ts +2 -0
  26. package/node_modules/@vellumai/service-contracts/package.json +1 -0
  27. package/node_modules/@vellumai/service-contracts/src/__tests__/url-normalization.test.ts +135 -0
  28. package/node_modules/@vellumai/service-contracts/src/channels.ts +11 -0
  29. package/node_modules/@vellumai/service-contracts/src/index.ts +1 -0
  30. package/node_modules/@vellumai/service-contracts/src/remote-web-pairing.ts +60 -0
  31. package/node_modules/@vellumai/service-contracts/src/url-normalization.ts +107 -0
  32. package/openapi.yaml +289 -113
  33. package/package.json +1 -1
  34. package/scripts/voice-ttft-spike.ts +3 -3
  35. package/scripts/write-plugin-api-shim.ts +10 -0
  36. package/src/__tests__/app-compiler.test.ts +38 -3
  37. package/src/__tests__/app-control-flow.test.ts +1 -0
  38. package/src/__tests__/approval-routes-http.test.ts +2 -2
  39. package/src/__tests__/assistant-feature-flag-guard.test.ts +25 -3
  40. package/src/__tests__/attachments-store.test.ts +21 -12
  41. package/src/__tests__/byok-default-profile-ensure.test.ts +17 -0
  42. package/src/__tests__/call-setup-flow-name-capture.test.ts +0 -1
  43. package/src/__tests__/call-site-routing-provider.test.ts +1 -1
  44. package/src/__tests__/channel-availability-routes.test.ts +14 -1
  45. package/src/__tests__/channel-capabilities-dedupe.test.ts +214 -0
  46. package/src/__tests__/channel-delivery-store.test.ts +14 -14
  47. package/src/__tests__/channel-inbound-disk-pressure.test.ts +4 -4
  48. package/src/__tests__/channel-setup-panel-ack.test.ts +1 -1
  49. package/src/__tests__/checker.test.ts +20 -314
  50. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +6 -2
  51. package/src/__tests__/compaction-events.test.ts +8 -10
  52. package/src/__tests__/config-loader-backfill.test.ts +3 -3
  53. package/src/__tests__/config-schema.test.ts +25 -10
  54. package/src/__tests__/context-search-memory-v2-source.test.ts +0 -1
  55. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +8 -11
  56. package/src/__tests__/conversation-agent-loop-overflow.test.ts +8 -11
  57. package/src/__tests__/conversation-agent-loop.test.ts +32 -21
  58. package/src/__tests__/conversation-attachments.test.ts +0 -1
  59. package/src/__tests__/conversation-attention-store.test.ts +63 -0
  60. package/src/__tests__/conversation-confirmation-signals.test.ts +112 -0
  61. package/src/__tests__/conversation-delete-schedule-cleanup.test.ts +0 -4
  62. package/src/__tests__/conversation-fork-crud.test.ts +69 -0
  63. package/src/__tests__/conversation-fork-referential.test.ts +67 -0
  64. package/src/__tests__/conversation-fork-retrospective.test.ts +24 -0
  65. package/src/__tests__/conversation-load-history-repair.test.ts +209 -0
  66. package/src/__tests__/conversation-notifiers-provenance.test.ts +59 -0
  67. package/src/__tests__/conversation-queue.test.ts +154 -4
  68. package/src/__tests__/conversation-routes-disk-view.test.ts +1 -1
  69. package/src/__tests__/conversation-routes-enabled-plugins.test.ts +1 -1
  70. package/src/__tests__/conversation-routes-guardian-reply.test.ts +9 -9
  71. package/src/__tests__/conversation-routes-hidden-queue.test.ts +1 -1
  72. package/src/__tests__/conversation-routes-slash-commands.test.ts +1 -1
  73. package/src/__tests__/conversation-runtime-assembly.test.ts +187 -102
  74. package/src/__tests__/conversation-runtime-workspace.test.ts +14 -10
  75. package/src/__tests__/conversation-slash-queue.test.ts +3 -0
  76. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +1 -0
  77. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +1 -0
  78. package/src/__tests__/conversation-surfaces-app-control.test.ts +1 -0
  79. package/src/__tests__/conversation-surfaces-app-open.test.ts +1 -1
  80. package/src/__tests__/conversation-surfaces-data-persist.test.ts +1 -1
  81. package/src/__tests__/conversation-surfaces-history-restored-completion.test.ts +21 -14
  82. package/src/__tests__/conversation-surfaces-queued-emit.test.ts +1 -0
  83. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +1 -0
  84. package/src/__tests__/conversation-surfaces-standalone.test.ts +1 -0
  85. package/src/__tests__/conversation-surfaces-state-update.test.ts +1 -1
  86. package/src/__tests__/conversation-surfaces-table-action.test.ts +1 -1
  87. package/src/__tests__/conversation-surfaces-task-progress.test.ts +1 -1
  88. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +1 -1
  89. package/src/__tests__/conversation-tool-setup-attribution.test.ts +1 -1
  90. package/src/__tests__/credential-prompt-route.test.ts +7 -10
  91. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  92. package/src/__tests__/cu-unified-flow.test.ts +1 -0
  93. package/src/__tests__/custom-profile-ensure.test.ts +5 -1
  94. package/src/__tests__/default-plugin-names-guard.test.ts +12 -1
  95. package/src/__tests__/discord-access-request-privacy.test.ts +5 -1
  96. package/src/__tests__/discord-requester-notice-privacy.test.ts +3 -3
  97. package/src/__tests__/document-append-idempotency.test.ts +233 -0
  98. package/src/__tests__/document-sync-tags.test.ts +0 -75
  99. package/src/__tests__/dynamic-skill-background-guard.test.ts +0 -2
  100. package/src/__tests__/edit-propagation.test.ts +107 -11
  101. package/src/__tests__/file-ops-service.test.ts +163 -30
  102. package/src/__tests__/filesystem-tools.test.ts +23 -24
  103. package/src/__tests__/gateway-only-guard.test.ts +2 -5
  104. package/src/__tests__/helpers/gateway-classify-mock.ts +27 -6
  105. package/src/__tests__/helpers/mock-actor-context.ts +49 -0
  106. package/src/__tests__/helpers/mock-conversation.ts +13 -1
  107. package/src/__tests__/host-file-read-tool.test.ts +16 -19
  108. package/src/__tests__/http-user-message-parity.test.ts +1 -1
  109. package/src/__tests__/init-feature-flag-overrides.test.ts +49 -0
  110. package/src/__tests__/injector-chain.test.ts +63 -41
  111. package/src/__tests__/injector-disk-pressure.test.ts +11 -23
  112. package/src/__tests__/inline-skill-load-permissions.test.ts +47 -36
  113. package/src/__tests__/llm-context-resolution.test.ts +73 -1
  114. package/src/__tests__/llm-schema.test.ts +5 -2
  115. package/src/__tests__/managed-skill-lifecycle.test.ts +7 -0
  116. package/src/__tests__/mcp-list-plugin-servers.test.ts +250 -0
  117. package/src/__tests__/media-generate-image.test.ts +131 -21
  118. package/src/__tests__/memory-retrieval-hook.test.ts +100 -7
  119. package/src/__tests__/messages-read-boundary-guard.test.ts +134 -0
  120. package/src/__tests__/mtime-cache.test.ts +3 -1
  121. package/src/__tests__/non-member-access-request.test.ts +0 -20
  122. package/src/__tests__/outbound-slack-persistence.test.ts +40 -1
  123. package/src/__tests__/platform-bash-auto-approve.test.ts +0 -4
  124. package/src/__tests__/plugin-api-store-credential.test.ts +261 -0
  125. package/src/__tests__/plugin-api-webhook-url.test.ts +10 -7
  126. package/src/__tests__/plugin-disabled-state.test.ts +2 -0
  127. package/src/__tests__/plugin-effective-enabled-set.test.ts +55 -3
  128. package/src/__tests__/plugin-execution-context.test.ts +73 -0
  129. package/src/__tests__/plugin-import-boundary-guard.test.ts +5 -1
  130. package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +7 -4
  131. package/src/__tests__/plugin-secret-pattern-contribution.test.ts +1 -1
  132. package/src/__tests__/post-compaction-reinjection-idempotency.test.ts +14 -7
  133. package/src/__tests__/provider-commit-message-generator.test.ts +20 -0
  134. package/src/__tests__/proxy-approval-callback.test.ts +1 -0
  135. package/src/__tests__/qdrant-manager.test.ts +14 -1
  136. package/src/__tests__/reaction-persistence.test.ts +200 -7
  137. package/src/__tests__/require-fresh-approval.test.ts +0 -4
  138. package/src/__tests__/risk-classification-boundary-guard.test.ts +115 -0
  139. package/src/__tests__/run-conversation-turn-persistence.test.ts +460 -105
  140. package/src/__tests__/run-due-schedules.test.ts +21 -0
  141. package/src/__tests__/scaffold-managed-skill-tool.test.ts +187 -18
  142. package/src/__tests__/schedule-routes.test.ts +23 -0
  143. package/src/__tests__/schedule-store.test.ts +17 -0
  144. package/src/__tests__/scoped-approval-grants.test.ts +11 -6
  145. package/src/__tests__/secret-ingress-channel.test.ts +0 -1
  146. package/src/__tests__/secret-ingress-http.test.ts +1 -1
  147. package/src/__tests__/send-endpoint-busy.test.ts +3 -3
  148. package/src/__tests__/skills.test.ts +32 -0
  149. package/src/__tests__/slack-edit-ordering-characterization.test.ts +0 -1
  150. package/src/__tests__/starter-task-flow.test.ts +5 -4
  151. package/src/__tests__/subagent-call-site-routing.test.ts +31 -19
  152. package/src/__tests__/subagent-fork-prompt-role.test.ts +1 -1
  153. package/src/__tests__/subagent-spawn-and-await.test.ts +18 -17
  154. package/src/__tests__/subagent-tool-gate-mode.test.ts +1 -1
  155. package/src/__tests__/subagent-tools.test.ts +81 -101
  156. package/src/__tests__/surface-completion-in-flight-snapshot.test.ts +1 -0
  157. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +1 -1
  158. package/src/__tests__/tool-executor-lifecycle-events.test.ts +132 -5
  159. package/src/__tests__/tool-executor.test.ts +68 -39
  160. package/src/__tests__/turn-events-store.test.ts +43 -0
  161. package/src/__tests__/ui-choice-copy-surfaces.test.ts +1 -1
  162. package/src/__tests__/ui-shape-teaching.test.ts +33 -0
  163. package/src/__tests__/ui-visual-surface.test.ts +1 -1
  164. package/src/__tests__/ui-voice-picker-surface.test.ts +128 -0
  165. package/src/__tests__/ui-work-result-surface.test.ts +1 -1
  166. package/src/__tests__/user-plugin-loader.test.ts +3 -1
  167. package/src/__tests__/verification-control-plane-policy.test.ts +0 -2
  168. package/src/__tests__/visible-app-context.test.ts +16 -9
  169. package/src/__tests__/voice-config-update.test.ts +40 -0
  170. package/src/__tests__/voice-scoped-grant-consumer.test.ts +5 -3
  171. package/src/__tests__/voice-session-bridge.test.ts +85 -29
  172. package/src/__tests__/worker-entrypoint-guards.test.ts +54 -0
  173. package/src/__tests__/worker-plugin-surface.test.ts +77 -0
  174. package/src/__tests__/workspace-migration-142-consolidate-voice-front-door.test.ts +158 -0
  175. package/src/__tests__/workspace-migration-143-repair-deprecated-codex-model-id.test.ts +133 -0
  176. package/src/__tests__/workspace-migration-144-convert-stranded-subscription-openai-profiles.test.ts +316 -0
  177. package/src/__tests__/workspace-migration-145-collapse-profile-bindings-to-entries.test.ts +325 -0
  178. package/src/__tests__/workspace-migration-146-repair-retired-fireworks-deepseek-flash-model-id.test.ts +235 -0
  179. package/src/acp/__tests__/acp-claude-oauth.test.ts +10 -2
  180. package/src/acp/__tests__/auth-required.test.ts +161 -0
  181. package/src/acp/acp-claude-oauth.ts +19 -2
  182. package/src/acp/agent-process.test.ts +100 -0
  183. package/src/acp/agent-process.ts +29 -26
  184. package/src/acp/auth-required.ts +102 -0
  185. package/src/acp/session-manager.test.ts +119 -0
  186. package/src/acp/session-manager.ts +76 -3
  187. package/src/api/events/acp-auth-required.ts +55 -0
  188. package/src/api/events/host-file.ts +2 -2
  189. package/src/api/index.ts +7 -0
  190. package/src/api/surfaces.ts +12 -3
  191. package/src/apps/app-store.ts +3 -0
  192. package/src/bundler/package-resolver.ts +2 -30
  193. package/src/calls/__tests__/voice-session-bridge.test.ts +194 -11
  194. package/src/calls/__tests__/voice-triage-escalate.test.ts +102 -0
  195. package/src/calls/call-controller.ts +19 -3
  196. package/src/calls/call-setup-flow.ts +0 -1
  197. package/src/calls/media-stream-stt-session.ts +15 -0
  198. package/src/calls/voice-session-bridge.ts +115 -41
  199. package/src/calls/voice-triage-escalate.ts +105 -2
  200. package/src/channels/__tests__/plugin-channel-declarations.test.ts +161 -0
  201. package/src/channels/config.ts +13 -0
  202. package/src/channels/plugin-channel-declarations.ts +108 -0
  203. package/src/channels/types.ts +30 -0
  204. package/src/cli/AGENTS.md +5 -2
  205. package/src/cli/bundled-modules.ts +29 -0
  206. package/src/cli/commands/credentials.help.ts +2 -2
  207. package/src/cli/commands/db/repair.ts +4 -8
  208. package/src/cli/commands/domain.ts +6 -3
  209. package/src/cli/commands/email.ts +6 -3
  210. package/src/cli/commands/inference-providers.ts +1 -1
  211. package/src/cli/commands/keys.ts +8 -3
  212. package/src/cli/commands/mcp.help.ts +13 -4
  213. package/src/cli/commands/mcp.ts +9 -0
  214. package/src/cli/commands/memory/__tests__/memory-v2.test.ts +57 -7
  215. package/src/cli/commands/memory/__tests__/memory-v3.test.ts +128 -5
  216. package/src/cli/commands/memory/index.help.ts +84 -28
  217. package/src/cli/commands/memory/index.ts +2 -0
  218. package/src/cli/commands/memory/memory-v2.ts +58 -54
  219. package/src/cli/commands/memory/memory-v3.ts +64 -0
  220. package/src/cli/commands/memory/memory-validate.ts +18 -0
  221. package/src/cli/commands/plugins.ts +85 -36
  222. package/src/cli/commands/schedules.ts +35 -1
  223. package/src/cli/commands/stt.help.ts +27 -2
  224. package/src/cli/commands/trust.ts +3 -14
  225. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +39 -0
  226. package/src/cli/lib/bundled-marketplace.json +14 -1
  227. package/src/cli/lib/upgrade-plugin.ts +42 -0
  228. package/src/config/__tests__/balanced-model-experiment.test.ts +278 -0
  229. package/src/config/__tests__/default-profile-catalog.test.ts +34 -2
  230. package/src/config/__tests__/default-provider.test.ts +6 -1
  231. package/src/config/__tests__/profile-materialization.test.ts +75 -19
  232. package/src/config/assistant-feature-flags.ts +36 -15
  233. package/src/config/balanced-model-experiment.ts +35 -0
  234. package/src/config/bundled-skills/acp/SKILL.md +6 -7
  235. package/src/config/bundled-skills/document-editor/SKILL.md +2 -2
  236. package/src/config/bundled-skills/document-editor/TOOLS.json +2 -2
  237. package/src/config/bundled-skills/image-studio/SKILL.md +5 -4
  238. package/src/config/bundled-skills/image-studio/TOOLS.json +1 -1
  239. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +101 -0
  240. package/src/config/bundled-skills/media-processing/services/preprocess.ts +14 -4
  241. package/src/config/bundled-skills/settings/TOOLS.json +3 -3
  242. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.test.ts +65 -0
  243. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +7 -1
  244. package/src/config/bundled-skills/settings/tools/shared.ts +16 -0
  245. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +19 -1
  246. package/src/config/bundled-skills/skill-management/TOOLS.json +9 -3
  247. package/src/config/bundled-skills/subagent/SKILL.md +17 -12
  248. package/src/config/bundled-skills/subagent/TOOLS.json +4 -4
  249. package/src/config/bundled-skills/transcribe/tools/transcribe-media.test.ts +22 -1
  250. package/src/config/bundled-skills/transcribe/tools/transcribe-media.ts +9 -2
  251. package/src/config/call-site-defaults.ts +11 -5
  252. package/src/config/default-profile-catalog.ts +179 -16
  253. package/src/config/default-profile-names.ts +4 -1
  254. package/src/config/default-provider-resolution.ts +4 -0
  255. package/src/config/feature-flag-registry.json +12 -12
  256. package/src/config/llm-context-resolution.ts +11 -3
  257. package/src/config/llm-resolver.ts +28 -1
  258. package/src/config/profile-materialization.ts +70 -22
  259. package/src/config/schemas/__tests__/live-voice.test.ts +107 -4
  260. package/src/config/schemas/call-site-catalog.ts +4 -4
  261. package/src/config/schemas/live-voice.ts +57 -23
  262. package/src/config/schemas/llm.ts +59 -32
  263. package/src/config/schemas/mcp.ts +23 -0
  264. package/src/config/schemas/plugin-updates.ts +6 -2
  265. package/src/config/schemas/stt.ts +1 -0
  266. package/src/config/skills.ts +9 -2
  267. package/src/context/outbound-sanitize.ts +96 -1
  268. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +1 -1
  269. package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +82 -0
  270. package/src/daemon/conversation-agent-loop-handlers.ts +15 -10
  271. package/src/daemon/conversation-agent-loop.ts +31 -19
  272. package/src/daemon/conversation-messaging.ts +5 -1
  273. package/src/daemon/conversation-notifiers.ts +20 -10
  274. package/src/daemon/conversation-process.ts +20 -6
  275. package/src/daemon/conversation-runtime-assembly.ts +12 -6
  276. package/src/daemon/conversation-store.ts +14 -4
  277. package/src/daemon/conversation-surfaces.ts +75 -26
  278. package/src/daemon/conversation-tool-setup.ts +3 -6
  279. package/src/daemon/conversation.ts +154 -51
  280. package/src/daemon/doordash-steps.ts +2 -2
  281. package/src/daemon/lifecycle.ts +14 -1
  282. package/src/daemon/mcp-reload-service.ts +36 -6
  283. package/src/daemon/process-message.ts +13 -26
  284. package/src/daemon/providers-setup.ts +6 -3
  285. package/src/daemon/trust-context-types.ts +29 -0
  286. package/src/daemon/trust-context.ts +12 -7
  287. package/src/daemon/wake-conversation-ops.ts +3 -2
  288. package/src/daemon/windows-compiled-entry.ts +4 -0
  289. package/src/documents/document-store.ts +143 -240
  290. package/src/hooks/hook-loader.ts +3 -3
  291. package/src/hooks/registry.ts +103 -45
  292. package/src/hooks/types.ts +5 -0
  293. package/src/inbound/__tests__/oauth-callback-url.test.ts +83 -0
  294. package/src/inbound/oauth-callback-url.ts +61 -0
  295. package/src/ipc/gateway-client.test.ts +1 -1
  296. package/src/ipc/gateway-client.ts +14 -21
  297. package/src/ipc/gateway-flag-listener.ts +17 -3
  298. package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +1 -104
  299. package/src/live-voice/__tests__/live-voice-events.test.ts +7 -8
  300. package/src/live-voice/__tests__/live-voice-flux-turn-end.test.ts +1050 -0
  301. package/src/live-voice/__tests__/live-voice-metrics.test.ts +115 -8
  302. package/src/live-voice/__tests__/live-voice-photo.test.ts +100 -0
  303. package/src/live-voice/__tests__/live-voice-progress.test.ts +60 -194
  304. package/src/live-voice/__tests__/live-voice-stt.test.ts +14 -0
  305. package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +29 -0
  306. package/src/live-voice/__tests__/live-voice-tts-session.test.ts +0 -483
  307. package/src/live-voice/__tests__/live-voice-vad.test.ts +0 -16
  308. package/src/live-voice/__tests__/progress-narration.test.ts +214 -0
  309. package/src/live-voice/live-voice-archive.ts +2 -0
  310. package/src/live-voice/live-voice-manager.ts +16 -3
  311. package/src/live-voice/live-voice-metrics.ts +57 -32
  312. package/src/live-voice/live-voice-photo.ts +1 -2
  313. package/src/live-voice/live-voice-session.ts +598 -323
  314. package/src/live-voice/progress-narration.ts +277 -0
  315. package/src/live-voice/protocol.ts +21 -1
  316. package/src/live-voice/windows-compiled-live-voice.ts +4 -0
  317. package/src/mcp/__tests__/effective-config.test.ts +238 -0
  318. package/src/mcp/__tests__/mcp-auth-orchestrator.test.ts +0 -1
  319. package/src/mcp/__tests__/mcp-oauth-client-registration.test.ts +200 -0
  320. package/src/mcp/__tests__/mcp-oauth-provider.test.ts +9 -9
  321. package/src/mcp/__tests__/plugin-server-credential-isolation.test.ts +95 -0
  322. package/src/mcp/client.ts +16 -11
  323. package/src/mcp/effective-config.ts +113 -0
  324. package/src/mcp/manager.ts +11 -6
  325. package/src/mcp/mcp-auth-orchestrator.ts +13 -22
  326. package/src/mcp/mcp-oauth-provider.ts +205 -240
  327. package/src/monitoring/__tests__/plugin-auto-update.test.ts +166 -3
  328. package/src/monitoring/control.ts +1 -0
  329. package/src/monitoring/db-integrity-sample.ts +4 -5
  330. package/src/monitoring/plugin-auto-update.ts +128 -24
  331. package/src/notifications/AGENTS.md +2 -0
  332. package/src/notifications/approval-card-data.ts +33 -0
  333. package/src/notifications/signal.ts +1 -0
  334. package/src/permissions/AGENTS.md +16 -0
  335. package/src/permissions/checker.test.ts +75 -122
  336. package/src/permissions/checker.ts +44 -560
  337. package/src/permissions/confirmation-guardian-request.test.ts +15 -11
  338. package/src/permissions/confirmation-guardian-request.ts +2 -2
  339. package/src/permissions/prompter.ts +1 -5
  340. package/src/permissions/question-guardian-request.test.ts +14 -6
  341. package/src/permissions/question-guardian-request.ts +1 -2
  342. package/src/persistence/attachments-store.ts +8 -1
  343. package/src/persistence/bookmark-crud.ts +3 -7
  344. package/src/persistence/conversation-attention-store.ts +16 -45
  345. package/src/persistence/conversation-crud.ts +33 -4
  346. package/src/persistence/conversation-lineage.ts +9 -0
  347. package/src/persistence/conversation-queries.ts +182 -52
  348. package/src/persistence/delivery-crud.ts +150 -36
  349. package/src/persistence/embeddings/qdrant-manager.ts +84 -49
  350. package/src/persistence/external-conversation-store.ts +32 -4
  351. package/src/persistence/llm-request-log-store.ts +4 -10
  352. package/src/persistence/llm-usage-store.ts +8 -3
  353. package/src/persistence/message-reads.test.ts +197 -0
  354. package/src/persistence/message-reads.ts +211 -0
  355. package/src/persistence/migrations/360-add-document-workspace-path.ts +5 -14
  356. package/src/persistence/migrations/366-chatgpt-subscription-row-identity.test.ts +120 -0
  357. package/src/persistence/migrations/366-chatgpt-subscription-row-identity.ts +62 -0
  358. package/src/persistence/real-user-turn-filter.ts +27 -3
  359. package/src/persistence/schema/documents.ts +4 -4
  360. package/src/persistence/steps.ts +9 -0
  361. package/src/plugin-api/__tests__/oauth-callback-url-export.test.ts +29 -0
  362. package/src/plugin-api/constants.ts +8 -0
  363. package/src/plugin-api/conversation-turn.ts +195 -5
  364. package/src/plugin-api/index.ts +38 -6
  365. package/src/plugin-api/resolve-credential.ts +3 -2
  366. package/src/plugin-api/store-credential.ts +146 -0
  367. package/src/plugin-api/vision-support.test.ts +1 -1
  368. package/src/plugin-api/webhook-url.ts +13 -11
  369. package/src/plugins/__tests__/mcp-servers.test.ts +371 -0
  370. package/src/plugins/defaults/main.ts +21 -7
  371. package/src/plugins/defaults/memory/AGENTS.md +15 -3
  372. package/src/plugins/defaults/memory/__tests__/buffer-format.test.ts +204 -0
  373. package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +72 -0
  374. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +4 -1
  375. package/src/plugins/defaults/memory/__tests__/memory-retrospective-provider-path.test.ts +4 -1
  376. package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +0 -1
  377. package/src/plugins/defaults/memory/buffer-format.ts +165 -0
  378. package/src/plugins/defaults/memory/context-search/sources/conversations.ts +6 -0
  379. package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +77 -0
  380. package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +24 -6
  381. package/src/plugins/defaults/memory/graph/image-ref-utils.ts +3 -0
  382. package/src/plugins/defaults/memory/graph/tool-handlers.ts +1 -30
  383. package/src/plugins/defaults/memory/graph-topology/pending-buffer.test.ts +34 -0
  384. package/src/plugins/defaults/memory/graph-topology/pending-buffer.ts +17 -24
  385. package/src/plugins/defaults/memory/hooks/post-compact.ts +1 -4
  386. package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +53 -5
  387. package/src/plugins/defaults/memory/indexer.ts +3 -1
  388. package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +19 -7
  389. package/src/plugins/defaults/memory/memory-retrospective-job.ts +4 -4
  390. package/src/plugins/defaults/memory/src/__tests__/memory-v3-gate-stats.test.ts +281 -0
  391. package/src/plugins/defaults/memory/src/memory-v2-routes.ts +12 -10
  392. package/src/plugins/defaults/memory/src/memory-v3-routes.ts +207 -0
  393. package/src/plugins/defaults/memory/substrate/__tests__/consolidation-job.test.ts +147 -0
  394. package/src/plugins/defaults/memory/substrate/__tests__/consolidation-prompt-flag-gating-guard.test.ts +8 -0
  395. package/src/plugins/defaults/memory/substrate/__tests__/edge-index.test.ts +0 -30
  396. package/src/plugins/defaults/memory/substrate/__tests__/ingest.test.ts +73 -1
  397. package/src/plugins/defaults/memory/substrate/__tests__/page-index.test.ts +37 -0
  398. package/src/plugins/defaults/memory/substrate/__tests__/page-links.test.ts +208 -0
  399. package/src/plugins/defaults/memory/substrate/__tests__/prompts-consolidation.test.ts +158 -1
  400. package/src/plugins/defaults/memory/substrate/__tests__/static-context.test.ts +195 -58
  401. package/src/plugins/defaults/memory/substrate/consolidation-job.ts +93 -24
  402. package/src/plugins/defaults/memory/substrate/edge-index.ts +0 -31
  403. package/src/plugins/defaults/memory/substrate/ingest.ts +59 -0
  404. package/src/plugins/defaults/memory/substrate/page-index.ts +35 -8
  405. package/src/plugins/defaults/memory/substrate/page-links.ts +133 -0
  406. package/src/plugins/defaults/memory/substrate/page-store.ts +10 -0
  407. package/src/plugins/defaults/memory/substrate/prompts/consolidation.ts +124 -34
  408. package/src/plugins/defaults/memory/substrate/skill-content.ts +8 -1
  409. package/src/plugins/defaults/memory/substrate/static-context.ts +160 -33
  410. package/src/plugins/defaults/memory/substrate/sweep-job.ts +2 -4
  411. package/src/plugins/defaults/memory/v1/graph/extraction.ts +3 -1
  412. package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +18 -0
  413. package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +66 -1
  414. package/src/plugins/defaults/memory/v3/card.ts +9 -9
  415. package/src/plugins/defaults/memory/v3/core-set.test.ts +7 -0
  416. package/src/plugins/defaults/memory/v3/core-set.ts +5 -1
  417. package/src/plugins/defaults/memory/v3/edge.ts +13 -57
  418. package/src/plugins/defaults/memory/v3/injector.ts +8 -0
  419. package/src/plugins/defaults/memory/v3/prune.ts +2 -0
  420. package/src/plugins/defaults/memory/v3/selection-log-store.ts +2 -0
  421. package/src/plugins/defaults/memory/v3/shadow-plugin.ts +23 -9
  422. package/src/plugins/defaults/memory/worker-control.ts +1 -0
  423. package/src/plugins/defaults/memory/worker.ts +6 -3
  424. package/src/plugins/defaults/worker-entrypoints.ts +3 -0
  425. package/src/plugins/external-plugin-loader.ts +47 -0
  426. package/src/plugins/mcp-servers.ts +361 -0
  427. package/src/plugins/mtime-cache.ts +37 -46
  428. package/src/plugins/pipeline.ts +14 -7
  429. package/src/plugins/plugin-execution-context.ts +35 -11
  430. package/src/plugins/worker-plugin-surface.ts +33 -0
  431. package/src/prompts/templates/system-sections.ts +0 -7
  432. package/src/providers/__tests__/connection-model-compat.test.ts +1 -1
  433. package/src/providers/__tests__/context-overflow-error.test.ts +24 -0
  434. package/src/providers/__tests__/dispatch-connection-routing.test.ts +214 -2
  435. package/src/providers/__tests__/preflight-resolved-config.test.ts +57 -0
  436. package/src/providers/__tests__/retry-callsite.test.ts +25 -2
  437. package/src/providers/anthropic/__tests__/pause-turn-continuation.test.ts +170 -0
  438. package/src/providers/anthropic/client.ts +332 -241
  439. package/src/providers/call-site-routing.ts +30 -3
  440. package/src/providers/connection-resolution.ts +194 -11
  441. package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +4 -0
  442. package/src/providers/inference/adapter-factory.ts +3 -0
  443. package/src/providers/inference/auth.ts +6 -0
  444. package/src/providers/inference/connection-availability.ts +24 -2
  445. package/src/providers/inference/connections.ts +2 -0
  446. package/src/providers/model-catalog.ts +3 -3
  447. package/src/providers/model-intents.ts +28 -8
  448. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +163 -40
  449. package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +125 -2
  450. package/src/providers/openai/chat-completions-provider.ts +133 -36
  451. package/src/providers/openai/codex-models.ts +2 -1
  452. package/src/providers/provider-send-message.ts +32 -3
  453. package/src/providers/speech-to-text/__tests__/deepgram-flux-frames.test.ts +433 -0
  454. package/src/providers/speech-to-text/__tests__/deepgram-flux-realtime.test.ts +625 -0
  455. package/src/providers/speech-to-text/__tests__/provider-catalog.test.ts +34 -0
  456. package/src/providers/speech-to-text/__tests__/resolve.test.ts +285 -6
  457. package/src/providers/speech-to-text/deepgram-flux-frames.ts +395 -0
  458. package/src/providers/speech-to-text/deepgram-flux-realtime.ts +679 -0
  459. package/src/providers/speech-to-text/provider-catalog.ts +99 -8
  460. package/src/providers/speech-to-text/resolve.ts +25 -2
  461. package/src/routes/control.ts +1 -0
  462. package/src/routes/route-host-client.ts +1 -0
  463. package/src/routes/route-host-protocol.ts +7 -0
  464. package/src/routes/worker.ts +48 -15
  465. package/src/runtime/AGENTS.md +16 -17
  466. package/src/runtime/access-request-helper.ts +9 -12
  467. package/src/runtime/agent-wake.ts +18 -15
  468. package/src/runtime/effective-capabilities.test.ts +43 -0
  469. package/src/runtime/effective-capabilities.ts +27 -0
  470. package/src/runtime/guardian-reply-router.ts +6 -2
  471. package/src/runtime/pre-first-message-gate.ts +4 -0
  472. package/src/runtime/routes/__tests__/acp-claude-auth-routes.test.ts +12 -4
  473. package/src/runtime/routes/__tests__/conversation-list-routes.test.ts +522 -2
  474. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +52 -0
  475. package/src/runtime/routes/__tests__/default-provider-routes.test.ts +61 -0
  476. package/src/runtime/routes/__tests__/inference-profiles-routes.test.ts +44 -0
  477. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +102 -1
  478. package/src/runtime/routes/__tests__/plugins-routes.test.ts +132 -35
  479. package/src/runtime/routes/__tests__/schedule-routes-disarm-reason.test.ts +215 -0
  480. package/src/runtime/routes/__tests__/stt-routes.test.ts +25 -0
  481. package/src/runtime/routes/__tests__/surface-action-routes.test.ts +55 -6
  482. package/src/runtime/routes/__tests__/user-route-dispatcher-host.test.ts +52 -1
  483. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +133 -1
  484. package/src/runtime/routes/channel-availability-routes.ts +32 -14
  485. package/src/runtime/routes/channel-route-shared.ts +0 -6
  486. package/src/runtime/routes/chatgpt-subscription-auth-routes.ts +6 -6
  487. package/src/runtime/routes/conversation-list-routes.ts +181 -23
  488. package/src/runtime/routes/conversation-management-routes.ts +17 -12
  489. package/src/runtime/routes/conversation-query-routes.ts +40 -27
  490. package/src/runtime/routes/conversation-routes.ts +43 -29
  491. package/src/runtime/routes/credential-prompt-routes.ts +4 -7
  492. package/src/runtime/routes/credential-routes.ts +26 -82
  493. package/src/runtime/routes/default-provider-routes.ts +15 -0
  494. package/src/runtime/routes/documents-routes.ts +3 -222
  495. package/src/runtime/routes/inbound-message-handler.ts +21 -45
  496. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +0 -1
  497. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +0 -9
  498. package/src/runtime/routes/inbound-stages/admission-policy.ts +1 -17
  499. package/src/runtime/routes/inbound-stages/bootstrap-intercept.test.ts +0 -1
  500. package/src/runtime/routes/inbound-stages/bootstrap-intercept.ts +2 -3
  501. package/src/runtime/routes/inbound-stages/edit-intercept.ts +101 -79
  502. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.test.ts +0 -1
  503. package/src/runtime/routes/inbound-stages/guardian-reply-intercept.ts +12 -7
  504. package/src/runtime/routes/inbound-stages/reaction-intercept.test.ts +91 -8
  505. package/src/runtime/routes/inbound-stages/reaction-intercept.ts +72 -79
  506. package/src/runtime/routes/inbound-stages/secret-ingress-check.ts +2 -3
  507. package/src/runtime/routes/inference-profiles-routes.ts +20 -11
  508. package/src/runtime/routes/inference-provider-connection-routes.ts +77 -15
  509. package/src/runtime/routes/log-export-routes.ts +3 -0
  510. package/src/runtime/routes/mcp-auth-routes.ts +148 -57
  511. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +2 -0
  512. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +3 -0
  513. package/src/runtime/routes/playground/inject-failures.ts +2 -2
  514. package/src/runtime/routes/playground/reset-circuit.ts +1 -1
  515. package/src/runtime/routes/plugins-routes.ts +38 -8
  516. package/src/runtime/routes/schedule-routes.ts +94 -7
  517. package/src/runtime/routes/settings-routes.ts +6 -6
  518. package/src/runtime/routes/stt-routes.ts +31 -25
  519. package/src/runtime/routes/surface-action-routes.ts +20 -19
  520. package/src/runtime/routes/surface-conversation-resolver.ts +3 -0
  521. package/src/runtime/routes/user-route-dispatcher.ts +69 -15
  522. package/src/runtime/routes/user-route-import.ts +108 -0
  523. package/src/runtime/routes/user-route-resolution.ts +18 -1
  524. package/src/runtime/routes/workspace-routes.ts +0 -9
  525. package/src/runtime/routes/workspace-utils.ts +3 -13
  526. package/src/runtime/services/conversation-serializer.ts +7 -2
  527. package/src/schedule/__tests__/plugin-schedule-declarations.test.ts +68 -5
  528. package/src/schedule/__tests__/plugin-schedule-reconciler.test.ts +81 -0
  529. package/src/schedule/plugin-schedule-availability.ts +58 -0
  530. package/src/schedule/plugin-schedule-declarations.ts +23 -27
  531. package/src/schedule/plugin-schedule-reconciler.ts +12 -3
  532. package/src/schedule/schedule-store.ts +5 -1
  533. package/src/schedule/scheduler.ts +9 -4
  534. package/src/schedule/worker-control.ts +1 -0
  535. package/src/schedule/worker.ts +6 -0
  536. package/src/security/oauth2.ts +6 -22
  537. package/src/stt/__tests__/daemon-batch-transcriber.test.ts +22 -0
  538. package/src/stt/__tests__/types.test.ts +94 -0
  539. package/src/stt/daemon-batch-transcriber.ts +10 -0
  540. package/src/stt/stt-stream-session.ts +8 -4
  541. package/src/stt/types.ts +103 -0
  542. package/src/subagent/__tests__/consult-prompt.test.ts +26 -15
  543. package/src/subagent/consult-context.ts +11 -11
  544. package/src/subagent/consult-prompt.ts +26 -35
  545. package/src/subagent/manager.ts +21 -40
  546. package/src/subagent/notify.ts +7 -1
  547. package/src/subagent/types.ts +15 -12
  548. package/src/tools/__tests__/tool-input-schemas.test.ts +7 -7
  549. package/src/tools/acp/spawn.test.ts +97 -0
  550. package/src/tools/acp/spawn.ts +38 -4
  551. package/src/tools/credentials/ref-parse.ts +35 -0
  552. package/src/tools/credentials/resolve.ts +4 -10
  553. package/src/tools/credentials/store.ts +168 -0
  554. package/src/tools/document/document-tool.ts +12 -3
  555. package/src/tools/executor.ts +53 -15
  556. package/src/tools/filesystem/read.ts +27 -10
  557. package/src/tools/host-filesystem/read.ts +27 -15
  558. package/src/tools/network/url-safety.ts +9 -16
  559. package/src/tools/permission-checker.ts +43 -52
  560. package/src/tools/registry.ts +2 -1
  561. package/src/tools/shared/filesystem/file-ops-service.ts +63 -35
  562. package/src/tools/shared/filesystem/legacy-read-args.ts +22 -0
  563. package/src/tools/shared/filesystem/types.ts +5 -5
  564. package/src/tools/skills/scaffold-managed.ts +25 -7
  565. package/src/tools/subagent/spawn.ts +28 -88
  566. package/src/tools/tool-types.ts +26 -13
  567. package/src/tools/types.ts +6 -6
  568. package/src/tools/ui-surface/surface-shape-docs.ts +12 -1
  569. package/src/tools/workflows/run-workflow.ts +1 -2
  570. package/src/tts/__tests__/reasoning-tag-filter.test.ts +78 -0
  571. package/src/tts/reasoning-tag-filter.ts +89 -0
  572. package/src/util/__tests__/worker-process-command.test.ts +37 -0
  573. package/src/util/logger.ts +16 -0
  574. package/src/util/think-tag-stream.ts +95 -0
  575. package/src/util/worker-process.ts +37 -4
  576. package/src/windows-compiled-cli.ts +32 -0
  577. package/src/windows-compiled-entry.ts +4 -0
  578. package/src/windows-compiled-logger.ts +6 -0
  579. package/src/windows-compiled-worker-entry.ts +29 -0
  580. package/src/workspace/byok-default-profile-ensure.ts +76 -24
  581. package/src/workspace/custom-profile-ensure.ts +4 -24
  582. package/src/workspace/migrations/142-consolidate-voice-front-door.ts +70 -0
  583. package/src/workspace/migrations/143-repair-deprecated-codex-model-id.ts +134 -0
  584. package/src/workspace/migrations/144-convert-stranded-subscription-openai-profiles.ts +265 -0
  585. package/src/workspace/migrations/145-collapse-profile-bindings-to-entries.ts +328 -0
  586. package/src/workspace/migrations/146-repair-retired-fireworks-deepseek-flash-model-id.ts +195 -0
  587. package/src/workspace/migrations/__tests__/141-stt-english-default-to-multilingual.test.ts +0 -10
  588. package/src/workspace/migrations/registry.ts +10 -0
  589. package/src/workspace/provider-commit-message-generator.ts +7 -5
  590. package/src/__tests__/document-workspace-file.test.ts +0 -467
  591. package/src/live-voice/__tests__/front-decision.test.ts +0 -645
  592. package/src/live-voice/front-decision.ts +0 -476
  593. package/src/permissions/ipc-risk-types.ts +0 -143
  594. package/src/permissions/risk-types.ts +0 -76
  595. package/src/subagent/__tests__/consult-transcript.test.ts +0 -184
  596. package/src/subagent/consult-transcript.ts +0 -90
@@ -5,20 +5,18 @@ import { validateInferenceProfileKey } from "../../config/inference-profile-vali
5
5
  import { getConfig } from "../../config/loader.js";
6
6
  import { profileSupportsTools } from "../../config/profile-tool-support.js";
7
7
  import { findConversation } from "../../daemon/conversation-registry.js";
8
- import { getMessages } from "../../persistence/conversation-crud.js";
9
8
  import {
10
9
  countRecentSimilarSpawns,
11
10
  normalizeSpawnObjective,
12
11
  type RecentSimilarSpawns,
13
12
  type SimilarSpawnTally,
14
13
  } from "../../persistence/subagent-store.js";
15
- import type { ContentBlock, Message } from "../../providers/types.js";
14
+ import type { Message } from "../../providers/types.js";
16
15
  import { buildAdvisorContext } from "../../subagent/consult-context.js";
17
16
  import {
18
17
  advisorRequestText,
19
18
  buildAdvisorSystem,
20
19
  } from "../../subagent/consult-prompt.js";
21
- import { sanitizeConsultTranscript } from "../../subagent/consult-transcript.js";
22
20
  import {
23
21
  getSubagentManager,
24
22
  SubagentAbortedError,
@@ -49,7 +47,7 @@ const log = getLogger("subagent-spawn");
49
47
  * reasoning while it works, so a fixed wall-clock ceiling would kill it
50
48
  * mid-thought; an idle window instead fires only when the consult is genuinely
51
49
  * stalled (or never starts). Generous enough to also span time-to-first-token
52
- * over a large inherited transcript.
50
+ * on a slow reasoning profile.
53
51
  */
54
52
  const ADVISOR_IDLE_TIMEOUT_MS = 60_000;
55
53
 
@@ -540,13 +538,19 @@ function inFlightGuardResult(
540
538
  // ── Advisor consult ──────────────────────────────────────────────────
541
539
 
542
540
  /**
543
- * Run the `advisor` role as a synchronous, context-inheriting, stronger-model
544
- * consult and return its guidance as the tool result.
541
+ * Run the `advisor` role as a synchronous, stronger-model consult and return
542
+ * its guidance as the tool result.
545
543
  *
546
- * Inherits the parent transcript (sanitized), frames it as advice via
547
- * `buildAdvisorSystem`, and runs on `llm.advisorProfile` (unless the caller
548
- * passed an explicit `inference_profile`) under both the advisor role allowlist
549
- * and `denySideEffectTools`, so the only tools it can reach are the first-party
544
+ * The consult sees only what it is handed: the spawning agent's own `objective`
545
+ * as a written brief, plus the situational context pack from
546
+ * `buildAdvisorContext`. Nothing of the parent conversation's transcript or
547
+ * system prompt travels with it, so a consult costs the brief rather than a
548
+ * re-prefill of the whole chat at premium rates.
549
+ *
550
+ * It is framed as advice via `buildAdvisorSystem` and runs on
551
+ * `llm.advisorProfile` (unless the caller passed an explicit
552
+ * `inference_profile`) under both the advisor role allowlist and
553
+ * `denySideEffectTools`, so the only tools it can reach are the first-party
550
554
  * built-in readers. It is bounded on two axes, because the consult holds up the
551
555
  * user-facing turn while it runs: a progress-aware deadline (an idle window,
552
556
  * `ADVISOR_IDLE_TIMEOUT_MS`, reset on every streamed token and every tool event
@@ -562,7 +566,7 @@ function inFlightGuardResult(
562
566
  async function runAdvisorConsult(args: {
563
567
  context: ToolContext;
564
568
  label: string;
565
- /** The agent's own `objective` — its framing of what it wants advised on. */
569
+ /** The agent's own `objective`: the brief the advisor advises off. */
566
570
  objective: string;
567
571
  sendToClient: (msg: AssistantEvent) => void;
568
572
  requestedOverrideProfile: string | undefined;
@@ -576,35 +580,16 @@ async function runAdvisorConsult(args: {
576
580
  let profileNote: string | undefined;
577
581
 
578
582
  try {
583
+ // The parent conversation is looked up only for its warm skill catalog, so
584
+ // an unresolvable one (e.g. evicted) costs the skills section of the pack
585
+ // and nothing else: the consult itself runs off the brief.
579
586
  const parentConversation = findConversation(context.conversationId);
580
- if (!parentConversation) {
581
- return {
582
- content:
583
- "(advisor unavailable: parent conversation could not be resolved)",
584
- isError: false,
585
- };
586
- }
587
-
588
- // Snapshot the parent's in-memory transcript and system prompt, then append
589
- // the in-flight assistant turn (the plan/text the model wrote THIS turn,
590
- // before calling the advisor). The in-memory array does not yet hold that
591
- // turn — the agent loop only writes it back to `conversation.messages` after
592
- // the turn settles — but it is already persisted to the DB (the assistant
593
- // row is finalized at `message_complete`, which fires before tool execution).
594
- // `sanitizeConsultTranscript` then strips the dangling advisor `tool_use`
595
- // off that final assistant turn so the inherited transcript is provider-safe.
596
- const parentSystemPrompt = parentConversation.getCurrentSystemPrompt();
597
- const withInFlight = appendInFlightAssistantTurn(
598
- [...parentConversation.messages],
599
- context.conversationId,
600
- );
601
- const sanitizedMessages = sanitizeConsultTranscript(withInFlight);
602
587
 
603
588
  // Situational awareness for the advisor: the parent's live tool set, the
604
589
  // full skill catalog, and its workspace. Assembled off the per-turn
605
590
  // ToolContext snapshot (trust, channel) so the personal-memory sections
606
591
  // are gated exactly like the runtime injectors. Best-effort: a null pack
607
- // just means the consult runs on transcript + system prompt alone.
592
+ // just means the consult runs on the brief alone.
608
593
  const situationalContext = await buildAdvisorContext({
609
594
  conversationId: context.conversationId,
610
595
  workingDir: context.workingDir,
@@ -614,7 +599,7 @@ async function runAdvisorConsult(args: {
614
599
  enabledPluginSet: context.enabledPluginSet,
615
600
  // The parent's warm per-turn catalog keeps the synchronous on-disk
616
601
  // catalog scan out of the consult path.
617
- skillCatalog: parentConversation.skillProjectionCache?.catalog,
602
+ skillCatalog: parentConversation?.skillProjectionCache?.catalog,
618
603
  });
619
604
 
620
605
  // Default to the stronger advisor profile when the caller did not pin one;
@@ -623,7 +608,7 @@ async function runAdvisorConsult(args: {
623
608
  let overrideProfile = requestedOverrideProfile ?? config.llm.advisorProfile;
624
609
  // The advisor carries read tools, so a profile the catalog states cannot
625
610
  // call them is handed a surface it can never use and answers from the
626
- // transcript alone. Fall back to the call site's own default and say so
611
+ // brief alone. Fall back to the call site's own default and say so
627
612
  // alongside the guidance, the way a regular spawn reports it. The check is
628
613
  // unconditional, matching the tools it protects, and only a catalog `false`
629
614
  // redirects, so a model the catalog has never heard of is left alone.
@@ -697,16 +682,15 @@ async function runAdvisorConsult(args: {
697
682
  {
698
683
  parentConversationId: context.conversationId,
699
684
  label,
700
- // Carry the agent's own objective into the consult request — the
701
- // agent states the task here, and the inherited transcript can be
702
- // thin. The situational pack rides in the model request only
703
- // (`requestText`), keeping the system prompt minimal and the
704
- // display-facing `objective` free of bulky internal context.
685
+ // The agent's own objective IS the brief the consult runs on, so it
686
+ // carries into the request verbatim. The situational pack rides in
687
+ // the model request only (`requestText`), keeping the system prompt
688
+ // minimal and the display-facing `objective` free of bulky internal
689
+ // context.
705
690
  objective: advisorRequestText(objective),
706
691
  requestText: advisorRequestText(objective, situationalContext),
707
692
  sendResultToUser: false,
708
693
  role: "advisor",
709
- fork: true,
710
694
  // The advisor's read-only guarantee cannot rest on tool NAMES. A
711
695
  // workspace tool may register under `file_read` (registerWorkspaceTools
712
696
  // stashes the built-in and installs its own implementation), and a
@@ -718,10 +702,9 @@ async function runAdvisorConsult(args: {
718
702
  //
719
703
  // The advisor is a ROLE, not an `LLMCallSiteEnum` value, so its usage
720
704
  // lands under `subagentSpawn` like any other subagent. This is what
721
- // makes advisor consults separable from regular forks in telemetry.
705
+ // makes advisor consults separable from regular spawns in telemetry.
722
706
  spawnMode: "advisor_consult",
723
- parentMessages: sanitizedMessages,
724
- systemPromptOverride: buildAdvisorSystem(parentSystemPrompt),
707
+ systemPromptOverride: buildAdvisorSystem(),
725
708
  ...(overrideProfile ? { overrideProfile } : {}),
726
709
  ...(forceOverrideProfile ? { forceOverrideProfile: true } : {}),
727
710
  // A consult is delegated work of the invoking turn, so its spend
@@ -817,46 +800,3 @@ function withAdvisorNote(
817
800
  }
818
801
  return `${guidance}\n\n${present.map((note) => `_(${note})_`).join("\n")}`;
819
802
  }
820
-
821
- /**
822
- * Append the in-flight assistant turn (persisted this turn before the advisor
823
- * tool ran) to an in-memory message snapshot, unless the snapshot already ends
824
- * with it. The latest persisted assistant row carries the plan/text the model
825
- * wrote immediately before calling the advisor plus the dangling advisor
826
- * `tool_use`; `sanitizeConsultTranscript` strips the dangling call.
827
- *
828
- * Best-effort: a malformed or missing row leaves the snapshot unchanged so the
829
- * consult still runs over the in-memory history.
830
- */
831
- function appendInFlightAssistantTurn(
832
- messages: Message[],
833
- conversationId: string,
834
- ): Message[] {
835
- // When the snapshot already ends on an assistant turn, the in-flight turn is
836
- // present (or there is none to add) — appending the latest row would duplicate it.
837
- if (messages[messages.length - 1]?.role === "assistant") {
838
- return messages;
839
- }
840
-
841
- let rows;
842
- try {
843
- rows = getMessages(conversationId);
844
- } catch {
845
- return messages;
846
- }
847
- if (!rows || rows.length === 0) {
848
- return messages;
849
- }
850
-
851
- const lastRow = rows[rows.length - 1];
852
- if (lastRow.role !== "assistant") {
853
- return messages;
854
- }
855
-
856
- const blocks: ContentBlock[] = lastRow.content;
857
-
858
- if (blocks.length === 0) {
859
- return messages;
860
- }
861
- return [...messages, { role: "assistant", content: blocks }];
862
- }
@@ -5,9 +5,10 @@
5
5
  * Pure type-level declarations only (+ the `RiskLevel` enum, which is a
6
6
  * value). No runtime helpers live here — the assistant keeps all behavior
7
7
  * functions in `assistant/src/tools/` and re-exports the types from this
8
- * file. This module imports nothing, so it can sit at the bottom of the
9
- * import graph and be consumed by `tools/types.ts`, `providers/types.ts`,
10
- * and `permissions/types.ts` without creating cycles.
8
+ * file. This module imports nothing from `assistant/src` (only type-only
9
+ * wire shapes from `@vellumai/gateway-client`), so it can sit at the bottom
10
+ * of the import graph and be consumed by `tools/types.ts`,
11
+ * `providers/types.ts`, and `permissions/types.ts` without creating cycles.
11
12
  *
12
13
  * Heavy daemon-internal references (CES client, host-proxy classes, trust
13
14
  * classifications, interface IDs, content blocks, CES `ApprovalRequired`)
@@ -25,6 +26,12 @@
25
26
  // Simple type-level declarations — moved in full
26
27
  // ---------------------------------------------------------------------------
27
28
 
29
+ import type {
30
+ RiskAllowlistOption,
31
+ RiskDirectoryScopeOption,
32
+ RiskPatternScopeOption,
33
+ } from "@vellumai/gateway-client";
34
+
28
35
  export type ExecutionTarget = "sandbox" | "host";
29
36
 
30
37
  /** The kind of extension that owns a tool. Core tools have no owner. */
@@ -49,6 +56,14 @@ export enum RiskLevel {
49
56
  High = "high",
50
57
  }
51
58
 
59
+ /**
60
+ * `riskLevel` recorded on a `tool_invocations` audit row when the call's risk
61
+ * was never classified (classification aborted, or the gateway was
62
+ * unreachable, before any decision was reached). Distinct from every
63
+ * {@link RiskLevel} so a reader can tell "not assessed" from "assessed as low".
64
+ */
65
+ export const RISK_LEVEL_UNCLASSIFIED = "unclassified";
66
+
52
67
  export interface ToolDefinition {
53
68
  name: string;
54
69
  description: string;
@@ -162,7 +177,7 @@ export interface ToolExecutionResult {
162
177
  /** Whether the daemon is running in a containerized (Docker) environment. */
163
178
  isContainerized?: boolean;
164
179
  /** Scope options ladder for the rule editor (narrowest to broadest). */
165
- riskScopeOptions?: Array<{ pattern: string; label: string }>;
180
+ riskScopeOptions?: RiskPatternScopeOption[];
166
181
  }
167
182
 
168
183
  export type ProxyToolResolver = (
@@ -174,16 +189,14 @@ export type ProxyToolResolver = (
174
189
  // Permission prompt option ladders
175
190
  // ---------------------------------------------------------------------------
176
191
 
177
- export interface AllowlistOption {
178
- label: string;
179
- description: string;
180
- pattern: string;
181
- }
192
+ /** The prompt's "always allow" ladder entry: the gateway's wire shape. */
193
+ export type AllowlistOption = RiskAllowlistOption;
182
194
 
183
- export interface ScopeOption {
184
- label: string;
185
- scope: string;
186
- }
195
+ /**
196
+ * A directory-scope ladder entry (`scope` is a path glob or `everywhere`);
197
+ * the same wire shape the gateway emits as `directoryScopeOptions`.
198
+ */
199
+ export type ScopeOption = RiskDirectoryScopeOption;
187
200
 
188
201
  // ---------------------------------------------------------------------------
189
202
  // Tool context
@@ -1,3 +1,7 @@
1
+ import type {
2
+ RiskAllowlistOption,
3
+ RiskDirectoryScopeOption,
4
+ } from "@vellumai/gateway-client";
1
5
  import { z } from "zod";
2
6
 
3
7
  import type { AnsweredQuestion } from "../api/events/question-answered.js";
@@ -124,13 +128,9 @@ export interface ToolExecutionResult {
124
128
  * wildcards) — what the gateway actually matches against. Mirrors
125
129
  * the `allowlistOptions` field on `ConfirmationRequest` SSE events.
126
130
  */
127
- riskAllowlistOptions?: Array<{
128
- label: string;
129
- description: string;
130
- pattern: string;
131
- }>;
131
+ riskAllowlistOptions?: RiskAllowlistOption[];
132
132
  /** Directory scope ladder for the rule editor (narrowest to broadest). */
133
- riskDirectoryScopeOptions?: Array<{ scope: string; label: string }>;
133
+ riskDirectoryScopeOptions?: RiskDirectoryScopeOption[];
134
134
  /** Structured activity metadata for client rendering (web search, web fetch, etc).
135
135
  * Populated by daemon-internal tools; plugins must not set this. */
136
136
  activityMetadata?: ToolActivityMetadata;
@@ -123,7 +123,7 @@ export const SURFACE_SHAPE_DOCS: Record<string, SurfaceShapeDoc> = {
123
123
  work_result: {
124
124
  purpose: "structured receipt after completed work",
125
125
  shape:
126
- '{ eyebrow?, status?: "completed"|"partial"|"failed"|"in_progress", summary?, metrics?: [{ label, value, detail?, tone?: "neutral"|"positive"|"warning"|"negative" }], sections?: [{ id?, title, description?, type?: "items"|"timeline"|"diff"|"artifacts"|"warnings", items?: [{ id?, title, description?, status?, tone?, metadata?: [{ label, value }], href? }], diffs?: [{ label?, before?, after? }] }] } — structured receipt after real work; keep display-only unless follow-up buttons are needed',
126
+ '{ eyebrow?, status?: "completed"|"partial"|"failed"|"in_progress", summary?, metrics?: [{ label, value, detail?, tone?: "neutral"|"positive"|"warning"|"negative" }], sections?: [{ id?, title, description?, type?: "items"|"timeline"|"diff"|"artifacts"|"warnings", items?: [{ id?, title, description?, status?, tone?, metadata?: [{ label, value }], href? }], diffs?: [{ label?, before?, after? }] }] }: structured receipt after real work; keep display-only unless follow-up buttons are needed. An item `href` makes the row a link: an in-app path (e.g. "/assistant/skills/<skillId>?tab=history") opens in place, an https URL opens externally; other schemes are ignored',
127
127
  missingContent: (data) =>
128
128
  hasContent(data)
129
129
  ? null
@@ -211,6 +211,17 @@ export const SURFACE_SHAPE_DOCS: Record<string, SurfaceShapeDoc> = {
211
211
  ? null
212
212
  : '`data.channel` must be one of "slack", "telegram", "phone"',
213
213
  },
214
+ voice_picker: {
215
+ // The steering lives in `purpose` because that is the only part of a cold
216
+ // type the model ever sees: `shape` ships solely inside a teaching error,
217
+ // and an empty payload has no missing-content state to raise one. The
218
+ // surface exists to replace prose voice tours, so losing the directive
219
+ // would leave nothing but a renderer nobody invokes.
220
+ purpose:
221
+ "inline picker for the voice the assistant speaks in; show it when the user asks to change, hear, or pick a voice rather than describing voices in prose or sending them to Settings; attach no actions and never set await_action; during a live voice call answer in speech instead, the room already carries its own picker",
222
+ shape:
223
+ "{}: no payload, the card reads the current voice and the catalog itself. Selecting a voice applies on the assistant's next spoken turn",
224
+ },
214
225
  };
215
226
 
216
227
  /** Model-facing surface_type enum, derived so docs and schema cannot drift. */
@@ -55,8 +55,7 @@ export const runWorkflowInputSchema = z.looseObject({
55
55
  */
56
56
  function resolveTrustContext(context: ToolContext): TrustContext {
57
57
  const conversation = findConversation(context.conversationId);
58
- const fromConversation =
59
- conversation?.currentTurnTrustContext ?? conversation?.trustContext;
58
+ const fromConversation = conversation?.getTurnOrRestingTrust();
60
59
  if (fromConversation) {
61
60
  return fromConversation;
62
61
  }
@@ -0,0 +1,78 @@
1
+ import { describe, expect, test } from "bun:test";
2
+
3
+ import { createReasoningTagFilter } from "../reasoning-tag-filter.js";
4
+
5
+ function run(chunks: string[]): string {
6
+ const filter = createReasoningTagFilter();
7
+ let out = "";
8
+ for (const chunk of chunks) {
9
+ out += filter.push(chunk);
10
+ }
11
+ out += filter.flush();
12
+ return out;
13
+ }
14
+
15
+ describe("ReasoningTagFilter", () => {
16
+ test("passes plain text through unchanged", () => {
17
+ expect(run(["Hello ", "there."])).toBe("Hello there.");
18
+ });
19
+
20
+ test("drops a complete think span within one delta", () => {
21
+ expect(run(["<think>hm, let me reason</think>Answer."])).toBe("Answer.");
22
+ });
23
+
24
+ test("drops a reasoning span crossing many deltas", () => {
25
+ expect(
26
+ run(["<thi", "nk>step one", " step two", "</th", "ink>Spoken reply"]),
27
+ ).toBe("Spoken reply");
28
+ });
29
+
30
+ test("drops thinking-tag variant and is case-insensitive", () => {
31
+ expect(run(["<Thinking>inner</Thinking>ok"])).toBe("ok");
32
+ });
33
+
34
+ test("keeps text before and after the span", () => {
35
+ expect(run(["Sure. <think>secret</think> Done."])).toBe("Sure. Done.");
36
+ });
37
+
38
+ test("handles multiple spans in one turn", () => {
39
+ expect(run(["a<think>x</think>b", "<think>y", "z</think>c"])).toBe("abc");
40
+ });
41
+
42
+ test("an unclosed span at end of stream stays dropped", () => {
43
+ expect(run(["ok<think>never closes"])).toBe("ok");
44
+ });
45
+
46
+ test("a dangling partial open tag is released as literal text at flush", () => {
47
+ expect(run(["price <th"])).toBe("price <th");
48
+ });
49
+
50
+ test("a false partial that disambiguates to text is released", () => {
51
+ expect(run(["a <th", "ree-step plan"])).toBe("a <three-step plan");
52
+ });
53
+
54
+ test("does not touch angle brackets that are not think tags", () => {
55
+ expect(run(["use <b>bold</b> and x < y"])).toBe(
56
+ "use <b>bold</b> and x < y",
57
+ );
58
+ });
59
+
60
+ test("holds back nothing across an empty stream", () => {
61
+ expect(run([""])).toBe("");
62
+ });
63
+
64
+ test("does not shift indexes for characters whose lowercase form is longer", () => {
65
+ // U+0130 (dotted capital I) lowers to two code units; positional
66
+ // scanning must never lowercase the haystack wholesale.
67
+ expect(run(["\u0130stanbul rocks. <think>hidden</think> Done."])).toBe(
68
+ "\u0130stanbul rocks. Done.",
69
+ );
70
+ expect(run(["\u0130\u0130\u0130<THINK>x</THINK>ok"])).toBe(
71
+ "\u0130\u0130\u0130ok",
72
+ );
73
+ });
74
+
75
+ test("prefers the longer tag when both match at one index", () => {
76
+ expect(run(["a<thinking>x</thinking>b"])).toBe("ab");
77
+ });
78
+ });
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Streaming reasoning-tag filter for the TTS pipelines.
3
+ *
4
+ * Some OpenAI-compatible reasoning models emit their chain of thought inline
5
+ * in the content stream as `<think>...</think>` (or `<thinking>...</thinking>`)
6
+ * spans. When a profile has not opted into the chat-completions provider's
7
+ * `parseThinkTags` (which re-routes those spans to `thinking_delta`), the raw
8
+ * reasoning rides `text_delta`, and anything downstream that speaks text
9
+ * deltas would read the model's inner monologue aloud and delay real speech
10
+ * by the full length of the reasoning.
11
+ *
12
+ * This filter is the TTS-boundary guard: voice output must never speak
13
+ * reasoning regardless of profile configuration. It is stateful because a
14
+ * tag or a reasoning span routinely crosses delta boundaries; feed every
15
+ * delta through {@link ReasoningTagFilter.push} and call
16
+ * {@link ReasoningTagFilter.flush} when the turn's stream ends.
17
+ *
18
+ * Display paths are deliberately untouched: `assistant_text_delta` frames
19
+ * keep the raw text, exactly like the markdown handling in
20
+ * `calls/tts-text-sanitizer.ts`.
21
+ *
22
+ * Tag scanning lives in `util/think-tag-stream.ts`, shared with the
23
+ * chat-completions provider's think-tag router, and is positionally exact
24
+ * on the original string (no full-string lowercasing, which shifts indexes
25
+ * for characters like the dotted capital I).
26
+ */
27
+
28
+ import { indexOfTag, partialTagSuffix } from "../util/think-tag-stream.js";
29
+
30
+ const OPEN_TAGS = ["<think>", "<thinking>"] as const;
31
+ const CLOSE_TAGS = ["</think>", "</thinking>"] as const;
32
+
33
+ export class ReasoningTagFilter {
34
+ private insideReasoning = false;
35
+ private pending = "";
36
+
37
+ /**
38
+ * Feed one streamed delta; returns the speakable text it releases.
39
+ * Reasoning spans are dropped; a partial tag at the end of the buffer is
40
+ * held back until the next delta disambiguates it.
41
+ */
42
+ push(text: string): string {
43
+ this.pending += text;
44
+ let out = "";
45
+ for (;;) {
46
+ if (this.insideReasoning) {
47
+ const close = indexOfTag(this.pending, CLOSE_TAGS, true);
48
+ if (close) {
49
+ this.pending = this.pending.slice(close.index + close.tag.length);
50
+ this.insideReasoning = false;
51
+ continue;
52
+ }
53
+ // Everything buffered is reasoning except a possible partial close
54
+ // tag at the end; drop the reasoning, keep the partial.
55
+ const partial = partialTagSuffix(this.pending, CLOSE_TAGS, true);
56
+ this.pending = partial > 0 ? this.pending.slice(-partial) : "";
57
+ return out;
58
+ }
59
+ const open = indexOfTag(this.pending, OPEN_TAGS, true);
60
+ if (open) {
61
+ out += this.pending.slice(0, open.index);
62
+ this.pending = this.pending.slice(open.index + open.tag.length);
63
+ this.insideReasoning = true;
64
+ continue;
65
+ }
66
+ const partial = partialTagSuffix(this.pending, OPEN_TAGS, true);
67
+ const safeLength = this.pending.length - partial;
68
+ out += this.pending.slice(0, safeLength);
69
+ this.pending = partial > 0 ? this.pending.slice(safeLength) : "";
70
+ return out;
71
+ }
72
+ }
73
+
74
+ /**
75
+ * End of stream: release any held-back partial. Outside a reasoning span a
76
+ * dangling "<thin" was ordinary text after all; inside one, the span never
77
+ * closed and its content stays dropped.
78
+ */
79
+ flush(): string {
80
+ const rest = this.insideReasoning ? "" : this.pending;
81
+ this.pending = "";
82
+ this.insideReasoning = false;
83
+ return rest;
84
+ }
85
+ }
86
+
87
+ export function createReasoningTagFilter(): ReasoningTagFilter {
88
+ return new ReasoningTagFilter();
89
+ }
@@ -0,0 +1,37 @@
1
+ import { describe, expect, test } from "bun:test";
2
+
3
+ import { resolveWorkerCommand } from "../worker-process.js";
4
+
5
+ const entry = new URL("file:///source/monitoring/worker.ts");
6
+
7
+ describe("resolveWorkerCommand", () => {
8
+ test("uses the packaged Windows worker executable when present", () => {
9
+ expect(
10
+ resolveWorkerCommand(entry, "monitoring", {
11
+ platform: "win32",
12
+ execPath: "/runtime/vellum-daemon.exe",
13
+ executableExists: () => true,
14
+ }),
15
+ ).toEqual(["/runtime/vellum-worker.exe", "monitoring"]);
16
+ });
17
+
18
+ test("routes integrity checks through the packaged worker", () => {
19
+ expect(
20
+ resolveWorkerCommand(entry, "db-integrity", {
21
+ platform: "win32",
22
+ execPath: "/runtime/vellum-worker.exe",
23
+ executableExists: () => true,
24
+ }),
25
+ ).toEqual(["/runtime/vellum-worker.exe", "db-integrity"]);
26
+ });
27
+
28
+ test("falls back to the source entry outside a packaged runtime", () => {
29
+ expect(
30
+ resolveWorkerCommand(entry, "monitoring", {
31
+ platform: "win32",
32
+ execPath: "/runtime/vellum-daemon.exe",
33
+ executableExists: () => false,
34
+ }),
35
+ ).toEqual(["bun", "--smol", "run", "/source/monitoring/worker.ts"]);
36
+ });
37
+ });
@@ -19,6 +19,16 @@ import { logSerializers } from "./log-redact.js";
19
19
  import { getLogsDir } from "./platform.js";
20
20
 
21
21
  const loadModule = createRequire(import.meta.url);
22
+ let bundledPino: typeof import("pino") | undefined;
23
+ let bundledPinoPretty: typeof import("pino-pretty") | undefined;
24
+
25
+ export function setBundledLoggerModules(
26
+ pino: typeof import("pino"),
27
+ pinoPretty: typeof import("pino-pretty"),
28
+ ): void {
29
+ bundledPino = pino;
30
+ bundledPinoPretty = pinoPretty;
31
+ }
22
32
 
23
33
  /**
24
34
  * pino loads on first logger construction, not import, so CLI processes that
@@ -26,11 +36,17 @@ const loadModule = createRequire(import.meta.url);
26
36
  * the real dual-export and ESM-shaped test mocks.
27
37
  */
28
38
  function loadPino(): typeof import("pino") {
39
+ if (bundledPino) {
40
+ return bundledPino;
41
+ }
29
42
  const mod = loadModule("pino") as { default?: unknown };
30
43
  return (mod.default ?? mod) as typeof import("pino");
31
44
  }
32
45
 
33
46
  function loadPinoPretty(): typeof import("pino-pretty") {
47
+ if (bundledPinoPretty) {
48
+ return bundledPinoPretty;
49
+ }
34
50
  const mod = loadModule("pino-pretty") as { default?: unknown };
35
51
  return (mod.default ?? mod) as typeof import("pino-pretty");
36
52
  }