@superblocksteam/vite-plugin-file-sync 2.0.59-next.0 → 2.0.59-next.10

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 (285) hide show
  1. package/dist/ai-service/agent/prompts/build-base-system-prompt.d.ts.map +1 -1
  2. package/dist/ai-service/agent/prompts/build-base-system-prompt.js +25 -9
  3. package/dist/ai-service/agent/prompts/build-base-system-prompt.js.map +1 -1
  4. package/dist/ai-service/agent/subagents/apis/examples.d.ts.map +1 -1
  5. package/dist/ai-service/agent/subagents/apis/examples.js +137 -10
  6. package/dist/ai-service/agent/subagents/apis/examples.js.map +1 -1
  7. package/dist/ai-service/agent/subagents/apis/static-analysis.d.ts.map +1 -1
  8. package/dist/ai-service/agent/subagents/apis/static-analysis.js +14 -7
  9. package/dist/ai-service/agent/subagents/apis/static-analysis.js.map +1 -1
  10. package/dist/ai-service/agent/tool-message-utils.d.ts.map +1 -1
  11. package/dist/ai-service/agent/tool-message-utils.js +6 -2
  12. package/dist/ai-service/agent/tool-message-utils.js.map +1 -1
  13. package/dist/ai-service/agent/tools/apis/analysis.d.ts +9 -0
  14. package/dist/ai-service/agent/tools/apis/analysis.d.ts.map +1 -0
  15. package/dist/ai-service/agent/tools/apis/analysis.js +358 -0
  16. package/dist/ai-service/agent/tools/apis/analysis.js.map +1 -0
  17. package/dist/ai-service/agent/{subagents → tools}/apis/api-executor.d.ts +35 -10
  18. package/dist/ai-service/agent/tools/apis/api-executor.d.ts.map +1 -0
  19. package/dist/ai-service/agent/{subagents → tools}/apis/api-executor.js +179 -94
  20. package/dist/ai-service/agent/tools/apis/api-executor.js.map +1 -0
  21. package/dist/ai-service/agent/tools/apis/api-source.d.ts +19 -0
  22. package/dist/ai-service/agent/tools/apis/api-source.d.ts.map +1 -0
  23. package/dist/ai-service/agent/tools/apis/api-source.js +73 -0
  24. package/dist/ai-service/agent/tools/apis/api-source.js.map +1 -0
  25. package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.d.ts +51 -0
  26. package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.d.ts.map +1 -0
  27. package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js +510 -0
  28. package/dist/ai-service/agent/tools/apis/api-validation-orchestrator.js.map +1 -0
  29. package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts +32 -0
  30. package/dist/ai-service/agent/tools/apis/build-api-artifact.d.ts.map +1 -0
  31. package/dist/ai-service/agent/tools/apis/build-api-artifact.js +313 -0
  32. package/dist/ai-service/agent/tools/apis/build-api-artifact.js.map +1 -0
  33. package/dist/ai-service/agent/tools/apis/build-api.d.ts +1 -10
  34. package/dist/ai-service/agent/tools/apis/build-api.d.ts.map +1 -1
  35. package/dist/ai-service/agent/tools/apis/build-api.js +26 -238
  36. package/dist/ai-service/agent/tools/apis/build-api.js.map +1 -1
  37. package/dist/ai-service/agent/tools/apis/get-api-docs.d.ts +11 -0
  38. package/dist/ai-service/agent/tools/apis/get-api-docs.d.ts.map +1 -0
  39. package/dist/ai-service/agent/tools/apis/get-api-docs.js +1841 -0
  40. package/dist/ai-service/agent/tools/apis/get-api-docs.js.map +1 -0
  41. package/dist/ai-service/agent/tools/apis/integration-types.d.ts +37 -0
  42. package/dist/ai-service/agent/tools/apis/integration-types.d.ts.map +1 -0
  43. package/dist/ai-service/agent/tools/apis/integration-types.js +689 -0
  44. package/dist/ai-service/agent/tools/apis/integration-types.js.map +1 -0
  45. package/dist/ai-service/agent/tools/apis/test-api.d.ts +25 -0
  46. package/dist/ai-service/agent/tools/apis/test-api.d.ts.map +1 -0
  47. package/dist/ai-service/agent/tools/apis/test-api.js +194 -0
  48. package/dist/ai-service/agent/tools/apis/test-api.js.map +1 -0
  49. package/dist/ai-service/agent/tools/apis/write-api.d.ts +11 -0
  50. package/dist/ai-service/agent/tools/apis/write-api.d.ts.map +1 -0
  51. package/dist/ai-service/agent/tools/apis/write-api.js +41 -0
  52. package/dist/ai-service/agent/tools/apis/write-api.js.map +1 -0
  53. package/dist/ai-service/agent/tools/build-read-files.js +2 -2
  54. package/dist/ai-service/agent/tools/build-read-files.js.map +1 -1
  55. package/dist/ai-service/agent/tools.d.ts +2 -5
  56. package/dist/ai-service/agent/tools.d.ts.map +1 -1
  57. package/dist/ai-service/agent/tools.js +51 -22
  58. package/dist/ai-service/agent/tools.js.map +1 -1
  59. package/dist/ai-service/agent/tools2/access-control.d.ts +1 -0
  60. package/dist/ai-service/agent/tools2/access-control.d.ts.map +1 -1
  61. package/dist/ai-service/agent/tools2/access-control.js +15 -13
  62. package/dist/ai-service/agent/tools2/access-control.js.map +1 -1
  63. package/dist/ai-service/agent/tools2/registry.d.ts +2 -1
  64. package/dist/ai-service/agent/tools2/registry.d.ts.map +1 -1
  65. package/dist/ai-service/agent/tools2/registry.js +4 -3
  66. package/dist/ai-service/agent/tools2/registry.js.map +1 -1
  67. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.d.ts.map +1 -1
  68. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js +73 -127
  69. package/dist/ai-service/agent/tools2/tools/exit-plan-mode.js.map +1 -1
  70. package/dist/ai-service/agent/tools2/tools/grep-metadata.d.ts.map +1 -1
  71. package/dist/ai-service/agent/tools2/tools/grep-metadata.js +25 -4
  72. package/dist/ai-service/agent/tools2/tools/grep-metadata.js.map +1 -1
  73. package/dist/ai-service/agent/tools2/types.d.ts +1 -1
  74. package/dist/ai-service/agent/tools2/types.d.ts.map +1 -1
  75. package/dist/ai-service/agent/tools2/types.js.map +1 -1
  76. package/dist/ai-service/agent/tools2/utils.d.ts.map +1 -1
  77. package/dist/ai-service/agent/tools2/utils.js +4 -1
  78. package/dist/ai-service/agent/tools2/utils.js.map +1 -1
  79. package/dist/ai-service/agent/utils.d.ts +1 -3
  80. package/dist/ai-service/agent/utils.d.ts.map +1 -1
  81. package/dist/ai-service/agent/utils.js +55 -13
  82. package/dist/ai-service/agent/utils.js.map +1 -1
  83. package/dist/ai-service/app-interface/shell.d.ts +5 -0
  84. package/dist/ai-service/app-interface/shell.d.ts.map +1 -1
  85. package/dist/ai-service/app-interface/shell.js +17 -2
  86. package/dist/ai-service/app-interface/shell.js.map +1 -1
  87. package/dist/ai-service/chat/chat-session-store.d.ts +7 -0
  88. package/dist/ai-service/chat/chat-session-store.d.ts.map +1 -1
  89. package/dist/ai-service/chat/chat-session-store.js +26 -0
  90. package/dist/ai-service/chat/chat-session-store.js.map +1 -1
  91. package/dist/ai-service/const.d.ts +3 -1
  92. package/dist/ai-service/const.d.ts.map +1 -1
  93. package/dist/ai-service/const.js +3 -0
  94. package/dist/ai-service/const.js.map +1 -1
  95. package/dist/ai-service/index.d.ts +5 -1
  96. package/dist/ai-service/index.d.ts.map +1 -1
  97. package/dist/ai-service/index.js +55 -7
  98. package/dist/ai-service/index.js.map +1 -1
  99. package/dist/ai-service/integrations/metadata-storage/index.d.ts +10 -0
  100. package/dist/ai-service/integrations/metadata-storage/index.d.ts.map +1 -1
  101. package/dist/ai-service/integrations/metadata-storage/local.d.ts +4 -2
  102. package/dist/ai-service/integrations/metadata-storage/local.d.ts.map +1 -1
  103. package/dist/ai-service/integrations/metadata-storage/local.js +35 -9
  104. package/dist/ai-service/integrations/metadata-storage/local.js.map +1 -1
  105. package/dist/ai-service/integrations/store.d.ts +27 -2
  106. package/dist/ai-service/integrations/store.d.ts.map +1 -1
  107. package/dist/ai-service/integrations/store.js +129 -62
  108. package/dist/ai-service/integrations/store.js.map +1 -1
  109. package/dist/ai-service/llm/client.d.ts +123 -0
  110. package/dist/ai-service/llm/client.d.ts.map +1 -0
  111. package/dist/ai-service/llm/client.js +168 -0
  112. package/dist/ai-service/llm/client.js.map +1 -0
  113. package/dist/ai-service/llm/context/context-handle.d.ts +4 -4
  114. package/dist/ai-service/llm/context/context-handle.d.ts.map +1 -1
  115. package/dist/ai-service/llm/context/context-handle.js +7 -3
  116. package/dist/ai-service/llm/context/context-handle.js.map +1 -1
  117. package/dist/ai-service/llm/context/context.d.ts +28 -0
  118. package/dist/ai-service/llm/context/context.d.ts.map +1 -1
  119. package/dist/ai-service/llm/context/context.js +119 -0
  120. package/dist/ai-service/llm/context/context.js.map +1 -1
  121. package/dist/ai-service/llm/context/manager.d.ts +22 -2
  122. package/dist/ai-service/llm/context/manager.d.ts.map +1 -1
  123. package/dist/ai-service/llm/context/manager.js +86 -13
  124. package/dist/ai-service/llm/context/manager.js.map +1 -1
  125. package/dist/ai-service/llm/context/storage/index.d.ts +1 -0
  126. package/dist/ai-service/llm/context/storage/index.d.ts.map +1 -1
  127. package/dist/ai-service/llm/context/storage/local.d.ts +1 -0
  128. package/dist/ai-service/llm/context/storage/local.d.ts.map +1 -1
  129. package/dist/ai-service/llm/context/storage/local.js +13 -1
  130. package/dist/ai-service/llm/context/storage/local.js.map +1 -1
  131. package/dist/ai-service/llm/context/utils/message-utils.d.ts.map +1 -1
  132. package/dist/ai-service/llm/context/utils/message-utils.js +6 -2
  133. package/dist/ai-service/llm/context/utils/message-utils.js.map +1 -1
  134. package/dist/ai-service/llm/error.d.ts +14 -4
  135. package/dist/ai-service/llm/error.d.ts.map +1 -1
  136. package/dist/ai-service/llm/error.js +49 -4
  137. package/dist/ai-service/llm/error.js.map +1 -1
  138. package/dist/ai-service/llm/interaction/adapters/vercel.d.ts +67 -0
  139. package/dist/ai-service/llm/interaction/adapters/vercel.d.ts.map +1 -0
  140. package/dist/ai-service/llm/interaction/adapters/vercel.js +111 -0
  141. package/dist/ai-service/llm/interaction/adapters/vercel.js.map +1 -0
  142. package/dist/ai-service/llm/interaction/compose.d.ts +71 -0
  143. package/dist/ai-service/llm/interaction/compose.d.ts.map +1 -0
  144. package/dist/ai-service/llm/interaction/compose.js +88 -0
  145. package/dist/ai-service/llm/interaction/compose.js.map +1 -0
  146. package/dist/ai-service/llm/interaction/index.d.ts +68 -0
  147. package/dist/ai-service/llm/interaction/index.d.ts.map +1 -0
  148. package/dist/ai-service/llm/interaction/index.js +70 -0
  149. package/dist/ai-service/llm/interaction/index.js.map +1 -0
  150. package/dist/ai-service/llm/interaction/middleware.d.ts +52 -0
  151. package/dist/ai-service/llm/interaction/middleware.d.ts.map +1 -0
  152. package/dist/ai-service/llm/interaction/middleware.js +17 -0
  153. package/dist/ai-service/llm/interaction/middleware.js.map +1 -0
  154. package/dist/ai-service/llm/interaction/middlewares/llmobs.d.ts +45 -0
  155. package/dist/ai-service/llm/interaction/middlewares/llmobs.d.ts.map +1 -0
  156. package/dist/ai-service/llm/interaction/middlewares/llmobs.js +85 -0
  157. package/dist/ai-service/llm/interaction/middlewares/llmobs.js.map +1 -0
  158. package/dist/ai-service/llm/interaction/middlewares/logging.d.ts +88 -0
  159. package/dist/ai-service/llm/interaction/middlewares/logging.d.ts.map +1 -0
  160. package/dist/ai-service/llm/interaction/middlewares/logging.js +238 -0
  161. package/dist/ai-service/llm/interaction/middlewares/logging.js.map +1 -0
  162. package/dist/ai-service/llm/interaction/middlewares/profiler.d.ts +47 -0
  163. package/dist/ai-service/llm/interaction/middlewares/profiler.d.ts.map +1 -0
  164. package/dist/ai-service/llm/interaction/middlewares/profiler.js +183 -0
  165. package/dist/ai-service/llm/interaction/middlewares/profiler.js.map +1 -0
  166. package/dist/ai-service/llm/interaction/middlewares/stream-retry.d.ts +121 -0
  167. package/dist/ai-service/llm/interaction/middlewares/stream-retry.d.ts.map +1 -0
  168. package/dist/ai-service/llm/interaction/middlewares/stream-retry.js +291 -0
  169. package/dist/ai-service/llm/interaction/middlewares/stream-retry.js.map +1 -0
  170. package/dist/ai-service/llm/interaction/provider.d.ts +173 -0
  171. package/dist/ai-service/llm/interaction/provider.d.ts.map +1 -0
  172. package/dist/ai-service/llm/interaction/provider.js +15 -0
  173. package/dist/ai-service/llm/interaction/provider.js.map +1 -0
  174. package/dist/ai-service/llm/interaction/result-utils.d.ts +43 -0
  175. package/dist/ai-service/llm/interaction/result-utils.d.ts.map +1 -0
  176. package/dist/ai-service/llm/interaction/result-utils.js +49 -0
  177. package/dist/ai-service/llm/interaction/result-utils.js.map +1 -0
  178. package/dist/ai-service/llm/interaction/stream-lifecycle.d.ts +48 -0
  179. package/dist/ai-service/llm/interaction/stream-lifecycle.d.ts.map +1 -0
  180. package/dist/ai-service/llm/interaction/stream-lifecycle.js +129 -0
  181. package/dist/ai-service/llm/interaction/stream-lifecycle.js.map +1 -0
  182. package/dist/ai-service/llm/provider.d.ts +1 -2
  183. package/dist/ai-service/llm/provider.d.ts.map +1 -1
  184. package/dist/ai-service/llm/provider.js +3 -6
  185. package/dist/ai-service/llm/provider.js.map +1 -1
  186. package/dist/ai-service/llmobs/helpers.d.ts +7 -8
  187. package/dist/ai-service/llmobs/helpers.d.ts.map +1 -1
  188. package/dist/ai-service/llmobs/helpers.js +8 -48
  189. package/dist/ai-service/llmobs/helpers.js.map +1 -1
  190. package/dist/ai-service/llmobs/middleware/stream-text.d.ts +19 -21
  191. package/dist/ai-service/llmobs/middleware/stream-text.d.ts.map +1 -1
  192. package/dist/ai-service/llmobs/middleware/stream-text.js +98 -106
  193. package/dist/ai-service/llmobs/middleware/stream-text.js.map +1 -1
  194. package/dist/ai-service/llmobs/types.d.ts +14 -1
  195. package/dist/ai-service/llmobs/types.d.ts.map +1 -1
  196. package/dist/ai-service/state-machine/clark-fsm.d.ts +75 -5
  197. package/dist/ai-service/state-machine/clark-fsm.d.ts.map +1 -1
  198. package/dist/ai-service/state-machine/clark-fsm.js +100 -0
  199. package/dist/ai-service/state-machine/clark-fsm.js.map +1 -1
  200. package/dist/ai-service/state-machine/handlers/agent-planning.d.ts.map +1 -1
  201. package/dist/ai-service/state-machine/handlers/agent-planning.js +4 -0
  202. package/dist/ai-service/state-machine/handlers/agent-planning.js.map +1 -1
  203. package/dist/ai-service/state-machine/handlers/llm-generating.d.ts.map +1 -1
  204. package/dist/ai-service/state-machine/handlers/llm-generating.js +91 -456
  205. package/dist/ai-service/state-machine/handlers/llm-generating.js.map +1 -1
  206. package/dist/ai-service/state-machine/handlers/runtime-reviewing.js +1 -1
  207. package/dist/ai-service/state-machine/handlers/runtime-reviewing.js.map +1 -1
  208. package/dist/ai-service/state-machine/helpers/peer.d.ts.map +1 -1
  209. package/dist/ai-service/state-machine/helpers/peer.js +15 -0
  210. package/dist/ai-service/state-machine/helpers/peer.js.map +1 -1
  211. package/dist/ai-service/state-machine/mocks.d.ts.map +1 -1
  212. package/dist/ai-service/state-machine/mocks.js +1 -0
  213. package/dist/ai-service/state-machine/mocks.js.map +1 -1
  214. package/dist/ai-service/template-renderer.js +1 -1
  215. package/dist/ai-service/template-renderer.js.map +1 -1
  216. package/dist/ai-service/types.d.ts +30 -0
  217. package/dist/ai-service/types.d.ts.map +1 -1
  218. package/dist/binding-extraction/extract-identifiers.d.ts +14 -0
  219. package/dist/binding-extraction/extract-identifiers.d.ts.map +1 -1
  220. package/dist/binding-extraction/extract-identifiers.js +46 -1
  221. package/dist/binding-extraction/extract-identifiers.js.map +1 -1
  222. package/dist/binding-extraction/js-identifiers.d.ts +14 -0
  223. package/dist/binding-extraction/js-identifiers.d.ts.map +1 -1
  224. package/dist/binding-extraction/js-identifiers.js +168 -0
  225. package/dist/binding-extraction/js-identifiers.js.map +1 -1
  226. package/dist/binding-extraction/python-identifiers.d.ts +5 -0
  227. package/dist/binding-extraction/python-identifiers.d.ts.map +1 -1
  228. package/dist/binding-extraction/python-identifiers.js +76 -7
  229. package/dist/binding-extraction/python-identifiers.js.map +1 -1
  230. package/dist/file-sync-vite-plugin.d.ts.map +1 -1
  231. package/dist/file-sync-vite-plugin.js +73 -3
  232. package/dist/file-sync-vite-plugin.js.map +1 -1
  233. package/dist/file-system-manager.d.ts.map +1 -1
  234. package/dist/file-system-manager.js +6 -4
  235. package/dist/file-system-manager.js.map +1 -1
  236. package/dist/index.d.ts +1 -1
  237. package/dist/index.d.ts.map +1 -1
  238. package/dist/index.js +1 -1
  239. package/dist/index.js.map +1 -1
  240. package/dist/lock-service/activity-tracker.d.ts +14 -2
  241. package/dist/lock-service/activity-tracker.d.ts.map +1 -1
  242. package/dist/lock-service/activity-tracker.js +43 -6
  243. package/dist/lock-service/activity-tracker.js.map +1 -1
  244. package/dist/lock-service/index.d.ts +13 -2
  245. package/dist/lock-service/index.d.ts.map +1 -1
  246. package/dist/lock-service/index.js +130 -44
  247. package/dist/lock-service/index.js.map +1 -1
  248. package/dist/parsing/jsx.d.ts.map +1 -1
  249. package/dist/parsing/jsx.js +78 -66
  250. package/dist/parsing/jsx.js.map +1 -1
  251. package/dist/socket-manager.js +1 -1
  252. package/dist/socket-manager.js.map +1 -1
  253. package/dist/sync-service/list-dir.d.ts.map +1 -1
  254. package/dist/sync-service/list-dir.js +41 -18
  255. package/dist/sync-service/list-dir.js.map +1 -1
  256. package/dist/vite-plugin-yaml-types.d.ts.map +1 -1
  257. package/dist/vite-plugin-yaml-types.js +2 -4
  258. package/dist/vite-plugin-yaml-types.js.map +1 -1
  259. package/package.json +7 -7
  260. package/dist/ai-service/agent/subagents/apis/api-executor.d.ts.map +0 -1
  261. package/dist/ai-service/agent/subagents/apis/api-executor.js.map +0 -1
  262. package/dist/ai-service/agent/subagents/apis/context.d.ts +0 -12
  263. package/dist/ai-service/agent/subagents/apis/context.d.ts.map +0 -1
  264. package/dist/ai-service/agent/subagents/apis/context.js +0 -18
  265. package/dist/ai-service/agent/subagents/apis/context.js.map +0 -1
  266. package/dist/ai-service/agent/subagents/apis/generate-api-source.d.ts +0 -40
  267. package/dist/ai-service/agent/subagents/apis/generate-api-source.d.ts.map +0 -1
  268. package/dist/ai-service/agent/subagents/apis/generate-api-source.js +0 -516
  269. package/dist/ai-service/agent/subagents/apis/generate-api-source.js.map +0 -1
  270. package/dist/ai-service/agent/subagents/apis/state.d.ts +0 -49
  271. package/dist/ai-service/agent/subagents/apis/state.d.ts.map +0 -1
  272. package/dist/ai-service/agent/subagents/apis/state.js +0 -25
  273. package/dist/ai-service/agent/subagents/apis/state.js.map +0 -1
  274. package/dist/ai-service/agent/subagents/apis/system-prompt.d.ts +0 -3
  275. package/dist/ai-service/agent/subagents/apis/system-prompt.d.ts.map +0 -1
  276. package/dist/ai-service/agent/subagents/apis/system-prompt.js +0 -1704
  277. package/dist/ai-service/agent/subagents/apis/system-prompt.js.map +0 -1
  278. package/dist/ai-service/agent/tools/apis/finalize-api.d.ts +0 -11
  279. package/dist/ai-service/agent/tools/apis/finalize-api.d.ts.map +0 -1
  280. package/dist/ai-service/agent/tools/apis/finalize-api.js +0 -133
  281. package/dist/ai-service/agent/tools/apis/finalize-api.js.map +0 -1
  282. package/dist/ai-service/llm/middleware/retry.d.ts +0 -112
  283. package/dist/ai-service/llm/middleware/retry.d.ts.map +0 -1
  284. package/dist/ai-service/llm/middleware/retry.js +0 -239
  285. package/dist/ai-service/llm/middleware/retry.js.map +0 -1
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Profiler middleware for LLM interactions.
3
+ *
4
+ * This middleware creates performance traces for LLM operations including:
5
+ * - Waiting for first token (waiting_on_llm span)
6
+ * - Streaming response (stream_text span)
7
+ * - Individual reasoning and text generation segments
8
+ *
9
+ * The traces are recorded in Perfetto format for visualization.
10
+ */
11
+ import type { ClarkProfiler } from "../../../profiler/clark-profiler.js";
12
+ import type { StreamTextMiddleware } from "../middleware.js";
13
+ /**
14
+ * Options for configuring the profiler middleware.
15
+ */
16
+ export interface ProfilerMiddlewareOptions {
17
+ /** The Clark profiler instance */
18
+ profiler: ClarkProfiler;
19
+ /** Model identifier for logging */
20
+ modelId?: string;
21
+ }
22
+ /**
23
+ * Creates a middleware that profiles LLM interactions.
24
+ *
25
+ * The middleware wraps the streamText call to create timing spans:
26
+ * 1. waiting_on_llm: From call start to first token received
27
+ * 2. stream_text: From first token to stream completion
28
+ * 3. thinking/text_generation: Individual reasoning and text segments
29
+ *
30
+ * All timing data is recorded to the profiler for later export.
31
+ *
32
+ * @param options - Configuration for the middleware
33
+ * @returns A StreamTextMiddleware
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * const middleware = createProfilerMiddleware({
38
+ * profiler: services.clarkProfiler,
39
+ * modelId: model.modelId
40
+ * });
41
+ *
42
+ * const streamText = applyMiddleware(baseStreamText, middleware);
43
+ * const result = await streamText({ model, messages, tools });
44
+ * ```
45
+ */
46
+ export declare function createProfilerMiddleware(options: ProfilerMiddlewareOptions): StreamTextMiddleware;
47
+ //# sourceMappingURL=profiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiler.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/profiler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,kCAAkC;IAClC,QAAQ,EAAE,aAAa,CAAC;IAExB,mCAAmC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,yBAAyB,GACjC,oBAAoB,CAwKtB"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Profiler middleware for LLM interactions.
3
+ *
4
+ * This middleware creates performance traces for LLM operations including:
5
+ * - Waiting for first token (waiting_on_llm span)
6
+ * - Streaming response (stream_text span)
7
+ * - Individual reasoning and text generation segments
8
+ *
9
+ * The traces are recorded in Perfetto format for visualization.
10
+ */
11
+ /**
12
+ * Creates a middleware that profiles LLM interactions.
13
+ *
14
+ * The middleware wraps the streamText call to create timing spans:
15
+ * 1. waiting_on_llm: From call start to first token received
16
+ * 2. stream_text: From first token to stream completion
17
+ * 3. thinking/text_generation: Individual reasoning and text segments
18
+ *
19
+ * All timing data is recorded to the profiler for later export.
20
+ *
21
+ * @param options - Configuration for the middleware
22
+ * @returns A StreamTextMiddleware
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const middleware = createProfilerMiddleware({
27
+ * profiler: services.clarkProfiler,
28
+ * modelId: model.modelId
29
+ * });
30
+ *
31
+ * const streamText = applyMiddleware(baseStreamText, middleware);
32
+ * const result = await streamText({ model, messages, tools });
33
+ * ```
34
+ */
35
+ export function createProfilerMiddleware(options) {
36
+ const { profiler, modelId } = options;
37
+ return {
38
+ wrap(provider) {
39
+ return {
40
+ async streamText(streamOptions) {
41
+ let firstTokenReceived = false;
42
+ let thinkingSpanActive = false;
43
+ let textSpanActive = false;
44
+ const thinkingTrack = "thinking";
45
+ const textTrack = "text_generation";
46
+ let stepCount = 0;
47
+ // Start waiting span before the call
48
+ profiler.startLLMWaiting({
49
+ messages: streamOptions.messages,
50
+ model: modelId || streamOptions.model.modelId || "unknown",
51
+ });
52
+ // Wrap onChunk to track first token and segment transitions
53
+ const originalOnChunk = streamOptions.onChunk;
54
+ const wrappedOnChunk = async (chunk) => {
55
+ // Start streaming span on first token
56
+ if (!firstTokenReceived) {
57
+ firstTokenReceived = true;
58
+ const firstChunk = chunk.chunk.type === "text-delta"
59
+ ? chunk.chunk.text
60
+ : chunk.chunk.type === "reasoning-delta"
61
+ ? chunk.chunk.reasoning
62
+ : undefined;
63
+ profiler.startLLMStreaming({
64
+ firstChunk,
65
+ });
66
+ }
67
+ // Track reasoning segments
68
+ if (chunk.chunk.type === "reasoning-delta") {
69
+ if (!thinkingSpanActive) {
70
+ profiler
71
+ .getProfiler()
72
+ .createTrack(thinkingTrack, "AI Thinking/Reasoning", "llm");
73
+ profiler
74
+ .getProfiler()
75
+ .startFrame(`Thinking Step ${stepCount + 1}`, thinkingTrack);
76
+ thinkingSpanActive = true;
77
+ }
78
+ }
79
+ else if (thinkingSpanActive) {
80
+ // End thinking span when switching to different chunk type
81
+ profiler.getProfiler().endFrame(thinkingTrack);
82
+ thinkingSpanActive = false;
83
+ }
84
+ // Track text generation segments
85
+ if (chunk.chunk.type === "text-delta") {
86
+ if (!textSpanActive) {
87
+ profiler
88
+ .getProfiler()
89
+ .createTrack(textTrack, "Text Generation", "llm");
90
+ profiler
91
+ .getProfiler()
92
+ .startFrame(`Text Generation Step ${stepCount + 1}`, textTrack);
93
+ textSpanActive = true;
94
+ }
95
+ }
96
+ else if (textSpanActive) {
97
+ // End text span when switching to different chunk type
98
+ profiler.getProfiler().endFrame(textTrack);
99
+ textSpanActive = false;
100
+ }
101
+ // Call original onChunk if present
102
+ if (originalOnChunk) {
103
+ await originalOnChunk(chunk);
104
+ }
105
+ };
106
+ // Wrap onStepFinish to track step count
107
+ const originalOnStepFinish = streamOptions.onStepFinish;
108
+ const wrappedOnStepFinish = async (step) => {
109
+ stepCount++;
110
+ // Call original onStepFinish if present
111
+ if (originalOnStepFinish) {
112
+ await originalOnStepFinish(step);
113
+ }
114
+ };
115
+ // Wrap onFinish to end all active spans
116
+ const originalOnFinish = streamOptions.onFinish;
117
+ const wrappedOnFinish = async (result) => {
118
+ // End streaming span if it was started
119
+ if (firstTokenReceived) {
120
+ profiler.endFrame(); // End stream_text
121
+ }
122
+ profiler.endFrame(); // End waiting_on_llm
123
+ // End any active segment spans
124
+ if (thinkingSpanActive) {
125
+ profiler.getProfiler().endFrame(thinkingTrack);
126
+ }
127
+ if (textSpanActive) {
128
+ profiler.getProfiler().endFrame(textTrack);
129
+ }
130
+ // Call original onFinish if present
131
+ if (originalOnFinish) {
132
+ await originalOnFinish(result);
133
+ }
134
+ };
135
+ // Wrap onError to clean up spans on error
136
+ const originalOnError = streamOptions.onError;
137
+ const wrappedOnError = async (error) => {
138
+ // End all active spans on error
139
+ if (firstTokenReceived) {
140
+ profiler.endFrame(); // End stream_text
141
+ }
142
+ profiler.endFrame(); // End waiting_on_llm
143
+ if (thinkingSpanActive) {
144
+ profiler.getProfiler().endFrame(thinkingTrack);
145
+ }
146
+ if (textSpanActive) {
147
+ profiler.getProfiler().endFrame(textTrack);
148
+ }
149
+ // Call original onError if present
150
+ if (originalOnError) {
151
+ await originalOnError(error);
152
+ }
153
+ };
154
+ // Call provider with wrapped callbacks
155
+ try {
156
+ return await provider.streamText({
157
+ ...streamOptions,
158
+ onChunk: wrappedOnChunk,
159
+ onStepFinish: wrappedOnStepFinish,
160
+ onFinish: wrappedOnFinish,
161
+ onError: wrappedOnError,
162
+ });
163
+ }
164
+ catch (error) {
165
+ // Clean up spans if an error is thrown before onError is called
166
+ if (firstTokenReceived) {
167
+ profiler.endFrame();
168
+ }
169
+ profiler.endFrame();
170
+ if (thinkingSpanActive) {
171
+ profiler.getProfiler().endFrame(thinkingTrack);
172
+ }
173
+ if (textSpanActive) {
174
+ profiler.getProfiler().endFrame(textTrack);
175
+ }
176
+ throw error;
177
+ }
178
+ },
179
+ };
180
+ },
181
+ };
182
+ }
183
+ //# sourceMappingURL=profiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiler.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/profiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Retry middleware for StreamText operations.
3
+ *
4
+ * This middleware wraps entire streamText() calls to handle failures during
5
+ * stream consumption. When a stream fails mid-consumption (e.g., network timeout),
6
+ * this middleware retries the entire streamText call with accumulated messages
7
+ * from successful steps preserved via Context.
8
+ *
9
+ * **Two-phase retry architecture:**
10
+ * 1. **Initial call retry**: Retries errors when calling streamText() to get metadata
11
+ * 2. **Stream consumption retry**: Retries mid-stream errors during stream consumption
12
+ *
13
+ * **Separate retry budgets:**
14
+ * Each phase has its own independent retry budget. For example, with maxRetries: 3:
15
+ * - Phase 1 can retry up to 3 times (4 total attempts to get initial metadata)
16
+ * - Phase 2 can retry up to 3 times (4 total attempts to consume stream)
17
+ * - Maximum total attempts: 4 (phase 1) + 4 (phase 2) = 8
18
+ *
19
+ * This design ensures that failures in one phase don't prevent retries in the other phase.
20
+ *
21
+ * ## Why at StreamText Level?
22
+ *
23
+ * Retrying at the streamText level (vs model.doStream level) ensures:
24
+ * 1. **Fresh Vercel SDK state**: Each retry gets a new eventProcessor with no
25
+ * partial chunk pollution from failed attempts
26
+ * 2. **Correct message sequences**: No orphaned content IDs or invalid message structures
27
+ * 3. **Natural continuation**: Vercel SDK's built-in logic handles multi-step resumption
28
+ *
29
+ * ## How It Works with Context
30
+ *
31
+ * The Context system provides the accumulated messages for retry:
32
+ * - Step 1 succeeds → Context.endStep() records messages
33
+ * - Step 2 fails → No endStep() call, empty step array remains
34
+ * - Retry → Context.getMessages() provides Step 1's messages
35
+ * - Fresh streamText() call receives those messages and continues from Step 2 Context.startStep() is idempotent → reuses empty step array
36
+ *
37
+ * ## Multi-Step Scenarios
38
+ *
39
+ * For multi-step flows (e.g., tool calling):
40
+ * - Step 1 (tool call) succeeds
41
+ * - Step 2 (continuation) fails
42
+ * - Retry receives Step 1's messages (including tool-results)
43
+ * - Vercel SDK sees tool-results and continues to Step 2
44
+ * - Does NOT re-execute Step 1's tools (already have results)
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const middleware = createStreamRetryMiddleware({
49
+ * maxRetries: 3,
50
+ * maxTotalRetryTimeMs: 120000,
51
+ * isRetryable: (error) => isNetworkError(error)
52
+ * });
53
+ *
54
+ * const provider = applyMiddleware(baseProvider, middleware);
55
+ * const result = await provider.streamText({ model, messages, tools });
56
+ * // Automatically retries on stream consumption failures
57
+ * ```
58
+ */
59
+ import { type Logger } from "../../../../util/logger.js";
60
+ import { type BackoffStrategy } from "../../../util/backoff-strategy.js";
61
+ import type { StreamTextMiddleware } from "../middleware.js";
62
+ export interface StreamRetryOptions {
63
+ /**
64
+ * Maximum number of retry attempts per phase (not including the initial attempt).
65
+ * Each phase (initial call, stream consumption) gets its own retry budget.
66
+ * Default: Infinity (unlimited)
67
+ */
68
+ maxRetries?: number;
69
+ /**
70
+ * Custom backoff strategy for calculating retry delays.
71
+ * If not provided, uses ExponentialBackoff.
72
+ */
73
+ backoffStrategy?: BackoffStrategy;
74
+ /**
75
+ * Initial delay in milliseconds before the first retry.
76
+ * Default: 500 (0.5 seconds)
77
+ */
78
+ initialDelayMs?: number;
79
+ /**
80
+ * Maximum delay in milliseconds for exponential backoff.
81
+ * Default: 5000 (5 seconds)
82
+ */
83
+ maxDelayMs?: number;
84
+ /**
85
+ * Backoff multiplier for exponential backoff.
86
+ * Default: 2
87
+ */
88
+ backoffMultiplier?: number;
89
+ /**
90
+ * Maximum total time in milliseconds for all retry attempts.
91
+ * Default: undefined (no time limit)
92
+ */
93
+ maxTotalRetryTimeMs?: number;
94
+ /**
95
+ * Function to determine if an error is retryable.
96
+ * Default: checks for timeout and connection errors
97
+ */
98
+ isRetryable?: (error: unknown) => boolean;
99
+ /**
100
+ * Callback invoked before each retry attempt.
101
+ */
102
+ onRetry?: (error: unknown, attempt: number, delayMs: number, totalRetryTimeMs: number) => void | Promise<void>;
103
+ /**
104
+ * Optional abort signal to cancel retry attempts.
105
+ * When the signal is aborted, no further retries will be attempted.
106
+ */
107
+ abortSignal?: AbortSignal;
108
+ /** Logger instance for retry operations */
109
+ logger?: Logger;
110
+ }
111
+ /**
112
+ * Creates a middleware that retries streamText calls on failure.
113
+ *
114
+ * This middleware wraps the entire streamText operation, catching errors during
115
+ * both the initial call and stream consumption. Retries with accumulated messages from Context.
116
+ *
117
+ * @param options - Configuration for retry behavior
118
+ * @returns A StreamTextMiddleware
119
+ */
120
+ export declare function createStreamRetryMiddleware(options?: StreamRetryOptions): StreamTextMiddleware;
121
+ //# sourceMappingURL=stream-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-retry.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/stream-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAEH,OAAO,EACL,KAAK,MAAM,EAGZ,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,mCAAmC,CAAC;AAI3C,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,kBAAkB,CAAC;AAG1B,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IAE1C;;OAEG;IACH,OAAO,CAAC,EAAE,CACR,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,KACrB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1B;;;OAGG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,GAAE,kBAAuB,GAC/B,oBAAoB,CAgHtB"}
@@ -0,0 +1,291 @@
1
+ /**
2
+ * Retry middleware for StreamText operations.
3
+ *
4
+ * This middleware wraps entire streamText() calls to handle failures during
5
+ * stream consumption. When a stream fails mid-consumption (e.g., network timeout),
6
+ * this middleware retries the entire streamText call with accumulated messages
7
+ * from successful steps preserved via Context.
8
+ *
9
+ * **Two-phase retry architecture:**
10
+ * 1. **Initial call retry**: Retries errors when calling streamText() to get metadata
11
+ * 2. **Stream consumption retry**: Retries mid-stream errors during stream consumption
12
+ *
13
+ * **Separate retry budgets:**
14
+ * Each phase has its own independent retry budget. For example, with maxRetries: 3:
15
+ * - Phase 1 can retry up to 3 times (4 total attempts to get initial metadata)
16
+ * - Phase 2 can retry up to 3 times (4 total attempts to consume stream)
17
+ * - Maximum total attempts: 4 (phase 1) + 4 (phase 2) = 8
18
+ *
19
+ * This design ensures that failures in one phase don't prevent retries in the other phase.
20
+ *
21
+ * ## Why at StreamText Level?
22
+ *
23
+ * Retrying at the streamText level (vs model.doStream level) ensures:
24
+ * 1. **Fresh Vercel SDK state**: Each retry gets a new eventProcessor with no
25
+ * partial chunk pollution from failed attempts
26
+ * 2. **Correct message sequences**: No orphaned content IDs or invalid message structures
27
+ * 3. **Natural continuation**: Vercel SDK's built-in logic handles multi-step resumption
28
+ *
29
+ * ## How It Works with Context
30
+ *
31
+ * The Context system provides the accumulated messages for retry:
32
+ * - Step 1 succeeds → Context.endStep() records messages
33
+ * - Step 2 fails → No endStep() call, empty step array remains
34
+ * - Retry → Context.getMessages() provides Step 1's messages
35
+ * - Fresh streamText() call receives those messages and continues from Step 2 Context.startStep() is idempotent → reuses empty step array
36
+ *
37
+ * ## Multi-Step Scenarios
38
+ *
39
+ * For multi-step flows (e.g., tool calling):
40
+ * - Step 1 (tool call) succeeds
41
+ * - Step 2 (continuation) fails
42
+ * - Retry receives Step 1's messages (including tool-results)
43
+ * - Vercel SDK sees tool-results and continues to Step 2
44
+ * - Does NOT re-execute Step 1's tools (already have results)
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const middleware = createStreamRetryMiddleware({
49
+ * maxRetries: 3,
50
+ * maxTotalRetryTimeMs: 120000,
51
+ * isRetryable: (error) => isNetworkError(error)
52
+ * });
53
+ *
54
+ * const provider = applyMiddleware(baseProvider, middleware);
55
+ * const result = await provider.streamText({ model, messages, tools });
56
+ * // Automatically retries on stream consumption failures
57
+ * ```
58
+ */
59
+ import { getErrorMeta, getPrefixedLogger, } from "../../../../util/logger.js";
60
+ import { ExponentialBackoff, } from "../../../util/backoff-strategy.js";
61
+ import { LLMProviderError } from "../../error.js";
62
+ import { isProviderErrorRetryable } from "../../util/provider-errors.js";
63
+ /**
64
+ * Creates a middleware that retries streamText calls on failure.
65
+ *
66
+ * This middleware wraps the entire streamText operation, catching errors during
67
+ * both the initial call and stream consumption. Retries with accumulated messages from Context.
68
+ *
69
+ * @param options - Configuration for retry behavior
70
+ * @returns A StreamTextMiddleware
71
+ */
72
+ export function createStreamRetryMiddleware(options = {}) {
73
+ const { maxRetries = Infinity, initialDelayMs = 500, maxDelayMs = 5000, backoffMultiplier = 2, maxTotalRetryTimeMs, isRetryable = isProviderErrorRetryable, onRetry, abortSignal, logger = getPrefixedLogger("[StreamRetry]"), } = options;
74
+ const backoffStrategy = options.backoffStrategy ??
75
+ new ExponentialBackoff({
76
+ initialDelayMs,
77
+ maxDelayMs,
78
+ backoffMultiplier,
79
+ });
80
+ const maxRetriesDisplay = maxRetries === Infinity ? "unlimited" : String(maxRetries);
81
+ return {
82
+ wrap(provider) {
83
+ return {
84
+ async streamText(streamOptions) {
85
+ // Phase 1: Retry initial streamText call
86
+ let httpAttempt = 0;
87
+ let totalRetryTime = 0;
88
+ const overallStartTime = Date.now();
89
+ let initialResult;
90
+ while (true) {
91
+ try {
92
+ initialResult = await provider.streamText(streamOptions);
93
+ break; // Success!
94
+ }
95
+ catch (err) {
96
+ httpAttempt++;
97
+ const error = wrapError(err);
98
+ const delay = await handleRetryAttempt(error, httpAttempt, totalRetryTime, {
99
+ maxRetries,
100
+ maxRetriesDisplay,
101
+ maxTotalRetryTimeMs,
102
+ overallStartTime,
103
+ backoffStrategy,
104
+ isRetryable,
105
+ onRetry,
106
+ abortSignal,
107
+ logger,
108
+ errorContext: "HTTP error",
109
+ });
110
+ totalRetryTime += delay;
111
+ }
112
+ }
113
+ // Phase 2: Wrap streams to handle consumption errors
114
+ const retryingFullStream = createRetryingAsyncIterable(provider, streamOptions, () => initialResult.fullStream, {
115
+ maxRetries,
116
+ maxRetriesDisplay,
117
+ maxTotalRetryTimeMs,
118
+ overallStartTime,
119
+ backoffStrategy,
120
+ isRetryable,
121
+ onRetry,
122
+ abortSignal,
123
+ logger,
124
+ });
125
+ const retryingTextStream = createRetryingAsyncIterable(provider, streamOptions, () => initialResult.textStream, {
126
+ maxRetries,
127
+ maxRetriesDisplay,
128
+ maxTotalRetryTimeMs,
129
+ overallStartTime,
130
+ backoffStrategy,
131
+ isRetryable,
132
+ onRetry,
133
+ abortSignal,
134
+ logger,
135
+ });
136
+ // Return result with retrying streams
137
+ return {
138
+ ...initialResult,
139
+ fullStream: retryingFullStream,
140
+ textStream: retryingTextStream,
141
+ };
142
+ },
143
+ };
144
+ },
145
+ };
146
+ }
147
+ /**
148
+ * Creates an AsyncIterableStream that retries on consumption errors.
149
+ */
150
+ function createRetryingAsyncIterable(provider, streamOptions, getInitialStream, config) {
151
+ // Create an AsyncIterable that implements the retry logic
152
+ const retryingIterable = {
153
+ async *[Symbol.asyncIterator]() {
154
+ let consumptionAttempt = 0;
155
+ let isFirstAttempt = true;
156
+ while (true) {
157
+ try {
158
+ // Get stream for current attempt
159
+ const iterator = isFirstAttempt
160
+ ? getInitialStream()[Symbol.asyncIterator]()
161
+ : await (async () => {
162
+ const streamResult = await provider.streamText(streamOptions);
163
+ // Use fullStream for retries (contains all chunk types)
164
+ return streamResult.fullStream[Symbol.asyncIterator]();
165
+ })();
166
+ isFirstAttempt = false;
167
+ // Iterate through chunks
168
+ while (true) {
169
+ const { value: chunk, done } = await iterator.next();
170
+ if (done) {
171
+ return; // Success!
172
+ }
173
+ // Check for error chunks
174
+ if (typeof chunk === "object" &&
175
+ chunk !== null &&
176
+ "type" in chunk &&
177
+ chunk.type === "error") {
178
+ throw wrapError(chunk.error);
179
+ }
180
+ // Normal chunk - yield it
181
+ yield chunk;
182
+ // Reset consumption attempt on successful chunk
183
+ consumptionAttempt = 0;
184
+ }
185
+ }
186
+ catch (err) {
187
+ const error = wrapError(err);
188
+ // Handle error - check if we should retry
189
+ consumptionAttempt++;
190
+ const totalElapsed = Date.now() - config.overallStartTime;
191
+ try {
192
+ await handleRetryAttempt(error, consumptionAttempt, totalElapsed, {
193
+ ...config,
194
+ errorContext: "Stream error",
195
+ });
196
+ // Loop continues - will try again with fresh stream
197
+ }
198
+ catch (finalError) {
199
+ // Exhausted or non-retryable - yield error and exit
200
+ yield {
201
+ type: "error",
202
+ error: finalError,
203
+ };
204
+ return;
205
+ }
206
+ }
207
+ }
208
+ },
209
+ };
210
+ // Convert AsyncIterable to ReadableStream
211
+ const readableStream = new ReadableStream({
212
+ async start(controller) {
213
+ try {
214
+ for await (const chunk of retryingIterable) {
215
+ controller.enqueue(chunk);
216
+ }
217
+ controller.close();
218
+ }
219
+ catch (error) {
220
+ controller.error(error);
221
+ }
222
+ },
223
+ });
224
+ // Return as AsyncIterableStream (ReadableStream with async iteration support)
225
+ return readableStream;
226
+ }
227
+ /**
228
+ * Wraps an error in LLMProviderError if it isn't already.
229
+ */
230
+ function wrapError(err, provider) {
231
+ if (err instanceof LLMProviderError) {
232
+ return err;
233
+ }
234
+ // Provider is optional here since we may not know it at this level
235
+ return new LLMProviderError({
236
+ provider: provider,
237
+ cause: err,
238
+ });
239
+ }
240
+ /**
241
+ * Checks if retry is allowed and executes retry logic.
242
+ * Returns the delay in milliseconds if a retry should be attempted.
243
+ * Throws if no retry is possible.
244
+ */
245
+ async function handleRetryAttempt(error, attempt, totalRetryTime, config) {
246
+ // Check abort signal
247
+ if (config.abortSignal?.aborted) {
248
+ const abortError = new LLMProviderError({
249
+ provider: error.provider,
250
+ message: "Request aborted",
251
+ type: "aborted",
252
+ isRetryable: false,
253
+ });
254
+ config.logger.info("Request aborted, stopping retry attempts");
255
+ throw abortError;
256
+ }
257
+ // Check retry conditions
258
+ const withinMaxRetries = attempt <= config.maxRetries;
259
+ const withinTimeLimit = !config.maxTotalRetryTimeMs ||
260
+ Date.now() - config.overallStartTime < config.maxTotalRetryTimeMs;
261
+ const errorIsRetryable = config.isRetryable(error);
262
+ const canRetry = errorIsRetryable && withinMaxRetries && withinTimeLimit;
263
+ if (!canRetry) {
264
+ if (errorIsRetryable) {
265
+ const reason = !withinMaxRetries
266
+ ? `after ${config.maxRetriesDisplay} retries`
267
+ : `total retry time exceeded ${config.maxTotalRetryTimeMs}ms`;
268
+ config.logger.error(`Exceeded retry limits: ${reason}`, getErrorMeta(error.cause));
269
+ throw new LLMProviderError({
270
+ provider: error.provider,
271
+ message: `${config.errorContext} ${reason}`,
272
+ type: "retries_exhausted",
273
+ isRetryable: false,
274
+ cause: error,
275
+ });
276
+ }
277
+ config.logger.error("Non-retryable error encountered", getErrorMeta(error.cause));
278
+ throw error;
279
+ }
280
+ // Calculate backoff delay
281
+ const delay = config.backoffStrategy.getNextDelay(attempt);
282
+ config.logger.warn(`${config.errorContext} (type: ${error.type}). Attempt ${attempt}/${config.maxRetriesDisplay}. Retrying in ${delay}ms...`);
283
+ // Call onRetry callback
284
+ if (config.onRetry) {
285
+ await config.onRetry(error, attempt, delay, totalRetryTime);
286
+ }
287
+ // Wait before retry
288
+ await new Promise((resolve) => setTimeout(resolve, delay));
289
+ return delay;
290
+ }
291
+ //# sourceMappingURL=stream-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-retry.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/stream-retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAEH,OAAO,EAEL,YAAY,EACZ,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,kBAAkB,GAEnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AA0EzE;;;;;;;;GAQG;AACH,MAAM,UAAU,2BAA2B,CACzC,UAA8B,EAAE;IAEhC,MAAM,EACJ,UAAU,GAAG,QAAQ,EACrB,cAAc,GAAG,GAAG,EACpB,UAAU,GAAG,IAAI,EACjB,iBAAiB,GAAG,CAAC,EACrB,mBAAmB,EACnB,WAAW,GAAG,wBAAwB,EACtC,OAAO,EACP,WAAW,EACX,MAAM,GAAG,iBAAiB,CAAC,eAAe,CAAC,GAC5C,GAAG,OAAO,CAAC;IAEZ,MAAM,eAAe,GACnB,OAAO,CAAC,eAAe;QACvB,IAAI,kBAAkB,CAAC;YACrB,cAAc;YACd,UAAU;YACV,iBAAiB;SAClB,CAAC,CAAC;IAEL,MAAM,iBAAiB,GACrB,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAE7D,OAAO;QACL,IAAI,CAAC,QAA4B;YAC/B,OAAO;gBACL,KAAK,CAAC,UAAU,CAGd,aAAuC;oBAEvC,yCAAyC;oBACzC,IAAI,WAAW,GAAG,CAAC,CAAC;oBACpB,IAAI,cAAc,GAAG,CAAC,CAAC;oBACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBACpC,IAAI,aAAsC,CAAC;oBAE3C,OAAO,IAAI,EAAE,CAAC;wBACZ,IAAI,CAAC;4BACH,aAAa,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;4BACzD,MAAM,CAAC,WAAW;wBACpB,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,WAAW,EAAE,CAAC;4BACd,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;4BAE7B,MAAM,KAAK,GAAG,MAAM,kBAAkB,CACpC,KAAK,EACL,WAAW,EACX,cAAc,EACd;gCACE,UAAU;gCACV,iBAAiB;gCACjB,mBAAmB;gCACnB,gBAAgB;gCAChB,eAAe;gCACf,WAAW;gCACX,OAAO;gCACP,WAAW;gCACX,MAAM;gCACN,YAAY,EAAE,YAAY;6BAC3B,CACF,CAAC;4BACF,cAAc,IAAI,KAAK,CAAC;wBAC1B,CAAC;oBACH,CAAC;oBAED,qDAAqD;oBACrD,MAAM,kBAAkB,GAAG,2BAA2B,CACpD,QAAQ,EACR,aAAa,EACb,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,EAC9B;wBACE,UAAU;wBACV,iBAAiB;wBACjB,mBAAmB;wBACnB,gBAAgB;wBAChB,eAAe;wBACf,WAAW;wBACX,OAAO;wBACP,WAAW;wBACX,MAAM;qBACP,CACF,CAAC;oBAEF,MAAM,kBAAkB,GAAG,2BAA2B,CACpD,QAAQ,EACR,aAAa,EACb,GAAG,EAAE,CAAC,aAAa,CAAC,UAAU,EAC9B;wBACE,UAAU;wBACV,iBAAiB;wBACjB,mBAAmB;wBACnB,gBAAgB;wBAChB,eAAe;wBACf,WAAW;wBACX,OAAO;wBACP,WAAW;wBACX,MAAM;qBACP,CACF,CAAC;oBAEF,sCAAsC;oBACtC,OAAO;wBACL,GAAG,aAAa;wBAChB,UAAU,EAAE,kBAAkB;wBAC9B,UAAU,EAAE,kBAAkB;qBAC/B,CAAC;gBACJ,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,2BAA2B,CAClC,QAA4B,EAC5B,aAAqC,EACrC,gBAAwC,EACxC,MAeC;IAED,0DAA0D;IAC1D,MAAM,gBAAgB,GAAqB;QACzC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;YAC3B,IAAI,kBAAkB,GAAG,CAAC,CAAC;YAC3B,IAAI,cAAc,GAAG,IAAI,CAAC;YAE1B,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,iCAAiC;oBACjC,MAAM,QAAQ,GAAG,cAAc;wBAC7B,CAAC,CAAC,gBAAgB,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE;wBAC5C,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;4BAChB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;4BAC9D,wDAAwD;4BACxD,OAAQ,YAAY,CAAC,UAAkB,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;wBAClE,CAAC,CAAC,EAAE,CAAC;oBAET,cAAc,GAAG,KAAK,CAAC;oBAEvB,yBAAyB;oBACzB,OAAO,IAAI,EAAE,CAAC;wBACZ,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;wBAErD,IAAI,IAAI,EAAE,CAAC;4BACT,OAAO,CAAC,WAAW;wBACrB,CAAC;wBAED,yBAAyB;wBACzB,IACE,OAAO,KAAK,KAAK,QAAQ;4BACzB,KAAK,KAAK,IAAI;4BACd,MAAM,IAAI,KAAK;4BACf,KAAK,CAAC,IAAI,KAAK,OAAO,EACtB,CAAC;4BACD,MAAM,SAAS,CAAE,KAAa,CAAC,KAAK,CAAC,CAAC;wBACxC,CAAC;wBAED,0BAA0B;wBAC1B,MAAM,KAAK,CAAC;wBAEZ,gDAAgD;wBAChD,kBAAkB,GAAG,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;oBAE7B,0CAA0C;oBAC1C,kBAAkB,EAAE,CAAC;oBACrB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,gBAAgB,CAAC;oBAE1D,IAAI,CAAC;wBACH,MAAM,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE;4BAChE,GAAG,MAAM;4BACT,YAAY,EAAE,cAAc;yBAC7B,CAAC,CAAC;wBACH,oDAAoD;oBACtD,CAAC;oBAAC,OAAO,UAAU,EAAE,CAAC;wBACpB,oDAAoD;wBACpD,MAAM;4BACJ,IAAI,EAAE,OAAO;4BACb,KAAK,EAAE,UAAU;yBACX,CAAC;wBACT,OAAO;oBACT,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;IAEF,0CAA0C;IAC1C,MAAM,cAAc,GAAG,IAAI,cAAc,CAAI;QAC3C,KAAK,CAAC,KAAK,CAAC,UAAU;YACpB,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;oBAC3C,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBAC5B,CAAC;gBACD,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IAEH,8EAA8E;IAC9E,OAAO,cAAwC,CAAC;AAClD,CAAC;AAED;;GAEG;AACH,SAAS,SAAS,CAAC,GAAY,EAAE,QAAiB;IAChD,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;QACpC,OAAO,GAAG,CAAC;IACb,CAAC;IACD,mEAAmE;IACnE,OAAO,IAAI,gBAAgB,CAAC;QAC1B,QAAQ,EAAE,QAAe;QACzB,KAAK,EAAE,GAAG;KACX,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,kBAAkB,CAC/B,KAAuB,EACvB,OAAe,EACf,cAAsB,EACtB,MAgBC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,IAAI,gBAAgB,CAAC;YACtC,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,iBAAiB;YAC1B,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;QAC/D,MAAM,UAAU,CAAC;IACnB,CAAC;IAED,yBAAyB;IACzB,MAAM,gBAAgB,GAAG,OAAO,IAAI,MAAM,CAAC,UAAU,CAAC;IACtD,MAAM,eAAe,GACnB,CAAC,MAAM,CAAC,mBAAmB;QAC3B,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,mBAAmB,CAAC;IACpE,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAEnD,MAAM,QAAQ,GAAG,gBAAgB,IAAI,gBAAgB,IAAI,eAAe,CAAC;IAEzE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,CAAC,gBAAgB;gBAC9B,CAAC,CAAC,SAAS,MAAM,CAAC,iBAAiB,UAAU;gBAC7C,CAAC,CAAC,6BAA6B,MAAM,CAAC,mBAAmB,IAAI,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,KAAK,CACjB,0BAA0B,MAAM,EAAE,EAClC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAC1B,CAAC;YACF,MAAM,IAAI,gBAAgB,CAAC;gBACzB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,OAAO,EAAE,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,EAAE;gBAC3C,IAAI,EAAE,mBAAmB;gBACzB,WAAW,EAAE,KAAK;gBAClB,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,KAAK,CACjB,iCAAiC,EACjC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAC1B,CAAC;QACF,MAAM,KAAK,CAAC;IACd,CAAC;IAED,0BAA0B;IAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAE3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAChB,GAAG,MAAM,CAAC,YAAY,WAAW,KAAK,CAAC,IAAI,cAAc,OAAO,IAAI,MAAM,CAAC,iBAAiB,iBAAiB,KAAK,OAAO,CAC1H,CAAC;IAEF,wBAAwB;IACxB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAC9D,CAAC;IAED,oBAAoB;IACpB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAE3D,OAAO,KAAK,CAAC;AACf,CAAC"}