@vellumai/assistant 0.10.9 → 0.10.10-dev.202607162206.d08e98e

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 (456) hide show
  1. package/ARCHITECTURE.md +1 -1
  2. package/Dockerfile +8 -0
  3. package/docs/activation-funnel-telemetry.md +13 -7
  4. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  5. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
  6. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
  7. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  8. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
  9. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
  10. package/node_modules/@vellumai/service-contracts/package.json +1 -0
  11. package/node_modules/@vellumai/service-contracts/src/__tests__/redacted-credential.test.ts +200 -0
  12. package/node_modules/@vellumai/service-contracts/src/redacted-credential.ts +226 -0
  13. package/openapi.yaml +530 -107
  14. package/package.json +1 -1
  15. package/scripts/generate-openapi.ts +8 -0
  16. package/src/__tests__/activation-early-marking.test.ts +6 -5
  17. package/src/__tests__/agent-loop-override-profile.test.ts +22 -25
  18. package/src/__tests__/agent-wake-override-profile.test.ts +21 -48
  19. package/src/__tests__/app-builder-tool-scripts.test.ts +0 -1
  20. package/src/__tests__/app-bundler.test.ts +4 -12
  21. package/src/__tests__/app-executors.test.ts +2 -49
  22. package/src/__tests__/app-routes-csp.test.ts +114 -146
  23. package/src/__tests__/auth-fallback-events-store.test.ts +8 -1
  24. package/src/__tests__/build-persisted-content.test.ts +96 -0
  25. package/src/__tests__/bundle-scanner.test.ts +27 -1
  26. package/src/__tests__/call-controller.test.ts +291 -0
  27. package/src/__tests__/call-site-routing-connection-auto-resolve.test.ts +165 -0
  28. package/src/__tests__/chat-credential-redaction.test.ts +1395 -0
  29. package/src/__tests__/chat-reveal-guard-priming.test.ts +791 -0
  30. package/src/__tests__/compaction.benchmark.test.ts +2 -1
  31. package/src/__tests__/compactor-image-manifest-trust.test.ts +50 -0
  32. package/src/__tests__/config-loader-backfill.test.ts +9 -4
  33. package/src/__tests__/config-schema-cmd.test.ts +10 -11
  34. package/src/__tests__/config-schema.test.ts +190 -257
  35. package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +208 -0
  36. package/src/__tests__/conversation-agent-loop-overflow.test.ts +5 -19
  37. package/src/__tests__/conversation-agent-loop.test.ts +22 -9
  38. package/src/__tests__/conversation-error.test.ts +31 -0
  39. package/src/__tests__/conversation-load-history-repair.test.ts +110 -0
  40. package/src/__tests__/conversation-process-callsite.test.ts +12 -19
  41. package/src/__tests__/conversation-routes-slash-commands.test.ts +7 -21
  42. package/src/__tests__/conversation-summarize-route.test.ts +36 -44
  43. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +1 -0
  44. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +7 -7
  45. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +0 -1
  46. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -1
  47. package/src/__tests__/conversation-usage.test.ts +4 -12
  48. package/src/__tests__/credential-routes.test.ts +250 -0
  49. package/src/__tests__/credential-security-invariants.test.ts +3 -0
  50. package/src/__tests__/db-migration-rollback.test.ts +22 -0
  51. package/src/__tests__/empty-response-hook.test.ts +186 -1
  52. package/src/__tests__/external-plugin-loader.test.ts +11 -5
  53. package/src/__tests__/heartbeat-service.test.ts +0 -28
  54. package/src/__tests__/host-shell-tool.test.ts +2 -0
  55. package/src/__tests__/inactive-tool-error-messages.test.ts +2 -2
  56. package/src/__tests__/inference-no-mode-boot-e2e.test.ts +52 -8
  57. package/src/__tests__/internal-telemetry-routes.test.ts +23 -4
  58. package/src/__tests__/invite-routes-http.test.ts +12 -16
  59. package/src/__tests__/list-all-apps.test.ts +0 -4
  60. package/src/__tests__/llm-context-resolution.test.ts +32 -56
  61. package/src/__tests__/llm-request-log-turn-query.test.ts +109 -0
  62. package/src/__tests__/llm-resolver-override-or-default.test.ts +3 -52
  63. package/src/__tests__/llm-resolver.test.ts +342 -602
  64. package/src/__tests__/llm-schema.test.ts +79 -37
  65. package/src/__tests__/max-tokens-continue-hook.test.ts +19 -0
  66. package/src/__tests__/media-stream-output.test.ts +259 -3
  67. package/src/__tests__/media-stream-server-integration.test.ts +22 -1
  68. package/src/__tests__/media-stream-stt-session.test.ts +47 -0
  69. package/src/__tests__/memory-jobs-worker-cleanup-cadence.test.ts +33 -0
  70. package/src/__tests__/memory-recall-log-store.test.ts +47 -13
  71. package/src/__tests__/mock-gateway-ipc.ts +46 -1
  72. package/src/__tests__/mtime-cache.test.ts +61 -0
  73. package/src/__tests__/navigate-settings-tab.test.ts +2 -0
  74. package/src/__tests__/normalize-onboarding.test.ts +33 -0
  75. package/src/__tests__/onboarding-persona-write.test.ts +26 -0
  76. package/src/__tests__/plugin-api-resolve-credential.test.ts +140 -0
  77. package/src/__tests__/plugin-app-serve-routes.test.ts +166 -14
  78. package/src/__tests__/plugin-import-boundary-reverse-guard.test.ts +2 -0
  79. package/src/__tests__/post-turn-tool-result-truncation.test.ts +38 -0
  80. package/src/__tests__/provider-commit-message-generator.test.ts +27 -20
  81. package/src/__tests__/provider-connections-backfill.test.ts +138 -0
  82. package/src/__tests__/provider-platform-proxy-integration.test.ts +10 -31
  83. package/src/__tests__/provider-registry-ollama.test.ts +8 -18
  84. package/src/__tests__/provider-send-message-override-profile.test.ts +23 -23
  85. package/src/__tests__/provider-usage-tracking.test.ts +9 -19
  86. package/src/__tests__/prune-old-conversations-job.test.ts +12 -0
  87. package/src/__tests__/published-app-updater.test.ts +22 -16
  88. package/src/__tests__/registry.test.ts +5 -16
  89. package/src/__tests__/retry-openrouter-only-normalization.test.ts +22 -23
  90. package/src/__tests__/retry-thinking-adaptive-only.test.ts +43 -48
  91. package/src/__tests__/retry-thinking-tool-choice.test.ts +57 -66
  92. package/src/__tests__/retry-verbosity-normalization.test.ts +24 -23
  93. package/src/__tests__/reveal-success-registry.test.ts +123 -0
  94. package/src/__tests__/run-conversation-turn-persistence.test.ts +130 -0
  95. package/src/__tests__/secret-fixtures.ts +9 -0
  96. package/src/__tests__/server-history-render.test.ts +28 -0
  97. package/src/__tests__/skills.test.ts +9 -4
  98. package/src/__tests__/slack-share-routes.test.ts +0 -1
  99. package/src/__tests__/stt-stream-session.test.ts +6 -5
  100. package/src/__tests__/subagent-call-site-routing.test.ts +69 -95
  101. package/src/__tests__/subagent-disposal.test.ts +2 -0
  102. package/src/__tests__/subagent-fork-notifications.test.ts +2 -0
  103. package/src/__tests__/subagent-fork-spawn.test.ts +2 -0
  104. package/src/__tests__/subagent-manager-notify.test.ts +2 -0
  105. package/src/__tests__/subagent-role-registry.test.ts +37 -0
  106. package/src/__tests__/subagent-spawn-and-await.test.ts +1 -0
  107. package/src/__tests__/subagent-terminal-message.test.ts +50 -0
  108. package/src/__tests__/subagent-tool-gate-mode.test.ts +78 -5
  109. package/src/__tests__/surface-completion-nudge-hook.test.ts +19 -0
  110. package/src/__tests__/telemetry-routes.test.ts +99 -19
  111. package/src/__tests__/tool-audit.test.ts +34 -4
  112. package/src/__tests__/tool-executor-lifecycle-events.test.ts +1 -1
  113. package/src/__tests__/tool-profiler.test.ts +72 -1
  114. package/src/__tests__/tool-result-spool.test.ts +49 -4
  115. package/src/__tests__/tool-side-effects-slack-dm.test.ts +0 -1
  116. package/src/__tests__/ui-channel-variants.test.ts +108 -0
  117. package/src/__tests__/ui-shape-teaching.test.ts +255 -0
  118. package/src/__tests__/usage-attribution.test.ts +18 -41
  119. package/src/__tests__/user-plugin-loader.test.ts +4 -4
  120. package/src/__tests__/voice-config-update.test.ts +46 -0
  121. package/src/__tests__/voice-session-bridge.test.ts +216 -84
  122. package/src/__tests__/workspace-migration-131-drop-web-fetch-mode.test.ts +120 -0
  123. package/src/agent/loop.ts +4 -3
  124. package/src/api/events/open-conversation.test.ts +64 -0
  125. package/src/api/events/open-conversation.ts +33 -0
  126. package/src/api/index.ts +6 -0
  127. package/src/api/responses/conversation-message.ts +5 -0
  128. package/src/apps/app-store.ts +25 -35
  129. package/src/bundler/app-bundler.ts +34 -48
  130. package/src/bundler/app-compiler.ts +39 -4
  131. package/src/bundler/bundle-scanner.ts +13 -0
  132. package/src/bundler/manifest.ts +1 -1
  133. package/src/calls/__tests__/voice-session-bridge.test.ts +47 -0
  134. package/src/calls/call-constants.ts +5 -0
  135. package/src/calls/call-controller.ts +100 -32
  136. package/src/calls/call-transport.ts +9 -0
  137. package/src/calls/media-stream-output.ts +107 -4
  138. package/src/calls/media-stream-server.ts +29 -9
  139. package/src/calls/media-stream-stt-session.ts +7 -1
  140. package/src/calls/media-turn-detector.ts +11 -1
  141. package/src/calls/voice-session-bridge.ts +84 -63
  142. package/src/cli/commands/__tests__/inference-providers.test.ts +270 -33
  143. package/src/cli/commands/__tests__/notifications.test.ts +24 -3
  144. package/src/cli/commands/config.help.ts +6 -6
  145. package/src/cli/commands/credentials.help.ts +13 -0
  146. package/src/cli/commands/credentials.ts +6 -1
  147. package/src/cli/commands/email.help.ts +7 -0
  148. package/src/cli/commands/email.ts +35 -1
  149. package/src/cli/commands/inference-providers.ts +168 -107
  150. package/src/cli/commands/inference.help.ts +118 -46
  151. package/src/cli/commands/memory/index.help.ts +23 -0
  152. package/src/cli/commands/memory/nodes.ts +146 -0
  153. package/src/cli/commands/notifications.help.ts +10 -10
  154. package/src/cli/commands/oauth/connect-surface-guidance.test.ts +40 -0
  155. package/src/cli/commands/oauth/connect-surface-guidance.ts +54 -0
  156. package/src/cli/commands/oauth/connect.test.ts +126 -0
  157. package/src/cli/commands/oauth/connect.ts +29 -6
  158. package/src/cli/commands/oauth/index.help.ts +7 -1
  159. package/src/cli/commands/oauth/status.test.ts +69 -3
  160. package/src/cli/commands/oauth/status.ts +50 -12
  161. package/src/cli/commands/plugins.help.ts +13 -2
  162. package/src/cli/commands/plugins.ts +61 -7
  163. package/src/cli/commands/telemetry.help.ts +13 -0
  164. package/src/cli/commands/telemetry.ts +45 -5
  165. package/src/cli/lib/__tests__/plugin-catalog-local.test.ts +8 -2
  166. package/src/cli/lib/__tests__/upgrade-plugin.test.ts +213 -9
  167. package/src/cli/lib/bundled-marketplace.json +93 -36
  168. package/src/cli/lib/inspect-plugin.ts +5 -1
  169. package/src/cli/lib/install-from-github.ts +68 -4
  170. package/src/cli/lib/plugin-catalog-local.ts +6 -2
  171. package/src/cli/lib/plugin-fingerprint.ts +3 -3
  172. package/src/cli/lib/upgrade-plugin.ts +236 -35
  173. package/src/config/__tests__/default-profile-catalog.test.ts +8 -12
  174. package/src/config/__tests__/plugin-resident-skill-discovery.test.ts +137 -0
  175. package/src/config/__tests__/profile-materialization.test.ts +1 -88
  176. package/src/config/bundled-skills/AGENTS.md +3 -30
  177. package/src/config/bundled-skills/app-builder/SKILL.md +5 -3
  178. package/src/config/bundled-skills/app-builder/TOOLS.json +23 -0
  179. package/src/config/bundled-skills/app-builder/tools/app-open.ts +32 -0
  180. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +1 -1
  181. package/src/config/bundled-skills/phone-calls/references/CONFIG.md +7 -7
  182. package/src/config/bundled-skills/schedule/SKILL.md +1 -1
  183. package/src/config/bundled-skills/schedule/TOOLS.json +1 -1
  184. package/src/config/bundled-skills/settings/TOOLS.json +3 -1
  185. package/src/config/bundled-skills/settings/tools/navigate-settings-tab.ts +2 -0
  186. package/src/config/bundled-skills/settings/tools/voice-config-update.ts +18 -10
  187. package/src/config/bundled-skills/subagent/SKILL.md +2 -0
  188. package/src/config/bundled-skills/subagent/TOOLS.json +1 -1
  189. package/src/config/call-site-defaults.ts +3 -3
  190. package/src/config/feature-flag-registry.json +24 -39
  191. package/src/config/llm-resolver.ts +88 -475
  192. package/src/config/profile-materialization.ts +11 -11
  193. package/src/config/schema.ts +93 -127
  194. package/src/config/schemas/__tests__/live-voice.test.ts +24 -6
  195. package/src/config/schemas/__tests__/stt.test.ts +31 -3
  196. package/src/config/schemas/live-voice.ts +10 -4
  197. package/src/config/schemas/llm.ts +52 -15
  198. package/src/config/schemas/memory-lifecycle.ts +1 -1
  199. package/src/config/schemas/memory-retrospective.ts +8 -0
  200. package/src/config/schemas/memory-v2.ts +2 -2
  201. package/src/config/schemas/memory-v3.ts +1 -1
  202. package/src/config/schemas/services.ts +6 -3
  203. package/src/config/schemas/stt.ts +38 -21
  204. package/src/config/schemas/tts.ts +13 -18
  205. package/src/config/skills.ts +31 -21
  206. package/src/context/compactor.ts +44 -7
  207. package/src/context/post-turn-tool-result-truncation.ts +4 -2
  208. package/src/context/tool-result-spool.ts +26 -5
  209. package/src/conversations/__tests__/message-consolidation.test.ts +48 -0
  210. package/src/conversations/message-consolidation.ts +22 -2
  211. package/src/daemon/__tests__/conversation-tool-setup.test.ts +5 -12
  212. package/src/daemon/app-source-watcher.ts +17 -23
  213. package/src/daemon/chat-credential-redaction.ts +1365 -0
  214. package/src/daemon/conversation-agent-loop-handlers.ts +627 -34
  215. package/src/daemon/conversation-agent-loop.ts +71 -31
  216. package/src/daemon/conversation-error.ts +36 -14
  217. package/src/daemon/conversation-process.ts +22 -0
  218. package/src/daemon/conversation-store.ts +35 -0
  219. package/src/daemon/conversation-surfaces.ts +25 -25
  220. package/src/daemon/conversation-tool-setup.ts +33 -7
  221. package/src/daemon/conversation.ts +55 -5
  222. package/src/daemon/handlers/shared.ts +33 -2
  223. package/src/daemon/lifecycle.ts +4 -4
  224. package/src/daemon/message-types/conversations.ts +6 -17
  225. package/src/daemon/providers-setup.ts +8 -0
  226. package/src/daemon/tool-setup-types.ts +7 -1
  227. package/src/daemon/wake-conversation-ops.ts +10 -1
  228. package/src/hooks/types.ts +9 -0
  229. package/src/ipc/__tests__/email-ipc.test.ts +90 -0
  230. package/src/ipc/gateway-client.test.ts +59 -0
  231. package/src/ipc/gateway-client.ts +70 -27
  232. package/src/live-voice/__tests__/live-voice-events.test.ts +14 -2
  233. package/src/live-voice/__tests__/live-voice-integration.test.ts +116 -2
  234. package/src/live-voice/__tests__/live-voice-vad.test.ts +804 -13
  235. package/src/live-voice/__tests__/protocol.test.ts +122 -0
  236. package/src/live-voice/live-voice-session.ts +443 -40
  237. package/src/live-voice/protocol.ts +143 -1
  238. package/src/monitoring/__tests__/plugin-source-watch.test.ts +3 -1
  239. package/src/monitoring/plugin-source-watch.ts +3 -62
  240. package/src/notifications/README.md +1 -1
  241. package/src/permissions/checker.ts +8 -4
  242. package/src/persistence/__tests__/db-init-migrations-ok.test.ts +26 -0
  243. package/src/persistence/conversation-crud.ts +104 -2
  244. package/src/persistence/db-init.ts +14 -3
  245. package/src/persistence/job-handlers/cleanup.ts +15 -7
  246. package/src/persistence/llm-request-log-store.ts +88 -52
  247. package/src/persistence/migrations/298-move-memory-jobs-to-memory-db.ts +7 -31
  248. package/src/persistence/migrations/305-drop-contact-acl-columns.ts +3 -2
  249. package/src/persistence/migrations/326-move-injection-events-to-memory-db.ts +8 -34
  250. package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +90 -0
  251. package/src/persistence/migrations/337-move-memory-recall-logs-to-memory-db.ts +114 -0
  252. package/src/persistence/migrations/338-move-memory-v3-selections-to-memory-db.ts +84 -0
  253. package/src/persistence/migrations/339-move-activation-sessions-to-memory-db.ts +52 -0
  254. package/src/persistence/migrations/__tests__/run-migrations.test.ts +155 -0
  255. package/src/persistence/migrations/helpers/relocation.ts +44 -1
  256. package/src/persistence/migrations/run-migrations.ts +25 -1
  257. package/src/persistence/schema/infrastructure.ts +9 -0
  258. package/src/persistence/schema/memory-core.ts +3 -0
  259. package/src/persistence/schema/memory-injection.ts +2 -0
  260. package/src/persistence/steps.ts +36 -0
  261. package/src/platform/client.test.ts +1 -44
  262. package/src/platform/client.ts +10 -20
  263. package/src/platform/consent-cache.test.ts +89 -23
  264. package/src/platform/consent-cache.ts +71 -33
  265. package/src/plugin-api/constants.ts +12 -0
  266. package/src/plugin-api/conversation-turn.ts +37 -14
  267. package/src/plugin-api/index.ts +11 -1
  268. package/src/plugin-api/resolve-credential.ts +75 -0
  269. package/src/plugin-api/vision-support.test.ts +8 -19
  270. package/src/plugin-api/vision-support.ts +26 -17
  271. package/src/plugins/collect-source-versions.ts +77 -0
  272. package/src/plugins/defaults/compaction/compact.ts +6 -0
  273. package/src/plugins/defaults/compaction/window-manager.ts +9 -0
  274. package/src/plugins/defaults/empty-response/hooks/post-model-call.ts +18 -24
  275. package/src/plugins/defaults/empty-response/hooks/user-prompt-submit.ts +38 -0
  276. package/src/plugins/defaults/empty-response/refusal-quarantine.ts +99 -0
  277. package/src/plugins/defaults/image-fallback/__tests__/caption-cache-persistence.test.ts +7 -3
  278. package/src/plugins/defaults/index.ts +8 -1
  279. package/src/plugins/defaults/max-tokens-continue/hooks/post-model-call.ts +4 -1
  280. package/src/plugins/defaults/memory/__tests__/activation-session-store.test.ts +48 -6
  281. package/src/plugins/defaults/memory/__tests__/db-memory-attach.test.ts +28 -22
  282. package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +148 -0
  283. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +80 -8
  284. package/src/plugins/defaults/memory/__tests__/memory-retrospective-prompt.test.ts +202 -0
  285. package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +64 -25
  286. package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +24 -11
  287. package/src/plugins/defaults/memory/__tests__/prompt-override.test.ts +70 -6
  288. package/src/plugins/defaults/memory/__tests__/table-relocation.test.ts +278 -0
  289. package/src/plugins/defaults/memory/activation-session-store.ts +27 -20
  290. package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +2 -9
  291. package/src/plugins/defaults/memory/context-search/sources/workspace.ts +1 -8
  292. package/src/plugins/defaults/memory/graph/retriever.test.ts +6 -6
  293. package/src/plugins/defaults/memory/graph/store.ts +114 -0
  294. package/src/plugins/defaults/memory/graph/tool-handlers.ts +36 -1
  295. package/src/plugins/defaults/memory/graph/tools.ts +47 -13
  296. package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +16 -35
  297. package/src/plugins/defaults/memory/jobs-worker.ts +10 -1
  298. package/src/plugins/defaults/memory/memory-db.ts +3 -2
  299. package/src/plugins/defaults/memory/memory-recall-log-store.ts +129 -66
  300. package/src/plugins/defaults/memory/memory-retrospective-constants.ts +8 -0
  301. package/src/plugins/defaults/memory/memory-retrospective-job.ts +11 -122
  302. package/src/plugins/defaults/memory/memory-retrospective-prompt.ts +216 -0
  303. package/src/plugins/defaults/memory/memory-v2-activation-log-store.ts +84 -46
  304. package/src/plugins/defaults/memory/memory-v2-concept-frequency.ts +42 -32
  305. package/src/plugins/defaults/memory/path-containment.ts +21 -0
  306. package/src/plugins/defaults/memory/prompt-override.ts +51 -13
  307. package/src/plugins/defaults/memory/tools.test.ts +34 -0
  308. package/src/plugins/defaults/memory/tools.ts +12 -2
  309. package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +19 -15
  310. package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +24 -19
  311. package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +19 -15
  312. package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +22 -2
  313. package/src/plugins/defaults/memory/v2/__tests__/prompts-consolidation.test.ts +5 -3
  314. package/src/plugins/defaults/memory/v2/harness/oracle.ts +59 -41
  315. package/src/plugins/defaults/memory/v2/harness/replay-input.ts +29 -25
  316. package/src/plugins/defaults/memory/v2/migration.ts +46 -16
  317. package/src/plugins/defaults/memory/v2/prompts/consolidation.ts +4 -0
  318. package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +17 -15
  319. package/src/plugins/defaults/memory/v3/__tests__/gate.test.ts +24 -22
  320. package/src/plugins/defaults/memory/v3/__tests__/injection.test.ts +9 -5
  321. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +277 -10
  322. package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +57 -5
  323. package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +9 -7
  324. package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +38 -7
  325. package/src/plugins/defaults/memory/v3/hot-set.test.ts +36 -18
  326. package/src/plugins/defaults/memory/v3/hot-set.ts +12 -14
  327. package/src/plugins/defaults/memory/v3/learned-edges.test.ts +47 -27
  328. package/src/plugins/defaults/memory/v3/learned-edges.ts +12 -14
  329. package/src/plugins/defaults/memory/v3/orchestrate.ts +139 -22
  330. package/src/plugins/defaults/memory/v3/prune.test.ts +10 -3
  331. package/src/plugins/defaults/memory/v3/prune.ts +17 -11
  332. package/src/plugins/defaults/memory/v3/selection-log-store.ts +23 -11
  333. package/src/plugins/defaults/memory/v3/shadow-plugin.ts +70 -53
  334. package/src/plugins/defaults/surface-completion-nudge/hooks/post-model-call.ts +9 -6
  335. package/src/plugins/external-plugin-loader.ts +15 -15
  336. package/src/plugins/mtime-cache.ts +47 -0
  337. package/src/plugins/pipeline.ts +9 -1
  338. package/src/plugins/plugin-execution-context.ts +44 -0
  339. package/src/plugins/plugin-tree-walk.ts +31 -24
  340. package/src/plugins/source-fingerprint.ts +3 -4
  341. package/src/prompts/normalize-onboarding.ts +12 -0
  342. package/src/prompts/persona-resolver.ts +8 -0
  343. package/src/prompts/templates/BOOTSTRAP-ACTIVATION-RAIL.md +1 -1
  344. package/src/providers/__tests__/dispatch-connection-routing.test.ts +6 -9
  345. package/src/providers/__tests__/registry-native-web-search.test.ts +4 -10
  346. package/src/providers/__tests__/retry-callsite.test.ts +235 -215
  347. package/src/providers/__tests__/satellite-connection-routing.test.ts +8 -16
  348. package/src/providers/atlascloud/client.ts +10 -49
  349. package/src/providers/baseten/client.ts +43 -0
  350. package/src/providers/call-site-routing.ts +26 -13
  351. package/src/providers/connection-resolution.ts +9 -11
  352. package/src/providers/fetch-provider-catalog.ts +4 -2
  353. package/src/providers/inference/__tests__/adapter-factory-openai-compatible.test.ts +29 -4
  354. package/src/providers/inference/__tests__/connection-availability-keyless.test.ts +78 -0
  355. package/src/providers/inference/adapter-factory.ts +27 -6
  356. package/src/providers/inference/auth.ts +29 -1
  357. package/src/providers/inference/backfill.ts +61 -10
  358. package/src/providers/inference/connection-availability.ts +3 -2
  359. package/src/providers/inference/resolve-auth.ts +9 -1
  360. package/src/providers/model-catalog.ts +37 -0
  361. package/src/providers/openai/__tests__/api-error-normalization.test.ts +24 -2
  362. package/src/providers/openai/api-key-validation.ts +70 -0
  363. package/src/providers/retry.ts +2 -0
  364. package/src/providers/types.ts +11 -4
  365. package/src/providers/vellum-model-routing.test.ts +26 -0
  366. package/src/providers/vellum-model-routing.ts +30 -0
  367. package/src/providers/voice-error-copy.ts +47 -0
  368. package/src/runtime/agent-wake.ts +40 -24
  369. package/src/runtime/for-chat-mint-registry.ts +118 -0
  370. package/src/runtime/reveal-nonce.ts +49 -0
  371. package/src/runtime/reveal-success-registry.ts +306 -0
  372. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +88 -3
  373. package/src/runtime/routes/__tests__/inference-provider-connection-routes.test.ts +161 -30
  374. package/src/runtime/routes/__tests__/migration-vellum-metadata-reconcile.test.ts +7 -0
  375. package/src/runtime/routes/__tests__/schedule-worker-routes.test.ts +15 -0
  376. package/src/runtime/routes/app-management-routes.ts +152 -45
  377. package/src/runtime/routes/app-routes.ts +16 -77
  378. package/src/runtime/routes/canned-message-complete.ts +16 -16
  379. package/src/runtime/routes/conversation-management-routes.ts +17 -14
  380. package/src/runtime/routes/conversation-query-routes.ts +54 -6
  381. package/src/runtime/routes/conversation-routes.ts +48 -2
  382. package/src/runtime/routes/credential-routes.ts +116 -3
  383. package/src/runtime/routes/email-routes.ts +17 -1
  384. package/src/runtime/routes/inbound-stages/transcribe-audio.test.ts +33 -5
  385. package/src/runtime/routes/inbound-stages/transcribe-audio.ts +6 -5
  386. package/src/runtime/routes/inference-provider-connection-routes.ts +77 -28
  387. package/src/runtime/routes/inference-send-routes.ts +1 -1
  388. package/src/runtime/routes/internal-telemetry-routes.ts +7 -6
  389. package/src/runtime/routes/plugins-routes.ts +37 -6
  390. package/src/runtime/routes/publish-routes.ts +15 -18
  391. package/src/runtime/routes/schedule-worker-routes.ts +9 -0
  392. package/src/runtime/routes/secret-routes.ts +10 -0
  393. package/src/runtime/routes/telemetry-routes.ts +149 -45
  394. package/src/schedule/__tests__/schedule-timezone.test.ts +101 -0
  395. package/src/schedule/__tests__/worker-watchdog.test.ts +209 -0
  396. package/src/schedule/schedule-store.ts +12 -1
  397. package/src/schedule/schedule-timezone.ts +63 -0
  398. package/src/schedule/scheduler.ts +100 -6
  399. package/src/schedule/worker-control.ts +19 -0
  400. package/src/security/auth-fallback-events-store.ts +7 -6
  401. package/src/security/secret-scanner.ts +26 -1
  402. package/src/services/published-app-updater.ts +6 -11
  403. package/src/stt/stt-stream-session.ts +36 -16
  404. package/src/subagent/manager.ts +34 -8
  405. package/src/telemetry/AGENTS.md +30 -1
  406. package/src/telemetry/__tests__/config-setting-snapshot.test.ts +18 -0
  407. package/src/telemetry/__tests__/outbox-test-harness.ts +5 -3
  408. package/src/telemetry/config-setting-snapshot.ts +44 -10
  409. package/src/telemetry/telemetry-event-sources.test.ts +124 -30
  410. package/src/telemetry/telemetry-event-sources.ts +137 -83
  411. package/src/telemetry/telemetry-events-outbox.test.ts +46 -1
  412. package/src/telemetry/telemetry-events-outbox.ts +60 -9
  413. package/src/telemetry/telemetry-wire-source.json +1 -1
  414. package/src/telemetry/telemetry-wire-validation.ts +39 -2
  415. package/src/telemetry/telemetry-wire.generated.ts +8 -0
  416. package/src/telemetry/tool-audit.ts +15 -9
  417. package/src/telemetry/tool-executed-events-store.test.ts +1 -1
  418. package/src/telemetry/turn-events-store.ts +20 -0
  419. package/src/telemetry/types.ts +45 -12
  420. package/src/telemetry/usage-telemetry-reporter.test.ts +294 -25
  421. package/src/telemetry/usage-telemetry-reporter.ts +117 -18
  422. package/src/telemetry/watchdog-direct-emit.test.ts +11 -3
  423. package/src/telemetry/watchdog-direct-emit.ts +11 -6
  424. package/src/tools/apps/executors.ts +11 -36
  425. package/src/tools/executor.ts +14 -1
  426. package/src/tools/host-terminal/host-shell.ts +6 -2
  427. package/src/tools/network/__tests__/web-fetch-firecrawl.test.ts +1 -1
  428. package/src/tools/network/__tests__/web-fetch-metadata.test.ts +25 -0
  429. package/src/tools/network/web-fetch.ts +6 -2
  430. package/src/tools/skills/sandbox-runner.ts +5 -2
  431. package/src/tools/subagent/spawn.ts +7 -11
  432. package/src/tools/terminal/shell.ts +5 -2
  433. package/src/tools/tool-manifest.ts +0 -2
  434. package/src/tools/tool-profiler.ts +37 -6
  435. package/src/tools/ui-surface/channel-variants.ts +101 -0
  436. package/src/tools/ui-surface/definitions.ts +23 -67
  437. package/src/tools/ui-surface/surface-shape-docs.ts +229 -0
  438. package/src/tts/__tests__/provider-adapters.test.ts +18 -0
  439. package/src/tts/provider-catalog.ts +2 -4
  440. package/src/tts/providers/deepgram-provider.ts +10 -1
  441. package/src/types/onboarding-context.ts +8 -0
  442. package/src/usage/attribution.ts +18 -112
  443. package/src/{config/bundled-skills/messaging/tools/gmail-mime-helpers.ts → util/mime-type.ts} +4 -1
  444. package/src/util/provider-error-patterns.ts +7 -1
  445. package/src/util/worker-process.ts +105 -0
  446. package/src/watcher/__tests__/telemetry.test.ts +17 -4
  447. package/src/watcher/telemetry.ts +5 -5
  448. package/src/workspace/migrations/131-drop-web-fetch-mode.ts +61 -0
  449. package/src/workspace/migrations/registry.ts +2 -0
  450. package/src/workspace/provider-commit-message-generator.ts +6 -4
  451. package/src/__tests__/app-open-proxy.test.ts +0 -67
  452. package/src/onboarding/onboarding-research-events-store.test.ts +0 -230
  453. package/src/onboarding/onboarding-research-events-store.ts +0 -104
  454. package/src/runtime/routes/assets/vellum-design-system.css +0 -2236
  455. package/src/tools/apps/definitions.ts +0 -73
  456. package/src/tools/apps/open-proxy.ts +0 -43
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vellumai/assistant",
3
- "version": "0.10.9",
3
+ "version": "0.10.10-dev.202607162206.d08e98e",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -30,6 +30,14 @@ import type {
30
30
  } from "zod-openapi";
31
31
  import { createDocument } from "zod-openapi";
32
32
 
33
+ import { jsonValueSchema } from "../src/telemetry/telemetry-wire.generated.js";
34
+
35
+ // The recursive wire JSON-value schema (`claims`/`suggestions` item type) must
36
+ // be hoisted into a named component so it can `$ref` itself; without a
37
+ // registered id zod-openapi falls back to an anonymous `__schema0`. Name it
38
+ // explicitly so the spec + generated SDK read as `TelemetryJsonValue`.
39
+ z.globalRegistry.add(jsonValueSchema, { id: "TelemetryJsonValue" });
40
+
33
41
  const ROOT = resolve(import.meta.dir, "..");
34
42
  const ROUTES_DIR = join(ROOT, "src/runtime/routes");
35
43
  const PLUGIN_DEFAULTS_DIR = join(ROOT, "src/plugins/defaults");
@@ -25,9 +25,8 @@ const { isActivationSession } =
25
25
  await import("../plugins/defaults/memory/activation-session-store.js");
26
26
  const { ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE } =
27
27
  await import("../telemetry/activation-funnel.js");
28
- const { getDb } = await import("../persistence/db-connection.js");
28
+ const { getMemorySqlite } = await import("../persistence/db-connection.js");
29
29
  const { initializeDb } = await import("../persistence/db-init.js");
30
- const { activationSessions } = await import("../persistence/schema/index.js");
31
30
 
32
31
  await initializeDb();
33
32
 
@@ -44,7 +43,7 @@ function seedGenericBootstrap(): void {
44
43
 
45
44
  describe("applyBootstrapTemplate — early activation marking", () => {
46
45
  beforeEach(() => {
47
- getDb().delete(activationSessions).run();
46
+ getMemorySqlite()!.exec("DELETE FROM activation_sessions");
48
47
  });
49
48
 
50
49
  test("marks the conversation when the activation-rail template is applied", () => {
@@ -71,8 +70,10 @@ describe("applyBootstrapTemplate — early activation marking", () => {
71
70
  applyBootstrapTemplate(ACTIVATION_RAIL_BOOTSTRAP_TEMPLATE);
72
71
 
73
72
  // Nothing to assert by id; confirm the table stayed empty.
74
- const rows = getDb().select().from(activationSessions).all();
75
- expect(rows.length).toBe(0);
73
+ const { n } = getMemorySqlite()!
74
+ .query("SELECT COUNT(*) AS n FROM activation_sessions")
75
+ .get() as { n: number };
76
+ expect(n).toBe(0);
76
77
  });
77
78
 
78
79
  test("does not mark when BOOTSTRAP.md is customized to something else", () => {
@@ -13,20 +13,13 @@
13
13
  * field is omitted from `providerConfig` rather than carrying `undefined`.
14
14
  */
15
15
 
16
- import { beforeAll, describe, expect, mock, test } from "bun:test";
17
-
18
- import { setOverridesForTesting } from "./feature-flag-test-helpers.js";
19
- import { setConfig } from "./helpers/set-config.js";
16
+ import { describe, expect, mock, test } from "bun:test";
20
17
 
21
18
  // These suites exercise override-profile PLUMBING through legacy-shaped
22
19
  // fixtures (llm.default-centric, no defaultProvider). Pinned to the
23
20
  // flag-off cascade; override-or-default resolution semantics are pinned by
24
21
  // llm-resolver-override-or-default.test.ts and the inference-profile loop
25
22
  // suite.
26
- beforeAll(() => {
27
- setOverridesForTesting({ "override-or-default-resolution": false });
28
- });
29
-
30
23
  import { AgentLoop } from "../agent/loop.js";
31
24
  import type {
32
25
  Message,
@@ -35,6 +28,7 @@ import type {
35
28
  SendMessageOptions,
36
29
  ToolDefinition,
37
30
  } from "../providers/types.js";
31
+ import { setConfig } from "./helpers/set-config.js";
38
32
 
39
33
  const userMessage: Message = {
40
34
  role: "user",
@@ -277,14 +271,20 @@ mock.module("../providers/registry.js", () => ({
277
271
  resolveProviderFromConnection: async () => anthropicStub,
278
272
  }));
279
273
 
274
+ import { VELLUM_MANAGED_CONNECTION_NAME } from "../providers/vellum-model-routing.js";
275
+
280
276
  // Connection-aware resolver path: satisfy
281
277
  // `tryResolveProviderForConnectionName` lookups so resolveDefaultProvider
282
- // returns a usable provider for the inline `anthropic-conn` fixture.
278
+ // returns a usable provider for any connection name the winning profile
279
+ // references. The managed connection must carry the provider the catalog
280
+ // `balanced` default declares (fireworks) or resolution rejects the row as a
281
+ // provider mismatch; other names behave as personal anthropic connections.
283
282
  mock.module("../providers/inference/connections.js", () => ({
284
283
  getConnection: (_db: unknown, name: string) => ({
285
284
  id: 1,
286
285
  name,
287
- provider: "anthropic",
286
+ provider:
287
+ name === VELLUM_MANAGED_CONNECTION_NAME ? "fireworks" : "anthropic",
288
288
  auth_strategy: "user_managed_credential",
289
289
  credential_alias: null,
290
290
  metadata_json: null,
@@ -295,21 +295,16 @@ mock.module("../providers/inference/connections.js", () => ({
295
295
 
296
296
  /**
297
297
  * Seed the workspace `llm` config block for real. `activeProfile` and
298
- * `callSites` vary per test; the rest is the shared legacy-shaped fixture.
298
+ * `callSites` vary per test.
299
299
  */
300
300
  function seedLlmConfig(options?: {
301
301
  activeProfile?: string;
302
302
  callSites?: Record<string, unknown>;
303
303
  }): void {
304
304
  setConfig("llm", {
305
- default: {
306
- provider: "anthropic",
307
- model: "claude-opus-4-7",
308
- provider_connection: "anthropic-conn",
309
- },
310
305
  profiles: {
311
- // Disable the catalog default so resolution lands on llm.default.
312
- balanced: { source: "managed", status: "disabled" },
306
+ // Complete (provider + model) so the profile is a usable winner at
307
+ // every rung of the single-winner selection chain.
313
308
  fast: {
314
309
  source: "user",
315
310
  provider: "anthropic",
@@ -457,7 +452,7 @@ describe("executeSubagentSpawn — nested inheritance via context.overrideProfil
457
452
  }
458
453
  });
459
454
 
460
- test("omits overrideProfile when neither context nor row carries it", async () => {
455
+ test("forwards the invoker's resolved default profile when neither context nor row carries an override", async () => {
461
456
  const manager = getSubagentManager();
462
457
  const originalSpawn = manager.spawn.bind(manager);
463
458
  let capturedConfig: Record<string, unknown> | undefined;
@@ -479,10 +474,11 @@ describe("executeSubagentSpawn — nested inheritance via context.overrideProfil
479
474
  );
480
475
 
481
476
  expect(capturedConfig).toBeDefined();
482
- // Field must be absent rather than carrying `undefined` so the
483
- // SubagentConfig respects the same "field omitted when unset"
484
- // contract the agent loop uses.
485
- expect("overrideProfile" in capturedConfig!).toBe(false);
477
+ // With no explicit override anywhere, the invoker-default tier forwards
478
+ // the invoking call site's resolved default profile — here `mainAgent`
479
+ // with no active profile or pin, which resolves the catalog `balanced`
480
+ // default — so the subagent matches its invoker's model selection.
481
+ expect(capturedConfig!.overrideProfile).toBe("balanced");
486
482
  } finally {
487
483
  manager.spawn = originalSpawn;
488
484
  }
@@ -491,8 +487,9 @@ describe("executeSubagentSpawn — nested inheritance via context.overrideProfil
491
487
  test("an explicit subagentSpawn call-site pin suppresses the invoker-default inheritance", async () => {
492
488
  // With an active profile the invoker-default tier resolves ("fast"), so
493
489
  // absent a pin it is forwarded as the inherited override; with an
494
- // explicit llm.callSites.subagentSpawn profile the heuristic must yield
495
- // so the pin can win under override-or-default resolution.
490
+ // explicit llm.callSites.subagentSpawn profile the heuristic must yield
491
+ // a forwarded override would outrank the pin under single-winner
492
+ // resolution, overriding the user's explicit call-site choice.
496
493
  const manager = getSubagentManager();
497
494
  const originalSpawn = manager.spawn.bind(manager);
498
495
  let capturedConfig: Record<string, unknown> | undefined;
@@ -26,26 +26,7 @@
26
26
  * pinned-profile values.
27
27
  */
28
28
 
29
- import {
30
- afterEach,
31
- beforeAll,
32
- beforeEach,
33
- describe,
34
- expect,
35
- mock,
36
- test,
37
- } from "bun:test";
38
-
39
- import { setOverridesForTesting } from "./feature-flag-test-helpers.js";
40
-
41
- // These suites exercise override-profile PLUMBING through legacy-shaped
42
- // fixtures (llm.default-centric, no defaultProvider). Pinned to the
43
- // flag-off cascade; override-or-default resolution semantics are pinned by
44
- // llm-resolver-override-or-default.test.ts and the inference-profile loop
45
- // suite.
46
- beforeAll(() => {
47
- setOverridesForTesting({ "override-or-default-resolution": false });
48
- });
29
+ import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
49
30
 
50
31
  let mockOverrideProfile: string | undefined = undefined;
51
32
 
@@ -140,14 +121,12 @@ describe("wakeAgentForOpportunity — overrideProfile forwarding", () => {
140
121
  test("forwards the conversation's pinned overrideProfile + mainAgent callSite to agentLoop.run", async () => {
141
122
  mockOverrideProfile = "frontier";
142
123
  setLlmConfig({
143
- default: {
144
- provider: "anthropic",
145
- model: "claude-sonnet-4-6",
146
- maxTokens: 64000,
147
- contextWindow: { maxInputTokens: 200000 },
148
- },
149
124
  profiles: {
125
+ // Complete (provider + model) so the pinned profile is a usable
126
+ // winner; its context window is what the wake must resolve.
150
127
  frontier: {
128
+ provider: "anthropic",
129
+ model: "claude-sonnet-4-6",
151
130
  contextWindow: { maxInputTokens: 150000 },
152
131
  },
153
132
  },
@@ -184,23 +163,24 @@ describe("wakeAgentForOpportunity — overrideProfile forwarding", () => {
184
163
  test("forceOverrideProfile replaces the pinned-profile lookup and forwards the force flag to agentLoop.run", async () => {
185
164
  // The conversation's own pinned profile must be ignored — the caller's
186
165
  // forced profile (e.g. a fork-based retrospective matching the source
187
- // conversation) takes its place AND floats above the call-site layers
188
- // via the resolver's `forceOverrideProfile` escape hatch.
166
+ // conversation) takes its place and, as the override rung of the
167
+ // single-winner chain, beats the call site's own pinned profile.
189
168
  mockOverrideProfile = "pinned-ignored";
190
169
  setLlmConfig({
191
- default: {
192
- provider: "anthropic",
193
- model: "claude-sonnet-4-6",
194
- maxTokens: 64000,
195
- contextWindow: { maxInputTokens: 200000 },
196
- },
197
170
  profiles: {
198
171
  forced: {
172
+ provider: "anthropic",
173
+ model: "claude-sonnet-4-6",
199
174
  contextWindow: { maxInputTokens: 120000 },
200
175
  },
176
+ "retrospective-pinned": {
177
+ provider: "anthropic",
178
+ model: "claude-sonnet-4-6",
179
+ contextWindow: { maxInputTokens: 180000 },
180
+ },
201
181
  },
202
182
  callSites: {
203
- memoryRetrospective: { contextWindow: { maxInputTokens: 180000 } },
183
+ memoryRetrospective: { profile: "retrospective-pinned" },
204
184
  },
205
185
  });
206
186
  const { target, runArgs } = makeTarget();
@@ -221,8 +201,9 @@ describe("wakeAgentForOpportunity — overrideProfile forwarding", () => {
221
201
  expect(runArgs[0]!.options?.overrideProfile).toBe("forced");
222
202
  expect(runArgs[0]!.options?.forceOverrideProfile).toBe(true);
223
203
  expect(runArgs[0]!.options?.callSite).toBe("memoryRetrospective");
224
- // The effective context window resolves under the FORCED profile, above
225
- // the explicit call-site override (120k beats the call site's 180k).
204
+ // The effective context window resolves under the FORCED profile, which
205
+ // wins selection over the call site's own pinned profile (the forced
206
+ // profile's 120k beats the call-site profile's 180k).
226
207
  expect(runArgs[0]!.options?.resolveContextWindow?.().maxInputTokens).toBe(
227
208
  120000,
228
209
  );
@@ -231,13 +212,9 @@ describe("wakeAgentForOpportunity — overrideProfile forwarding", () => {
231
212
  test("without forceOverrideProfile the wake never sets the force flag", async () => {
232
213
  mockOverrideProfile = "frontier";
233
214
  setLlmConfig({
234
- default: {
235
- provider: "anthropic",
236
- model: "claude-sonnet-4-6",
237
- maxTokens: 64000,
238
- contextWindow: { maxInputTokens: 200000 },
215
+ profiles: {
216
+ frontier: { provider: "anthropic", model: "claude-sonnet-4-6" },
239
217
  },
240
- profiles: { frontier: {} },
241
218
  callSites: { mainAgent: {} },
242
219
  });
243
220
  const { target, runArgs } = makeTarget();
@@ -317,13 +294,9 @@ describe("wakeAgentForOpportunity — resolver actually engages", () => {
317
294
  // undefined (the original bug), the retry layer would skip the resolver
318
295
  // entirely and the downstream provider would see only the wire defaults.
319
296
  setLlmConfig({
320
- default: {
321
- provider: "anthropic",
322
- model: "claude-sonnet-4-6",
323
- maxTokens: 64000,
324
- },
325
297
  profiles: {
326
298
  frontier: {
299
+ provider: "anthropic",
327
300
  model: "claude-opus-4-7",
328
301
  maxTokens: 32000,
329
302
  },
@@ -61,7 +61,6 @@ mock.module("../apps/app-store.js", () => ({
61
61
  dirName: id,
62
62
  appDir: `/tmp/test-apps/${id}`,
63
63
  }),
64
- isMultifileApp: (app: AppDefinition) => app.formatVersion === 2,
65
64
  }));
66
65
 
67
66
  // Mock compileApp for multifile scaffold path
@@ -21,7 +21,6 @@ mock.module("../apps/app-store.js", () => ({
21
21
  getApp: (id: string) => mockApps.get(id) ?? null,
22
22
  getAppsDir: () => testAppsDir,
23
23
  getAppDirPath: (id: string) => join(testAppsDir, id),
24
- isMultifileApp: (app: Record<string, unknown>) => app.formatVersion === 2,
25
24
  }));
26
25
 
27
26
  // Mock content-id to avoid pulling in crypto internals
@@ -323,19 +322,12 @@ render(<App />, document.getElementById('app')!);
323
322
  expect(zip.file("main.css")).toBeNull();
324
323
  });
325
324
 
326
- test("keeps legacy single-file apps packageable", async () => {
325
+ test("rejects legacy single-file apps with a missing-src error", async () => {
327
326
  const appId = "legacy-single-file";
328
327
  setupLegacyApp(appId);
329
328
 
330
- const result = await packageApp(appId);
331
- const zipData = await readFile(result.bundlePath);
332
- const zip = await JSZip.loadAsync(zipData);
333
-
334
- const indexContent = await zip.file("index.html")!.async("string");
335
- const manifestJson = await zip.file("manifest.json")!.async("string");
336
- const manifest: AppManifest = JSON.parse(manifestJson);
337
-
338
- expect(indexContent).toContain("<h1>Legacy</h1>");
339
- expect(manifest.format_version).toBe(1);
329
+ await expect(packageApp(appId)).rejects.toThrow(
330
+ /missing src\/index\.html and src\/main\.tsx/,
331
+ );
340
332
  });
341
333
  });
@@ -39,18 +39,6 @@ import {
39
39
  // Helpers
40
40
  // ---------------------------------------------------------------------------
41
41
 
42
- function makeLegacyApp(overrides?: Partial<AppDefinition>): AppDefinition {
43
- return {
44
- id: "legacy-app",
45
- name: "Legacy App",
46
- schemaJson: "{}",
47
- htmlDefinition: "<html></html>",
48
- createdAt: Date.now(),
49
- updatedAt: Date.now(),
50
- ...overrides,
51
- };
52
- }
53
-
54
42
  function makeMultifileApp(overrides?: Partial<AppDefinition>): AppDefinition {
55
43
  return {
56
44
  id: "multi-app",
@@ -150,9 +138,7 @@ describe("executeAppCreate", () => {
150
138
  );
151
139
 
152
140
  expect(result.isError).toBe(false);
153
- // formatVersion 2 passed to createApp
154
- expect(createdParams?.formatVersion).toBe(2);
155
- // htmlDefinition should be empty for multifile apps
141
+ // htmlDefinition should be empty — the real source lives under src/
156
142
  expect(createdParams?.htmlDefinition).toBe("");
157
143
  // Scaffold files should be written
158
144
  expect(files["src/index.html"]).toBeDefined();
@@ -455,20 +441,6 @@ describe("executeAppCreate", () => {
455
441
  // ---------------------------------------------------------------------------
456
442
 
457
443
  describe("executeAppRefresh", () => {
458
- test("legacy app: bumps updatedAt without compiling", async () => {
459
- const app = makeLegacyApp();
460
- const store = mockStore(app);
461
- const result = await executeAppRefresh({ app_id: app.id }, store);
462
-
463
- expect(result.isError).toBe(false);
464
- const parsed = JSON.parse(result.content);
465
- expect(parsed.refreshed).toBe(true);
466
- expect(parsed.appId).toBe(app.id);
467
- // Legacy apps should not have compile-related fields
468
- expect(parsed.compiled).toBeUndefined();
469
- expect(parsed.compile_errors).toBeUndefined();
470
- });
471
-
472
444
  test("multifile app: compiles src/ and returns result", async () => {
473
445
  const app = makeMultifileApp();
474
446
  const store = mockStore(app);
@@ -483,7 +455,7 @@ describe("executeAppRefresh", () => {
483
455
  });
484
456
 
485
457
  test("returns error for unknown app", async () => {
486
- const app = makeLegacyApp();
458
+ const app = makeMultifileApp();
487
459
  const store = mockStore(app);
488
460
  const result = await executeAppRefresh({ app_id: "nonexistent" }, store);
489
461
 
@@ -541,25 +513,6 @@ describe("executeAppUpdate", () => {
541
513
  expect(JSON.parse(result.content).compiled).toBe(true);
542
514
  });
543
515
 
544
- test("legacy app: updates without compiling", async () => {
545
- const app = makeLegacyApp({ name: "Legacy" });
546
- const store: AppStore = {
547
- ...mockStore(app),
548
- updateApp: (_id, updates) => ({ ...app, ...updates }),
549
- };
550
-
551
- const result = await executeAppUpdate(
552
- { app_id: app.id, name: "Renamed" },
553
- store,
554
- );
555
-
556
- expect(result.isError).toBe(false);
557
- const parsed = JSON.parse(result.content);
558
- expect(parsed.updated).toBe(true);
559
- expect(parsed.name).toBe("Renamed");
560
- expect(parsed.compiled).toBeUndefined();
561
- });
562
-
563
516
  test("returns error for unknown app", async () => {
564
517
  const store = mockStore(makeMultifileApp());
565
518
  const result = await executeAppUpdate({ app_id: "nope" }, store);