@vellumai/assistant 0.7.0 → 0.7.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 (666) hide show
  1. package/ARCHITECTURE.md +6 -7
  2. package/Dockerfile +1 -0
  3. package/README.md +2 -2
  4. package/__tests__/permissions/gateway-threshold-reader.test.ts +79 -139
  5. package/bun.lock +3 -0
  6. package/docs/architecture/security.md +18 -16
  7. package/knip.json +1 -0
  8. package/node_modules/@vellumai/skill-host-contracts/__tests__/client.test.ts +1 -5
  9. package/node_modules/@vellumai/skill-host-contracts/src/assistant-event.ts +0 -5
  10. package/node_modules/@vellumai/skill-host-contracts/src/client.ts +10 -16
  11. package/node_modules/@vellumai/skill-host-contracts/src/skill-host.ts +1 -9
  12. package/node_modules/@vellumai/skill-host-contracts/src/tool-types.ts +12 -12
  13. package/node_modules/@vellumai/slack-text/bun.lock +24 -0
  14. package/node_modules/@vellumai/slack-text/package.json +18 -0
  15. package/node_modules/@vellumai/slack-text/src/index.test.ts +153 -0
  16. package/node_modules/@vellumai/slack-text/src/index.ts +235 -0
  17. package/node_modules/@vellumai/slack-text/tsconfig.json +20 -0
  18. package/openapi.yaml +294 -107
  19. package/package.json +4 -2
  20. package/scripts/generate-openapi.ts +16 -111
  21. package/src/__tests__/agent-wake-override-profile.test.ts +23 -1
  22. package/src/__tests__/anthropic-provider.test.ts +56 -13
  23. package/src/__tests__/app-conversation-ids-backfill.test.ts +278 -0
  24. package/src/__tests__/app-conversation-ids.test.ts +151 -0
  25. package/src/__tests__/approval-cascade.test.ts +0 -15
  26. package/src/__tests__/approval-routes-http.test.ts +6 -17
  27. package/src/__tests__/assistant-event-hub.test.ts +126 -77
  28. package/src/__tests__/assistant-event.test.ts +0 -5
  29. package/src/__tests__/assistant-events-sse-hardening.test.ts +37 -15
  30. package/src/__tests__/assistant-feature-flags-integration.test.ts +0 -29
  31. package/src/__tests__/background-shell-host-bash.test.ts +34 -43
  32. package/src/__tests__/call-controller.test.ts +1 -1
  33. package/src/__tests__/call-site-routing-provider.test.ts +193 -0
  34. package/src/__tests__/channel-approval-routes.test.ts +10 -296
  35. package/src/__tests__/channel-approvals.test.ts +25 -17
  36. package/src/__tests__/channel-guardian.test.ts +100 -146
  37. package/src/__tests__/checker.test.ts +20 -34
  38. package/src/__tests__/compact-event-conversation-id-guard.test.ts +50 -0
  39. package/src/__tests__/compaction-events.test.ts +2 -0
  40. package/src/__tests__/config-schema.test.ts +6 -48
  41. package/src/__tests__/config-watcher.test.ts +12 -0
  42. package/src/__tests__/connection-policy.test.ts +1 -52
  43. package/src/__tests__/contacts-write.test.ts +2 -64
  44. package/src/__tests__/context-image-dimensions.test.ts +1 -1
  45. package/src/__tests__/context-search-memory-source.test.ts +120 -1
  46. package/src/__tests__/context-search-memory-v2-source.test.ts +383 -0
  47. package/src/__tests__/context-search-pkb-source.test.ts +49 -0
  48. package/src/__tests__/context-search-workspace-source.test.ts +9 -22
  49. package/src/__tests__/context-window-manager.test.ts +46 -0
  50. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +2 -0
  51. package/src/__tests__/conversation-agent-loop-overflow.test.ts +102 -29
  52. package/src/__tests__/conversation-agent-loop.test.ts +980 -13
  53. package/src/__tests__/conversation-analysis-routes.test.ts +12 -10
  54. package/src/__tests__/conversation-attention-telegram.test.ts +11 -3
  55. package/src/__tests__/conversation-confirmation-signals.test.ts +0 -291
  56. package/src/__tests__/conversation-history-web-search.test.ts +4 -3
  57. package/src/__tests__/conversation-inference-profile-route.test.ts +12 -23
  58. package/src/__tests__/conversation-lifecycle.test.ts +4 -4
  59. package/src/__tests__/conversation-process-callsite.test.ts +79 -2
  60. package/src/__tests__/conversation-queue.test.ts +3 -8
  61. package/src/__tests__/conversation-routes-disk-view.test.ts +1 -161
  62. package/src/__tests__/conversation-routes-guardian-reply.test.ts +0 -32
  63. package/src/__tests__/conversation-routes-slash-commands.test.ts +75 -66
  64. package/src/__tests__/conversation-runtime-assembly.test.ts +257 -3
  65. package/src/__tests__/conversation-slash-commands.test.ts +24 -4
  66. package/src/__tests__/conversation-slash-queue.test.ts +2 -0
  67. package/src/__tests__/conversation-speed-override.test.ts +0 -3
  68. package/src/__tests__/conversation-starter-routes.test.ts +79 -2
  69. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +12 -5
  70. package/src/__tests__/conversation-surfaces-standalone.test.ts +18 -14
  71. package/src/__tests__/conversation-surfaces-state-update.test.ts +3 -2
  72. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +8 -46
  73. package/src/__tests__/conversation-usage.test.ts +253 -3
  74. package/src/__tests__/credential-execution-shell-lockdown.test.ts +0 -39
  75. package/src/__tests__/credential-health-service.test.ts +68 -0
  76. package/src/__tests__/credential-security-e2e.test.ts +4 -3
  77. package/src/__tests__/credential-security-invariants.test.ts +1 -5
  78. package/src/__tests__/credential-token-resolver.test.ts +180 -0
  79. package/src/__tests__/cu-unified-flow.test.ts +33 -16
  80. package/src/__tests__/daemon-assistant-events.test.ts +34 -21
  81. package/src/__tests__/daemon-credential-client.test.ts +4 -1
  82. package/src/__tests__/db-connection-isolation.test.ts +125 -0
  83. package/src/__tests__/db-migration-rollback.test.ts +101 -0
  84. package/src/__tests__/db-slack-compaction-watermark-migration.test.ts +169 -0
  85. package/src/__tests__/deterministic-verification-control-plane.test.ts +7 -80
  86. package/src/__tests__/document-conversations.test.ts +332 -0
  87. package/src/__tests__/embedding-managed-proxy-selection.test.ts +2 -2
  88. package/src/__tests__/emit-event-signal.test.ts +4 -6
  89. package/src/__tests__/events-client-registration.test.ts +193 -49
  90. package/src/__tests__/filing-service.test.ts +58 -7
  91. package/src/__tests__/first-greeting.test.ts +156 -150
  92. package/src/__tests__/fixtures/mock-chrome-extension.ts +108 -66
  93. package/src/__tests__/get-skill-detail-audit.test.ts +3 -8
  94. package/src/__tests__/guardian-binding-drift-heal.test.ts +1 -1
  95. package/src/__tests__/guardian-dispatch.test.ts +1 -1
  96. package/src/__tests__/guardian-grant-minting.test.ts +7 -2
  97. package/src/__tests__/guardian-routing-invariants.test.ts +7 -2
  98. package/src/__tests__/guardian-routing-state.test.ts +1 -1
  99. package/src/__tests__/handlers-skills-memory-v2-reseed.test.ts +32 -11
  100. package/src/__tests__/handlers-user-message-approval-consumption.test.ts +2 -83
  101. package/src/__tests__/headless-browser-mode.test.ts +4 -9
  102. package/src/__tests__/headless-browser-navigate.test.ts +21 -20
  103. package/src/__tests__/heartbeat-service.test.ts +289 -7
  104. package/src/__tests__/helpers/channel-test-adapter.ts +2 -2
  105. package/src/__tests__/helpers/create-guardian-binding.ts +91 -0
  106. package/src/__tests__/host-bash-proxy.test.ts +46 -122
  107. package/src/__tests__/host-browser-e2e-cloud.test.ts +36 -497
  108. package/src/__tests__/host-browser-e2e-self-hosted-capability.test.ts +26 -96
  109. package/src/__tests__/host-browser-proxy.test.ts +111 -185
  110. package/src/__tests__/host-browser-routes.test.ts +45 -75
  111. package/src/__tests__/host-browser-ws-events-e2e.test.ts +26 -30
  112. package/src/__tests__/host-cu-proxy.test.ts +56 -111
  113. package/src/__tests__/host-file-proxy.test.ts +44 -98
  114. package/src/__tests__/host-file-read-tool.test.ts +42 -21
  115. package/src/__tests__/host-shell-tool.test.ts +33 -68
  116. package/src/__tests__/host-transfer-pending-interactions.test.ts +2 -18
  117. package/src/__tests__/host-transfer-proxy.test.ts +43 -53
  118. package/src/__tests__/http-user-message-parity.test.ts +0 -6
  119. package/src/__tests__/inbound-slack-persistence.test.ts +31 -0
  120. package/src/__tests__/injector-chain.test.ts +10 -5
  121. package/src/__tests__/injector-pkb-v2-silenced.test.ts +124 -0
  122. package/src/__tests__/inline-command-runner.test.ts +0 -66
  123. package/src/__tests__/inline-skill-load-permissions.test.ts +0 -2
  124. package/src/__tests__/install-skill-routing.test.ts +1 -13
  125. package/src/__tests__/llm-callsite-catalog.test.ts +34 -0
  126. package/src/__tests__/llm-catalog-parity.test.ts +90 -0
  127. package/src/__tests__/llm-context-resolution.test.ts +180 -0
  128. package/src/__tests__/llm-resolver.test.ts +80 -12
  129. package/src/__tests__/llm-usage-store.test.ts +269 -4
  130. package/src/__tests__/log-export-routes.test.ts +89 -0
  131. package/src/__tests__/managed-profile-guard.test.ts +225 -0
  132. package/src/__tests__/managed-skill-lifecycle.test.ts +0 -10
  133. package/src/__tests__/manual-token-reconciliation.test.ts +334 -0
  134. package/src/__tests__/memory-v2-static-injector.test.ts +95 -0
  135. package/src/__tests__/migration-cross-version-compatibility.test.ts +197 -291
  136. package/src/__tests__/migration-export-http.test.ts +33 -26
  137. package/src/__tests__/migration-export-streaming.test.ts +18 -10
  138. package/src/__tests__/migration-export-to-gcs.test.ts +49 -9
  139. package/src/__tests__/migration-import-commit-http.test.ts +66 -21
  140. package/src/__tests__/migration-import-from-gcs.test.ts +50 -9
  141. package/src/__tests__/migration-import-from-url.test.ts +20 -6
  142. package/src/__tests__/migration-import-preflight-http.test.ts +95 -95
  143. package/src/__tests__/migration-parity-persistence.test.ts +62 -25
  144. package/src/__tests__/migration-transport.test.ts +115 -23
  145. package/src/__tests__/migration-validate-http.test.ts +105 -80
  146. package/src/__tests__/migration-wizard.test.ts +133 -27
  147. package/src/__tests__/non-member-access-request.test.ts +1 -1
  148. package/src/__tests__/notification-guardian-path.test.ts +1 -1
  149. package/src/__tests__/oauth-store.test.ts +19 -0
  150. package/src/__tests__/platform-bash-auto-approve.test.ts +21 -12
  151. package/src/__tests__/prechat-onboarding-contract.test.ts +31 -7
  152. package/src/__tests__/pricing.test.ts +68 -4
  153. package/src/__tests__/process-message-background-slack.test.ts +331 -0
  154. package/src/__tests__/provider-managed-proxy-integration.test.ts +153 -17
  155. package/src/__tests__/provider-send-message-override-profile.test.ts +50 -0
  156. package/src/__tests__/provider-usage-tracking.test.ts +208 -0
  157. package/src/__tests__/reaction-persistence.test.ts +9 -6
  158. package/src/__tests__/rebind-secrets-screen.test.ts +53 -16
  159. package/src/__tests__/recording-handler.test.ts +64 -81
  160. package/src/__tests__/regenerate-fire-and-forget-trace.test.ts +4 -3
  161. package/src/__tests__/relay-server.test.ts +18 -13
  162. package/src/__tests__/require-fresh-approval.test.ts +13 -22
  163. package/src/__tests__/runtime-attachment-metadata.test.ts +1 -1
  164. package/src/__tests__/runtime-events-sse-parity.test.ts +3 -4
  165. package/src/__tests__/runtime-events-sse.test.ts +3 -12
  166. package/src/__tests__/search-skills-unified.test.ts +9 -15
  167. package/src/__tests__/secret-ingress-cli.test.ts +2 -5
  168. package/src/__tests__/secret-ingress-http.test.ts +0 -4
  169. package/src/__tests__/secret-onetime-send.test.ts +4 -2
  170. package/src/__tests__/secret-prompt-log-hygiene.test.ts +24 -7
  171. package/src/__tests__/secret-prompter-channel-fallback.test.ts +42 -47
  172. package/src/__tests__/secret-response-routing.test.ts +29 -15
  173. package/src/__tests__/secret-routes-managed-proxy.test.ts +5 -1
  174. package/src/__tests__/secret-scanner.test.ts +2 -545
  175. package/src/__tests__/send-endpoint-busy.test.ts +9 -24
  176. package/src/__tests__/settings-routes.test.ts +1 -1
  177. package/src/__tests__/shell-credential-ref.test.ts +0 -8
  178. package/src/__tests__/shell-tool-proxy-mode.test.ts +0 -56
  179. package/src/__tests__/skill-script-runner-sandbox.test.ts +0 -11
  180. package/src/__tests__/skill-tool-factory.test.ts +97 -0
  181. package/src/__tests__/skills-file-content-endpoint.test.ts +9 -30
  182. package/src/__tests__/skills-files-catalog-fallback.test.ts +11 -17
  183. package/src/__tests__/slack-inbound-verification.test.ts +1 -62
  184. package/src/__tests__/subagent-fork-notifications.test.ts +57 -47
  185. package/src/__tests__/subagent-manager-notify.test.ts +70 -70
  186. package/src/__tests__/subagent-notify-parent.test.ts +80 -83
  187. package/src/__tests__/system-prompt.test.ts +115 -13
  188. package/src/__tests__/terminal-tools.test.ts +0 -89
  189. package/src/__tests__/thread-backfill.test.ts +945 -31
  190. package/src/__tests__/tool-domain-event-publisher.test.ts +0 -36
  191. package/src/__tests__/tool-execute-pipeline.test.ts +0 -6
  192. package/src/__tests__/tool-execution-abort-cleanup.test.ts +0 -16
  193. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +9 -19
  194. package/src/__tests__/tool-executor-lifecycle-events.test.ts +4 -7
  195. package/src/__tests__/tool-executor.test.ts +12 -19
  196. package/src/__tests__/tool-metrics-listener.test.ts +0 -35
  197. package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
  198. package/src/__tests__/tool-trace-listener.test.ts +0 -17
  199. package/src/__tests__/transfer-progress-screen.test.ts +63 -26
  200. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +2 -149
  201. package/src/__tests__/trusted-contact-multichannel.test.ts +2 -4
  202. package/src/__tests__/trusted-contact-verification.test.ts +1 -1
  203. package/src/__tests__/tts-catalog-parity.test.ts +16 -5
  204. package/src/__tests__/usage-attribution.test.ts +247 -0
  205. package/src/__tests__/usage-cli.test.ts +143 -0
  206. package/src/__tests__/usage-grouped-buckets.test.ts +155 -0
  207. package/src/__tests__/usage-routes.test.ts +150 -0
  208. package/src/__tests__/validation-results-screen.test.ts +39 -16
  209. package/src/__tests__/vbundle-pax-and-symlink.test.ts +12 -3
  210. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +49 -137
  211. package/src/__tests__/verification-control-plane-policy.test.ts +4 -7
  212. package/src/__tests__/voice-session-bridge.test.ts +5 -5
  213. package/src/__tests__/workspace-migration-062-drop-memory-v2-edges-json.test.ts +103 -0
  214. package/src/__tests__/workspace-migration-063-release-notes-dynamic-model-context.test.ts +77 -0
  215. package/src/__tests__/workspace-migration-064-unwind-main-agent-opus-seed.test.ts +225 -0
  216. package/src/__tests__/workspace-migration-memory-v2-init.test.ts +8 -30
  217. package/src/acp/index.ts +0 -15
  218. package/src/acp/session-manager.ts +37 -34
  219. package/src/agent/loop.ts +16 -1
  220. package/src/approvals/AGENTS.md +4 -0
  221. package/src/approvals/__tests__/guardian-feed-event.test.ts +10 -3
  222. package/src/approvals/guardian-request-resolvers.ts +10 -2
  223. package/src/backup/__tests__/backup-worker.test.ts +36 -8
  224. package/src/backup/__tests__/paths.test.ts +2 -2
  225. package/src/backup/__tests__/restore.test.ts +45 -28
  226. package/src/backup/backup-worker.ts +36 -2
  227. package/src/backup/paths.ts +9 -6
  228. package/src/browser-session/events.ts +0 -9
  229. package/src/calls/call-store.ts +1 -34
  230. package/src/calls/guardian-question-copy.ts +0 -108
  231. package/src/calls/relay-server.ts +0 -24
  232. package/src/calls/twilio-rest.ts +0 -38
  233. package/src/calls/twilio-routes.ts +1 -1
  234. package/src/calls/voice-session-bridge.ts +7 -38
  235. package/src/channels/types.ts +1 -36
  236. package/src/cli/commands/__tests__/cache.test.ts +152 -5
  237. package/src/cli/commands/__tests__/memory-v2.test.ts +14 -28
  238. package/src/cli/commands/__tests__/trust.test.ts +21 -387
  239. package/src/cli/commands/backup.ts +4 -4
  240. package/src/cli/commands/cache-fs.ts +8 -0
  241. package/src/cli/commands/cache.ts +153 -82
  242. package/src/cli/commands/clients.ts +63 -5
  243. package/src/cli/commands/completions.ts +3 -3
  244. package/src/cli/commands/contacts.ts +231 -76
  245. package/src/cli/commands/keys.ts +4 -1
  246. package/src/cli/commands/memory-v2.ts +24 -52
  247. package/src/cli/commands/oauth/shared.ts +2 -29
  248. package/src/cli/commands/pending.ts +102 -0
  249. package/src/cli/commands/skills.ts +77 -35
  250. package/src/cli/commands/trust.ts +70 -430
  251. package/src/cli/commands/usage.ts +25 -16
  252. package/src/cli/lib/daemon-credential-client.ts +14 -0
  253. package/src/cli/program.ts +2 -0
  254. package/src/cli.ts +0 -21
  255. package/src/config/__tests__/feature-flag-registry-guard.test.ts +2 -2
  256. package/src/config/bundled-skills/messaging/TOOLS.json +14 -4
  257. package/src/config/env-registry.ts +12 -2
  258. package/src/config/env.ts +3 -14
  259. package/src/config/feature-flag-registry.json +30 -30
  260. package/src/config/llm-callsite-catalog.ts +12 -0
  261. package/src/config/llm-context-resolution.ts +80 -0
  262. package/src/config/llm-resolver.ts +58 -22
  263. package/src/config/loader.ts +3 -3
  264. package/src/config/schema.ts +2 -158
  265. package/src/config/schemas/__tests__/memory-v2.test.ts +1 -0
  266. package/src/config/schemas/call-site-catalog.ts +271 -0
  267. package/src/config/schemas/calls.ts +5 -5
  268. package/src/config/schemas/inference.ts +1 -1
  269. package/src/config/schemas/ingress.ts +1 -1
  270. package/src/config/schemas/llm.ts +31 -3
  271. package/src/config/schemas/memory-retrieval.ts +2 -2
  272. package/src/config/schemas/memory-v2.ts +9 -0
  273. package/src/config/schemas/security.ts +1 -42
  274. package/src/config/schemas/services.ts +6 -6
  275. package/src/config/schemas/skills.ts +5 -5
  276. package/src/config/schemas/tts.ts +1 -1
  277. package/src/config/seed-inference-profiles.ts +117 -0
  278. package/src/config/skills.ts +0 -90
  279. package/src/config/types.ts +3 -6
  280. package/src/contacts/contact-store.ts +0 -17
  281. package/src/contacts/contacts-write.ts +1 -105
  282. package/src/context/window-manager.ts +44 -5
  283. package/src/credential-execution/process-manager.ts +34 -10
  284. package/src/credential-health/credential-health-service.ts +21 -16
  285. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +75 -82
  286. package/src/daemon/__tests__/daemon-skill-host.test.ts +2 -9
  287. package/src/daemon/connection-policy.ts +1 -26
  288. package/src/daemon/conversation-agent-loop-handlers.ts +53 -4
  289. package/src/daemon/conversation-agent-loop.ts +277 -36
  290. package/src/daemon/conversation-history.ts +8 -8
  291. package/src/daemon/conversation-launch.ts +20 -135
  292. package/src/daemon/conversation-lifecycle.ts +1 -1
  293. package/src/daemon/conversation-messaging.ts +1 -0
  294. package/src/daemon/conversation-process.ts +83 -163
  295. package/src/daemon/conversation-runtime-assembly.ts +219 -76
  296. package/src/daemon/conversation-slash.ts +47 -5
  297. package/src/daemon/conversation-store.ts +7 -31
  298. package/src/daemon/conversation-surfaces.ts +22 -28
  299. package/src/daemon/conversation-tool-setup.ts +3 -33
  300. package/src/daemon/conversation-usage.ts +36 -0
  301. package/src/daemon/conversation.ts +117 -233
  302. package/src/daemon/daemon-control.ts +3 -71
  303. package/src/daemon/daemon-skill-host.ts +8 -11
  304. package/src/daemon/dictation-profile-store.ts +2 -26
  305. package/src/daemon/first-greeting.ts +44 -156
  306. package/src/daemon/handlers/config-channels.ts +12 -12
  307. package/src/daemon/handlers/config-ingress.ts +4 -165
  308. package/src/daemon/handlers/config-model.ts +1 -1
  309. package/src/daemon/handlers/config-voice.ts +0 -42
  310. package/src/daemon/handlers/conversations.ts +11 -190
  311. package/src/daemon/handlers/recording.ts +26 -158
  312. package/src/daemon/handlers/shared.ts +23 -71
  313. package/src/daemon/handlers/skills.ts +42 -93
  314. package/src/daemon/host-bash-proxy.ts +67 -45
  315. package/src/daemon/host-browser-proxy.ts +65 -27
  316. package/src/daemon/host-cu-proxy.ts +40 -39
  317. package/src/daemon/host-file-proxy.ts +58 -37
  318. package/src/daemon/host-transfer-proxy.ts +84 -46
  319. package/src/daemon/lifecycle.ts +49 -15
  320. package/src/daemon/message-types/conversations.ts +7 -0
  321. package/src/daemon/message-types/host-bash.ts +1 -0
  322. package/src/daemon/message-types/host-cu.ts +1 -0
  323. package/src/daemon/message-types/host-file.ts +1 -0
  324. package/src/daemon/message-types/host-transfer.ts +1 -0
  325. package/src/daemon/message-types/messages.ts +10 -9
  326. package/src/daemon/message-types/workspace.ts +1 -1
  327. package/src/daemon/process-message.ts +102 -239
  328. package/src/daemon/server.ts +13 -462
  329. package/src/daemon/shutdown-handlers.ts +2 -2
  330. package/src/daemon/tool-side-effects.ts +125 -107
  331. package/src/daemon/trust-context.ts +13 -0
  332. package/src/daemon/wake-target-adapter.ts +4 -9
  333. package/src/events/domain-events.ts +0 -8
  334. package/src/events/tool-audit-listener.ts +3 -1
  335. package/src/events/tool-domain-event-publisher.ts +0 -10
  336. package/src/events/tool-metrics-listener.ts +0 -17
  337. package/src/events/tool-trace-listener.ts +0 -14
  338. package/src/filing/filing-service.ts +13 -1
  339. package/src/heartbeat/__tests__/heartbeat-feed-event.test.ts +6 -2
  340. package/src/heartbeat/heartbeat-service.ts +23 -5
  341. package/src/home/__tests__/feed-writer.test.ts +0 -4
  342. package/src/home/__tests__/relationship-state-writer.test.ts +30 -0
  343. package/src/home/feed-writer.ts +1 -2
  344. package/src/home/relationship-state-writer.ts +16 -3
  345. package/src/ipc/__tests__/browser-ipc.test.ts +2 -12
  346. package/src/ipc/__tests__/skill-server-bidirectional.test.ts +0 -1
  347. package/src/ipc/assistant-server.ts +3 -10
  348. package/src/ipc/routes/__tests__/memory-v2-backfill.test.ts +39 -20
  349. package/src/ipc/routes/route-adapter.ts +1 -1
  350. package/src/ipc/routes/trust-rules.test.ts +0 -95
  351. package/src/ipc/skill-ipc-types.ts +41 -0
  352. package/src/ipc/skill-routes/__tests__/events-ipc.test.ts +13 -27
  353. package/src/ipc/skill-routes/__tests__/identity.test.ts +4 -23
  354. package/src/ipc/skill-routes/events.ts +12 -23
  355. package/src/ipc/skill-routes/identity.ts +4 -17
  356. package/src/ipc/skill-routes/index.ts +1 -1
  357. package/src/ipc/skill-server.ts +6 -39
  358. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +0 -8
  359. package/src/live-voice/protocol.ts +4 -13
  360. package/src/mcp/manager.ts +0 -5
  361. package/src/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +55 -0
  362. package/src/memory/__tests__/memory-v2-activation-log-store.test.ts +127 -0
  363. package/src/memory/app-git-service.ts +0 -32
  364. package/src/memory/app-store.ts +154 -0
  365. package/src/memory/attachments-store.ts +6 -0
  366. package/src/memory/context-search/sources/memory-v2.ts +578 -0
  367. package/src/memory/context-search/sources/memory.ts +5 -0
  368. package/src/memory/context-search/sources/pkb.ts +10 -1
  369. package/src/memory/context-search/sources/workspace.ts +3 -2
  370. package/src/memory/conversation-crud.ts +29 -4
  371. package/src/memory/conversation-disk-view.ts +1 -5
  372. package/src/memory/conversation-starter-checkpoints.ts +63 -0
  373. package/src/memory/db-connection.ts +62 -0
  374. package/src/memory/db-init.ts +14 -0
  375. package/src/memory/embedding-backend.ts +3 -21
  376. package/src/memory/embedding-gemini.ts +0 -2
  377. package/src/memory/embedding-local.ts +6 -6
  378. package/src/memory/embedding-ollama.ts +6 -6
  379. package/src/memory/embedding-openai.ts +6 -6
  380. package/src/memory/embedding-types.ts +21 -0
  381. package/src/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +3 -7
  382. package/src/memory/graph/conversation-graph-memory.ts +35 -13
  383. package/src/memory/graph/injection.test.ts +2 -2
  384. package/src/memory/graph/injection.ts +1 -1
  385. package/src/memory/guardian-action-store.ts +0 -83
  386. package/src/memory/guardian-approvals.ts +0 -48
  387. package/src/memory/indexer.ts +1 -15
  388. package/src/memory/job-handlers/conversation-starters.ts +36 -53
  389. package/src/memory/job-utils.ts +0 -6
  390. package/src/memory/jobs-store.ts +0 -1
  391. package/src/memory/jobs-worker.ts +2 -16
  392. package/src/memory/llm-request-log-store.ts +0 -41
  393. package/src/memory/llm-usage-store.ts +129 -43
  394. package/src/memory/memory-v2-activation-log-store.ts +115 -0
  395. package/src/memory/migrations/233-document-conversations.ts +54 -0
  396. package/src/memory/migrations/234-memory-v2-activation-logs.ts +55 -0
  397. package/src/memory/migrations/235-llm-usage-attribution.ts +31 -0
  398. package/src/memory/migrations/235-slack-compaction-watermark.ts +44 -0
  399. package/src/memory/migrations/236-tool-invocations-matched-rule-id.ts +26 -0
  400. package/src/memory/migrations/__tests__/234-memory-v2-activation-logs.test.ts +182 -0
  401. package/src/memory/migrations/index.ts +14 -0
  402. package/src/memory/migrations/registry.ts +24 -0
  403. package/src/memory/raw-query.ts +2 -68
  404. package/src/memory/schema/conversations.ts +7 -0
  405. package/src/memory/schema/infrastructure.ts +25 -0
  406. package/src/memory/search/semantic.ts +5 -16
  407. package/src/memory/tool-usage-store.ts +2 -0
  408. package/src/memory/usage-buckets.ts +40 -1
  409. package/src/memory/usage-grouped-buckets.ts +127 -0
  410. package/src/memory/v2/__tests__/activation.test.ts +289 -90
  411. package/src/memory/v2/__tests__/backfill-jobs.test.ts +2 -129
  412. package/src/memory/v2/__tests__/consolidation-job.test.ts +28 -11
  413. package/src/memory/v2/__tests__/edge-index.test.ts +278 -0
  414. package/src/memory/v2/__tests__/injection.test.ts +384 -15
  415. package/src/memory/v2/__tests__/migration.test.ts +64 -36
  416. package/src/memory/v2/__tests__/page-store.test.ts +191 -8
  417. package/src/memory/v2/__tests__/prompts-consolidation.test.ts +181 -0
  418. package/src/memory/v2/__tests__/skill-store.test.ts +115 -3
  419. package/src/memory/v2/__tests__/static-context.test.ts +153 -0
  420. package/src/memory/v2/activation.ts +168 -97
  421. package/src/memory/v2/backfill-jobs.ts +15 -100
  422. package/src/memory/v2/consolidation-job.ts +14 -12
  423. package/src/memory/v2/edge-index.ts +191 -0
  424. package/src/memory/v2/injection.ts +182 -58
  425. package/src/memory/v2/migration.ts +57 -64
  426. package/src/memory/v2/now-text.ts +2 -3
  427. package/src/memory/v2/page-store.ts +168 -31
  428. package/src/memory/v2/prompts/consolidation.ts +118 -42
  429. package/src/memory/v2/prompts/sweep.ts +3 -3
  430. package/src/memory/v2/skill-store.ts +55 -7
  431. package/src/memory/v2/static-context.ts +62 -0
  432. package/src/memory/v2/types.ts +10 -20
  433. package/src/memory/validation.ts +0 -11
  434. package/src/messaging/draft-store.ts +0 -6
  435. package/src/messaging/provider-types.ts +8 -0
  436. package/src/messaging/provider.ts +7 -0
  437. package/src/messaging/providers/gmail/client.ts +1 -121
  438. package/src/messaging/providers/outlook/client.ts +0 -73
  439. package/src/messaging/providers/slack/__tests__/adapter-mention-rendering.test.ts +226 -0
  440. package/src/messaging/providers/slack/adapter.ts +122 -21
  441. package/src/messaging/providers/slack/backfill.test.ts +95 -6
  442. package/src/messaging/providers/slack/backfill.ts +89 -11
  443. package/src/messaging/providers/slack/client.ts +10 -124
  444. package/src/messaging/providers/slack/message-metadata.ts +12 -2
  445. package/src/messaging/providers/slack/render-transcript.test.ts +56 -0
  446. package/src/messaging/providers/slack/render-transcript.ts +126 -25
  447. package/src/messaging/providers/slack/types.ts +1 -0
  448. package/src/oauth/connection-resolver.test.ts +8 -0
  449. package/src/oauth/connection-resolver.ts +8 -16
  450. package/src/oauth/credential-token-resolver.ts +97 -0
  451. package/src/oauth/manual-token-connection.ts +30 -34
  452. package/src/oauth/oauth-store.ts +6 -4
  453. package/src/outbound-proxy/certs.ts +0 -7
  454. package/src/outbound-proxy/config.ts +0 -74
  455. package/src/outbound-proxy/health.ts +0 -44
  456. package/src/outbound-proxy/index.ts +0 -22
  457. package/src/permissions/approval-provenance.test.ts +184 -0
  458. package/src/permissions/approval-provenance.ts +70 -0
  459. package/src/permissions/checker.ts +4 -1
  460. package/src/permissions/gateway-threshold-reader.ts +4 -1
  461. package/src/permissions/prompter.ts +9 -2
  462. package/src/permissions/secret-prompter.ts +21 -48
  463. package/src/permissions/types.ts +33 -0
  464. package/src/permissions/workspace-policy.ts +0 -5
  465. package/src/platform/sync-identity.ts +0 -8
  466. package/src/plugins/defaults/injectors.ts +69 -2
  467. package/src/plugins/defaults/overflow-reduce.ts +3 -2
  468. package/src/plugins/types.ts +8 -0
  469. package/src/prompts/system-prompt.ts +34 -70
  470. package/src/prompts/templates/BOOTSTRAP.md +52 -6
  471. package/src/prompts/update-bulletin-job.ts +2 -0
  472. package/src/providers/__tests__/retry-callsite.test.ts +138 -1
  473. package/src/providers/anthropic/client.ts +72 -33
  474. package/src/providers/call-site-routing.ts +42 -3
  475. package/src/providers/gemini/client.ts +18 -2
  476. package/src/providers/managed-proxy/context.ts +0 -5
  477. package/src/providers/model-catalog.ts +105 -19
  478. package/src/providers/openai/chat-completions-provider.ts +6 -0
  479. package/src/providers/openai/responses-provider.ts +7 -1
  480. package/src/providers/provider-send-message.ts +45 -2
  481. package/src/providers/ratelimit.ts +7 -2
  482. package/src/providers/registry.ts +14 -9
  483. package/src/providers/retry.ts +96 -8
  484. package/src/providers/types.ts +13 -0
  485. package/src/providers/usage-tracking.ts +96 -0
  486. package/src/runtime/AGENTS.md +10 -6
  487. package/src/runtime/__tests__/agent-wake.test.ts +89 -0
  488. package/src/runtime/agent-wake.ts +39 -2
  489. package/src/runtime/assistant-event-hub.ts +541 -45
  490. package/src/runtime/assistant-event.ts +1 -6
  491. package/src/runtime/auth/context.ts +0 -9
  492. package/src/runtime/auth/middleware.ts +1 -1
  493. package/src/runtime/auth/route-policy.ts +11 -9
  494. package/src/runtime/auth/token-service.ts +0 -11
  495. package/src/runtime/channel-approvals.ts +6 -2
  496. package/src/runtime/channel-verification-service.ts +3 -5
  497. package/src/runtime/http-errors.ts +0 -34
  498. package/src/runtime/http-router.ts +6 -3
  499. package/src/runtime/http-server.ts +22 -82
  500. package/src/runtime/http-types.ts +5 -0
  501. package/src/runtime/interactive-ui.ts +0 -1
  502. package/src/runtime/middleware/auth.ts +0 -20
  503. package/src/runtime/migrations/__tests__/v1-test-helpers.ts +112 -0
  504. package/src/runtime/migrations/__tests__/vbundle-builder-credentials.test.ts +11 -4
  505. package/src/runtime/migrations/__tests__/vbundle-builder-v1-shape.test.ts +253 -0
  506. package/src/runtime/migrations/__tests__/vbundle-import-credentials.test.ts +19 -6
  507. package/src/runtime/migrations/__tests__/vbundle-legacy-user-md.test.ts +71 -27
  508. package/src/runtime/migrations/__tests__/vbundle-metadata-merge-integration.test.ts +41 -2
  509. package/src/runtime/migrations/__tests__/vbundle-streaming-importer.test.ts +143 -79
  510. package/src/runtime/migrations/__tests__/vbundle-streaming-validator.test.ts +143 -23
  511. package/src/runtime/migrations/__tests__/vbundle-tar-stream.test.ts +2 -2
  512. package/src/runtime/migrations/__tests__/vbundle-validator-v1-schema.test.ts +371 -0
  513. package/src/runtime/migrations/migration-transport.ts +46 -13
  514. package/src/runtime/migrations/migration-wizard.ts +2 -2
  515. package/src/runtime/migrations/origin-mode.ts +40 -0
  516. package/src/runtime/migrations/vbundle-builder.ts +133 -79
  517. package/src/runtime/migrations/vbundle-import-analyzer.ts +9 -7
  518. package/src/runtime/migrations/vbundle-importer.ts +7 -7
  519. package/src/runtime/migrations/vbundle-metadata-merge.ts +1 -1
  520. package/src/runtime/migrations/vbundle-streaming-importer.ts +3 -3
  521. package/src/runtime/migrations/vbundle-streaming-validator.ts +48 -26
  522. package/src/runtime/migrations/vbundle-validator.ts +214 -41
  523. package/src/runtime/pending-interactions.ts +13 -4
  524. package/src/runtime/routes/__tests__/acp-routes.test.ts +0 -1
  525. package/src/runtime/routes/__tests__/backup-routes.test.ts +28 -19
  526. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +235 -0
  527. package/src/runtime/routes/__tests__/llm-call-sites-routes.test.ts +58 -0
  528. package/src/runtime/routes/__tests__/migration-export-secrets-redacted.test.ts +54 -0
  529. package/src/runtime/routes/__tests__/migration-import-credential-filter.test.ts +19 -6
  530. package/src/runtime/routes/__tests__/user-route-dispatcher.test.ts +7 -7
  531. package/src/runtime/routes/acp-routes.test.ts +0 -3
  532. package/src/runtime/routes/acp-routes.ts +3 -7
  533. package/src/runtime/routes/app-management-routes.ts +18 -9
  534. package/src/runtime/routes/approval-routes.ts +55 -14
  535. package/src/runtime/routes/avatar-routes.ts +3 -5
  536. package/src/runtime/routes/browser-routes.ts +1 -15
  537. package/src/runtime/routes/channel-guardian-routes.ts +1 -5
  538. package/src/runtime/routes/channel-readiness-routes.ts +3 -7
  539. package/src/runtime/routes/channel-route-shared.ts +2 -28
  540. package/src/runtime/routes/client-routes.ts +45 -12
  541. package/src/runtime/routes/consolidation-routes.ts +115 -0
  542. package/src/runtime/routes/conversation-list-routes.ts +12 -29
  543. package/src/runtime/routes/conversation-management-routes.ts +14 -51
  544. package/src/runtime/routes/conversation-query-routes.ts +120 -8
  545. package/src/runtime/routes/conversation-routes.ts +44 -528
  546. package/src/runtime/routes/conversation-starter-routes.ts +19 -40
  547. package/src/runtime/routes/documents-routes.ts +53 -18
  548. package/src/runtime/routes/events-routes.ts +59 -91
  549. package/src/runtime/routes/filing-routes.ts +18 -1
  550. package/src/runtime/routes/guardian-action-routes.ts +4 -9
  551. package/src/runtime/routes/host-bash-routes.ts +3 -2
  552. package/src/runtime/routes/host-browser-routes.ts +9 -33
  553. package/src/runtime/routes/host-cu-routes.ts +6 -1
  554. package/src/runtime/routes/host-file-routes.ts +3 -2
  555. package/src/runtime/routes/host-transfer-routes.ts +11 -15
  556. package/src/runtime/routes/identity-routes.ts +78 -6
  557. package/src/runtime/routes/inbound-message-handler.ts +580 -137
  558. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +2 -88
  559. package/src/runtime/routes/inbound-stages/background-dispatch.ts +3 -0
  560. package/src/runtime/routes/index.ts +4 -0
  561. package/src/runtime/routes/integrations/slack/channel.ts +0 -24
  562. package/src/runtime/routes/llm-call-sites-routes.ts +22 -0
  563. package/src/runtime/routes/memory-v2-routes.ts +10 -15
  564. package/src/runtime/routes/migration-routes.ts +188 -31
  565. package/src/runtime/routes/playground/guard.ts +1 -1
  566. package/src/runtime/routes/playground/index.ts +0 -2
  567. package/src/runtime/routes/recording-routes.ts +4 -24
  568. package/src/runtime/routes/rename-conversation-routes.ts +2 -6
  569. package/src/runtime/routes/schedule-routes.ts +3 -6
  570. package/src/runtime/routes/secret-routes.ts +87 -18
  571. package/src/runtime/routes/settings-routes.ts +29 -28
  572. package/src/runtime/routes/skills-routes.ts +12 -31
  573. package/src/runtime/routes/suggest-trust-rule-routes.ts +32 -1
  574. package/src/runtime/routes/task-routes.ts +6 -6
  575. package/src/runtime/routes/trust-rules-routes.ts +3 -94
  576. package/src/runtime/routes/types.ts +4 -4
  577. package/src/runtime/routes/upgrade-broadcast-routes.ts +3 -10
  578. package/src/runtime/routes/usage-routes.ts +87 -10
  579. package/src/runtime/routes/user-routes.ts +17 -31
  580. package/src/runtime/routes/work-items-routes.ts +1 -4
  581. package/src/runtime/services/__tests__/analyze-conversation.test.ts +2 -2
  582. package/src/runtime/services/analyze-conversation.ts +7 -17
  583. package/src/runtime/services/conversation-serializer.ts +2 -4
  584. package/src/runtime/verification-outbound-actions.ts +1 -1
  585. package/src/runtime/verification-rate-limiter.ts +1 -1
  586. package/src/schedule/schedule-store.ts +0 -16
  587. package/src/security/secret-scanner.ts +14 -547
  588. package/src/security/secure-keys.ts +31 -11
  589. package/src/security/token-manager.ts +7 -3
  590. package/src/signals/cancel.ts +16 -25
  591. package/src/signals/conversation-undo.ts +2 -27
  592. package/src/signals/emit-event.ts +1 -2
  593. package/src/signals/user-message.ts +108 -22
  594. package/src/skills/catalog-install.ts +1 -0
  595. package/src/skills/clawhub.ts +2 -2
  596. package/src/skills/inline-command-runner.ts +1 -7
  597. package/src/subagent/manager.ts +67 -84
  598. package/src/tasks/task-store.ts +1 -28
  599. package/src/telemetry/types.ts +6 -0
  600. package/src/telemetry/usage-telemetry-reporter.test.ts +38 -15
  601. package/src/telemetry/usage-telemetry-reporter.ts +3 -5
  602. package/src/tools/acp/spawn.test.ts +1 -2
  603. package/src/tools/acp/steer.test.ts +1 -2
  604. package/src/tools/browser/__tests__/browser-status.test.ts +44 -127
  605. package/src/tools/browser/browser-execution.ts +31 -147
  606. package/src/tools/browser/cdp-client/__tests__/factory.test.ts +92 -68
  607. package/src/tools/browser/cdp-client/factory.ts +48 -76
  608. package/src/tools/browser/cdp-client/index.ts +1 -14
  609. package/src/tools/executor.ts +44 -31
  610. package/src/tools/host-filesystem/edit.ts +3 -2
  611. package/src/tools/host-filesystem/read.ts +3 -2
  612. package/src/tools/host-filesystem/transfer.test.ts +45 -42
  613. package/src/tools/host-filesystem/transfer.ts +4 -3
  614. package/src/tools/host-filesystem/write.ts +3 -2
  615. package/src/tools/host-terminal/host-shell.ts +4 -3
  616. package/src/tools/network/script-proxy/index.ts +1 -10
  617. package/src/tools/permission-checker.ts +66 -1
  618. package/src/tools/skills/sandbox-runner.ts +1 -6
  619. package/src/tools/skills/skill-tool-factory.ts +32 -0
  620. package/src/tools/terminal/safe-env.ts +1 -0
  621. package/src/tools/terminal/shell.ts +2 -78
  622. package/src/tools/types.ts +12 -39
  623. package/src/tts/__tests__/provider-catalog.test.ts +2 -2
  624. package/src/tts/provider-catalog.ts +1 -1
  625. package/src/usage/actors.ts +2 -1
  626. package/src/usage/attribution.ts +185 -0
  627. package/src/usage/pricing.ts +166 -0
  628. package/src/usage/types.ts +14 -0
  629. package/src/util/json.ts +13 -0
  630. package/src/util/logger.ts +3 -3
  631. package/src/util/pricing.ts +50 -3
  632. package/src/work-items/work-item-runner.ts +15 -42
  633. package/src/workspace/migrations/050-seed-main-agent-opus-callsite.ts +4 -3
  634. package/src/workspace/migrations/052-seed-default-inference-profiles.ts +3 -3
  635. package/src/workspace/migrations/060-memory-v2-init.ts +2 -18
  636. package/src/workspace/migrations/061-move-backup-key-to-workspace.ts +59 -0
  637. package/src/workspace/migrations/062-drop-memory-v2-edges-json.ts +27 -0
  638. package/src/workspace/migrations/063-release-notes-dynamic-model-context.ts +70 -0
  639. package/src/workspace/migrations/064-unwind-main-agent-opus-seed.ts +64 -0
  640. package/src/workspace/migrations/registry.ts +8 -0
  641. package/src/workspace/provider-commit-message-generator.ts +3 -3
  642. package/src/__tests__/sandbox-diagnostics.test.ts +0 -138
  643. package/src/__tests__/sandbox-host-parity.test.ts +0 -1024
  644. package/src/__tests__/secret-detection-handler.test.ts +0 -67
  645. package/src/__tests__/secret-scanner-executor.test.ts +0 -450
  646. package/src/__tests__/tcc-sandbox-deny.test.ts +0 -198
  647. package/src/__tests__/terminal-sandbox.test.ts +0 -374
  648. package/src/__tests__/tool-notification-listener.test.ts +0 -65
  649. package/src/context/__tests__/microcompact.test.ts +0 -805
  650. package/src/context/microcompact.ts +0 -443
  651. package/src/daemon/handlers/slack-channel-oauth-install.ts +0 -197
  652. package/src/events/tool-notification-listener.ts +0 -17
  653. package/src/ipc/routes/__tests__/memory-v2-validate.test.ts +0 -219
  654. package/src/memory/v2/__tests__/edges.test.ts +0 -435
  655. package/src/memory/v2/edges.ts +0 -217
  656. package/src/prompts/__tests__/system-prompt-memory-v2.test.ts +0 -197
  657. package/src/runtime/__tests__/chrome-extension-registry.test.ts +0 -518
  658. package/src/runtime/__tests__/client-registry.test.ts +0 -271
  659. package/src/runtime/chrome-extension-registry.ts +0 -368
  660. package/src/runtime/client-registry.ts +0 -254
  661. package/src/runtime/routes/inbound-stages/verification-intercept.ts +0 -329
  662. package/src/tools/secret-detection-handler.ts +0 -269
  663. package/src/tools/terminal/backends/native.ts +0 -327
  664. package/src/tools/terminal/backends/types.ts +0 -37
  665. package/src/tools/terminal/sandbox-diagnostics.ts +0 -87
  666. package/src/tools/terminal/sandbox.ts +0 -40
package/src/cli.ts CHANGED
@@ -498,27 +498,6 @@ export async function startCli(): Promise<void> {
498
498
  prompt();
499
499
  break;
500
500
 
501
- case "secret_detected": {
502
- const wasSpinning = spinner.isSpinning;
503
- spinner.stop();
504
- const types = msg.matches.map((m) => m.type).join(", ");
505
- const actionLabel =
506
- msg.action === "redact"
507
- ? "redacted"
508
- : msg.action === "block"
509
- ? "blocked"
510
- : "detected";
511
- process.stdout.write(
512
- `\n ⚠ Secret ${actionLabel} in ${msg.toolName} output: ${types}\n`,
513
- );
514
- for (const match of msg.matches) {
515
- process.stdout.write(` • ${match.type}: ${match.redactedValue}\n`);
516
- }
517
- process.stdout.write("\n");
518
- if (wasSpinning) spinner.start("Thinking...");
519
- break;
520
- }
521
-
522
501
  case "conversation_list_response":
523
502
  if (pendingSessionPick) {
524
503
  renderConversationPicker(msg.conversations);
@@ -31,7 +31,7 @@ function loadRegistry(): Record<string, unknown> {
31
31
  return JSON.parse(raw);
32
32
  }
33
33
 
34
- const VALID_SCOPES = new Set(["assistant", "macos"]);
34
+ const VALID_SCOPES = new Set(["assistant", "client"]);
35
35
 
36
36
  // ---------------------------------------------------------------------------
37
37
  // Tests
@@ -169,7 +169,7 @@ describe("unified feature flag registry guard", () => {
169
169
  const scope = flag.scope as string;
170
170
  if (!VALID_SCOPES.has(scope)) {
171
171
  violations.push(
172
- `flag '${flag.id}' has invalid scope '${scope}' (expected 'assistant' or 'macos')`,
172
+ `flag '${flag.id}' has invalid scope '${scope}' (expected 'assistant' or 'client')`,
173
173
  );
174
174
  }
175
175
  }
@@ -21,7 +21,8 @@
21
21
  "type": "string",
22
22
  "description": "Brief non-technical explanation of why this tool is being called"
23
23
  }
24
- }
24
+ },
25
+ "additionalProperties": false
25
26
  },
26
27
  "executor": "tools/messaging-auth-test.ts",
27
28
  "execution_target": "host"
@@ -58,7 +59,8 @@
58
59
  "type": "string",
59
60
  "description": "Brief non-technical explanation of why this tool is being called"
60
61
  }
61
- }
62
+ },
63
+ "additionalProperties": false
62
64
  },
63
65
  "executor": "tools/messaging-list-conversations.ts",
64
66
  "execution_target": "host"
@@ -96,6 +98,7 @@
96
98
  "description": "Brief non-technical explanation of why this tool is being called"
97
99
  }
98
100
  },
101
+ "additionalProperties": false,
99
102
  "required": ["conversation_id"]
100
103
  },
101
104
  "executor": "tools/messaging-read.ts",
@@ -130,6 +133,7 @@
130
133
  "description": "Brief non-technical explanation of why this tool is being called"
131
134
  }
132
135
  },
136
+ "additionalProperties": false,
133
137
  "required": ["query"]
134
138
  },
135
139
  "executor": "tools/messaging-search.ts",
@@ -187,6 +191,7 @@
187
191
  "description": "Brief non-technical explanation of why this tool is being called"
188
192
  }
189
193
  },
194
+ "additionalProperties": false,
190
195
  "required": ["conversation_id", "text", "confidence"]
191
196
  },
192
197
  "executor": "tools/messaging-send.ts",
@@ -221,6 +226,7 @@
221
226
  "description": "Brief non-technical explanation of why this tool is being called"
222
227
  }
223
228
  },
229
+ "additionalProperties": false,
224
230
  "required": ["conversation_id"]
225
231
  },
226
232
  "executor": "tools/messaging-mark-read.ts",
@@ -254,7 +260,8 @@
254
260
  "type": "string",
255
261
  "description": "Brief non-technical explanation of why this tool is being called"
256
262
  }
257
- }
263
+ },
264
+ "additionalProperties": false
258
265
  },
259
266
  "executor": "tools/messaging-analyze-style.ts",
260
267
  "execution_target": "host"
@@ -301,6 +308,7 @@
301
308
  "description": "Brief non-technical explanation of why this tool is being called"
302
309
  }
303
310
  },
311
+ "additionalProperties": false,
304
312
  "required": ["action"]
305
313
  },
306
314
  "executor": "tools/messaging-draft.ts",
@@ -342,7 +350,8 @@
342
350
  "type": "string",
343
351
  "description": "Brief non-technical explanation of why this tool is being called"
344
352
  }
345
- }
353
+ },
354
+ "additionalProperties": false
346
355
  },
347
356
  "executor": "tools/messaging-sender-digest.ts",
348
357
  "execution_target": "host"
@@ -380,6 +389,7 @@
380
389
  "description": "Set to true ONLY when the user's most recent message contains explicit approval language for this specific action (e.g. 'archive these', 'yes do it', 'go ahead'). Do NOT set this when the user merely described what they want without confirming, or when acting on prior instructions without fresh confirmation in this turn."
381
390
  }
382
391
  },
392
+ "additionalProperties": false,
383
393
  "required": ["query", "confidence"]
384
394
  },
385
395
  "executor": "tools/messaging-archive-by-sender.ts",
@@ -116,6 +116,17 @@ export function getCpuLimit(): string | undefined {
116
116
  return str("VELLUM_CPU_LIMIT");
117
117
  }
118
118
 
119
+ /**
120
+ * VELLUM_MINIKUBE_STORAGE_SIZE — string (K8s resource format), default: undefined
121
+ * The PVC storage request size for the assistant volume (e.g. "10Gi").
122
+ * Only set in minikube (local dev) mode. Used by the health endpoint to
123
+ * report accurate disk capacity on hostPath-backed PVCs where statfsSync
124
+ * reports the host's entire filesystem instead of the PVC.
125
+ */
126
+ export function getMinikubeStorageSize(): string | undefined {
127
+ return str("VELLUM_MINIKUBE_STORAGE_SIZE");
128
+ }
129
+
119
130
  /**
120
131
  * VELLUM_PROFILER_RUN_ID — string, default: undefined
121
132
  * Unique identifier for the current profiler run. When set, the profiler
@@ -177,7 +188,6 @@ const KNOWN_VELLUM_VARS = new Set([
177
188
  "VELLUM_CLOUD",
178
189
  "VELLUM_CUSTOM_QR_CODE_PATH",
179
190
  "VELLUM_DAEMON_AUTOSTART",
180
- "VELLUM_DAEMON_NOAUTH",
181
191
  "VELLUM_DATA_DIR",
182
192
  "VELLUM_DEBUG",
183
193
  "VELLUM_DESKTOP_APP",
@@ -198,10 +208,10 @@ const KNOWN_VELLUM_VARS = new Set([
198
208
  "VELLUM_PROFILER_RUN_ID",
199
209
  "VELLUM_ROOT_DIR",
200
210
  "VELLUM_SSH_USER",
201
- "VELLUM_UNSAFE_AUTH_BYPASS",
202
211
  "VELLUM_WORKSPACE_DIR",
203
212
  "VELLUM_CPU_LIMIT",
204
213
  "VELLUM_MEMORY_LIMIT",
214
+ "VELLUM_MINIKUBE_STORAGE_SIZE",
205
215
  ]);
206
216
 
207
217
  /**
package/src/config/env.ts CHANGED
@@ -88,22 +88,11 @@ export function getRuntimeHttpHost(): string {
88
88
  }
89
89
 
90
90
  /**
91
- * True when HTTP API auth is disabled via DISABLE_HTTP_AUTH=true AND the
92
- * safety gate VELLUM_UNSAFE_AUTH_BYPASS=1 is also set. Without the safety
93
- * gate, the bypass is ignored.
91
+ * True when HTTP API auth is disabled via DISABLE_HTTP_AUTH=true.
92
+ * Used in platform-managed deployments where the platform handles auth.
94
93
  */
95
94
  export function isHttpAuthDisabled(): boolean {
96
- if (str("DISABLE_HTTP_AUTH")?.toLowerCase() !== "true") return false;
97
- return str("VELLUM_UNSAFE_AUTH_BYPASS")?.trim() === "1";
98
- }
99
-
100
- /**
101
- * True when DISABLE_HTTP_AUTH is set but the safety gate
102
- * VELLUM_UNSAFE_AUTH_BYPASS=1 is missing — used for warning messages.
103
- */
104
- export function hasUngatedHttpAuthDisabled(): boolean {
105
- if (str("DISABLE_HTTP_AUTH")?.toLowerCase() !== "true") return false;
106
- return str("VELLUM_UNSAFE_AUTH_BYPASS")?.trim() !== "1";
95
+ return str("DISABLE_HTTP_AUTH")?.toLowerCase() === "true";
107
96
  }
108
97
 
109
98
  // ── Monitoring ───────────────────────────────────────────────────────────────
@@ -19,7 +19,7 @@
19
19
  },
20
20
  {
21
21
  "id": "user-hosted-enabled",
22
- "scope": "macos",
22
+ "scope": "client",
23
23
  "key": "user-hosted-enabled",
24
24
  "label": "User Hosted Enabled",
25
25
  "description": "Enable user-hosted onboarding flow",
@@ -27,7 +27,7 @@
27
27
  },
28
28
  {
29
29
  "id": "local-docker-enabled",
30
- "scope": "macos",
30
+ "scope": "client",
31
31
  "key": "local-docker-enabled",
32
32
  "label": "Local Docker Mode",
33
33
  "description": "When enabled, the Local hosting option uses Docker under the hood for sandboxed execution, hiding the separate Docker card",
@@ -51,7 +51,7 @@
51
51
  },
52
52
  {
53
53
  "id": "mobile-pairing",
54
- "scope": "macos",
54
+ "scope": "client",
55
55
  "key": "mobile-pairing",
56
56
  "label": "Mobile Pairing",
57
57
  "description": "Show the Mobile (iOS) pairing card in Settings > Account",
@@ -67,7 +67,7 @@
67
67
  },
68
68
  {
69
69
  "id": "developer-menu-items",
70
- "scope": "macos",
70
+ "scope": "client",
71
71
  "key": "developer-menu-items",
72
72
  "label": "Developer Menu Items",
73
73
  "description": "Show Component Gallery and Replay Onboarding in the menu bar",
@@ -123,7 +123,7 @@
123
123
  },
124
124
  {
125
125
  "id": "settings-billing",
126
- "scope": "macos",
126
+ "scope": "client",
127
127
  "key": "settings-billing",
128
128
  "label": "Billing Settings Tab",
129
129
  "description": "Show the Billing tab in Settings when signed in, displaying credits balance and top-up",
@@ -131,7 +131,7 @@
131
131
  },
132
132
  {
133
133
  "id": "referral-codes",
134
- "scope": "macos",
134
+ "scope": "client",
135
135
  "key": "referral-codes",
136
136
  "label": "Referral Codes",
137
137
  "description": "Surface the Earn Credits referral entry points (sidebar drawer row and Billing tab button) that open the referral modal",
@@ -139,7 +139,7 @@
139
139
  },
140
140
  {
141
141
  "id": "managed-sign-in",
142
- "scope": "macos",
142
+ "scope": "client",
143
143
  "key": "managed-sign-in",
144
144
  "label": "Managed Sign In",
145
145
  "description": "Enable managed (organization-hosted) sign-in flow in the onboarding experience",
@@ -179,7 +179,7 @@
179
179
  },
180
180
  {
181
181
  "id": "quick-input",
182
- "scope": "macos",
182
+ "scope": "client",
183
183
  "key": "quick-input",
184
184
  "label": "Quick Input",
185
185
  "description": "Enable the Quick Input popover on right-click of the menu bar icon",
@@ -187,7 +187,7 @@
187
187
  },
188
188
  {
189
189
  "id": "expand-completed-steps",
190
- "scope": "macos",
190
+ "scope": "client",
191
191
  "key": "expand-completed-steps",
192
192
  "label": "Expand Completed Steps",
193
193
  "description": "Auto-expand completed tool call step groups instead of showing them collapsed",
@@ -195,7 +195,7 @@
195
195
  },
196
196
  {
197
197
  "id": "show-thinking-blocks",
198
- "scope": "macos",
198
+ "scope": "client",
199
199
  "key": "show-thinking-blocks",
200
200
  "label": "Show Thinking Blocks",
201
201
  "description": "Display the assistant's thinking/reasoning inline in chat messages as collapsible blocks",
@@ -267,7 +267,7 @@
267
267
  },
268
268
  {
269
269
  "id": "teleport",
270
- "scope": "macos",
270
+ "scope": "client",
271
271
  "key": "teleport",
272
272
  "label": "Teleport",
273
273
  "description": "Enable teleport UI in General settings for moving assistants between hosting environments",
@@ -275,7 +275,7 @@
275
275
  },
276
276
  {
277
277
  "id": "apple-container",
278
- "scope": "macos",
278
+ "scope": "client",
279
279
  "key": "apple-container",
280
280
  "label": "Apple Container",
281
281
  "description": "Enable assistant sandboxing via Apple Containers on macOS 26+, providing a lightweight native sandbox without third-party dependencies",
@@ -299,7 +299,7 @@
299
299
  },
300
300
  {
301
301
  "id": "fork-from-message",
302
- "scope": "macos",
302
+ "scope": "client",
303
303
  "key": "fork-from-message",
304
304
  "label": "Fork from Message",
305
305
  "description": "Show the 'Fork from here' option in message overflow menus",
@@ -307,7 +307,7 @@
307
307
  },
308
308
  {
309
309
  "id": "onboarding-pre-chat",
310
- "scope": "macos",
310
+ "scope": "client",
311
311
  "key": "onboarding-pre-chat",
312
312
  "label": "Pre-Chat Onboarding Flow",
313
313
  "description": "Gates the 3-screen pre-chat onboarding flow (tools, tasks/tone, name exchange) shown before the first conversation",
@@ -315,7 +315,7 @@
315
315
  },
316
316
  {
317
317
  "id": "home-tab",
318
- "scope": "macos",
318
+ "scope": "client",
319
319
  "key": "home-tab",
320
320
  "label": "Home Tab",
321
321
  "description": "Replace the knowledge graph top-level tab with a new Home page showing relationship progression, facts, and capability tiers",
@@ -337,17 +337,9 @@
337
337
  "description": "Enables the Google Meet joining bot and the meet-join skill.",
338
338
  "defaultEnabled": false
339
339
  },
340
- {
341
- "id": "compaction-v2",
342
- "scope": "assistant",
343
- "key": "compaction-v2",
344
- "label": "Compaction v2",
345
- "description": "Boundary-message-based compaction pipeline with forked prompt-cache-shared summarization and microcompact pre-pass. Replaces the four-tier overflow reducer and cursor-based storage.",
346
- "defaultEnabled": false
347
- },
348
340
  {
349
341
  "id": "scroll-debug-overlay",
350
- "scope": "macos",
342
+ "scope": "client",
351
343
  "key": "scroll-debug-overlay",
352
344
  "label": "Scroll Debug Overlay",
353
345
  "description": "Show a live HUD in the top-right of the conversation with scroll geometry, velocity, update rate, and anchor-preserver activity. Developer diagnostic for investigating scroll jank.",
@@ -355,12 +347,20 @@
355
347
  },
356
348
  {
357
349
  "id": "message-height-cache",
358
- "scope": "macos",
350
+ "scope": "client",
359
351
  "key": "message-height-cache",
360
352
  "label": "Message Height Cache",
361
353
  "description": "Swap the transcript's LazyVStack for a plain VStack so scrollContentHeight is the true sum of row heights (no LazyVStack estimator drift). Row frames are not pinned — the earlier frame-pinning approach was removed because it caused overlap when rows grew past their first measurement (streaming, expanding thinking blocks). Tradeoff: eager layout — every row measures up-front, which can stall for many seconds to minutes on very long conversations.",
362
354
  "defaultEnabled": true
363
355
  },
356
+ {
357
+ "id": "coding-agents-panel",
358
+ "scope": "client",
359
+ "key": "coding-agents-panel",
360
+ "label": "Coding Agents Panel",
361
+ "description": "Gate native macOS/iOS Coding Agents panel entry points and inline ACP session deep links.",
362
+ "defaultEnabled": false
363
+ },
364
364
  {
365
365
  "id": "compaction-playground",
366
366
  "scope": "assistant",
@@ -378,11 +378,11 @@
378
378
  "defaultEnabled": false
379
379
  },
380
380
  {
381
- "id": "inference-profiles",
382
- "scope": "assistant",
383
- "key": "inference-profiles",
384
- "label": "Inference Profiles",
385
- "description": "Show inference profile picker in chat, active profile dropdown, Manage Profiles button, and per-task overrides link in Settings",
381
+ "id": "account-deletion",
382
+ "scope": "client",
383
+ "key": "account-deletion",
384
+ "label": "Account Deletion",
385
+ "description": "Surfaces the user-initiated account deletion flow in client settings.",
386
386
  "defaultEnabled": false
387
387
  }
388
388
  ]
@@ -0,0 +1,12 @@
1
+ import { CALL_SITE_CATALOG } from "./schemas/call-site-catalog.js";
2
+ import type { LLMCallSite } from "./schemas/llm.js";
3
+
4
+ // Compatibility wrapper for existing usage display imports. Do not define
5
+ // labels here; call-site display metadata belongs in CALL_SITE_CATALOG.
6
+ const LLM_CALLSITE_LABELS = new Map<LLMCallSite, string>(
7
+ CALL_SITE_CATALOG.map(({ id, displayName }) => [id, displayName]),
8
+ );
9
+
10
+ export function getLLMCallSiteLabel(callSite: LLMCallSite | string): string {
11
+ return LLM_CALLSITE_LABELS.get(callSite as LLMCallSite) ?? String(callSite);
12
+ }
@@ -0,0 +1,80 @@
1
+ import { PROVIDER_CATALOG } from "../providers/model-catalog.js";
2
+ import { resolveCallSiteConfig } from "./llm-resolver.js";
3
+ import {
4
+ type ContextWindow,
5
+ DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS,
6
+ type LLMCallSite,
7
+ type LLMConfig,
8
+ } from "./schemas/llm.js";
9
+ import type { ContextWindowConfig } from "./types.js";
10
+
11
+ export interface EffectiveContextWindow {
12
+ provider: string;
13
+ model: string;
14
+ enabled: boolean;
15
+ maxInputTokens: number;
16
+ modelMaxInputTokens: number;
17
+ defaultInputTokens: number;
18
+ compactThreshold: number;
19
+ summaryBudgetRatio: number;
20
+ targetBudgetRatio: number;
21
+ overflowRecovery: ContextWindow["overflowRecovery"];
22
+ isLongContextEnabled: boolean;
23
+ maxOutputTokens?: number;
24
+ }
25
+
26
+ export function resolveEffectiveContextWindow({
27
+ llm,
28
+ callSite,
29
+ overrideProfile,
30
+ }: {
31
+ llm: LLMConfig;
32
+ callSite: LLMCallSite;
33
+ overrideProfile?: string;
34
+ }): EffectiveContextWindow {
35
+ const resolved = resolveCallSiteConfig(callSite, llm, { overrideProfile });
36
+ const catalogModel = PROVIDER_CATALOG.find(
37
+ (provider) => provider.id === resolved.provider,
38
+ )?.models.find((model) => model.id === resolved.model);
39
+
40
+ const modelMaxInputTokens =
41
+ catalogModel?.contextWindowTokens ??
42
+ DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS;
43
+ const defaultInputTokens =
44
+ catalogModel?.defaultContextWindowTokens ??
45
+ DEFAULT_CONTEXT_WINDOW_MAX_INPUT_TOKENS;
46
+ const maxInputTokens = Math.min(
47
+ resolved.contextWindow.maxInputTokens,
48
+ modelMaxInputTokens,
49
+ );
50
+
51
+ return {
52
+ provider: resolved.provider,
53
+ model: resolved.model,
54
+ enabled: resolved.contextWindow.enabled,
55
+ maxInputTokens,
56
+ modelMaxInputTokens,
57
+ defaultInputTokens,
58
+ compactThreshold: resolved.contextWindow.compactThreshold,
59
+ summaryBudgetRatio: resolved.contextWindow.summaryBudgetRatio,
60
+ targetBudgetRatio: resolved.contextWindow.targetBudgetRatio,
61
+ overflowRecovery: resolved.contextWindow.overflowRecovery,
62
+ isLongContextEnabled: maxInputTokens > defaultInputTokens,
63
+ maxOutputTokens: catalogModel?.maxOutputTokens,
64
+ };
65
+ }
66
+
67
+ export function contextWindowConfigFromEffective(
68
+ base: ContextWindowConfig,
69
+ effective: EffectiveContextWindow,
70
+ ): ContextWindowConfig {
71
+ return {
72
+ ...base,
73
+ enabled: effective.enabled,
74
+ maxInputTokens: effective.maxInputTokens,
75
+ targetBudgetRatio: effective.targetBudgetRatio,
76
+ compactThreshold: effective.compactThreshold,
77
+ summaryBudgetRatio: effective.summaryBudgetRatio,
78
+ overflowRecovery: effective.overflowRecovery,
79
+ };
80
+ }
@@ -3,8 +3,8 @@ import { z } from "zod";
3
3
  import {
4
4
  type LLMCallSite,
5
5
  LLMConfigBase,
6
- type LLMConfigFragment,
7
6
  type LLMSchema,
7
+ type ProfileEntry,
8
8
  } from "./schemas/llm.js";
9
9
 
10
10
  /**
@@ -12,13 +12,24 @@ import {
12
12
  * call-site overrides, optional per-call profile, an optional ad-hoc override
13
13
  * profile, the workspace's active profile, and the required `llm.default`.
14
14
  *
15
- * Merge layers (low → high precedence; later layers override earlier):
15
+ * Merge layers (low → high precedence; later layers override earlier) for
16
+ * non-main-agent call sites:
16
17
  * 1. `llm.default` fields (required base)
17
18
  * 2. `llm.profiles[llm.activeProfile]` (workspace-wide active profile)
18
19
  * 3. `llm.profiles[opts.overrideProfile]` (per-call ad-hoc override)
19
20
  * 4. `llm.profiles[site.profile]` fields (call-site's named profile)
20
21
  * 5. `llm.callSites[callSite]` fields (call-site override)
21
22
  *
23
+ * For `mainAgent`, the selected active/conversation profile is the direct
24
+ * user intent for the chat loop, so profile layers intentionally sit above
25
+ * any static `llm.callSites.mainAgent` defaults seeded by migrations or UI
26
+ * settings:
27
+ * 1. `llm.default`
28
+ * 2. `llm.profiles[site.profile]`
29
+ * 3. `llm.callSites.mainAgent`
30
+ * 4. `llm.profiles[llm.activeProfile]`
31
+ * 5. `llm.profiles[opts.overrideProfile]`
32
+ *
22
33
  * Nested objects (`thinking`, `contextWindow`, and
23
34
  * `contextWindow.overflowRecovery`) are deep-merged so partial overrides at
24
35
  * any nesting level merge into — rather than replace — the corresponding
@@ -38,28 +49,51 @@ export function resolveCallSiteConfig(
38
49
  ): z.infer<typeof LLMConfigBase> {
39
50
  const layers: Mergeable[] = [llm.default as Mergeable];
40
51
 
41
- // Layer: workspace-wide active profile. Silent fall-through on missing key
42
- // — schema validation in LLMSchema.superRefine catches static references.
43
52
  const activeFragment =
44
53
  llm.activeProfile != null ? llm.profiles?.[llm.activeProfile] : undefined;
45
- if (activeFragment != null) {
46
- layers.push(activeFragment as Mergeable);
47
- }
48
-
49
- // Layer: per-call ad-hoc override (e.g. a chat conversation's pinned
50
- // profile). Silent fall-through on missing key keeps the resolver pure.
51
54
  const overrideFragment =
52
55
  opts.overrideProfile != null
53
56
  ? llm.profiles?.[opts.overrideProfile]
54
57
  : undefined;
55
- if (overrideFragment != null) {
56
- layers.push(overrideFragment as Mergeable);
58
+ const site = llm.callSites?.[callSite];
59
+
60
+ if (callSite === "mainAgent") {
61
+ appendCallSiteLayers(layers, callSite, llm, site);
62
+ appendProfileLayer(layers, activeFragment);
63
+ appendProfileLayer(layers, overrideFragment);
64
+ } else {
65
+ appendProfileLayer(layers, activeFragment);
66
+ appendProfileLayer(layers, overrideFragment);
67
+ appendCallSiteLayers(layers, callSite, llm, site);
57
68
  }
58
69
 
59
- const site = llm.callSites?.[callSite];
70
+ return finalize(deepMerge(...layers));
71
+ }
72
+
73
+ // ---------------------------------------------------------------------------
74
+ // Internal helpers
75
+ // ---------------------------------------------------------------------------
76
+
77
+ type Mergeable = Record<string, unknown>;
78
+
79
+ function appendProfileLayer(
80
+ layers: Mergeable[],
81
+ profile: ProfileEntry | undefined,
82
+ ): void {
83
+ if (profile != null) {
84
+ layers.push(profileConfigFragment(profile));
85
+ }
86
+ }
87
+
88
+ function appendCallSiteLayers(
89
+ layers: Mergeable[],
90
+ callSite: LLMCallSite,
91
+ llm: z.infer<typeof LLMSchema>,
92
+ site: z.infer<typeof LLMSchema>["callSites"][LLMCallSite] | undefined,
93
+ ): void {
60
94
  if (site != null) {
61
95
  if (site.profile != null) {
62
- const profileFragment: LLMConfigFragment | undefined =
96
+ const profileFragment: ProfileEntry | undefined =
63
97
  llm.profiles?.[site.profile];
64
98
  if (profileFragment == null) {
65
99
  // Defensive: `LLMSchema.superRefine` already rejects unknown profile
@@ -70,22 +104,24 @@ export function resolveCallSiteConfig(
70
104
  `LLM call site "${callSite}" references undefined profile "${site.profile}"`,
71
105
  );
72
106
  }
73
- layers.push(profileFragment as Mergeable);
107
+ layers.push(profileConfigFragment(profileFragment));
74
108
  }
75
109
  // Strip the `profile` discriminator before merging — it isn't a
76
110
  // `LLMConfigBase` field.
77
111
  const { profile: _profile, ...siteFragment } = site;
78
112
  layers.push(siteFragment as Mergeable);
79
113
  }
80
-
81
- return finalize(deepMerge(...layers));
82
114
  }
83
115
 
84
- // ---------------------------------------------------------------------------
85
- // Internal helpers
86
- // ---------------------------------------------------------------------------
87
-
88
- type Mergeable = Record<string, unknown>;
116
+ function profileConfigFragment(profile: ProfileEntry): Mergeable {
117
+ const {
118
+ source: _source,
119
+ label: _label,
120
+ description: _description,
121
+ ...config
122
+ } = profile;
123
+ return config as Mergeable;
124
+ }
89
125
 
90
126
  /**
91
127
  * Returns true for objects we should recurse into during deep merge. We
@@ -512,9 +512,9 @@ export function mergeDefaultWorkspaceConfig(): void {
512
512
  export function loadConfig(): AssistantConfig {
513
513
  if (cached) return cached;
514
514
 
515
- // Re-entrancy guard: log calls during loading can trigger loadConfig
516
- // again. Return defaults to break the cycle instead of recursing to
517
- // stack overflow.
515
+ // Re-entrancy guard: log calls during loading (e.g. file-mode warning)
516
+ // can trigger loadConfig again. Return defaults to break the cycle
517
+ // instead of recursing to stack overflow.
518
518
  if (loading) return cloneDefaultConfig();
519
519
  loading = true;
520
520