@superblocksteam/vite-plugin-file-sync 2.0.59-next.1 → 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,70 @@
1
+ /**
2
+ * Multi-step LLM interaction system with provider interface and middleware.
3
+ *
4
+ * This module provides a clean, SDK-agnostic interface for LLM streaming
5
+ * with composable middleware. Key features:
6
+ * - Provider interface abstracts away SDK details
7
+ * - onFinally lifecycle hook for cleanup after stream consumption
8
+ * - Composable middlewares for cross-cutting concerns
9
+ * - Adapter pattern for SDK flexibility
10
+ *
11
+ * ## Architecture
12
+ *
13
+ * ```
14
+ * Middlewares (Context, Logging, Profiler, LLMObs)
15
+ * ↓
16
+ * StreamTextProvider Interface (with onFinally)
17
+ * ↓
18
+ * VercelStreamTextAdapter
19
+ * ↓
20
+ * Vercel AI SDK
21
+ * ```
22
+ *
23
+ * ## Usage
24
+ *
25
+ * ```typescript
26
+ * import {
27
+ * createVercelProvider,
28
+ * applyMiddleware,
29
+ * createContextMiddleware,
30
+ * createLoggingMiddleware,
31
+ * } from "./interaction";
32
+ *
33
+ * // Create base provider
34
+ * const baseProvider = createVercelProvider();
35
+ *
36
+ * // Apply middlewares
37
+ * const provider = applyMiddleware(
38
+ * baseProvider,
39
+ * createContextMiddleware({ ... }),
40
+ * createLoggingMiddleware({ ... })
41
+ * );
42
+ *
43
+ * // Use the provider
44
+ * const result = await provider.streamText({
45
+ * model,
46
+ * messages,
47
+ * tools,
48
+ * onFinally: async () => {
49
+ * // Cleanup after stream consumption
50
+ * }
51
+ * });
52
+ *
53
+ * for await (const chunk of result.fullStream) {
54
+ * // Process chunks
55
+ * }
56
+ * // onFinally runs here ^
57
+ * ```
58
+ */
59
+ // Composition utilities
60
+ export { compose, applyMiddleware, createMiddleware } from "./compose.js";
61
+ // Stream lifecycle utilities
62
+ export { withStreamLifecycle } from "./stream-lifecycle.js";
63
+ // Vercel SDK adapter
64
+ export { VercelStreamTextAdapter, createVercelProvider, } from "./adapters/vercel.js";
65
+ // Built-in middlewares
66
+ export { createLoggingMiddleware, } from "./middlewares/logging.js";
67
+ export { createProfilerMiddleware, } from "./middlewares/profiler.js";
68
+ export { createLLMObsMiddleware, } from "./middlewares/llmobs.js";
69
+ export { createStreamRetryMiddleware, } from "./middlewares/stream-retry.js";
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/interaction/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAgBH,wBAAwB;AACxB,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAE1E,6BAA6B;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,qBAAqB;AACrB,OAAO,EACL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAE9B,uBAAuB;AACvB,OAAO,EACL,uBAAuB,GAGxB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,wBAAwB,GAEzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,sBAAsB,GAEvB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,2BAA2B,GAE5B,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Middleware interface for multi-step LLM interactions.
3
+ *
4
+ * Provides a composable wrap pattern for intercepting and transforming
5
+ * StreamTextProvider calls. Each middleware can:
6
+ * - Transform input options before execution
7
+ * - Add lifecycle hooks (onFinally, etc.)
8
+ * - Wrap and transform output streams
9
+ * - Handle errors and control flow
10
+ * - Short-circuit execution if needed
11
+ *
12
+ * Middlewares operate on the high-level StreamTextProvider interface,
13
+ * not on SDK-specific details. This makes them portable across different
14
+ * LLM SDKs (Vercel, Anthropic, OpenAI, etc.).
15
+ */
16
+ import type { StreamTextProvider } from "./provider.js";
17
+ /**
18
+ * Middleware interface using the wrap pattern.
19
+ *
20
+ * Each middleware wraps a StreamTextProvider, allowing it to:
21
+ * - Intercept and transform streamText() calls
22
+ * - Execute logic before/after the call
23
+ * - Transform or wrap the options and results
24
+ * - Handle errors and control flow
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const loggingMiddleware: StreamTextMiddleware = {
29
+ * wrap(provider) {
30
+ * return {
31
+ * async streamText(options) {
32
+ * console.log('Starting streamText call');
33
+ * const result = await provider.streamText(options);
34
+ * console.log('Call complete');
35
+ * return result;
36
+ * }
37
+ * };
38
+ * }
39
+ * };
40
+ * ```
41
+ */
42
+ export interface StreamTextMiddleware {
43
+ /**
44
+ * Wraps a StreamTextProvider with middleware behavior.
45
+ *
46
+ * @param provider - The provider to wrap
47
+ * @returns A wrapped provider with the middleware's behavior
48
+ */
49
+ wrap(provider: StreamTextProvider): StreamTextProvider;
50
+ }
51
+ export type { StreamTextProvider, StreamTextOptions, StreamTextResult, StepParameters, StreamChunk, StepResult, FinalResult, } from "./provider.js";
52
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../../src/ai-service/llm/interaction/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,kBAAkB,GAAG,kBAAkB,CAAC;CACxD;AAGD,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACd,WAAW,EACX,UAAU,EACV,WAAW,GACZ,MAAM,eAAe,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Middleware interface for multi-step LLM interactions.
3
+ *
4
+ * Provides a composable wrap pattern for intercepting and transforming
5
+ * StreamTextProvider calls. Each middleware can:
6
+ * - Transform input options before execution
7
+ * - Add lifecycle hooks (onFinally, etc.)
8
+ * - Wrap and transform output streams
9
+ * - Handle errors and control flow
10
+ * - Short-circuit execution if needed
11
+ *
12
+ * Middlewares operate on the high-level StreamTextProvider interface,
13
+ * not on SDK-specific details. This makes them portable across different
14
+ * LLM SDKs (Vercel, Anthropic, OpenAI, etc.).
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../../src/ai-service/llm/interaction/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * LLMObs middleware adapter.
3
+ *
4
+ * This middleware wraps the existing LLMObsStreamTextMiddleware to work
5
+ * with the new provider-based middleware interface. It provides observability
6
+ * tracing for LLM interactions.
7
+ */
8
+ import type { Logger } from "../../../../util/logger.js";
9
+ import type { LLMObsTracer } from "../../../llmobs/index.js";
10
+ import type { StreamTextMiddleware } from "../middleware.js";
11
+ /**
12
+ * Options for configuring the LLMObs middleware.
13
+ */
14
+ export interface LLMObsMiddlewareOptions {
15
+ /** LLMObs tracer instance */
16
+ tracer?: LLMObsTracer;
17
+ /** Logger instance */
18
+ logger?: Logger;
19
+ }
20
+ /**
21
+ * Creates a middleware that adds LLMObs observability tracing.
22
+ *
23
+ * This middleware wraps the existing LLMObsStreamTextMiddleware to provide:
24
+ * - Workflow and LLM span hierarchy
25
+ * - Token usage tracking
26
+ * - Tool call tracing
27
+ * - Segment-level tracking (thinking, text, tool-input)
28
+ * - Error and abort handling
29
+ *
30
+ * @param options - Configuration for the middleware
31
+ * @returns A StreamTextMiddleware
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * const middleware = createLLMObsMiddleware({
36
+ * tracer: LLMObsTracer.instance,
37
+ * logger: getLogger()
38
+ * });
39
+ *
40
+ * const streamText = applyMiddleware(baseStreamText, middleware);
41
+ * const result = await streamText({ model, messages, tools });
42
+ * ```
43
+ */
44
+ export declare function createLLMObsMiddleware(options?: LLMObsMiddlewareOptions): StreamTextMiddleware;
45
+ //# sourceMappingURL=llmobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmobs.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/llmobs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EACV,oBAAoB,EAIrB,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,6BAA6B;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,sBAAsB;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,oBAAoB,CAwEtB"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * LLMObs middleware adapter.
3
+ *
4
+ * This middleware wraps the existing LLMObsStreamTextMiddleware to work
5
+ * with the new provider-based middleware interface. It provides observability
6
+ * tracing for LLM interactions.
7
+ */
8
+ import { LLMObsStreamTextMiddleware, wrapStream, } from "../../../llmobs/middleware/stream-text.js";
9
+ /**
10
+ * Creates a middleware that adds LLMObs observability tracing.
11
+ *
12
+ * This middleware wraps the existing LLMObsStreamTextMiddleware to provide:
13
+ * - Workflow and LLM span hierarchy
14
+ * - Token usage tracking
15
+ * - Tool call tracing
16
+ * - Segment-level tracking (thinking, text, tool-input)
17
+ * - Error and abort handling
18
+ *
19
+ * @param options - Configuration for the middleware
20
+ * @returns A StreamTextMiddleware
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * const middleware = createLLMObsMiddleware({
25
+ * tracer: LLMObsTracer.instance,
26
+ * logger: getLogger()
27
+ * });
28
+ *
29
+ * const streamText = applyMiddleware(baseStreamText, middleware);
30
+ * const result = await streamText({ model, messages, tools });
31
+ * ```
32
+ */
33
+ export function createLLMObsMiddleware(options = {}) {
34
+ const { tracer, logger } = options;
35
+ return {
36
+ wrap(provider) {
37
+ return {
38
+ async streamText(streamOptions) {
39
+ // Create LLMObs middleware instance
40
+ const llmobs = new LLMObsStreamTextMiddleware(streamOptions.model, streamOptions.tools, tracer, logger);
41
+ try {
42
+ // Call provider with wrapped callbacks and tools
43
+ const result = await provider.streamText({
44
+ ...streamOptions,
45
+ tools: streamOptions.tools
46
+ ? llmobs.wrapTools(streamOptions.tools)
47
+ : undefined,
48
+ prepareStep: async (step) => {
49
+ return await llmobs.prepareStep(step, streamOptions.model, streamOptions.prepareStep);
50
+ },
51
+ onChunk: async (event) => {
52
+ await llmobs.onChunk(event.chunk, streamOptions.onChunk);
53
+ },
54
+ onStepFinish: async (step) => {
55
+ await llmobs.onStepFinish(step, streamOptions.onStepFinish);
56
+ },
57
+ onFinish: async (result) => {
58
+ await llmobs.onFinish(result, streamOptions.onFinish);
59
+ },
60
+ onError: async (error) => {
61
+ await llmobs.onError(error, streamOptions.onError);
62
+ },
63
+ onAbort: async () => {
64
+ await llmobs.onAbort(streamOptions.onAbort);
65
+ },
66
+ });
67
+ // Wrap result streams with error/finally handlers using the wrapStream utility
68
+ // from stream-text.ts which properly creates AsyncIterableStream
69
+ return {
70
+ ...result,
71
+ textStream: wrapStream(result.textStream, async (error) => llmobs.handleStreamError(error), async () => llmobs.onFinally()),
72
+ fullStream: wrapStream(result.fullStream, async (error) => llmobs.handleStreamError(error), async () => llmobs.onFinally()),
73
+ };
74
+ }
75
+ catch (error) {
76
+ // Clean up spans if error occurs before streams are created
77
+ llmobs.handleStreamError(error);
78
+ throw error;
79
+ }
80
+ },
81
+ };
82
+ },
83
+ };
84
+ }
85
+ //# sourceMappingURL=llmobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llmobs.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/llmobs.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,0BAA0B,EAC1B,UAAU,GACX,MAAM,2CAA2C,CAAC;AAsBnD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,sBAAsB,CACpC,UAAmC,EAAE;IAErC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEnC,OAAO;QACL,IAAI,CAAC,QAA4B;YAC/B,OAAO;gBACL,KAAK,CAAC,UAAU,CACd,aAAuC;oBAEvC,oCAAoC;oBACpC,MAAM,MAAM,GAAG,IAAI,0BAA0B,CAC3C,aAAa,CAAC,KAAK,EACnB,aAAa,CAAC,KAAK,EACnB,MAAM,EACN,MAAM,CACP,CAAC;oBAEF,IAAI,CAAC;wBACH,iDAAiD;wBACjD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAQ;4BAC9C,GAAG,aAAa;4BAChB,KAAK,EAAE,aAAa,CAAC,KAAK;gCACxB,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;gCACvC,CAAC,CAAC,SAAS;4BACb,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gCAC1B,OAAO,MAAM,MAAM,CAAC,WAAW,CAC7B,IAAI,EACJ,aAAa,CAAC,KAAK,EACnB,aAAa,CAAC,WAAW,CAC1B,CAAC;4BACJ,CAAC;4BACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gCACvB,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;4BAC3D,CAAC;4BACD,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gCAC3B,MAAM,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;4BAC9D,CAAC;4BACD,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gCACzB,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;4BACxD,CAAC;4BACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gCACvB,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;4BACrD,CAAC;4BACD,OAAO,EAAE,KAAK,IAAI,EAAE;gCAClB,MAAM,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;4BAC9C,CAAC;yBACF,CAAC,CAAC;wBAEH,+EAA+E;wBAC/E,iEAAiE;wBACjE,OAAO;4BACL,GAAG,MAAM;4BACT,UAAU,EAAE,UAAU,CACpB,MAAM,CAAC,UAAU,EACjB,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAChD,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAC/B;4BACD,UAAU,EAAE,UAAU,CACpB,MAAM,CAAC,UAAU,EACjB,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAChD,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAC/B;yBACF,CAAC;oBACJ,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,4DAA4D;wBAC5D,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;wBAChC,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Logging middleware for LLM interactions.
3
+ *
4
+ * This middleware captures detailed logs of the entire LLM interaction including:
5
+ * - Configuration and model details
6
+ * - Input messages and context
7
+ * - Each step's outputs (text, reasoning, tool calls)
8
+ * - Token usage per step and total
9
+ * - Timing information
10
+ *
11
+ * The accumulated log content is made available for saving as an artifact.
12
+ */
13
+ import type { FileArtifact } from "../../../types.js";
14
+ import type { StreamTextMiddleware } from "../middleware.js";
15
+ /**
16
+ * Reference to a mutable log content string.
17
+ * Allows external access to accumulated log content during streaming.
18
+ */
19
+ export interface LogRef {
20
+ content: string;
21
+ }
22
+ /**
23
+ * Options for configuring the logging middleware.
24
+ */
25
+ export interface LoggingMiddlewareOptions {
26
+ /** Unique identifier for this conversation */
27
+ conversationId?: string;
28
+ /** Function to save the log artifact after stream completes */
29
+ saveArtifact: (artifact: FileArtifact, stepId: string, runTimestamp: string) => Promise<void>;
30
+ /**
31
+ * Optional log reference to use for accumulating log content.
32
+ * If provided, the middleware will write to this reference.
33
+ * If not provided, an internal reference is created.
34
+ * Useful when you need external access to logs during streaming.
35
+ */
36
+ logRef?: LogRef;
37
+ /** Optional additional metadata to log */
38
+ metadata?: {
39
+ mode?: string;
40
+ provider?: string;
41
+ thinking?: boolean;
42
+ thinkingBudgetTokens?: number;
43
+ disabledTools?: string[];
44
+ headers?: Record<string, string | undefined>;
45
+ [key: string]: unknown;
46
+ };
47
+ }
48
+ /**
49
+ * Creates a middleware that logs all LLM interaction details.
50
+ *
51
+ * The middleware wraps the streamText call to capture:
52
+ * - Initial configuration and messages
53
+ * - Each step's output (text, reasoning, tool calls, usage)
54
+ * - Final aggregated statistics
55
+ *
56
+ * The log is automatically saved as a file artifact after the stream completes.
57
+ *
58
+ * @param options - Configuration for the middleware
59
+ * @returns A StreamTextMiddleware
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * // Basic usage - internal logRef
64
+ * const middleware = createLoggingMiddleware({
65
+ * conversationId: "conv-123",
66
+ * runTimestamp: new Date().toISOString(),
67
+ * saveArtifact: services.appShell.saveGeneratedArtifact,
68
+ * metadata: { mode: "build", provider: "anthropic" }
69
+ * });
70
+ *
71
+ * // With external logRef for accessing logs during streaming
72
+ * const logRef = { content: "" };
73
+ * const middleware = createLoggingMiddleware({
74
+ * conversationId: "conv-123",
75
+ * runTimestamp: new Date().toISOString(),
76
+ * saveArtifact: services.appShell.saveGeneratedArtifact,
77
+ * logRef, // Pass your own reference
78
+ * metadata: { mode: "build", provider: "anthropic" }
79
+ * });
80
+ *
81
+ * const streamText = applyMiddleware(baseStreamText, middleware);
82
+ * const result = await streamText({ model, messages, tools });
83
+ * // Access logs during streaming: console.log(logRef.content)
84
+ * // Log is automatically saved after stream completes
85
+ * ```
86
+ */
87
+ export declare function createLoggingMiddleware(options: LoggingMiddlewareOptions): StreamTextMiddleware;
88
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/logging.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EACV,oBAAoB,EAGrB,MAAM,kBAAkB,CAAC;AAG1B;;;GAGG;AACH,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,+DAA+D;IAC/D,YAAY,EAAE,CACZ,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnB;;;;;OAKG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;QAC7C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,wBAAwB,GAChC,oBAAoB,CAuLtB"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Logging middleware for LLM interactions.
3
+ *
4
+ * This middleware captures detailed logs of the entire LLM interaction including:
5
+ * - Configuration and model details
6
+ * - Input messages and context
7
+ * - Each step's outputs (text, reasoning, tool calls)
8
+ * - Token usage per step and total
9
+ * - Timing information
10
+ *
11
+ * The accumulated log content is made available for saving as an artifact.
12
+ */
13
+ import { getLogger } from "../../../../util/logger.js";
14
+ import { safeJsonStringify } from "../../../util/safe-stringify.js";
15
+ /**
16
+ * Creates a middleware that logs all LLM interaction details.
17
+ *
18
+ * The middleware wraps the streamText call to capture:
19
+ * - Initial configuration and messages
20
+ * - Each step's output (text, reasoning, tool calls, usage)
21
+ * - Final aggregated statistics
22
+ *
23
+ * The log is automatically saved as a file artifact after the stream completes.
24
+ *
25
+ * @param options - Configuration for the middleware
26
+ * @returns A StreamTextMiddleware
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * // Basic usage - internal logRef
31
+ * const middleware = createLoggingMiddleware({
32
+ * conversationId: "conv-123",
33
+ * runTimestamp: new Date().toISOString(),
34
+ * saveArtifact: services.appShell.saveGeneratedArtifact,
35
+ * metadata: { mode: "build", provider: "anthropic" }
36
+ * });
37
+ *
38
+ * // With external logRef for accessing logs during streaming
39
+ * const logRef = { content: "" };
40
+ * const middleware = createLoggingMiddleware({
41
+ * conversationId: "conv-123",
42
+ * runTimestamp: new Date().toISOString(),
43
+ * saveArtifact: services.appShell.saveGeneratedArtifact,
44
+ * logRef, // Pass your own reference
45
+ * metadata: { mode: "build", provider: "anthropic" }
46
+ * });
47
+ *
48
+ * const streamText = applyMiddleware(baseStreamText, middleware);
49
+ * const result = await streamText({ model, messages, tools });
50
+ * // Access logs during streaming: console.log(logRef.content)
51
+ * // Log is automatically saved after stream completes
52
+ * ```
53
+ */
54
+ export function createLoggingMiddleware(options) {
55
+ const { saveArtifact, metadata = {} } = options;
56
+ // Use provided logRef or create one internally
57
+ const logRef = options.logRef ?? { content: "" };
58
+ // Use provided conversationId or generate one
59
+ const conversationId = options.conversationId ?? String(Date.now());
60
+ return {
61
+ wrap(provider) {
62
+ return {
63
+ async streamText(streamOptions) {
64
+ // Timestamp for the run, used when saving the artifact
65
+ const runTimestamp = new Date().toISOString();
66
+ const modelId = typeof streamOptions.model === "string"
67
+ ? streamOptions.model
68
+ : streamOptions.model.modelId;
69
+ // Log conversation header
70
+ logRef.content += `=== LLM CONVERSATION START [${conversationId}] ===\n`;
71
+ logRef.content += `Timestamp: ${runTimestamp}\n`;
72
+ logRef.content += `Model: ${modelId}\n`;
73
+ // Log provider configuration if available
74
+ if (metadata.provider || metadata.thinking !== undefined) {
75
+ logRef.content += `Provider Config: provider=${metadata.provider || "anthropic (default)"}`;
76
+ if (metadata.thinking !== undefined) {
77
+ logRef.content += `, thinking=${metadata.thinking}`;
78
+ }
79
+ if (metadata.thinkingBudgetTokens) {
80
+ logRef.content += `, budget=${metadata.thinkingBudgetTokens}`;
81
+ }
82
+ if (metadata.disabledTools?.length) {
83
+ logRef.content += `, disabledTools=${metadata.disabledTools.join(",")}`;
84
+ }
85
+ if (metadata.headers && Object.keys(metadata.headers).length > 0) {
86
+ logRef.content += `, headers=${safeJsonStringify(metadata.headers)}`;
87
+ }
88
+ logRef.content += "\n";
89
+ }
90
+ // Log input messages
91
+ logRef.content += `--- INPUT MESSAGES ---\n`;
92
+ if (streamOptions.messages) {
93
+ for (const message of streamOptions.messages) {
94
+ logRef.content += formatMessage(message);
95
+ }
96
+ }
97
+ else if (streamOptions.user) {
98
+ logRef.content += formatMessage(streamOptions.user);
99
+ }
100
+ logRef.content += "\n";
101
+ // Log mode and tools
102
+ if (metadata.mode) {
103
+ logRef.content += `[MODE] ${metadata.mode}\n`;
104
+ }
105
+ if (streamOptions.tools) {
106
+ const toolNames = Object.keys(streamOptions.tools);
107
+ logRef.content += `Available tools: ${toolNames.length}\n`;
108
+ logRef.content += `Tools: ${toolNames.join(", ")}\n`;
109
+ }
110
+ logRef.content += "\n";
111
+ // Track step number ourselves (Vercel SDK doesn't provide it)
112
+ let stepNumber = 0;
113
+ // Call provider with wrapped callbacks
114
+ return await provider.streamText({
115
+ ...streamOptions,
116
+ onStepFinish: async (step) => {
117
+ stepNumber++;
118
+ const stepTimestamp = new Date().toISOString();
119
+ logRef.content += `--- OUTPUT STEP ${stepNumber} [${stepTimestamp}] ---\n`;
120
+ // Log token usage
121
+ if (step.usage) {
122
+ const stepInputTokens = step.usage.inputTokens ?? 0;
123
+ const stepOutputTokens = step.usage.outputTokens ?? 0;
124
+ const stepCachedTokens = step.usage.cachedInputTokens ?? 0;
125
+ logRef.content += `[TOKEN USAGE] Input: ${stepInputTokens}, Output: ${stepOutputTokens}, Total: ${step.usage.totalTokens ?? 0}`;
126
+ if (stepCachedTokens) {
127
+ logRef.content += `, Cached: ${stepCachedTokens}`;
128
+ }
129
+ logRef.content += `\n`;
130
+ }
131
+ // Log tool calls
132
+ if (step.toolCalls && step.toolCalls.length > 0) {
133
+ logRef.content += `[TOOLS CALLED]\n`;
134
+ step.toolCalls.forEach((toolCall, idx) => {
135
+ logRef.content += ` Tool ${idx + 1}: ${toolCall.toolName}\n`;
136
+ logRef.content += ` Input: ${safeJsonStringify(toolCall.args)}\n`;
137
+ });
138
+ }
139
+ // Log tool results
140
+ if (step.toolResults && step.toolResults.length > 0) {
141
+ logRef.content += `[TOOL RESULTS]\n`;
142
+ step.toolResults.forEach((result, idx) => {
143
+ logRef.content += ` Tool ${idx + 1}: ${result.toolName}\n`;
144
+ logRef.content += ` Output: ${safeJsonStringify(result.result)}\n`;
145
+ if (result.isError) {
146
+ logRef.content += ` [ERROR]\n`;
147
+ }
148
+ });
149
+ }
150
+ // Log reasoning (if present)
151
+ if (step.reasoningText && step.reasoningText.length > 0) {
152
+ logRef.content += `[REASONING]\n${step.reasoningText}\n`;
153
+ }
154
+ // Log assistant text
155
+ if (step.text) {
156
+ logRef.content += `[ASSISTANT TEXT] ${step.text}\n`;
157
+ }
158
+ logRef.content += `\n`;
159
+ return await streamOptions.onStepFinish?.(step);
160
+ },
161
+ onFinish: async (result) => {
162
+ const endTimestamp = new Date().toISOString();
163
+ logRef.content += `=== LLM CONVERSATION END [${conversationId}] ===\n`;
164
+ logRef.content += `Finish reason: ${result.finishReason}\n`;
165
+ logRef.content += `End Timestamp: ${endTimestamp}\n`;
166
+ logRef.content += `Total Steps: ${result.steps.length}\n`;
167
+ const usage = result.totalUsage;
168
+ // Log final token usage
169
+ logRef.content += `[TOTAL TOKEN USAGE] Input: ${usage.inputTokens ?? 0}, Output: ${usage.outputTokens ?? 0}, Total: ${usage.totalTokens ?? 0}`;
170
+ if (usage.cachedInputTokens ?? 0 > 0) {
171
+ logRef.content += `, Cached: ${usage.cachedInputTokens ?? 0}`;
172
+ }
173
+ logRef.content += `\n`;
174
+ return await streamOptions.onFinish?.(result);
175
+ },
176
+ onAbort: async () => {
177
+ const abortTimestamp = new Date().toISOString();
178
+ logRef.content += `=== LLM CONVERSATION ABORTED [${conversationId}] ===\n`;
179
+ logRef.content += `Abort Timestamp: ${abortTimestamp}\n\n`;
180
+ return await streamOptions.onAbort?.();
181
+ },
182
+ onFinally: async () => {
183
+ // Save the log artifact
184
+ try {
185
+ const logArtifact = {
186
+ type: "file",
187
+ filePath: `llm-conversation-${conversationId}.log`,
188
+ content: logRef.content,
189
+ };
190
+ const stepId = `llm-conversation-${conversationId}`;
191
+ await saveArtifact(logArtifact, stepId, runTimestamp);
192
+ getLogger().debug("LLM conversation log saved");
193
+ }
194
+ catch (error) {
195
+ getLogger().error("Failed to save LLM conversation log", {
196
+ error: {
197
+ kind: "SaveLogError",
198
+ message: error instanceof Error ? error.message : String(error),
199
+ stack: error instanceof Error ? error.stack : undefined,
200
+ },
201
+ });
202
+ }
203
+ return await streamOptions.onFinally?.();
204
+ },
205
+ });
206
+ },
207
+ };
208
+ },
209
+ };
210
+ }
211
+ /**
212
+ * Formats a message for logging.
213
+ */
214
+ function formatMessage(message) {
215
+ const role = message.role.toUpperCase();
216
+ if (typeof message.content === "string") {
217
+ return `[${role}] ${message.content}\n\n`;
218
+ }
219
+ // Handle array content
220
+ let output = `[${role}]\n`;
221
+ for (const part of message.content) {
222
+ if (part.type === "text") {
223
+ output += ` ${part.text}\n`;
224
+ }
225
+ else if (part.type === "image") {
226
+ output += ` [IMAGE]\n`;
227
+ }
228
+ else if (part.type === "tool-call") {
229
+ output += ` [TOOL CALL] ${part.toolName}: ${safeJsonStringify(part.args)}\n`;
230
+ }
231
+ else if (part.type === "tool-result") {
232
+ output += ` [TOOL RESULT] ${part.toolName}: ${safeJsonStringify(part.result)}\n`;
233
+ }
234
+ }
235
+ output += "\n";
236
+ return output;
237
+ }
238
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../../../src/ai-service/llm/interaction/middlewares/logging.ts"],"names":[],"mappings":"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"}