@vellumai/assistant 0.12.1-dev.202609141913.5e16607 → 0.12.1-staging.2

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 (439) hide show
  1. package/AGENTS.md +0 -4
  2. package/ARCHITECTURE.md +12 -11
  3. package/docs/architecture/turn-actor.md +8 -15
  4. package/docs/guardian-request-flow.md +0 -16
  5. package/openapi.yaml +49 -291
  6. package/package.json +1 -1
  7. package/src/__tests__/always-loaded-tools-guard.test.ts +10 -18
  8. package/src/__tests__/app-compiler.test.ts +0 -6
  9. package/src/__tests__/app-control-tool-schemas.test.ts +2 -5
  10. package/src/__tests__/app-dir-path-guard.test.ts +3 -1
  11. package/src/__tests__/app-source-watcher.test.ts +218 -0
  12. package/src/{calls/__tests__ → __tests__}/call-controller.test.ts +82 -503
  13. package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +2 -5
  14. package/src/__tests__/computer-use-tools.test.ts +5 -17
  15. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  16. package/src/__tests__/config-schema.test.ts +29 -28
  17. package/src/__tests__/config-watcher-skill-reseed.test.ts +359 -0
  18. package/src/__tests__/config-watcher.test.ts +8 -23
  19. package/src/__tests__/connection-model-compat.test.ts +2 -2
  20. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  21. package/src/__tests__/conversation-pairing.test.ts +0 -26
  22. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -4
  23. package/src/__tests__/conversation-queue.test.ts +207 -48
  24. package/src/__tests__/conversation-retry-discard.test.ts +1 -54
  25. package/src/__tests__/conversation-skill-tools.test.ts +0 -27
  26. package/src/__tests__/conversation-surfaces-app-control.test.ts +3 -8
  27. package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -67
  28. package/src/__tests__/conversation-title-service.test.ts +10 -14
  29. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +5 -3
  30. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -51
  31. package/src/__tests__/credential-record-retire.test.ts +1 -171
  32. package/src/__tests__/credential-routes.test.ts +3 -212
  33. package/src/__tests__/credential-security-invariants.test.ts +2 -4
  34. package/src/__tests__/cu-unified-flow.test.ts +2 -8
  35. package/src/__tests__/document-sync-tags.test.ts +0 -25
  36. package/src/__tests__/drain-kick-guard.test.ts +2 -0
  37. package/src/__tests__/drain-requeue-on-contention.test.ts +6 -0
  38. package/src/__tests__/evict-conversations-for-reload.test.ts +1 -1
  39. package/src/__tests__/host-bash-proxy.test.ts +45 -26
  40. package/src/__tests__/host-browser-proxy.test.ts +17 -6
  41. package/src/__tests__/host-file-proxy-targeted.test.ts +0 -23
  42. package/src/__tests__/host-file-proxy.test.ts +23 -11
  43. package/src/__tests__/host-transfer-proxy-targeted.test.ts +9 -30
  44. package/src/__tests__/llm-catalog-parity.test.ts +0 -25
  45. package/src/__tests__/mcp-auth-routes.test.ts +9 -6
  46. package/src/__tests__/mcp-config-secret-boundary.test.ts +136 -78
  47. package/src/__tests__/mcp-health-check.test.ts +11 -8
  48. package/src/__tests__/mcp-list-plugin-servers.test.ts +10 -8
  49. package/src/{calls/__tests__ → __tests__}/media-stream-audio-transcode.test.ts +1 -1
  50. package/src/{calls/__tests__ → __tests__}/media-stream-output.test.ts +8 -37
  51. package/src/{calls/__tests__ → __tests__}/media-stream-parser.test.ts +1 -1
  52. package/src/{calls/__tests__ → __tests__}/media-stream-server-integration.test.ts +57 -150
  53. package/src/{calls/__tests__ → __tests__}/media-stream-stt-session.test.ts +5 -5
  54. package/src/{calls/__tests__ → __tests__}/media-turn-detector.test.ts +1 -1
  55. package/src/__tests__/messages-after-tiebreaker.test.ts +0 -91
  56. package/src/__tests__/messages-read-boundary-guard.test.ts +1 -1
  57. package/src/__tests__/messaging-send-tool.test.ts +548 -355
  58. package/src/__tests__/model-intents.test.ts +0 -3
  59. package/src/__tests__/notification-vellum-adapter.test.ts +2 -85
  60. package/src/__tests__/outlook-messaging-provider.test.ts +6 -6
  61. package/src/__tests__/platform-callback-registration.test.ts +16 -8
  62. package/src/__tests__/platform-client-verify-credential.test.ts +0 -2
  63. package/src/__tests__/plugin-import-boundary-guard.test.ts +0 -13
  64. package/src/__tests__/script-proxy-certs.test.ts +0 -35
  65. package/src/__tests__/skill-feature-flags-integration.test.ts +1 -1
  66. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  67. package/src/__tests__/speaker-identification.test.ts +56 -0
  68. package/src/__tests__/subagent-tool-gate-mode.test.ts +3 -19
  69. package/src/__tests__/subagent-tools.test.ts +2 -3
  70. package/src/__tests__/telephony-tts-guard.test.ts +3 -38
  71. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +0 -4
  72. package/src/{calls/__tests__/voice-session-bridge-turn-flow.test.ts → __tests__/voice-session-bridge.test.ts} +12 -20
  73. package/src/__tests__/watch-retro-tool-availability.test.ts +17 -8
  74. package/src/__tests__/workspace-git-service.test.ts +0 -26
  75. package/src/acp/__tests__/agent-process.test.ts +4 -258
  76. package/src/acp/__tests__/auth-required.test.ts +0 -96
  77. package/src/acp/__tests__/client-handler.test.ts +2 -90
  78. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -5
  79. package/src/acp/__tests__/session-manager-resume.test.ts +6 -270
  80. package/src/acp/__tests__/session-manager-usage.test.ts +2 -4
  81. package/src/acp/__tests__/session-manager.test.ts +4 -895
  82. package/src/acp/agent-process.test.ts +1 -4
  83. package/src/acp/agent-process.ts +9 -94
  84. package/src/acp/auth-required.ts +1 -50
  85. package/src/acp/auto-install.test.ts +7 -9
  86. package/src/acp/client-handler.ts +3 -16
  87. package/src/acp/resolve-agent.test.ts +6 -220
  88. package/src/acp/resolve-agent.ts +23 -88
  89. package/src/acp/session-manager.test.ts +3 -196
  90. package/src/acp/session-manager.ts +18 -441
  91. package/src/acp/types.ts +5 -50
  92. package/src/api/events/app-files-changed.ts +3 -4
  93. package/src/api/events/notification-intent.ts +0 -2
  94. package/src/api/index.ts +0 -6
  95. package/src/apps/app-store.ts +1 -1
  96. package/src/bundler/app-compiler.ts +0 -15
  97. package/src/calls/__tests__/voice-control-protocol.test.ts +25 -58
  98. package/src/calls/__tests__/voice-session-bridge.test.ts +1 -37
  99. package/src/calls/__tests__/voice-triage-escalate.test.ts +0 -105
  100. package/src/calls/call-constants.ts +4 -24
  101. package/src/calls/call-controller.ts +199 -499
  102. package/src/calls/call-transport.ts +0 -16
  103. package/src/calls/media-stream-output.ts +0 -32
  104. package/src/calls/media-stream-server.ts +30 -82
  105. package/src/calls/media-stream-stt-session.ts +0 -15
  106. package/src/calls/resolve-call-tts-provider.ts +2 -33
  107. package/src/calls/speaker-identification.ts +233 -0
  108. package/src/calls/tts-call-strategy.ts +5 -9
  109. package/src/calls/types.ts +0 -2
  110. package/src/calls/voice-control-protocol.ts +21 -53
  111. package/src/calls/voice-session-bridge.ts +46 -59
  112. package/src/calls/voice-triage-escalate.ts +56 -175
  113. package/src/cli/commands/apps.help.ts +13 -67
  114. package/src/cli/commands/apps.ts +0 -183
  115. package/src/cli/commands/bash.help.ts +13 -8
  116. package/src/cli/commands/bash.ts +25 -7
  117. package/src/cli/commands/channels/index.help.ts +2 -70
  118. package/src/cli/commands/channels/index.ts +3 -16
  119. package/src/cli/commands/credentials.help.ts +2 -6
  120. package/src/cli/commands/credentials.ts +2 -2
  121. package/src/cli/commands/mcp.help.ts +8 -8
  122. package/src/cli/commands/mcp.ts +1 -1
  123. package/src/cli/commands/roadmap.help.ts +1 -5
  124. package/src/cli/commands/roadmap.ts +1 -1
  125. package/src/cli/lib/bundled-marketplace.json +90 -103
  126. package/src/config/__tests__/default-profile-catalog.test.ts +0 -22
  127. package/src/config/__tests__/memory-retrospective-schema.test.ts +1 -15
  128. package/src/config/__tests__/platform-rehydration.test.ts +9 -99
  129. package/src/config/acp-defaults.test.ts +3 -13
  130. package/src/config/acp-defaults.ts +6 -23
  131. package/src/config/acp-schema.ts +2 -30
  132. package/src/config/bundled-skills/acp/SKILL.md +14 -22
  133. package/src/config/bundled-skills/acp/TOOLS.json +1 -5
  134. package/src/config/bundled-skills/app-builder/SKILL.md +9 -12
  135. package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +1 -1
  136. package/src/config/bundled-skills/messaging/SKILL.md +3 -3
  137. package/src/config/bundled-skills/messaging/TOOLS.json +3 -3
  138. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +139 -67
  139. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +1 -1
  140. package/src/config/bundled-skills/schedule/SKILL.md +4 -3
  141. package/src/config/bundled-skills/screen-annotation/SKILL.md +1 -8
  142. package/src/config/bundled-skills/screen-annotation/tools/screen-annotation.test.ts +1 -4
  143. package/src/config/bundled-skills/skill-management/TOOLS.json +2 -2
  144. package/src/config/default-profile-catalog.ts +1 -1
  145. package/src/config/env.ts +2 -2
  146. package/src/config/feature-flag-registry.json +12 -24
  147. package/src/config/loader.ts +0 -1
  148. package/src/config/memory-v3-gate.test.ts +0 -31
  149. package/src/config/memory-v3-gate.ts +16 -20
  150. package/src/config/platform-rehydration.ts +27 -11
  151. package/src/config/schema.ts +2 -2
  152. package/src/config/schemas/__tests__/live-voice.test.ts +158 -8
  153. package/src/config/schemas/calls.ts +28 -1
  154. package/src/config/schemas/live-voice.ts +173 -1
  155. package/src/config/schemas/mcp.ts +1 -1
  156. package/src/config/schemas/memory-retrospective.ts +0 -10
  157. package/src/config/schemas/services.ts +0 -8
  158. package/src/config/schemas/skills.ts +14 -0
  159. package/src/credential-execution/process-manager.test.ts +19 -18
  160. package/src/daemon/__tests__/conversation-tool-setup.test.ts +121 -66
  161. package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +1 -4
  162. package/src/daemon/app-source-watcher.ts +218 -0
  163. package/src/daemon/config-watcher.ts +194 -13
  164. package/src/daemon/conversation-process.ts +64 -35
  165. package/src/daemon/conversation-skill-tools.ts +31 -13
  166. package/src/daemon/conversation-store.ts +1 -1
  167. package/src/daemon/conversation-surfaces.ts +8 -10
  168. package/src/daemon/conversation-tool-setup.ts +43 -37
  169. package/src/daemon/conversation.ts +3 -0
  170. package/src/daemon/host-bash-proxy.ts +12 -8
  171. package/src/daemon/host-browser-proxy.ts +1 -15
  172. package/src/daemon/host-file-proxy.ts +10 -8
  173. package/src/daemon/host-transfer-proxy.ts +18 -14
  174. package/src/daemon/lifecycle.ts +5 -0
  175. package/src/daemon/mcp-reload-service.ts +5 -5
  176. package/src/daemon/message-types/sync.ts +0 -1
  177. package/src/daemon/orphan-reaper.ts +1 -1
  178. package/src/daemon/providers-setup.ts +1 -1
  179. package/src/daemon/shutdown-handlers.ts +9 -1
  180. package/src/daemon/skill-memory-refresh.ts +0 -64
  181. package/src/daemon/tool-side-effects.ts +18 -7
  182. package/src/home/__tests__/feed-writer.test.ts +0 -22
  183. package/src/home/feed-writer.ts +2 -11
  184. package/src/hooks/types.ts +0 -33
  185. package/src/inbound/platform-callback-registration.ts +5 -4
  186. package/src/live-voice/__tests__/live-voice-metrics.test.ts +3 -0
  187. package/src/live-voice/__tests__/live-voice-progress.test.ts +15 -15
  188. package/src/live-voice/__tests__/live-voice-vad.test.ts +2 -2
  189. package/src/{calls → live-voice}/__tests__/progress-narration.test.ts +4 -4
  190. package/src/{calls → live-voice}/__tests__/progress-phrases.test.ts +1 -1
  191. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +69 -13
  192. package/src/live-voice/live-voice-session.ts +693 -213
  193. package/src/{calls → live-voice}/progress-narration.ts +2 -2
  194. package/src/live-voice/protocol.ts +2 -0
  195. package/src/mcp/__tests__/effective-config.test.ts +2 -2
  196. package/src/mcp/effective-config.ts +3 -3
  197. package/src/mcp/mcp-header-store.ts +45 -29
  198. package/src/mcp/startup.ts +4 -8
  199. package/src/messaging/provider.ts +3 -10
  200. package/src/messaging/providers/callback-routing.ts +0 -18
  201. package/src/messaging/providers/channel-transport.ts +0 -56
  202. package/src/messaging/providers/discord/transport.ts +0 -17
  203. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +17 -6
  204. package/src/messaging/providers/slack/adapter.ts +44 -7
  205. package/src/messaging/providers/slack/transport.ts +0 -16
  206. package/src/messaging/providers/telegram-bot/adapter.ts +48 -1
  207. package/src/messaging/providers/telegram-bot/client.ts +26 -0
  208. package/src/messaging/providers/telegram-bot/transport.ts +0 -20
  209. package/src/messaging/providers/whatsapp/adapter.ts +48 -1
  210. package/src/messaging/providers/whatsapp/client.ts +29 -0
  211. package/src/messaging/providers/whatsapp/transport.ts +0 -18
  212. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +0 -8
  213. package/src/notifications/__tests__/assistant-reply-producer.test.ts +0 -55
  214. package/src/notifications/__tests__/guardian-feed-projection.test.ts +2 -158
  215. package/src/notifications/__tests__/home-feed-side-effect.test.ts +3 -153
  216. package/src/notifications/__tests__/schedule-result-producer.test.ts +3 -99
  217. package/src/notifications/adapters/macos.ts +0 -3
  218. package/src/notifications/assistant-reply-producer.ts +3 -8
  219. package/src/notifications/conversation-pairing.ts +16 -36
  220. package/src/notifications/delivered-post-record.ts +1 -11
  221. package/src/notifications/guardian-feed-projection.ts +5 -125
  222. package/src/notifications/home-feed-side-effect.ts +7 -55
  223. package/src/notifications/schedule-result-producer.ts +22 -66
  224. package/src/oauth/__tests__/seed-providers-managed.test.ts +0 -54
  225. package/src/oauth/byo-connection.test.ts +0 -45
  226. package/src/oauth/byo-connection.ts +6 -36
  227. package/src/oauth/connection-resolver.test.ts +0 -73
  228. package/src/oauth/connection-resolver.ts +2 -95
  229. package/src/oauth/seed-providers.ts +0 -165
  230. package/src/outbound-proxy/certs.ts +5 -3
  231. package/src/permissions/checker.test.ts +6 -11
  232. package/src/persistence/compaction-log-store-clickhouse.ts +3 -3
  233. package/src/persistence/conversation-crud.ts +63 -71
  234. package/src/persistence/conversation-lineage.ts +4 -12
  235. package/src/persistence/conversation-title-service.ts +26 -9
  236. package/src/persistence/llm-request-log-sink-clickhouse.ts +3 -3
  237. package/src/persistence/llm-request-log-source-clickhouse.ts +3 -3
  238. package/src/persistence/message-reads.ts +0 -30
  239. package/src/persistence/migrations/157-invite-contact-id.ts +6 -18
  240. package/src/persistence/schema/memory-core.ts +0 -5
  241. package/src/platform/client.test.ts +2 -4
  242. package/src/platform/client.ts +10 -2
  243. package/src/plugin-api/constants.ts +0 -2
  244. package/src/plugin-api/index.ts +0 -1
  245. package/src/plugin-api/types.ts +0 -2
  246. package/src/plugins/defaults/index.ts +0 -2
  247. package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +0 -46
  248. package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +5 -9
  249. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +10 -20
  250. package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +0 -219
  251. package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +0 -31
  252. package/src/plugins/defaults/memory/__tests__/memory-retrospective-trigger-check.test.ts +0 -63
  253. package/src/plugins/defaults/memory/__tests__/shutdown-hook.test.ts +0 -4
  254. package/src/plugins/defaults/memory/graph/capability-seed.ts +6 -4
  255. package/src/plugins/defaults/memory/hooks/init.ts +0 -10
  256. package/src/plugins/defaults/memory/hooks/shutdown.ts +0 -2
  257. package/src/plugins/defaults/memory/jobs-worker.ts +0 -13
  258. package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +60 -34
  259. package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +5 -3
  260. package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -12
  261. package/src/plugins/defaults/memory/memory-retrospective-state.ts +71 -312
  262. package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +1 -2
  263. package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +3 -5
  264. package/src/plugins/defaults/memory/startup.ts +1 -6
  265. package/src/plugins/defaults/memory/substrate/__tests__/skill-content.test.ts +9 -7
  266. package/src/plugins/defaults/memory/substrate/skill-content.ts +2 -2
  267. package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +0 -89
  268. package/src/plugins/defaults/memory/worker.ts +0 -6
  269. package/src/plugins/mcp-servers.ts +75 -15
  270. package/src/providers/__tests__/connection-model-compat.test.ts +3 -3
  271. package/src/providers/gemini/client.ts +23 -9
  272. package/src/providers/inference/auth.ts +3 -2
  273. package/src/providers/inference/connection-availability.ts +8 -27
  274. package/src/providers/inference/resolve-auth.ts +4 -22
  275. package/src/providers/model-catalog.ts +0 -34
  276. package/src/providers/model-intents.ts +5 -10
  277. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +18 -146
  278. package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +1 -83
  279. package/src/providers/openai/chat-completions-provider.ts +78 -192
  280. package/src/providers/openai/codex-models.ts +4 -0
  281. package/src/runtime/AGENTS.md +0 -2
  282. package/src/runtime/auth/same-actor.ts +3 -38
  283. package/src/runtime/http-server.ts +151 -160
  284. package/src/runtime/routes/__tests__/acp-routes.test.ts +4 -159
  285. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -108
  286. package/src/runtime/routes/__tests__/default-provider-routes.test.ts +2 -2
  287. package/src/runtime/routes/__tests__/mcp-add-default-risk.test.ts +12 -16
  288. package/src/runtime/routes/acp-routes.test.ts +0 -15
  289. package/src/runtime/routes/acp-routes.ts +9 -72
  290. package/src/runtime/routes/app-management-routes.ts +0 -73
  291. package/src/runtime/routes/app-routes.ts +1 -1
  292. package/src/runtime/routes/conversation-list-routes.ts +3 -14
  293. package/src/runtime/routes/conversation-query-routes.ts +0 -40
  294. package/src/runtime/routes/credential-routes.ts +10 -19
  295. package/src/runtime/routes/debug-bash-routes.ts +173 -0
  296. package/src/runtime/routes/diagnostics-routes.ts +3 -55
  297. package/src/runtime/routes/index.ts +2 -4
  298. package/src/runtime/routes/log-export-routes.ts +0 -2
  299. package/src/runtime/routes/mcp-auth-routes.ts +47 -39
  300. package/src/runtime/routes/migration-routes.ts +20 -6
  301. package/src/runtime/routes/platform-routes.ts +15 -18
  302. package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -28
  303. package/src/runtime/services/conversation-serializer.ts +3 -16
  304. package/src/runtime/sync/resource-sync-events.ts +1 -2
  305. package/src/schedule/worker.ts +1 -1
  306. package/src/security/ces-rpc-record-backend.ts +0 -7
  307. package/src/subagent/consult-context.ts +25 -12
  308. package/src/tools/acp/list-agents.test.ts +1 -3
  309. package/src/tools/acp/spawn.test.ts +11 -146
  310. package/src/tools/acp/spawn.ts +3 -21
  311. package/src/tools/acp/status.ts +3 -40
  312. package/src/tools/app-control/skill-proxy-bridge.ts +1 -2
  313. package/src/tools/capability-offer.test.ts +2 -22
  314. package/src/tools/capability-offer.ts +1 -16
  315. package/src/tools/computer-use/definitions.ts +2 -4
  316. package/src/tools/computer-use/skill-proxy-bridge.ts +1 -2
  317. package/src/tools/credentials/metadata-store.ts +0 -100
  318. package/src/tools/host-filesystem/edit.test.ts +1 -2
  319. package/src/tools/host-filesystem/edit.ts +2 -2
  320. package/src/tools/host-filesystem/read.test.ts +1 -2
  321. package/src/tools/host-filesystem/read.ts +2 -2
  322. package/src/tools/host-filesystem/transfer.test.ts +1 -2
  323. package/src/tools/host-filesystem/transfer.ts +2 -2
  324. package/src/tools/host-filesystem/write.test.ts +1 -2
  325. package/src/tools/host-filesystem/write.ts +2 -2
  326. package/src/tools/host-terminal/host-shell.test.ts +0 -16
  327. package/src/tools/host-terminal/host-shell.ts +20 -4
  328. package/src/tools/policy-context.ts +7 -6
  329. package/src/tools/subagent/spawn.ts +8 -5
  330. package/src/tools/watch/watch-retro-report.ts +8 -0
  331. package/src/util/__tests__/language-subtag.test.ts +1 -23
  332. package/src/util/fs-watcher-error.ts +36 -0
  333. package/src/util/language-subtag.ts +0 -16
  334. package/src/util/platform.ts +0 -8
  335. package/src/workspace/git-service.ts +54 -5
  336. package/src/workspace/migrations/registry.ts +0 -6
  337. package/scripts/smoke-desktop-window-theme.ts +0 -186
  338. package/src/__tests__/git-porcelain.test.ts +0 -47
  339. package/src/__tests__/helpers/set-workspace-mcp.ts +0 -11
  340. package/src/__tests__/message-deleted-hook-dispatch.test.ts +0 -119
  341. package/src/__tests__/resolve-app.test.ts +0 -135
  342. package/src/__tests__/service-account-token.test.ts +0 -247
  343. package/src/__tests__/source-fingerprint.test.ts +0 -184
  344. package/src/__tests__/workspace-migration-154-repair-retired-codex-gpt-5-4-model-ids.test.ts +0 -336
  345. package/src/acp/__tests__/helpers/acp-model-option.ts +0 -51
  346. package/src/acp/model-config.test.ts +0 -166
  347. package/src/acp/model-config.ts +0 -138
  348. package/src/api/events/acp-session-model-update.test.ts +0 -88
  349. package/src/api/events/acp-session-model-update.ts +0 -46
  350. package/src/apps/resolve-app.ts +0 -81
  351. package/src/apps/source-fingerprint.ts +0 -266
  352. package/src/calls/__tests__/barge-in-guard.test.ts +0 -81
  353. package/src/calls/__tests__/voice-leg-coordinator.test.ts +0 -229
  354. package/src/calls/__tests__/voice-progress-cadence.test.ts +0 -274
  355. package/src/calls/barge-in-guard.ts +0 -118
  356. package/src/calls/voice-leg-coordinator.ts +0 -189
  357. package/src/calls/voice-progress-cadence.ts +0 -423
  358. package/src/cli/commands/__tests__/apps.test.ts +0 -245
  359. package/src/cli/commands/__tests__/bash.test.ts +0 -53
  360. package/src/cli/commands/__tests__/roadmap.help.test.ts +0 -19
  361. package/src/cli/commands/channels/__tests__/send.test.ts +0 -218
  362. package/src/cli/commands/channels/send.ts +0 -128
  363. package/src/config/__tests__/platform-identity.test.ts +0 -255
  364. package/src/config/acp-agent-write.ts +0 -43
  365. package/src/config/acp-schema.test.ts +0 -81
  366. package/src/config/platform-identity.ts +0 -201
  367. package/src/config/schemas/__tests__/voice.test.ts +0 -148
  368. package/src/config/schemas/voice.ts +0 -150
  369. package/src/daemon/__tests__/skill-memory-refresh-mtime.test.ts +0 -133
  370. package/src/daemon/app-change-notify.ts +0 -45
  371. package/src/desktop/__tests__/fake-desktop.ts +0 -119
  372. package/src/desktop/desktop-chrome-policy.test.ts +0 -71
  373. package/src/desktop/desktop-chrome-policy.ts +0 -42
  374. package/src/desktop/desktop-dependencies.test.ts +0 -102
  375. package/src/desktop/desktop-dependencies.ts +0 -306
  376. package/src/desktop/desktop-feature.test.ts +0 -18
  377. package/src/desktop/desktop-feature.ts +0 -19
  378. package/src/desktop/desktop-panel-config.test.ts +0 -135
  379. package/src/desktop/desktop-panel-config.ts +0 -149
  380. package/src/desktop/desktop-session-manager.test.ts +0 -627
  381. package/src/desktop/desktop-session-manager.ts +0 -814
  382. package/src/desktop/desktop-stream-bridge.test.ts +0 -395
  383. package/src/desktop/desktop-stream-bridge.ts +0 -214
  384. package/src/desktop/desktop-wallpaper.test.ts +0 -191
  385. package/src/desktop/desktop-wallpaper.ts +0 -113
  386. package/src/desktop/desktop-window-theme.ts +0 -170
  387. package/src/i18n/AGENTS.md +0 -22
  388. package/src/i18n/__tests__/i18n.test.ts +0 -108
  389. package/src/i18n/index.ts +0 -16
  390. package/src/i18n/locales.ts +0 -93
  391. package/src/i18n/messages.ts +0 -61
  392. package/src/i18n/title.ts +0 -25
  393. package/src/mcp/__tests__/workspace-mcp-config.test.ts +0 -135
  394. package/src/mcp/spec-schema.ts +0 -111
  395. package/src/mcp/workspace-mcp-config.ts +0 -188
  396. package/src/messaging/providers/__tests__/proactive-address.test.ts +0 -95
  397. package/src/persistence/conversation-title-placeholders.ts +0 -23
  398. package/src/persistence/message-cursor.ts +0 -78
  399. package/src/persistence/migrations/__tests__/157-invite-contact-id.test.ts +0 -149
  400. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-backfill.test.ts +0 -118
  401. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-preserve.test.ts +0 -83
  402. package/src/plugins/defaults/memory/hooks/message-deleted.ts +0 -21
  403. package/src/plugins/defaults/memory/memory-retrospective-cursor-backfill.ts +0 -126
  404. package/src/plugins/defaults/memory/memory-retrospective-cursor-preserve.ts +0 -79
  405. package/src/plugins/defaults/memory/memory-retrospective-cursor.ts +0 -28
  406. package/src/plugins/defaults/memory/skill-md-mtime-poll.ts +0 -9
  407. package/src/providers/gemini-thought-signature.test.ts +0 -63
  408. package/src/providers/gemini-thought-signature.ts +0 -44
  409. package/src/providers/inference/service-account-token.ts +0 -248
  410. package/src/providers/openai/__tests__/chat-completions-provider-thought-signature.test.ts +0 -613
  411. package/src/providers/openai/__tests__/google-thought-signature.test.ts +0 -235
  412. package/src/providers/openai/google-thought-signature.ts +0 -320
  413. package/src/runtime/__tests__/channel-send.test.ts +0 -443
  414. package/src/runtime/__tests__/desktop-stream-upgrade.test.ts +0 -89
  415. package/src/runtime/__tests__/live-voice-upgrade.test.ts +0 -58
  416. package/src/runtime/__tests__/runtime-ws-test-utils.ts +0 -72
  417. package/src/runtime/__tests__/watch-stream-upgrade.test.ts +0 -59
  418. package/src/runtime/channel-send.ts +0 -316
  419. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +0 -205
  420. package/src/runtime/routes/__tests__/channel-send-routes.test.ts +0 -127
  421. package/src/runtime/routes/__tests__/dictation-cleanup-guard.test.ts +0 -107
  422. package/src/runtime/routes/channel-send-routes.ts +0 -85
  423. package/src/runtime/routes/desktop-setup-routes.test.ts +0 -74
  424. package/src/runtime/routes/desktop-setup-routes.ts +0 -35
  425. package/src/security/__tests__/ces-http-record-backend.test.ts +0 -137
  426. package/src/security/ces-http-record-backend.ts +0 -120
  427. package/src/skills/__tests__/workspace-skill-md-signature.test.ts +0 -60
  428. package/src/skills/workspace-skill-md-signature.ts +0 -50
  429. package/src/tools/acp/status.test.ts +0 -94
  430. package/src/tools/terminal/__tests__/sanitized-bash.test.ts +0 -57
  431. package/src/tools/terminal/sanitized-bash.ts +0 -105
  432. package/src/util/ca-bundle.ts +0 -13
  433. package/src/workspace/git-porcelain.ts +0 -66
  434. package/src/workspace/migrations/154-repair-retired-codex-gpt-5-4-model-ids.ts +0 -258
  435. package/src/workspace/migrations/155-move-front-model-config-to-voice.ts +0 -78
  436. package/src/workspace/migrations/156-extract-workspace-mcp-json.ts +0 -214
  437. package/src/workspace/migrations/__tests__/155-move-front-model-config-to-voice.test.ts +0 -102
  438. package/src/workspace/migrations/__tests__/156-extract-workspace-mcp-json.test.ts +0 -199
  439. /package/src/{calls → live-voice}/progress-phrases.ts +0 -0
@@ -1,88 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
-
3
- import { AcpSessionModelUpdateEventSchema } from "./acp-session-model-update.js";
4
-
5
- const MODEL_REVISION_EPOCH = "01900000-0000-7000-8000-000000000001";
6
-
7
- describe("AcpSessionModelUpdateEventSchema", () => {
8
- test("parses an event carrying the selection and grouped options", () => {
9
- const event = {
10
- type: "acp_session_model_update" as const,
11
- acpSessionId: "acp-session-abc",
12
- modelRevisionEpoch: MODEL_REVISION_EPOCH,
13
- modelRevision: 7,
14
- model: "opus",
15
- availableModels: [
16
- { value: "opus", label: "Opus", description: "Most capable" },
17
- { value: "sonnet", label: "Sonnet", group: "Recommended" },
18
- ],
19
- };
20
-
21
- const result = AcpSessionModelUpdateEventSchema.safeParse(event);
22
-
23
- expect(result.success).toBe(true);
24
- expect(result.success && result.data).toEqual(event);
25
- });
26
-
27
- test("parses an adapter with no selection and no options", () => {
28
- const event = {
29
- type: "acp_session_model_update" as const,
30
- acpSessionId: "acp-session-abc",
31
- modelRevisionEpoch: MODEL_REVISION_EPOCH,
32
- modelRevision: 8,
33
- availableModels: [],
34
- };
35
-
36
- const result = AcpSessionModelUpdateEventSchema.safeParse(event);
37
-
38
- expect(result.success).toBe(true);
39
- expect(result.success && result.data).toEqual(event);
40
- });
41
-
42
- test("rejects a missing availableModels array", () => {
43
- const result = AcpSessionModelUpdateEventSchema.safeParse({
44
- type: "acp_session_model_update",
45
- acpSessionId: "acp-session-abc",
46
- modelRevisionEpoch: MODEL_REVISION_EPOCH,
47
- modelRevision: 9,
48
- model: "opus",
49
- });
50
-
51
- expect(result.success).toBe(false);
52
- });
53
-
54
- test("rejects a missing model revision", () => {
55
- const result = AcpSessionModelUpdateEventSchema.safeParse({
56
- type: "acp_session_model_update",
57
- acpSessionId: "acp-session-abc",
58
- modelRevisionEpoch: MODEL_REVISION_EPOCH,
59
- availableModels: [],
60
- });
61
-
62
- expect(result.success).toBe(false);
63
- });
64
-
65
- test("rejects a missing model revision epoch", () => {
66
- const result = AcpSessionModelUpdateEventSchema.safeParse({
67
- type: "acp_session_model_update",
68
- acpSessionId: "acp-session-abc",
69
- modelRevision: 10,
70
- availableModels: [],
71
- });
72
-
73
- expect(result.success).toBe(false);
74
- });
75
-
76
- test("rejects an unrecognized field under .strict()", () => {
77
- const result = AcpSessionModelUpdateEventSchema.safeParse({
78
- type: "acp_session_model_update",
79
- acpSessionId: "acp-session-abc",
80
- modelRevisionEpoch: MODEL_REVISION_EPOCH,
81
- modelRevision: 11,
82
- availableModels: [],
83
- unexpected: true,
84
- });
85
-
86
- expect(result.success).toBe(false);
87
- });
88
- });
@@ -1,46 +0,0 @@
1
- /**
2
- * `acp_session_model_update` SSE event.
3
- *
4
- * Server to client snapshot of an ACP session's model selection, derived from
5
- * the adapter's `configOptions`. `model` is the currently selected value (absent
6
- * when the adapter reports none) and `availableModels` is the flattened set of
7
- * values the adapter offers, empty when it advertises no model selector.
8
- * `modelRevisionEpoch` scopes `modelRevision` to one assistant process, and
9
- * the pair orders this snapshot against the same session state returned by
10
- * `GET /v1/acp/sessions`. A side gauge, not part of the ordered update
11
- * timeline: carries no `seq`.
12
- *
13
- * `.strict()` like the other ACP events, for the reason spelled out in
14
- * `acp-auth-required.ts`: an older packaged client rejects an event carrying a
15
- * field it does not know, so additive signals get their own event type.
16
- *
17
- * Canonical wire-contract source. Re-exported to external consumers via
18
- * `@vellumai/assistant-api` (the `api/index.ts` barrel).
19
- */
20
-
21
- import { z } from "zod";
22
-
23
- export const AcpSessionModelUpdateEventSchema = z
24
- .object({
25
- type: z.literal("acp_session_model_update"),
26
- acpSessionId: z.string(),
27
- modelRevisionEpoch: z.string().uuid(),
28
- modelRevision: z.number().int().nonnegative(),
29
- model: z.string().optional(),
30
- availableModels: z.array(
31
- z.object({
32
- /** Adapter-reported value to pass back when selecting this model. */
33
- value: z.string(),
34
- /** Human-readable label from the adapter. */
35
- label: z.string(),
36
- description: z.string().optional(),
37
- /** Name of the adapter's option group, when the options were grouped. */
38
- group: z.string().optional(),
39
- }),
40
- ),
41
- })
42
- .strict();
43
-
44
- export type AcpSessionModelUpdateEvent = z.infer<
45
- typeof AcpSessionModelUpdateEventSchema
46
- >;
@@ -1,81 +0,0 @@
1
- /**
2
- * Resolve a user-facing app query (display name, slug, or id) to an
3
- * enumerated app. Used by `assistant apps inspect` / `refresh`.
4
- */
5
-
6
- import { basename } from "node:path";
7
-
8
- import { type EnumeratedApp, listAllApps } from "./app-store.js";
9
-
10
- export type ResolveAppQueryResult =
11
- | { readonly ok: true; readonly app: EnumeratedApp }
12
- | { readonly ok: false; readonly reason: "not_found"; readonly query: string }
13
- | {
14
- readonly ok: false;
15
- readonly reason: "ambiguous";
16
- readonly query: string;
17
- readonly matches: readonly EnumeratedApp[];
18
- };
19
-
20
- function matchesQuery(app: EnumeratedApp, query: string): boolean {
21
- if (app.id === query) {
22
- return true;
23
- }
24
- const lowered = query.toLowerCase();
25
- if (app.name.toLowerCase() === lowered) {
26
- return true;
27
- }
28
- const dirName = basename(app.sourcePath);
29
- return dirName.toLowerCase() === lowered;
30
- }
31
-
32
- /**
33
- * Resolve `query` against every surfaced app. Matching is exact on id, and
34
- * case-insensitive on display name and directory slug. Multiple distinct apps
35
- * that match yield `ambiguous` rather than picking a winner.
36
- */
37
- export function resolveAppQuery(query: string): ResolveAppQueryResult {
38
- const trimmed = query.trim();
39
- if (trimmed.length === 0) {
40
- return { ok: false, reason: "not_found", query };
41
- }
42
-
43
- const matches: EnumeratedApp[] = [];
44
- const seen = new Set<string>();
45
- for (const app of listAllApps()) {
46
- if (!matchesQuery(app, trimmed) || seen.has(app.id)) {
47
- continue;
48
- }
49
- seen.add(app.id);
50
- matches.push(app);
51
- }
52
-
53
- if (matches.length === 1) {
54
- return { ok: true, app: matches[0] };
55
- }
56
- if (matches.length > 1) {
57
- return { ok: false, reason: "ambiguous", query: trimmed, matches };
58
- }
59
- return { ok: false, reason: "not_found", query: trimmed };
60
- }
61
-
62
- export function formatAppMatch(app: EnumeratedApp): string {
63
- const origin =
64
- app.origin.kind === "plugin"
65
- ? `plugin ${app.origin.pluginName}`
66
- : "workspace";
67
- return `${app.name} (${origin}, ${app.id})`;
68
- }
69
-
70
- export function appNotFoundMessage(query: string): string {
71
- return `App "${query}" not found. Run 'assistant apps list' to see available apps.`;
72
- }
73
-
74
- export function appAmbiguousMessage(
75
- query: string,
76
- matches: readonly EnumeratedApp[],
77
- ): string {
78
- const listed = matches.map((app) => ` ${formatAppMatch(app)}`).join("\n");
79
- return `Ambiguous app name "${query}". Matches:\n${listed}\nRun 'assistant apps list' and pass a unique name, slug, or id.`;
80
- }
81
-
@@ -1,266 +0,0 @@
1
- /**
2
- * Content fingerprint of an app's source tree, recorded at compile time so
3
- * later inspects can tell whether source has drifted from the last successful
4
- * build.
5
- *
6
- * The fingerprint is a one-way per-file digest map written into
7
- * `dist/.source-fingerprint.json` after a successful compile. It answers "did
8
- * this change?" and "which files?", not a reconstructable diff.
9
- */
10
-
11
- import { createHash } from "node:crypto";
12
- import {
13
- existsSync,
14
- readdirSync,
15
- readFileSync,
16
- writeFileSync,
17
- } from "node:fs";
18
- import { join } from "node:path";
19
-
20
- /** Digest algorithm recorded alongside the file map, for forward compatibility. */
21
- export type FingerprintAlgorithm = "sha256";
22
-
23
- /** Filename written into `dist/` next to compiled output. */
24
- export const SOURCE_FINGERPRINT_FILENAME = ".source-fingerprint.json";
25
-
26
- /** Directory names skipped at the app root only (compile output and records). */
27
- const ROOT_SKIP_DIRS: ReadonlySet<string> = new Set(["dist", "records"]);
28
-
29
- /** Directory names skipped at any depth. */
30
- const SKIP_DIRS_ANY_DEPTH: ReadonlySet<string> = new Set([
31
- "node_modules",
32
- ".git",
33
- ]);
34
-
35
- /**
36
- * Per-file content digest of an app source tree. Keys are POSIX-style
37
- * (forward-slash) paths relative to the app directory; values are lowercase
38
- * hex SHA-256 digests of each file's bytes.
39
- */
40
- export interface AppSourceFingerprint {
41
- readonly algorithm: FingerprintAlgorithm;
42
- readonly files: Readonly<Record<string, string>>;
43
- /** ISO-8601 timestamp of the compile that produced this baseline, when known. */
44
- readonly compiledAt?: string;
45
- }
46
-
47
- /**
48
- * Difference between a recorded fingerprint and the current on-disk source.
49
- * Paths are POSIX-relative. A rename surfaces as one `removed` plus one `added`.
50
- */
51
- export interface FingerprintComparison {
52
- readonly modified: readonly string[];
53
- readonly added: readonly string[];
54
- readonly removed: readonly string[];
55
- readonly clean: boolean;
56
- }
57
-
58
- export type AppSourceInspectStatus =
59
- | "clean"
60
- | "stale"
61
- | "never_compiled"
62
- | "unknown_baseline";
63
-
64
- export interface AppSourceInspectResult {
65
- readonly status: AppSourceInspectStatus;
66
- readonly compiledAt: string | null;
67
- readonly modified: readonly string[];
68
- readonly added: readonly string[];
69
- readonly removed: readonly string[];
70
- }
71
-
72
- function hashFile(absPath: string): string | null {
73
- try {
74
- return createHash("sha256").update(readFileSync(absPath)).digest("hex");
75
- } catch {
76
- return null;
77
- }
78
- }
79
-
80
- /**
81
- * Walk `appDir` and digest every regular source file. Skips `dist/` and
82
- * `records/` at the app root, and `node_modules` / `.git` at any depth.
83
- * Symlinks are neither visited nor followed.
84
- */
85
- export function computeAppSourceFingerprint(
86
- appDir: string,
87
- ): AppSourceFingerprint {
88
- const files: Record<string, string> = {};
89
-
90
- const walk = (relDir: string): void => {
91
- const absDir = relDir ? join(appDir, relDir) : appDir;
92
- let entries;
93
- try {
94
- entries = readdirSync(absDir, { withFileTypes: true });
95
- } catch {
96
- return;
97
- }
98
- for (const entry of entries) {
99
- if (relDir === "" && ROOT_SKIP_DIRS.has(entry.name)) {
100
- continue;
101
- }
102
- if (entry.isSymbolicLink()) {
103
- continue;
104
- }
105
- if (entry.isDirectory() && SKIP_DIRS_ANY_DEPTH.has(entry.name)) {
106
- continue;
107
- }
108
- const rel = relDir ? `${relDir}/${entry.name}` : entry.name;
109
- if (entry.isDirectory()) {
110
- walk(rel);
111
- } else if (entry.isFile()) {
112
- const digest = hashFile(join(absDir, entry.name));
113
- if (digest !== null) {
114
- files[rel] = digest;
115
- }
116
- }
117
- }
118
- };
119
-
120
- walk("");
121
- return { algorithm: "sha256", files };
122
- }
123
-
124
- export function compareAppSourceFingerprint(
125
- appDir: string,
126
- baseline: AppSourceFingerprint,
127
- ): FingerprintComparison {
128
- const current = computeAppSourceFingerprint(appDir).files;
129
- const modified: string[] = [];
130
- const added: string[] = [];
131
- const removed: string[] = [];
132
-
133
- for (const [path, digest] of Object.entries(current)) {
134
- const recorded = baseline.files[path];
135
- if (recorded === undefined) {
136
- added.push(path);
137
- } else if (recorded !== digest) {
138
- modified.push(path);
139
- }
140
- }
141
- for (const path of Object.keys(baseline.files)) {
142
- if (current[path] === undefined) {
143
- removed.push(path);
144
- }
145
- }
146
-
147
- modified.sort();
148
- added.sort();
149
- removed.sort();
150
- return {
151
- modified,
152
- added,
153
- removed,
154
- clean: modified.length === 0 && added.length === 0 && removed.length === 0,
155
- };
156
- }
157
-
158
- /**
159
- * Parse a fingerprint from already-decoded JSON. Lenient: any shape problem
160
- * yields `null` so a missing or hand-edited sidecar reports "no baseline"
161
- * rather than throwing.
162
- */
163
- export function parseAppSourceFingerprint(
164
- value: unknown,
165
- ): AppSourceFingerprint | null {
166
- if (typeof value !== "object" || value === null || Array.isArray(value)) {
167
- return null;
168
- }
169
- const obj = value as Record<string, unknown>;
170
- if (obj.algorithm !== "sha256") {
171
- return null;
172
- }
173
- const rawFiles = obj.files;
174
- if (
175
- typeof rawFiles !== "object" ||
176
- rawFiles === null ||
177
- Array.isArray(rawFiles)
178
- ) {
179
- return null;
180
- }
181
- const files: Record<string, string> = {};
182
- for (const [path, digest] of Object.entries(rawFiles)) {
183
- if (typeof digest !== "string") {
184
- return null;
185
- }
186
- files[path] = digest;
187
- }
188
- const compiledAt =
189
- typeof obj.compiledAt === "string" ? obj.compiledAt : undefined;
190
- return compiledAt === undefined
191
- ? { algorithm: "sha256", files }
192
- : { algorithm: "sha256", files, compiledAt };
193
- }
194
-
195
- export function readAppSourceFingerprint(
196
- appDir: string,
197
- ): AppSourceFingerprint | null {
198
- const path = join(appDir, "dist", SOURCE_FINGERPRINT_FILENAME);
199
- if (!existsSync(path)) {
200
- return null;
201
- }
202
- try {
203
- return parseAppSourceFingerprint(JSON.parse(readFileSync(path, "utf-8")));
204
- } catch {
205
- return null;
206
- }
207
- }
208
-
209
- /**
210
- * Write a source fingerprint into `distDir`. Pass the snapshot taken
211
- * before compile so inspect compares against the tree that produced this
212
- * dist, even if source changes during the build.
213
- */
214
- export function writeAppSourceFingerprint(
215
- appDir: string,
216
- distDir: string,
217
- fingerprint: AppSourceFingerprint = computeAppSourceFingerprint(appDir),
218
- ): void {
219
- const payload: AppSourceFingerprint = {
220
- algorithm: fingerprint.algorithm,
221
- compiledAt: fingerprint.compiledAt ?? new Date().toISOString(),
222
- files: fingerprint.files,
223
- };
224
- writeFileSync(
225
- join(distDir, SOURCE_FINGERPRINT_FILENAME),
226
- `${JSON.stringify(payload)}\n`,
227
- "utf-8",
228
- );
229
- }
230
-
231
- /**
232
- * Compare current app source against the fingerprint recorded at last
233
- * successful compile.
234
- */
235
- export function inspectAppSource(appDir: string): AppSourceInspectResult {
236
- const compiled = existsSync(join(appDir, "dist", "index.html"));
237
- if (!compiled) {
238
- return {
239
- status: "never_compiled",
240
- compiledAt: null,
241
- modified: [],
242
- added: [],
243
- removed: [],
244
- };
245
- }
246
-
247
- const baseline = readAppSourceFingerprint(appDir);
248
- if (baseline === null) {
249
- return {
250
- status: "unknown_baseline",
251
- compiledAt: null,
252
- modified: [],
253
- added: [],
254
- removed: [],
255
- };
256
- }
257
-
258
- const comparison = compareAppSourceFingerprint(appDir, baseline);
259
- return {
260
- status: comparison.clean ? "clean" : "stale",
261
- compiledAt: baseline.compiledAt ?? null,
262
- modified: comparison.modified,
263
- added: comparison.added,
264
- removed: comparison.removed,
265
- };
266
- }
@@ -1,81 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
-
3
- import {
4
- BARGE_IN_GAP_TOLERANCE_MS,
5
- BARGE_IN_MAX_TOLERATED_SILENCE_RATIO,
6
- createBargeInGuard,
7
- } from "../barge-in-guard.js";
8
-
9
- describe("createBargeInGuard", () => {
10
- test("speech shorter than the threshold stays pending", () => {
11
- const guard = createBargeInGuard(250);
12
- expect(guard.track("speech", 100)).toBe("pending");
13
- expect(guard.track("speech", 100)).toBe("pending");
14
- expect(guard.speechMs).toBe(200);
15
- });
16
-
17
- test("sustained speech reaching the threshold fires once and stays fired", () => {
18
- const guard = createBargeInGuard(250);
19
- guard.track("speech", 200);
20
- expect(guard.track("speech", 50)).toBe("fired");
21
- expect(guard.track("silence", 1_000)).toBe("fired");
22
- });
23
-
24
- test("a brief sub-threshold gap does not reset the run", () => {
25
- const guard = createBargeInGuard(250);
26
- guard.track("speech", 150);
27
- expect(guard.track("silence", 100)).toBe("pending");
28
- expect(guard.speechMs).toBe(150);
29
- expect(guard.track("speech", 100)).toBe("fired");
30
- });
31
-
32
- test("a gap of exactly the tolerance is still inside the run", () => {
33
- const guard = createBargeInGuard(250);
34
- guard.track("speech", 150);
35
- expect(guard.track("silence", BARGE_IN_GAP_TOLERANCE_MS)).toBe("pending");
36
- expect(guard.speechMs).toBe(150);
37
- });
38
-
39
- test("a gap longer than the tolerance resets the run", () => {
40
- const guard = createBargeInGuard(250);
41
- guard.track("speech", 150);
42
- guard.track("silence", 150);
43
- expect(guard.track("silence", 100)).toBe("reset");
44
- expect(guard.speechMs).toBe(0);
45
- expect(guard.track("speech", 200)).toBe("pending");
46
- });
47
-
48
- test("sparse periodic blips separated by boundary gaps never accumulate", () => {
49
- const guard = createBargeInGuard(250);
50
- // 10 ms blips every 200 ms: each gap is tolerated on its own, but the
51
- // run's total silence outweighs the speech by the duty-cycle ceiling.
52
- const cap = 250 * BARGE_IN_MAX_TOLERATED_SILENCE_RATIO;
53
- let steps = 0;
54
- let sawReset = false;
55
- while (steps < 60) {
56
- guard.track("speech", 10);
57
- if (guard.track("silence", 200) === "reset") {
58
- sawReset = true;
59
- break;
60
- }
61
- steps += 1;
62
- }
63
- expect(sawReset).toBe(true);
64
- expect(steps * 200).toBeLessThanOrEqual(cap + 200);
65
- expect(guard.speechMs).toBe(0);
66
- });
67
-
68
- test("classified echo resets a partial run immediately", () => {
69
- const guard = createBargeInGuard(250);
70
- guard.track("speech", 200);
71
- expect(guard.track("echo", 10)).toBe("reset");
72
- expect(guard.speechMs).toBe(0);
73
- });
74
-
75
- test("a zero threshold fires on the first speech chunk", () => {
76
- const guard = createBargeInGuard(0);
77
- // With no speech required, any silence already outweighs it.
78
- expect(guard.track("silence", 20)).toBe("reset");
79
- expect(guard.track("speech", 20)).toBe("fired");
80
- });
81
- });