@vellumai/assistant 0.12.0 → 0.12.1-staging.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 (406) hide show
  1. package/AGENTS.md +5 -1
  2. package/ARCHITECTURE.md +11 -12
  3. package/docs/architecture/turn-actor.md +15 -8
  4. package/openapi.yaml +292 -2
  5. package/package.json +1 -1
  6. package/scripts/smoke-desktop-window-theme.ts +186 -0
  7. package/src/__tests__/always-loaded-tools-guard.test.ts +18 -10
  8. package/src/__tests__/app-compiler.test.ts +6 -0
  9. package/src/__tests__/app-control-tool-schemas.test.ts +5 -2
  10. package/src/__tests__/app-dir-path-guard.test.ts +1 -3
  11. package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +5 -2
  12. package/src/__tests__/computer-use-tools.test.ts +17 -5
  13. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  14. package/src/__tests__/config-schema.test.ts +28 -29
  15. package/src/__tests__/config-watcher.test.ts +23 -8
  16. package/src/__tests__/connection-model-compat.test.ts +2 -2
  17. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  18. package/src/__tests__/conversation-pairing.test.ts +26 -0
  19. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +4 -10
  20. package/src/__tests__/conversation-queue.test.ts +48 -207
  21. package/src/__tests__/conversation-retry-discard.test.ts +54 -1
  22. package/src/__tests__/conversation-skill-tools.test.ts +27 -0
  23. package/src/__tests__/conversation-surfaces-app-control.test.ts +8 -3
  24. package/src/__tests__/conversation-surfaces-task-progress.test.ts +67 -0
  25. package/src/__tests__/conversation-title-service.test.ts +14 -10
  26. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +3 -5
  27. package/src/__tests__/conversation-tool-setup-attribution.test.ts +51 -0
  28. package/src/__tests__/credential-record-retire.test.ts +171 -1
  29. package/src/__tests__/credential-routes.test.ts +212 -3
  30. package/src/__tests__/credential-security-invariants.test.ts +2 -1
  31. package/src/__tests__/cu-unified-flow.test.ts +8 -2
  32. package/src/__tests__/drain-kick-guard.test.ts +0 -2
  33. package/src/__tests__/drain-requeue-on-contention.test.ts +0 -6
  34. package/src/__tests__/evict-conversations-for-reload.test.ts +1 -1
  35. package/src/__tests__/git-porcelain.test.ts +47 -0
  36. package/src/__tests__/helpers/set-workspace-mcp.ts +11 -0
  37. package/src/__tests__/host-bash-proxy.test.ts +26 -45
  38. package/src/__tests__/host-browser-proxy.test.ts +6 -17
  39. package/src/__tests__/host-file-proxy-targeted.test.ts +23 -0
  40. package/src/__tests__/host-file-proxy.test.ts +11 -23
  41. package/src/__tests__/host-transfer-proxy-targeted.test.ts +30 -9
  42. package/src/__tests__/llm-catalog-parity.test.ts +25 -0
  43. package/src/__tests__/mcp-auth-routes.test.ts +6 -9
  44. package/src/__tests__/mcp-config-secret-boundary.test.ts +78 -136
  45. package/src/__tests__/mcp-health-check.test.ts +8 -11
  46. package/src/__tests__/mcp-list-plugin-servers.test.ts +8 -10
  47. package/src/__tests__/message-deleted-hook-dispatch.test.ts +119 -0
  48. package/src/__tests__/messages-after-tiebreaker.test.ts +91 -0
  49. package/src/__tests__/messages-read-boundary-guard.test.ts +1 -1
  50. package/src/__tests__/messaging-send-tool.test.ts +355 -548
  51. package/src/__tests__/model-intents.test.ts +3 -0
  52. package/src/__tests__/outlook-messaging-provider.test.ts +6 -6
  53. package/src/__tests__/platform-client-verify-credential.test.ts +2 -0
  54. package/src/__tests__/plugin-import-boundary-guard.test.ts +13 -0
  55. package/src/__tests__/resolve-app.test.ts +135 -0
  56. package/src/__tests__/script-proxy-certs.test.ts +35 -0
  57. package/src/__tests__/skill-feature-flags-integration.test.ts +1 -1
  58. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  59. package/src/__tests__/source-fingerprint.test.ts +184 -0
  60. package/src/__tests__/subagent-tool-gate-mode.test.ts +19 -3
  61. package/src/__tests__/subagent-tools.test.ts +3 -2
  62. package/src/__tests__/telephony-tts-guard.test.ts +38 -3
  63. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +4 -0
  64. package/src/__tests__/watch-retro-tool-availability.test.ts +8 -17
  65. package/src/__tests__/workspace-git-service.test.ts +26 -0
  66. package/src/__tests__/workspace-migration-154-repair-retired-codex-gpt-5-4-model-ids.test.ts +336 -0
  67. package/src/acp/__tests__/agent-process.test.ts +258 -4
  68. package/src/acp/__tests__/auth-required.test.ts +96 -0
  69. package/src/acp/__tests__/client-handler.test.ts +90 -2
  70. package/src/acp/__tests__/helpers/acp-model-option.ts +51 -0
  71. package/src/acp/__tests__/session-manager-persistence.test.ts +5 -1
  72. package/src/acp/__tests__/session-manager-resume.test.ts +270 -6
  73. package/src/acp/__tests__/session-manager-usage.test.ts +4 -2
  74. package/src/acp/__tests__/session-manager.test.ts +895 -4
  75. package/src/acp/agent-process.test.ts +4 -1
  76. package/src/acp/agent-process.ts +94 -9
  77. package/src/acp/auth-required.ts +50 -1
  78. package/src/acp/auto-install.test.ts +9 -7
  79. package/src/acp/client-handler.ts +16 -3
  80. package/src/acp/model-config.test.ts +166 -0
  81. package/src/acp/model-config.ts +138 -0
  82. package/src/acp/resolve-agent.test.ts +220 -6
  83. package/src/acp/resolve-agent.ts +88 -23
  84. package/src/acp/session-manager.test.ts +196 -3
  85. package/src/acp/session-manager.ts +441 -18
  86. package/src/acp/types.ts +50 -5
  87. package/src/api/events/acp-session-model-update.test.ts +88 -0
  88. package/src/api/events/acp-session-model-update.ts +46 -0
  89. package/src/api/events/app-files-changed.ts +4 -3
  90. package/src/api/index.ts +6 -0
  91. package/src/apps/app-store.ts +1 -1
  92. package/src/apps/resolve-app.ts +81 -0
  93. package/src/apps/source-fingerprint.ts +266 -0
  94. package/src/bundler/app-compiler.ts +15 -0
  95. package/src/calls/__tests__/barge-in-guard.test.ts +81 -0
  96. package/src/{__tests__ → calls/__tests__}/call-controller.test.ts +503 -82
  97. package/src/{__tests__ → calls/__tests__}/media-stream-audio-transcode.test.ts +1 -1
  98. package/src/{__tests__ → calls/__tests__}/media-stream-output.test.ts +37 -8
  99. package/src/{__tests__ → calls/__tests__}/media-stream-parser.test.ts +1 -1
  100. package/src/{__tests__ → calls/__tests__}/media-stream-server-integration.test.ts +150 -57
  101. package/src/{__tests__ → calls/__tests__}/media-stream-stt-session.test.ts +5 -5
  102. package/src/{__tests__ → calls/__tests__}/media-turn-detector.test.ts +1 -1
  103. package/src/{live-voice → calls}/__tests__/progress-narration.test.ts +4 -4
  104. package/src/{live-voice → calls}/__tests__/progress-phrases.test.ts +1 -1
  105. package/src/calls/__tests__/voice-control-protocol.test.ts +58 -25
  106. package/src/calls/__tests__/voice-leg-coordinator.test.ts +229 -0
  107. package/src/calls/__tests__/voice-progress-cadence.test.ts +274 -0
  108. package/src/{__tests__/voice-session-bridge.test.ts → calls/__tests__/voice-session-bridge-turn-flow.test.ts} +20 -12
  109. package/src/calls/__tests__/voice-session-bridge.test.ts +37 -1
  110. package/src/calls/__tests__/voice-triage-escalate.test.ts +105 -0
  111. package/src/calls/barge-in-guard.ts +118 -0
  112. package/src/calls/call-constants.ts +24 -4
  113. package/src/calls/call-controller.ts +499 -199
  114. package/src/calls/call-transport.ts +16 -0
  115. package/src/calls/media-stream-output.ts +32 -0
  116. package/src/calls/media-stream-server.ts +82 -30
  117. package/src/calls/media-stream-stt-session.ts +15 -0
  118. package/src/{live-voice → calls}/progress-narration.ts +2 -2
  119. package/src/calls/resolve-call-tts-provider.ts +33 -2
  120. package/src/calls/tts-call-strategy.ts +9 -5
  121. package/src/calls/types.ts +2 -0
  122. package/src/calls/voice-control-protocol.ts +53 -21
  123. package/src/calls/voice-leg-coordinator.ts +189 -0
  124. package/src/calls/voice-progress-cadence.ts +423 -0
  125. package/src/calls/voice-session-bridge.ts +59 -46
  126. package/src/calls/voice-triage-escalate.ts +175 -56
  127. package/src/cli/commands/__tests__/apps.test.ts +245 -0
  128. package/src/cli/commands/__tests__/roadmap.help.test.ts +19 -0
  129. package/src/cli/commands/apps.help.ts +67 -13
  130. package/src/cli/commands/apps.ts +183 -0
  131. package/src/cli/commands/channels/__tests__/send.test.ts +218 -0
  132. package/src/cli/commands/channels/index.help.ts +70 -2
  133. package/src/cli/commands/channels/index.ts +16 -3
  134. package/src/cli/commands/channels/send.ts +128 -0
  135. package/src/cli/commands/credentials.help.ts +6 -2
  136. package/src/cli/commands/credentials.ts +2 -2
  137. package/src/cli/commands/mcp.help.ts +8 -8
  138. package/src/cli/commands/mcp.ts +1 -1
  139. package/src/cli/commands/roadmap.help.ts +5 -1
  140. package/src/cli/commands/roadmap.ts +1 -1
  141. package/src/cli/lib/bundled-marketplace.json +103 -90
  142. package/src/config/__tests__/default-profile-catalog.test.ts +22 -0
  143. package/src/config/__tests__/memory-retrospective-schema.test.ts +15 -1
  144. package/src/config/__tests__/platform-identity.test.ts +117 -0
  145. package/src/config/__tests__/platform-rehydration.test.ts +93 -0
  146. package/src/config/acp-agent-write.ts +43 -0
  147. package/src/config/acp-defaults.test.ts +13 -3
  148. package/src/config/acp-defaults.ts +23 -6
  149. package/src/config/acp-schema.test.ts +81 -0
  150. package/src/config/acp-schema.ts +30 -2
  151. package/src/config/bundled-skills/acp/SKILL.md +22 -14
  152. package/src/config/bundled-skills/acp/TOOLS.json +5 -1
  153. package/src/config/bundled-skills/app-builder/SKILL.md +12 -9
  154. package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +1 -1
  155. package/src/config/bundled-skills/messaging/TOOLS.json +3 -3
  156. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +67 -139
  157. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +1 -1
  158. package/src/config/bundled-skills/screen-annotation/SKILL.md +8 -1
  159. package/src/config/bundled-skills/screen-annotation/tools/screen-annotation.test.ts +4 -1
  160. package/src/config/bundled-skills/skill-management/TOOLS.json +2 -2
  161. package/src/config/default-profile-catalog.ts +1 -1
  162. package/src/config/env.ts +2 -2
  163. package/src/config/feature-flag-registry.json +8 -12
  164. package/src/config/memory-v3-gate.test.ts +31 -0
  165. package/src/config/memory-v3-gate.ts +20 -16
  166. package/src/config/platform-identity.ts +144 -0
  167. package/src/config/platform-rehydration.ts +75 -21
  168. package/src/config/schema.ts +2 -2
  169. package/src/config/schemas/__tests__/live-voice.test.ts +8 -158
  170. package/src/config/schemas/__tests__/voice.test.ts +148 -0
  171. package/src/config/schemas/calls.ts +1 -28
  172. package/src/config/schemas/live-voice.ts +1 -173
  173. package/src/config/schemas/mcp.ts +1 -1
  174. package/src/config/schemas/memory-retrospective.ts +10 -0
  175. package/src/config/schemas/skills.ts +0 -14
  176. package/src/config/schemas/voice.ts +150 -0
  177. package/src/credential-execution/process-manager.test.ts +18 -19
  178. package/src/daemon/__tests__/conversation-tool-setup.test.ts +66 -121
  179. package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +4 -1
  180. package/src/daemon/__tests__/skill-memory-refresh-mtime.test.ts +133 -0
  181. package/src/daemon/app-change-notify.ts +45 -0
  182. package/src/daemon/config-watcher.ts +13 -194
  183. package/src/daemon/conversation-process.ts +35 -64
  184. package/src/daemon/conversation-skill-tools.ts +13 -31
  185. package/src/daemon/conversation-store.ts +1 -1
  186. package/src/daemon/conversation-surfaces.ts +10 -8
  187. package/src/daemon/conversation-tool-setup.ts +37 -43
  188. package/src/daemon/conversation.ts +0 -3
  189. package/src/daemon/host-bash-proxy.ts +8 -12
  190. package/src/daemon/host-browser-proxy.ts +15 -1
  191. package/src/daemon/host-file-proxy.ts +8 -10
  192. package/src/daemon/host-transfer-proxy.ts +14 -18
  193. package/src/daemon/lifecycle.ts +0 -5
  194. package/src/daemon/mcp-reload-service.ts +5 -5
  195. package/src/daemon/message-types/sync.ts +1 -0
  196. package/src/daemon/providers-setup.ts +1 -1
  197. package/src/daemon/shutdown-handlers.ts +1 -9
  198. package/src/daemon/skill-memory-refresh.ts +64 -0
  199. package/src/daemon/tool-side-effects.ts +7 -18
  200. package/src/desktop/__tests__/fake-desktop.ts +119 -0
  201. package/src/desktop/desktop-chrome-policy.test.ts +71 -0
  202. package/src/desktop/desktop-chrome-policy.ts +42 -0
  203. package/src/desktop/desktop-dependencies.test.ts +102 -0
  204. package/src/desktop/desktop-dependencies.ts +306 -0
  205. package/src/desktop/desktop-feature.test.ts +18 -0
  206. package/src/desktop/desktop-feature.ts +19 -0
  207. package/src/desktop/desktop-panel-config.test.ts +135 -0
  208. package/src/desktop/desktop-panel-config.ts +149 -0
  209. package/src/desktop/desktop-session-manager.test.ts +627 -0
  210. package/src/desktop/desktop-session-manager.ts +814 -0
  211. package/src/desktop/desktop-stream-bridge.test.ts +395 -0
  212. package/src/desktop/desktop-stream-bridge.ts +214 -0
  213. package/src/desktop/desktop-wallpaper.test.ts +191 -0
  214. package/src/desktop/desktop-wallpaper.ts +113 -0
  215. package/src/desktop/desktop-window-theme.ts +170 -0
  216. package/src/hooks/types.ts +33 -0
  217. package/src/i18n/AGENTS.md +22 -0
  218. package/src/i18n/__tests__/i18n.test.ts +108 -0
  219. package/src/i18n/index.ts +16 -0
  220. package/src/i18n/locales.ts +93 -0
  221. package/src/i18n/messages.ts +61 -0
  222. package/src/i18n/title.ts +25 -0
  223. package/src/inbound/platform-callback-registration.ts +4 -5
  224. package/src/live-voice/__tests__/live-voice-metrics.test.ts +0 -3
  225. package/src/live-voice/__tests__/live-voice-progress.test.ts +15 -15
  226. package/src/live-voice/__tests__/live-voice-vad.test.ts +2 -2
  227. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +13 -69
  228. package/src/live-voice/live-voice-session.ts +213 -693
  229. package/src/live-voice/protocol.ts +0 -2
  230. package/src/mcp/__tests__/effective-config.test.ts +2 -2
  231. package/src/mcp/__tests__/workspace-mcp-config.test.ts +135 -0
  232. package/src/mcp/effective-config.ts +3 -3
  233. package/src/mcp/mcp-header-store.ts +29 -45
  234. package/src/mcp/spec-schema.ts +111 -0
  235. package/src/mcp/startup.ts +8 -4
  236. package/src/mcp/workspace-mcp-config.ts +188 -0
  237. package/src/messaging/provider.ts +10 -3
  238. package/src/messaging/providers/__tests__/proactive-address.test.ts +95 -0
  239. package/src/messaging/providers/callback-routing.ts +18 -0
  240. package/src/messaging/providers/channel-transport.ts +56 -0
  241. package/src/messaging/providers/discord/transport.ts +17 -0
  242. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +6 -17
  243. package/src/messaging/providers/slack/adapter.ts +7 -44
  244. package/src/messaging/providers/slack/transport.ts +16 -0
  245. package/src/messaging/providers/telegram-bot/adapter.ts +1 -48
  246. package/src/messaging/providers/telegram-bot/client.ts +0 -26
  247. package/src/messaging/providers/telegram-bot/transport.ts +20 -0
  248. package/src/messaging/providers/whatsapp/adapter.ts +1 -48
  249. package/src/messaging/providers/whatsapp/transport.ts +18 -0
  250. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +8 -0
  251. package/src/notifications/__tests__/assistant-reply-producer.test.ts +55 -0
  252. package/src/notifications/__tests__/home-feed-side-effect.test.ts +153 -3
  253. package/src/notifications/assistant-reply-producer.ts +8 -3
  254. package/src/notifications/conversation-pairing.ts +36 -16
  255. package/src/notifications/delivered-post-record.ts +11 -1
  256. package/src/notifications/home-feed-side-effect.ts +55 -7
  257. package/src/outbound-proxy/certs.ts +3 -5
  258. package/src/permissions/checker.test.ts +11 -6
  259. package/src/persistence/compaction-log-store-clickhouse.ts +3 -3
  260. package/src/persistence/conversation-crud.ts +71 -63
  261. package/src/persistence/conversation-lineage.ts +12 -4
  262. package/src/persistence/conversation-title-placeholders.ts +23 -0
  263. package/src/persistence/conversation-title-service.ts +9 -26
  264. package/src/persistence/llm-request-log-sink-clickhouse.ts +3 -3
  265. package/src/persistence/llm-request-log-source-clickhouse.ts +3 -3
  266. package/src/persistence/message-cursor.ts +78 -0
  267. package/src/persistence/message-reads.ts +30 -0
  268. package/src/persistence/migrations/157-invite-contact-id.ts +18 -6
  269. package/src/persistence/migrations/__tests__/157-invite-contact-id.test.ts +149 -0
  270. package/src/persistence/schema/memory-core.ts +5 -0
  271. package/src/platform/client.test.ts +2 -0
  272. package/src/platform/client.ts +2 -10
  273. package/src/plugin-api/constants.ts +2 -0
  274. package/src/plugin-api/index.ts +1 -0
  275. package/src/plugin-api/types.ts +2 -0
  276. package/src/plugins/defaults/index.ts +2 -0
  277. package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +46 -0
  278. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-backfill.test.ts +118 -0
  279. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-preserve.test.ts +83 -0
  280. package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +9 -5
  281. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +20 -10
  282. package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +219 -0
  283. package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +31 -0
  284. package/src/plugins/defaults/memory/__tests__/memory-retrospective-trigger-check.test.ts +63 -0
  285. package/src/plugins/defaults/memory/__tests__/shutdown-hook.test.ts +4 -0
  286. package/src/plugins/defaults/memory/graph/capability-seed.ts +4 -6
  287. package/src/plugins/defaults/memory/hooks/init.ts +10 -0
  288. package/src/plugins/defaults/memory/hooks/message-deleted.ts +21 -0
  289. package/src/plugins/defaults/memory/hooks/shutdown.ts +2 -0
  290. package/src/plugins/defaults/memory/jobs-worker.ts +13 -0
  291. package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +34 -60
  292. package/src/plugins/defaults/memory/memory-retrospective-cursor-backfill.ts +126 -0
  293. package/src/plugins/defaults/memory/memory-retrospective-cursor-preserve.ts +79 -0
  294. package/src/plugins/defaults/memory/memory-retrospective-cursor.ts +28 -0
  295. package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +3 -5
  296. package/src/plugins/defaults/memory/memory-retrospective-job.ts +12 -3
  297. package/src/plugins/defaults/memory/memory-retrospective-state.ts +312 -71
  298. package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +2 -1
  299. package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +5 -3
  300. package/src/plugins/defaults/memory/skill-md-mtime-poll.ts +9 -0
  301. package/src/plugins/defaults/memory/startup.ts +6 -1
  302. package/src/plugins/defaults/memory/substrate/__tests__/skill-content.test.ts +7 -9
  303. package/src/plugins/defaults/memory/substrate/skill-content.ts +2 -2
  304. package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +89 -0
  305. package/src/plugins/defaults/memory/worker.ts +6 -0
  306. package/src/plugins/mcp-servers.ts +15 -75
  307. package/src/providers/__tests__/connection-model-compat.test.ts +3 -3
  308. package/src/providers/gemini/client.ts +9 -23
  309. package/src/providers/gemini-thought-signature.test.ts +63 -0
  310. package/src/providers/gemini-thought-signature.ts +44 -0
  311. package/src/providers/model-catalog.ts +34 -0
  312. package/src/providers/model-intents.ts +10 -5
  313. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +146 -18
  314. package/src/providers/openai/__tests__/chat-completions-provider-thought-signature.test.ts +613 -0
  315. package/src/providers/openai/__tests__/google-thought-signature.test.ts +235 -0
  316. package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +83 -1
  317. package/src/providers/openai/chat-completions-provider.ts +192 -78
  318. package/src/providers/openai/codex-models.ts +0 -4
  319. package/src/providers/openai/google-thought-signature.ts +320 -0
  320. package/src/runtime/AGENTS.md +2 -0
  321. package/src/runtime/__tests__/channel-send.test.ts +443 -0
  322. package/src/runtime/__tests__/desktop-stream-upgrade.test.ts +89 -0
  323. package/src/runtime/__tests__/live-voice-upgrade.test.ts +58 -0
  324. package/src/runtime/__tests__/runtime-ws-test-utils.ts +72 -0
  325. package/src/runtime/__tests__/watch-stream-upgrade.test.ts +59 -0
  326. package/src/runtime/auth/same-actor.ts +38 -3
  327. package/src/runtime/channel-send.ts +316 -0
  328. package/src/runtime/http-server.ts +160 -151
  329. package/src/runtime/routes/__tests__/acp-routes.test.ts +159 -4
  330. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +205 -0
  331. package/src/runtime/routes/__tests__/channel-send-routes.test.ts +127 -0
  332. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +108 -1
  333. package/src/runtime/routes/__tests__/dictation-cleanup-guard.test.ts +107 -0
  334. package/src/runtime/routes/__tests__/mcp-add-default-risk.test.ts +16 -12
  335. package/src/runtime/routes/acp-routes.test.ts +15 -0
  336. package/src/runtime/routes/acp-routes.ts +72 -9
  337. package/src/runtime/routes/app-management-routes.ts +73 -0
  338. package/src/runtime/routes/app-routes.ts +1 -1
  339. package/src/runtime/routes/channel-send-routes.ts +85 -0
  340. package/src/runtime/routes/conversation-list-routes.ts +14 -3
  341. package/src/runtime/routes/conversation-query-routes.ts +40 -0
  342. package/src/runtime/routes/credential-routes.ts +19 -10
  343. package/src/runtime/routes/desktop-setup-routes.test.ts +74 -0
  344. package/src/runtime/routes/desktop-setup-routes.ts +35 -0
  345. package/src/runtime/routes/diagnostics-routes.ts +55 -3
  346. package/src/runtime/routes/index.ts +4 -0
  347. package/src/runtime/routes/log-export-routes.ts +2 -0
  348. package/src/runtime/routes/mcp-auth-routes.ts +39 -47
  349. package/src/runtime/routes/migration-routes.ts +8 -21
  350. package/src/runtime/routes/platform-routes.ts +18 -15
  351. package/src/runtime/services/__tests__/conversation-serializer.test.ts +28 -0
  352. package/src/runtime/services/conversation-serializer.ts +16 -3
  353. package/src/runtime/sync/resource-sync-events.ts +2 -1
  354. package/src/schedule/worker.ts +1 -1
  355. package/src/security/__tests__/ces-http-record-backend.test.ts +137 -0
  356. package/src/security/ces-http-record-backend.ts +120 -0
  357. package/src/security/ces-rpc-record-backend.ts +7 -0
  358. package/src/skills/__tests__/workspace-skill-md-signature.test.ts +60 -0
  359. package/src/skills/workspace-skill-md-signature.ts +50 -0
  360. package/src/subagent/consult-context.ts +12 -25
  361. package/src/tools/acp/list-agents.test.ts +3 -1
  362. package/src/tools/acp/spawn.test.ts +146 -11
  363. package/src/tools/acp/spawn.ts +21 -3
  364. package/src/tools/acp/status.test.ts +94 -0
  365. package/src/tools/acp/status.ts +40 -3
  366. package/src/tools/app-control/skill-proxy-bridge.ts +2 -1
  367. package/src/tools/capability-offer.test.ts +22 -2
  368. package/src/tools/capability-offer.ts +16 -1
  369. package/src/tools/computer-use/definitions.ts +4 -2
  370. package/src/tools/computer-use/skill-proxy-bridge.ts +2 -1
  371. package/src/tools/credentials/metadata-store.ts +100 -0
  372. package/src/tools/host-filesystem/edit.test.ts +2 -1
  373. package/src/tools/host-filesystem/edit.ts +2 -2
  374. package/src/tools/host-filesystem/read.test.ts +2 -1
  375. package/src/tools/host-filesystem/read.ts +2 -2
  376. package/src/tools/host-filesystem/transfer.test.ts +2 -1
  377. package/src/tools/host-filesystem/transfer.ts +2 -2
  378. package/src/tools/host-filesystem/write.test.ts +2 -1
  379. package/src/tools/host-filesystem/write.ts +2 -2
  380. package/src/tools/host-terminal/host-shell.test.ts +16 -0
  381. package/src/tools/host-terminal/host-shell.ts +4 -20
  382. package/src/tools/policy-context.ts +6 -7
  383. package/src/tools/subagent/spawn.ts +5 -8
  384. package/src/tools/terminal/__tests__/safe-env.test.ts +6 -6
  385. package/src/tools/terminal/safe-env.ts +23 -3
  386. package/src/tools/watch/watch-retro-report.ts +0 -8
  387. package/src/util/__tests__/language-subtag.test.ts +23 -1
  388. package/src/util/ca-bundle.ts +13 -0
  389. package/src/util/language-subtag.ts +16 -0
  390. package/src/util/platform.ts +8 -0
  391. package/src/workspace/git-porcelain.ts +66 -0
  392. package/src/workspace/git-service.ts +5 -54
  393. package/src/workspace/migrations/154-repair-retired-codex-gpt-5-4-model-ids.ts +258 -0
  394. package/src/workspace/migrations/155-move-front-model-config-to-voice.ts +78 -0
  395. package/src/workspace/migrations/156-extract-workspace-mcp-json.ts +214 -0
  396. package/src/workspace/migrations/__tests__/155-move-front-model-config-to-voice.test.ts +102 -0
  397. package/src/workspace/migrations/__tests__/156-extract-workspace-mcp-json.test.ts +199 -0
  398. package/src/workspace/migrations/registry.ts +6 -0
  399. package/src/__tests__/app-source-watcher.test.ts +0 -218
  400. package/src/__tests__/config-watcher-skill-reseed.test.ts +0 -359
  401. package/src/__tests__/speaker-identification.test.ts +0 -56
  402. package/src/calls/speaker-identification.ts +0 -233
  403. package/src/daemon/app-source-watcher.ts +0 -218
  404. package/src/messaging/providers/whatsapp/client.ts +0 -29
  405. package/src/util/fs-watcher-error.ts +0 -36
  406. /package/src/{live-voice → calls}/progress-phrases.ts +0 -0
@@ -45,8 +45,12 @@ Examples:
45
45
  },
46
46
  ],
47
47
  helpText: `
48
- Lists all credentials in the vault. Each entry includes the same fields as
49
- "inspect" — scrubbed value, timestamps, policy, and metadata.
48
+ Lists credentials from the live credential vault. Each entry includes the same
49
+ fields as inspect: scrubbed value, timestamps, policy, and metadata.
50
+
51
+ Fails immediately with an error if the credential vault is unreachable. An
52
+ empty list means the vault answered and has no matching credentials, not that
53
+ the store is down.
50
54
 
51
55
  The --search flag filters results by case-insensitive substring match against
52
56
  the credential's service name, field name, label, or description. For example, --search
@@ -343,8 +343,8 @@ export function registerCredentialsCommand(program: Command): void {
343
343
  } else {
344
344
  printCredentialHuman(output);
345
345
  if (output.brokerUnreachable) {
346
- log.info(
347
- " ⚠ Credential store is unreachable — ensure the assistant is running",
346
+ log.warn(
347
+ " Credential store is unreachable. Retry in a moment, or check that the credential vault is running.",
348
348
  );
349
349
  }
350
350
  }
@@ -7,8 +7,8 @@ export const mcpHelp: CliCommandHelp = {
7
7
  description: "Manage MCP (Model Context Protocol) servers",
8
8
  helpText: `
9
9
  MCP servers extend the assistant's capabilities with external tools. Servers
10
- are configured in the assistant's config.json under the mcp.servers key, or
11
- declared by an installed plugin in its root mcp.json. Each
10
+ are configured in the assistant's mcp.json, or declared by an installed
11
+ plugin in its root mcp.json. Each
12
12
  server uses one of three transport types:
13
13
 
14
14
  stdio Local process communicating over stdin/stdout
@@ -30,8 +30,8 @@ Examples:
30
30
  options: [{ flags: "--json", description: "Output as JSON" }],
31
31
  helpText: `
32
32
  Shows each MCP server with its current status and configuration. Servers come
33
- from two places: the mcp.servers key in config.json, and the root mcp.json of
34
- any installed plugin that declares one.
33
+ from two places: the workspace mcp.json, and the root mcp.json of any
34
+ installed plugin that declares one.
35
35
 
36
36
  Name The server identifier
37
37
  Status Health check result for workspace servers:
@@ -43,7 +43,7 @@ any installed plugin that declares one.
43
43
  health-checked, so no stored credential can reach a URL a
44
44
  plugin chose.
45
45
  Source Shown only for plugin-declared servers, naming the plugin.
46
- Servers from config.json print no Source line.
46
+ Servers from workspace mcp.json print no Source line.
47
47
  Transport stdio, sse, or streamable-http
48
48
  URL/Command The server URL (sse/streamable-http) or command (stdio)
49
49
 
@@ -64,7 +64,7 @@ on their next turn automatically. The assistant must be running.
64
64
 
65
65
  Examples:
66
66
  $ vellum mcp reload
67
- $ vellum mcp reload # after editing config.json to add a new server
67
+ $ vellum mcp reload # after editing mcp.json to add a new server
68
68
  $ vellum mcp reload # after running "vellum mcp auth <server>"`,
69
69
  },
70
70
  {
@@ -95,7 +95,7 @@ Examples:
95
95
  ],
96
96
  helpText: `
97
97
  Arguments:
98
- name Unique identifier for the server (used as the key in config.json)
98
+ name Unique identifier for the server (used as the key in mcp.json)
99
99
 
100
100
  Transport-specific requirements:
101
101
  stdio Requires --command (and optional --args for arguments)
@@ -149,7 +149,7 @@ Examples:
149
149
  Arguments:
150
150
  name Name of the MCP server to remove
151
151
 
152
- Removes the server entry from config.json and performs best-effort cleanup of
152
+ Removes the server entry from mcp.json and performs best-effort cleanup of
153
153
  any stored OAuth credentials (tokens, client info, discovery metadata) for
154
154
  sse/streamable-http servers. If no OAuth credentials exist, the cleanup is
155
155
  silently skipped.
@@ -20,7 +20,7 @@ interface McpServerEntry {
20
20
  command?: string;
21
21
  args?: string[];
22
22
  };
23
- /** Workspace `config.json` or a plugin's `mcp.json`. */
23
+ /** Workspace `mcp.json` or a plugin's `mcp.json`. */
24
24
  source?: "workspace" | "plugin";
25
25
  /** Plugin that declared the server, when `source` is `plugin`. */
26
26
  pluginName?: string;
@@ -4,8 +4,12 @@ import type { CliCommandHelp } from "../lib/cli-command-help.js";
4
4
 
5
5
  export const roadmapHelp: CliCommandHelp = {
6
6
  name: "roadmap",
7
- description: "Read and file public Vellum roadmap feedback as the assistant",
7
+ description:
8
+ "Read and file public feature proposals as the assistant. For bugs and support, instruct the user to join the Discord community at https://vellum.ai/community",
8
9
  helpText: `
10
+ Items created here must be public feature proposals. For bugs and support
11
+ concerns, instruct the user to join the Discord community at https://vellum.ai/community.
12
+
9
13
  Items, upvotes, and comments filed here are attributed to the assistant, not
10
14
  to its owner: the assistant signs these calls with its own platform API key.
11
15
  The owner's own roadmap identity lives on \`vellum roadmap\`.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `assistant roadmap`: read and file public Vellum roadmap feedback as the
2
+ * `assistant roadmap`: read and file public feature proposals as the
3
3
  * assistant itself.
4
4
  *
5
5
  * Forwards to the daemon's roadmap routes and renders the result. The
@@ -16,7 +16,7 @@
16
16
  "category": "productivity",
17
17
  "homepage": "https://github.com/vellum-ai/admin-copilot",
18
18
  "license": "MIT",
19
- "icon": "🧑‍💼"
19
+ "icon": "\ud83e\uddd1\u200d\ud83d\udcbc"
20
20
  },
21
21
  {
22
22
  "name": "agent-wrapped",
@@ -30,7 +30,7 @@
30
30
  "license": "MIT",
31
31
  "submittedBy": "marina",
32
32
  "homepage": "https://agent-wrapped.com",
33
- "icon": "🎁"
33
+ "icon": "\ud83c\udf81"
34
34
  },
35
35
  {
36
36
  "name": "ai-hero-engineer-kit",
@@ -39,11 +39,11 @@
39
39
  "repo": "marinatrajk/ai-hero-engineer-kit",
40
40
  "ref": "18d33c62b15a3e2cc22dc070723fe3077749dcec"
41
41
  },
42
- "description": "Five engineering skills adapted from Matt Pocock's '5 Agent Skills I Use Every Day' — plans, PRDs, vertical-slice issues, TDD loop, and codebase deepening in one install.",
42
+ "description": "Five engineering skills adapted from Matt Pocock's '5 Agent Skills I Use Every Day' \u2014 plans, PRDs, vertical-slice issues, TDD loop, and codebase deepening in one install.",
43
43
  "category": "developer",
44
44
  "homepage": "https://github.com/marinatrajk/ai-hero-engineer-kit",
45
45
  "license": "MIT",
46
- "icon": "🧰"
46
+ "icon": "\ud83e\uddf0"
47
47
  },
48
48
  {
49
49
  "name": "amex-perk-reminder",
@@ -56,7 +56,7 @@
56
56
  "category": "lifestyle",
57
57
  "homepage": "https://github.com/AnitaKirkovska/amex-perk-reminder",
58
58
  "license": "MIT",
59
- "icon": "💳"
59
+ "icon": "\ud83d\udcb3"
60
60
  },
61
61
  {
62
62
  "name": "astrology-horoscope",
@@ -69,7 +69,20 @@
69
69
  "category": "hobby",
70
70
  "homepage": "https://github.com/vellum-ai/astrology-horoscope",
71
71
  "license": "MIT",
72
- "icon": "🔮"
72
+ "icon": "\ud83d\udd2e"
73
+ },
74
+ {
75
+ "name": "battleship",
76
+ "source": {
77
+ "source": "github",
78
+ "repo": "vellum-ai/battleship",
79
+ "ref": "32391ea3af71597b7507bb710bd29ab8308a4604"
80
+ },
81
+ "description": "Play Battleship against your assistant. Fire shots, track hits and misses, and sink the fleet before the assistant sinks yours.",
82
+ "category": "hobby",
83
+ "homepage": "https://github.com/vellum-ai/battleship",
84
+ "license": "MIT",
85
+ "icon": "\u2693"
73
86
  },
74
87
  {
75
88
  "name": "caveman",
@@ -82,7 +95,7 @@
82
95
  "category": "productivity",
83
96
  "homepage": "https://github.com/JuliusBrussee/caveman",
84
97
  "license": "MIT",
85
- "icon": "🦴"
98
+ "icon": "\ud83e\uddb4"
86
99
  },
87
100
  {
88
101
  "name": "coffee-aficionado",
@@ -107,7 +120,7 @@
107
120
  "category": "productivity",
108
121
  "homepage": "https://github.com/vellum-ai/cofounder",
109
122
  "license": "MIT",
110
- "icon": "🤝"
123
+ "icon": "\ud83e\udd1d"
111
124
  },
112
125
  {
113
126
  "name": "cognee",
@@ -120,7 +133,7 @@
120
133
  "description": "Cognee knowledge graph memory for Vellum Assistant: session-aware storage, auto-routing recall, and persistent learning across sessions. Supports local mode and Cognee Cloud.",
121
134
  "category": "memory",
122
135
  "homepage": "https://github.com/topoteretes/cognee-integrations/tree/main/integrations/vellum-assistant",
123
- "icon": "🕸️"
136
+ "icon": "\ud83d\udd78\ufe0f"
124
137
  },
125
138
  {
126
139
  "name": "creatorland",
@@ -134,7 +147,7 @@
134
147
  "category": "marketing",
135
148
  "homepage": "https://github.com/creatorland/creatorland-mcp-skills/tree/main/plugins/creatorland-data",
136
149
  "license": "MIT",
137
- "icon": "🎨"
150
+ "icon": "\ud83c\udfa8"
138
151
  },
139
152
  {
140
153
  "name": "dynamic-notch",
@@ -147,7 +160,7 @@
147
160
  "category": "interface",
148
161
  "homepage": "https://github.com/AnitaKirkovska/dynamic-notch",
149
162
  "license": "MIT",
150
- "icon": "💻"
163
+ "icon": "\ud83d\udcbb"
151
164
  },
152
165
  {
153
166
  "name": "family-briefing",
@@ -160,7 +173,7 @@
160
173
  "category": "productivity",
161
174
  "homepage": "https://github.com/AnitaKirkovska/family-briefing",
162
175
  "license": "MIT",
163
- "icon": "👨‍👩‍👧‍👦"
176
+ "icon": "\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d\udc66"
164
177
  },
165
178
  {
166
179
  "name": "fitness-companion",
@@ -173,7 +186,7 @@
173
186
  "category": "health",
174
187
  "homepage": "https://github.com/vellum-ai/fitness-companion",
175
188
  "license": "MIT",
176
- "icon": "💪"
189
+ "icon": "\ud83d\udcaa"
177
190
  },
178
191
  {
179
192
  "name": "git-workflow",
@@ -186,7 +199,7 @@
186
199
  "category": "developer",
187
200
  "homepage": "https://github.com/vellum-ai/git-workflow",
188
201
  "license": "MIT",
189
- "icon": "🔀"
202
+ "icon": "\ud83d\udd00"
190
203
  },
191
204
  {
192
205
  "name": "google-drive-search",
@@ -199,20 +212,7 @@
199
212
  "category": "productivity",
200
213
  "homepage": "https://github.com/ZeebBoyBlue/google-drive-search",
201
214
  "license": "Apache-2.0",
202
- "icon": "🔍"
203
- },
204
- {
205
- "name": "influencer-marketing",
206
- "source": {
207
- "source": "github",
208
- "repo": "ZeebBoyBlue/influencer",
209
- "ref": "8629b0dcfdacf62246122af2dcd7320baa6db04e"
210
- },
211
- "description": "Find and research influencers on Instagram, TikTok, and X/Twitter. Includes a strategy builder that walks from campaign brief to research criteria, a research skill that discovers real profiles via browser automation, scores candidates, and exports ranked shortlists, and a dashboard skill that turns the shortlist into an interactive outreach tracker.",
212
- "category": "marketing",
213
- "homepage": "https://github.com/ZeebBoyBlue/influencer",
214
- "license": "MIT",
215
- "icon": "📣"
215
+ "icon": "\ud83d\udd0d"
216
216
  },
217
217
  {
218
218
  "name": "imessage",
@@ -225,7 +225,20 @@
225
225
  "category": "productivity",
226
226
  "homepage": "https://github.com/vellum-ai/imessage",
227
227
  "license": "MIT",
228
- "icon": "📲"
228
+ "icon": "\ud83d\udcf2"
229
+ },
230
+ {
231
+ "name": "influencer-marketing",
232
+ "source": {
233
+ "source": "github",
234
+ "repo": "ZeebBoyBlue/influencer",
235
+ "ref": "8629b0dcfdacf62246122af2dcd7320baa6db04e"
236
+ },
237
+ "description": "Find and research influencers on Instagram, TikTok, and X/Twitter. Includes a strategy builder that walks from campaign brief to research criteria, a research skill that discovers real profiles via browser automation, scores candidates, and exports ranked shortlists, and a dashboard skill that turns the shortlist into an interactive outreach tracker.",
238
+ "category": "marketing",
239
+ "homepage": "https://github.com/ZeebBoyBlue/influencer",
240
+ "license": "MIT",
241
+ "icon": "\ud83d\udce3"
229
242
  },
230
243
  {
231
244
  "name": "kitchen-companion",
@@ -238,7 +251,20 @@
238
251
  "category": "lifestyle",
239
252
  "homepage": "https://github.com/vellum-ai/kitchen-companion",
240
253
  "license": "MIT",
241
- "icon": "🍳"
254
+ "icon": "\ud83c\udf73"
255
+ },
256
+ {
257
+ "name": "ledger",
258
+ "source": {
259
+ "source": "github",
260
+ "repo": "simensgreen/ledger",
261
+ "ref": "7fc04fd77b20ad4b27ccd51be22c101274b370f6"
262
+ },
263
+ "description": "Structured storage for Vellum agents: tables via JSON Schema, query/aggregate via JSON, named saved queries.",
264
+ "category": "developer",
265
+ "homepage": "https://github.com/simensgreen/ledger",
266
+ "license": "MIT",
267
+ "icon": "\ud83d\uddc4\ufe0f"
242
268
  },
243
269
  {
244
270
  "name": "level-up",
@@ -251,7 +277,7 @@
251
277
  "category": "developer",
252
278
  "homepage": "https://github.com/vellum-ai/level-up",
253
279
  "license": "MIT",
254
- "icon": "🆙"
280
+ "icon": "\ud83c\udd99"
255
281
  },
256
282
  {
257
283
  "name": "marketing-expert",
@@ -264,7 +290,7 @@
264
290
  "category": "marketing",
265
291
  "homepage": "https://github.com/vellum-ai/marketing-expert",
266
292
  "license": "MIT",
267
- "icon": "📈"
293
+ "icon": "\ud83d\udcc8"
268
294
  },
269
295
  {
270
296
  "name": "markitdown-vellum",
@@ -273,11 +299,11 @@
273
299
  "repo": "simensgreen/markitdown-vellum",
274
300
  "ref": "5e5a4ecfd6c60d613778106442003a1ed302fc3c"
275
301
  },
276
- "description": "Convert workspace documents (PDF, DOCX, PPTX, XLSX, images, MSG, …) to markdown via @cognipeer/to-markdown, with Vellum vision OCR or Tesseract.",
302
+ "description": "Convert workspace documents (PDF, DOCX, PPTX, XLSX, images, MSG, \u2026) to markdown via @cognipeer/to-markdown, with Vellum vision OCR or Tesseract.",
277
303
  "category": "productivity",
278
304
  "homepage": "https://github.com/simensgreen/markitdown-vellum",
279
305
  "license": "MIT",
280
- "icon": "📄"
306
+ "icon": "\ud83d\udcc4"
281
307
  },
282
308
  {
283
309
  "name": "model-router",
@@ -290,7 +316,7 @@
290
316
  "category": "productivity",
291
317
  "homepage": "https://github.com/AnitaKirkovska/model-router",
292
318
  "license": "MIT",
293
- "icon": "🚦"
319
+ "icon": "\ud83d\udea6"
294
320
  },
295
321
  {
296
322
  "name": "motion-design",
@@ -303,7 +329,7 @@
303
329
  "category": "creative",
304
330
  "homepage": "https://github.com/vellum-ai/motion-design",
305
331
  "license": "MIT",
306
- "icon": "🎬"
332
+ "icon": "\ud83c\udfac"
307
333
  },
308
334
  {
309
335
  "name": "natural",
@@ -316,7 +342,19 @@
316
342
  "category": "finance",
317
343
  "homepage": "https://www.natural.com",
318
344
  "license": "MIT",
319
- "icon": "💳"
345
+ "icon": "\ud83d\udcb3"
346
+ },
347
+ {
348
+ "name": "octolens",
349
+ "source": {
350
+ "source": "github",
351
+ "repo": "vellum-ai/octolens",
352
+ "ref": "d9117f5c6b97b3bff75dec1a04bedc32571c6538"
353
+ },
354
+ "description": "Social listening plugin for Octolens. Monitor brand mentions, competitor activity, and industry conversations across 13+ platforms. Query mentions, run analytics, manage keywords and feeds via REST API tools, or connect the Octolens MCP server for natural-language workflows.",
355
+ "category": "growth",
356
+ "homepage": "https://github.com/vellum-ai/octolens",
357
+ "license": "MIT"
320
358
  },
321
359
  {
322
360
  "name": "openseo",
@@ -330,7 +368,7 @@
330
368
  "category": "marketing",
331
369
  "homepage": "https://openseo.so",
332
370
  "license": "MIT",
333
- "icon": "🔎"
371
+ "icon": "\ud83d\udd0e"
334
372
  },
335
373
  {
336
374
  "name": "originkit",
@@ -343,7 +381,7 @@
343
381
  "category": "productivity",
344
382
  "homepage": "https://github.com/vellum-ai/originkit",
345
383
  "license": "MIT",
346
- "icon": "🧱"
384
+ "icon": "\ud83e\uddf1"
347
385
  },
348
386
  {
349
387
  "name": "personal-finance",
@@ -356,7 +394,7 @@
356
394
  "category": "productivity",
357
395
  "homepage": "https://github.com/AnitaKirkovska/personal-finance",
358
396
  "license": "MIT",
359
- "icon": "💰"
397
+ "icon": "\ud83d\udcb0"
360
398
  },
361
399
  {
362
400
  "name": "plant-doctor",
@@ -369,7 +407,7 @@
369
407
  "category": "lifestyle",
370
408
  "homepage": "https://github.com/vellum-ai/plant-doctor",
371
409
  "license": "MIT",
372
- "icon": "🪴"
410
+ "icon": "\ud83e\udeb4"
373
411
  },
374
412
  {
375
413
  "name": "polyglot",
@@ -382,7 +420,7 @@
382
420
  "category": "education",
383
421
  "homepage": "https://github.com/vellum-ai/polyglot",
384
422
  "license": "MIT",
385
- "icon": "🗣️"
423
+ "icon": "\ud83d\udde3\ufe0f"
386
424
  },
387
425
  {
388
426
  "name": "proactive-slacks",
@@ -395,7 +433,7 @@
395
433
  "category": "productivity",
396
434
  "homepage": "https://github.com/AnitaKirkovska/proactive-slacks",
397
435
  "license": "MIT",
398
- "icon": "💬"
436
+ "icon": "\ud83d\udcac"
399
437
  },
400
438
  {
401
439
  "name": "reading-pal",
@@ -408,7 +446,20 @@
408
446
  "category": "hobby",
409
447
  "homepage": "https://github.com/vellum-ai/reading-pal",
410
448
  "license": "MIT",
411
- "icon": "📚"
449
+ "icon": "\ud83d\udcda"
450
+ },
451
+ {
452
+ "name": "restaurant-invoice-auditor",
453
+ "description": "Audits restaurant food delivery slips in 14 seconds, flags silent price hikes and pack-size shrinkage, and stages approved bills in QuickBooks.",
454
+ "category": "commerce",
455
+ "icon": "\ud83e\uddfe",
456
+ "license": "MIT",
457
+ "homepage": "https://github.com/ZeebBoyBlue/restaurant-invoice-auditor",
458
+ "source": {
459
+ "source": "github",
460
+ "repo": "ZeebBoyBlue/restaurant-invoice-auditor",
461
+ "ref": "f1905e639941e98172c5032b6d722f668882d75d"
462
+ }
412
463
  },
413
464
  {
414
465
  "name": "simple-memory",
@@ -421,7 +472,7 @@
421
472
  "category": "memory",
422
473
  "homepage": "https://github.com/vellum-ai/simple-memory",
423
474
  "license": "MIT",
424
- "icon": "🧠"
475
+ "icon": "\ud83e\udde0"
425
476
  },
426
477
  {
427
478
  "name": "smb-inbox-brief",
@@ -434,7 +485,7 @@
434
485
  "category": "productivity",
435
486
  "homepage": "https://github.com/AnitaKirkovska/smb-inbox-brief",
436
487
  "license": "MIT",
437
- "icon": "📧"
488
+ "icon": "\ud83d\udce7"
438
489
  },
439
490
  {
440
491
  "name": "tennis-companion",
@@ -447,7 +498,7 @@
447
498
  "category": "health",
448
499
  "homepage": "https://github.com/vellum-ai/tennis-companion",
449
500
  "license": "MIT",
450
- "icon": "🎾"
501
+ "icon": "\ud83c\udfbe"
451
502
  },
452
503
  {
453
504
  "name": "travel-planner",
@@ -460,7 +511,7 @@
460
511
  "category": "lifestyle",
461
512
  "homepage": "https://github.com/AnitaKirkovska/travel-planner",
462
513
  "license": "MIT",
463
- "icon": "✈️"
514
+ "icon": "\u2708\ufe0f"
464
515
  },
465
516
  {
466
517
  "name": "unabyss",
@@ -473,7 +524,7 @@
473
524
  "category": "memory",
474
525
  "homepage": "https://unabyss.com",
475
526
  "license": "MIT",
476
- "icon": "🌊"
527
+ "icon": "\ud83c\udf0a"
477
528
  },
478
529
  {
479
530
  "name": "vellum-client-qa",
@@ -486,20 +537,7 @@
486
537
  "category": "developer",
487
538
  "homepage": "https://github.com/vellum-ai/vellum-client-qa",
488
539
  "license": "MIT",
489
- "icon": "🧪"
490
- },
491
- {
492
- "name": "ledger",
493
- "source": {
494
- "source": "github",
495
- "repo": "simensgreen/ledger",
496
- "ref": "7fc04fd77b20ad4b27ccd51be22c101274b370f6"
497
- },
498
- "description": "Structured storage for Vellum agents: tables via JSON Schema, query/aggregate via JSON, named saved queries.",
499
- "category": "developer",
500
- "homepage": "https://github.com/simensgreen/ledger",
501
- "license": "MIT",
502
- "icon": "🗄️"
540
+ "icon": "\ud83e\uddea"
503
541
  },
504
542
  {
505
543
  "name": "virlo",
@@ -513,7 +551,7 @@
513
551
  "category": "marketing",
514
552
  "homepage": "https://github.com/Virlo-AI/virlo-integrations/tree/main/integrations/vellum",
515
553
  "license": "MIT",
516
- "icon": "📱"
554
+ "icon": "\ud83d\udcf1"
517
555
  },
518
556
  {
519
557
  "name": "writing-coach",
@@ -526,32 +564,7 @@
526
564
  "category": "hobby",
527
565
  "homepage": "https://github.com/vellum-ai/writing-coach",
528
566
  "license": "MIT",
529
- "icon": "✍️"
530
- },
531
- {
532
- "name": "battleship",
533
- "source": {
534
- "source": "github",
535
- "repo": "vellum-ai/battleship",
536
- "ref": "32391ea3af71597b7507bb710bd29ab8308a4604"
537
- },
538
- "description": "Play Battleship against your assistant. Fire shots, track hits and misses, and sink the fleet before the assistant sinks yours.",
539
- "category": "hobby",
540
- "homepage": "https://github.com/vellum-ai/battleship",
541
- "license": "MIT",
542
- "icon": "⚓"
543
- },
544
- {
545
- "name": "octolens",
546
- "source": {
547
- "source": "github",
548
- "repo": "vellum-ai/octolens",
549
- "ref": "d9117f5c6b97b3bff75dec1a04bedc32571c6538"
550
- },
551
- "description": "Social listening plugin for Octolens. Monitor brand mentions, competitor activity, and industry conversations across 13+ platforms. Query mentions, run analytics, manage keywords and feeds via REST API tools, or connect the Octolens MCP server for natural-language workflows.",
552
- "category": "growth",
553
- "homepage": "https://github.com/vellum-ai/octolens",
554
- "license": "MIT"
567
+ "icon": "\u270d\ufe0f"
555
568
  }
556
569
  ]
557
570
  }
@@ -540,6 +540,28 @@ describe("resolveDefaultProfileForProvider", () => {
540
540
  expect(entry).toBe(workspace.balanced);
541
541
  });
542
542
 
543
+ // Google limits gemini-2.5-flash-lite to grandfathered accounts (other API
544
+ // keys get HTTP 404 "no longer available to new users"), so a default
545
+ // profile resolving to it lists as available and fails every request on a
546
+ // fresh BYOK key.
547
+ test("gemini BYOK defaults never resolve to a model Google refuses new keys", () => {
548
+ const budget = resolveDefaultProfileForProvider(
549
+ managedStubs(),
550
+ "cost-optimized",
551
+ dp("gemini"),
552
+ );
553
+ expect(budget?.provider).toBe("gemini");
554
+ expect(budget?.model).toBe("gemini-3.1-flash-lite");
555
+ for (const key of DEFAULT_PROFILE_KEYS) {
556
+ const entry = resolveDefaultProfileForProvider(
557
+ managedStubs(),
558
+ key,
559
+ dp("gemini"),
560
+ );
561
+ expect(entry?.model).not.toBe("gemini-2.5-flash-lite");
562
+ }
563
+ });
564
+
543
565
  test("a managed-source stub contributes only label/status/topP over the provider-resolved body", () => {
544
566
  const workspace: Record<string, ProfileEntry> = {
545
567
  balanced: {
@@ -12,9 +12,10 @@ import { describe, expect, test } from "bun:test";
12
12
  import { MemoryRetrospectiveConfigSchema } from "../schemas/memory-retrospective.js";
13
13
 
14
14
  describe("memory.retrospective config schema", () => {
15
- test("an empty block leaves retrospectives on", () => {
15
+ test("an empty block leaves retrospectives and skill improvement on", () => {
16
16
  const parsed = MemoryRetrospectiveConfigSchema.parse({});
17
17
  expect(parsed.enabled).toBe(true);
18
+ expect(parsed.skillImprovement).toBe(true);
18
19
  expect(parsed).not.toHaveProperty("forkStrategy");
19
20
  });
20
21
 
@@ -27,6 +28,19 @@ describe("memory.retrospective config schema", () => {
27
28
  ).toBe(false);
28
29
  });
29
30
 
31
+ test("skillImprovement is an independent boolean-only authoring switch", () => {
32
+ const parsed = MemoryRetrospectiveConfigSchema.parse({
33
+ skillImprovement: false,
34
+ });
35
+ expect(parsed.enabled).toBe(true);
36
+ expect(parsed.skillImprovement).toBe(false);
37
+ expect(
38
+ MemoryRetrospectiveConfigSchema.safeParse({
39
+ skillImprovement: "false",
40
+ }).success,
41
+ ).toBe(false);
42
+ });
43
+
30
44
  test("a leftover forkStrategy key is ignored", () => {
31
45
  const parsed = MemoryRetrospectiveConfigSchema.parse({
32
46
  forkStrategy: "cloning",