@tencent-ai/agent-sdk 0.3.252 → 0.3.253

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 (208) hide show
  1. package/cli/CHANGELOG.md +22 -0
  2. package/cli/dist/codebuddy-headless.js +73 -58
  3. package/cli/dist/codebuddy-lite-wb.mjs +96 -81
  4. package/cli/dist/lazy/{427.68132a34.js → 427.74b982af.js} +4 -4
  5. package/cli/dist/lazy-headless/{834.391fb41e.js → 834.3b674e07.js} +9 -9
  6. package/cli/dist-server/3556.codebuddy.js +1 -1
  7. package/cli/dist-server/6037.codebuddy.js +1 -1
  8. package/cli/dist-server/6784.codebuddy.js +1 -1
  9. package/cli/dist-server/codebuddy.js +45 -30
  10. package/cli/dist-server/types/node/agent/openai-agents-types.d.ts +5 -5
  11. package/cli/dist-server/types/node/mcp/mcp-sdk-values.d.ts +1 -1
  12. package/cli/dist-server/types/node/model/model-provider.d.ts +3 -1
  13. package/cli/dist-server/types/node/tools/a2a-get-task-tool.d.ts +139 -34
  14. package/cli/dist-server/types/node/tools/a2a-poll-retry.d.ts +46 -0
  15. package/cli/package.json +1 -1
  16. package/cli/product.cloudhosted.json +2 -2
  17. package/cli/product.internal.json +2 -2
  18. package/cli/product.ioa.json +2 -2
  19. package/cli/product.json +4 -4
  20. package/cli/product.selfhosted.json +2 -2
  21. package/package.json +1 -1
  22. package/cli/dist-server/types/node/acp/acp-view-rewind-to.d.ts +0 -34
  23. package/cli/dist-server/types/node/acp/acp-web-ui-client.d.ts +0 -22
  24. package/cli/dist-server/types/node/acp/usage-by-category-calculator.d.ts +0 -45
  25. package/cli/dist-server/types/node/acp/usage-by-category-char-weight.d.ts +0 -9
  26. package/cli/dist-server/types/node/acp/usage-by-category-distribute.d.ts +0 -6
  27. package/cli/dist-server/types/node/acp/usage-by-category-tools-split.d.ts +0 -11
  28. package/cli/dist-server/types/node/agent-home/agent-home-envelope-body.d.ts +0 -54
  29. package/cli/dist-server/types/node/agent-home/agent-home-inbox-events.d.ts +0 -14
  30. package/cli/dist-server/types/node/agent-home/agent-home-room-contacts.d.ts +0 -30
  31. package/cli/dist-server/types/node/agent-team/permission-bridge-client.d.ts +0 -32
  32. package/cli/dist-server/types/node/agent-team/permission-bridge-protocol.d.ts +0 -47
  33. package/cli/dist-server/types/node/agent-view/handoff-policy.d.ts +0 -80
  34. package/cli/dist-server/types/node/agent-view/job-respawn-prefs.d.ts +0 -12
  35. package/cli/dist-server/types/node/agent-view/session-handoff.d.ts +0 -161
  36. package/cli/dist-server/types/node/ask/index.d.ts +0 -3
  37. package/cli/dist-server/types/node/bash-sandbox/bash-sandbox-manager.d.ts +0 -125
  38. package/cli/dist-server/types/node/bash-sandbox/legacy-sandbox-shell-service.d.ts +0 -33
  39. package/cli/dist-server/types/node/bash-sandbox/managed-security-policy.d.ts +0 -6
  40. package/cli/dist-server/types/node/bash-sandbox/workbuddy-directory-protection.d.ts +0 -12
  41. package/cli/dist-server/types/node/checkpoint/checkpoint-service.d.ts +0 -70
  42. package/cli/dist-server/types/node/checkpoint/file-changes-controller.d.ts +0 -29
  43. package/cli/dist-server/types/node/checkpoint/file-track-service.d.ts +0 -11
  44. package/cli/dist-server/types/node/checkpoint/file-version-manager.d.ts +0 -10
  45. package/cli/dist-server/types/node/checkpoint/file-version-store.d.ts +0 -9
  46. package/cli/dist-server/types/node/checkpoint/file-version-update-strategies.d.ts +0 -62
  47. package/cli/dist-server/types/node/command/add-dir-command-executor.d.ts +0 -11
  48. package/cli/dist-server/types/node/command/agents-command-executor.d.ts +0 -9
  49. package/cli/dist-server/types/node/command/auto-compact-command-executor.d.ts +0 -20
  50. package/cli/dist-server/types/node/command/background-command-executor.d.ts +0 -29
  51. package/cli/dist-server/types/node/command/btw-command-executor.d.ts +0 -19
  52. package/cli/dist-server/types/node/command/clear-command-executor.d.ts +0 -17
  53. package/cli/dist-server/types/node/command/config-command-executor.d.ts +0 -15
  54. package/cli/dist-server/types/node/command/context-command-executor.d.ts +0 -42
  55. package/cli/dist-server/types/node/command/copy-command-executor.d.ts +0 -10
  56. package/cli/dist-server/types/node/command/cost-command-executor.d.ts +0 -13
  57. package/cli/dist-server/types/node/command/debug-command-executor.d.ts +0 -15
  58. package/cli/dist-server/types/node/command/deep-research-command-executor.d.ts +0 -25
  59. package/cli/dist-server/types/node/command/doctor-command-executor.d.ts +0 -7
  60. package/cli/dist-server/types/node/command/effort-command-executor.d.ts +0 -46
  61. package/cli/dist-server/types/node/command/exit-command-executor.d.ts +0 -14
  62. package/cli/dist-server/types/node/command/export-command-executor.d.ts +0 -7
  63. package/cli/dist-server/types/node/command/feedback-command-executor.d.ts +0 -9
  64. package/cli/dist-server/types/node/command/fork-bg-command-executor.d.ts +0 -30
  65. package/cli/dist-server/types/node/command/fork-command-executor.d.ts +0 -28
  66. package/cli/dist-server/types/node/command/goal-command-executor.d.ts +0 -50
  67. package/cli/dist-server/types/node/command/handoff-message-adapter.d.ts +0 -9
  68. package/cli/dist-server/types/node/command/help-command-executor.d.ts +0 -9
  69. package/cli/dist-server/types/node/command/hooks-command-executor.d.ts +0 -9
  70. package/cli/dist-server/types/node/command/ide-command-executor.d.ts +0 -11
  71. package/cli/dist-server/types/node/command/mcp-command-executor.d.ts +0 -15
  72. package/cli/dist-server/types/node/command/memory-command-executor.d.ts +0 -17
  73. package/cli/dist-server/types/node/command/mode-command-executor.d.ts +0 -11
  74. package/cli/dist-server/types/node/command/model-command-executor.d.ts +0 -11
  75. package/cli/dist-server/types/node/command/model-image-to-image-command-executor.d.ts +0 -17
  76. package/cli/dist-server/types/node/command/model-image-to-video-command-executor.d.ts +0 -17
  77. package/cli/dist-server/types/node/command/model-lite-command-executor.d.ts +0 -17
  78. package/cli/dist-server/types/node/command/model-reasoning-command-executor.d.ts +0 -17
  79. package/cli/dist-server/types/node/command/model-text-to-image-command-executor.d.ts +0 -17
  80. package/cli/dist-server/types/node/command/model-text-to-video-command-executor.d.ts +0 -17
  81. package/cli/dist-server/types/node/command/multitask-command-executor.d.ts +0 -9
  82. package/cli/dist-server/types/node/command/permissions-command-executor.d.ts +0 -9
  83. package/cli/dist-server/types/node/command/plan-command-executor.d.ts +0 -11
  84. package/cli/dist-server/types/node/command/plugin-command-executor.d.ts +0 -25
  85. package/cli/dist-server/types/node/command/plugin-validate-command-executor.d.ts +0 -21
  86. package/cli/dist-server/types/node/command/release-notes-command-executor.d.ts +0 -18
  87. package/cli/dist-server/types/node/command/reload-plugins-command-executor.d.ts +0 -24
  88. package/cli/dist-server/types/node/command/remote-control-command-executor.d.ts +0 -44
  89. package/cli/dist-server/types/node/command/rename-command-executor.d.ts +0 -11
  90. package/cli/dist-server/types/node/command/reset-command-executor.d.ts +0 -9
  91. package/cli/dist-server/types/node/command/resume-command-executor.d.ts +0 -21
  92. package/cli/dist-server/types/node/command/rewind-command-executor.d.ts +0 -10
  93. package/cli/dist-server/types/node/command/sandbox-command-executor.d.ts +0 -20
  94. package/cli/dist-server/types/node/command/save-workflow-command-executor.d.ts +0 -43
  95. package/cli/dist-server/types/node/command/session-reset-notifier.d.ts +0 -23
  96. package/cli/dist-server/types/node/command/skills-command-executor.d.ts +0 -9
  97. package/cli/dist-server/types/node/command/stats-command-executor.d.ts +0 -11
  98. package/cli/dist-server/types/node/command/status-command-executor.d.ts +0 -11
  99. package/cli/dist-server/types/node/command/tasks-command-executor.d.ts +0 -9
  100. package/cli/dist-server/types/node/command/terminal-setup-command-executor.d.ts +0 -7
  101. package/cli/dist-server/types/node/command/theme-command-executor.d.ts +0 -7
  102. package/cli/dist-server/types/node/command/todos-command-executor.d.ts +0 -16
  103. package/cli/dist-server/types/node/command/upgrade-command-executor.d.ts +0 -13
  104. package/cli/dist-server/types/node/command/vim-command-executor.d.ts +0 -11
  105. package/cli/dist-server/types/node/command/workflows-command-executor.d.ts +0 -26
  106. package/cli/dist-server/types/node/feedback/feedback-protocol.d.ts +0 -32
  107. package/cli/dist-server/types/node/feedback/feedback-service.d.ts +0 -19
  108. package/cli/dist-server/types/node/feedback/index.d.ts +0 -2
  109. package/cli/dist-server/types/node/goal/goal-policy.d.ts +0 -55
  110. package/cli/dist-server/types/node/goal/goal-protocol.d.ts +0 -178
  111. package/cli/dist-server/types/node/goal/goal-service.d.ts +0 -201
  112. package/cli/dist-server/types/node/goal/goal-session-start-hook.d.ts +0 -24
  113. package/cli/dist-server/types/node/hooks/parse-frontmatter-hooks.d.ts +0 -42
  114. package/cli/dist-server/types/node/install/index.d.ts +0 -6
  115. package/cli/dist-server/types/node/install/install-controller.d.ts +0 -15
  116. package/cli/dist-server/types/node/install/install-env.d.ts +0 -12
  117. package/cli/dist-server/types/node/install/install-errors.d.ts +0 -46
  118. package/cli/dist-server/types/node/install/install-protocol.d.ts +0 -83
  119. package/cli/dist-server/types/node/install/install-service.d.ts +0 -36
  120. package/cli/dist-server/types/node/install/install-utils.d.ts +0 -7
  121. package/cli/dist-server/types/node/install/releases-service.d.ts +0 -18
  122. package/cli/dist-server/types/node/install/shell-setup.d.ts +0 -36
  123. package/cli/dist-server/types/node/mcp/mcp-cancellation.d.ts +0 -65
  124. package/cli/dist-server/types/node/mcp/mcp-controller.d.ts +0 -56
  125. package/cli/dist-server/types/node/mcp/mcp-model-id-header-helper.d.ts +0 -12
  126. package/cli/dist-server/types/node/mcp/mcp-oauth-callback-html.d.ts +0 -6
  127. package/cli/dist-server/types/node/mcp/mcp-oauth-controller.d.ts +0 -26
  128. package/cli/dist-server/types/node/mcp/mcp-output-storage.d.ts +0 -57
  129. package/cli/dist-server/types/node/mcp/mcp-server-override-impl.d.ts +0 -136
  130. package/cli/dist-server/types/node/mcp/mcp-server-override.d.ts +0 -29
  131. package/cli/dist-server/types/node/mcp/mcp-tool-result-sideband.d.ts +0 -26
  132. package/cli/dist-server/types/node/mcp/mcp-validate-middleware.d.ts +0 -25
  133. package/cli/dist-server/types/node/mcp/models/mcp-server.d.ts +0 -18
  134. package/cli/dist-server/types/node/mcp/node-websocket-transport.d.ts +0 -38
  135. package/cli/dist-server/types/node/mcp/official-mcp-egress-policy.d.ts +0 -17
  136. package/cli/dist-server/types/node/mcp/sdk-mcp-server.d.ts +0 -143
  137. package/cli/dist-server/types/node/mcp/sdk-mcp-transport.d.ts +0 -97
  138. package/cli/dist-server/types/node/message-queue/followup-queue.d.ts +0 -35
  139. package/cli/dist-server/types/node/message-queue/index.d.ts +0 -11
  140. package/cli/dist-server/types/node/plugins/concurrency.d.ts +0 -1
  141. package/cli/dist-server/types/node/plugins/dependency-resolver.d.ts +0 -43
  142. package/cli/dist-server/types/node/plugins/directory-plugin-cache-projection.d.ts +0 -2
  143. package/cli/dist-server/types/node/plugins/guards/index.d.ts +0 -2
  144. package/cli/dist-server/types/node/plugins/guards/weixinpay-integrity-guard.d.ts +0 -15
  145. package/cli/dist-server/types/node/plugins/installers/git-plugin-installer.d.ts +0 -42
  146. package/cli/dist-server/types/node/plugins/installers/git-subdir-plugin-installer.d.ts +0 -19
  147. package/cli/dist-server/types/node/plugins/installers/index.d.ts +0 -4
  148. package/cli/dist-server/types/node/plugins/installers/local-plugin-installer.d.ts +0 -40
  149. package/cli/dist-server/types/node/plugins/installers/npm-plugin-installer.d.ts +0 -23
  150. package/cli/dist-server/types/node/plugins/loaders/agent-loader.d.ts +0 -43
  151. package/cli/dist-server/types/node/plugins/loaders/command-loader.d.ts +0 -37
  152. package/cli/dist-server/types/node/plugins/loaders/hook-loader.d.ts +0 -55
  153. package/cli/dist-server/types/node/plugins/loaders/index.d.ts +0 -8
  154. package/cli/dist-server/types/node/plugins/loaders/lsp-loader.d.ts +0 -47
  155. package/cli/dist-server/types/node/plugins/loaders/mcp-loader.d.ts +0 -75
  156. package/cli/dist-server/types/node/plugins/loaders/output-style-loader.d.ts +0 -49
  157. package/cli/dist-server/types/node/plugins/loaders/plugin-loader-manager.d.ts +0 -49
  158. package/cli/dist-server/types/node/plugins/loaders/skill-loader.d.ts +0 -45
  159. package/cli/dist-server/types/node/plugins/marketplace-name-validator.d.ts +0 -50
  160. package/cli/dist-server/types/node/plugins/marketplace-path-safety.d.ts +0 -86
  161. package/cli/dist-server/types/node/plugins/marketplaces/base-marketplace.d.ts +0 -43
  162. package/cli/dist-server/types/node/plugins/marketplaces/builtin-marketplace-provider.d.ts +0 -22
  163. package/cli/dist-server/types/node/plugins/marketplaces/directory-marketplace.d.ts +0 -19
  164. package/cli/dist-server/types/node/plugins/marketplaces/git-availability-detector.d.ts +0 -62
  165. package/cli/dist-server/types/node/plugins/marketplaces/git-fallback-coordinator.d.ts +0 -42
  166. package/cli/dist-server/types/node/plugins/marketplaces/git-to-zip-url-converter.d.ts +0 -50
  167. package/cli/dist-server/types/node/plugins/marketplaces/github-marketplace.d.ts +0 -41
  168. package/cli/dist-server/types/node/plugins/marketplaces/http-marketplace.d.ts +0 -47
  169. package/cli/dist-server/types/node/plugins/marketplaces/index.d.ts +0 -13
  170. package/cli/dist-server/types/node/plugins/marketplaces/marketplace-config-manager.d.ts +0 -39
  171. package/cli/dist-server/types/node/plugins/marketplaces/marketplace-factory.d.ts +0 -11
  172. package/cli/dist-server/types/node/plugins/marketplaces/marketplace-storage.d.ts +0 -141
  173. package/cli/dist-server/types/node/plugins/marketplaces/marketplace-update-checker.d.ts +0 -38
  174. package/cli/dist-server/types/node/plugins/marketplaces/workspace-project-root.d.ts +0 -14
  175. package/cli/dist-server/types/node/plugins/marketplaces/zip-marketplace.d.ts +0 -134
  176. package/cli/dist-server/types/node/plugins/mcpb-handler.d.ts +0 -29
  177. package/cli/dist-server/types/node/plugins/plugin-controller.d.ts +0 -75
  178. package/cli/dist-server/types/node/plugins/plugin-error-collector.d.ts +0 -17
  179. package/cli/dist-server/types/node/plugins/plugin-install-stats-service.d.ts +0 -20
  180. package/cli/dist-server/types/node/plugins/plugin-manager.d.ts +0 -692
  181. package/cli/dist-server/types/node/plugins/plugin-policy-service.d.ts +0 -53
  182. package/cli/dist-server/types/node/plugins/plugin-validator.d.ts +0 -48
  183. package/cli/dist-server/types/node/plugins/zip-utils.d.ts +0 -93
  184. package/cli/dist-server/types/node/remote-control/clients/liveness-watchdog.d.ts +0 -56
  185. package/cli/dist-server/types/node/remote-control/clients/wecom-bot/wecom-bot-activity.d.ts +0 -23
  186. package/cli/dist-server/types/node/remote-control/clients/wecom-bot/wecom-bot-auth.d.ts +0 -64
  187. package/cli/dist-server/types/node/remote-control/clients/wecom-bot/wecom-bot-client-factory.d.ts +0 -47
  188. package/cli/dist-server/types/node/remote-control/clients/wecom-bot/wecom-bot-client.d.ts +0 -191
  189. package/cli/dist-server/types/node/remote-control/clients/wecom-bot/wecom-bot-inbound.d.ts +0 -7
  190. package/cli/dist-server/types/node/remote-control/clients/wecom-bot/wecom-bot-interaction.d.ts +0 -142
  191. package/cli/dist-server/types/node/remote-control/clients/wecom-bot/wecom-bot-live.d.ts +0 -78
  192. package/cli/dist-server/types/node/remote-control/clients/wecom-bot/wecom-bot-media.d.ts +0 -35
  193. package/cli/dist-server/types/node/remote-control/clients/wecom-bot/wecom-bot-qr-bind.d.ts +0 -49
  194. package/cli/dist-server/types/node/remote-control/clients/wecom-bot/wecom-bot-respond-queue.d.ts +0 -33
  195. package/cli/dist-server/types/node/remote-control/clients/wecom-bot/wecom-bot-types.d.ts +0 -207
  196. package/cli/dist-server/types/node/remote-control/remote-control-protocol.d.ts +0 -288
  197. package/cli/dist-server/types/node/remote-gateway/gateway-protocol.d.ts +0 -502
  198. package/cli/dist-server/types/node/remote-gateway/utils/qrcode-utils.d.ts +0 -16
  199. package/cli/dist-server/types/node/session/session-preview-utils.d.ts +0 -30
  200. package/cli/dist-server/types/node/settings/model-setting-utils.d.ts +0 -2
  201. package/cli/dist-server/types/node/tool-control/tool-control-policy.d.ts +0 -35
  202. package/cli/dist-server/types/node/tools/auto-mode/auto-mode-critique-client.d.ts +0 -51
  203. package/cli/dist-server/types/node/tools/auto-mode/auto-mode-strategy.d.ts +0 -19
  204. package/cli/dist-server/types/node/utils/add-dir-utils.d.ts +0 -20
  205. package/cli/dist-server/types/node/utils/compress-path.source.d.ts +0 -59
  206. package/cli/dist-server/types/node/vim/index.d.ts +0 -2
  207. package/cli/dist-server/types/node/vim/vim-manager.d.ts +0 -12
  208. package/cli/dist-server/types/node/vim/vim-protocol.d.ts +0 -24
@@ -1 +1 @@
1
- "use strict";exports.ids=["6037"],exports.modules={18420(e,t,i){i.r(t),i.d(t,{TraceServiceLifecycle:()=>P});var o,r,a,c,n,s,d=i(88523),l=i(86482),p=i(9151),f=i(92735),g=i(17611),u=i(56927),v=i(91623),y=i(51905),_=i(46712),h=i(32006),__decorate=function(e,t,i,o){var r,a=arguments.length,c=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,t,i,o);else for(var n=e.length-1;n>=0;n--)(r=e[n])&&(c=(a<3?r(c):a>3?r(t,i,c):r(t,i))||c);return a>3&&c&&Object.defineProperty(t,i,c),c},__metadata=function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};let P=class{initialize(){(0,g.JA)([]),this.traceCollectorProcessor&&(0,g.VP)(this.traceCollectorProcessor)}onStart(){process.env.DISABLE_TELEMETRY||(this.initTimestamp=Date.now(),this.initTracing().catch(e=>{this.logger.warn(`[TraceServiceLifecycle] initTracing failed (non-fatal): ${e}`)}),this.doInitialize())}doInitialize(){this.logger.setContext("TraceServiceLifecycle"),(0,u.h)(this.authenticationManager.currentSessionSubject.pipe((0,v.F)()),this.productManager.configuration.asObservable().pipe((0,v.F)())).pipe((0,y.B)(2e3)).subscribe(async()=>{try{if(this.initTimestamp&&Date.now()-this.initTimestamp<5e3)return;await this.initTracing()}catch(e){this.logger.warn(`re-initTracing failed: ${e}`)}})}async buildInitOptions(){let{platform:e,productName:t}=await this.clientInfoProvider.get(),i=_.PackageUtils.getCurrentPackageJson();return{serviceName:`${t}-${e}-${i.version}`}}async initTracing(){let e=await this.buildInitOptions();await this.traceService.init(e)}};__decorate([(0,d.Autowired)(f.Logger),__metadata("design:type","function"==typeof(o=void 0!==f.Logger&&f.Logger)?o:Object)],P.prototype,"logger",void 0),__decorate([(0,d.Autowired)(f.TraceService),__metadata("design:type","function"==typeof(r=void 0!==f.TraceService&&f.TraceService)?r:Object)],P.prototype,"traceService",void 0),__decorate([(0,d.Autowired)(p.ProductManager),__metadata("design:type","function"==typeof(a=void 0!==p.ProductManager&&p.ProductManager)?a:Object)],P.prototype,"productManager",void 0),__decorate([(0,d.Autowired)(p.ClientInfoProvider),__metadata("design:type","function"==typeof(c=void 0!==p.ClientInfoProvider&&p.ClientInfoProvider)?c:Object)],P.prototype,"clientInfoProvider",void 0),__decorate([(0,d.Autowired)(l.AuthenticationManager),__metadata("design:type","function"==typeof(n=void 0!==l.AuthenticationManager&&l.AuthenticationManager)?n:Object)],P.prototype,"authenticationManager",void 0),__decorate([(0,d.Autowired)(h.TraceCollectorProcessor),(0,d.Optional)(),__metadata("design:type","function"==typeof(s=void 0!==h.TraceCollectorProcessor&&h.TraceCollectorProcessor)?s:Object)],P.prototype,"traceCollectorProcessor",void 0),P=__decorate([(0,d.Component)(d.ApplicationLifecycle)],P)}};
1
+ "use strict";exports.ids=["6037"],exports.modules={18420(e,t,i){i.r(t),i.d(t,{TraceServiceLifecycle:()=>P});var o,r,a,c,n,s,d=i(88523),l=i(86482),p=i(9151),f=i(92735),g=i(56927),u=i(91623),v=i(51905),y=i(17611),_=i(46712),h=i(32006),__decorate=function(e,t,i,o){var r,a=arguments.length,c=a<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)c=Reflect.decorate(e,t,i,o);else for(var n=e.length-1;n>=0;n--)(r=e[n])&&(c=(a<3?r(c):a>3?r(t,i,c):r(t,i))||c);return a>3&&c&&Object.defineProperty(t,i,c),c},__metadata=function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};let P=class{initialize(){(0,y.JA)([]),this.traceCollectorProcessor&&(0,y.VP)(this.traceCollectorProcessor)}onStart(){process.env.DISABLE_TELEMETRY||(this.initTimestamp=Date.now(),this.initTracing().catch(e=>{this.logger.warn(`[TraceServiceLifecycle] initTracing failed (non-fatal): ${e}`)}),this.doInitialize())}doInitialize(){this.logger.setContext("TraceServiceLifecycle"),(0,g.h)(this.authenticationManager.currentSessionSubject.pipe((0,u.F)()),this.productManager.configuration.asObservable().pipe((0,u.F)())).pipe((0,v.B)(2e3)).subscribe(async()=>{try{if(this.initTimestamp&&Date.now()-this.initTimestamp<5e3)return;await this.initTracing()}catch(e){this.logger.warn(`re-initTracing failed: ${e}`)}})}async buildInitOptions(){let{platform:e,productName:t}=await this.clientInfoProvider.get(),i=_.PackageUtils.getCurrentPackageJson();return{serviceName:`${t}-${e}-${i.version}`}}async initTracing(){let e=await this.buildInitOptions();await this.traceService.init(e)}};__decorate([(0,d.Autowired)(f.Logger),__metadata("design:type","function"==typeof(o=void 0!==f.Logger&&f.Logger)?o:Object)],P.prototype,"logger",void 0),__decorate([(0,d.Autowired)(f.TraceService),__metadata("design:type","function"==typeof(r=void 0!==f.TraceService&&f.TraceService)?r:Object)],P.prototype,"traceService",void 0),__decorate([(0,d.Autowired)(p.ProductManager),__metadata("design:type","function"==typeof(a=void 0!==p.ProductManager&&p.ProductManager)?a:Object)],P.prototype,"productManager",void 0),__decorate([(0,d.Autowired)(p.ClientInfoProvider),__metadata("design:type","function"==typeof(c=void 0!==p.ClientInfoProvider&&p.ClientInfoProvider)?c:Object)],P.prototype,"clientInfoProvider",void 0),__decorate([(0,d.Autowired)(l.AuthenticationManager),__metadata("design:type","function"==typeof(n=void 0!==l.AuthenticationManager&&l.AuthenticationManager)?n:Object)],P.prototype,"authenticationManager",void 0),__decorate([(0,d.Autowired)(h.TraceCollectorProcessor),(0,d.Optional)(),__metadata("design:type","function"==typeof(s=void 0!==h.TraceCollectorProcessor&&h.TraceCollectorProcessor)?s:Object)],P.prototype,"traceCollectorProcessor",void 0),P=__decorate([(0,d.Component)(d.ApplicationLifecycle)],P)}};
@@ -1 +1 @@
1
- "use strict";exports.ids=["6784"],exports.modules={16256(e,t,r){r.r(t),r.d(t,{DEFAULT_FIRST_TOKEN_TIMEOUT_MS:()=>Q,DEFAULT_REQUEST_MAX_RETRIES:()=>Z,DEFAULT_STREAM_IDLE_TIMEOUT_MS:()=>W,DRAIN_BODY_TIMEOUT_MS:()=>er,MAX_REQUEST_MAX_RETRIES:()=>ee,ModelProviderImpl:()=>eo,REQUEST_RETRY_BASE_DELAY_MS:()=>z,REQUEST_RETRY_MAX_DELAY_MS:()=>J,WATCHDOG_MAX_BACKOFF_MS:()=>et,computeRequestRetryDelayMs:()=>computeRequestRetryDelayMs,extractMockE2EResponseDiagnostics:()=>extractMockE2EResponseDiagnostics,isRetryWatchdogEnabled:()=>isRetryWatchdogEnabled,resolveRequestMaxRetries:()=>resolveRequestMaxRetries,resolveTimeoutMs:()=>resolveTimeoutMs});var o,s,n,a,i,l,d,u,c,m,g,p,_=r(46193),h=r(57975),E=r(38522),f=r(88523),R=r(7268),y=r(14913),T=r(86482),A=r(51147),S=r(9151),I=r(92735),M=r(96453),v=r(19672),O=r(49839),C=r(20173),b=r(73122),$=r(66678),w=r(73502),D=r(94480),P=r(49484),L=r(35061),k=r(33678),N=r(54202),U=r(13498),q=r(66173),H=r(95629),x=r(84570),V=r(13945),B=r(46712),G=r(45214),F=r(1498),Y=r(19585),K=r(75990),__decorate=function(e,t,r,o){var s,n=arguments.length,a=n<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,o);else for(var i=e.length-1;i>=0;i--)(s=e[i])&&(a=(n<3?s(a):n>3?s(t,r,a):s(t,r))||a);return n>3&&a&&Object.defineProperty(t,r,a),a},__metadata=function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};let X=(0,h.promisify)(E.gunzip),Q=12e5,W=3e5;function resolveTimeoutMs(e,t){if(e){let t=parseInt(e,10);if(!isNaN(t)&&t>0)return t}return t}let z=500,J=32e3,Z=8,ee=15,et=3e5,er=5e3;function resolveRequestMaxRetries(e){if(void 0!==e&&""!==e){let t=parseInt(e,10);if(!isNaN(t)&&t>=0)return Math.min(t,ee)}return Z}function isRetryWatchdogEnabled(e){if("string"!=typeof e)return!1;let t=e.trim().toLowerCase();return"1"===t||"true"===t||"yes"===t}function computeRequestRetryDelayMs(e,t,r=J,o=Math.random){return null!=t&&t>0?Math.min(t,r):Math.min(z*Math.pow(2,Math.max(0,e-1)),r)*(1-.25*o())}function readResponseHeader(e,t){if(!e||"object"!=typeof e)return;try{let r=e.get?.(t);if(null!=r)return String(r)}catch{}let r=Object.keys(e).find(e=>e.toLowerCase()===t.toLowerCase()),o=r?e[r]:void 0;return null==o?void 0:String(o)}function extractMockE2EResponseDiagnostics(e){let t={traceId:readResponseHeader(e,"x-mock-trace-id"),requestId:readResponseHeader(e,"x-mock-request-id"),matchSource:readResponseHeader(e,"x-mock-match-source"),matchResult:readResponseHeader(e,"x-mock-match-result"),offset:readResponseHeader(e,"x-mock-offset"),responseId:readResponseHeader(e,"x-mock-response-id"),finishReason:readResponseHeader(e,"x-mock-finish-reason"),dataVersion:readResponseHeader(e,"x-mock-data-version"),instance:readResponseHeader(e,"x-mock-instance"),contentKind:readResponseHeader(e,"x-mock-content-kind")};return Object.values(t).some(e=>void 0!==e)?t:void 0}let eo=class{constructor(){this.modelRequestProcessors=[],this.modelCache=new Map}normalizeChatCompletionsUrl(e){let t=e.search(/[?#]/),r=t>=0?e.slice(t):"",o=t>=0?e.slice(0,t):e;for(o=o.replace(/\/+$/,"");o.endsWith("/chat/completions");)o=o.slice(0,-17);return`${o}/chat/completions${r}`}async decodeDebugRequestBody(e){return"string"==typeof e?JSON.parse(e):e instanceof Uint8Array?31===e[0]&&139===e[1]?JSON.parse((await X(e)).toString("utf-8")):JSON.parse(Buffer.from(e).toString("utf-8")):e}isCustomModelRequest(e,t){let r=e||t?.id;return!!(r?.startsWith(S.CUSTOM_LOCAL_MODEL_PREFIX)||r?.startsWith("custom:"))||t?.trustLevel===S.ModelTrustLevel.CUSTOM||Array.isArray(t?.tags)&&t.tags.includes(S.MODEL_TAG_CUSTOM)}shouldApplyInternalModelRequestHeaders(e,t){return!!t&&!this.isCustomModelRequest(e,t)}isRecord(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}mergeRequestProviderData(e,t){if(!t||!this.isRecord(e))return e;let r=this.isRecord(t.extra_vars)?t.extra_vars:void 0,o=this.isRecord(e.extra_vars)?e.extra_vars:{};return{...e,...t,...r?{extra_vars:{...o,...r}}:{}}}hasGrowthEventExtraVars(e){return!!this.isRecord(e)&&this.isRecord(e.extra_vars)&&"string"==typeof e.extra_vars.growthEvent}resolveRootRequestId(e){let t=e.meta?.rootRequestId;return"string"==typeof t&&t.length>0?t:void 0}resolveParentConversationId(e){let t=e.meta?.parentConversationId;if("string"==typeof t&&0!==t.length&&t!==e.id)return t}resolveAgentType(e){return e.meta?.teamContext?"team":e.meta?.parentConversationId?"subagent":"main"}getHeaderCaseInsensitive(e,t){let r=Object.keys(e).find(e=>e.toLowerCase()===t.toLowerCase());return r?e[r]:void 0}setHeaderCaseInsensitive(e,t,r){let o=Object.keys(e).find(e=>e.toLowerCase()===t.toLowerCase());o&&delete e[o],e[t]=r}parseSSEChunk(e,t=!1){let r,o,s=!1,n=!1,a=null,i=!1,l="";try{for(let d of e.toString("utf-8").split("\n")){let e=d.trim();if(!e.startsWith("data:"))continue;let u=e.slice(5).trim();if(u&&"[DONE]"!==u)try{let e=JSON.parse(u);if(void 0===r&&"string"==typeof e?.id&&e.id.length>0&&(r=e.id),e?.usage!=null&&(i=!0,t&&"object"==typeof e.usage)){let t=e.usage;o={prompt_tokens:"number"==typeof t.prompt_tokens?t.prompt_tokens:void 0,completion_tokens:"number"==typeof t.completion_tokens?t.completion_tokens:void 0,total_tokens:"number"==typeof t.total_tokens?t.total_tokens:void 0}}let d=e?.choices;if(!Array.isArray(d)||0===d.length)continue;for(let e of d){"string"==typeof e.finish_reason&&""!==e.finish_reason&&(s=!0,a=e.finish_reason);let r=e.delta;if(r){let e="string"==typeof r.content&&r.content.length>0,o="string"==typeof r.reasoning_content&&r.reasoning_content.length>0||"string"==typeof r.reasoning&&r.reasoning.length>0,a=Array.isArray(r.tool_calls)&&r.tool_calls.length>0,i="string"==typeof r.refusal&&r.refusal.length>0;(e||o||a||i)&&(s=!0),(e||a||i)&&(n=!0),t&&e&&(l+=r.content)}}if(s&&n&&a&&i)break}catch{}}}catch{}return{hasContent:s,hasSubstantiveContent:n,finishReason:a,hasUsage:i,chunkId:r,usage:o,deltaContent:l.length>0?l:void 0}}normalizeStreamingToolCallIds(e,t){if(!e.includes("tool_calls"))return e;let r=e.split("\n"),o=!1;for(let e=0;e<r.length;e++){let s=r[e].trim();if(!s.startsWith("data:"))continue;let n=s.slice(5).trimStart();if(n&&"[DONE]"!==n)try{let s=JSON.parse(n),a=s?.choices;if(!Array.isArray(a)||0===a.length)continue;let i=a[0]?.delta;if(!i?.tool_calls||!Array.isArray(i.tool_calls)||0===i.tool_calls.length)continue;let l=!1;for(let e of i.tool_calls)null!=e.id&&"string"==typeof e.id&&""!==e.id&&(t.has(e.id)?"number"==typeof e.index&&(delete e.id,l=!0):t.add(e.id));if(l){let t=r[e].startsWith("data: ")?"data: ":"data:";r[e]=`${t}${JSON.stringify(s)}`,o=!0}}catch{}}return o?r.join("\n"):e}createStreamingTextProcessor(){let e=new _.StringDecoder("utf-8"),t=new TextEncoder,r=new Set;return{process:o=>{let s=e.write(o);return 0===s.length?null:t.encode(this.normalizeStreamingToolCallIds(s,r))},flush:()=>{let r=e.end();return r.length>0?t.encode(r):null}}}parseCustomHeaders(e){if(!e)return{};let t={},r=[];for(let o of(e.includes("\\n")?r.push(...e.split("\\n")):e.includes("\n")?r.push(...e.split("\n")):r.push(e),r)){let e=o.trim();if(!e)continue;let r=e.indexOf(":");if(-1===r)continue;let s=e.substring(0,r).trim(),n=e.substring(r+1).trim();s&&n&&(t[s]=n)}return t}async getCustomHeaders(e){let t;this.logger.setContext("ModelProvider");let r=this.parseCustomHeaders(process.env[x.nW]),o=await this.settingsManager.get("env"),s=this.parseCustomHeaders(o?.[x.nW]),n=await this.settingsManager.get("enableModelOptimization"),a=n?.enabled!==!1;if(void 0===n)try{let e=await this.productManager.waitConfiguration();e.productFeatures?.[S.ProductFeature.DisableYuanbaoChannel]===!0&&(a=!1)}catch{}s[A.PRIVATE_DATA_HEADER]=a?"false":"true";let i={};try{let e=y.Context.getRequest()?.body;if(e?.header){let t=B.HeaderUtils.convertHeaderArrayToObject(e.header);t&&(i=t)}}catch(e){}let l={};try{let e=this.sessionManager.getCurrent()||this.sessionManager.sessionSubject.getValue();e?.requestOptions?.headers?(l=e.requestOptions.headers,this.logger.debug(`[ModelProvider] session headers from session ${e.id}: keys=[${Object.keys(l).join(",")}]`)):this.logger.debug(`[ModelProvider] no session headers for session ${e?.id}`)}catch(e){this.logger.warn(`[ModelProvider] error reading session headers: ${e}`)}let d={...r,...s,...i,...l};this.logger.debug(`[ModelProvider] merged headers: keys=[${Object.keys(d).join(",")}]`),process.env[x.QB]&&this.logger.debug("[ModelProvider] API key disabled via env"),process.env[x.QB]||(t=o?.[x.XO]||process.env[x.XO]);try{if(e.modelId){let r=await this.productManager.waitConfiguration(),o=r.models?.find(t=>t.id===e.modelId);o?.apiKey&&(t=o.apiKey,this.logger.debug(`Using custom API key in headers for model ${e.modelId}`))}}catch(e){}t&&(d[A.API_KEY_HEADER]=t,d[R.HttpHeaders.AUTHORIZATION]=`Bearer ${t}`);let u=this.authenticationManager.currentSessionSubject.getValue()?.account,c=u?.enterpriseId?.trim(),m=(0,T.isPersonalAccount)(u)&&!c;return await B.IOAUtils.applyIOADefaultHeaders(d,o,{enterpriseId:c,skipDefaultEnterpriseHeaders:m}),d}async enableThinking(){let e=await this.settingsManager.get("alwaysThinkingEnabled"),t=await this.agentManager.getDefault(),r=await this.agentManager.getModel(t.name);return!!(e&&r.supportsReasoning)}async injectReasoningSummaryIfNeeded(e){return!(!(await this.enableThinking()||"string"==typeof e?.reasoning_effort||"string"==typeof e?.reasoning?.effort)||e?.reasoning_summary)&&(e.reasoning_summary="auto",!0)}isConnectionLevelRetryableError(e){if(!e||void 0!==e.response)return!1;let t="string"==typeof e.code?e.code:"",r="string"==typeof e.message?e.message.toLowerCase():"";return!!(new Set(["ECONNRESET","ECONNREFUSED","ETIMEDOUT","EAI_AGAIN","EPIPE","EPROTO","UND_ERR_SOCKET","ERR_STREAM_PREMATURE_CLOSE"]).has(t)||r.includes("socket hang up"))}isRequestLevelRetryableError(e,t){if(!e)return!1;let r=this.parseErrorResponseBody(e),matchesOwnModelCode=t=>t(e)||!!r&&t(r);if(matchesOwnModelCode(G.o4.isQuotaExhaustedError)||!t&&matchesOwnModelCode(G.o4.isCraftDailyQuotaBusinessCode))return!1;let o=e.response?.status;return!!((0,F.A1)("number"==typeof o?o:void 0)||!t&&matchesOwnModelCode(G.o4.isTransientRateLimitBusinessCode))}parseErrorResponseBody(e){let t=e?.response?.data;if(t&&"object"==typeof t&&"function"!=typeof t.pipe)return t;if("string"==typeof t&&""!==t.trim())try{let e=JSON.parse(t);return e&&"object"==typeof e?e:void 0}catch{}}async drainErrorResponseBody(e,t){let r=e?.response?.data;if(r&&"function"==typeof r.pipe&&"function"==typeof r.on)try{let o=await new Promise((e,o)=>{let s=[],n=!1,onData=e=>s.push(e),onEnd=()=>{finish(),e(Buffer.concat(s).toString("utf8"))},onError=e=>{finish(),o(e)},onAbort=()=>{finish();try{r.destroy()}catch{}o(Error("Request aborted."))},a=setTimeout(()=>{finish();try{r.destroy()}catch{}o(Error("drain body timeout"))},er);function finish(){n||(n=!0,clearTimeout(a),r.removeListener("data",onData),r.removeListener("end",onEnd),r.removeListener("error",onError),t?.removeEventListener("abort",onAbort))}("function"==typeof a.unref&&a.unref(),t?.aborted)?onAbort():(t?.addEventListener("abort",onAbort,{once:!0}),r.on("data",onData),r.on("end",onEnd),r.on("error",onError))});e.response.data=o}catch{}}abortableSleep(e,t){return new Promise((r,o)=>{if(t?.aborted)return void o(Error("Request aborted."));let s=setTimeout(()=>{t?.removeEventListener("abort",onAbort),r()},e);"function"==typeof s.unref&&s.unref();let onAbort=()=>{clearTimeout(s),o(Error("Request aborted."))};t?.addEventListener("abort",onAbort,{once:!0})})}async requestWithConnectionRetry(e,t,r,o,s){let n,a=resolveRequestMaxRetries(process.env.CODEBUDDY_MAX_RETRIES),i=isRetryWatchdogEnabled(process.env.CODEBUDDY_RETRY_WATCHDOG),l=0,d=0;for(;;)try{let t=await this.restOperations.request(e);return s?.setAttribute("retry_count",l+d),t}catch(c){n=c;let u=e?.signal;if(u?.aborted)break;if(this.isConnectionLevelRetryableError(c)){if(l>=1)break;l+=1,s?.addEvent("retry_attempt",{attempt:l,kind:"connection",error_code:String(c?.code??""),error_message:String(c?.message??"")}),this.logger.warn(`[ModelProvider] Connection-level failure before response headers, retrying once: agent=${t}, requestId=${r}, code=${c?.code}, message=${c?.message}`);continue}if(await this.drainErrorResponseBody(c,u),this.isRequestLevelRetryableError(c,o)){if(!i&&d>=a)break;d+=1;let e=c?.response?.status,o=c?.response?.headers,n=(0,F.oR)(o),l=i?et:J,m=i?(0,F.O2)(o):null,g=null!=m?Math.min(m,l):computeRequestRetryDelayMs(d,n,l);s?.addEvent("retry_attempt",{attempt:d,kind:"request",status:"number"==typeof e?e:-1,delay_ms:Math.round(g)}),this.logger.warn(`[ModelProvider] Request-level failure before generation, backing off and retrying: agent=${t}, requestId=${r}, status=${e}, attempt=${d}${i?"(watchdog)":`/${a}`}, delayMs=${Math.round(g)}${null!=n?`(retry-after=${n}ms)`:""}${null!=m?`(reset-in=${m}ms)`:""}`),await this.abortableSleep(g,u);continue}break}throw s?.setAttribute("retry_count",l+d),n}async runWithGalileoModelRequestSpan(e,t){let{parentContext:r,parentSpanId:o}=this.createOtelParentContextFromTraceHeaders(e.headers),s={"span.type":"model_request","http.method":e.method.toUpperCase(),"http.url":this.sanitizeUrlForTrace(e.url),"model.id":e.model,"agent.name":e.agentName,"request.id":e.requestId,"model.stream":e.isStreamRequest,"conversation.request.id":e.headers[A.CONVERSATION_REQUEST_ID_HEADER]??e.requestId,"workbuddy.session_id":e.headers[A.CONVERSATION_ID_HEADER]??"","workbuddy.prompt_request_id":e.promptRequestId??e.headers[A.CONVERSATION_REQUEST_ID_HEADER]??"","workbuddy.message_id":e.headers[A.CONVERSATION_MESSAGE_ID_HEADER]??"","workbuddy.request_id":e.headers[A.REQUEST_ID_HEADER]??e.requestId};try{let t=new URL(e.url);s["http.target"]=`${t.pathname}${t.search}`,s["net.peer.name"]=t.hostname,t.port&&(s["net.peer.port"]=Number(t.port))}catch{}let n=M.u.getTracer("workbuddy.agent.model").startSpan("codebuddy_code.model_request",{kind:v.v.CLIENT,attributes:s},r);this.injectOtelSpanHeaders(e.headers,n,o);let a=n.spanContext();return this.logger.info(`[GalileoMVP] model request span started: traceId=${a.traceId}, spanId=${a.spanId}, parentSpanId=${o||""}, requestId=${e.requestId}, url=${this.sanitizeUrlForTrace(e.url)}`),O._.with(M.u.setSpan(r,n),async()=>{try{let e=await t(n),r=e?.status;return"number"==typeof r?(n.setAttribute("http.status_code",r),n.setStatus({code:r>=400?C.s.ERROR:C.s.OK,...r>=400?{message:`HTTP ${r}`}:{}})):n.setStatus({code:C.s.OK}),e}catch(e){throw"number"==typeof e.response?.status&&n.setAttribute("http.status_code",e.response.status),e.code&&n.setAttribute("error.code",String(e.code)),n.recordException(e),n.setStatus({code:C.s.ERROR,message:e.message}),e}finally{n.end()}})}createOtelParentContextFromTraceHeaders(e){let t=this.getHeaderCaseInsensitive(e,"b3"),r=t?.split("-")??[],o=this.getHeaderCaseInsensitive(e,"x-b3-traceid")||this.getHeaderCaseInsensitive(e,"x-trace-id")||r[0],s=this.getHeaderCaseInsensitive(e,"x-b3-spanid")||r[1],n=this.getHeaderCaseInsensitive(e,"x-b3-sampled")||r[2];return o&&s&&/^[0-9a-f]{32}$/i.test(o)&&/^[0-9a-f]{16}$/i.test(s)&&"00000000000000000000000000000000"!==o?{parentContext:M.u.setSpanContext(b.l,{traceId:o.toLowerCase(),spanId:s.toLowerCase(),traceFlags:"0"===n||"false"===n?$.X.NONE:$.X.SAMPLED,isRemote:!0}),parentSpanId:s.toLowerCase()}:{parentContext:O._.active()}}createModelStreamSpan(e,t,r,o,s){let n,a=!1;try{let{parentContext:a}=this.createOtelParentContextFromTraceHeaders(e);n=M.u.getTracer("workbuddy.agent.model").startSpan(I.SPAN_NAME_MODEL_STREAM,{kind:v.v.CLIENT,attributes:{[I.MODEL_STREAM_ATTRS.SPAN_TYPE]:I.SPAN_TYPE_MODEL_STREAM,"model.id":t,"agent.name":r,"request.id":o,"conversation.request.id":e[A.CONVERSATION_REQUEST_ID_HEADER]??o,"workbuddy.session_id":e[A.CONVERSATION_ID_HEADER]??"","workbuddy.prompt_request_id":s??e[A.CONVERSATION_REQUEST_ID_HEADER]??"","workbuddy.message_id":e[A.CONVERSATION_MESSAGE_ID_HEADER]??"","workbuddy.request_id":e[A.REQUEST_ID_HEADER]??o}},a)}catch(e){this.logger.info(`[ModelProvider] model_stream span start failed: ${e}`)}return{span:n,endSpan:(e,t,r)=>{n&&!a&&(a=!0,n.setAttribute(I.MODEL_STREAM_ATTRS.CHUNK_COUNT,e.chunkCount),n.setAttribute(I.MODEL_STREAM_ATTRS.TOTAL_BYTES,e.totalBytes),n.setAttribute("stream.status",t),n.setAttribute("workbuddy.stop_reason",r?.message??t),"error"===t?(r&&n.recordException(r),n.setStatus({code:C.s.ERROR,message:r?.message})):"ok"===t?n.setStatus({code:C.s.OK}):n.addEvent("aborted"),n.end())}}}writeGenAiRequestAttrs(e,t){if(!t||"object"!=typeof t)return;let j=e=>{try{return"string"==typeof e?e:JSON.stringify(e)}catch{return""}},clip=(e,t)=>e.length>t?e.slice(0,t):e,r=(0,I.readOtelLoggingFlags)().logUserPrompts,o={};if("number"==typeof t.temperature&&(o.temperature=t.temperature,e.setAttribute(I.LLM_SOURCE_ATTRS.REQUEST_TEMPERATURE,t.temperature)),"number"==typeof t.top_p&&(o.top_p=t.top_p,e.setAttribute(I.LLM_SOURCE_ATTRS.REQUEST_TOP_P,t.top_p)),"number"==typeof t.max_tokens&&(o.max_tokens=t.max_tokens,e.setAttribute(I.LLM_SOURCE_ATTRS.REQUEST_MAX_TOKENS,t.max_tokens)),void 0!==t.max_completion_tokens&&(o.max_completion_tokens=t.max_completion_tokens),void 0!==t.frequency_penalty&&(o.frequency_penalty=t.frequency_penalty),void 0!==t.presence_penalty&&(o.presence_penalty=t.presence_penalty),void 0!==t.stream&&(o.stream=t.stream),Object.keys(o).length>0&&e.setAttribute(I.LLM_SOURCE_ATTRS.REQUEST_PARAMETERS,j(o)),Array.isArray(t.messages)&&t.messages.length>0){let o=t.messages,s=j(o);s&&(e.setAttribute(I.LLM_SOURCE_ATTRS.INPUT_MESSAGES,clip(s,I.LLM_SOURCE_VALUE_MAX_SIZE)),s.length>I.LLM_SOURCE_VALUE_MAX_SIZE&&e.setAttribute(I.LLM_SOURCE_ATTRS.INPUT_TRUNCATED,!0)),e.setAttribute(I.LLM_SOURCE_ATTRS.PROMPT_COUNT,o.length);let n=Math.min(o.length,I.MAX_PROMPT_MESSAGES);for(let t=0;t<n;t++){let s=o[t];if(s&&"object"==typeof s){if(s.role&&e.setAttribute(I.LLM_PROMPT_KEYS.role(t),String(s.role)),s.tool_call_id&&e.setAttribute(I.LLM_PROMPT_KEYS.toolCallId(t),String(s.tool_call_id)),Array.isArray(s.tool_calls)&&s.tool_calls.length>0){e.setAttribute(I.LLM_PROMPT_KEYS.toolCallCount(t),s.tool_calls.length);for(let o=0;o<s.tool_calls.length;o++){let n=s.tool_calls[o];if(!n||"object"!=typeof n)continue;let a=I.LLM_PROMPT_KEYS.toolCall(t,o),i=n.function??{};n.id&&e.setAttribute(a.id,String(n.id)),i.name&&e.setAttribute(a.name,String(i.name)),r&&void 0!==i.arguments&&e.setAttribute(a.arguments,clip(j(i.arguments),I.LLM_SOURCE_PROMPT_VALUE_MAX_SIZE))}}if(r&&void 0!==s.content){let r=j(s.content);r&&e.setAttribute(I.LLM_PROMPT_KEYS.content(t),clip(r,I.LLM_SOURCE_PROMPT_VALUE_MAX_SIZE))}}}}}injectOtelSpanHeaders(e,t,r){let o=t.spanContext(),s=(o.traceFlags&$.X.SAMPLED)===$.X.SAMPLED;this.setHeaderCaseInsensitive(e,"traceparent",`00-${o.traceId}-${o.spanId}-${s?"01":"00"}`),this.setHeaderCaseInsensitive(e,"b3",`${o.traceId}-${o.spanId}-${s?"1":"0"}${r?`-${r}`:""}`),this.setHeaderCaseInsensitive(e,"X-B3-TraceId",o.traceId),r&&this.setHeaderCaseInsensitive(e,"X-B3-ParentSpanId",r),this.setHeaderCaseInsensitive(e,"X-B3-SpanId",o.spanId),this.setHeaderCaseInsensitive(e,"X-B3-Sampled",s?"1":"0"),this.setHeaderCaseInsensitive(e,"X-Trace-ID",o.traceId)}sanitizeUrlForTrace(e){return e.replace(/([?&])(key|token|api_key|apikey|secret|password)=[^&]*/gi,"$1$2=***")}axiosToFetchAdapter(){return async(e,t)=>{let r,o,s,n,a,i="string"==typeof e?e:e.url,l=t?.method||"GET",d=t?.headers,u=t?.body,c=Date.now(),m={};if(d)if(d instanceof Headers)m={},d.forEach((e,t)=>{m[t]=e});else if(Array.isArray(d))for(let[e,t]of(m={},d))m[e]=t;else m={...d};let g=this.sessionManager.getCurrent()||this.sessionManager.sessionSubject.getValue();g.messageId=(0,f.generateUUUID)().replace(/-/g,""),m[A.CONVERSATION_ID_HEADER]=g.id,m[A.CONVERSATION_REQUEST_ID_HEADER]=g.conversationRequestId||"",m[A.CONVERSATION_MESSAGE_ID_HEADER]=g.messageId,m[A.REQUEST_ID_HEADER]=g.messageId,m[A.AGENT_INTENT]=g.meta?.["codebuddy.ai/mode"]??"craft",process.env.PERSONAL_AGENT_ROLE?m[A.AGENT_PURPOSE]="person_agent":g.agentPurpose&&(m[A.AGENT_PURPOSE]=g.agentPurpose);let p=g.telemetryClientInfo;if(!p?.ideType||!p.ideName||!p.ideVersion){let e=await this.clientInfoProvider.get();r=e.ideType,o=e.platform,s=e.platformVersion}m[A.IDE_TYPE_HEADER]=p?.ideType||r||L.Vo,m[A.IDE_NAME_HEADER]=p?.ideName||o||"",m[A.IDE_VERSION_HEADER]=p?.ideVersion||s||"0.0.0";let _=null,h=!1;if(u&&"string"==typeof u)try{_=JSON.parse(u)}catch{}else u&&"object"==typeof u&&(_=u);if(_?.model&&(n=_.model),n)try{let e=await this.productManager.waitConfiguration();if(a=e.models?.find(e=>e.id===n),a?.url)if(a.useCustomProtocol)i=a.url,this.logger.info(`Using custom URL for model ${n}: ${i} (useCustomProtocol=true, URL passthrough)`);else{let e=this.isCustomModelRequest(n,a);i=e?this.normalizeChatCompletionsUrl(a.url):a.url,this.logger.info(`Using custom URL for model ${n}: ${i}(raw:${a?.url})${e?" (custom model, ensured /chat/completions)":""}`)}}catch(e){}let E=g.requestOptions?.providerData;if(E){let e=this.isCustomModelRequest(n,a),t=process.env[x.qL]===N.pg.Selfhosted;if(!e||t){let e=this.mergeRequestProviderData(_,E);e!==_&&(_=e,h=!0)}}if(!a?.useCustomProtocol&&/\/chat\/completions(?:[/?#]|$)/.test(i)){let e=this.normalizeChatCompletionsUrl(i);e!==i&&(this.logger.info(`Normalized duplicated /chat/completions in URL: ${i} -> ${e}`),i=e)}for(let[e,t]of Object.entries(await this.getCustomHeaders({modelId:n||""})))this.setHeaderCaseInsensitive(m,e,t);delete m.authorization,delete m["user-agent"];let y=(0,P.Gp)();for(let[e,t]of(y?.auth?.accessToken&&!Object.keys(m).some(e=>"authorization"===e.toLowerCase())&&(m[R.HttpHeaders.AUTHORIZATION]=`Bearer ${y.auth.accessToken}`),Object.entries((0,P.I2)())))Object.keys(m).some(t=>t.toLowerCase()===e.toLowerCase())||(m[e]=t);if(this.isCustomModelRequest(n,a)){let e=Object.keys(m).find(e=>e.toLowerCase()===A.PRIVATE_DATA_HEADER.toLowerCase());e&&delete m[e]}let M=this.agentManager.getVolatilePluginAgentState().internalModelRequestHeaders;if(M&&this.shouldApplyInternalModelRequestHeaders(n,a))for(let[e,t]of Object.entries(M))this.setHeaderCaseInsensitive(m,e,t);this.setHeaderCaseInsensitive(m,A.REQUEST_ID_HEADER,g.messageId),this.setHeaderCaseInsensitive(m,A.CONVERSATION_MESSAGE_ID_HEADER,g.messageId);let v=this.resolveRootRequestId(g);v&&this.setHeaderCaseInsensitive(m,A.ROOT_REQUEST_ID_HEADER,v);let O=this.resolveParentConversationId(g);O&&this.setHeaderCaseInsensitive(m,A.PARENT_CONVERSATION_ID_HEADER,O),this.setHeaderCaseInsensitive(m,A.AGENT_TYPE_HEADER,this.resolveAgentType(g));let C=await this.settingsManager.get("env"),b=C?.[x.hv]||process.env[x.hv];if(b)for(let e of(m[T.HTTP_HEADER_SKIP_AUTH_INTERCEPTOR]="1",[A.CONVERSATION_ID_HEADER,A.CONVERSATION_REQUEST_ID_HEADER,A.CONVERSATION_MESSAGE_ID_HEADER,A.PARENT_CONVERSATION_ID_HEADER,A.AGENT_TYPE_HEADER,A.REQUEST_ID_HEADER,A.AGENT_INTENT,A.AGENT_PURPOSE,A.IDE_TYPE_HEADER,A.IDE_NAME_HEADER,A.IDE_VERSION_HEADER,A.PRODUCT,A.API_KEY_HEADER,A.PRIVATE_DATA_HEADER,...Object.keys(M??{})]))delete m[e];if(_&&await this.injectReasoningSummaryIfNeeded(_)&&(h=!0),_&&n){let e=(0,S.stripCustomLocalModelPrefix)(n);e!==n&&_.model===n&&(_.model=e,h=!0)}if(_&&a?.tags?.includes("custom")&&!1===a.supportsImages&&Array.isArray(_.messages)){let e=!1;for(let t of _.messages)if(Array.isArray(t.content)){let r=t.content.filter(e=>"text"===e.type).map(e=>e.text);t.content=r.join("\n"),e=!0}e&&(h=!0,this.logger.debug(`Flattened array content to string for custom model ${n}`))}if(_&&this.isCustomModelRequest(n,a)&&a?.supportsToolCall===!1){let e=await this.productManager.waitConfiguration();e.productFeatures?.[S.ProductFeature.SkipToolCallSupportCheck]!==!0&&(void 0!==_.tools||void 0!==_.tool_choice)&&(delete _.tools,delete _.tool_choice,h=!0,this.logger.info(`Stripped tools/tool_choice from request body (model ${n} does not support tool calls)`))}h&&_&&"string"==typeof u&&(u=JSON.stringify(_));let $={url:i,method:l,headers:m,data:u,signal:t?.signal||void 0,modelId:n,maxBodyLength:1/0,maxContentLength:1/0};for(let e of[...this.modelRequestProcessors].sort((e,t)=>(e.priority??1e3)-(t.priority??1e3)))await e.process($);if(b){let e=new Set([A.CONVERSATION_ID_HEADER,A.CONVERSATION_REQUEST_ID_HEADER,A.CONVERSATION_MESSAGE_ID_HEADER,A.PARENT_CONVERSATION_ID_HEADER,A.AGENT_TYPE_HEADER,A.REQUEST_ID_HEADER,A.AGENT_INTENT,A.AGENT_PURPOSE,A.IDE_TYPE_HEADER,A.IDE_NAME_HEADER,A.IDE_VERSION_HEADER,A.PRODUCT,A.API_KEY_HEADER,A.PRIVATE_DATA_HEADER,...Object.keys(M??{}),T.HTTP_HEADER_SKIP_AUTH_INTERCEPTOR,"X-User-Id","X-Enterprise-Id","X-Department-Info","X-Tenant-Id","X-Domain","User-Agent","X-Requested-With"].map(e=>e.toLowerCase())),t=["x-stainless-"],r=$.transformRequest;$.transformRequest=[...Array.isArray(r)?r:r?[r]:[],(r,o)=>{if(!o)return r;let s=new Set(["common","delete","get","head","post","put","patch"]);for(let r of Object.keys(o)){if(s.has(r))continue;let n=r.toLowerCase();if(e.has(n)){delete o[r];continue}t.some(e=>n.startsWith(e))&&delete o[r]}return r}]}let w="text/event-stream"===m.Accept||"text/event-stream"===m.accept||i.includes("stream=true")||"string"==typeof u&&u.includes('"stream":true');w&&($.responseType="stream");let D=this.getHeaderCaseInsensitive(m,A.REQUEST_ID_HEADER)||"unknown";this.hasGrowthEventExtraVars(_)&&(g.requestOptions.growthEventRequestId=g.conversationRequestId||void 0);let k=this.telemetryService.reportMessageSendTelemetry(m,u,w),U=g.agentName||"unknown",q=n||_?.model||"unknown",H=Date.now();this.galileoTimingHook?.reportPromptBuild(H-c,{model:q,agentName:U});let V=$.url?.replace(/([?&])(key|token|api_key|apikey|secret|password)=[^&]*/gi,"$1$2=***");if(this.logger.info(`[ModelProvider] Sending request: agent=${U}, model=${q}, requestId=${D}, stream=${w}, url=${V}`),g.promptReceivedAt&&!g.firstModelRequestTimingReported){g.firstModelRequestTimingReported=!0;let e=g.promptSeq??0,t=Date.now(),r=t-g.promptReceivedAt,o=g.runnerStartedAt?t-g.runnerStartedAt:-1,s=1===e?"first":`n=${e}`;this.logger.info(`[ModelProvider] message-to-model-request latency: ${r}ms (sinceRunnerStart=${o}ms, promptSeq=${e}, kind=${s}, agent=${U}, model=${q}, sessionId=${g.id})`)}if("function"==typeof this.logger.debug)try{let e=Array.isArray(_?.tools)?_.tools:void 0,t=e?e.map(e=>e?.function?.name??e?.name).filter(Boolean):void 0;this.logger.debug(`[ModelProvider][toolsInBody] requestId=${D} model=${q} `+(t?`toolCount=${t.length} tools=[${t.join(",")}]`:"tools=<none in body>"))}catch{}process.env.CODEBUDDY_DEBUG_REQUEST&&(async()=>{try{let{messages:e,...t}=await this.decodeDebugRequestBody($.data)||{};if(this.logger.info(`[ModelProvider] Request body (no messages): ${JSON.stringify(t)}`),e)for(let t=0;t<e.length;t++){let r=e[t],o=JSON.stringify(r).slice(0,500);this.logger.info(`[ModelProvider] messages[${t}]: ${o}`)}}catch{}})().catch(()=>{});try{let e={...m},r=await this.runWithGalileoModelRequestSpan({url:$.url,method:l,headers:$.headers,model:q,agentName:U,requestId:D,isStreamRequest:w,promptRequestId:g.promptRequestId},e=>this.requestWithConnectionRetry($,U,D,this.isCustomModelRequest(n,a),e)),o=extractMockE2EResponseDiagnostics(r.headers);if(o&&this.logger.info(`[MockE2E][response] ${JSON.stringify({sessionId:g.id,promptRequestId:g.promptRequestId,conversationRequestId:g.conversationRequestId,modelRequestId:D,model:q,httpStatus:r.status,...o})}`),g.conversationRequestId&&await this.telemetryService.flushPendingGrowthTelemetry(g,g.conversationRequestId),w||await this.telemetryService.reportMessageResponseTelemetryNonStream(g,k,r,!0),!w||!r.data||"function"!=typeof r.data.pipe)return new Response("string"==typeof r.data?r.data:JSON.stringify(r.data),{status:r.status,statusText:r.statusText,headers:r.headers});{let o=t?.signal,s=r.data,a=!1,l=0,d=0,u=Date.now(),c=!1,{span:m,endSpan:p}=this.createModelStreamSpan(e,q,U,D,g.promptRequestId),h=(0,I.shouldEmitGenAiSourceAttrs)(),E=[],f=0,R=!1,y=!1;if(h&&m)try{this.writeGenAiRequestAttrs(m,_)}catch(e){this.logger.info(`[ModelProvider] gen_ai request attrs write failed: ${e}`)}let T=resolveTimeoutMs(process.env.CODEBUDDY_STREAM_TIMEOUT_MS,W),A=resolveTimeoutMs(process.env.CODEBUDDY_FIRST_TOKEN_TIMEOUT_MS,Q),M=(()=>{try{let e=this.sessionManager.getCurrent()||this.sessionManager.sessionSubject.getValue();if((e?.meta?.firstTokenTimeoutRetryCount??0)>=1)return this.logger.info(`[ModelProvider] Skipping first token timeout (already retried): agent=${U}, requestId=${D}`),!0}catch{}return!1})(),v=null,O=null,C=null,b=null,$=null,w=this.createStreamingTextProcessor(),P=0,L=0,k=0,N=!1,x=!1,V=null,B=!1,G=_?.stream_options?.include_usage===!0,F=!1,startStreamMonitor=()=>{!O&&(this.logger.info(`[ModelProvider] Stream idle monitor armed: agent=${U}, requestId=${D}, streamIdleTimeoutMs=${T}`),(O=setInterval(()=>{if(c||a){O&&(clearInterval(O),O=null);return}k++;let e=Date.now(),t=e-u;if(s.isPaused?.()&&s.resume(),k%10==0){let r=l-P,o=d-L;if(r>0){let s=e-H;this.logger.info(`[ModelProvider] Stream progress: agent=${U}, requestId=${D}, chunks=${l}(+${r}), bytes=${d}(+${o}), elapsed=${s}ms, idle=${t}ms`),m?.addEvent(I.MODEL_STREAM_EVENT_CHUNK_PROGRESS,{chunks:r,bytes:o,elapsed_ms:s}),P=l,L=d}}if(t>=T){if(x)this.logger.info(`[ModelProvider] Graceful close: finish_reason already received, stream idle for ${T}ms, agent=${U}, requestId=${D}, chunks=${l}, bytes=${d}`),gracefulCloseStream();else if(this.logger.error(`Stream timeout: no data received for ${T}ms, agent=${U}, requestId=${D}, chunkCount=${l}, totalBytes=${d}`),clearAllTimers(),c=!0,a=!0,p({chunkCount:l,totalBytes:d},"error",Error(`Stream timeout after ${T}ms idle`)),s.destroy(),v)try{v.error(new Y.wM(T,l,d))}catch{}}},1e3))&&"function"==typeof O.unref&&O.unref())},clearFirstTokenTimer=()=>{C&&(clearTimeout(C),C=null)},clearAllTimers=()=>{clearFirstTokenTimer(),O&&(clearInterval(O),O=null),b&&(clearTimeout(b),b=null),$&&o&&(o.removeEventListener("abort",$),$=null)},cancelLocalModelGeneration=()=>{if(n?.startsWith(S.CUSTOM_LOCAL_MODEL_PREFIX))try{let e=new URL(i).origin,t=`${e}/v1/chat/completions/control`;this.logger.info(`[LocalModel] cancel: POST ${t} model=${n} chunks=${l}`),fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"stop"}),signal:AbortSignal.timeout(2e3)}).then(e=>this.logger.info(`[LocalModel] cancel response status=${e.status}`),e=>this.logger.warn(`[LocalModel] cancel failed: ${e?.message}`))}catch(e){this.logger.warn(`[LocalModel] cancel setup error: ${e?.message}`)}},destroyLocalModelSocket=()=>{if(n?.startsWith(S.CUSTOM_LOCAL_MODEL_PREFIX))try{let e=s.socket;e?e.destroyed?this.logger.info("[LocalModel] cancel: socket already destroyed"):(e.destroy(),this.logger.info("[LocalModel] cancel: TCP socket destroyed")):this.logger.info("[LocalModel] cancel: socket unavailable")}catch(e){this.logger.warn(`[LocalModel] cancel: socket destroy failed: ${e?.message}`)}},gracefulCloseStream=()=>{if(!c&&(c=!0,clearAllTimers(),p({chunkCount:l,totalBytes:d},"ok"),s.destroy(),v))try{let e=w.flush();e&&v.enqueue(e),v.close()}catch{}},startFinishReasonGraceTimer=e=>{!b&&!c&&!a&&(this.logger.info(`[ModelProvider] finish_reason="${e}" received, starting grace period: agent=${U}, requestId=${D}, chunks=${l}, bytes=${d}, elapsed=${Date.now()-H}ms`),(b=setTimeout(()=>{c||a||(this.logger.info(`[ModelProvider] Graceful close after finish_reason: stream idle for 5000ms after finish_reason, agent=${U}, requestId=${D}, chunks=${l}, bytes=${d}`),gracefulCloseStream())},5e3))&&"function"==typeof b.unref&&b.unref())},K=new ReadableStream({start:e=>{if(v=e,M)N=!0,F=!0,startStreamMonitor();else{let e=Date.now()-H,t=Math.max(A-e,0);if(0===t){if(this.logger.error(`First token timeout: HTTP response headers took ${e}ms (exceeds ${A}ms threshold)`),c=!0,a=!0,p({chunkCount:l,totalBytes:d},"error",Error(`First token timeout after ${A}ms`)),s.destroy(),v)try{v.error(new Y.wM(A,l,d,!0))}catch{}}else(C=setTimeout(()=>{if(!N&&!c&&!a){let e=Date.now()-H;if(this.logger.error(`First token timeout: no meaningful model output received for ${e}ms (threshold=${A}ms, received ${l} raw chunks, ${d} bytes)`),c=!0,a=!0,p({chunkCount:l,totalBytes:d},"error",Error(`First token timeout after ${A}ms`)),s.destroy(),v)try{v.error(new Y.wM(A,l,d,!0))}catch{}}},t))&&"function"==typeof C.unref&&C.unref()}s.on("data",t=>{if(l++,d+=t.length,u=Date.now(),1===l&&this.logger.info(`[ModelProvider] First raw chunk received: agent=${U}, requestId=${D}, elapsed=${Date.now()-H}ms, bytes=${t.length}`),h&&!y&&t.includes('"usage"'))try{let e=this.parseSSEChunk(t,!0).usage;e&&(y=!0,"number"==typeof e.prompt_tokens&&m?.setAttribute(I.LLM_SOURCE_ATTRS.USAGE_PROMPT_TOKENS,e.prompt_tokens),"number"==typeof e.completion_tokens&&m?.setAttribute(I.LLM_SOURCE_ATTRS.USAGE_COMPLETION_TOKENS,e.completion_tokens),"number"==typeof e.total_tokens&&m?.setAttribute(I.LLM_SOURCE_ATTRS.USAGE_TOTAL_TOKENS,e.total_tokens))}catch(e){this.logger.info(`[ModelProvider] gen_ai usage capture failed: ${e}`)}if(!N||!x||!F||x&&G&&!B){let e=this.parseSSEChunk(t,h);if(h&&e.deltaContent&&!R&&(E.push(e.deltaContent),(f+=e.deltaContent.length)>=I.LLM_SOURCE_VALUE_MAX_SIZE&&(R=!0)),g.telemetry&&!g.telemetry.chunkId&&e.chunkId&&(g.telemetry.chunkId=e.chunkId),!B&&e.hasUsage&&(B=!0,x&&V&&startFinishReasonGraceTimer(V)),!x&&"error"===e.finishReason&&!F){x=!0,V=e.finishReason;let t=N?"reasoning-only":"no-token";if(this.logger.warn(`[ModelProvider] finish_reason="error" with no substantive model output (${t}), treating as retryable empty stream: agent=${U}, requestId=${D}, chunks=${l}, bytes=${d}, elapsed=${Date.now()-H}ms`),c=!0,a=!0,clearAllTimers(),p({chunkCount:l,totalBytes:d},"error",Error("finish_reason=error with no model output")),s.destroy(),v)try{v.error(new Y.mY(l,d))}catch{}return}if(!F&&e.hasSubstantiveContent&&(F=!0),!N&&e.hasContent){N=!0;let e=Date.now()-H;if(g.telemetry&&(g.telemetry.firstTokenAt=H+e),this.logger.info(`[ModelProvider] First meaningful token received: agent=${U}, requestId=${D}, ttft=${e}ms, rawChunks=${l}, bytes=${d}`),this.galileoTimingHook?.reportTTFB(e,{model:q,requestId:D,agentName:U,conversationRequestId:g.conversationRequestId,messageId:g.messageId,promptRequestId:g.promptRequestId}),m?.setAttribute(I.MODEL_STREAM_ATTRS.FIRST_TOKEN_MS,e),m?.addEvent(I.MODEL_STREAM_EVENT_FIRST_TOKEN,{ttft_ms:e,chunk_count:l,bytes:d}),g.telemetry&&!g.telemetry.messageTtfbReported){let e=g.telemetry.firstTokenAt,t=g.meta?.["codebuddy.ai/mode"]??"",r={messageId:g.messageId,promptRequestId:g.promptRequestId,conversationRequestId:g.conversationRequestId,model:q,agentName:U,scene:t};if(g.telemetry.clientSendTime){let t=e-g.telemetry.clientSendTime;if(t>0&&t<=6e5&&(this.galileoTimingHook?.reportMessageTTFBUser(t,r),h))try{g.conversationRequestRootSpan?.setAttributes({[I.LLM_SOURCE_ATTRS.USER_FIRST_TOKEN_MS]:t})}catch{}}if(g.telemetry.promptStartTime){let t=e-g.telemetry.promptStartTime;t>0&&t<=6e5&&this.galileoTimingHook?.reportMessageTTFBModel(t,r)}g.telemetry.messageTtfbReported=!0}clearFirstTokenTimer(),startStreamMonitor()}if(!x&&e.finishReason){if(x=!0,V=e.finishReason,h&&E.length>0){let e=E.join("");if(e){let t=R||e.length>I.LLM_SOURCE_VALUE_MAX_SIZE,r=e.length>I.LLM_SOURCE_VALUE_MAX_SIZE?e.slice(0,I.LLM_SOURCE_VALUE_MAX_SIZE):e;m?.setAttribute(I.LLM_SOURCE_ATTRS.OUTPUT_CONTENT,r),m?.setAttribute(I.LLM_SOURCE_ATTRS.COMPLETION_0_ROLE,"assistant"),m?.setAttribute(I.LLM_SOURCE_ATTRS.COMPLETION_0_CONTENT,r),t&&m?.setAttribute(I.LLM_SOURCE_ATTRS.OUTPUT_TRUNCATED,!0)}}!G||B?startFinishReasonGraceTimer(e.finishReason):this.logger.info(`[ModelProvider] finish_reason="${e.finishReason}" received, waiting for usage tail: agent=${U}, requestId=${D}, chunks=${l}, bytes=${d}, elapsed=${Date.now()-H}ms`)}}if(!a){let r=w.process(t);r&&e.enqueue(r)}}),s.on("end",()=>{c=!0,clearAllTimers();let t=Date.now()-H;if(this.logger.info(`[ModelProvider] Stream completed: agent=${U}, requestId=${D}, chunks=${l}, bytes=${d}, elapsed=${t}ms`),p({chunkCount:l,totalBytes:d},"ok"),N&&this.galileoTimingHook?.reportModelStreaming(t,{model:q,agentName:U,conversationRequestId:g.conversationRequestId}),this.galileoTimingHook?.reportRequestResult(0,void 0,q,void 0,g.conversationRequestId,void 0,g.id),!a){let t=w.flush();if(t)try{e.enqueue(t)}catch{}e.close()}}),s.on("error",t=>{c=!0,clearAllTimers();let r=Date.now()-H;this.logger.warn(`[ModelProvider] Stream error: agent=${U}, requestId=${D}, chunks=${l}, bytes=${d}, elapsed=${r}ms, error=${t.message}`),p({chunkCount:l,totalBytes:d},"error",t),this.galileoTimingHook?.reportRequestResult(-1,"STREAM_ERROR",q,t.message,g.conversationRequestId,void 0,g.id),a||e.error(t)}),s.on("close",()=>{if(!c){if(x)this.logger.info(`[ModelProvider] Stream closed after finish_reason received, treating as completed: agent=${U}, requestId=${D}, chunks=${l}, bytes=${d}`),gracefulCloseStream();else if(c=!0,clearAllTimers(),p({chunkCount:l,totalBytes:d},"error",Error("Stream closed unexpectedly")),!a&&v)try{0===l?(this.logger.warn(`[ModelProvider] Stream closed before first chunk: agent=${U}, requestId=${D}`),e.error(Error("Stream closed before receiving any data"))):N?(this.logger.warn(`[ModelProvider] Stream closed unexpectedly: agent=${U}, requestId=${D}, chunks=${l}, bytes=${d}`),e.error(Error(`Stream closed unexpectedly after receiving ${l} chunks (${d} bytes)`))):(this.logger.warn(`[ModelProvider] Empty stream: only placeholder chunks received before close: agent=${U}, requestId=${D}, chunks=${l}, bytes=${d}`),e.error(new Y.mY(l,d)))}catch{}}}),o&&($=()=>{c=!0,clearAllTimers(),a=!0,p({chunkCount:l,totalBytes:d},"aborted"),cancelLocalModelGeneration(),s.destroy(),destroyLocalModelSocket();try{e.close()}catch{}},o.aborted?$():o.addEventListener("abort",$,{once:!0}))},cancel:()=>{c=!0,clearAllTimers(),a=!0,p({chunkCount:l,totalBytes:d},"aborted"),cancelLocalModelGeneration(),s.destroy(),destroyLocalModelSocket()}});return new Response(K,{status:r.status,statusText:r.statusText,headers:r.headers})}}catch(e){try{this.logger.error(`[ModelProvider] Request failed: agent=${U}, requestId=${D}, error=${e?.message}`),this.logger.error(`[ModelProvider] Error response: status=${e.response?.status}, code=${e?.code}, message=${e?.message}`),this.telemetryService.reportMessageResponseTelemetryStream(g,void 0,void 0,e);let t=e.response?.status??e.status??-2,r=e?.code??`HTTP_${t}`;return this.galileoTimingHook?.reportRequestResult(t,r,q,e?.message?.slice(0,500),g.conversationRequestId,void 0,g.id),await Promise.race([this.modelErrorAnalyzer.analyze(e,$),new Promise((e,t)=>setTimeout(()=>t(),5e3))])}catch{return this.modelErrorAnalyzer.createErrorResponse(e?.message||"Unknown error",400,"Client Error")}}}}createClient(e,t){if(!t)throw this.authenticationManager.currentSessionSubject.next(void 0),new Y.WT;try{return new w.z4(this.buildOpenAIClientOptions(e,t))}catch(e){if(e.message&&e.message.includes("OPENAI_API_KEY"))throw new Y.iN;throw e}}buildOpenAIClientOptions(e,t){return{baseURL:e,apiKey:t,fetch:this.axiosToFetchAdapter(),maxRetries:0,timeout:this.resolveRequestTimeoutMs()}}resolveRequestTimeoutMs(){let e=process.env.CODEBUDDY_FIRST_TOKEN_TIMEOUT_MS;if(e){let t=parseInt(e,10);if(!isNaN(t)&&t>0)return t}return 12e5}getCacheKey(e,t,r){return`${e}@${t}@${r?`:${r}`:""}`}resolveModelBaseURL(e){let{envBaseURL:t,modelConfigUrl:r,productEndpoint:o}=e;if(r)return r;if(t)return t;let s=this.productManager.getEndpoint()||o;if(!s)throw new Y.uJ("Cannot resolve model request endpoint: neither getEndpoint() nor product.endpoint is available yet. Set CODEBUDDY_BASE_URL, or ensure the product configuration has finished loading.");return this.warnIfEnvEndpointMismatch(s),`${s}/v2`}warnIfEnvEndpointMismatch(e){let t,r=process.env[x.qL];if(r&&"ioa"===r.toLowerCase()){try{t=new URL(e).hostname}catch{return}t.endsWith("codebuddy.ai")&&this.logger?.warn(`[ModelProvider] resolved baseURL host "${t}" looks like the public cloud, but CODEBUDDY_INTERNET_ENVIRONMENT=${r}. The request will likely fail with 401 endpoint mismatch. Check ProductManager sync state or set CODEBUDDY_BASE_URL as a workaround.`)}}async normalizeNewToolResults(e,t){for(let r of e)"function_call_result"===r.rawItem.type&&await this.functionCallResultAgentInputItemProcessor.process(r.rawItem,t)}async getModel(e){if(!e)throw new Y.uJ("model name is required");let t=this.sessionManager.getCurrent()||this.sessionManager.sessionSubject.getValue(),r=t.resultSubject.value;if(r?.newItems.length){let e=r.newItems[r.newItems.length-1];e&&(await this.defaultInputItemProcessor.process(e.rawItem,t),await this.normalizeNewToolResults(r.newItems,t),"function_call_result"===e.rawItem.type&&this.telemetryService.reportModelToolCall(t,e.rawItem))}let o=this.authenticationManager.currentSessionSubject.getValue()?.auth,s=await this.settingsManager.get("env"),n=s?.[x.a1]||process.env[x.a1],a=(0,P.Gp)()?.auth?.accessToken??o?.accessToken,i=await this.productManager.waitConfiguration(),l=i.models?.find(t=>t.id===e),d=this.resolveModelBaseURL({envBaseURL:n,modelConfigUrl:l?.url,productEndpoint:i.endpoint});this.logger.debug(`Resolved baseURL for model ${e}: ${d}`),l?.apiKey&&(a=l.apiKey,this.logger.debug(`Using custom API key for model ${e}`)),l?.local===!0&&(a="local");let u=this.getCacheKey(d,e,a),c=this.modelCache.get(u);if(!c){if(this.modelCache.size>=K.mr)for(let e=0;e<K.mr/2;e++){let e=this.modelCache.keys().next().value;void 0!==e&&this.modelCache.delete(e)}try{let t=this.createClient(d,a);c=new K.lS(t,e),this.modelCache.set(u,c)}catch(e){if(e.message&&(e.message.includes("Authentication")||e.message.includes("OPENAI_API_KEY")||!a))throw this.authenticationManager.currentSessionSubject.next(void 0),new Y.WT;throw e}}return this.sensitiveModelBoundary.wrapModel(c,t.id)}};__decorate([(0,f.Autowired)(R.RestOperations),__metadata("design:type","function"==typeof(o=void 0!==R.RestOperations&&R.RestOperations)?o:Object)],eo.prototype,"restOperations",void 0),__decorate([(0,f.Autowired)(T.AuthenticationManager),__metadata("design:type","function"==typeof(s=void 0!==T.AuthenticationManager&&T.AuthenticationManager)?s:Object)],eo.prototype,"authenticationManager",void 0),__decorate([(0,f.Autowired)(S.ProductManager),__metadata("design:type","function"==typeof(n=void 0!==S.ProductManager&&S.ProductManager)?n:Object)],eo.prototype,"productManager",void 0),__decorate([(0,f.Autowired)(H.Cv),__metadata("design:type","function"==typeof(a=void 0!==H.Cv&&H.Cv)?a:Object)],eo.prototype,"sessionManager",void 0),__decorate([(0,f.Autowired)(V.H0),__metadata("design:type","function"==typeof(i=void 0!==V.H0&&V.H0)?i:Object)],eo.prototype,"telemetryService",void 0),__decorate([(0,f.Autowired)(S.ClientInfoProvider),__metadata("design:type","function"==typeof(l=void 0!==S.ClientInfoProvider&&S.ClientInfoProvider)?l:Object)],eo.prototype,"clientInfoProvider",void 0),__decorate([(0,f.Autowired)(D.VaB),__metadata("design:type","function"==typeof(d=void 0!==D.VaB&&D.VaB)?d:Object)],eo.prototype,"agentManager",void 0),__decorate([(0,f.Autowired)(I.Logger),__metadata("design:type","function"==typeof(u=void 0!==I.Logger&&I.Logger)?u:Object)],eo.prototype,"logger",void 0),__decorate([(0,f.Autowired)(H.BH),__metadata("design:type","function"==typeof(c=void 0!==H.BH&&H.BH)?c:Object)],eo.prototype,"defaultInputItemProcessor",void 0),__decorate([(0,f.Autowired)(H._o),__metadata("design:type","function"==typeof(m=void 0!==H._o&&H._o)?m:Object)],eo.prototype,"functionCallResultAgentInputItemProcessor",void 0),__decorate([(0,f.Autowired)(K.Iy),__metadata("design:type","function"==typeof(g=void 0!==K.Iy&&K.Iy)?g:Object)],eo.prototype,"modelErrorAnalyzer",void 0),__decorate([(0,f.Autowired)(x.Vr),__metadata("design:type","function"==typeof(p=void 0!==x.Vr&&x.Vr)?p:Object)],eo.prototype,"settingsManager",void 0),__decorate([(0,f.Autowired)(K.TD),__metadata("design:type",Array)],eo.prototype,"modelRequestProcessors",void 0),__decorate([(0,f.Autowired)(q.el),__metadata("design:type",Object)],eo.prototype,"sensitiveModelBoundary",void 0),__decorate([(0,f.Autowired)(k.Nx),(0,f.Optional)(),__metadata("design:type",Object)],eo.prototype,"galileoTimingHook",void 0),eo=__decorate([(0,f.Component)(K.lx,U.Ye)],eo)}};
1
+ "use strict";exports.ids=["6784"],exports.modules={16256(e,t,r){r.r(t),r.d(t,{DEFAULT_FIRST_TOKEN_TIMEOUT_MS:()=>W,DEFAULT_REQUEST_MAX_RETRIES:()=>ee,DEFAULT_STREAM_IDLE_TIMEOUT_MS:()=>z,DRAIN_BODY_TIMEOUT_MS:()=>eo,MAX_REQUEST_MAX_RETRIES:()=>et,ModelProviderImpl:()=>es,REQUEST_RETRY_BASE_DELAY_MS:()=>J,REQUEST_RETRY_MAX_DELAY_MS:()=>Z,WATCHDOG_MAX_BACKOFF_MS:()=>er,computeRequestRetryDelayMs:()=>computeRequestRetryDelayMs,extractMockE2EResponseDiagnostics:()=>extractMockE2EResponseDiagnostics,isRetryWatchdogEnabled:()=>isRetryWatchdogEnabled,resolveRequestMaxRetries:()=>resolveRequestMaxRetries,resolveTimeoutMs:()=>resolveTimeoutMs});var o,s,n,a,i,l,d,c,u,m,g,p,_,h=r(46193),E=r(57975),f=r(38522),R=r(88523),y=r(7268),T=r(14913),A=r(86482),S=r(51147),I=r(9151),M=r(92735),v=r(96453),O=r(19672),C=r(49839),b=r(20173),$=r(73122),w=r(66678),D=r(73502),P=r(94480),L=r(49484),k=r(35061),N=r(33678),U=r(54202),q=r(13498),H=r(66173),x=r(95629),V=r(84570),B=r(13945),G=r(46712),F=r(45214),Y=r(1498),K=r(19585),X=r(75990),__decorate=function(e,t,r,o){var s,n=arguments.length,a=n<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,o);else for(var i=e.length-1;i>=0;i--)(s=e[i])&&(a=(n<3?s(a):n>3?s(t,r,a):s(t,r))||a);return n>3&&a&&Object.defineProperty(t,r,a),a},__metadata=function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};let Q=(0,E.promisify)(f.gunzip),W=12e5,z=3e5;function resolveTimeoutMs(e,t){if(e){let t=parseInt(e,10);if(!isNaN(t)&&t>0)return t}return t}let J=500,Z=32e3,ee=8,et=15,er=3e5,eo=5e3;function resolveRequestMaxRetries(e){if(void 0!==e&&""!==e){let t=parseInt(e,10);if(!isNaN(t)&&t>=0)return Math.min(t,et)}return ee}function isRetryWatchdogEnabled(e){if("string"!=typeof e)return!1;let t=e.trim().toLowerCase();return"1"===t||"true"===t||"yes"===t}function computeRequestRetryDelayMs(e,t,r=Z,o=Math.random){return null!=t&&t>0?Math.min(t,r):Math.min(J*Math.pow(2,Math.max(0,e-1)),r)*(1-.25*o())}function readResponseHeader(e,t){if(!e||"object"!=typeof e)return;try{let r=e.get?.(t);if(null!=r)return String(r)}catch{}let r=Object.keys(e).find(e=>e.toLowerCase()===t.toLowerCase()),o=r?e[r]:void 0;return null==o?void 0:String(o)}function extractMockE2EResponseDiagnostics(e){let t={traceId:readResponseHeader(e,"x-mock-trace-id"),requestId:readResponseHeader(e,"x-mock-request-id"),matchSource:readResponseHeader(e,"x-mock-match-source"),matchResult:readResponseHeader(e,"x-mock-match-result"),offset:readResponseHeader(e,"x-mock-offset"),responseId:readResponseHeader(e,"x-mock-response-id"),finishReason:readResponseHeader(e,"x-mock-finish-reason"),dataVersion:readResponseHeader(e,"x-mock-data-version"),instance:readResponseHeader(e,"x-mock-instance"),contentKind:readResponseHeader(e,"x-mock-content-kind")};return Object.values(t).some(e=>void 0!==e)?t:void 0}let es=class{constructor(){this.modelRequestProcessors=[],this.modelCache=new Map}normalizeChatCompletionsUrl(e){let t=e.search(/[?#]/),r=t>=0?e.slice(t):"",o=t>=0?e.slice(0,t):e;for(o=o.replace(/\/+$/,"");o.endsWith("/chat/completions");)o=o.slice(0,-17);return`${o}/chat/completions${r}`}async decodeDebugRequestBody(e){return"string"==typeof e?JSON.parse(e):e instanceof Uint8Array?31===e[0]&&139===e[1]?JSON.parse((await Q(e)).toString("utf-8")):JSON.parse(Buffer.from(e).toString("utf-8")):e}isCustomModelRequest(e,t){let r=e||t?.id;return!!(r?.startsWith(I.CUSTOM_LOCAL_MODEL_PREFIX)||r?.startsWith("custom:"))||t?.trustLevel===I.ModelTrustLevel.CUSTOM||Array.isArray(t?.tags)&&t.tags.includes(I.MODEL_TAG_CUSTOM)}shouldApplyInternalModelRequestHeaders(e,t){return!!t&&!this.isCustomModelRequest(e,t)}isRecord(e){return!!e&&"object"==typeof e&&!Array.isArray(e)}mergeRequestProviderData(e,t){if(!t||!this.isRecord(e))return e;let r=this.isRecord(t.extra_vars)?t.extra_vars:void 0,o=this.isRecord(e.extra_vars)?e.extra_vars:{};return{...e,...t,...r?{extra_vars:{...o,...r}}:{}}}hasGrowthEventExtraVars(e){return!!this.isRecord(e)&&this.isRecord(e.extra_vars)&&"string"==typeof e.extra_vars.growthEvent}resolveRootRequestId(e){let t=e.meta?.rootRequestId;return"string"==typeof t&&t.length>0?t:void 0}resolveParentConversationId(e){let t=e.meta?.parentConversationId;if("string"==typeof t&&0!==t.length&&t!==e.id)return t}resolveAgentType(e){return e.meta?.teamContext?"team":e.meta?.parentConversationId?"subagent":"main"}getHeaderCaseInsensitive(e,t){let r=Object.keys(e).find(e=>e.toLowerCase()===t.toLowerCase());return r?e[r]:void 0}setHeaderCaseInsensitive(e,t,r){let o=Object.keys(e).find(e=>e.toLowerCase()===t.toLowerCase());o&&delete e[o],e[t]=r}parseSSEChunk(e,t=!1){let r,o,s=!1,n=!1,a=null,i=!1,l="";try{for(let d of e.toString("utf-8").split("\n")){let e=d.trim();if(!e.startsWith("data:"))continue;let c=e.slice(5).trim();if(c&&"[DONE]"!==c)try{let e=JSON.parse(c);if(void 0===r&&"string"==typeof e?.id&&e.id.length>0&&(r=e.id),e?.usage!=null&&(i=!0,t&&"object"==typeof e.usage)){let t=e.usage;o={prompt_tokens:"number"==typeof t.prompt_tokens?t.prompt_tokens:void 0,completion_tokens:"number"==typeof t.completion_tokens?t.completion_tokens:void 0,total_tokens:"number"==typeof t.total_tokens?t.total_tokens:void 0}}let d=e?.choices;if(!Array.isArray(d)||0===d.length)continue;for(let e of d){"string"==typeof e.finish_reason&&""!==e.finish_reason&&(s=!0,a=e.finish_reason);let r=e.delta;if(r){let e="string"==typeof r.content&&r.content.length>0,o="string"==typeof r.reasoning_content&&r.reasoning_content.length>0||"string"==typeof r.reasoning&&r.reasoning.length>0,a=Array.isArray(r.tool_calls)&&r.tool_calls.length>0,i="string"==typeof r.refusal&&r.refusal.length>0;(e||o||a||i)&&(s=!0),(e||a||i)&&(n=!0),t&&e&&(l+=r.content)}}if(s&&n&&a&&i)break}catch{}}}catch{}return{hasContent:s,hasSubstantiveContent:n,finishReason:a,hasUsage:i,chunkId:r,usage:o,deltaContent:l.length>0?l:void 0}}normalizeStreamingToolCallIds(e,t){if(!e.includes("tool_calls"))return e;let r=e.split("\n"),o=!1;for(let e=0;e<r.length;e++){let s=r[e].trim();if(!s.startsWith("data:"))continue;let n=s.slice(5).trimStart();if(n&&"[DONE]"!==n)try{let s=JSON.parse(n),a=s?.choices;if(!Array.isArray(a)||0===a.length)continue;let i=a[0]?.delta;if(!i?.tool_calls||!Array.isArray(i.tool_calls)||0===i.tool_calls.length)continue;let l=!1;for(let e of i.tool_calls)null!=e.id&&"string"==typeof e.id&&""!==e.id&&(t.has(e.id)?"number"==typeof e.index&&(delete e.id,l=!0):t.add(e.id));if(l){let t=r[e].startsWith("data: ")?"data: ":"data:";r[e]=`${t}${JSON.stringify(s)}`,o=!0}}catch{}}return o?r.join("\n"):e}createStreamingTextProcessor(){let e=new h.StringDecoder("utf-8"),t=new TextEncoder,r=new Set;return{process:o=>{let s=e.write(o);return 0===s.length?null:t.encode(this.normalizeStreamingToolCallIds(s,r))},flush:()=>{let r=e.end();return r.length>0?t.encode(r):null}}}parseCustomHeaders(e){if(!e)return{};let t={},r=[];for(let o of(e.includes("\\n")?r.push(...e.split("\\n")):e.includes("\n")?r.push(...e.split("\n")):r.push(e),r)){let e=o.trim();if(!e)continue;let r=e.indexOf(":");if(-1===r)continue;let s=e.substring(0,r).trim(),n=e.substring(r+1).trim();s&&n&&(t[s]=n)}return t}async getCustomHeaders(e){let t;this.logger.setContext("ModelProvider");let r=this.parseCustomHeaders(process.env[V.nW]),o=await this.settingsManager.get("env"),s=this.parseCustomHeaders(o?.[V.nW]),n=await this.settingsManager.get("enableModelOptimization"),a=n?.enabled!==!1;if(void 0===n)try{let e=await this.productManager.waitConfiguration();e.productFeatures?.[I.ProductFeature.DisableYuanbaoChannel]===!0&&(a=!1)}catch{}s[S.PRIVATE_DATA_HEADER]=a?"false":"true";let i={};try{let e=T.Context.getRequest()?.body;if(e?.header){let t=G.HeaderUtils.convertHeaderArrayToObject(e.header);t&&(i=t)}}catch(e){}let l={};try{let e=this.sessionManager.getCurrent()||this.sessionManager.sessionSubject.getValue();e?.requestOptions?.headers?(l=e.requestOptions.headers,this.logger.debug(`[ModelProvider] session headers from session ${e.id}: keys=[${Object.keys(l).join(",")}]`)):this.logger.debug(`[ModelProvider] no session headers for session ${e?.id}`)}catch(e){this.logger.warn(`[ModelProvider] error reading session headers: ${e}`)}let d={...r,...s,...i,...l};this.logger.debug(`[ModelProvider] merged headers: keys=[${Object.keys(d).join(",")}]`),process.env[V.QB]&&this.logger.debug("[ModelProvider] API key disabled via env"),process.env[V.QB]||(t=o?.[V.XO]||process.env[V.XO]);try{if(e.modelId){let r=await this.productManager.waitConfiguration(),o=r.models?.find(t=>t.id===e.modelId);o?.apiKey&&(t=o.apiKey,this.logger.debug(`Using custom API key in headers for model ${e.modelId}`))}}catch(e){}t&&(d[S.API_KEY_HEADER]=t,d[y.HttpHeaders.AUTHORIZATION]=`Bearer ${t}`);let c=this.authenticationManager.currentSessionSubject.getValue()?.account,u=c?.enterpriseId?.trim(),m=(0,A.isPersonalAccount)(c)&&!u;return await G.IOAUtils.applyIOADefaultHeaders(d,o,{enterpriseId:u,skipDefaultEnterpriseHeaders:m}),d}async enableThinking(){let e=await this.settingsManager.get("alwaysThinkingEnabled"),t=await this.agentManager.getDefault(),r=await this.agentManager.getModel(t.name);return!!(e&&r.supportsReasoning)}async injectReasoningSummaryIfNeeded(e){return!(!(await this.enableThinking()||"string"==typeof e?.reasoning_effort||"string"==typeof e?.reasoning?.effort)||e?.reasoning_summary)&&(e.reasoning_summary="auto",!0)}isConnectionLevelRetryableError(e){if(!e||void 0!==e.response)return!1;let t="string"==typeof e.code?e.code:"",r="string"==typeof e.message?e.message.toLowerCase():"";return!!(new Set(["ECONNRESET","ECONNREFUSED","ETIMEDOUT","EAI_AGAIN","EPIPE","EPROTO","UND_ERR_SOCKET","ERR_STREAM_PREMATURE_CLOSE"]).has(t)||r.includes("socket hang up"))}isRequestLevelRetryableError(e,t){if(!e)return!1;let r=this.parseErrorResponseBody(e),matchesOwnModelCode=t=>t(e)||!!r&&t(r);if(matchesOwnModelCode(F.o4.isQuotaExhaustedError)||!t&&matchesOwnModelCode(F.o4.isCraftDailyQuotaBusinessCode))return!1;let o=e.response?.status;return!!((0,Y.A1)("number"==typeof o?o:void 0)||!t&&matchesOwnModelCode(F.o4.isTransientRateLimitBusinessCode))}parseErrorResponseBody(e){let t=e?.response?.data;if(t&&"object"==typeof t&&"function"!=typeof t.pipe)return t;if("string"==typeof t&&""!==t.trim())try{let e=JSON.parse(t);return e&&"object"==typeof e?e:void 0}catch{}}async drainErrorResponseBody(e,t){let r=e?.response?.data;if(r&&"function"==typeof r.pipe&&"function"==typeof r.on)try{let o=await new Promise((e,o)=>{let s=[],n=!1,onData=e=>s.push(e),onEnd=()=>{finish(),e(Buffer.concat(s).toString("utf8"))},onError=e=>{finish(),o(e)},onAbort=()=>{finish();try{r.destroy()}catch{}o(Error("Request aborted."))},a=setTimeout(()=>{finish();try{r.destroy()}catch{}o(Error("drain body timeout"))},eo);function finish(){n||(n=!0,clearTimeout(a),r.removeListener("data",onData),r.removeListener("end",onEnd),r.removeListener("error",onError),t?.removeEventListener("abort",onAbort))}("function"==typeof a.unref&&a.unref(),t?.aborted)?onAbort():(t?.addEventListener("abort",onAbort,{once:!0}),r.on("data",onData),r.on("end",onEnd),r.on("error",onError))});e.response.data=o}catch{}}abortableSleep(e,t){return new Promise((r,o)=>{if(t?.aborted)return void o(Error("Request aborted."));let s=setTimeout(()=>{t?.removeEventListener("abort",onAbort),r()},e);"function"==typeof s.unref&&s.unref();let onAbort=()=>{clearTimeout(s),o(Error("Request aborted."))};t?.addEventListener("abort",onAbort,{once:!0})})}async requestWithConnectionRetry(e,t,r,o,s){let n,a=resolveRequestMaxRetries(process.env.CODEBUDDY_MAX_RETRIES),i=isRetryWatchdogEnabled(process.env.CODEBUDDY_RETRY_WATCHDOG),l=0,d=0;for(;;)try{let t=await this.restOperations.request(e);return s?.setAttribute("retry_count",l+d),t}catch(u){n=u;let c=e?.signal;if(c?.aborted)break;if(this.isConnectionLevelRetryableError(u)){if(l>=1)break;l+=1,s?.addEvent("retry_attempt",{attempt:l,kind:"connection",error_code:String(u?.code??""),error_message:String(u?.message??"")}),this.logger.warn(`[ModelProvider] Connection-level failure before response headers, retrying once: agent=${t}, requestId=${r}, code=${u?.code}, message=${u?.message}`);continue}if(await this.drainErrorResponseBody(u,c),this.isRequestLevelRetryableError(u,o)){if(!i&&d>=a)break;d+=1;let e=u?.response?.status,o=u?.response?.headers,n=(0,Y.oR)(o),l=i?er:Z,m=i?(0,Y.O2)(o):null,g=null!=m?Math.min(m,l):computeRequestRetryDelayMs(d,n,l);s?.addEvent("retry_attempt",{attempt:d,kind:"request",status:"number"==typeof e?e:-1,delay_ms:Math.round(g)}),this.logger.warn(`[ModelProvider] Request-level failure before generation, backing off and retrying: agent=${t}, requestId=${r}, status=${e}, attempt=${d}${i?"(watchdog)":`/${a}`}, delayMs=${Math.round(g)}${null!=n?`(retry-after=${n}ms)`:""}${null!=m?`(reset-in=${m}ms)`:""}`),await this.abortableSleep(g,c);continue}break}throw s?.setAttribute("retry_count",l+d),n}getModelTracer(){return this.traceService?.activeTracer??v.u.getTracer("workbuddy.agent.model")}async runWithGalileoModelRequestSpan(e,t){let{parentContext:r,parentSpanId:o}=this.createOtelParentContextFromTraceHeaders(e.headers),s={"span.type":"model_request","http.method":e.method.toUpperCase(),"http.url":this.sanitizeUrlForTrace(e.url),"model.id":e.model,"agent.name":e.agentName,"request.id":e.requestId,"model.stream":e.isStreamRequest,"conversation.request.id":e.headers[S.CONVERSATION_REQUEST_ID_HEADER]??e.requestId,"workbuddy.session_id":e.headers[S.CONVERSATION_ID_HEADER]??"","workbuddy.prompt_request_id":e.promptRequestId??e.headers[S.CONVERSATION_REQUEST_ID_HEADER]??"","workbuddy.message_id":e.headers[S.CONVERSATION_MESSAGE_ID_HEADER]??"","workbuddy.request_id":e.headers[S.REQUEST_ID_HEADER]??e.requestId};try{let t=new URL(e.url);s["http.target"]=`${t.pathname}${t.search}`,s["net.peer.name"]=t.hostname,t.port&&(s["net.peer.port"]=Number(t.port))}catch{}let n=this.getModelTracer().startSpan("codebuddy_code.model_request",{kind:O.v.CLIENT,attributes:s},r);this.injectOtelSpanHeaders(e.headers,n,o);let a=n.spanContext();return this.logger.info(`[GalileoMVP] model request span started: traceId=${a.traceId}, spanId=${a.spanId}, parentSpanId=${o||""}, requestId=${e.requestId}, url=${this.sanitizeUrlForTrace(e.url)}`),C._.with(v.u.setSpan(r,n),async()=>{try{let e=await t(n),r=e?.status;return"number"==typeof r?(n.setAttribute("http.status_code",r),n.setStatus({code:r>=400?b.s.ERROR:b.s.OK,...r>=400?{message:`HTTP ${r}`}:{}})):n.setStatus({code:b.s.OK}),e}catch(e){throw"number"==typeof e.response?.status&&n.setAttribute("http.status_code",e.response.status),e.code&&n.setAttribute("error.code",String(e.code)),n.recordException(e),n.setStatus({code:b.s.ERROR,message:e.message}),e}finally{n.end()}})}createOtelParentContextFromTraceHeaders(e){let t=this.getHeaderCaseInsensitive(e,"b3"),r=t?.split("-")??[],o=this.getHeaderCaseInsensitive(e,"x-b3-traceid")||this.getHeaderCaseInsensitive(e,"x-trace-id")||r[0],s=this.getHeaderCaseInsensitive(e,"x-b3-spanid")||r[1],n=this.getHeaderCaseInsensitive(e,"x-b3-sampled")||r[2];return o&&s&&/^[0-9a-f]{32}$/i.test(o)&&/^[0-9a-f]{16}$/i.test(s)&&"00000000000000000000000000000000"!==o?{parentContext:v.u.setSpanContext($.l,{traceId:o.toLowerCase(),spanId:s.toLowerCase(),traceFlags:"0"===n||"false"===n?w.X.NONE:w.X.SAMPLED,isRemote:!0}),parentSpanId:s.toLowerCase()}:{parentContext:C._.active()}}createModelStreamSpan(e,t,r,o,s){let n,a=!1;try{let{parentContext:a}=this.createOtelParentContextFromTraceHeaders(e);n=this.getModelTracer().startSpan(M.SPAN_NAME_MODEL_STREAM,{kind:O.v.CLIENT,attributes:{[M.MODEL_STREAM_ATTRS.SPAN_TYPE]:M.SPAN_TYPE_MODEL_STREAM,"model.id":t,"agent.name":r,"request.id":o,"conversation.request.id":e[S.CONVERSATION_REQUEST_ID_HEADER]??o,"workbuddy.session_id":e[S.CONVERSATION_ID_HEADER]??"","workbuddy.prompt_request_id":s??e[S.CONVERSATION_REQUEST_ID_HEADER]??"","workbuddy.message_id":e[S.CONVERSATION_MESSAGE_ID_HEADER]??"","workbuddy.request_id":e[S.REQUEST_ID_HEADER]??o}},a)}catch(e){this.logger.info(`[ModelProvider] model_stream span start failed: ${e}`)}return{span:n,endSpan:(e,t,r)=>{n&&!a&&(a=!0,n.setAttribute(M.MODEL_STREAM_ATTRS.CHUNK_COUNT,e.chunkCount),n.setAttribute(M.MODEL_STREAM_ATTRS.TOTAL_BYTES,e.totalBytes),n.setAttribute("stream.status",t),n.setAttribute("workbuddy.stop_reason",r?.message??t),"error"===t?(r&&n.recordException(r),n.setStatus({code:b.s.ERROR,message:r?.message})):"ok"===t?n.setStatus({code:b.s.OK}):n.addEvent("aborted"),n.end())}}}writeGenAiRequestAttrs(e,t){if(!t||"object"!=typeof t)return;let j=e=>{try{return"string"==typeof e?e:JSON.stringify(e)}catch{return""}},clip=(e,t)=>e.length>t?e.slice(0,t):e,r=(0,M.readOtelLoggingFlags)().logUserPrompts,o={};if("number"==typeof t.temperature&&(o.temperature=t.temperature,e.setAttribute(M.LLM_SOURCE_ATTRS.REQUEST_TEMPERATURE,t.temperature)),"number"==typeof t.top_p&&(o.top_p=t.top_p,e.setAttribute(M.LLM_SOURCE_ATTRS.REQUEST_TOP_P,t.top_p)),"number"==typeof t.max_tokens&&(o.max_tokens=t.max_tokens,e.setAttribute(M.LLM_SOURCE_ATTRS.REQUEST_MAX_TOKENS,t.max_tokens)),void 0!==t.max_completion_tokens&&(o.max_completion_tokens=t.max_completion_tokens),void 0!==t.frequency_penalty&&(o.frequency_penalty=t.frequency_penalty),void 0!==t.presence_penalty&&(o.presence_penalty=t.presence_penalty),void 0!==t.stream&&(o.stream=t.stream),Object.keys(o).length>0&&e.setAttribute(M.LLM_SOURCE_ATTRS.REQUEST_PARAMETERS,j(o)),Array.isArray(t.messages)&&t.messages.length>0){let o=t.messages,s=j(o);s&&(e.setAttribute(M.LLM_SOURCE_ATTRS.INPUT_MESSAGES,clip(s,M.LLM_SOURCE_VALUE_MAX_SIZE)),s.length>M.LLM_SOURCE_VALUE_MAX_SIZE&&e.setAttribute(M.LLM_SOURCE_ATTRS.INPUT_TRUNCATED,!0)),e.setAttribute(M.LLM_SOURCE_ATTRS.PROMPT_COUNT,o.length);let n=Math.min(o.length,M.MAX_PROMPT_MESSAGES);for(let t=0;t<n;t++){let s=o[t];if(s&&"object"==typeof s){if(s.role&&e.setAttribute(M.LLM_PROMPT_KEYS.role(t),String(s.role)),s.tool_call_id&&e.setAttribute(M.LLM_PROMPT_KEYS.toolCallId(t),String(s.tool_call_id)),Array.isArray(s.tool_calls)&&s.tool_calls.length>0){e.setAttribute(M.LLM_PROMPT_KEYS.toolCallCount(t),s.tool_calls.length);for(let o=0;o<s.tool_calls.length;o++){let n=s.tool_calls[o];if(!n||"object"!=typeof n)continue;let a=M.LLM_PROMPT_KEYS.toolCall(t,o),i=n.function??{};n.id&&e.setAttribute(a.id,String(n.id)),i.name&&e.setAttribute(a.name,String(i.name)),r&&void 0!==i.arguments&&e.setAttribute(a.arguments,clip(j(i.arguments),M.LLM_SOURCE_PROMPT_VALUE_MAX_SIZE))}}if(r&&void 0!==s.content){let r=j(s.content);r&&e.setAttribute(M.LLM_PROMPT_KEYS.content(t),clip(r,M.LLM_SOURCE_PROMPT_VALUE_MAX_SIZE))}}}}}injectOtelSpanHeaders(e,t,r){let o=t.spanContext(),s=(o.traceFlags&w.X.SAMPLED)===w.X.SAMPLED;this.setHeaderCaseInsensitive(e,"traceparent",`00-${o.traceId}-${o.spanId}-${s?"01":"00"}`),this.setHeaderCaseInsensitive(e,"b3",`${o.traceId}-${o.spanId}-${s?"1":"0"}${r?`-${r}`:""}`),this.setHeaderCaseInsensitive(e,"X-B3-TraceId",o.traceId),r&&this.setHeaderCaseInsensitive(e,"X-B3-ParentSpanId",r),this.setHeaderCaseInsensitive(e,"X-B3-SpanId",o.spanId),this.setHeaderCaseInsensitive(e,"X-B3-Sampled",s?"1":"0"),this.setHeaderCaseInsensitive(e,"X-Trace-ID",o.traceId)}sanitizeUrlForTrace(e){return e.replace(/([?&])(key|token|api_key|apikey|secret|password)=[^&]*/gi,"$1$2=***")}axiosToFetchAdapter(){return async(e,t)=>{let r,o,s,n,a,i="string"==typeof e?e:e.url,l=t?.method||"GET",d=t?.headers,c=t?.body,u=Date.now(),m={};if(d)if(d instanceof Headers)m={},d.forEach((e,t)=>{m[t]=e});else if(Array.isArray(d))for(let[e,t]of(m={},d))m[e]=t;else m={...d};let g=this.sessionManager.getCurrent()||this.sessionManager.sessionSubject.getValue();g.messageId=(0,R.generateUUUID)().replace(/-/g,""),m[S.CONVERSATION_ID_HEADER]=g.id,m[S.CONVERSATION_REQUEST_ID_HEADER]=g.conversationRequestId||"",m[S.CONVERSATION_MESSAGE_ID_HEADER]=g.messageId,m[S.REQUEST_ID_HEADER]=g.messageId,m[S.AGENT_INTENT]=g.meta?.["codebuddy.ai/mode"]??"craft",process.env.PERSONAL_AGENT_ROLE?m[S.AGENT_PURPOSE]="person_agent":g.agentPurpose&&(m[S.AGENT_PURPOSE]=g.agentPurpose);let p=g.telemetryClientInfo;if(!p?.ideType||!p.ideName||!p.ideVersion){let e=await this.clientInfoProvider.get();r=e.ideType,o=e.platform,s=e.platformVersion}m[S.IDE_TYPE_HEADER]=p?.ideType||r||k.Vo,m[S.IDE_NAME_HEADER]=p?.ideName||o||"",m[S.IDE_VERSION_HEADER]=p?.ideVersion||s||"0.0.0";let _=null,h=!1;if(c&&"string"==typeof c)try{_=JSON.parse(c)}catch{}else c&&"object"==typeof c&&(_=c);if(_?.model&&(n=_.model),n)try{let e=await this.productManager.waitConfiguration();if(a=e.models?.find(e=>e.id===n),a?.url)if(a.useCustomProtocol)i=a.url,this.logger.info(`Using custom URL for model ${n}: ${i} (useCustomProtocol=true, URL passthrough)`);else{let e=this.isCustomModelRequest(n,a);i=e?this.normalizeChatCompletionsUrl(a.url):a.url,this.logger.info(`Using custom URL for model ${n}: ${i}(raw:${a?.url})${e?" (custom model, ensured /chat/completions)":""}`)}}catch(e){}let E=g.requestOptions?.providerData;if(E){let e=this.isCustomModelRequest(n,a),t=process.env[V.qL]===U.pg.Selfhosted;if(!e||t){let e=this.mergeRequestProviderData(_,E);e!==_&&(_=e,h=!0)}}if(!a?.useCustomProtocol&&/\/chat\/completions(?:[/?#]|$)/.test(i)){let e=this.normalizeChatCompletionsUrl(i);e!==i&&(this.logger.info(`Normalized duplicated /chat/completions in URL: ${i} -> ${e}`),i=e)}for(let[e,t]of Object.entries(await this.getCustomHeaders({modelId:n||""})))this.setHeaderCaseInsensitive(m,e,t);delete m.authorization,delete m["user-agent"];let f=(0,L.Gp)();for(let[e,t]of(f?.auth?.accessToken&&!Object.keys(m).some(e=>"authorization"===e.toLowerCase())&&(m[y.HttpHeaders.AUTHORIZATION]=`Bearer ${f.auth.accessToken}`),Object.entries((0,L.I2)())))Object.keys(m).some(t=>t.toLowerCase()===e.toLowerCase())||(m[e]=t);if(this.isCustomModelRequest(n,a)){let e=Object.keys(m).find(e=>e.toLowerCase()===S.PRIVATE_DATA_HEADER.toLowerCase());e&&delete m[e]}let T=this.agentManager.getVolatilePluginAgentState().internalModelRequestHeaders;if(T&&this.shouldApplyInternalModelRequestHeaders(n,a))for(let[e,t]of Object.entries(T))this.setHeaderCaseInsensitive(m,e,t);this.setHeaderCaseInsensitive(m,S.REQUEST_ID_HEADER,g.messageId),this.setHeaderCaseInsensitive(m,S.CONVERSATION_MESSAGE_ID_HEADER,g.messageId);let v=this.resolveRootRequestId(g);v&&this.setHeaderCaseInsensitive(m,S.ROOT_REQUEST_ID_HEADER,v);let O=this.resolveParentConversationId(g);O&&this.setHeaderCaseInsensitive(m,S.PARENT_CONVERSATION_ID_HEADER,O),this.setHeaderCaseInsensitive(m,S.AGENT_TYPE_HEADER,this.resolveAgentType(g));let C=await this.settingsManager.get("env"),b=C?.[V.hv]||process.env[V.hv];if(b)for(let e of(m[A.HTTP_HEADER_SKIP_AUTH_INTERCEPTOR]="1",[S.CONVERSATION_ID_HEADER,S.CONVERSATION_REQUEST_ID_HEADER,S.CONVERSATION_MESSAGE_ID_HEADER,S.PARENT_CONVERSATION_ID_HEADER,S.AGENT_TYPE_HEADER,S.REQUEST_ID_HEADER,S.AGENT_INTENT,S.AGENT_PURPOSE,S.IDE_TYPE_HEADER,S.IDE_NAME_HEADER,S.IDE_VERSION_HEADER,S.PRODUCT,S.API_KEY_HEADER,S.PRIVATE_DATA_HEADER,...Object.keys(T??{})]))delete m[e];if(_&&await this.injectReasoningSummaryIfNeeded(_)&&(h=!0),_&&n){let e=(0,I.stripCustomLocalModelPrefix)(n);e!==n&&_.model===n&&(_.model=e,h=!0)}if(_&&a?.tags?.includes("custom")&&!1===a.supportsImages&&Array.isArray(_.messages)){let e=!1;for(let t of _.messages)if(Array.isArray(t.content)){let r=t.content.filter(e=>"text"===e.type).map(e=>e.text);t.content=r.join("\n"),e=!0}e&&(h=!0,this.logger.debug(`Flattened array content to string for custom model ${n}`))}if(_&&this.isCustomModelRequest(n,a)&&a?.supportsToolCall===!1){let e=await this.productManager.waitConfiguration();e.productFeatures?.[I.ProductFeature.SkipToolCallSupportCheck]!==!0&&(void 0!==_.tools||void 0!==_.tool_choice)&&(delete _.tools,delete _.tool_choice,h=!0,this.logger.info(`Stripped tools/tool_choice from request body (model ${n} does not support tool calls)`))}h&&_&&"string"==typeof c&&(c=JSON.stringify(_));let $={url:i,method:l,headers:m,data:c,signal:t?.signal||void 0,modelId:n,maxBodyLength:1/0,maxContentLength:1/0};for(let e of[...this.modelRequestProcessors].sort((e,t)=>(e.priority??1e3)-(t.priority??1e3)))await e.process($);if(b){let e=new Set([S.CONVERSATION_ID_HEADER,S.CONVERSATION_REQUEST_ID_HEADER,S.CONVERSATION_MESSAGE_ID_HEADER,S.PARENT_CONVERSATION_ID_HEADER,S.AGENT_TYPE_HEADER,S.REQUEST_ID_HEADER,S.AGENT_INTENT,S.AGENT_PURPOSE,S.IDE_TYPE_HEADER,S.IDE_NAME_HEADER,S.IDE_VERSION_HEADER,S.PRODUCT,S.API_KEY_HEADER,S.PRIVATE_DATA_HEADER,...Object.keys(T??{}),A.HTTP_HEADER_SKIP_AUTH_INTERCEPTOR,"X-User-Id","X-Enterprise-Id","X-Department-Info","X-Tenant-Id","X-Domain","User-Agent","X-Requested-With"].map(e=>e.toLowerCase())),t=["x-stainless-"],r=$.transformRequest;$.transformRequest=[...Array.isArray(r)?r:r?[r]:[],(r,o)=>{if(!o)return r;let s=new Set(["common","delete","get","head","post","put","patch"]);for(let r of Object.keys(o)){if(s.has(r))continue;let n=r.toLowerCase();if(e.has(n)){delete o[r];continue}t.some(e=>n.startsWith(e))&&delete o[r]}return r}]}let w="text/event-stream"===m.Accept||"text/event-stream"===m.accept||i.includes("stream=true")||"string"==typeof c&&c.includes('"stream":true');w&&($.responseType="stream");let D=this.getHeaderCaseInsensitive(m,S.REQUEST_ID_HEADER)||"unknown";this.hasGrowthEventExtraVars(_)&&(g.requestOptions.growthEventRequestId=g.conversationRequestId||void 0);let P=this.telemetryService.reportMessageSendTelemetry(m,c,w),N=g.agentName||"unknown",q=n||_?.model||"unknown",H=Date.now();this.galileoTimingHook?.reportPromptBuild(H-u,{model:q,agentName:N});let x=$.url?.replace(/([?&])(key|token|api_key|apikey|secret|password)=[^&]*/gi,"$1$2=***");if(this.logger.info(`[ModelProvider] Sending request: agent=${N}, model=${q}, requestId=${D}, stream=${w}, url=${x}`),g.promptReceivedAt&&!g.firstModelRequestTimingReported){g.firstModelRequestTimingReported=!0;let e=g.promptSeq??0,t=Date.now(),r=t-g.promptReceivedAt,o=g.runnerStartedAt?t-g.runnerStartedAt:-1,s=1===e?"first":`n=${e}`;this.logger.info(`[ModelProvider] message-to-model-request latency: ${r}ms (sinceRunnerStart=${o}ms, promptSeq=${e}, kind=${s}, agent=${N}, model=${q}, sessionId=${g.id})`)}if("function"==typeof this.logger.debug)try{let e=Array.isArray(_?.tools)?_.tools:void 0,t=e?e.map(e=>e?.function?.name??e?.name).filter(Boolean):void 0;this.logger.debug(`[ModelProvider][toolsInBody] requestId=${D} model=${q} `+(t?`toolCount=${t.length} tools=[${t.join(",")}]`:"tools=<none in body>"))}catch{}process.env.CODEBUDDY_DEBUG_REQUEST&&(async()=>{try{let{messages:e,...t}=await this.decodeDebugRequestBody($.data)||{};if(this.logger.info(`[ModelProvider] Request body (no messages): ${JSON.stringify(t)}`),e)for(let t=0;t<e.length;t++){let r=e[t],o=JSON.stringify(r).slice(0,500);this.logger.info(`[ModelProvider] messages[${t}]: ${o}`)}}catch{}})().catch(()=>{});try{let e={...m},r=await this.runWithGalileoModelRequestSpan({url:$.url,method:l,headers:$.headers,model:q,agentName:N,requestId:D,isStreamRequest:w,promptRequestId:g.promptRequestId},e=>this.requestWithConnectionRetry($,N,D,this.isCustomModelRequest(n,a),e)),o=extractMockE2EResponseDiagnostics(r.headers);if(o&&this.logger.info(`[MockE2E][response] ${JSON.stringify({sessionId:g.id,promptRequestId:g.promptRequestId,conversationRequestId:g.conversationRequestId,modelRequestId:D,model:q,httpStatus:r.status,...o})}`),g.conversationRequestId&&await this.telemetryService.flushPendingGrowthTelemetry(g,g.conversationRequestId),w||await this.telemetryService.reportMessageResponseTelemetryNonStream(g,P,r,!0),!w||!r.data||"function"!=typeof r.data.pipe)return new Response("string"==typeof r.data?r.data:JSON.stringify(r.data),{status:r.status,statusText:r.statusText,headers:r.headers});{let o=t?.signal,s=r.data,a=!1,l=0,d=0,c=Date.now(),u=!1,{span:m,endSpan:p}=this.createModelStreamSpan(e,q,N,D,g.promptRequestId),h=(0,M.shouldEmitGenAiSourceAttrs)(),E=[],f=0,R=!1,y=!1;if(h&&m)try{this.writeGenAiRequestAttrs(m,_)}catch(e){this.logger.info(`[ModelProvider] gen_ai request attrs write failed: ${e}`)}let T=resolveTimeoutMs(process.env.CODEBUDDY_STREAM_TIMEOUT_MS,z),A=resolveTimeoutMs(process.env.CODEBUDDY_FIRST_TOKEN_TIMEOUT_MS,W),S=(()=>{try{let e=this.sessionManager.getCurrent()||this.sessionManager.sessionSubject.getValue();if((e?.meta?.firstTokenTimeoutRetryCount??0)>=1)return this.logger.info(`[ModelProvider] Skipping first token timeout (already retried): agent=${N}, requestId=${D}`),!0}catch{}return!1})(),v=null,O=null,C=null,b=null,$=null,w=this.createStreamingTextProcessor(),P=0,L=0,k=0,U=!1,x=!1,V=null,B=!1,G=_?.stream_options?.include_usage===!0,F=!1,startStreamMonitor=()=>{!O&&(this.logger.info(`[ModelProvider] Stream idle monitor armed: agent=${N}, requestId=${D}, streamIdleTimeoutMs=${T}`),(O=setInterval(()=>{if(u||a){O&&(clearInterval(O),O=null);return}k++;let e=Date.now(),t=e-c;if(s.isPaused?.()&&s.resume(),k%10==0){let r=l-P,o=d-L;if(r>0){let s=e-H;this.logger.info(`[ModelProvider] Stream progress: agent=${N}, requestId=${D}, chunks=${l}(+${r}), bytes=${d}(+${o}), elapsed=${s}ms, idle=${t}ms`),m?.addEvent(M.MODEL_STREAM_EVENT_CHUNK_PROGRESS,{chunks:r,bytes:o,elapsed_ms:s}),P=l,L=d}}if(t>=T){if(x)this.logger.info(`[ModelProvider] Graceful close: finish_reason already received, stream idle for ${T}ms, agent=${N}, requestId=${D}, chunks=${l}, bytes=${d}`),gracefulCloseStream();else if(this.logger.error(`Stream timeout: no data received for ${T}ms, agent=${N}, requestId=${D}, chunkCount=${l}, totalBytes=${d}`),clearAllTimers(),u=!0,a=!0,p({chunkCount:l,totalBytes:d},"error",Error(`Stream timeout after ${T}ms idle`)),s.destroy(),v)try{v.error(new K.wM(T,l,d))}catch{}}},1e3))&&"function"==typeof O.unref&&O.unref())},clearFirstTokenTimer=()=>{C&&(clearTimeout(C),C=null)},clearAllTimers=()=>{clearFirstTokenTimer(),O&&(clearInterval(O),O=null),b&&(clearTimeout(b),b=null),$&&o&&(o.removeEventListener("abort",$),$=null)},cancelLocalModelGeneration=()=>{if(n?.startsWith(I.CUSTOM_LOCAL_MODEL_PREFIX))try{let e=new URL(i).origin,t=`${e}/v1/chat/completions/control`;this.logger.info(`[LocalModel] cancel: POST ${t} model=${n} chunks=${l}`),fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"stop"}),signal:AbortSignal.timeout(2e3)}).then(e=>this.logger.info(`[LocalModel] cancel response status=${e.status}`),e=>this.logger.warn(`[LocalModel] cancel failed: ${e?.message}`))}catch(e){this.logger.warn(`[LocalModel] cancel setup error: ${e?.message}`)}},destroyLocalModelSocket=()=>{if(n?.startsWith(I.CUSTOM_LOCAL_MODEL_PREFIX))try{let e=s.socket;e?e.destroyed?this.logger.info("[LocalModel] cancel: socket already destroyed"):(e.destroy(),this.logger.info("[LocalModel] cancel: TCP socket destroyed")):this.logger.info("[LocalModel] cancel: socket unavailable")}catch(e){this.logger.warn(`[LocalModel] cancel: socket destroy failed: ${e?.message}`)}},gracefulCloseStream=()=>{if(!u&&(u=!0,clearAllTimers(),p({chunkCount:l,totalBytes:d},"ok"),s.destroy(),v))try{let e=w.flush();e&&v.enqueue(e),v.close()}catch{}},startFinishReasonGraceTimer=e=>{!b&&!u&&!a&&(this.logger.info(`[ModelProvider] finish_reason="${e}" received, starting grace period: agent=${N}, requestId=${D}, chunks=${l}, bytes=${d}, elapsed=${Date.now()-H}ms`),(b=setTimeout(()=>{u||a||(this.logger.info(`[ModelProvider] Graceful close after finish_reason: stream idle for 5000ms after finish_reason, agent=${N}, requestId=${D}, chunks=${l}, bytes=${d}`),gracefulCloseStream())},5e3))&&"function"==typeof b.unref&&b.unref())},Y=new ReadableStream({start:e=>{if(v=e,S)U=!0,F=!0,startStreamMonitor();else{let e=Date.now()-H,t=Math.max(A-e,0);if(0===t){if(this.logger.error(`First token timeout: HTTP response headers took ${e}ms (exceeds ${A}ms threshold)`),u=!0,a=!0,p({chunkCount:l,totalBytes:d},"error",Error(`First token timeout after ${A}ms`)),s.destroy(),v)try{v.error(new K.wM(A,l,d,!0))}catch{}}else(C=setTimeout(()=>{if(!U&&!u&&!a){let e=Date.now()-H;if(this.logger.error(`First token timeout: no meaningful model output received for ${e}ms (threshold=${A}ms, received ${l} raw chunks, ${d} bytes)`),u=!0,a=!0,p({chunkCount:l,totalBytes:d},"error",Error(`First token timeout after ${A}ms`)),s.destroy(),v)try{v.error(new K.wM(A,l,d,!0))}catch{}}},t))&&"function"==typeof C.unref&&C.unref()}s.on("data",t=>{if(l++,d+=t.length,c=Date.now(),1===l&&this.logger.info(`[ModelProvider] First raw chunk received: agent=${N}, requestId=${D}, elapsed=${Date.now()-H}ms, bytes=${t.length}`),h&&!y&&t.includes('"usage"'))try{let e=this.parseSSEChunk(t,!0).usage;e&&(y=!0,"number"==typeof e.prompt_tokens&&m?.setAttribute(M.LLM_SOURCE_ATTRS.USAGE_PROMPT_TOKENS,e.prompt_tokens),"number"==typeof e.completion_tokens&&m?.setAttribute(M.LLM_SOURCE_ATTRS.USAGE_COMPLETION_TOKENS,e.completion_tokens),"number"==typeof e.total_tokens&&m?.setAttribute(M.LLM_SOURCE_ATTRS.USAGE_TOTAL_TOKENS,e.total_tokens))}catch(e){this.logger.info(`[ModelProvider] gen_ai usage capture failed: ${e}`)}if(!U||!x||!F||x&&G&&!B){let e=this.parseSSEChunk(t,h);if(h&&e.deltaContent&&!R&&(E.push(e.deltaContent),(f+=e.deltaContent.length)>=M.LLM_SOURCE_VALUE_MAX_SIZE&&(R=!0)),g.telemetry&&!g.telemetry.chunkId&&e.chunkId&&(g.telemetry.chunkId=e.chunkId),!B&&e.hasUsage&&(B=!0,x&&V&&startFinishReasonGraceTimer(V)),!x&&"error"===e.finishReason&&!F){x=!0,V=e.finishReason;let t=U?"reasoning-only":"no-token";if(this.logger.warn(`[ModelProvider] finish_reason="error" with no substantive model output (${t}), treating as retryable empty stream: agent=${N}, requestId=${D}, chunks=${l}, bytes=${d}, elapsed=${Date.now()-H}ms`),u=!0,a=!0,clearAllTimers(),p({chunkCount:l,totalBytes:d},"error",Error("finish_reason=error with no model output")),s.destroy(),v)try{v.error(new K.mY(l,d))}catch{}return}if(!F&&e.hasSubstantiveContent&&(F=!0),!U&&e.hasContent){U=!0;let e=Date.now()-H;if(g.telemetry&&(g.telemetry.firstTokenAt=H+e),this.logger.info(`[ModelProvider] First meaningful token received: agent=${N}, requestId=${D}, ttft=${e}ms, rawChunks=${l}, bytes=${d}`),this.galileoTimingHook?.reportTTFB(e,{model:q,requestId:D,agentName:N,conversationRequestId:g.conversationRequestId,messageId:g.messageId,promptRequestId:g.promptRequestId}),m?.setAttribute(M.MODEL_STREAM_ATTRS.FIRST_TOKEN_MS,e),m?.addEvent(M.MODEL_STREAM_EVENT_FIRST_TOKEN,{ttft_ms:e,chunk_count:l,bytes:d}),g.telemetry&&!g.telemetry.messageTtfbReported){let e=g.telemetry.firstTokenAt,t=g.meta?.["codebuddy.ai/mode"]??"",r={messageId:g.messageId,promptRequestId:g.promptRequestId,conversationRequestId:g.conversationRequestId,model:q,agentName:N,scene:t};if(g.telemetry.clientSendTime){let t=e-g.telemetry.clientSendTime;if(t>0&&t<=6e5&&(this.galileoTimingHook?.reportMessageTTFBUser(t,r),h))try{g.conversationRequestRootSpan?.setAttributes({[M.LLM_SOURCE_ATTRS.USER_FIRST_TOKEN_MS]:t})}catch{}}if(g.telemetry.promptStartTime){let t=e-g.telemetry.promptStartTime;t>0&&t<=6e5&&this.galileoTimingHook?.reportMessageTTFBModel(t,r)}g.telemetry.messageTtfbReported=!0}clearFirstTokenTimer(),startStreamMonitor()}if(!x&&e.finishReason){if(x=!0,V=e.finishReason,h&&E.length>0){let e=E.join("");if(e){let t=R||e.length>M.LLM_SOURCE_VALUE_MAX_SIZE,r=e.length>M.LLM_SOURCE_VALUE_MAX_SIZE?e.slice(0,M.LLM_SOURCE_VALUE_MAX_SIZE):e;m?.setAttribute(M.LLM_SOURCE_ATTRS.OUTPUT_CONTENT,r),m?.setAttribute(M.LLM_SOURCE_ATTRS.COMPLETION_0_ROLE,"assistant"),m?.setAttribute(M.LLM_SOURCE_ATTRS.COMPLETION_0_CONTENT,r),t&&m?.setAttribute(M.LLM_SOURCE_ATTRS.OUTPUT_TRUNCATED,!0)}}!G||B?startFinishReasonGraceTimer(e.finishReason):this.logger.info(`[ModelProvider] finish_reason="${e.finishReason}" received, waiting for usage tail: agent=${N}, requestId=${D}, chunks=${l}, bytes=${d}, elapsed=${Date.now()-H}ms`)}}if(!a){let r=w.process(t);r&&e.enqueue(r)}}),s.on("end",()=>{u=!0,clearAllTimers();let t=Date.now()-H;if(this.logger.info(`[ModelProvider] Stream completed: agent=${N}, requestId=${D}, chunks=${l}, bytes=${d}, elapsed=${t}ms`),p({chunkCount:l,totalBytes:d},"ok"),U&&this.galileoTimingHook?.reportModelStreaming(t,{model:q,agentName:N,conversationRequestId:g.conversationRequestId}),this.galileoTimingHook?.reportRequestResult(0,void 0,q,void 0,g.conversationRequestId,void 0,g.id),!a){let t=w.flush();if(t)try{e.enqueue(t)}catch{}e.close()}}),s.on("error",t=>{u=!0,clearAllTimers();let r=Date.now()-H;this.logger.warn(`[ModelProvider] Stream error: agent=${N}, requestId=${D}, chunks=${l}, bytes=${d}, elapsed=${r}ms, error=${t.message}`),p({chunkCount:l,totalBytes:d},"error",t),this.galileoTimingHook?.reportRequestResult(-1,"STREAM_ERROR",q,t.message,g.conversationRequestId,void 0,g.id),a||e.error(t)}),s.on("close",()=>{if(!u){if(x)this.logger.info(`[ModelProvider] Stream closed after finish_reason received, treating as completed: agent=${N}, requestId=${D}, chunks=${l}, bytes=${d}`),gracefulCloseStream();else if(u=!0,clearAllTimers(),p({chunkCount:l,totalBytes:d},"error",Error("Stream closed unexpectedly")),!a&&v)try{0===l?(this.logger.warn(`[ModelProvider] Stream closed before first chunk: agent=${N}, requestId=${D}`),e.error(Error("Stream closed before receiving any data"))):U?(this.logger.warn(`[ModelProvider] Stream closed unexpectedly: agent=${N}, requestId=${D}, chunks=${l}, bytes=${d}`),e.error(Error(`Stream closed unexpectedly after receiving ${l} chunks (${d} bytes)`))):(this.logger.warn(`[ModelProvider] Empty stream: only placeholder chunks received before close: agent=${N}, requestId=${D}, chunks=${l}, bytes=${d}`),e.error(new K.mY(l,d)))}catch{}}}),o&&($=()=>{u=!0,clearAllTimers(),a=!0,p({chunkCount:l,totalBytes:d},"aborted"),cancelLocalModelGeneration(),s.destroy(),destroyLocalModelSocket();try{e.close()}catch{}},o.aborted?$():o.addEventListener("abort",$,{once:!0}))},cancel:()=>{u=!0,clearAllTimers(),a=!0,p({chunkCount:l,totalBytes:d},"aborted"),cancelLocalModelGeneration(),s.destroy(),destroyLocalModelSocket()}});return new Response(Y,{status:r.status,statusText:r.statusText,headers:r.headers})}}catch(e){try{this.logger.error(`[ModelProvider] Request failed: agent=${N}, requestId=${D}, error=${e?.message}`),this.logger.error(`[ModelProvider] Error response: status=${e.response?.status}, code=${e?.code}, message=${e?.message}`),this.telemetryService.reportMessageResponseTelemetryStream(g,void 0,void 0,e);let t=e.response?.status??e.status??-2,r=e?.code??`HTTP_${t}`;return this.galileoTimingHook?.reportRequestResult(t,r,q,e?.message?.slice(0,500),g.conversationRequestId,void 0,g.id),await Promise.race([this.modelErrorAnalyzer.analyze(e,$),new Promise((e,t)=>setTimeout(()=>t(),5e3))])}catch{return this.modelErrorAnalyzer.createErrorResponse(e?.message||"Unknown error",400,"Client Error")}}}}createClient(e,t){if(!t)throw this.authenticationManager.currentSessionSubject.next(void 0),new K.WT;try{return new D.z4(this.buildOpenAIClientOptions(e,t))}catch(e){if(e.message&&e.message.includes("OPENAI_API_KEY"))throw new K.iN;throw e}}buildOpenAIClientOptions(e,t){return{baseURL:e,apiKey:t,fetch:this.axiosToFetchAdapter(),maxRetries:0,timeout:this.resolveRequestTimeoutMs()}}resolveRequestTimeoutMs(){let e=process.env.CODEBUDDY_FIRST_TOKEN_TIMEOUT_MS;if(e){let t=parseInt(e,10);if(!isNaN(t)&&t>0)return t}return 12e5}getCacheKey(e,t,r){return`${e}@${t}@${r?`:${r}`:""}`}resolveModelBaseURL(e){let{envBaseURL:t,modelConfigUrl:r,productEndpoint:o}=e;if(r)return r;if(t)return t;let s=this.productManager.getEndpoint()||o;if(!s)throw new K.uJ("Cannot resolve model request endpoint: neither getEndpoint() nor product.endpoint is available yet. Set CODEBUDDY_BASE_URL, or ensure the product configuration has finished loading.");return this.warnIfEnvEndpointMismatch(s),`${s}/v2`}warnIfEnvEndpointMismatch(e){let t,r=process.env[V.qL];if(r&&"ioa"===r.toLowerCase()){try{t=new URL(e).hostname}catch{return}t.endsWith("codebuddy.ai")&&this.logger?.warn(`[ModelProvider] resolved baseURL host "${t}" looks like the public cloud, but CODEBUDDY_INTERNET_ENVIRONMENT=${r}. The request will likely fail with 401 endpoint mismatch. Check ProductManager sync state or set CODEBUDDY_BASE_URL as a workaround.`)}}async normalizeNewToolResults(e,t){for(let r of e)"function_call_result"===r.rawItem.type&&await this.functionCallResultAgentInputItemProcessor.process(r.rawItem,t)}async getModel(e){if(!e)throw new K.uJ("model name is required");let t=this.sessionManager.getCurrent()||this.sessionManager.sessionSubject.getValue(),r=t.resultSubject.value;if(r?.newItems.length){let e=r.newItems[r.newItems.length-1];e&&(await this.defaultInputItemProcessor.process(e.rawItem,t),await this.normalizeNewToolResults(r.newItems,t),"function_call_result"===e.rawItem.type&&this.telemetryService.reportModelToolCall(t,e.rawItem))}let o=this.authenticationManager.currentSessionSubject.getValue()?.auth,s=await this.settingsManager.get("env"),n=s?.[V.a1]||process.env[V.a1],a=(0,L.Gp)()?.auth?.accessToken??o?.accessToken,i=await this.productManager.waitConfiguration(),l=i.models?.find(t=>t.id===e),d=this.resolveModelBaseURL({envBaseURL:n,modelConfigUrl:l?.url,productEndpoint:i.endpoint});this.logger.debug(`Resolved baseURL for model ${e}: ${d}`),l?.apiKey&&(a=l.apiKey,this.logger.debug(`Using custom API key for model ${e}`)),l?.local===!0&&(a="local");let c=this.getCacheKey(d,e,a),u=this.modelCache.get(c);if(!u){if(this.modelCache.size>=X.mr)for(let e=0;e<X.mr/2;e++){let e=this.modelCache.keys().next().value;void 0!==e&&this.modelCache.delete(e)}try{let t=this.createClient(d,a);u=new X.lS(t,e),this.modelCache.set(c,u)}catch(e){if(e.message&&(e.message.includes("Authentication")||e.message.includes("OPENAI_API_KEY")||!a))throw this.authenticationManager.currentSessionSubject.next(void 0),new K.WT;throw e}}return this.sensitiveModelBoundary.wrapModel(u,t.id)}};__decorate([(0,R.Autowired)(y.RestOperations),__metadata("design:type","function"==typeof(o=void 0!==y.RestOperations&&y.RestOperations)?o:Object)],es.prototype,"restOperations",void 0),__decorate([(0,R.Autowired)(A.AuthenticationManager),__metadata("design:type","function"==typeof(s=void 0!==A.AuthenticationManager&&A.AuthenticationManager)?s:Object)],es.prototype,"authenticationManager",void 0),__decorate([(0,R.Autowired)(I.ProductManager),__metadata("design:type","function"==typeof(n=void 0!==I.ProductManager&&I.ProductManager)?n:Object)],es.prototype,"productManager",void 0),__decorate([(0,R.Autowired)(x.Cv),__metadata("design:type","function"==typeof(a=void 0!==x.Cv&&x.Cv)?a:Object)],es.prototype,"sessionManager",void 0),__decorate([(0,R.Autowired)(B.H0),__metadata("design:type","function"==typeof(i=void 0!==B.H0&&B.H0)?i:Object)],es.prototype,"telemetryService",void 0),__decorate([(0,R.Autowired)(I.ClientInfoProvider),__metadata("design:type","function"==typeof(l=void 0!==I.ClientInfoProvider&&I.ClientInfoProvider)?l:Object)],es.prototype,"clientInfoProvider",void 0),__decorate([(0,R.Autowired)(P.VaB),__metadata("design:type","function"==typeof(d=void 0!==P.VaB&&P.VaB)?d:Object)],es.prototype,"agentManager",void 0),__decorate([(0,R.Autowired)(M.Logger),__metadata("design:type","function"==typeof(c=void 0!==M.Logger&&M.Logger)?c:Object)],es.prototype,"logger",void 0),__decorate([(0,R.Autowired)(M.TraceService),(0,R.Optional)(),__metadata("design:type","function"==typeof(u=void 0!==M.TraceService&&M.TraceService)?u:Object)],es.prototype,"traceService",void 0),__decorate([(0,R.Autowired)(x.BH),__metadata("design:type","function"==typeof(m=void 0!==x.BH&&x.BH)?m:Object)],es.prototype,"defaultInputItemProcessor",void 0),__decorate([(0,R.Autowired)(x._o),__metadata("design:type","function"==typeof(g=void 0!==x._o&&x._o)?g:Object)],es.prototype,"functionCallResultAgentInputItemProcessor",void 0),__decorate([(0,R.Autowired)(X.Iy),__metadata("design:type","function"==typeof(p=void 0!==X.Iy&&X.Iy)?p:Object)],es.prototype,"modelErrorAnalyzer",void 0),__decorate([(0,R.Autowired)(V.Vr),__metadata("design:type","function"==typeof(_=void 0!==V.Vr&&V.Vr)?_:Object)],es.prototype,"settingsManager",void 0),__decorate([(0,R.Autowired)(X.TD),__metadata("design:type",Array)],es.prototype,"modelRequestProcessors",void 0),__decorate([(0,R.Autowired)(H.el),__metadata("design:type",Object)],es.prototype,"sensitiveModelBoundary",void 0),__decorate([(0,R.Autowired)(N.Nx),(0,R.Optional)(),__metadata("design:type",Object)],es.prototype,"galileoTimingHook",void 0),es=__decorate([(0,R.Component)(X.lx,q.Ye)],es)}};