@vellumai/assistant 0.12.1-staging.1 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) 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/openapi.yaml +1 -291
  5. package/package.json +1 -1
  6. package/src/__tests__/always-loaded-tools-guard.test.ts +10 -18
  7. package/src/__tests__/app-compiler.test.ts +0 -6
  8. package/src/__tests__/app-control-tool-schemas.test.ts +2 -5
  9. package/src/__tests__/app-dir-path-guard.test.ts +3 -1
  10. package/src/__tests__/app-source-watcher.test.ts +218 -0
  11. package/src/{calls/__tests__ → __tests__}/call-controller.test.ts +82 -503
  12. package/src/__tests__/computer-use-skill-proxy-bridge.test.ts +2 -5
  13. package/src/__tests__/computer-use-tools.test.ts +5 -17
  14. package/src/__tests__/config-schema-cmd.test.ts +2 -2
  15. package/src/__tests__/config-schema.test.ts +29 -28
  16. package/src/__tests__/config-watcher-skill-reseed.test.ts +359 -0
  17. package/src/__tests__/config-watcher.test.ts +8 -23
  18. package/src/__tests__/connection-model-compat.test.ts +2 -2
  19. package/src/__tests__/conversation-key-store-disk-view.test.ts +1 -1
  20. package/src/__tests__/conversation-pairing.test.ts +0 -26
  21. package/src/__tests__/conversation-process-app-control-preactivation.test.ts +10 -4
  22. package/src/__tests__/conversation-queue.test.ts +207 -48
  23. package/src/__tests__/conversation-retry-discard.test.ts +1 -54
  24. package/src/__tests__/conversation-skill-tools.test.ts +0 -27
  25. package/src/__tests__/conversation-surfaces-app-control.test.ts +3 -8
  26. package/src/__tests__/conversation-surfaces-task-progress.test.ts +0 -67
  27. package/src/__tests__/conversation-title-service.test.ts +10 -14
  28. package/src/__tests__/conversation-tool-setup-app-refresh.test.ts +5 -3
  29. package/src/__tests__/conversation-tool-setup-attribution.test.ts +0 -51
  30. package/src/__tests__/credential-record-retire.test.ts +1 -171
  31. package/src/__tests__/credential-routes.test.ts +3 -212
  32. package/src/__tests__/credential-security-invariants.test.ts +1 -2
  33. package/src/__tests__/cu-unified-flow.test.ts +2 -8
  34. package/src/__tests__/drain-kick-guard.test.ts +2 -0
  35. package/src/__tests__/drain-requeue-on-contention.test.ts +6 -0
  36. package/src/__tests__/evict-conversations-for-reload.test.ts +1 -1
  37. package/src/__tests__/host-bash-proxy.test.ts +45 -26
  38. package/src/__tests__/host-browser-proxy.test.ts +17 -6
  39. package/src/__tests__/host-file-proxy-targeted.test.ts +0 -23
  40. package/src/__tests__/host-file-proxy.test.ts +23 -11
  41. package/src/__tests__/host-transfer-proxy-targeted.test.ts +9 -30
  42. package/src/__tests__/llm-catalog-parity.test.ts +0 -25
  43. package/src/__tests__/mcp-auth-routes.test.ts +9 -6
  44. package/src/__tests__/mcp-config-secret-boundary.test.ts +136 -78
  45. package/src/__tests__/mcp-health-check.test.ts +11 -8
  46. package/src/__tests__/mcp-list-plugin-servers.test.ts +10 -8
  47. package/src/{calls/__tests__ → __tests__}/media-stream-audio-transcode.test.ts +1 -1
  48. package/src/{calls/__tests__ → __tests__}/media-stream-output.test.ts +8 -37
  49. package/src/{calls/__tests__ → __tests__}/media-stream-parser.test.ts +1 -1
  50. package/src/{calls/__tests__ → __tests__}/media-stream-server-integration.test.ts +57 -150
  51. package/src/{calls/__tests__ → __tests__}/media-stream-stt-session.test.ts +5 -5
  52. package/src/{calls/__tests__ → __tests__}/media-turn-detector.test.ts +1 -1
  53. package/src/__tests__/messages-after-tiebreaker.test.ts +0 -91
  54. package/src/__tests__/messages-read-boundary-guard.test.ts +1 -1
  55. package/src/__tests__/messaging-send-tool.test.ts +548 -355
  56. package/src/__tests__/model-intents.test.ts +0 -3
  57. package/src/__tests__/outlook-messaging-provider.test.ts +6 -6
  58. package/src/__tests__/platform-client-verify-credential.test.ts +0 -2
  59. package/src/__tests__/plugin-import-boundary-guard.test.ts +0 -13
  60. package/src/__tests__/script-proxy-certs.test.ts +0 -35
  61. package/src/__tests__/skill-feature-flags-integration.test.ts +1 -1
  62. package/src/__tests__/skill-feature-flags.test.ts +2 -2
  63. package/src/__tests__/speaker-identification.test.ts +56 -0
  64. package/src/__tests__/subagent-tool-gate-mode.test.ts +3 -19
  65. package/src/__tests__/subagent-tools.test.ts +2 -3
  66. package/src/__tests__/telephony-tts-guard.test.ts +3 -38
  67. package/src/__tests__/vellum-self-knowledge-inline-command.test.ts +0 -4
  68. package/src/{calls/__tests__/voice-session-bridge-turn-flow.test.ts → __tests__/voice-session-bridge.test.ts} +12 -20
  69. package/src/__tests__/watch-retro-tool-availability.test.ts +17 -8
  70. package/src/__tests__/workspace-git-service.test.ts +0 -26
  71. package/src/acp/__tests__/agent-process.test.ts +4 -258
  72. package/src/acp/__tests__/auth-required.test.ts +0 -96
  73. package/src/acp/__tests__/client-handler.test.ts +2 -90
  74. package/src/acp/__tests__/session-manager-persistence.test.ts +1 -5
  75. package/src/acp/__tests__/session-manager-resume.test.ts +6 -270
  76. package/src/acp/__tests__/session-manager-usage.test.ts +2 -4
  77. package/src/acp/__tests__/session-manager.test.ts +4 -895
  78. package/src/acp/agent-process.test.ts +1 -4
  79. package/src/acp/agent-process.ts +9 -94
  80. package/src/acp/auth-required.ts +1 -50
  81. package/src/acp/auto-install.test.ts +7 -9
  82. package/src/acp/client-handler.ts +3 -16
  83. package/src/acp/resolve-agent.test.ts +6 -220
  84. package/src/acp/resolve-agent.ts +23 -88
  85. package/src/acp/session-manager.test.ts +3 -196
  86. package/src/acp/session-manager.ts +18 -441
  87. package/src/acp/types.ts +5 -50
  88. package/src/api/events/app-files-changed.ts +3 -4
  89. package/src/api/index.ts +0 -6
  90. package/src/apps/app-store.ts +1 -1
  91. package/src/bundler/app-compiler.ts +0 -15
  92. package/src/calls/__tests__/voice-control-protocol.test.ts +25 -58
  93. package/src/calls/__tests__/voice-session-bridge.test.ts +1 -37
  94. package/src/calls/__tests__/voice-triage-escalate.test.ts +0 -105
  95. package/src/calls/call-constants.ts +4 -24
  96. package/src/calls/call-controller.ts +199 -499
  97. package/src/calls/call-transport.ts +0 -16
  98. package/src/calls/media-stream-output.ts +0 -32
  99. package/src/calls/media-stream-server.ts +30 -82
  100. package/src/calls/media-stream-stt-session.ts +0 -15
  101. package/src/calls/resolve-call-tts-provider.ts +2 -33
  102. package/src/calls/speaker-identification.ts +233 -0
  103. package/src/calls/tts-call-strategy.ts +5 -9
  104. package/src/calls/types.ts +0 -2
  105. package/src/calls/voice-control-protocol.ts +21 -53
  106. package/src/calls/voice-session-bridge.ts +46 -59
  107. package/src/calls/voice-triage-escalate.ts +56 -175
  108. package/src/cli/commands/apps.help.ts +13 -67
  109. package/src/cli/commands/apps.ts +0 -183
  110. package/src/cli/commands/channels/index.help.ts +2 -70
  111. package/src/cli/commands/channels/index.ts +3 -16
  112. package/src/cli/commands/credentials.help.ts +2 -6
  113. package/src/cli/commands/credentials.ts +2 -2
  114. package/src/cli/commands/mcp.help.ts +8 -8
  115. package/src/cli/commands/mcp.ts +1 -1
  116. package/src/cli/commands/roadmap.help.ts +1 -5
  117. package/src/cli/commands/roadmap.ts +1 -1
  118. package/src/cli/lib/bundled-marketplace.json +90 -103
  119. package/src/config/__tests__/default-profile-catalog.test.ts +0 -22
  120. package/src/config/__tests__/memory-retrospective-schema.test.ts +1 -15
  121. package/src/config/__tests__/platform-rehydration.test.ts +0 -93
  122. package/src/config/acp-defaults.test.ts +3 -13
  123. package/src/config/acp-defaults.ts +6 -23
  124. package/src/config/acp-schema.ts +2 -30
  125. package/src/config/bundled-skills/acp/SKILL.md +14 -22
  126. package/src/config/bundled-skills/acp/TOOLS.json +1 -5
  127. package/src/config/bundled-skills/app-builder/SKILL.md +9 -12
  128. package/src/config/bundled-skills/app-builder/references/CUSTOM_ROUTES.md +1 -1
  129. package/src/config/bundled-skills/messaging/TOOLS.json +3 -3
  130. package/src/config/bundled-skills/messaging/tools/messaging-send.ts +139 -67
  131. package/src/config/bundled-skills/phone-calls/references/TRANSCRIPTS.md +1 -1
  132. package/src/config/bundled-skills/screen-annotation/SKILL.md +1 -8
  133. package/src/config/bundled-skills/screen-annotation/tools/screen-annotation.test.ts +1 -4
  134. package/src/config/bundled-skills/skill-management/TOOLS.json +2 -2
  135. package/src/config/default-profile-catalog.ts +1 -1
  136. package/src/config/env.ts +2 -2
  137. package/src/config/feature-flag-registry.json +12 -8
  138. package/src/config/memory-v3-gate.test.ts +0 -31
  139. package/src/config/memory-v3-gate.ts +16 -20
  140. package/src/config/platform-rehydration.ts +21 -75
  141. package/src/config/schema.ts +2 -2
  142. package/src/config/schemas/__tests__/live-voice.test.ts +158 -8
  143. package/src/config/schemas/calls.ts +28 -1
  144. package/src/config/schemas/live-voice.ts +173 -1
  145. package/src/config/schemas/mcp.ts +1 -1
  146. package/src/config/schemas/memory-retrospective.ts +0 -10
  147. package/src/config/schemas/skills.ts +14 -0
  148. package/src/credential-execution/process-manager.test.ts +19 -18
  149. package/src/daemon/__tests__/conversation-tool-setup.test.ts +121 -66
  150. package/src/daemon/__tests__/plugin-mcp-reconcile.test.ts +1 -4
  151. package/src/daemon/app-source-watcher.ts +218 -0
  152. package/src/daemon/config-watcher.ts +194 -13
  153. package/src/daemon/conversation-process.ts +64 -35
  154. package/src/daemon/conversation-skill-tools.ts +31 -13
  155. package/src/daemon/conversation-store.ts +1 -1
  156. package/src/daemon/conversation-surfaces.ts +8 -10
  157. package/src/daemon/conversation-tool-setup.ts +43 -37
  158. package/src/daemon/conversation.ts +3 -0
  159. package/src/daemon/host-bash-proxy.ts +12 -8
  160. package/src/daemon/host-browser-proxy.ts +1 -15
  161. package/src/daemon/host-file-proxy.ts +10 -8
  162. package/src/daemon/host-transfer-proxy.ts +18 -14
  163. package/src/daemon/lifecycle.ts +5 -0
  164. package/src/daemon/mcp-reload-service.ts +5 -5
  165. package/src/daemon/message-types/sync.ts +0 -1
  166. package/src/daemon/providers-setup.ts +1 -1
  167. package/src/daemon/shutdown-handlers.ts +9 -1
  168. package/src/daemon/skill-memory-refresh.ts +0 -64
  169. package/src/daemon/tool-side-effects.ts +18 -7
  170. package/src/hooks/types.ts +0 -33
  171. package/src/inbound/platform-callback-registration.ts +5 -4
  172. package/src/live-voice/__tests__/live-voice-metrics.test.ts +3 -0
  173. package/src/live-voice/__tests__/live-voice-progress.test.ts +15 -15
  174. package/src/live-voice/__tests__/live-voice-vad.test.ts +2 -2
  175. package/src/{calls → live-voice}/__tests__/progress-narration.test.ts +4 -4
  176. package/src/{calls → live-voice}/__tests__/progress-phrases.test.ts +1 -1
  177. package/src/live-voice/__tests__/runtime-websocket-shell.test.ts +69 -13
  178. package/src/live-voice/live-voice-session.ts +693 -213
  179. package/src/{calls → live-voice}/progress-narration.ts +2 -2
  180. package/src/live-voice/protocol.ts +2 -0
  181. package/src/mcp/__tests__/effective-config.test.ts +2 -2
  182. package/src/mcp/effective-config.ts +3 -3
  183. package/src/mcp/mcp-header-store.ts +45 -29
  184. package/src/mcp/startup.ts +4 -8
  185. package/src/messaging/provider.ts +3 -10
  186. package/src/messaging/providers/callback-routing.ts +0 -18
  187. package/src/messaging/providers/channel-transport.ts +0 -56
  188. package/src/messaging/providers/discord/transport.ts +0 -17
  189. package/src/messaging/providers/slack/__tests__/adapter-token-routing.test.ts +17 -6
  190. package/src/messaging/providers/slack/adapter.ts +44 -7
  191. package/src/messaging/providers/slack/transport.ts +0 -16
  192. package/src/messaging/providers/telegram-bot/adapter.ts +48 -1
  193. package/src/messaging/providers/telegram-bot/client.ts +26 -0
  194. package/src/messaging/providers/telegram-bot/transport.ts +0 -20
  195. package/src/messaging/providers/whatsapp/adapter.ts +48 -1
  196. package/src/messaging/providers/whatsapp/client.ts +29 -0
  197. package/src/messaging/providers/whatsapp/transport.ts +0 -18
  198. package/src/monitoring/__tests__/workspace-git-heartbeat.test.ts +0 -8
  199. package/src/notifications/__tests__/assistant-reply-producer.test.ts +0 -55
  200. package/src/notifications/__tests__/home-feed-side-effect.test.ts +3 -153
  201. package/src/notifications/assistant-reply-producer.ts +3 -8
  202. package/src/notifications/conversation-pairing.ts +16 -36
  203. package/src/notifications/delivered-post-record.ts +1 -11
  204. package/src/notifications/home-feed-side-effect.ts +7 -55
  205. package/src/outbound-proxy/certs.ts +5 -3
  206. package/src/permissions/checker.test.ts +6 -11
  207. package/src/persistence/compaction-log-store-clickhouse.ts +3 -3
  208. package/src/persistence/conversation-crud.ts +63 -71
  209. package/src/persistence/conversation-lineage.ts +4 -12
  210. package/src/persistence/conversation-title-service.ts +26 -9
  211. package/src/persistence/llm-request-log-sink-clickhouse.ts +3 -3
  212. package/src/persistence/llm-request-log-source-clickhouse.ts +3 -3
  213. package/src/persistence/message-reads.ts +0 -30
  214. package/src/persistence/migrations/157-invite-contact-id.ts +6 -18
  215. package/src/persistence/schema/memory-core.ts +0 -5
  216. package/src/platform/client.test.ts +0 -2
  217. package/src/platform/client.ts +10 -2
  218. package/src/plugin-api/constants.ts +0 -2
  219. package/src/plugin-api/index.ts +0 -1
  220. package/src/plugin-api/types.ts +0 -2
  221. package/src/plugins/defaults/index.ts +0 -2
  222. package/src/plugins/defaults/memory/__tests__/memory-retrospective-accounting.test.ts +0 -46
  223. package/src/plugins/defaults/memory/__tests__/memory-retrospective-enqueue.test.ts +5 -9
  224. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +10 -20
  225. package/src/plugins/defaults/memory/__tests__/memory-retrospective-state.test.ts +0 -219
  226. package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +0 -31
  227. package/src/plugins/defaults/memory/__tests__/memory-retrospective-trigger-check.test.ts +0 -63
  228. package/src/plugins/defaults/memory/__tests__/shutdown-hook.test.ts +0 -4
  229. package/src/plugins/defaults/memory/graph/capability-seed.ts +6 -4
  230. package/src/plugins/defaults/memory/hooks/init.ts +0 -10
  231. package/src/plugins/defaults/memory/hooks/shutdown.ts +0 -2
  232. package/src/plugins/defaults/memory/jobs-worker.ts +0 -13
  233. package/src/plugins/defaults/memory/memory-retrospective-accounting.ts +60 -34
  234. package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +5 -3
  235. package/src/plugins/defaults/memory/memory-retrospective-job.ts +3 -12
  236. package/src/plugins/defaults/memory/memory-retrospective-state.ts +71 -312
  237. package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +1 -2
  238. package/src/plugins/defaults/memory/memory-retrospective-trigger-check.ts +3 -5
  239. package/src/plugins/defaults/memory/startup.ts +1 -6
  240. package/src/plugins/defaults/memory/substrate/__tests__/skill-content.test.ts +9 -7
  241. package/src/plugins/defaults/memory/substrate/skill-content.ts +2 -2
  242. package/src/plugins/defaults/memory/v3/__tests__/pool-select.test.ts +0 -89
  243. package/src/plugins/defaults/memory/worker.ts +0 -6
  244. package/src/plugins/mcp-servers.ts +75 -15
  245. package/src/providers/__tests__/connection-model-compat.test.ts +3 -3
  246. package/src/providers/gemini/client.ts +23 -9
  247. package/src/providers/model-catalog.ts +0 -34
  248. package/src/providers/model-intents.ts +5 -10
  249. package/src/providers/openai/__tests__/chat-completions-provider-reasoning.test.ts +18 -146
  250. package/src/providers/openai/__tests__/tool-choice-mapping.test.ts +1 -83
  251. package/src/providers/openai/chat-completions-provider.ts +78 -192
  252. package/src/providers/openai/codex-models.ts +4 -0
  253. package/src/runtime/AGENTS.md +0 -2
  254. package/src/runtime/auth/same-actor.ts +3 -38
  255. package/src/runtime/http-server.ts +151 -160
  256. package/src/runtime/routes/__tests__/acp-routes.test.ts +4 -159
  257. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -108
  258. package/src/runtime/routes/__tests__/mcp-add-default-risk.test.ts +12 -16
  259. package/src/runtime/routes/acp-routes.test.ts +0 -15
  260. package/src/runtime/routes/acp-routes.ts +9 -72
  261. package/src/runtime/routes/app-management-routes.ts +0 -73
  262. package/src/runtime/routes/app-routes.ts +1 -1
  263. package/src/runtime/routes/conversation-list-routes.ts +3 -14
  264. package/src/runtime/routes/conversation-query-routes.ts +0 -40
  265. package/src/runtime/routes/credential-routes.ts +10 -19
  266. package/src/runtime/routes/diagnostics-routes.ts +3 -55
  267. package/src/runtime/routes/index.ts +0 -4
  268. package/src/runtime/routes/log-export-routes.ts +0 -2
  269. package/src/runtime/routes/mcp-auth-routes.ts +47 -39
  270. package/src/runtime/routes/migration-routes.ts +21 -8
  271. package/src/runtime/routes/platform-routes.ts +15 -18
  272. package/src/runtime/services/__tests__/conversation-serializer.test.ts +0 -28
  273. package/src/runtime/services/conversation-serializer.ts +3 -16
  274. package/src/runtime/sync/resource-sync-events.ts +1 -2
  275. package/src/schedule/worker.ts +1 -1
  276. package/src/security/ces-rpc-record-backend.ts +0 -7
  277. package/src/subagent/consult-context.ts +25 -12
  278. package/src/tools/acp/list-agents.test.ts +1 -3
  279. package/src/tools/acp/spawn.test.ts +11 -146
  280. package/src/tools/acp/spawn.ts +3 -21
  281. package/src/tools/acp/status.ts +3 -40
  282. package/src/tools/app-control/skill-proxy-bridge.ts +1 -2
  283. package/src/tools/capability-offer.test.ts +2 -22
  284. package/src/tools/capability-offer.ts +1 -16
  285. package/src/tools/computer-use/definitions.ts +2 -4
  286. package/src/tools/computer-use/skill-proxy-bridge.ts +1 -2
  287. package/src/tools/credentials/metadata-store.ts +0 -100
  288. package/src/tools/host-filesystem/edit.test.ts +1 -2
  289. package/src/tools/host-filesystem/edit.ts +2 -2
  290. package/src/tools/host-filesystem/read.test.ts +1 -2
  291. package/src/tools/host-filesystem/read.ts +2 -2
  292. package/src/tools/host-filesystem/transfer.test.ts +1 -2
  293. package/src/tools/host-filesystem/transfer.ts +2 -2
  294. package/src/tools/host-filesystem/write.test.ts +1 -2
  295. package/src/tools/host-filesystem/write.ts +2 -2
  296. package/src/tools/host-terminal/host-shell.test.ts +0 -16
  297. package/src/tools/host-terminal/host-shell.ts +20 -4
  298. package/src/tools/policy-context.ts +7 -6
  299. package/src/tools/subagent/spawn.ts +8 -5
  300. package/src/tools/watch/watch-retro-report.ts +8 -0
  301. package/src/util/__tests__/language-subtag.test.ts +1 -23
  302. package/src/util/fs-watcher-error.ts +36 -0
  303. package/src/util/language-subtag.ts +0 -16
  304. package/src/util/platform.ts +0 -8
  305. package/src/workspace/git-service.ts +54 -5
  306. package/src/workspace/migrations/registry.ts +0 -6
  307. package/scripts/smoke-desktop-window-theme.ts +0 -186
  308. package/src/__tests__/git-porcelain.test.ts +0 -47
  309. package/src/__tests__/helpers/set-workspace-mcp.ts +0 -11
  310. package/src/__tests__/message-deleted-hook-dispatch.test.ts +0 -119
  311. package/src/__tests__/resolve-app.test.ts +0 -135
  312. package/src/__tests__/source-fingerprint.test.ts +0 -184
  313. package/src/__tests__/workspace-migration-154-repair-retired-codex-gpt-5-4-model-ids.test.ts +0 -336
  314. package/src/acp/__tests__/helpers/acp-model-option.ts +0 -51
  315. package/src/acp/model-config.test.ts +0 -166
  316. package/src/acp/model-config.ts +0 -138
  317. package/src/api/events/acp-session-model-update.test.ts +0 -88
  318. package/src/api/events/acp-session-model-update.ts +0 -46
  319. package/src/apps/resolve-app.ts +0 -81
  320. package/src/apps/source-fingerprint.ts +0 -266
  321. package/src/calls/__tests__/barge-in-guard.test.ts +0 -81
  322. package/src/calls/__tests__/voice-leg-coordinator.test.ts +0 -229
  323. package/src/calls/__tests__/voice-progress-cadence.test.ts +0 -274
  324. package/src/calls/barge-in-guard.ts +0 -118
  325. package/src/calls/voice-leg-coordinator.ts +0 -189
  326. package/src/calls/voice-progress-cadence.ts +0 -423
  327. package/src/cli/commands/__tests__/apps.test.ts +0 -245
  328. package/src/cli/commands/__tests__/roadmap.help.test.ts +0 -19
  329. package/src/cli/commands/channels/__tests__/send.test.ts +0 -218
  330. package/src/cli/commands/channels/send.ts +0 -128
  331. package/src/config/__tests__/platform-identity.test.ts +0 -117
  332. package/src/config/acp-agent-write.ts +0 -43
  333. package/src/config/acp-schema.test.ts +0 -81
  334. package/src/config/platform-identity.ts +0 -144
  335. package/src/config/schemas/__tests__/voice.test.ts +0 -148
  336. package/src/config/schemas/voice.ts +0 -150
  337. package/src/daemon/__tests__/skill-memory-refresh-mtime.test.ts +0 -133
  338. package/src/daemon/app-change-notify.ts +0 -45
  339. package/src/desktop/__tests__/fake-desktop.ts +0 -119
  340. package/src/desktop/desktop-chrome-policy.test.ts +0 -71
  341. package/src/desktop/desktop-chrome-policy.ts +0 -42
  342. package/src/desktop/desktop-dependencies.test.ts +0 -102
  343. package/src/desktop/desktop-dependencies.ts +0 -306
  344. package/src/desktop/desktop-feature.test.ts +0 -18
  345. package/src/desktop/desktop-feature.ts +0 -19
  346. package/src/desktop/desktop-panel-config.test.ts +0 -135
  347. package/src/desktop/desktop-panel-config.ts +0 -149
  348. package/src/desktop/desktop-session-manager.test.ts +0 -627
  349. package/src/desktop/desktop-session-manager.ts +0 -814
  350. package/src/desktop/desktop-stream-bridge.test.ts +0 -395
  351. package/src/desktop/desktop-stream-bridge.ts +0 -214
  352. package/src/desktop/desktop-wallpaper.test.ts +0 -191
  353. package/src/desktop/desktop-wallpaper.ts +0 -113
  354. package/src/desktop/desktop-window-theme.ts +0 -170
  355. package/src/i18n/AGENTS.md +0 -22
  356. package/src/i18n/__tests__/i18n.test.ts +0 -108
  357. package/src/i18n/index.ts +0 -16
  358. package/src/i18n/locales.ts +0 -93
  359. package/src/i18n/messages.ts +0 -61
  360. package/src/i18n/title.ts +0 -25
  361. package/src/mcp/__tests__/workspace-mcp-config.test.ts +0 -135
  362. package/src/mcp/spec-schema.ts +0 -111
  363. package/src/mcp/workspace-mcp-config.ts +0 -188
  364. package/src/messaging/providers/__tests__/proactive-address.test.ts +0 -95
  365. package/src/persistence/conversation-title-placeholders.ts +0 -23
  366. package/src/persistence/message-cursor.ts +0 -78
  367. package/src/persistence/migrations/__tests__/157-invite-contact-id.test.ts +0 -149
  368. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-backfill.test.ts +0 -118
  369. package/src/plugins/defaults/memory/__tests__/memory-retrospective-cursor-preserve.test.ts +0 -83
  370. package/src/plugins/defaults/memory/hooks/message-deleted.ts +0 -21
  371. package/src/plugins/defaults/memory/memory-retrospective-cursor-backfill.ts +0 -126
  372. package/src/plugins/defaults/memory/memory-retrospective-cursor-preserve.ts +0 -79
  373. package/src/plugins/defaults/memory/memory-retrospective-cursor.ts +0 -28
  374. package/src/plugins/defaults/memory/skill-md-mtime-poll.ts +0 -9
  375. package/src/providers/gemini-thought-signature.test.ts +0 -63
  376. package/src/providers/gemini-thought-signature.ts +0 -44
  377. package/src/providers/openai/__tests__/chat-completions-provider-thought-signature.test.ts +0 -613
  378. package/src/providers/openai/__tests__/google-thought-signature.test.ts +0 -235
  379. package/src/providers/openai/google-thought-signature.ts +0 -320
  380. package/src/runtime/__tests__/channel-send.test.ts +0 -443
  381. package/src/runtime/__tests__/desktop-stream-upgrade.test.ts +0 -89
  382. package/src/runtime/__tests__/live-voice-upgrade.test.ts +0 -58
  383. package/src/runtime/__tests__/runtime-ws-test-utils.ts +0 -72
  384. package/src/runtime/__tests__/watch-stream-upgrade.test.ts +0 -59
  385. package/src/runtime/channel-send.ts +0 -316
  386. package/src/runtime/routes/__tests__/apps-refresh-route.test.ts +0 -205
  387. package/src/runtime/routes/__tests__/channel-send-routes.test.ts +0 -127
  388. package/src/runtime/routes/__tests__/dictation-cleanup-guard.test.ts +0 -107
  389. package/src/runtime/routes/channel-send-routes.ts +0 -85
  390. package/src/runtime/routes/desktop-setup-routes.test.ts +0 -74
  391. package/src/runtime/routes/desktop-setup-routes.ts +0 -35
  392. package/src/security/__tests__/ces-http-record-backend.test.ts +0 -137
  393. package/src/security/ces-http-record-backend.ts +0 -120
  394. package/src/skills/__tests__/workspace-skill-md-signature.test.ts +0 -60
  395. package/src/skills/workspace-skill-md-signature.ts +0 -50
  396. package/src/tools/acp/status.test.ts +0 -94
  397. package/src/util/ca-bundle.ts +0 -13
  398. package/src/workspace/git-porcelain.ts +0 -66
  399. package/src/workspace/migrations/154-repair-retired-codex-gpt-5-4-model-ids.ts +0 -258
  400. package/src/workspace/migrations/155-move-front-model-config-to-voice.ts +0 -78
  401. package/src/workspace/migrations/156-extract-workspace-mcp-json.ts +0 -214
  402. package/src/workspace/migrations/__tests__/155-move-front-model-config-to-voice.test.ts +0 -102
  403. package/src/workspace/migrations/__tests__/156-extract-workspace-mcp-json.test.ts +0 -199
  404. /package/src/{calls → live-voice}/progress-phrases.ts +0 -0
@@ -1,235 +0,0 @@
1
- import { describe, expect, test } from "bun:test";
2
-
3
- import { GEMINI_3_UNSIGNED_TOOL_CALL_THOUGHT_SIGNATURE } from "../../gemini-thought-signature.js";
4
- import {
5
- applyGemini3UnsignedToolCallFallback,
6
- assistantToolCallsNeedThoughtSignatureBackfill,
7
- attachGoogleThoughtSignature,
8
- attachGoogleThoughtSignatureIfNeeded,
9
- backfillGoogleThoughtSignatures,
10
- backfillUnsignedGoogleThoughtSignatures,
11
- geminiThoughtSignaturesByToolCallId,
12
- googleThoughtSignatureFromUnknown,
13
- type GoogleToolCallExtraContent,
14
- messagesCarryGoogleThoughtSignature,
15
- stripGoogleThoughtSignatures,
16
- toolUseMetadataFromChatCompletionsDelta,
17
- } from "../google-thought-signature.js";
18
-
19
- describe("googleThoughtSignatureFromUnknown", () => {
20
- test("reads extra_content.google.thought_signature", () => {
21
- expect(
22
- googleThoughtSignatureFromUnknown({
23
- extra_content: { google: { thought_signature: "signed-thought-1" } },
24
- }),
25
- ).toBe("signed-thought-1");
26
- });
27
-
28
- test("reads camelCase thoughtSignature under google", () => {
29
- expect(
30
- googleThoughtSignatureFromUnknown({
31
- extra_content: { google: { thoughtSignature: "signed-thought-1" } },
32
- }),
33
- ).toBe("signed-thought-1");
34
- });
35
-
36
- test("ignores empty, missing, and non-object extra_content", () => {
37
- expect(googleThoughtSignatureFromUnknown(undefined)).toBeUndefined();
38
- expect(googleThoughtSignatureFromUnknown({})).toBeUndefined();
39
- expect(
40
- googleThoughtSignatureFromUnknown({ extra_content: "nope" }),
41
- ).toBeUndefined();
42
- expect(
43
- googleThoughtSignatureFromUnknown({
44
- extra_content: { google: { thought_signature: "" } },
45
- }),
46
- ).toBeUndefined();
47
- });
48
- });
49
-
50
- describe("attachGoogleThoughtSignature", () => {
51
- test("adds extra_content only when a signature is present", () => {
52
- expect(
53
- attachGoogleThoughtSignature({ id: "call_1" }, "signed-thought-1"),
54
- ).toEqual({
55
- id: "call_1",
56
- extra_content: { google: { thought_signature: "signed-thought-1" } },
57
- });
58
- expect(attachGoogleThoughtSignature({ id: "call_1" }, undefined)).toEqual({
59
- id: "call_1",
60
- });
61
- });
62
- });
63
-
64
- describe("attachGoogleThoughtSignatureIfNeeded", () => {
65
- test("attaches extra_content for Gemini 3 models", () => {
66
- expect(
67
- attachGoogleThoughtSignatureIfNeeded(
68
- { id: "call_1" },
69
- "signed-thought-1",
70
- "google/gemini-3.7-flash",
71
- ),
72
- ).toEqual({
73
- id: "call_1",
74
- extra_content: { google: { thought_signature: "signed-thought-1" } },
75
- });
76
- });
77
-
78
- test("does not attach extra_content for non-Gemini models", () => {
79
- expect(
80
- attachGoogleThoughtSignatureIfNeeded(
81
- { id: "call_1" },
82
- "signed-thought-1",
83
- "gpt-5.2",
84
- ),
85
- ).toEqual({ id: "call_1" });
86
- });
87
- });
88
-
89
- describe("toolUseMetadataFromChatCompletionsDelta", () => {
90
- test("maps extra_content onto gemini providerMetadata", () => {
91
- expect(
92
- toolUseMetadataFromChatCompletionsDelta({
93
- extra_content: { google: { thought_signature: "signed-thought-1" } },
94
- }),
95
- ).toEqual({ gemini: { thoughtSignature: "signed-thought-1" } });
96
- });
97
-
98
- test("returns undefined when extra_content is absent", () => {
99
- expect(toolUseMetadataFromChatCompletionsDelta({ id: "call_1" })).toBeUndefined();
100
- });
101
- });
102
-
103
- describe("applyGemini3UnsignedToolCallFallback", () => {
104
- test("adds the dummy signature to the first unsigned Gemini 3 tool_call", () => {
105
- const toolCalls: GoogleToolCallExtraContent[] = [{}, {}];
106
- applyGemini3UnsignedToolCallFallback(toolCalls, "google/gemini-3.7-flash");
107
- expect(toolCalls[0].extra_content).toEqual({
108
- google: {
109
- thought_signature: GEMINI_3_UNSIGNED_TOOL_CALL_THOUGHT_SIGNATURE,
110
- },
111
- });
112
- expect(toolCalls[1].extra_content).toBeUndefined();
113
- });
114
-
115
- test("does not overwrite a captured signature", () => {
116
- const toolCalls: GoogleToolCallExtraContent[] = [
117
- attachGoogleThoughtSignature({}, "signed-thought-1"),
118
- {},
119
- ];
120
- applyGemini3UnsignedToolCallFallback(toolCalls, "gemini-3.7-flash");
121
- expect(toolCalls[0].extra_content?.google?.thought_signature).toBe(
122
- "signed-thought-1",
123
- );
124
- expect(toolCalls[1].extra_content).toBeUndefined();
125
- });
126
-
127
- test("does not add extra_content for non-Gemini-3 models", () => {
128
- const toolCalls: GoogleToolCallExtraContent[] = [{}];
129
- applyGemini3UnsignedToolCallFallback(toolCalls, "gpt-5.2");
130
- expect(toolCalls[0].extra_content).toBeUndefined();
131
- });
132
- });
133
-
134
- describe("thought signature params helpers", () => {
135
- type ToolCallParams = {
136
- messages: Array<{
137
- role: string;
138
- tool_calls: Array<
139
- GoogleToolCallExtraContent & { id: string; type: string }
140
- >;
141
- }>;
142
- };
143
-
144
- const unsignedParams: ToolCallParams = {
145
- messages: [
146
- {
147
- role: "assistant",
148
- tool_calls: [{ id: "call_1", type: "function" }],
149
- },
150
- ],
151
- };
152
-
153
- const signedParams = {
154
- messages: [
155
- {
156
- role: "assistant",
157
- tool_calls: [
158
- attachGoogleThoughtSignature(
159
- { id: "call_1", type: "function" },
160
- "signed-thought-1",
161
- ),
162
- ],
163
- },
164
- ],
165
- };
166
-
167
- test("detects unsigned assistant tool_calls that need a backfill", () => {
168
- expect(assistantToolCallsNeedThoughtSignatureBackfill(unsignedParams)).toBe(
169
- true,
170
- );
171
- expect(assistantToolCallsNeedThoughtSignatureBackfill(signedParams)).toBe(
172
- false,
173
- );
174
- expect(messagesCarryGoogleThoughtSignature(unsignedParams)).toBe(false);
175
- expect(messagesCarryGoogleThoughtSignature(signedParams)).toBe(true);
176
- });
177
-
178
- test("backfills the dummy signature onto unsigned tool_calls", () => {
179
- const params = structuredClone(unsignedParams);
180
- expect(backfillUnsignedGoogleThoughtSignatures(params)).toBe(true);
181
- expect(messagesCarryGoogleThoughtSignature(params)).toBe(true);
182
- expect(
183
- params.messages[0].tool_calls[0].extra_content?.google?.thought_signature,
184
- ).toBe(GEMINI_3_UNSIGNED_TOOL_CALL_THOUGHT_SIGNATURE);
185
- });
186
-
187
- test("strips extra_content from assistant tool_calls", () => {
188
- const params = structuredClone(signedParams);
189
- expect(stripGoogleThoughtSignatures(params)).toBe(true);
190
- expect(messagesCarryGoogleThoughtSignature(params)).toBe(false);
191
- expect(params.messages[0].tool_calls[0].extra_content).toBeUndefined();
192
- });
193
-
194
- test("replays captured signatures by tool_call id on unsigned params", () => {
195
- const params = structuredClone(unsignedParams);
196
- expect(
197
- backfillGoogleThoughtSignatures(
198
- params,
199
- new Map([["call_1", "signed-thought-1"]]),
200
- ),
201
- ).toBe(true);
202
- expect(
203
- params.messages[0].tool_calls[0].extra_content?.google?.thought_signature,
204
- ).toBe("signed-thought-1");
205
- });
206
- });
207
-
208
- describe("geminiThoughtSignaturesByToolCallId", () => {
209
- test("indexes captured signatures from assistant tool_use blocks", () => {
210
- expect(
211
- geminiThoughtSignaturesByToolCallId([
212
- {
213
- role: "assistant",
214
- content: [
215
- {
216
- type: "tool_use",
217
- id: "call_1",
218
- name: "search",
219
- input: { q: "x" },
220
- providerMetadata: {
221
- gemini: { thoughtSignature: "signed-thought-1" },
222
- },
223
- },
224
- {
225
- type: "tool_use",
226
- id: "call_2",
227
- name: "search",
228
- input: { q: "y" },
229
- },
230
- ],
231
- },
232
- ]),
233
- ).toEqual(new Map([["call_1", "signed-thought-1"]]));
234
- });
235
- });
@@ -1,320 +0,0 @@
1
- import {
2
- isGemini3Model,
3
- unsignedThoughtSignatureFallback,
4
- } from "../gemini-thought-signature.js";
5
- import type { Message, ToolUseContent } from "../types.js";
6
-
7
- export type GoogleToolCallExtraContent = {
8
- extra_content?: {
9
- google?: {
10
- thought_signature?: string;
11
- };
12
- };
13
- };
14
-
15
- export type GoogleThoughtSignatureRetryKind =
16
- | "missing-thought-signature"
17
- | "unknown-extra-content";
18
-
19
- function asNonEmptyString(value: unknown): string | undefined {
20
- return typeof value === "string" && value.length > 0 ? value : undefined;
21
- }
22
-
23
- function googleObjectThoughtSignature(google: unknown): string | undefined {
24
- if (google === null || typeof google !== "object") {
25
- return undefined;
26
- }
27
- const record = google as Record<string, unknown>;
28
- return (
29
- asNonEmptyString(record.thought_signature) ??
30
- asNonEmptyString(record.thoughtSignature)
31
- );
32
- }
33
-
34
- /**
35
- * Gemini's OpenAI-compatible wire format puts the thought signature on
36
- * `tool_calls[].extra_content.google.thought_signature`.
37
- */
38
- export function googleThoughtSignatureFromUnknown(
39
- value: unknown,
40
- ): string | undefined {
41
- if (value === null || typeof value !== "object") {
42
- return undefined;
43
- }
44
- const extra = (value as { extra_content?: unknown }).extra_content;
45
- if (extra === null || typeof extra !== "object") {
46
- return undefined;
47
- }
48
- return googleObjectThoughtSignature((extra as { google?: unknown }).google);
49
- }
50
-
51
- export function toolUseMetadataFromChatCompletionsDelta(
52
- delta: unknown,
53
- ): ToolUseContent["providerMetadata"] | undefined {
54
- const thoughtSignature = googleThoughtSignatureFromUnknown(delta);
55
- if (!thoughtSignature) {
56
- return undefined;
57
- }
58
- return { gemini: { thoughtSignature } };
59
- }
60
-
61
- export function thoughtSignatureFromToolUseMetadata(
62
- metadata: ToolUseContent["providerMetadata"] | undefined,
63
- ): string | undefined {
64
- return metadata?.gemini?.thoughtSignature;
65
- }
66
-
67
- export function attachGoogleThoughtSignature<T extends object>(
68
- toolCall: T,
69
- thoughtSignature: string | undefined,
70
- ): T & GoogleToolCallExtraContent {
71
- if (!thoughtSignature) {
72
- return toolCall;
73
- }
74
- return {
75
- ...toolCall,
76
- extra_content: {
77
- google: { thought_signature: thoughtSignature },
78
- },
79
- };
80
- }
81
-
82
- /**
83
- * Attach Gemini extra_content only when the destination model is Gemini 3.x.
84
- * Non-Gemini Chat Completions endpoints never see the vendor field on the
85
- * first request. Remapped model ids that still require a signature recover
86
- * via {@link backfillGoogleThoughtSignatures} after a 4xx.
87
- */
88
- export function attachGoogleThoughtSignatureIfNeeded<T extends object>(
89
- toolCall: T,
90
- thoughtSignature: string | undefined,
91
- model: string,
92
- ): T & GoogleToolCallExtraContent {
93
- if (!isGemini3Model(model)) {
94
- return toolCall;
95
- }
96
- return attachGoogleThoughtSignature(toolCall, thoughtSignature);
97
- }
98
-
99
- function stampUnsignedGoogleThoughtSignature(
100
- toolCalls: GoogleToolCallExtraContent[],
101
- options?: { model?: string },
102
- ): boolean {
103
- const fallback = unsignedThoughtSignatureFallback(
104
- toolCalls.map((tc) => googleThoughtSignatureFromUnknown(tc)),
105
- options,
106
- );
107
- if (!fallback) {
108
- return false;
109
- }
110
- const target = toolCalls[fallback.index];
111
- if (!target) {
112
- return false;
113
- }
114
- target.extra_content = {
115
- google: { thought_signature: fallback.signature },
116
- };
117
- return true;
118
- }
119
-
120
- function stampCapturedGoogleThoughtSignatures(
121
- toolCalls: Array<GoogleToolCallExtraContent & { id?: unknown }>,
122
- capturedByCallId: ReadonlyMap<string, string>,
123
- ): boolean {
124
- let added = false;
125
- for (const tc of toolCalls) {
126
- if (typeof tc.id !== "string") {
127
- continue;
128
- }
129
- const captured = capturedByCallId.get(tc.id);
130
- if (!captured || googleThoughtSignatureFromUnknown(tc)) {
131
- continue;
132
- }
133
- tc.extra_content = {
134
- google: { thought_signature: captured },
135
- };
136
- added = true;
137
- }
138
- return added;
139
- }
140
-
141
- /**
142
- * Gemini 3.x validates the first function call of each step. When none of the
143
- * serialized tool_calls carry a captured signature, attach the documented dummy
144
- * so unsigned history (or a non-capturing earlier turn) does not 400.
145
- */
146
- export function applyGemini3UnsignedToolCallFallback(
147
- toolCalls: GoogleToolCallExtraContent[],
148
- model: string,
149
- ): void {
150
- stampUnsignedGoogleThoughtSignature(toolCalls, { model });
151
- }
152
-
153
- function paramsMessages(params: unknown): unknown[] | undefined {
154
- const messages = (params as { messages?: unknown }).messages;
155
- return Array.isArray(messages) ? messages : undefined;
156
- }
157
-
158
- function assistantToolCalls(
159
- msg: unknown,
160
- ): Array<GoogleToolCallExtraContent & { id?: unknown }> | undefined {
161
- if (msg === null || typeof msg !== "object") {
162
- return undefined;
163
- }
164
- const record = msg as { role?: unknown; tool_calls?: unknown };
165
- if (record.role !== "assistant" || !Array.isArray(record.tool_calls)) {
166
- return undefined;
167
- }
168
- return record.tool_calls as Array<
169
- GoogleToolCallExtraContent & { id?: unknown }
170
- >;
171
- }
172
-
173
- export function messagesCarryGoogleThoughtSignature(params: unknown): boolean {
174
- const messages = paramsMessages(params);
175
- if (!messages) {
176
- return false;
177
- }
178
- return messages.some((msg) => {
179
- const toolCalls = assistantToolCalls(msg);
180
- return toolCalls?.some((tc) => googleThoughtSignatureFromUnknown(tc));
181
- });
182
- }
183
-
184
- export function assistantToolCallsNeedThoughtSignatureBackfill(
185
- params: unknown,
186
- ): boolean {
187
- const messages = paramsMessages(params);
188
- if (!messages) {
189
- return false;
190
- }
191
- return messages.some((msg) => {
192
- const toolCalls = assistantToolCalls(msg);
193
- if (!toolCalls || toolCalls.length === 0) {
194
- return false;
195
- }
196
- return !toolCalls.some((tc) => googleThoughtSignatureFromUnknown(tc));
197
- });
198
- }
199
-
200
- export function stripGoogleThoughtSignatures(params: unknown): boolean {
201
- const messages = paramsMessages(params);
202
- if (!messages) {
203
- return false;
204
- }
205
- let stripped = false;
206
- for (const msg of messages) {
207
- const toolCalls = assistantToolCalls(msg);
208
- if (!toolCalls) {
209
- continue;
210
- }
211
- for (const tc of toolCalls) {
212
- if (tc.extra_content !== undefined) {
213
- delete tc.extra_content;
214
- stripped = true;
215
- }
216
- }
217
- }
218
- return stripped;
219
- }
220
-
221
- export function geminiThoughtSignaturesByToolCallId(
222
- messages: ReadonlyArray<Message>,
223
- ): Map<string, string> {
224
- const out = new Map<string, string>();
225
- for (const msg of messages) {
226
- if (msg.role !== "assistant") {
227
- continue;
228
- }
229
- for (const block of msg.content) {
230
- if (block.type !== "tool_use") {
231
- continue;
232
- }
233
- const signature = block.providerMetadata?.gemini?.thoughtSignature;
234
- if (signature) {
235
- out.set(block.id, signature);
236
- }
237
- }
238
- }
239
- return out;
240
- }
241
-
242
- export function backfillGoogleThoughtSignatures(
243
- params: unknown,
244
- capturedByCallId?: ReadonlyMap<string, string>,
245
- ): boolean {
246
- const messages = paramsMessages(params);
247
- if (!messages) {
248
- return false;
249
- }
250
- let added = false;
251
- for (const msg of messages) {
252
- const toolCalls = assistantToolCalls(msg);
253
- if (!toolCalls || toolCalls.length === 0) {
254
- continue;
255
- }
256
- if (
257
- capturedByCallId &&
258
- stampCapturedGoogleThoughtSignatures(toolCalls, capturedByCallId)
259
- ) {
260
- added = true;
261
- }
262
- if (stampUnsignedGoogleThoughtSignature(toolCalls)) {
263
- added = true;
264
- }
265
- }
266
- return added;
267
- }
268
-
269
- export function backfillUnsignedGoogleThoughtSignatures(
270
- params: unknown,
271
- ): boolean {
272
- return backfillGoogleThoughtSignatures(params);
273
- }
274
-
275
- const UNKNOWN_EXTRA_CONTENT_REJECTION =
276
- /unknown|unexpected|unrecognized|additional propert|extra (?:field|property)|not (?:a )?valid|invalid (?:argument|parameter|field|property)/i;
277
-
278
- export function classifyGoogleThoughtSignatureRetry(
279
- params: unknown,
280
- options: {
281
- isClientError: boolean;
282
- haystack: string;
283
- capturedByCallId?: ReadonlyMap<string, string>;
284
- },
285
- ): {
286
- kind: GoogleThoughtSignatureRetryKind;
287
- message: string;
288
- apply: () => void;
289
- } | null {
290
- if (!options.isClientError) {
291
- return null;
292
- }
293
- if (
294
- assistantToolCallsNeedThoughtSignatureBackfill(params) &&
295
- /thought[_\s-]?signature/i.test(options.haystack)
296
- ) {
297
- return {
298
- kind: "missing-thought-signature",
299
- message:
300
- "Upstream requires thought signature round-trip; retrying with signatures on unsigned tool_calls",
301
- apply: () => {
302
- backfillGoogleThoughtSignatures(params, options.capturedByCallId);
303
- },
304
- };
305
- }
306
- if (
307
- messagesCarryGoogleThoughtSignature(params) &&
308
- /extra_content/i.test(options.haystack) &&
309
- UNKNOWN_EXTRA_CONTENT_REJECTION.test(options.haystack)
310
- ) {
311
- return {
312
- kind: "unknown-extra-content",
313
- message: "Upstream rejected tool_call extra_content; retrying without it",
314
- apply: () => {
315
- stripGoogleThoughtSignatures(params);
316
- },
317
- };
318
- }
319
- return null;
320
- }