@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,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
- }