@fudrouter/fsrouter 0.6.72 → 0.6.74

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 (314) hide show
  1. package/dist/lib/headroom/detect.js +97 -7
  2. package/dist/lib/headroom/process.js +136 -4
  3. package/dist/open-sse/config/appConstants.js +23 -79
  4. package/dist/open-sse/config/cliFingerprints.js +1 -1
  5. package/dist/open-sse/config/errorConfig.js +0 -11
  6. package/dist/open-sse/config/grokCli.js +10 -0
  7. package/dist/open-sse/config/kiroConstants.js +99 -46
  8. package/dist/open-sse/config/runtimeConfig.js +2 -0
  9. package/dist/open-sse/config/ttsModels.js +2 -0
  10. package/dist/open-sse/executors/antigravity.js +250 -164
  11. package/dist/open-sse/executors/base.js +16 -11
  12. package/dist/open-sse/executors/codex.js +269 -1108
  13. package/dist/open-sse/executors/commandCode.js +1 -1
  14. package/dist/open-sse/executors/commandcode.js +10 -4
  15. package/dist/open-sse/executors/cursor.js +96 -203
  16. package/dist/open-sse/executors/default.js +146 -244
  17. package/dist/open-sse/executors/github.js +128 -73
  18. package/dist/open-sse/executors/grok-cli.js +527 -94
  19. package/dist/open-sse/executors/grok-web.js +5 -7
  20. package/dist/open-sse/executors/index.js +12 -0
  21. package/dist/open-sse/executors/kiro.js +150 -61
  22. package/dist/open-sse/executors/opencode-go.js +12 -4
  23. package/dist/open-sse/executors/opencode.js +1 -1
  24. package/dist/open-sse/executors/perplexity-web.js +20 -96
  25. package/dist/open-sse/executors/qoder.js +28 -18
  26. package/dist/open-sse/executors/vertex.js +53 -7
  27. package/dist/open-sse/executors/xiaomi-tokenplan.js +6 -5
  28. package/dist/open-sse/handlers/chatCore/nonStreamingHandler.js +97 -85
  29. package/dist/open-sse/handlers/chatCore/requestDetail.js +32 -8
  30. package/dist/open-sse/handlers/chatCore/sseToJsonHandler.js +13 -7
  31. package/dist/open-sse/handlers/chatCore/streamingHandler.js +74 -25
  32. package/dist/open-sse/handlers/chatCore.js +35 -41
  33. package/dist/open-sse/handlers/embeddingProviders/index.js +1 -0
  34. package/dist/open-sse/handlers/embeddingProviders/openai.js +8 -16
  35. package/dist/open-sse/handlers/imageProviders/blackForestLabs.js +2 -21
  36. package/dist/open-sse/handlers/imageProviders/cloudflareAi.js +2 -30
  37. package/dist/open-sse/handlers/imageProviders/codex.js +2 -20
  38. package/dist/open-sse/handlers/imageProviders/comfyui.js +5 -18
  39. package/dist/open-sse/handlers/imageProviders/falAi.js +2 -22
  40. package/dist/open-sse/handlers/imageProviders/gemini.js +2 -16
  41. package/dist/open-sse/handlers/imageProviders/huggingface.js +2 -17
  42. package/dist/open-sse/handlers/imageProviders/index.js +3 -4
  43. package/dist/open-sse/handlers/imageProviders/leonardo.js +1 -1
  44. package/dist/open-sse/handlers/imageProviders/nanobanana.js +4 -23
  45. package/dist/open-sse/handlers/imageProviders/openai.js +15 -43
  46. package/dist/open-sse/handlers/imageProviders/runwayml.js +2 -26
  47. package/dist/open-sse/handlers/imageProviders/sdwebui.js +4 -20
  48. package/dist/open-sse/handlers/imageProviders/stabilityAi.js +2 -26
  49. package/dist/open-sse/handlers/imageProviders/weavy.js +1 -1
  50. package/dist/open-sse/handlers/search/chatSearch.js +60 -14
  51. package/dist/open-sse/handlers/ttsProviders/gemini.js +14 -3
  52. package/dist/open-sse/handlers/ttsProviders/index.js +4 -2
  53. package/dist/open-sse/handlers/ttsProviders/openai.js +4 -1
  54. package/dist/open-sse/handlers/ttsProviders/openrouter.js +7 -4
  55. package/dist/open-sse/handlers/videoCore.js +166 -0
  56. package/dist/open-sse/handlers/videoProviders/weavy.js +1 -1
  57. package/dist/open-sse/mcp-server/catalog.js +1 -1
  58. package/dist/open-sse/mcp-server/server.js +2 -2
  59. package/dist/open-sse/mcp-server/tools/advancedTools.js +2 -2
  60. package/dist/open-sse/mcp-server/tools/agentSkillTools.js +1 -1
  61. package/dist/open-sse/mcp-server/tools/compressionTools.js +4 -4
  62. package/dist/open-sse/mcp-server/tools/gamificationTools.js +10 -10
  63. package/dist/open-sse/mcp-server/tools/githubSkillTools.js +1 -1
  64. package/dist/open-sse/mcp-server/tools/memoryTools.js +3 -3
  65. package/dist/open-sse/mcp-server/tools/notionTools.js +2 -2
  66. package/dist/open-sse/mcp-server/tools/obsidianTools.js +2 -2
  67. package/dist/open-sse/mcp-server/tools/pickFastestModel.js +1 -1
  68. package/dist/open-sse/mcp-server/tools/pluginTools.js +4 -4
  69. package/dist/open-sse/mcp-server/tools/skillTools.js +2 -2
  70. package/dist/open-sse/providers/capabilities.js +24 -4
  71. package/dist/open-sse/providers/registry/alicode-intl.js +1 -1
  72. package/dist/open-sse/providers/registry/anthropic.js +1 -8
  73. package/dist/open-sse/providers/registry/codex.js +0 -9
  74. package/dist/open-sse/providers/registry/cohere.js +0 -2
  75. package/dist/open-sse/providers/registry/gemini.js +0 -2
  76. package/dist/open-sse/providers/registry/github.js +9 -6
  77. package/dist/open-sse/providers/registry/grok-cli.js +28 -18
  78. package/dist/open-sse/providers/registry/index.js +74 -80
  79. package/dist/open-sse/providers/registry/kiro.js +12 -0
  80. package/dist/open-sse/providers/registry/mistral.js +0 -3
  81. package/dist/open-sse/providers/registry/openai.js +0 -3
  82. package/dist/open-sse/providers/registry/perplexity.js +0 -2
  83. package/dist/open-sse/providers/registry/xai.js +5 -3
  84. package/dist/open-sse/rtk/autodetect.js +10 -2
  85. package/dist/open-sse/rtk/caveman.js +2 -93
  86. package/dist/open-sse/rtk/cavemanPrompts.js +34 -2
  87. package/dist/open-sse/rtk/constants.js +7 -2
  88. package/dist/open-sse/rtk/headroom.js +133 -0
  89. package/dist/open-sse/rtk/ponytail.js +1 -1
  90. package/dist/open-sse/rtk/registry.js +2 -0
  91. package/dist/open-sse/services/accountFallback.js +0 -108
  92. package/dist/open-sse/services/combo/quotaExhaustionCutoff.js +2 -2
  93. package/dist/open-sse/services/combo/quotaShareStrategy.js +1 -1
  94. package/dist/open-sse/services/combo/resolveAutoStrategy.js +1 -1
  95. package/dist/open-sse/services/combo/sessionStickiness.js +1 -1
  96. package/dist/open-sse/services/combo/targetSorters.js +2 -2
  97. package/dist/open-sse/services/combo/validateQuality.js +1 -1
  98. package/dist/open-sse/services/comboConfig.js +1 -1
  99. package/dist/open-sse/services/emergencyFallback.js +1 -1
  100. package/dist/open-sse/services/grokCliModels.js +127 -0
  101. package/dist/open-sse/services/model.js +7 -1
  102. package/dist/open-sse/services/provider.js +1 -1
  103. package/dist/open-sse/services/proxyAutoSelector.js +1 -1
  104. package/dist/open-sse/services/tokenRefresh/providers.js +3 -3
  105. package/dist/open-sse/services/usage/codex.js +148 -214
  106. package/dist/open-sse/services/usage/grok-cli.js +61 -7
  107. package/dist/open-sse/services/usage/misc.js +0 -19
  108. package/dist/open-sse/services/usage.js +0 -2
  109. package/dist/open-sse/translator/concerns/paramSupport.js +2 -2
  110. package/dist/open-sse/translator/concerns/thinkingUnified.js +6 -0
  111. package/dist/open-sse/translator/index.js +97 -59
  112. package/dist/open-sse/translator/request/claude-to-kiro.js +67 -40
  113. package/dist/open-sse/translator/request/openai-responses.js +1 -0
  114. package/dist/open-sse/translator/request/openai-to-commandcode.js +0 -4
  115. package/dist/open-sse/translator/request/openai-to-kiro.js +49 -20
  116. package/dist/open-sse/translator/response/commandcode-to-openai.js +0 -4
  117. package/dist/open-sse/utils/bypassHandler.js +18 -3
  118. package/dist/open-sse/utils/claudeCloaking.js +15 -5
  119. package/dist/open-sse/utils/cursorImages.js +1 -1
  120. package/dist/open-sse/utils/error.js +0 -17
  121. package/dist/open-sse/utils/keepaliveThreshold.js +4 -4
  122. package/dist/open-sse/utils/kiroSessionReplay.js +125 -0
  123. package/dist/open-sse/utils/noThinkingAlias.js +1 -1
  124. package/dist/open-sse/utils/proxyFetch.js +0 -1
  125. package/dist/open-sse/utils/reasoningContentInjector.js +4 -7
  126. package/dist/open-sse/utils/responsesStatePolicy.js +1 -1
  127. package/dist/open-sse/utils/responsesStreamHelpers.js +1 -0
  128. package/dist/open-sse/utils/sessionManager.js +49 -22
  129. package/dist/open-sse/utils/stream.js +54 -77
  130. package/dist/open-sse/utils/streamHandler.js +19 -15
  131. package/dist/open-sse/utils/streamHelpers.js +2 -17
  132. package/dist/open-sse/utils/usageTracking.js +103 -12
  133. package/dist/routes/headroom/extras/route.js +58 -0
  134. package/dist/routes/headroom/restart/route.js +33 -0
  135. package/open-sse/config/appConstants.js +23 -79
  136. package/open-sse/config/errorConfig.js +0 -11
  137. package/open-sse/config/grokCli.js +10 -0
  138. package/open-sse/config/kiroConstants.js +99 -46
  139. package/open-sse/config/runtimeConfig.js +2 -0
  140. package/open-sse/config/ttsModels.js +2 -0
  141. package/open-sse/executors/antigravity.js +250 -164
  142. package/open-sse/executors/base.js +16 -11
  143. package/open-sse/executors/codex.js +269 -1108
  144. package/open-sse/executors/commandcode.js +10 -4
  145. package/open-sse/executors/cursor.js +96 -203
  146. package/open-sse/executors/default.js +146 -244
  147. package/open-sse/executors/github.js +128 -73
  148. package/open-sse/executors/grok-cli.js +527 -94
  149. package/open-sse/executors/grok-web.js +5 -7
  150. package/open-sse/executors/index.js +12 -0
  151. package/open-sse/executors/kiro.js +150 -61
  152. package/open-sse/executors/opencode-go.js +12 -4
  153. package/open-sse/executors/opencode.js +1 -1
  154. package/open-sse/executors/perplexity-web.js +20 -96
  155. package/open-sse/executors/qoder.js +28 -18
  156. package/open-sse/executors/vertex.js +53 -7
  157. package/open-sse/executors/xiaomi-tokenplan.js +6 -5
  158. package/open-sse/handlers/chatCore/nonStreamingHandler.js +97 -85
  159. package/open-sse/handlers/chatCore/requestDetail.js +32 -8
  160. package/open-sse/handlers/chatCore/sseToJsonHandler.js +13 -7
  161. package/open-sse/handlers/chatCore/streamingHandler.js +74 -25
  162. package/open-sse/handlers/chatCore.js +35 -41
  163. package/open-sse/handlers/embeddingProviders/index.js +1 -0
  164. package/open-sse/handlers/embeddingProviders/openai.js +8 -16
  165. package/open-sse/handlers/imageProviders/blackForestLabs.js +2 -21
  166. package/open-sse/handlers/imageProviders/cloudflareAi.js +2 -30
  167. package/open-sse/handlers/imageProviders/codex.js +2 -20
  168. package/open-sse/handlers/imageProviders/comfyui.js +5 -18
  169. package/open-sse/handlers/imageProviders/falAi.js +2 -22
  170. package/open-sse/handlers/imageProviders/gemini.js +2 -16
  171. package/open-sse/handlers/imageProviders/huggingface.js +2 -17
  172. package/open-sse/handlers/imageProviders/index.js +3 -4
  173. package/open-sse/handlers/imageProviders/leonardo.js +1 -1
  174. package/open-sse/handlers/imageProviders/nanobanana.js +4 -23
  175. package/open-sse/handlers/imageProviders/openai.js +15 -43
  176. package/open-sse/handlers/imageProviders/runwayml.js +2 -26
  177. package/open-sse/handlers/imageProviders/sdwebui.js +4 -20
  178. package/open-sse/handlers/imageProviders/stabilityAi.js +2 -26
  179. package/open-sse/handlers/imageProviders/weavy.js +1 -1
  180. package/open-sse/handlers/search/chatSearch.js +60 -14
  181. package/open-sse/handlers/ttsProviders/gemini.js +14 -3
  182. package/open-sse/handlers/ttsProviders/index.js +4 -2
  183. package/open-sse/handlers/ttsProviders/openai.js +4 -1
  184. package/open-sse/handlers/ttsProviders/openrouter.js +7 -4
  185. package/open-sse/handlers/videoCore.js +166 -0
  186. package/open-sse/handlers/videoProviders/weavy.js +1 -1
  187. package/open-sse/mcp-server/audit.js +1 -1
  188. package/open-sse/mcp-server/catalog.js +2 -2
  189. package/open-sse/mcp-server/descriptionCompressor.js +1 -1
  190. package/open-sse/mcp-server/mcpCallerIdentity.js +1 -1
  191. package/open-sse/mcp-server/schemas/tools.js +1 -1
  192. package/open-sse/mcp-server/server.js +4 -4
  193. package/open-sse/mcp-server/tools/advancedTools.js +5 -5
  194. package/open-sse/mcp-server/tools/agentSkillTools.js +1 -1
  195. package/open-sse/mcp-server/tools/compressionTools.js +4 -4
  196. package/open-sse/mcp-server/tools/gamificationTools.js +10 -10
  197. package/open-sse/mcp-server/tools/githubSkillTools.js +1 -1
  198. package/open-sse/mcp-server/tools/memoryTools.js +3 -3
  199. package/open-sse/mcp-server/tools/notionTools.js +2 -2
  200. package/open-sse/mcp-server/tools/obsidianTools.js +2 -2
  201. package/open-sse/mcp-server/tools/pickFastestModel.js +3 -3
  202. package/open-sse/mcp-server/tools/pluginTools.js +4 -4
  203. package/open-sse/mcp-server/tools/skillTools.js +2 -2
  204. package/open-sse/providers/capabilities.js +24 -4
  205. package/open-sse/providers/registry/alicode-intl.js +1 -1
  206. package/open-sse/providers/registry/anthropic.js +1 -8
  207. package/open-sse/providers/registry/codex.js +0 -9
  208. package/open-sse/providers/registry/cohere.js +0 -2
  209. package/open-sse/providers/registry/gemini.js +0 -2
  210. package/open-sse/providers/registry/github.js +9 -6
  211. package/open-sse/providers/registry/grok-cli.js +28 -18
  212. package/open-sse/providers/registry/index.js +74 -80
  213. package/open-sse/providers/registry/kiro.js +12 -0
  214. package/open-sse/providers/registry/mistral.js +0 -3
  215. package/open-sse/providers/registry/openai.js +0 -3
  216. package/open-sse/providers/registry/perplexity.js +0 -2
  217. package/open-sse/providers/registry/xai.js +5 -3
  218. package/open-sse/rtk/autodetect.js +10 -2
  219. package/open-sse/rtk/caveman.js +2 -93
  220. package/open-sse/rtk/cavemanPrompts.js +34 -2
  221. package/open-sse/rtk/constants.js +7 -2
  222. package/open-sse/rtk/headroom.js +133 -0
  223. package/open-sse/rtk/ponytail.js +1 -1
  224. package/open-sse/rtk/registry.js +2 -0
  225. package/open-sse/services/accountFallback.js +0 -108
  226. package/open-sse/services/combo/quotaExhaustionCutoff.js +2 -2
  227. package/open-sse/services/combo/quotaShareStrategy.js +1 -1
  228. package/open-sse/services/combo/resolveAutoStrategy.js +1 -1
  229. package/open-sse/services/combo/sessionStickiness.js +1 -1
  230. package/open-sse/services/combo/shadowRouting.js +1 -1
  231. package/open-sse/services/combo/targetSorters.js +4 -4
  232. package/open-sse/services/combo/validateQuality.js +1 -1
  233. package/open-sse/services/evalRouting.js +1 -1
  234. package/open-sse/services/grokCliModels.js +127 -0
  235. package/open-sse/services/model.js +7 -1
  236. package/open-sse/services/modelCapabilities.js +1 -1
  237. package/open-sse/services/modelFamilyFallback.js +1 -1
  238. package/open-sse/services/provider.js +1 -1
  239. package/open-sse/services/providerCooldownTracker.js +1 -1
  240. package/open-sse/services/rateLimitManager.js +1 -1
  241. package/open-sse/services/tokenRefresh/providers.js +3 -3
  242. package/open-sse/services/usage/codex.js +148 -214
  243. package/open-sse/services/usage/grok-cli.js +61 -7
  244. package/open-sse/services/usage/misc.js +0 -19
  245. package/open-sse/services/usage.js +0 -2
  246. package/open-sse/translator/concerns/paramSupport.js +2 -2
  247. package/open-sse/translator/concerns/thinkingUnified.js +6 -0
  248. package/open-sse/translator/index.js +97 -59
  249. package/open-sse/translator/request/claude-to-kiro.js +67 -40
  250. package/open-sse/translator/request/openai-responses.js +1 -0
  251. package/open-sse/translator/request/openai-to-commandcode.js +0 -4
  252. package/open-sse/translator/request/openai-to-kiro.js +49 -20
  253. package/open-sse/translator/response/commandcode-to-openai.js +0 -4
  254. package/open-sse/utils/bypassHandler.js +18 -3
  255. package/open-sse/utils/claudeCloaking.js +15 -5
  256. package/open-sse/utils/error.js +0 -17
  257. package/open-sse/utils/kiroSessionReplay.js +125 -0
  258. package/open-sse/utils/logger.js +1 -1
  259. package/open-sse/utils/proxyFetch.js +0 -1
  260. package/open-sse/utils/reasoningContentInjector.js +4 -7
  261. package/open-sse/utils/responsesStreamHelpers.js +1 -0
  262. package/open-sse/utils/sessionManager.js +49 -22
  263. package/open-sse/utils/stream.js +54 -77
  264. package/open-sse/utils/streamHandler.js +19 -15
  265. package/open-sse/utils/streamHelpers.js +2 -17
  266. package/open-sse/utils/usageTracking.js +103 -12
  267. package/package.json +4 -7
  268. package/public/assets/EndpointPageClient.C2WMTYy0.js +6 -0
  269. package/public/assets/{Loading.Bj-WGl4k.js → Loading.BHPtQ9vj.js} +1 -1
  270. package/public/assets/{NoAuthProxyCard.qAv57b-0.js → NoAuthProxyCard.BDcXaWvM.js} +1 -1
  271. package/public/assets/index.Be3gbrBl.js +89 -0
  272. package/public/assets/index.COMgQZYj.css +1 -0
  273. package/public/assets/{page.CbkENBd5.js → page.-lpNgYAw.js} +1 -1
  274. package/public/assets/{page.CssmrzTT.js → page.11hpNKmq.js} +1 -1
  275. package/public/assets/{page.C72FTTJr.js → page.B-LxsnqU.js} +1 -1
  276. package/public/assets/{page.sOFOrxqq.js → page.B-dzeIUC.js} +1 -1
  277. package/public/assets/{page.CsxWmPoI.js → page.B-nBR75u.js} +1 -1
  278. package/public/assets/{page.Dx_GRRdT.js → page.B3QqvLep.js} +1 -1
  279. package/public/assets/{page.DPyOkPVo.js → page.B8xdkCWA.js} +1 -1
  280. package/public/assets/{page.DUI8kqOY.js → page.BFb7yUd8.js} +1 -1
  281. package/public/assets/page.BbPPdoas.js +1 -0
  282. package/public/assets/page.BdS20a1O.js +1 -0
  283. package/public/assets/{page.DibhF7f-.js → page.BfmI9KYe.js} +1 -1
  284. package/public/assets/{page.DX4Nno6M.js → page.BgGJovOg.js} +1 -1
  285. package/public/assets/{page.BnmTC5jG.js → page.C0gBvR4O.js} +1 -1
  286. package/public/assets/{page.D5gj98Oe.js → page.C6bYizL7.js} +1 -1
  287. package/public/assets/{page.vla5Mzki.js → page.C8sLEMa6.js} +1 -1
  288. package/public/assets/{page.CXd_R9yU.js → page.CCNsZBXp.js} +1 -1
  289. package/public/assets/{page.CQlVGoXg.js → page.CF_YSLwP.js} +1 -1
  290. package/public/assets/{page.BbO1pspY.js → page.CPTtRDxw.js} +1 -1
  291. package/public/assets/{page.D1oKew1j.js → page.CdMmlUEm.js} +1 -1
  292. package/public/assets/{page.DxMDTbSx.js → page.Cged1bOZ.js} +1 -1
  293. package/public/assets/{page.Cj5h09Zo.js → page.Ch647dVk.js} +1 -1
  294. package/public/assets/{page.DVIHRbxB.js → page.CpvXDkQF.js} +1 -1
  295. package/public/assets/{page.i4KDuWcM.js → page.CrBl7f8N.js} +1 -1
  296. package/public/assets/{page.BSLJ4tx5.js → page.CrP7niA2.js} +1 -1
  297. package/public/assets/{page.CnTop8Zt.js → page.CvUFZzXr.js} +1 -1
  298. package/public/assets/{page.O2ddJYoT.js → page.CyUqJPmx.js} +1 -1
  299. package/public/assets/{page.DBhu4Arl.js → page.D8Rp8fFR.js} +1 -1
  300. package/public/assets/{page.CPZav1_c.js → page.Df9qtrdG.js} +1 -1
  301. package/public/assets/{page.Qkkv8roc.js → page.DiL4Gwqe.js} +1 -1
  302. package/public/assets/{page.BdmJ3yY3.js → page.Dl1apZE2.js} +1 -1
  303. package/public/assets/{page.1qjqvrwX.js → page.HV0w1d5C.js} +1 -1
  304. package/public/assets/{page.ChX1NqmC.js → page.N1x4YL8_.js} +1 -1
  305. package/public/assets/{page.Dh5f0XJC.js → page.P2Ny5veR.js} +1 -1
  306. package/public/assets/{page.CSs3-gdt.js → page.fOOCr18J.js} +1 -1
  307. package/public/assets/{page.Ir7KvKcF.js → page.sUIPWIiF.js} +1 -1
  308. package/public/assets/{page.CzlQTyAL.js → page.tE7PpWYW.js} +1 -1
  309. package/public/assets/{page.DzZLqI5Q.js → page.uziaGZsT.js} +1 -1
  310. package/public/index.html +2 -2
  311. package/public/assets/EndpointPageClient.LyNNvZ4z.js +0 -6
  312. package/public/assets/index.BuPfZebu.css +0 -1
  313. package/public/assets/index.CShjRV_B.js +0 -89
  314. package/public/assets/page.DD_czjjP.js +0 -1
@@ -24,6 +24,11 @@
24
24
 
25
25
  import { proxyAwareFetch } from "../../utils/proxyFetch.js";
26
26
  import { U, parseResetTime, toFiniteNumber } from "./shared.js";
27
+ import {
28
+ GROK_CLI_CLIENT_IDENTIFIER,
29
+ GROK_CLI_USER_AGENT,
30
+ GROK_CLI_VERSION,
31
+ } from "../../config/grokCli.js";
27
32
 
28
33
  const USAGE = U("grok-cli");
29
34
  const BILLING_URL = USAGE.url || "https://cli-chat-proxy.grok.com/v1/billing?format=credits";
@@ -43,10 +48,11 @@ function buildGrokCliHeaders(accessToken, providerSpecificData = {}) {
43
48
  const headers = {
44
49
  Authorization: `Bearer ${accessToken}`,
45
50
  Accept: "application/json",
46
- "User-Agent": "grok-pager/0.2.93 grok-shell/0.2.93 (linux; x86_64)",
51
+ "User-Agent": GROK_CLI_USER_AGENT,
47
52
  "x-xai-token-auth": "xai-grok-cli",
48
- "x-grok-client-identifier": "grok-pager",
49
- "x-grok-client-version": "0.2.93",
53
+ "x-grok-client-identifier": GROK_CLI_CLIENT_IDENTIFIER,
54
+ "x-grok-client-version": GROK_CLI_VERSION,
55
+ "x-grok-client-mode": "headless",
50
56
  };
51
57
  const email = psd.email;
52
58
  const userId = psd.userId || psd.principalId;
@@ -55,8 +61,18 @@ function buildGrokCliHeaders(accessToken, providerSpecificData = {}) {
55
61
  return headers;
56
62
  }
57
63
 
64
+ function subscriptionTier(user, config) {
65
+ const rawTier =
66
+ user?.subscriptionTier ??
67
+ user?.subscription_tier ??
68
+ user?.subscription?.tier ??
69
+ config?.subscriptionTier ??
70
+ config?.subscription_tier;
71
+ return typeof rawTier === "string" ? rawTier.trim() : "";
72
+ }
73
+
58
74
  function resolvePlan(user, config) {
59
- const tier = typeof user?.subscriptionTier === "string" ? user.subscriptionTier.trim() : "";
75
+ const tier = subscriptionTier(user, config);
60
76
  if (tier) {
61
77
  return tier
62
78
  .replace(/[_-]+/g, " ")
@@ -105,11 +121,42 @@ export function parseGrokCliBilling(billing, user = null) {
105
121
 
106
122
  const periodEnd =
107
123
  parseResetTime(config.billingPeriodEnd) ||
124
+ parseResetTime(config.billing_period_end) ||
108
125
  parseResetTime(config.currentPeriod?.end) ||
126
+ parseResetTime(config.resetAt || config.resetsAt || config.periodEnd) ||
109
127
  parseResetTime(root.billingPeriodEnd) ||
128
+ parseResetTime(root.billing_period_end) ||
129
+ parseResetTime(root.resetAt || root.resetsAt || root.periodEnd) ||
110
130
  null;
111
131
 
112
132
  const quotas = {};
133
+ const tier = subscriptionTier(user, config);
134
+ const subscriptionAccess = Boolean(tier) && !/^(free|none|null)$/i.test(tier);
135
+
136
+ // Current Grok Build responses expose included monthly usage at top level.
137
+ const monthlyLimit = unwrapVal(
138
+ config.monthlyLimit ?? config.monthly_limit ?? root.monthlyLimit ?? root.monthly_limit,
139
+ NaN,
140
+ );
141
+ const includedUsed = unwrapVal(
142
+ config.includedUsed ?? config.included_used ?? root.includedUsed ?? root.included_used,
143
+ NaN,
144
+ );
145
+ const totalUsed = unwrapVal(
146
+ config.totalUsed ?? config.total_used ?? root.totalUsed ?? root.total_used,
147
+ NaN,
148
+ );
149
+ if (Number.isFinite(monthlyLimit) && monthlyLimit > 0) {
150
+ quotas["Monthly included"] = makeQuota({
151
+ used: Number.isFinite(includedUsed)
152
+ ? includedUsed
153
+ : Number.isFinite(totalUsed)
154
+ ? totalUsed
155
+ : 0,
156
+ total: monthlyLimit,
157
+ resetAt: periodEnd,
158
+ });
159
+ }
113
160
 
114
161
  // Primary: on-demand spending window (subscription / promo credits)
115
162
  const onDemandCap = unwrapVal(config.onDemandCap ?? root.onDemandCap, NaN);
@@ -121,7 +168,12 @@ export function parseGrokCliBilling(billing, user = null) {
121
168
  total: onDemandCap,
122
169
  resetAt: periodEnd,
123
170
  });
124
- } else if (Number.isFinite(onDemandCap) && onDemandCap === 0 && Number.isFinite(onDemandUsed)) {
171
+ } else if (
172
+ !subscriptionAccess &&
173
+ Number.isFinite(onDemandCap) &&
174
+ onDemandCap === 0 &&
175
+ Number.isFinite(onDemandUsed)
176
+ ) {
125
177
  // Cap 0 is the exhausted free/promo state (chat returns 402 spending-limit).
126
178
  // UI treats total===0 as unlimited, so use a synthetic 1/1 depleted row.
127
179
  quotas["On-demand"] = {
@@ -199,6 +251,7 @@ export function parseGrokCliBilling(billing, user = null) {
199
251
  quotas,
200
252
  periodEnd,
201
253
  exhausted,
254
+ subscriptionAccess,
202
255
  rawConfig: config,
203
256
  };
204
257
  }
@@ -255,8 +308,9 @@ export async function getGrokCliUsage(accessToken, providerSpecificData = null,
255
308
  if (!parsed.quotas || Object.keys(parsed.quotas).length === 0) {
256
309
  return {
257
310
  plan: parsed.plan,
258
- message:
259
- "Grok Build connected, but no credit allotment was returned. Free promo may be exhausted — upgrade at https://grok.com/supergrok or add credits at https://grok.com/?_s=usage.",
311
+ message: parsed.subscriptionAccess
312
+ ? "Subscription access is active; Grok does not expose a numeric included quota."
313
+ : "Grok Build connected, but no credit allotment was returned. Free promo may be exhausted.",
260
314
  quotas: {},
261
315
  };
262
316
  }
@@ -267,22 +267,3 @@ export async function getQoderUsage(accessToken, proxyOptions = null) {
267
267
  return { message: `Qoder connected. Unable to fetch usage: ${error.message}` };
268
268
  }
269
269
  }
270
-
271
- /**
272
- * Cloudflare Workers AI Usage
273
- * Free tier: 10,000 neurons/day. No public usage API — returns free tier info.
274
- */
275
- export async function getCloudflareAiUsage(apiKey, providerSpecificData) {
276
- return {
277
- plan: "Workers AI Free",
278
- quotas: {
279
- neurons: {
280
- used: 0,
281
- total: 10000,
282
- resetAt: null,
283
- unlimited: false,
284
- displayName: "Neurons (daily free)",
285
- },
286
- },
287
- };
288
- }
@@ -12,7 +12,6 @@ import { getKiroUsage } from "./usage/kiro.js";
12
12
  import { getMiniMaxUsage } from "./usage/minimax.js";
13
13
  import { getCodeBuddyCnUsage } from "./usage/codebuddy-cn.js";
14
14
  import { getGrokCliUsage } from "./usage/grok-cli.js";
15
- import { getCloudflareAiUsage } from "./usage/misc.js";
16
15
  import {
17
16
  getQwenUsage,
18
17
  getIflowUsage,
@@ -46,7 +45,6 @@ const USAGE_HANDLERS = {
46
45
  "vercel-ai-gateway": (c) => getVercelAiGatewayUsage(c.apiKey, c.proxyOptions),
47
46
  "codebuddy-cn": (c) => getCodeBuddyCnUsage(c.accessToken, c.apiKey, c.providerSpecificData, c.proxyOptions),
48
47
  "grok-cli": (c) => getGrokCliUsage(c.accessToken, c.providerSpecificData, c.proxyOptions),
49
- "cloudflare-ai": (c) => getCloudflareAiUsage(c.apiKey, c.providerSpecificData),
50
48
  };
51
49
 
52
50
  export async function getUsageForProvider(connection, proxyOptions = null) {
@@ -6,8 +6,8 @@ import { getCapabilitiesForModel } from "../../providers/capabilities.js";
6
6
  // Each rule: optional provider, regex match on model, list of params to drop.
7
7
  // A param is removed only when it is present (!== undefined).
8
8
  const STRIP_RULES = [
9
- // claude-opus-4 series: temperature is deprecated (Anthropic 400). #1748
10
- { match: /claude-opus-4/i, drop: ["temperature"] },
9
+ // All Claude models: temperature deprecated/rejected upstream (Anthropic 400). #1748
10
+ { match: /claude/i, drop: ["temperature"] },
11
11
  // GitHub Copilot gpt-5.4: temperature unsupported.
12
12
  { provider: "github", match: /gpt-5\.4/i, drop: ["temperature"] },
13
13
  // GitHub Copilot Claude (except opus/sonnet 4.6): thinking + reasoning_effort rejected. #713
@@ -229,6 +229,12 @@ function applyFormat(fmt, body, cfg, caps) {
229
229
  }
230
230
  case "claude-adaptive": {
231
231
  if (none && canDisable) { body.thinking = { type: "disabled" }; break; }
232
+ // output_config.effort alone does NOT turn thinking on: Anthropic requires
233
+ // an explicit thinking:{type:"adaptive"} on Opus 4.6/4.7/4.8 and Sonnet 4.6
234
+ // ("thinking is off unless you explicitly set it"), and Anthropic-compatible
235
+ // shims (e.g. GitHub Copilot /v1/messages) default thinking off even for
236
+ // Sonnet 5. Send both fields — the documented adaptive-thinking shape.
237
+ body.thinking = { type: "adaptive" };
232
238
  const level = toLevel(eff);
233
239
  body.output_config = { effort: level === "xhigh" ? "high" : level };
234
240
  break;
@@ -1,23 +1,24 @@
1
1
  import { FORMATS } from "./formats.js";
2
- import { ensureToolCallIds, fixMissingToolResponses } from "./helpers/toolCallHelper.js";
3
- import { prepareClaudeRequest } from "./helpers/claudeHelper.js";
2
+ import { ensureToolCallIds, fixMissingToolResponses } from "./concerns/toolCall.js";
3
+ import { prepareClaudeRequest } from "./formats/claude.js";
4
4
  import { cloakClaudeTools } from "../utils/claudeCloaking.js";
5
- import { filterToOpenAIFormat } from "./helpers/openaiHelper.js";
5
+ import { filterToOpenAIFormat } from "./formats/openai.js";
6
6
  import { normalizeThinkingConfig } from "../services/provider.js";
7
+ import { applyThinking, captureThinking } from "./concerns/thinkingUnified.js";
8
+ import { captureSessionId } from "../utils/sessionManager.js";
7
9
  import { AntigravityExecutor } from "../executors/antigravity.js";
10
+ import { PROVIDERS } from "../providers/index.js";
8
11
 
9
- // Registry for translators
10
- const requestRegistry = new Map();
11
- const responseRegistry = new Map();
12
-
13
- import { createRequire } from "module";
14
- const require = createRequire(import.meta.url);
15
-
16
- // Track initialization state
17
- let initialized = false;
12
+ // Registry for translators. Lazy-init guards against circular-import order:
13
+ // translator modules call register() (side-effect) before this module's body runs.
14
+ // var (not let): hoisted as undefined so register() can run during circular import (no TDZ).
15
+ var requestRegistry;
16
+ var responseRegistry;
18
17
 
19
18
  // Register translator
20
19
  export function register(from, to, requestFn, responseFn) {
20
+ requestRegistry ??= new Map();
21
+ responseRegistry ??= new Map();
21
22
  const key = `${from}:${to}`;
22
23
  if (requestFn) {
23
24
  requestRegistry.set(key, requestFn);
@@ -27,35 +28,8 @@ export function register(from, to, requestFn, responseFn) {
27
28
  }
28
29
  }
29
30
 
30
- // Lazy load translators (called once on first use)
31
- function ensureInitialized() {
32
- if (initialized) return;
33
- initialized = true;
34
-
35
- // Request translators - sync require pattern for bundler
36
- require("./request/claude-to-openai.js");
37
- require("./request/openai-to-claude.js");
38
- require("./request/gemini-to-openai.js");
39
- require("./request/openai-to-gemini.js");
40
- require("./request/openai-to-vertex.js");
41
- require("./request/antigravity-to-openai.js");
42
- require("./request/openai-responses.js");
43
- require("./request/openai-to-kiro.js");
44
- require("./request/openai-to-cursor.js");
45
- require("./request/openai-to-ollama.js");
46
- require("./request/openai-to-commandcode.js");
47
-
48
- // Response translators
49
- require("./response/claude-to-openai.js");
50
- require("./response/openai-to-claude.js");
51
- require("./response/gemini-to-openai.js");
52
- require("./response/openai-to-antigravity.js");
53
- require("./response/openai-responses.js");
54
- require("./response/kiro-to-openai.js");
55
- require("./response/cursor-to-openai.js");
56
- require("./response/ollama-to-openai.js");
57
- require("./response/commandcode-to-openai.js");
58
- }
31
+ // No-op: translators self-register via the static imports at the bottom of this file.
32
+ function ensureInitialized() {}
59
33
 
60
34
  // Strip specific content types from messages (explicit opt-in via strip[] in PROVIDER_MODELS)
61
35
  function stripContentTypes(body, stripList = []) {
@@ -91,42 +65,72 @@ export function translateRequest(sourceFormat, targetFormat, model, body, stream
91
65
  // Fix missing tool responses (insert empty tool_result if needed)
92
66
  fixMissingToolResponses(result);
93
67
 
68
+ // Capture thinking intent from the original (pre-translation) body, before any
69
+ // format conversion strips/renames the fields. Applied after translation.
70
+ const thinkingIntent = captureThinking(result);
71
+
72
+ // Capture session id from the original body (envelope still intact, e.g. antigravity request.sessionId)
73
+ const clientSessionId = captureSessionId(result, credentials, connectionId, targetFormat);
74
+ // Expose to downstream translators (gemini-cli/antigravity envelopes) that run after envelope is stripped
75
+ if (credentials) credentials._clientSessionId = clientSessionId;
76
+
94
77
  // If same format, skip translation steps
95
78
  if (sourceFormat !== targetFormat) {
96
- // Step 1: source -> openai (if source is not openai)
97
- if (sourceFormat !== FORMATS.OPENAI) {
98
- const toOpenAI = requestRegistry.get(`${sourceFormat}:${FORMATS.OPENAI}`);
99
- if (toOpenAI) {
100
- result = toOpenAI(model, result, stream, credentials);
101
- // Log OpenAI intermediate format
102
- reqLogger?.logOpenAIRequest?.(result);
79
+ // Direct route: if a translator is registered for this exact source:target
80
+ // pair, use it instead of pivoting through OpenAI. This is lossless for
81
+ // pairs like claude:kiro (avoids the claude->openai->kiro double-hop).
82
+ const directFn = requestRegistry.get(`${sourceFormat}:${targetFormat}`);
83
+ if (directFn) {
84
+ result = directFn(model, result, stream, credentials);
85
+ } else {
86
+ // Step 1: source -> openai (if source is not openai)
87
+ if (sourceFormat !== FORMATS.OPENAI) {
88
+ const toOpenAI = requestRegistry.get(`${sourceFormat}:${FORMATS.OPENAI}`);
89
+ if (toOpenAI) {
90
+ result = toOpenAI(model, result, stream, credentials);
91
+ // Log OpenAI intermediate format
92
+ reqLogger?.logOpenAIRequest?.(result);
93
+ }
103
94
  }
104
- }
105
95
 
106
- // Step 2: openai -> target (if target is not openai)
107
- if (targetFormat !== FORMATS.OPENAI) {
108
- const fromOpenAI = requestRegistry.get(`${FORMATS.OPENAI}:${targetFormat}`);
109
- if (fromOpenAI) {
110
- result = fromOpenAI(model, result, stream, credentials);
96
+ // Step 2: openai -> target (if target is not openai)
97
+ if (targetFormat !== FORMATS.OPENAI) {
98
+ const fromOpenAI = requestRegistry.get(`${FORMATS.OPENAI}:${targetFormat}`);
99
+ if (fromOpenAI) {
100
+ result = fromOpenAI(model, result, stream, credentials);
101
+ }
111
102
  }
112
103
  }
113
104
  }
114
105
 
106
+ // Normalize thinking to the target provider-native format (config-driven, capability-aware).
107
+ // Kiro's GenerateAssistantResponse request does not accept the generic top-level
108
+ // `thinking` field; its translators map thinking intent to KAS-compatible
109
+ // systemPrompt/additionalModelRequestFields instead.
110
+ const kiroThinkingMappedByTranslator =
111
+ targetFormat === FORMATS.KIRO &&
112
+ (sourceFormat === FORMATS.OPENAI || sourceFormat === FORMATS.CLAUDE);
113
+ if (!kiroThinkingMappedByTranslator) {
114
+ applyThinking(targetFormat, model, result, provider, thinkingIntent);
115
+ }
116
+
115
117
  // Always normalize to clean OpenAI format when target is OpenAI
116
118
  // This handles hybrid requests (e.g., OpenAI messages + Claude tools)
117
119
  if (targetFormat === FORMATS.OPENAI) {
118
- result = filterToOpenAIFormat(result);
120
+ result = filterToOpenAIFormat(result, {
121
+ preserveCacheControl: !!PROVIDERS[provider]?.quirks?.preserveCacheControl,
122
+ });
119
123
  }
120
124
 
121
125
  // Final step: prepare request for Claude format endpoints
122
126
  if (targetFormat === FORMATS.CLAUDE) {
123
127
  const apiKey = credentials?.accessToken || credentials?.apiKey || null;
124
- result = prepareClaudeRequest(result, provider, apiKey, connectionId);
128
+ result = prepareClaudeRequest(result, provider, apiKey, connectionId, credentials?.rawHeaders, clientSessionId);
125
129
  }
126
130
 
127
131
  // Claude cloaking: rename client tools with _cc suffix (anti-ban)
128
- // Only for claude provider (not anthropic-compatible-*) with OAuth token
129
- if (provider === "claude") {
132
+ // quirk: only providers flagged cloakToolsOnOAuth, and only with an OAuth token
133
+ if (PROVIDERS[provider]?.quirks?.cloakToolsOnOAuth) {
130
134
  const apiKey = credentials?.accessToken || credentials?.apiKey || null;
131
135
  if (apiKey?.includes("sk-ant-oat")) {
132
136
  const { body: cloakedBody, toolNameMap } = cloakClaudeTools(result);
@@ -160,6 +164,16 @@ export function translateResponse(targetFormat, sourceFormat, chunk, state) {
160
164
  let results = [chunk];
161
165
  let openaiResults = null; // Store OpenAI intermediate results
162
166
 
167
+ // Direct route: if a response translator is registered for this exact
168
+ // target:source pair, use it instead of pivoting through OpenAI. Mirrors the
169
+ // request-side direct route (e.g. kiro:claude — KiroExecutor already emits
170
+ // OpenAI-shaped chunks, so this converts them straight to Claude SSE).
171
+ const directFn = responseRegistry.get(`${targetFormat}:${sourceFormat}`);
172
+ if (directFn) {
173
+ const converted = directFn(chunk, state);
174
+ return converted ? (Array.isArray(converted) ? converted : [converted]) : [];
175
+ }
176
+
163
177
  // Step 1: target -> openai (if target is not openai)
164
178
  if (targetFormat !== FORMATS.OPENAI) {
165
179
  const toOpenAI = responseRegistry.get(`${targetFormat}:${FORMATS.OPENAI}`);
@@ -248,7 +262,31 @@ export function initState(sourceFormat) {
248
262
  return base;
249
263
  }
250
264
 
251
- // Initialize all translators (kept for backward compatibility)
265
+ // Kept for backward compatibility; translators are already registered at import time.
252
266
  export function initTranslators() {
253
267
  ensureInitialized();
254
268
  }
269
+
270
+ // Static side-effect imports: each module calls register() at load (works in ESM + bundler).
271
+ import "./request/claude-to-openai.js";
272
+ import "./request/openai-to-claude.js";
273
+ import "./request/gemini-to-openai.js";
274
+ import "./request/openai-to-gemini.js";
275
+ import "./request/openai-to-vertex.js";
276
+ import "./request/antigravity-to-openai.js";
277
+ import "./request/openai-responses.js";
278
+ import "./request/openai-to-kiro.js";
279
+ import "./request/openai-to-cursor.js";
280
+ import "./request/openai-to-ollama.js";
281
+ import "./request/openai-to-commandcode.js";
282
+ import "./request/claude-to-kiro.js";
283
+ import "./response/claude-to-openai.js";
284
+ import "./response/openai-to-claude.js";
285
+ import "./response/gemini-to-openai.js";
286
+ import "./response/openai-to-antigravity.js";
287
+ import "./response/openai-responses.js";
288
+ import "./response/kiro-to-openai.js";
289
+ import "./response/cursor-to-openai.js";
290
+ import "./response/ollama-to-openai.js";
291
+ import "./response/commandcode-to-openai.js";
292
+ import "./response/kiro-to-claude.js";
@@ -24,14 +24,16 @@
24
24
  */
25
25
  import { register } from "../index.js";
26
26
  import { FORMATS } from "../formats.js";
27
- import { v4 as uuidv4 } from "uuid";
27
+ import { applyKiroSessionReplay } from "../../utils/kiroSessionReplay.js";
28
+ import { resolveContinuationId, resolveSessionIdentity } from "../../utils/sessionManager.js";
28
29
  import {
29
30
  resolveKiroModel,
31
+ resolveKiroThinkingBudget,
30
32
  buildThinkingSystemPrefix,
31
33
  KIRO_AGENTIC_SYSTEM_PROMPT,
32
34
  resolveDefaultProfileArn,
35
+ buildKiroAdditionalModelRequestFieldsForModel,
33
36
  } from "../../config/kiroConstants.js";
34
- import { resolveKiroThinkingBudget } from "../../services/thinkingBudget.js";
35
37
  import { DEFAULT_IMAGE_MIME } from "../schema/index.js";
36
38
  import { ROLE, CLAUDE_BLOCK } from "../schema/index.js";
37
39
 
@@ -363,6 +365,18 @@ function reconcileOrphanedToolResults(history, currentMessage) {
363
365
  }
364
366
  }
365
367
 
368
+ function extractClaudeSystemText(system) {
369
+ if (!system) return "";
370
+ if (typeof system === "string") return system;
371
+ if (Array.isArray(system)) {
372
+ return system.map((s) => {
373
+ if (typeof s === "string") return s;
374
+ return s?.text || "";
375
+ }).filter(Boolean).join("\n");
376
+ }
377
+ return "";
378
+ }
379
+
366
380
  /**
367
381
  * Build a Kiro payload directly from a Claude Messages API request body.
368
382
  */
@@ -402,62 +416,75 @@ export function claudeToKiroRequest(model, body, stream, credentials) {
402
416
  ? (credentials?.providerSpecificData?.profileArn || "")
403
417
  : (credentials?.providerSpecificData?.profileArn || resolveDefaultProfileArn(authMethod));
404
418
 
405
- let finalContent = currentMessage?.userInputMessage?.content || "";
406
-
407
- // System prompt: pass via native systemInstruction field (Kiro/Q API supports it)
408
- // and also prepend as <instructions> in user content as fallback for upstreams
409
- // that don't support the native field.
410
- let systemInstruction = undefined;
411
- if (body.system) {
412
- let systemText = "";
413
- if (typeof body.system === "string") {
414
- systemText = body.system;
415
- } else if (Array.isArray(body.system)) {
416
- systemText = body.system.map((s) => s.text || "").join("\n");
417
- }
418
- if (systemText) {
419
- systemInstruction = systemText;
420
- finalContent = `<instructions>\n${systemText}\n</instructions>\n\n${finalContent}`;
421
- }
422
- }
423
-
424
- // Prefix order: thinking_mode tag, timestamp marker, then agentic prompt.
419
+ // Kiro CLI/KAS sends system prompt as top-level `systemPrompt`. Keep a
420
+ // content fallback too because the CodeWhisperer surface does not always
421
+ // enforce top-level systemPrompt for direct calls.
425
422
  const timestamp = new Date().toISOString();
426
- const prefixParts = [];
427
- if (thinkingBudget !== null) prefixParts.push(buildThinkingSystemPrefix(thinkingBudget));
428
- prefixParts.push(`[Context: Current time is ${timestamp}]`);
429
- if (agentic) prefixParts.push(KIRO_AGENTIC_SYSTEM_PROMPT);
430
- finalContent = `${prefixParts.join("\n\n")}\n\n${finalContent}`;
431
-
423
+ const systemPromptParts = [];
424
+ if (thinkingBudget !== null) systemPromptParts.push(buildThinkingSystemPrefix(thinkingBudget));
425
+ if (agentic) systemPromptParts.push(KIRO_AGENTIC_SYSTEM_PROMPT);
426
+ const systemInstruction = extractClaudeSystemText(body.system);
427
+ if (systemInstruction) systemPromptParts.push(systemInstruction);
428
+ const systemPrompt = systemPromptParts.filter(Boolean).join("\n\n");
429
+ const currentTimeContext = `[Context: Current time is ${timestamp}]`;
430
+ const contentPrefix = [systemPrompt, currentTimeContext].filter(Boolean).join("\n\n");
431
+
432
+ const sessionIdentity = resolveSessionIdentity({
433
+ headers: credentials?.rawHeaders,
434
+ body,
435
+ connectionId: credentials?.connectionId,
436
+ scope: "kiro",
437
+ });
438
+ const conversationId = sessionIdentity.sessionId;
439
+ const continuationId = resolveContinuationId({
440
+ sessionId: conversationId,
441
+ connectionId: credentials?.connectionId,
442
+ scope: "kiro",
443
+ ephemeral: sessionIdentity.ephemeral,
444
+ });
445
+ const replay = applyKiroSessionReplay({
446
+ conversationId,
447
+ connectionId: credentials?.connectionId,
448
+ modelId: upstreamModel,
449
+ systemPrompt,
450
+ contentPrefix,
451
+ currentContentPrefix: currentTimeContext,
452
+ history,
453
+ currentMessage,
454
+ });
455
+ const replayCurrent = replay.currentMessage?.userInputMessage || {};
432
456
  const userInputMessage = {
433
- content: finalContent,
457
+ content: replayCurrent.content || "",
434
458
  modelId: upstreamModel,
435
459
  origin: "AI_EDITOR",
436
- ...(currentMessage?.userInputMessage?.userInputMessageContext && {
437
- userInputMessageContext:
438
- currentMessage.userInputMessage.userInputMessageContext,
460
+ ...(replayCurrent.userInputMessageContext && {
461
+ userInputMessageContext: replayCurrent.userInputMessageContext,
439
462
  }),
440
- ...(currentMessage?.userInputMessage?.images && {
441
- images: currentMessage.userInputMessage.images,
463
+ ...(replayCurrent.images && {
464
+ images: replayCurrent.images,
442
465
  }),
443
466
  };
444
467
 
445
- if (systemInstruction) {
446
- userInputMessage.systemInstruction = systemInstruction;
447
- }
448
-
449
468
  const payload = {
450
469
  conversationState: {
451
470
  chatTriggerType: "MANUAL",
452
- conversationId: uuidv4(),
471
+ conversationId,
472
+ agentContinuationId: continuationId,
473
+ agentTaskType: "vibe",
453
474
  currentMessage: {
454
475
  userInputMessage,
455
476
  },
456
- history,
477
+ history: replay.history,
457
478
  },
479
+ agentMode: "vibe",
458
480
  };
459
481
 
460
482
  if (profileArn) payload.profileArn = profileArn;
483
+ if (systemPrompt) payload.systemPrompt = systemPrompt;
484
+ const additionalModelRequestFields = buildKiroAdditionalModelRequestFieldsForModel(body, upstreamModel);
485
+ if (additionalModelRequestFields) {
486
+ payload.additionalModelRequestFields = additionalModelRequestFields;
487
+ }
461
488
 
462
489
  if (maxTokens || temperature !== undefined || topP !== undefined) {
463
490
  payload.inferenceConfig = {};
@@ -201,6 +201,7 @@ export function openaiResponsesToOpenAIRequest(model, body, stream, credentials)
201
201
  delete result.prompt_cache_key;
202
202
  delete result.store;
203
203
  delete result.reasoning;
204
+ delete result.client_metadata;
204
205
 
205
206
  return result;
206
207
  }
@@ -170,7 +170,3 @@ export function openaiToCommandCodeRequest(model, body, stream /* , credentials
170
170
  }
171
171
 
172
172
  register(FORMATS.OPENAI, FORMATS.COMMANDCODE, openaiToCommandCodeRequest, null);
173
-
174
- // Backwards-compatible alias
175
- export const openaiToCommandCode = openaiToCommandCodeRequest;
176
-