@jsonstudio/rcc 0.89.1968 → 0.89.2195

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 (555) hide show
  1. package/README.md +22 -0
  2. package/config/file-line-limit-policy.json +21 -0
  3. package/configsamples/config.json +1 -1
  4. package/configsamples/config.v1.quickstart.sanitized.json +6 -6
  5. package/configsamples/provider/iflow/config.v1.json +1 -1
  6. package/dist/app/config-readers.d.ts +18 -0
  7. package/dist/app/config-readers.js +95 -0
  8. package/dist/app/config-readers.js.map +1 -0
  9. package/dist/app/index.d.ts +9 -0
  10. package/dist/app/index.js +8 -0
  11. package/dist/app/index.js.map +1 -0
  12. package/dist/app/shutdown.d.ts +32 -0
  13. package/dist/app/shutdown.js +41 -0
  14. package/dist/app/shutdown.js.map +1 -0
  15. package/dist/bootstrap/index.d.ts +7 -0
  16. package/dist/bootstrap/index.js +7 -0
  17. package/dist/bootstrap/index.js.map +1 -0
  18. package/dist/bootstrap/log-filter.d.ts +15 -0
  19. package/dist/bootstrap/log-filter.js +81 -0
  20. package/dist/bootstrap/log-filter.js.map +1 -0
  21. package/dist/build-info.js +2 -2
  22. package/dist/cli/commands/claude.js +6 -5
  23. package/dist/cli/commands/claude.js.map +1 -1
  24. package/dist/cli/commands/init/basic.d.ts +1 -7
  25. package/dist/cli/commands/init/basic.js +0 -79
  26. package/dist/cli/commands/init/basic.js.map +1 -1
  27. package/dist/cli/commands/init/prompt-utils.d.ts +7 -0
  28. package/dist/cli/commands/init/prompt-utils.js +80 -0
  29. package/dist/cli/commands/init/prompt-utils.js.map +1 -0
  30. package/dist/cli/commands/init/workflows.js +2 -1
  31. package/dist/cli/commands/init/workflows.js.map +1 -1
  32. package/dist/cli/commands/init.js +74 -2
  33. package/dist/cli/commands/init.js.map +1 -1
  34. package/dist/cli/commands/launcher/index.d.ts +7 -0
  35. package/dist/cli/commands/launcher/index.js +7 -0
  36. package/dist/cli/commands/launcher/index.js.map +1 -0
  37. package/dist/cli/commands/launcher/types.d.ts +112 -0
  38. package/dist/cli/commands/launcher/types.js +7 -0
  39. package/dist/cli/commands/launcher/types.js.map +1 -0
  40. package/dist/cli/commands/launcher/utils.d.ts +114 -0
  41. package/dist/cli/commands/launcher/utils.js +378 -0
  42. package/dist/cli/commands/launcher/utils.js.map +1 -0
  43. package/dist/cli/commands/launcher-kernel.d.ts +2 -74
  44. package/dist/cli/commands/launcher-kernel.js +141 -143
  45. package/dist/cli/commands/launcher-kernel.js.map +1 -1
  46. package/dist/cli/commands/start-types.d.ts +67 -0
  47. package/dist/cli/commands/start-types.js +3 -0
  48. package/dist/cli/commands/start-types.js.map +1 -0
  49. package/dist/cli/commands/start-utils.d.ts +19 -0
  50. package/dist/cli/commands/start-utils.js +78 -0
  51. package/dist/cli/commands/start-utils.js.map +1 -0
  52. package/dist/cli/commands/start.d.ts +2 -67
  53. package/dist/cli/commands/start.js +131 -47
  54. package/dist/cli/commands/start.js.map +1 -1
  55. package/dist/cli/commands/stop.js +13 -0
  56. package/dist/cli/commands/stop.js.map +1 -1
  57. package/dist/cli/commands/tmux-inject.js +1 -1
  58. package/dist/cli/commands/tmux-inject.js.map +1 -1
  59. package/dist/cli/config/init-config.js +60 -2
  60. package/dist/cli/config/init-config.js.map +1 -1
  61. package/dist/cli/config/init-provider-catalog.js +3 -1
  62. package/dist/cli/config/init-provider-catalog.js.map +1 -1
  63. package/dist/cli/config/precommand-default-script.d.ts +17 -0
  64. package/dist/cli/config/precommand-default-script.js +47 -0
  65. package/dist/cli/config/precommand-default-script.js.map +1 -0
  66. package/dist/cli.js +2 -0
  67. package/dist/cli.js.map +1 -1
  68. package/dist/client/gemini-cli/gemini-cli-protocol-client.js +55 -5
  69. package/dist/client/gemini-cli/gemini-cli-protocol-client.js.map +1 -1
  70. package/dist/commands/oauth.js +28 -4
  71. package/dist/commands/oauth.js.map +1 -1
  72. package/dist/commands/quota-daemon.js +12 -0
  73. package/dist/commands/quota-daemon.js.map +1 -1
  74. package/dist/configsamples/config.v1.quickstart.sanitized.json +6 -6
  75. package/dist/constants/index.d.ts +34 -0
  76. package/dist/constants/index.js +57 -0
  77. package/dist/constants/index.js.map +1 -1
  78. package/dist/docs/daemon-admin-ui.html +268 -11
  79. package/dist/error-handling/quiet-error-handling-center.js +19 -1
  80. package/dist/error-handling/quiet-error-handling-center.js.map +1 -1
  81. package/dist/index.js +233 -30
  82. package/dist/index.js.map +1 -1
  83. package/dist/manager/index.js +4 -4
  84. package/dist/manager/index.js.map +1 -1
  85. package/dist/manager/modules/quota/antigravity-quota-core.d.ts +26 -0
  86. package/dist/manager/modules/quota/antigravity-quota-core.js +23 -0
  87. package/dist/manager/modules/quota/antigravity-quota-core.js.map +1 -0
  88. package/dist/manager/modules/quota/antigravity-quota-helpers.d.ts +16 -0
  89. package/dist/manager/modules/quota/antigravity-quota-helpers.js +167 -0
  90. package/dist/manager/modules/quota/antigravity-quota-helpers.js.map +1 -0
  91. package/dist/manager/modules/quota/antigravity-quota-manager.d.ts +10 -39
  92. package/dist/manager/modules/quota/antigravity-quota-manager.js +167 -464
  93. package/dist/manager/modules/quota/antigravity-quota-manager.js.map +1 -1
  94. package/dist/manager/modules/quota/antigravity-quota-persistence.d.ts +20 -0
  95. package/dist/manager/modules/quota/antigravity-quota-persistence.js +139 -0
  96. package/dist/manager/modules/quota/antigravity-quota-persistence.js.map +1 -0
  97. package/dist/manager/modules/quota/antigravity-quota-runtime.d.ts +55 -0
  98. package/dist/manager/modules/quota/antigravity-quota-runtime.js +174 -0
  99. package/dist/manager/modules/quota/antigravity-quota-runtime.js.map +1 -0
  100. package/dist/manager/modules/quota/antigravity-quota-sync.d.ts +46 -0
  101. package/dist/manager/modules/quota/antigravity-quota-sync.js +162 -0
  102. package/dist/manager/modules/quota/antigravity-quota-sync.js.map +1 -0
  103. package/dist/manager/modules/quota/index.d.ts +1 -0
  104. package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.d.ts +13 -0
  105. package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.js +149 -0
  106. package/dist/manager/modules/quota/provider-quota-daemon.error-helpers.js.map +1 -0
  107. package/dist/manager/modules/quota/provider-quota-daemon.events.js +1 -148
  108. package/dist/manager/modules/quota/provider-quota-daemon.events.js.map +1 -1
  109. package/dist/manager/modules/quota/provider-quota-daemon.js.map +1 -1
  110. package/dist/manager/modules/quota/quota-adapter.d.ts +111 -0
  111. package/dist/manager/modules/quota/quota-adapter.js +325 -0
  112. package/dist/manager/modules/quota/quota-adapter.js.map +1 -0
  113. package/dist/manager/quota/provider-quota-center.d.ts +10 -0
  114. package/dist/manager/quota/provider-quota-center.js +15 -2
  115. package/dist/manager/quota/provider-quota-center.js.map +1 -1
  116. package/dist/modules/llmswitch/bridge/antigravity-signature.d.ts +28 -0
  117. package/dist/modules/llmswitch/bridge/antigravity-signature.js +180 -0
  118. package/dist/modules/llmswitch/bridge/antigravity-signature.js.map +1 -0
  119. package/dist/modules/llmswitch/bridge/index.d.ts +13 -0
  120. package/dist/modules/llmswitch/bridge/index.js +14 -0
  121. package/dist/modules/llmswitch/bridge/index.js.map +1 -0
  122. package/dist/modules/llmswitch/bridge/module-loader.d.ts +16 -0
  123. package/dist/modules/llmswitch/bridge/module-loader.js +59 -0
  124. package/dist/modules/llmswitch/bridge/module-loader.js.map +1 -0
  125. package/dist/modules/llmswitch/bridge/quota-manager.d.ts +8 -0
  126. package/dist/modules/llmswitch/bridge/quota-manager.js +37 -0
  127. package/dist/modules/llmswitch/bridge/quota-manager.js.map +1 -0
  128. package/dist/modules/llmswitch/bridge/response-converter.d.ts +11 -0
  129. package/dist/modules/llmswitch/bridge/response-converter.js +68 -0
  130. package/dist/modules/llmswitch/bridge/response-converter.js.map +1 -0
  131. package/dist/modules/llmswitch/bridge/routing-integrations.d.ts +12 -0
  132. package/dist/modules/llmswitch/bridge/routing-integrations.js +56 -0
  133. package/dist/modules/llmswitch/bridge/routing-integrations.js.map +1 -0
  134. package/dist/modules/llmswitch/bridge/runtime-integrations.d.ts +34 -0
  135. package/dist/modules/llmswitch/bridge/runtime-integrations.js +87 -0
  136. package/dist/modules/llmswitch/bridge/runtime-integrations.js.map +1 -0
  137. package/dist/modules/llmswitch/bridge/snapshot-recorder.d.ts +13 -0
  138. package/dist/modules/llmswitch/bridge/snapshot-recorder.js +484 -0
  139. package/dist/modules/llmswitch/bridge/snapshot-recorder.js.map +1 -0
  140. package/dist/modules/llmswitch/bridge/state-integrations.d.ts +59 -0
  141. package/dist/modules/llmswitch/bridge/state-integrations.js +264 -0
  142. package/dist/modules/llmswitch/bridge/state-integrations.js.map +1 -0
  143. package/dist/modules/llmswitch/bridge.d.ts +14 -131
  144. package/dist/modules/llmswitch/bridge.js +14 -834
  145. package/dist/modules/llmswitch/bridge.js.map +1 -1
  146. package/dist/modules/pipeline/types/provider-config-types.d.ts +240 -0
  147. package/dist/modules/pipeline/types/provider-config-types.js +2 -0
  148. package/dist/modules/pipeline/types/provider-config-types.js.map +1 -0
  149. package/dist/modules/pipeline/types/provider-types.d.ts +2 -239
  150. package/dist/modules/pipeline/types/provider-types.js +1 -1
  151. package/dist/modules/pipeline/types/provider-types.js.map +1 -1
  152. package/dist/modules/pipeline/utils/debug-logger.js +3 -5
  153. package/dist/modules/pipeline/utils/debug-logger.js.map +1 -1
  154. package/dist/providers/auth/apikey-auth.d.ts +57 -1
  155. package/dist/providers/auth/apikey-auth.js +131 -1
  156. package/dist/providers/auth/apikey-auth.js.map +1 -1
  157. package/dist/providers/auth/oauth-lifecycle/error-detection.d.ts +8 -0
  158. package/dist/providers/auth/oauth-lifecycle/error-detection.js +71 -0
  159. package/dist/providers/auth/oauth-lifecycle/error-detection.js.map +1 -0
  160. package/dist/providers/auth/oauth-lifecycle/index.d.ts +10 -0
  161. package/dist/providers/auth/oauth-lifecycle/index.js +11 -0
  162. package/dist/providers/auth/oauth-lifecycle/index.js.map +1 -0
  163. package/dist/providers/auth/oauth-lifecycle/path-resolver.d.ts +18 -0
  164. package/dist/providers/auth/oauth-lifecycle/path-resolver.js +121 -0
  165. package/dist/providers/auth/oauth-lifecycle/path-resolver.js.map +1 -0
  166. package/dist/providers/auth/oauth-lifecycle/throttle.d.ts +22 -0
  167. package/dist/providers/auth/oauth-lifecycle/throttle.js +37 -0
  168. package/dist/providers/auth/oauth-lifecycle/throttle.js.map +1 -0
  169. package/dist/providers/auth/oauth-lifecycle/token-helpers.d.ts +36 -0
  170. package/dist/providers/auth/oauth-lifecycle/token-helpers.js +127 -0
  171. package/dist/providers/auth/oauth-lifecycle/token-helpers.js.map +1 -0
  172. package/dist/providers/auth/oauth-lifecycle/token-io.d.ts +14 -0
  173. package/dist/providers/auth/oauth-lifecycle/token-io.js +151 -0
  174. package/dist/providers/auth/oauth-lifecycle/token-io.js.map +1 -0
  175. package/dist/providers/auth/oauth-lifecycle.js +70 -446
  176. package/dist/providers/auth/oauth-lifecycle.js.map +1 -1
  177. package/dist/providers/auth/oauth-repair-cooldown.js +8 -3
  178. package/dist/providers/auth/oauth-repair-cooldown.js.map +1 -1
  179. package/dist/providers/auth/oauth-repair-env.js +5 -3
  180. package/dist/providers/auth/oauth-repair-env.js.map +1 -1
  181. package/dist/providers/auth/oauth-token-utils.d.ts +61 -0
  182. package/dist/providers/auth/oauth-token-utils.js +187 -0
  183. package/dist/providers/auth/oauth-token-utils.js.map +1 -0
  184. package/dist/providers/auth/oauth-utils/camoufox-helper.d.ts +21 -0
  185. package/dist/providers/auth/oauth-utils/camoufox-helper.js +82 -0
  186. package/dist/providers/auth/oauth-utils/camoufox-helper.js.map +1 -0
  187. package/dist/providers/auth/oauth-utils/error-extraction.d.ts +17 -0
  188. package/dist/providers/auth/oauth-utils/error-extraction.js +80 -0
  189. package/dist/providers/auth/oauth-utils/error-extraction.js.map +1 -0
  190. package/dist/providers/auth/oauth-utils/index.d.ts +7 -0
  191. package/dist/providers/auth/oauth-utils/index.js +8 -0
  192. package/dist/providers/auth/oauth-utils/index.js.map +1 -0
  193. package/dist/providers/auth/token-refresh/index.d.ts +6 -0
  194. package/dist/providers/auth/token-refresh/index.js +7 -0
  195. package/dist/providers/auth/token-refresh/index.js.map +1 -0
  196. package/dist/providers/auth/token-refresh/token-state.d.ts +17 -0
  197. package/dist/providers/auth/token-refresh/token-state.js +30 -0
  198. package/dist/providers/auth/token-refresh/token-state.js.map +1 -0
  199. package/dist/providers/auth/token-storage/index.d.ts +7 -0
  200. package/dist/providers/auth/token-storage/index.js +8 -0
  201. package/dist/providers/auth/token-storage/index.js.map +1 -0
  202. package/dist/providers/auth/token-storage/token-file-resolver.d.ts +12 -0
  203. package/dist/providers/auth/token-storage/token-file-resolver.js +117 -0
  204. package/dist/providers/auth/token-storage/token-file-resolver.js.map +1 -0
  205. package/dist/providers/auth/token-storage/token-persistence.d.ts +22 -0
  206. package/dist/providers/auth/token-storage/token-persistence.js +86 -0
  207. package/dist/providers/auth/token-storage/token-persistence.js.map +1 -0
  208. package/dist/providers/auth/tokenfile-auth.js +12 -9
  209. package/dist/providers/auth/tokenfile-auth.js.map +1 -1
  210. package/dist/providers/core/api/provider-config.d.ts +8 -0
  211. package/dist/providers/core/config/camoufox-launcher.d.ts +1 -0
  212. package/dist/providers/core/config/camoufox-launcher.js +40 -9
  213. package/dist/providers/core/config/camoufox-launcher.js.map +1 -1
  214. package/dist/providers/core/config/oauth-flows.js +7 -2
  215. package/dist/providers/core/config/oauth-flows.js.map +1 -1
  216. package/dist/providers/core/config/provider-debug-hooks.d.ts +0 -12
  217. package/dist/providers/core/config/provider-debug-hooks.js +16 -56
  218. package/dist/providers/core/config/provider-debug-hooks.js.map +1 -1
  219. package/dist/providers/core/config/provider-debug-output-utils.d.ts +38 -0
  220. package/dist/providers/core/config/provider-debug-output-utils.js +46 -0
  221. package/dist/providers/core/config/provider-debug-output-utils.js.map +1 -0
  222. package/dist/providers/core/config/provider-oauth-configs.js +13 -9
  223. package/dist/providers/core/config/provider-oauth-configs.js.map +1 -1
  224. package/dist/providers/core/runtime/antigravity-request-type.d.ts +2 -0
  225. package/dist/providers/core/runtime/antigravity-request-type.js +126 -0
  226. package/dist/providers/core/runtime/antigravity-request-type.js.map +1 -0
  227. package/dist/providers/core/runtime/base-provider-runtime-helpers.d.ts +27 -0
  228. package/dist/providers/core/runtime/base-provider-runtime-helpers.js +105 -0
  229. package/dist/providers/core/runtime/base-provider-runtime-helpers.js.map +1 -0
  230. package/dist/providers/core/runtime/base-provider-series-cooldown.d.ts +19 -0
  231. package/dist/providers/core/runtime/base-provider-series-cooldown.js +363 -0
  232. package/dist/providers/core/runtime/base-provider-series-cooldown.js.map +1 -0
  233. package/dist/providers/core/runtime/base-provider.d.ts +4 -35
  234. package/dist/providers/core/runtime/base-provider.js +20 -501
  235. package/dist/providers/core/runtime/base-provider.js.map +1 -1
  236. package/dist/providers/core/runtime/deepseek-http-provider-helpers.d.ts +32 -0
  237. package/dist/providers/core/runtime/deepseek-http-provider-helpers.js +301 -0
  238. package/dist/providers/core/runtime/deepseek-http-provider-helpers.js.map +1 -0
  239. package/dist/providers/core/runtime/deepseek-http-provider.d.ts +0 -3
  240. package/dist/providers/core/runtime/deepseek-http-provider.js +5 -127
  241. package/dist/providers/core/runtime/deepseek-http-provider.js.map +1 -1
  242. package/dist/providers/core/runtime/deepseek-session-pow-helpers.d.ts +21 -0
  243. package/dist/providers/core/runtime/deepseek-session-pow-helpers.js +99 -0
  244. package/dist/providers/core/runtime/deepseek-session-pow-helpers.js.map +1 -0
  245. package/dist/providers/core/runtime/deepseek-session-pow.js +13 -108
  246. package/dist/providers/core/runtime/deepseek-session-pow.js.map +1 -1
  247. package/dist/providers/core/runtime/gemini-cli-http-provider.d.ts +0 -15
  248. package/dist/providers/core/runtime/gemini-cli-http-provider.js +13 -303
  249. package/dist/providers/core/runtime/gemini-cli-http-provider.js.map +1 -1
  250. package/dist/providers/core/runtime/gemini-cli-response-postprocessor.d.ts +9 -0
  251. package/dist/providers/core/runtime/gemini-cli-response-postprocessor.js +85 -0
  252. package/dist/providers/core/runtime/gemini-cli-response-postprocessor.js.map +1 -0
  253. package/dist/providers/core/runtime/gemini-http-provider.js +2 -2
  254. package/dist/providers/core/runtime/gemini-http-provider.js.map +1 -1
  255. package/dist/providers/core/runtime/gemini-sse-normalizer.d.ts +25 -0
  256. package/dist/providers/core/runtime/gemini-sse-normalizer.js +159 -0
  257. package/dist/providers/core/runtime/gemini-sse-normalizer.js.map +1 -0
  258. package/dist/providers/core/runtime/http-request-executor.js +1 -48
  259. package/dist/providers/core/runtime/http-request-executor.js.map +1 -1
  260. package/dist/providers/core/runtime/http-transport-provider.d.ts +2 -48
  261. package/dist/providers/core/runtime/http-transport-provider.js +158 -1273
  262. package/dist/providers/core/runtime/http-transport-provider.js.map +1 -1
  263. package/dist/providers/core/runtime/provider-bootstrap-utils.d.ts +20 -0
  264. package/dist/providers/core/runtime/provider-bootstrap-utils.js +78 -0
  265. package/dist/providers/core/runtime/provider-bootstrap-utils.js.map +1 -0
  266. package/dist/providers/core/runtime/provider-factory-helpers.d.ts +19 -0
  267. package/dist/providers/core/runtime/provider-factory-helpers.js +203 -0
  268. package/dist/providers/core/runtime/provider-factory-helpers.js.map +1 -0
  269. package/dist/providers/core/runtime/provider-factory.d.ts +9 -7
  270. package/dist/providers/core/runtime/provider-factory.js +57 -214
  271. package/dist/providers/core/runtime/provider-factory.js.map +1 -1
  272. package/dist/providers/core/runtime/provider-family-profile-utils.d.ts +23 -0
  273. package/dist/providers/core/runtime/provider-family-profile-utils.js +57 -0
  274. package/dist/providers/core/runtime/provider-family-profile-utils.js.map +1 -0
  275. package/dist/providers/core/runtime/provider-http-executor-utils.d.ts +32 -0
  276. package/dist/providers/core/runtime/provider-http-executor-utils.js +92 -0
  277. package/dist/providers/core/runtime/provider-http-executor-utils.js.map +1 -0
  278. package/dist/providers/core/runtime/provider-iflow-business-error-utils.d.ts +15 -0
  279. package/dist/providers/core/runtime/provider-iflow-business-error-utils.js +49 -0
  280. package/dist/providers/core/runtime/provider-iflow-business-error-utils.js.map +1 -0
  281. package/dist/providers/core/runtime/provider-request-executor-deps-factory.d.ts +29 -0
  282. package/dist/providers/core/runtime/provider-request-executor-deps-factory.js +41 -0
  283. package/dist/providers/core/runtime/provider-request-executor-deps-factory.js.map +1 -0
  284. package/dist/providers/core/runtime/provider-request-header-orchestrator.d.ts +30 -0
  285. package/dist/providers/core/runtime/provider-request-header-orchestrator.js +91 -0
  286. package/dist/providers/core/runtime/provider-request-header-orchestrator.js.map +1 -0
  287. package/dist/providers/core/runtime/provider-request-preprocessor.d.ts +5 -0
  288. package/dist/providers/core/runtime/provider-request-preprocessor.js +39 -0
  289. package/dist/providers/core/runtime/provider-request-preprocessor.js.map +1 -0
  290. package/dist/providers/core/runtime/provider-request-shaping-utils.d.ts +37 -0
  291. package/dist/providers/core/runtime/provider-request-shaping-utils.js +65 -0
  292. package/dist/providers/core/runtime/provider-request-shaping-utils.js.map +1 -0
  293. package/dist/providers/core/runtime/provider-response-postprocessor.d.ts +7 -0
  294. package/dist/providers/core/runtime/provider-response-postprocessor.js +28 -0
  295. package/dist/providers/core/runtime/provider-response-postprocessor.js.map +1 -0
  296. package/dist/providers/core/runtime/provider-runtime-utils.d.ts +16 -0
  297. package/dist/providers/core/runtime/provider-runtime-utils.js +51 -0
  298. package/dist/providers/core/runtime/provider-runtime-utils.js.map +1 -0
  299. package/dist/providers/core/runtime/responses-provider-helpers.d.ts +37 -0
  300. package/dist/providers/core/runtime/responses-provider-helpers.js +212 -0
  301. package/dist/providers/core/runtime/responses-provider-helpers.js.map +1 -0
  302. package/dist/providers/core/runtime/responses-provider.d.ts +0 -10
  303. package/dist/providers/core/runtime/responses-provider.js +14 -224
  304. package/dist/providers/core/runtime/responses-provider.js.map +1 -1
  305. package/dist/providers/core/runtime/runtime-endpoint-resolver.d.ts +21 -0
  306. package/dist/providers/core/runtime/runtime-endpoint-resolver.js +64 -0
  307. package/dist/providers/core/runtime/runtime-endpoint-resolver.js.map +1 -0
  308. package/dist/providers/core/runtime/service-profile-resolver.d.ts +29 -0
  309. package/dist/providers/core/runtime/service-profile-resolver.js +88 -0
  310. package/dist/providers/core/runtime/service-profile-resolver.js.map +1 -0
  311. package/dist/providers/core/runtime/transport/auth-mode-utils.d.ts +13 -0
  312. package/dist/providers/core/runtime/transport/auth-mode-utils.js +43 -0
  313. package/dist/providers/core/runtime/transport/auth-mode-utils.js.map +1 -0
  314. package/dist/providers/core/runtime/transport/auth-provider-factory.d.ts +37 -0
  315. package/dist/providers/core/runtime/transport/auth-provider-factory.js +131 -0
  316. package/dist/providers/core/runtime/transport/auth-provider-factory.js.map +1 -0
  317. package/dist/providers/core/runtime/transport/header-utils.d.ts +15 -0
  318. package/dist/providers/core/runtime/transport/header-utils.js +85 -0
  319. package/dist/providers/core/runtime/transport/header-utils.js.map +1 -0
  320. package/dist/providers/core/runtime/transport/iflow-signer.d.ts +12 -0
  321. package/dist/providers/core/runtime/transport/iflow-signer.js +63 -0
  322. package/dist/providers/core/runtime/transport/iflow-signer.js.map +1 -0
  323. package/dist/providers/core/runtime/transport/index.d.ts +15 -0
  324. package/dist/providers/core/runtime/transport/index.js +16 -0
  325. package/dist/providers/core/runtime/transport/index.js.map +1 -0
  326. package/dist/providers/core/runtime/transport/oauth-header-preflight.d.ts +12 -0
  327. package/dist/providers/core/runtime/transport/oauth-header-preflight.js +56 -0
  328. package/dist/providers/core/runtime/transport/oauth-header-preflight.js.map +1 -0
  329. package/dist/providers/core/runtime/transport/oauth-recovery-handler.d.ts +34 -0
  330. package/dist/providers/core/runtime/transport/oauth-recovery-handler.js +126 -0
  331. package/dist/providers/core/runtime/transport/oauth-recovery-handler.js.map +1 -0
  332. package/dist/providers/core/runtime/transport/provider-payload-utils.d.ts +21 -0
  333. package/dist/providers/core/runtime/transport/provider-payload-utils.js +88 -0
  334. package/dist/providers/core/runtime/transport/provider-payload-utils.js.map +1 -0
  335. package/dist/providers/core/runtime/transport/request-header-builder.d.ts +24 -0
  336. package/dist/providers/core/runtime/transport/request-header-builder.js +90 -0
  337. package/dist/providers/core/runtime/transport/request-header-builder.js.map +1 -0
  338. package/dist/providers/core/runtime/transport/runtime-detector.d.ts +22 -0
  339. package/dist/providers/core/runtime/transport/runtime-detector.js +63 -0
  340. package/dist/providers/core/runtime/transport/runtime-detector.js.map +1 -0
  341. package/dist/providers/core/runtime/transport/session-header-utils.d.ts +8 -0
  342. package/dist/providers/core/runtime/transport/session-header-utils.js +72 -0
  343. package/dist/providers/core/runtime/transport/session-header-utils.js.map +1 -0
  344. package/dist/providers/core/runtime/vision-debug-utils.d.ts +2 -0
  345. package/dist/providers/core/runtime/vision-debug-utils.js +31 -0
  346. package/dist/providers/core/runtime/vision-debug-utils.js.map +1 -1
  347. package/dist/providers/core/strategies/oauth-auth-code-flow.d.ts +13 -0
  348. package/dist/providers/core/strategies/oauth-auth-code-flow.js +272 -55
  349. package/dist/providers/core/strategies/oauth-auth-code-flow.js.map +1 -1
  350. package/dist/providers/core/utils/snapshot-writer-buffer.d.ts +13 -0
  351. package/dist/providers/core/utils/snapshot-writer-buffer.js +39 -0
  352. package/dist/providers/core/utils/snapshot-writer-buffer.js.map +1 -0
  353. package/dist/providers/core/utils/snapshot-writer.js +75 -54
  354. package/dist/providers/core/utils/snapshot-writer.js.map +1 -1
  355. package/dist/providers/profile/families/antigravity-profile.js +2 -10
  356. package/dist/providers/profile/families/antigravity-profile.js.map +1 -1
  357. package/dist/providers/profile/families/deepseek-profile.d.ts +2 -0
  358. package/dist/providers/profile/families/deepseek-profile.js +110 -0
  359. package/dist/providers/profile/families/deepseek-profile.js.map +1 -0
  360. package/dist/providers/profile/families/iflow-profile.js +89 -10
  361. package/dist/providers/profile/families/iflow-profile.js.map +1 -1
  362. package/dist/providers/profile/provider-profile-loader.d.ts +5 -0
  363. package/dist/providers/profile/provider-profile-loader.js +35 -0
  364. package/dist/providers/profile/provider-profile-loader.js.map +1 -1
  365. package/dist/providers/profile/provider-profile.d.ts +16 -1
  366. package/dist/runtime/runtime-flags.js +1 -1
  367. package/dist/runtime/runtime-flags.js.map +1 -1
  368. package/dist/runtime/wasm-runtime/index.d.ts +56 -0
  369. package/dist/runtime/wasm-runtime/index.js +69 -0
  370. package/dist/runtime/wasm-runtime/index.js.map +1 -0
  371. package/dist/scripts/camoufox/launch-auth.mjs +158 -10
  372. package/dist/server/handlers/handler-response-utils.d.ts +13 -0
  373. package/dist/server/handlers/handler-response-utils.js +427 -0
  374. package/dist/server/handlers/handler-response-utils.js.map +1 -0
  375. package/dist/server/handlers/handler-utils.d.ts +2 -11
  376. package/dist/server/handlers/handler-utils.js +21 -421
  377. package/dist/server/handlers/handler-utils.js.map +1 -1
  378. package/dist/server/runtime/http-server/clock-client-reaper.d.ts +23 -0
  379. package/dist/server/runtime/http-server/clock-client-reaper.js +159 -0
  380. package/dist/server/runtime/http-server/clock-client-reaper.js.map +1 -0
  381. package/dist/server/runtime/http-server/clock-client-registry-utils.d.ts +87 -0
  382. package/dist/server/runtime/http-server/clock-client-registry-utils.js +276 -0
  383. package/dist/server/runtime/http-server/clock-client-registry-utils.js.map +1 -0
  384. package/dist/server/runtime/http-server/clock-client-registry.d.ts +5 -50
  385. package/dist/server/runtime/http-server/clock-client-registry.js +74 -320
  386. package/dist/server/runtime/http-server/clock-client-registry.js.map +1 -1
  387. package/dist/server/runtime/http-server/clock-client-route-utils.d.ts +12 -0
  388. package/dist/server/runtime/http-server/clock-client-route-utils.js +210 -0
  389. package/dist/server/runtime/http-server/clock-client-route-utils.js.map +1 -0
  390. package/dist/server/runtime/http-server/clock-client-routes.js +27 -201
  391. package/dist/server/runtime/http-server/clock-client-routes.js.map +1 -1
  392. package/dist/server/runtime/http-server/clock-daemon-log-throttle.d.ts +12 -0
  393. package/dist/server/runtime/http-server/clock-daemon-log-throttle.js +56 -0
  394. package/dist/server/runtime/http-server/clock-daemon-log-throttle.js.map +1 -0
  395. package/dist/server/runtime/http-server/daemon-admin/control-handler.js +143 -14
  396. package/dist/server/runtime/http-server/daemon-admin/control-handler.js.map +1 -1
  397. package/dist/server/runtime/http-server/daemon-admin/credentials-handler-utils.d.ts +19 -0
  398. package/dist/server/runtime/http-server/daemon-admin/credentials-handler-utils.js +107 -0
  399. package/dist/server/runtime/http-server/daemon-admin/credentials-handler-utils.js.map +1 -0
  400. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js +2 -104
  401. package/dist/server/runtime/http-server/daemon-admin/credentials-handler.js.map +1 -1
  402. package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.d.ts +28 -0
  403. package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js +298 -0
  404. package/dist/server/runtime/http-server/daemon-admin/providers-handler-routing-utils.js.map +1 -0
  405. package/dist/server/runtime/http-server/daemon-admin/providers-handler-utils.d.ts +22 -0
  406. package/dist/server/runtime/http-server/daemon-admin/providers-handler-utils.js +211 -0
  407. package/dist/server/runtime/http-server/daemon-admin/providers-handler-utils.js.map +1 -0
  408. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js +25 -454
  409. package/dist/server/runtime/http-server/daemon-admin/providers-handler.js.map +1 -1
  410. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js +81 -32
  411. package/dist/server/runtime/http-server/daemon-admin/quota-handler.js.map +1 -1
  412. package/dist/server/runtime/http-server/daemon-admin/routecodex-x7e-gate.d.ts +22 -0
  413. package/dist/server/runtime/http-server/daemon-admin/routecodex-x7e-gate.js +70 -0
  414. package/dist/server/runtime/http-server/daemon-admin/routecodex-x7e-gate.js.map +1 -0
  415. package/dist/server/runtime/http-server/executor/antigravity-detector.d.ts +34 -0
  416. package/dist/server/runtime/http-server/executor/antigravity-detector.js +118 -0
  417. package/dist/server/runtime/http-server/executor/antigravity-detector.js.map +1 -0
  418. package/dist/server/runtime/http-server/executor/env-config.d.ts +13 -0
  419. package/dist/server/runtime/http-server/executor/env-config.js +20 -0
  420. package/dist/server/runtime/http-server/executor/env-config.js.map +1 -0
  421. package/dist/server/runtime/http-server/executor/index.d.ts +11 -0
  422. package/dist/server/runtime/http-server/executor/index.js +18 -0
  423. package/dist/server/runtime/http-server/executor/index.js.map +1 -0
  424. package/dist/server/runtime/http-server/executor/provider-request-context.d.ts +20 -0
  425. package/dist/server/runtime/http-server/executor/provider-request-context.js +38 -0
  426. package/dist/server/runtime/http-server/executor/provider-request-context.js.map +1 -0
  427. package/dist/server/runtime/http-server/executor/provider-response-converter.d.ts +23 -0
  428. package/dist/server/runtime/http-server/executor/provider-response-converter.js +337 -0
  429. package/dist/server/runtime/http-server/executor/provider-response-converter.js.map +1 -0
  430. package/dist/server/runtime/http-server/executor/provider-response-utils.d.ts +8 -0
  431. package/dist/server/runtime/http-server/executor/provider-response-utils.js +93 -0
  432. package/dist/server/runtime/http-server/executor/provider-response-utils.js.map +1 -0
  433. package/dist/server/runtime/http-server/executor/provider-runtime-resolver.d.ts +23 -0
  434. package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js +85 -0
  435. package/dist/server/runtime/http-server/executor/provider-runtime-resolver.js.map +1 -0
  436. package/dist/server/runtime/http-server/executor/request-executor-core-utils.d.ts +7 -0
  437. package/dist/server/runtime/http-server/executor/request-executor-core-utils.js +39 -0
  438. package/dist/server/runtime/http-server/executor/request-executor-core-utils.js.map +1 -0
  439. package/dist/server/runtime/http-server/executor/request-retry-helpers.d.ts +16 -0
  440. package/dist/server/runtime/http-server/executor/request-retry-helpers.js +218 -0
  441. package/dist/server/runtime/http-server/executor/request-retry-helpers.js.map +1 -0
  442. package/dist/server/runtime/http-server/executor/retry-engine.d.ts +21 -0
  443. package/dist/server/runtime/http-server/executor/retry-engine.js +73 -0
  444. package/dist/server/runtime/http-server/executor/retry-engine.js.map +1 -0
  445. package/dist/server/runtime/http-server/executor/sse-error-handler.d.ts +14 -0
  446. package/dist/server/runtime/http-server/executor/sse-error-handler.js +127 -0
  447. package/dist/server/runtime/http-server/executor/sse-error-handler.js.map +1 -0
  448. package/dist/server/runtime/http-server/executor/usage-aggregator.d.ts +39 -0
  449. package/dist/server/runtime/http-server/executor/usage-aggregator.js +177 -0
  450. package/dist/server/runtime/http-server/executor/usage-aggregator.js.map +1 -0
  451. package/dist/server/runtime/http-server/executor/usage-logger.d.ts +7 -0
  452. package/dist/server/runtime/http-server/executor/usage-logger.js +13 -0
  453. package/dist/server/runtime/http-server/executor/usage-logger.js.map +1 -0
  454. package/dist/server/runtime/http-server/executor/utils.d.ts +21 -0
  455. package/dist/server/runtime/http-server/executor/utils.js +62 -0
  456. package/dist/server/runtime/http-server/executor/utils.js.map +1 -0
  457. package/dist/server/runtime/http-server/executor-metadata.js +83 -2
  458. package/dist/server/runtime/http-server/executor-metadata.js.map +1 -1
  459. package/dist/server/runtime/http-server/executor-response.js +17 -9
  460. package/dist/server/runtime/http-server/executor-response.js.map +1 -1
  461. package/dist/server/runtime/http-server/http-server-bootstrap.d.ts +31 -0
  462. package/dist/server/runtime/http-server/http-server-bootstrap.js +367 -0
  463. package/dist/server/runtime/http-server/http-server-bootstrap.js.map +1 -0
  464. package/dist/server/runtime/http-server/http-server-clock-daemon.d.ts +5 -0
  465. package/dist/server/runtime/http-server/http-server-clock-daemon.js +242 -0
  466. package/dist/server/runtime/http-server/http-server-clock-daemon.js.map +1 -0
  467. package/dist/server/runtime/http-server/http-server-legacy-pipeline.d.ts +2 -0
  468. package/dist/server/runtime/http-server/http-server-legacy-pipeline.js +65 -0
  469. package/dist/server/runtime/http-server/http-server-legacy-pipeline.js.map +1 -0
  470. package/dist/server/runtime/http-server/http-server-lifecycle.d.ts +27 -0
  471. package/dist/server/runtime/http-server/http-server-lifecycle.js +285 -0
  472. package/dist/server/runtime/http-server/http-server-lifecycle.js.map +1 -0
  473. package/dist/server/runtime/http-server/http-server-runtime-providers.d.ts +10 -0
  474. package/dist/server/runtime/http-server/http-server-runtime-providers.js +415 -0
  475. package/dist/server/runtime/http-server/http-server-runtime-providers.js.map +1 -0
  476. package/dist/server/runtime/http-server/http-server-runtime-setup.d.ts +2 -0
  477. package/dist/server/runtime/http-server/http-server-runtime-setup.js +93 -0
  478. package/dist/server/runtime/http-server/http-server-runtime-setup.js.map +1 -0
  479. package/dist/server/runtime/http-server/index.d.ts +2 -46
  480. package/dist/server/runtime/http-server/index.js +96 -2615
  481. package/dist/server/runtime/http-server/index.js.map +1 -1
  482. package/dist/server/runtime/http-server/request-executor.d.ts +8 -21
  483. package/dist/server/runtime/http-server/request-executor.js +94 -956
  484. package/dist/server/runtime/http-server/request-executor.js.map +1 -1
  485. package/dist/server/runtime/http-server/routes.js +2 -2
  486. package/dist/server/runtime/http-server/routes.js.map +1 -1
  487. package/dist/server/runtime/http-server/servertool-admin-state.d.ts +42 -0
  488. package/dist/server/runtime/http-server/servertool-admin-state.js +210 -0
  489. package/dist/server/runtime/http-server/servertool-admin-state.js.map +1 -0
  490. package/dist/server/runtime/http-server/stats-manager-internals.d.ts +96 -0
  491. package/dist/server/runtime/http-server/stats-manager-internals.js +311 -0
  492. package/dist/server/runtime/http-server/stats-manager-internals.js.map +1 -0
  493. package/dist/server/runtime/http-server/stats-manager-table.d.ts +6 -0
  494. package/dist/server/runtime/http-server/stats-manager-table.js +135 -0
  495. package/dist/server/runtime/http-server/stats-manager-table.js.map +1 -0
  496. package/dist/server/runtime/http-server/stats-manager.d.ts +0 -23
  497. package/dist/server/runtime/http-server/stats-manager.js +95 -483
  498. package/dist/server/runtime/http-server/stats-manager.js.map +1 -1
  499. package/dist/server/utils/client-connection-state.js +61 -0
  500. package/dist/server/utils/client-connection-state.js.map +1 -1
  501. package/dist/server/utils/request-id-manager.d.ts +6 -0
  502. package/dist/server/utils/request-id-manager.js +105 -15
  503. package/dist/server/utils/request-id-manager.js.map +1 -1
  504. package/dist/server/utils/stage-logger.js +14 -4
  505. package/dist/server/utils/stage-logger.js.map +1 -1
  506. package/dist/server-lifecycle/index.d.ts +6 -0
  507. package/dist/server-lifecycle/index.js +7 -0
  508. package/dist/server-lifecycle/index.js.map +1 -0
  509. package/dist/server-lifecycle/port-utils.d.ts +18 -0
  510. package/dist/server-lifecycle/port-utils.js +204 -0
  511. package/dist/server-lifecycle/port-utils.js.map +1 -0
  512. package/dist/sharedmodule/process-snapshot.d.ts +26 -0
  513. package/dist/sharedmodule/process-snapshot.js +141 -0
  514. package/dist/sharedmodule/process-snapshot.js.map +1 -0
  515. package/dist/token-daemon/index.js +10 -3
  516. package/dist/token-daemon/index.js.map +1 -1
  517. package/dist/token-daemon/token-daemon.js +9 -11
  518. package/dist/token-daemon/token-daemon.js.map +1 -1
  519. package/dist/token-daemon/token-utils.d.ts +1 -1
  520. package/dist/token-daemon/token-utils.js +19 -3
  521. package/dist/token-daemon/token-utils.js.map +1 -1
  522. package/dist/tools/semantic-replay-snapshot-loader.d.ts +4 -0
  523. package/dist/tools/semantic-replay-snapshot-loader.js +396 -0
  524. package/dist/tools/semantic-replay-snapshot-loader.js.map +1 -0
  525. package/dist/tools/semantic-replay.js +2 -393
  526. package/dist/tools/semantic-replay.js.map +1 -1
  527. package/dist/utils/daemon-stop-intent.d.ts +17 -0
  528. package/dist/utils/daemon-stop-intent.js +104 -0
  529. package/dist/utils/daemon-stop-intent.js.map +1 -0
  530. package/dist/utils/key-429-tracker.js +6 -5
  531. package/dist/utils/key-429-tracker.js.map +1 -1
  532. package/dist/utils/pipeline-health-manager.js +7 -6
  533. package/dist/utils/pipeline-health-manager.js.map +1 -1
  534. package/dist/utils/process-lifecycle-logger.js +45 -1
  535. package/dist/utils/process-lifecycle-logger.js.map +1 -1
  536. package/dist/utils/runtime-exit-forensics.d.ts +2 -2
  537. package/dist/utils/runtime-exit-forensics.js +10 -5
  538. package/dist/utils/runtime-exit-forensics.js.map +1 -1
  539. package/dist/utils/snapshot-writer.js +3 -3
  540. package/dist/utils/snapshot-writer.js.map +1 -1
  541. package/docs/QUOTA_MANAGER_V3.md +3 -0
  542. package/docs/VIRTUAL_ROUTER_PRIORITY_AND_HEALTH.md +114 -0
  543. package/docs/daemon-admin-ui.html +268 -11
  544. package/docs/file-line-limit-gate.md +30 -0
  545. package/docs/refactoring/host-164.3-responsibility-migration.md +62 -0
  546. package/docs/release-iflow-400-gate.md +58 -0
  547. package/docs/replay-evidence-iflow-400.txt +33 -0
  548. package/docs/stop-message-auto.md +4 -3
  549. package/package.json +4 -3
  550. package/scripts/auth-iflow-manual.mjs +13 -23
  551. package/scripts/camoufox/launch-auth.mjs +158 -10
  552. package/scripts/ci/check-file-line-limit.mjs +149 -0
  553. package/scripts/copy-compat-assets.mjs +26 -0
  554. package/scripts/tests/ci-jest.mjs +4 -0
  555. package/scripts/verify-codex-error-samples.mjs +27 -6
@@ -0,0 +1,72 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { CODEX_IDENTIFIER_MAX_LENGTH } from '../../../../constants/index.js';
3
+ import { HeaderUtils } from './header-utils.js';
4
+ import { ProviderPayloadUtils } from './provider-payload-utils.js';
5
+ export class SessionHeaderUtils {
6
+ static normalizeCodexClientHeaders(headers, codexUaMode) {
7
+ if (!headers) {
8
+ return undefined;
9
+ }
10
+ if (!codexUaMode) {
11
+ return headers;
12
+ }
13
+ const normalizedHeaders = { ...headers };
14
+ HeaderUtils.copyHeaderValue(normalizedHeaders, headers, 'anthropic-session-id', 'session_id');
15
+ HeaderUtils.copyHeaderValue(normalizedHeaders, headers, 'anthropic-conversation-id', 'conversation_id');
16
+ HeaderUtils.copyHeaderValue(normalizedHeaders, headers, 'anthropic-user-agent', 'User-Agent');
17
+ HeaderUtils.copyHeaderValue(normalizedHeaders, headers, 'anthropic-originator', 'originator');
18
+ return normalizedHeaders;
19
+ }
20
+ static ensureCodexSessionHeaders(headers, runtimeMetadata) {
21
+ HeaderUtils.setHeaderIfMissing(headers, 'session_id', SessionHeaderUtils.buildCodexIdentifier('session', runtimeMetadata));
22
+ HeaderUtils.setHeaderIfMissing(headers, 'conversation_id', SessionHeaderUtils.buildCodexIdentifier('conversation', runtimeMetadata));
23
+ }
24
+ static extractClientHeaders(source) {
25
+ if (!source || typeof source !== 'object') {
26
+ return undefined;
27
+ }
28
+ const candidates = [];
29
+ const metadataNode = source.metadata;
30
+ if (metadataNode && typeof metadataNode === 'object') {
31
+ const headersNode = metadataNode.clientHeaders;
32
+ if (headersNode) {
33
+ candidates.push(headersNode);
34
+ }
35
+ }
36
+ const directNode = source.clientHeaders;
37
+ if (directNode) {
38
+ candidates.push(directNode);
39
+ }
40
+ for (const candidate of candidates) {
41
+ const normalized = ProviderPayloadUtils.normalizeClientHeaders(candidate);
42
+ if (normalized) {
43
+ return normalized;
44
+ }
45
+ }
46
+ return undefined;
47
+ }
48
+ static buildCodexIdentifier(kind, runtimeMetadata) {
49
+ const fallbackId = runtimeMetadata?.metadata && typeof runtimeMetadata.metadata === 'object'
50
+ ? runtimeMetadata.metadata.clientRequestId
51
+ : undefined;
52
+ const requestId = runtimeMetadata?.requestId ?? fallbackId;
53
+ const routeName = runtimeMetadata?.routeName;
54
+ const suffix = (requestId ?? `req-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`)
55
+ .toString()
56
+ .replace(/[^A-Za-z0-9_-]/g, '_');
57
+ const parts = ['codex_cli', kind, suffix];
58
+ if (routeName) {
59
+ parts.push(routeName.replace(/[^A-Za-z0-9_-]/g, '_'));
60
+ }
61
+ return SessionHeaderUtils.enforceCodexIdentifierLength(parts.join('_'));
62
+ }
63
+ static enforceCodexIdentifierLength(value) {
64
+ if (value.length <= CODEX_IDENTIFIER_MAX_LENGTH) {
65
+ return value;
66
+ }
67
+ const hash = createHash('sha256').update(value).digest('hex').slice(0, 10);
68
+ const keep = Math.max(1, CODEX_IDENTIFIER_MAX_LENGTH - hash.length - 1);
69
+ return `${value.slice(0, keep)}_${hash}`;
70
+ }
71
+ }
72
+ //# sourceMappingURL=session-header-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-header-utils.js","sourceRoot":"","sources":["../../../../../src/providers/core/runtime/transport/session-header-utils.ts"],"names":[],"mappings":"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"}
@@ -10,4 +10,6 @@ export declare function shouldCaptureVisionDebug(source?: UnknownObject, fallbac
10
10
  };
11
11
  export declare function summarizeVisionMessages(source?: UnknownObject): string;
12
12
  export declare function buildVisionSnapshotPayload(payload: UnknownObject, extras?: Record<string, unknown>): Record<string, unknown>;
13
+ export declare function logVisionDebugSummary(stage: string, payload: UnknownObject): void;
14
+ export declare function captureVisionDebugPayloadSnapshot(stage: 'provider-preprocess-debug' | 'provider-body-debug', payload: UnknownObject): Promise<void>;
13
15
  export {};
@@ -1,4 +1,5 @@
1
1
  import { extractProviderRuntimeMetadata } from './provider-runtime-metadata.js';
2
+ import { writeProviderSnapshot } from '../utils/snapshot-writer.js';
2
3
  const DEBUG_ENV_KEY = 'ROUTECODEX_VISION_DEBUG';
3
4
  const truthyValues = new Set(['1', 'true', 'yes']);
4
5
  function visionDebugEnabled() {
@@ -111,4 +112,34 @@ export function buildVisionSnapshotPayload(payload, extras) {
111
112
  }
112
113
  return snapshot;
113
114
  }
115
+ export function logVisionDebugSummary(stage, payload) {
116
+ const debug = shouldCaptureVisionDebug(payload);
117
+ if (!debug.enabled) {
118
+ return;
119
+ }
120
+ const summary = summarizeVisionMessages(payload);
121
+ const label = debug.routeName ?? 'vision';
122
+ console.debug(`[vision-debug][${stage}] route=${label} request=${debug.requestId ?? '-'} ${summary}`);
123
+ }
124
+ export async function captureVisionDebugPayloadSnapshot(stage, payload) {
125
+ const debug = shouldCaptureVisionDebug(payload);
126
+ if (!debug.enabled || !debug.requestId) {
127
+ return;
128
+ }
129
+ try {
130
+ const metadataNode = payload.metadata;
131
+ const entryEndpoint = metadataNode && typeof metadataNode === 'object' && typeof metadataNode.entryEndpoint === 'string'
132
+ ? metadataNode.entryEndpoint
133
+ : undefined;
134
+ await writeProviderSnapshot({
135
+ phase: stage,
136
+ requestId: debug.requestId,
137
+ data: buildVisionSnapshotPayload(payload),
138
+ entryEndpoint
139
+ });
140
+ }
141
+ catch {
142
+ // snapshot is best-effort only
143
+ }
144
+ }
114
145
  //# sourceMappingURL=vision-debug-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vision-debug-utils.js","sourceRoot":"","sources":["../../../../src/providers/core/runtime/vision-debug-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vision-debug-utils.js","sourceRoot":"","sources":["../../../../src/providers/core/runtime/vision-debug-utils.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,19 @@ export declare class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
40
40
  * 处理令牌后激活(如API密钥交换)
41
41
  */
42
42
  private handlePostTokenActivation;
43
+ private resolveExpiresInSeconds;
44
+ private readPositiveNumber;
45
+ private readNonEmptyString;
46
+ private normalizeTokenResponse;
47
+ private buildTokenRequestHeaders;
48
+ /**
49
+ * Token endpoint requests keep headers minimal and bypass provider-level common headers,
50
+ * matching iFlow CLI behavior and avoiding compat surprises.
51
+ */
52
+ private requestTokenEndpoint;
53
+ private isIflowOAuthProvider;
54
+ private fetchIflowUserInfoWithRetry;
55
+ private applyAuthRedirectParams;
43
56
  private coerceStoredToken;
44
57
  private ensureStoredToken;
45
58
  /**
@@ -67,15 +67,7 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
67
67
  // 3.2 更新授权URL中的重定向参数(与本地回调服务一致),再打开浏览器
68
68
  try {
69
69
  const urlObj = new URL(authCodeData.authUrl);
70
- const style = authCodeData.flowStyle;
71
- if (style === 'web' || style === 'legacy') {
72
- // iflow web 登录样式:redirect=<redirectUri> & state=<state>
73
- // 由 URLSearchParams 负责一次性编码,避免双重编码;state 保持独立参数
74
- urlObj.searchParams.set('redirect', serverResult.redirectUri);
75
- }
76
- else {
77
- urlObj.searchParams.set('redirect_uri', serverResult.redirectUri);
78
- }
70
+ this.applyAuthRedirectParams(urlObj, authCodeData.flowStyle, serverResult.redirectUri, authCodeData.state);
79
71
  authCodeData.authUrl = urlObj.toString();
80
72
  authCodeData.redirectUri = serverResult.redirectUri;
81
73
  }
@@ -127,6 +119,9 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
127
119
  }
128
120
  const styleEnv = (process.env.IFLOW_AUTH_STYLE || '').toLowerCase();
129
121
  const style = isIflowHost
122
+ // Official iFlow CLI auth URL shape:
123
+ // redirect=<encoded callback>&state=<state>&client_id=...
124
+ // In URLSearchParams this corresponds to "web" style (redirect raw + state top-level).
130
125
  ? normalizeFlowStyle(styleEnv, 'web')
131
126
  : styleEnv === 'legacy'
132
127
  ? 'legacy'
@@ -136,12 +131,9 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
136
131
  const redirectUri = this.config.client.redirectUri;
137
132
  authUrl.searchParams.set('loginMethod', 'phone');
138
133
  authUrl.searchParams.set('type', 'phone');
139
- authUrl.searchParams.set('redirect', encodeURIComponent(redirectUri));
134
+ authUrl.searchParams.set('redirect', redirectUri);
140
135
  authUrl.searchParams.set('state', state);
141
136
  authUrl.searchParams.set('client_id', this.config.client.clientId);
142
- // 可选:保留 PKCE 参数(服务端可能忽略)
143
- authUrl.searchParams.set('code_challenge', codeChallenge);
144
- authUrl.searchParams.set('code_challenge_method', 'S256');
145
137
  }
146
138
  else if (style === 'legacy') {
147
139
  // 老式 iflow Web 登录参数(state 融合在 redirect),兼容历史
@@ -150,8 +142,6 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
150
142
  authUrl.searchParams.set('type', 'phone');
151
143
  authUrl.searchParams.set('redirect', `${encodeURIComponent(redirectUri)}&state=${state}`);
152
144
  authUrl.searchParams.set('client_id', this.config.client.clientId);
153
- authUrl.searchParams.set('code_challenge', codeChallenge);
154
- authUrl.searchParams.set('code_challenge_method', 'S256');
155
145
  }
156
146
  else {
157
147
  // 标准 OAuth2 授权码样式
@@ -186,7 +176,8 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
186
176
  async startCallbackServer(state, codeVerifier) {
187
177
  const http = await import('http');
188
178
  const url = await import('url');
189
- // 固定回调路径为 /oauth2callback,但监听地址放宽为所有本地地址,避免 IPv4/IPv6 解析差异导致浏览器可访问但 Node 端口未监听
179
+ // 回调路径固定为 /oauth2callback;监听地址放宽为所有本地地址,
180
+ // 避免 localhost 在 IPv4/IPv6 解析差异时出现连接拒绝。
190
181
  const configured = this.config.client.redirectUri;
191
182
  let redirectHost = 'localhost';
192
183
  let port = 8080;
@@ -203,12 +194,46 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
203
194
  }
204
195
  }
205
196
  catch { /* ignore parsing errors */ }
197
+ const envPortRaw = String(process.env.OAUTH_CALLBACK_PORT || '').trim();
198
+ if (this.isIflowOAuthProvider() && !envPortRaw) {
199
+ // Align with official iFlow CLI: choose ephemeral callback port by default.
200
+ port = 0;
201
+ }
202
+ if (envPortRaw) {
203
+ const parsedEnvPort = Number(envPortRaw);
204
+ if (!Number.isFinite(parsedEnvPort) || parsedEnvPort <= 0 || parsedEnvPort > 65535) {
205
+ throw new Error(`Invalid value for OAUTH_CALLBACK_PORT: "${envPortRaw}"`);
206
+ }
207
+ port = parsedEnvPort;
208
+ }
206
209
  let timeoutHandle = null;
210
+ let listeningPort = port;
211
+ let startupSettled = false;
212
+ let resolveStartup = null;
213
+ let rejectStartup = null;
214
+ const startupPromise = new Promise((resolve, reject) => {
215
+ resolveStartup = resolve;
216
+ rejectStartup = reject;
217
+ });
218
+ const settleStartupSuccess = (boundPort) => {
219
+ if (startupSettled) {
220
+ return;
221
+ }
222
+ startupSettled = true;
223
+ resolveStartup?.(boundPort);
224
+ };
225
+ const settleStartupFailure = (message) => {
226
+ if (startupSettled) {
227
+ return;
228
+ }
229
+ startupSettled = true;
230
+ rejectStartup?.(new Error(message));
231
+ };
207
232
  const callbackPromise = new Promise((resolve, reject) => {
208
233
  const server = http.createServer(async (req, res) => {
209
234
  try {
210
235
  logOAuthDebug(`[OAuth] Callback server received request: ${req.url}`);
211
- const full = new url.URL(req.url || '/', `http://${redirectHost}:${port}`);
236
+ const full = new url.URL(req.url || '/', `http://${redirectHost}:${listeningPort}`);
212
237
  const reqPath = full.pathname || '';
213
238
  const okPath = reqPath === pathName || /oauth.*callback/i.test(reqPath);
214
239
  if (!req.url || !okPath) {
@@ -289,20 +314,43 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
289
314
  reject(error instanceof Error ? error : new Error(String(error)));
290
315
  }
291
316
  });
292
- // 添加服务器错误处理
317
+ let retriedWithEphemeralPort = false;
293
318
  server.on('error', (error) => {
294
319
  logOAuthDebug(`[OAuth] Callback server error: ${error.message}`);
320
+ if (error.code === 'EADDRINUSE' && !retriedWithEphemeralPort) {
321
+ retriedWithEphemeralPort = true;
322
+ console.warn(`[OAuth] Callback port ${port} is in use; retrying with an ephemeral local port.`);
323
+ try {
324
+ server.listen(0);
325
+ return;
326
+ }
327
+ catch (listenError) {
328
+ const msg = listenError instanceof Error ? listenError.message : String(listenError);
329
+ const startupMsg = `Failed to retry callback server on ephemeral port: ${msg}`;
330
+ settleStartupFailure(startupMsg);
331
+ if (timeoutHandle) {
332
+ clearTimeout(timeoutHandle);
333
+ }
334
+ reject(new Error(startupMsg));
335
+ return;
336
+ }
337
+ }
295
338
  console.error('[OAuth] Callback server failed to start or encountered an error:', error.message);
339
+ const startupMsg = `Failed to start callback server: ${error.message}`;
340
+ settleStartupFailure(startupMsg);
296
341
  if (timeoutHandle) {
297
342
  clearTimeout(timeoutHandle);
298
343
  }
299
- reject(new Error(`Failed to start callback server: ${error.message}`));
344
+ reject(new Error(startupMsg));
300
345
  });
301
- // 等待服务器完全启动
302
- // 不指定 host,监听所有地址,避免 localhost 解析到仅 IPv6 或仅 IPv4 时造成连接被拒绝
303
- server.listen(port, () => {
304
- logOAuthDebug(`[OAuth] Callback server listening on 0.0.0.0:${port}${pathName} (redirect host=${redirectHost})`);
305
- console.log(`[OAuth] Waiting for OAuth callback at http://${redirectHost}:${port}${pathName}`);
346
+ server.on('listening', () => {
347
+ const addr = server.address();
348
+ if (addr && typeof addr === 'object' && 'port' in addr && typeof addr.port === 'number') {
349
+ listeningPort = addr.port;
350
+ }
351
+ settleStartupSuccess(listeningPort);
352
+ logOAuthDebug(`[OAuth] Callback server listening on 0.0.0.0:${listeningPort}${pathName} (redirect host=${redirectHost})`);
353
+ console.log(`[OAuth] Waiting for OAuth callback at http://${redirectHost}:${listeningPort}${pathName}`);
306
354
  console.log(`[OAuth] You have 10 minutes to complete the authentication in your browser`);
307
355
  try {
308
356
  const envBrowser = String(process.env.ROUTECODEX_OAUTH_BROWSER || '').trim().toLowerCase();
@@ -327,9 +375,21 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
327
375
  reject(new Error('OAuth callback timeout after 10 minutes'));
328
376
  }, 10 * 60 * 1000);
329
377
  });
378
+ // 不指定 host,监听所有地址,避免 localhost 解析到仅 IPv6 或仅 IPv4 时造成连接被拒绝
379
+ try {
380
+ server.listen(port);
381
+ }
382
+ catch (listenError) {
383
+ const msg = listenError instanceof Error ? listenError.message : String(listenError);
384
+ const startupMsg = `Failed to start callback server: ${msg}`;
385
+ settleStartupFailure(startupMsg);
386
+ reject(new Error(startupMsg));
387
+ }
330
388
  });
389
+ // Wait for callback server to bind. This also allows EADDRINUSE fallback to settle final port.
390
+ listeningPort = await startupPromise;
331
391
  // 更新重定向URI(使用配置中的路径或默认)
332
- const redirectUri = `http://${redirectHost}:${port}${pathName}`;
392
+ const redirectUri = `http://${redirectHost}:${listeningPort}${pathName}`;
333
393
  logOAuthDebug(`[OAuth] Callback redirect URI: ${redirectUri}`);
334
394
  return { callbackPromise, redirectUri };
335
395
  }
@@ -343,13 +403,7 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
343
403
  const serverResult = await this.startCallbackServer(data.state, data.codeVerifier);
344
404
  // 更新授权URL中的重定向参数
345
405
  const authUrl = new URL(data.authUrl);
346
- if (data.flowStyle === 'web' || data.flowStyle === 'legacy') {
347
- // 由 URLSearchParams 统一编码,不手动 encodeURIComponent,避免双重编码
348
- authUrl.searchParams.set('redirect', serverResult.redirectUri);
349
- }
350
- else {
351
- authUrl.searchParams.set('redirect_uri', serverResult.redirectUri);
352
- }
406
+ this.applyAuthRedirectParams(authUrl, data.flowStyle, serverResult.redirectUri, data.state);
353
407
  data.authUrl = authUrl.toString();
354
408
  data.redirectUri = serverResult.redirectUri;
355
409
  // 等待回调
@@ -375,21 +429,12 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
375
429
  if (this.config.client.clientSecret) {
376
430
  formData.append('client_secret', this.config.client.clientSecret);
377
431
  }
378
- // iflow web 登录样式常用 Basic(client_id:client_secret)
379
- const tokenHeaders = { 'Content-Type': 'application/x-www-form-urlencoded' };
380
- if (this.config.client.clientSecret) {
381
- const basic = Buffer.from(`${this.config.client.clientId}:${this.config.client.clientSecret}`).toString('base64');
382
- tokenHeaders['Authorization'] = `Basic ${basic}`;
383
- }
384
- const response = await this.makeRequest(this.config.endpoints.tokenUrl, {
385
- method: 'POST',
386
- headers: tokenHeaders,
387
- body: formData
388
- });
432
+ const response = await this.requestTokenEndpoint(formData);
389
433
  if (!response.ok) {
390
434
  throw await this.parseErrorResponse(response);
391
435
  }
392
- return await response.json();
436
+ const raw = await response.json();
437
+ return this.normalizeTokenResponse(raw);
393
438
  }
394
439
  /**
395
440
  * 生成状态参数
@@ -405,7 +450,10 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
405
450
  // 尝试获取API密钥(如果有用户信息端点)
406
451
  if (this.config.features?.supportsApiKeyExchange && this.config.endpoints.userInfoUrl && tokenResponse.access_token) {
407
452
  try {
408
- const userInfoResponse = await this.makeRequest(`${this.config.endpoints.userInfoUrl}?accessToken=${encodeURIComponent(tokenResponse.access_token)}`, { method: 'GET' });
453
+ const userInfoUrl = `${this.config.endpoints.userInfoUrl}?accessToken=${encodeURIComponent(tokenResponse.access_token)}`;
454
+ const userInfoResponse = this.isIflowOAuthProvider()
455
+ ? await this.fetchIflowUserInfoWithRetry(userInfoUrl)
456
+ : await this.makeRequest(userInfoUrl, { method: 'GET' });
409
457
  if (userInfoResponse.ok) {
410
458
  const userInfo = await userInfoResponse.json();
411
459
  const apiKey = typeof userInfo.apiKey === 'string'
@@ -433,11 +481,167 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
433
481
  }
434
482
  }
435
483
  // 转换为标准格式
436
- const expiresAt = Date.now() + (tokenResponse.expires_in * 1000);
484
+ const expiresIn = this.resolveExpiresInSeconds(tokenResponse);
485
+ const expiresAt = Date.now() + (expiresIn * 1000);
486
+ enrichedToken.expires_in = expiresIn;
437
487
  enrichedToken.expires_at = expiresAt;
438
488
  enrichedToken.expired = new Date(expiresAt).toISOString();
439
489
  return enrichedToken;
440
490
  }
491
+ resolveExpiresInSeconds(tokenResponse) {
492
+ const parsePositiveNumber = (value) => {
493
+ if (typeof value === 'number' && Number.isFinite(value) && value > 0) {
494
+ return value;
495
+ }
496
+ if (typeof value === 'string') {
497
+ const parsed = Number(value.trim());
498
+ if (Number.isFinite(parsed) && parsed > 0) {
499
+ return parsed;
500
+ }
501
+ }
502
+ return null;
503
+ };
504
+ const direct = parsePositiveNumber(tokenResponse.expires_in) ??
505
+ parsePositiveNumber(tokenResponse.expiresIn) ??
506
+ parsePositiveNumber(tokenResponse.expires);
507
+ if (direct !== null) {
508
+ return direct;
509
+ }
510
+ const storedExpiresAt = this.tokenStorage?.expires_at;
511
+ const remainingMs = typeof storedExpiresAt === 'number' && Number.isFinite(storedExpiresAt)
512
+ ? storedExpiresAt - Date.now()
513
+ : NaN;
514
+ if (Number.isFinite(remainingMs) && remainingMs > 60_000) {
515
+ return Math.floor(remainingMs / 1000);
516
+ }
517
+ // Fallback: avoid NaN timestamp crashes when provider omits expires_in.
518
+ return 3600;
519
+ }
520
+ readPositiveNumber(value) {
521
+ if (typeof value === 'number' && Number.isFinite(value) && value > 0) {
522
+ return value;
523
+ }
524
+ if (typeof value === 'string') {
525
+ const parsed = Number(value.trim());
526
+ if (Number.isFinite(parsed) && parsed > 0) {
527
+ return parsed;
528
+ }
529
+ }
530
+ return null;
531
+ }
532
+ readNonEmptyString(value) {
533
+ return typeof value === 'string' && value.trim().length > 0 ? value.trim() : undefined;
534
+ }
535
+ normalizeTokenResponse(payload) {
536
+ const root = payload && typeof payload === 'object'
537
+ ? payload
538
+ : {};
539
+ const data = root.data && typeof root.data === 'object'
540
+ ? root.data
541
+ : root;
542
+ const accessToken = this.readNonEmptyString(data.access_token) ??
543
+ this.readNonEmptyString(data.accessToken) ??
544
+ this.readNonEmptyString(data.token);
545
+ const message = this.readNonEmptyString(root.message) ??
546
+ this.readNonEmptyString(root.msg) ??
547
+ this.readNonEmptyString(root.error_description) ??
548
+ this.readNonEmptyString(root.error?.message);
549
+ const code = this.readNonEmptyString(root.code);
550
+ const markedFailure = root.success === false || (code !== undefined && code !== '' && code !== '0');
551
+ if (!accessToken) {
552
+ if (markedFailure) {
553
+ throw new Error(`OAuth token endpoint rejected request${code ? ` (${code})` : ''}: ${message || 'unknown error'}`);
554
+ }
555
+ throw new Error(`OAuth token endpoint response missing access_token${message ? `: ${message}` : ''}`);
556
+ }
557
+ return {
558
+ access_token: accessToken,
559
+ refresh_token: this.readNonEmptyString(data.refresh_token) ??
560
+ this.readNonEmptyString(data.refreshToken),
561
+ token_type: this.readNonEmptyString(data.token_type) ??
562
+ this.readNonEmptyString(data.tokenType),
563
+ scope: this.readNonEmptyString(data.scope),
564
+ expires_in: this.readPositiveNumber(data.expires_in) ??
565
+ this.readPositiveNumber(data.expiresIn) ??
566
+ this.readPositiveNumber(data.expires) ??
567
+ undefined,
568
+ resource_url: this.readNonEmptyString(data.resource_url) ?? this.readNonEmptyString(data.resourceUrl),
569
+ apiKey: this.readNonEmptyString(data.apiKey) ?? this.readNonEmptyString(data.api_key)
570
+ };
571
+ }
572
+ buildTokenRequestHeaders() {
573
+ const tokenHeaders = {
574
+ 'Content-Type': 'application/x-www-form-urlencoded'
575
+ };
576
+ if (this.config.client.clientSecret) {
577
+ const basic = Buffer.from(`${this.config.client.clientId}:${this.config.client.clientSecret}`).toString('base64');
578
+ tokenHeaders.Authorization = `Basic ${basic}`;
579
+ }
580
+ return tokenHeaders;
581
+ }
582
+ /**
583
+ * Token endpoint requests keep headers minimal and bypass provider-level common headers,
584
+ * matching iFlow CLI behavior and avoiding compat surprises.
585
+ */
586
+ async requestTokenEndpoint(formData) {
587
+ return this.httpClient(this.config.endpoints.tokenUrl, {
588
+ method: 'POST',
589
+ headers: this.buildTokenRequestHeaders(),
590
+ body: formData.toString()
591
+ });
592
+ }
593
+ isIflowOAuthProvider() {
594
+ const authUrl = String(this.config.endpoints.authorizationUrl || '').toLowerCase();
595
+ const tokenUrl = String(this.config.endpoints.tokenUrl || '').toLowerCase();
596
+ const userInfoUrl = String(this.config.endpoints.userInfoUrl || '').toLowerCase();
597
+ return (authUrl.includes('iflow.cn') ||
598
+ tokenUrl.includes('iflow.cn/oauth/token') ||
599
+ userInfoUrl.includes('iflow.cn/api/oauth/getuserinfo'));
600
+ }
601
+ async fetchIflowUserInfoWithRetry(url) {
602
+ const retryDelaysMs = [1000, 2000, 3000];
603
+ let lastError;
604
+ for (let attempt = 0; attempt < retryDelaysMs.length; attempt++) {
605
+ try {
606
+ const response = await this.httpClient(url, { method: 'GET' });
607
+ if (response.ok) {
608
+ return response;
609
+ }
610
+ const shouldRetry = (response.status >= 500 || response.status === 408 || response.status === 429) &&
611
+ attempt < retryDelaysMs.length - 1;
612
+ if (!shouldRetry) {
613
+ return response;
614
+ }
615
+ }
616
+ catch (error) {
617
+ lastError = error;
618
+ if (attempt >= retryDelaysMs.length - 1) {
619
+ break;
620
+ }
621
+ }
622
+ await new Promise((resolve) => setTimeout(resolve, retryDelaysMs[attempt]));
623
+ }
624
+ throw lastError instanceof Error ? lastError : new Error('Failed to fetch iFlow user info');
625
+ }
626
+ applyAuthRedirectParams(authUrl, flowStyle, redirectUri, state) {
627
+ if (flowStyle === 'legacy') {
628
+ // Keep parity with official iFlow CLI:
629
+ // redirect=<encodeURIComponent(redirectUri)>&state=<state> (state embedded in redirect).
630
+ authUrl.searchParams.delete('state');
631
+ authUrl.searchParams.delete('redirect_uri');
632
+ authUrl.searchParams.set('redirect', `${encodeURIComponent(redirectUri)}&state=${state}`);
633
+ return;
634
+ }
635
+ if (flowStyle === 'web') {
636
+ authUrl.searchParams.delete('redirect_uri');
637
+ authUrl.searchParams.set('redirect', redirectUri);
638
+ authUrl.searchParams.set('state', state);
639
+ return;
640
+ }
641
+ authUrl.searchParams.delete('redirect');
642
+ authUrl.searchParams.delete('state');
643
+ authUrl.searchParams.set('redirect_uri', redirectUri);
644
+ }
441
645
  coerceStoredToken(token) {
442
646
  if (!token || typeof token !== 'object') {
443
647
  return null;
@@ -446,7 +650,25 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
446
650
  const candidate = record.token && typeof record.token === 'object'
447
651
  ? record.token
448
652
  : record;
449
- if (typeof candidate.access_token === 'string' && typeof candidate.expires_in === 'number') {
653
+ if (typeof candidate.access_token !== 'string') {
654
+ return null;
655
+ }
656
+ const expiresInRaw = candidate.expires_in ?? candidate.expiresIn ?? candidate.expires;
657
+ if (typeof expiresInRaw === 'number' && Number.isFinite(expiresInRaw) && expiresInRaw > 0) {
658
+ candidate.expires_in = expiresInRaw;
659
+ return candidate;
660
+ }
661
+ if (typeof expiresInRaw === 'string') {
662
+ const parsed = Number(expiresInRaw.trim());
663
+ if (Number.isFinite(parsed) && parsed > 0) {
664
+ candidate.expires_in = parsed;
665
+ return candidate;
666
+ }
667
+ }
668
+ if (typeof candidate.expires_at === 'number' && Number.isFinite(candidate.expires_at)) {
669
+ return candidate;
670
+ }
671
+ if (typeof candidate.expired === 'string' && Number.isFinite(Date.parse(candidate.expired))) {
450
672
  return candidate;
451
673
  }
452
674
  return null;
@@ -479,17 +701,12 @@ export class OAuthAuthCodeFlowStrategy extends BaseOAuthFlowStrategy {
479
701
  if (this.config.client.clientSecret) {
480
702
  formData.append('client_secret', this.config.client.clientSecret);
481
703
  }
482
- const response = await this.makeRequest(this.config.endpoints.tokenUrl, {
483
- method: 'POST',
484
- headers: {
485
- 'Content-Type': 'application/x-www-form-urlencoded'
486
- },
487
- body: formData
488
- });
704
+ const response = await this.requestTokenEndpoint(formData);
489
705
  if (!response.ok) {
490
706
  throw await this.parseErrorResponse(response);
491
707
  }
492
- const tokenData = await response.json();
708
+ const raw = await response.json();
709
+ const tokenData = this.normalizeTokenResponse(raw);
493
710
  // Google OAuth doesn't always return a new refresh_token during refresh
494
711
  // Preserve the original refresh_token if not provided in the new response
495
712
  if (!tokenData.refresh_token && refreshToken) {