@bluefly/openstandardagents 0.4.0 → 0.4.2

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 (517) hide show
  1. package/CHANGELOG.md +137 -0
  2. package/DEMO.md +212 -0
  3. package/README.md +77 -17
  4. package/dist/adapters/drupal/generator.d.ts +149 -0
  5. package/dist/adapters/drupal/generator.d.ts.map +1 -0
  6. package/dist/adapters/drupal/generator.js +1760 -0
  7. package/dist/adapters/drupal/generator.js.map +1 -0
  8. package/dist/adapters/drupal/index.d.ts +2 -0
  9. package/dist/adapters/drupal/index.d.ts.map +1 -1
  10. package/dist/adapters/drupal/index.js +3 -0
  11. package/dist/adapters/drupal/index.js.map +1 -1
  12. package/dist/adapters/npm/adapter.js +2 -2
  13. package/dist/adapters/npm/converter.js +3 -3
  14. package/dist/cli/banner.d.ts +21 -0
  15. package/dist/cli/banner.d.ts.map +1 -0
  16. package/dist/cli/banner.js +128 -0
  17. package/dist/cli/banner.js.map +1 -0
  18. package/dist/cli/commands/dev.command.d.ts +20 -0
  19. package/dist/cli/commands/dev.command.d.ts.map +1 -0
  20. package/dist/cli/commands/dev.command.js +78 -0
  21. package/dist/cli/commands/dev.command.js.map +1 -0
  22. package/dist/cli/commands/estimate.command.d.ts +12 -0
  23. package/dist/cli/commands/estimate.command.d.ts.map +1 -0
  24. package/dist/cli/commands/estimate.command.js +226 -0
  25. package/dist/cli/commands/estimate.command.js.map +1 -0
  26. package/dist/cli/commands/export-enhanced.command.d.ts +7 -0
  27. package/dist/cli/commands/export-enhanced.command.d.ts.map +1 -0
  28. package/dist/cli/commands/{export-v2.command.js → export-enhanced.command.js} +3 -3
  29. package/dist/cli/commands/export-enhanced.command.js.map +1 -0
  30. package/dist/cli/commands/export.command.d.ts.map +1 -1
  31. package/dist/cli/commands/export.command.js +82 -4
  32. package/dist/cli/commands/export.command.js.map +1 -1
  33. package/dist/cli/commands/init.command.d.ts.map +1 -1
  34. package/dist/cli/commands/init.command.js +2 -0
  35. package/dist/cli/commands/init.command.js.map +1 -1
  36. package/dist/cli/commands/test.command.d.ts +1 -0
  37. package/dist/cli/commands/test.command.d.ts.map +1 -1
  38. package/dist/cli/commands/test.command.js +172 -105
  39. package/dist/cli/commands/test.command.js.map +1 -1
  40. package/dist/cli/commands/types/wizard-config.types.d.ts +59 -0
  41. package/dist/cli/commands/types/wizard-config.types.d.ts.map +1 -0
  42. package/dist/cli/commands/types/wizard-config.types.js +34 -0
  43. package/dist/cli/commands/types/wizard-config.types.js.map +1 -0
  44. package/dist/cli/commands/upgrade.command.d.ts +9 -0
  45. package/dist/cli/commands/upgrade.command.d.ts.map +1 -0
  46. package/dist/cli/commands/upgrade.command.js +167 -0
  47. package/dist/cli/commands/upgrade.command.js.map +1 -0
  48. package/dist/cli/commands/wizard-api-first.command.d.ts +18 -0
  49. package/dist/cli/commands/wizard-api-first.command.d.ts.map +1 -0
  50. package/dist/cli/commands/wizard-api-first.command.js +854 -0
  51. package/dist/cli/commands/wizard-api-first.command.js.map +1 -0
  52. package/dist/cli/commands/wizard-interactive.command.d.ts +25 -0
  53. package/dist/cli/commands/wizard-interactive.command.d.ts.map +1 -0
  54. package/dist/cli/commands/wizard-interactive.command.js +1875 -0
  55. package/dist/cli/commands/wizard-interactive.command.js.map +1 -0
  56. package/dist/cli/commands/workspace.command.js +1 -1
  57. package/dist/cli/commands/workspace.command.js.map +1 -1
  58. package/dist/cli/index.js +9 -0
  59. package/dist/cli/index.js.map +1 -1
  60. package/dist/cli/schema-driven/index.d.ts +27 -0
  61. package/dist/cli/schema-driven/index.d.ts.map +1 -0
  62. package/dist/cli/schema-driven/index.js +34 -0
  63. package/dist/cli/schema-driven/index.js.map +1 -0
  64. package/dist/cli/schema-driven/schema-loader.d.ts +115 -0
  65. package/dist/cli/schema-driven/schema-loader.d.ts.map +1 -0
  66. package/dist/cli/schema-driven/schema-loader.js +270 -0
  67. package/dist/cli/schema-driven/schema-loader.js.map +1 -0
  68. package/dist/cli/schema-driven/ui-generator.d.ts +88 -0
  69. package/dist/cli/schema-driven/ui-generator.d.ts.map +1 -0
  70. package/dist/cli/schema-driven/ui-generator.js +326 -0
  71. package/dist/cli/schema-driven/ui-generator.js.map +1 -0
  72. package/dist/cli/wizard/interactive-wizard.d.ts +26 -0
  73. package/dist/cli/wizard/interactive-wizard.d.ts.map +1 -0
  74. package/dist/cli/wizard/interactive-wizard.js +296 -0
  75. package/dist/cli/wizard/interactive-wizard.js.map +1 -0
  76. package/dist/cli/wizard/template-catalog.d.ts +32 -0
  77. package/dist/cli/wizard/template-catalog.d.ts.map +1 -0
  78. package/dist/cli/wizard/template-catalog.js +99 -0
  79. package/dist/cli/wizard/template-catalog.js.map +1 -0
  80. package/dist/cli/wizard/use-cases.d.ts +37 -0
  81. package/dist/cli/wizard/use-cases.d.ts.map +1 -0
  82. package/dist/cli/wizard/use-cases.js +157 -0
  83. package/dist/cli/wizard/use-cases.js.map +1 -0
  84. package/dist/di-container.d.ts.map +1 -1
  85. package/dist/di-container.js +2 -0
  86. package/dist/di-container.js.map +1 -1
  87. package/dist/package.json +33 -11
  88. package/dist/runtime/agent-runner.d.ts +46 -0
  89. package/dist/runtime/agent-runner.d.ts.map +1 -0
  90. package/dist/runtime/agent-runner.js +346 -0
  91. package/dist/runtime/agent-runner.js.map +1 -0
  92. package/dist/sdks/kagent/crd-generator.d.ts +4 -0
  93. package/dist/sdks/kagent/crd-generator.d.ts.map +1 -1
  94. package/dist/sdks/kagent/crd-generator.js +83 -2
  95. package/dist/sdks/kagent/crd-generator.js.map +1 -1
  96. package/dist/sdks/kagent/k8s-resources-generator.d.ts +73 -0
  97. package/dist/sdks/kagent/k8s-resources-generator.d.ts.map +1 -0
  98. package/dist/sdks/kagent/k8s-resources-generator.js +286 -0
  99. package/dist/sdks/kagent/k8s-resources-generator.js.map +1 -0
  100. package/dist/sdks/kagent/types.d.ts +79 -0
  101. package/dist/sdks/kagent/types.d.ts.map +1 -1
  102. package/dist/sdks/shared/validation.d.ts +2 -2
  103. package/dist/services/cost-estimation/optimization-patterns.d.ts +23 -0
  104. package/dist/services/cost-estimation/optimization-patterns.d.ts.map +1 -0
  105. package/dist/services/cost-estimation/optimization-patterns.js +147 -0
  106. package/dist/services/cost-estimation/optimization-patterns.js.map +1 -0
  107. package/dist/services/cost-estimation/pricing.d.ts +29 -0
  108. package/dist/services/cost-estimation/pricing.d.ts.map +1 -0
  109. package/dist/services/cost-estimation/pricing.js +225 -0
  110. package/dist/services/cost-estimation/pricing.js.map +1 -0
  111. package/dist/services/cost-estimation/scenario-estimator.d.ts +59 -0
  112. package/dist/services/cost-estimation/scenario-estimator.d.ts.map +1 -0
  113. package/dist/services/cost-estimation/scenario-estimator.js +145 -0
  114. package/dist/services/cost-estimation/scenario-estimator.js.map +1 -0
  115. package/dist/services/cost-estimation/token-counter.service.d.ts +51 -0
  116. package/dist/services/cost-estimation/token-counter.service.d.ts.map +1 -0
  117. package/dist/services/cost-estimation/token-counter.service.js +125 -0
  118. package/dist/services/cost-estimation/token-counter.service.js.map +1 -0
  119. package/dist/services/dev-server/dev-server.service.d.ts +121 -0
  120. package/dist/services/dev-server/dev-server.service.d.ts.map +1 -0
  121. package/dist/services/dev-server/dev-server.service.js +290 -0
  122. package/dist/services/dev-server/dev-server.service.js.map +1 -0
  123. package/dist/services/dev-server/file-watcher.d.ts +101 -0
  124. package/dist/services/dev-server/file-watcher.d.ts.map +1 -0
  125. package/dist/services/dev-server/file-watcher.js +190 -0
  126. package/dist/services/dev-server/file-watcher.js.map +1 -0
  127. package/dist/services/dev-server/live-validator.d.ts +157 -0
  128. package/dist/services/dev-server/live-validator.d.ts.map +1 -0
  129. package/dist/services/dev-server/live-validator.js +301 -0
  130. package/dist/services/dev-server/live-validator.js.map +1 -0
  131. package/dist/services/dev-server/websocket-server.d.ts +137 -0
  132. package/dist/services/dev-server/websocket-server.d.ts.map +1 -0
  133. package/dist/services/dev-server/websocket-server.js +229 -0
  134. package/dist/services/dev-server/websocket-server.js.map +1 -0
  135. package/dist/services/export/anthropic/anthropic-exporter.d.ts +70 -0
  136. package/dist/services/export/anthropic/anthropic-exporter.d.ts.map +1 -0
  137. package/dist/services/export/anthropic/anthropic-exporter.js +576 -0
  138. package/dist/services/export/anthropic/anthropic-exporter.js.map +1 -0
  139. package/dist/services/export/anthropic/api-generator.d.ts +39 -0
  140. package/dist/services/export/anthropic/api-generator.d.ts.map +1 -0
  141. package/dist/services/export/anthropic/api-generator.js +395 -0
  142. package/dist/services/export/anthropic/api-generator.js.map +1 -0
  143. package/dist/services/export/anthropic/index.d.ts +18 -0
  144. package/dist/services/export/anthropic/index.d.ts.map +1 -0
  145. package/dist/services/export/anthropic/index.js +16 -0
  146. package/dist/services/export/anthropic/index.js.map +1 -0
  147. package/dist/services/export/anthropic/tools-generator.d.ts +35 -0
  148. package/dist/services/export/anthropic/tools-generator.d.ts.map +1 -0
  149. package/dist/services/export/anthropic/tools-generator.js +260 -0
  150. package/dist/services/export/anthropic/tools-generator.js.map +1 -0
  151. package/dist/services/export/langchain/api-generator.d.ts +17 -0
  152. package/dist/services/export/langchain/api-generator.d.ts.map +1 -0
  153. package/dist/services/export/langchain/api-generator.js +375 -0
  154. package/dist/services/export/langchain/api-generator.js.map +1 -0
  155. package/dist/services/export/langchain/callbacks-generator.d.ts +63 -0
  156. package/dist/services/export/langchain/callbacks-generator.d.ts.map +1 -0
  157. package/dist/services/export/langchain/callbacks-generator.js +408 -0
  158. package/dist/services/export/langchain/callbacks-generator.js.map +1 -0
  159. package/dist/services/export/langchain/error-handling-generator.d.ts +76 -0
  160. package/dist/services/export/langchain/error-handling-generator.d.ts.map +1 -0
  161. package/dist/services/export/langchain/error-handling-generator.js +522 -0
  162. package/dist/services/export/langchain/error-handling-generator.js.map +1 -0
  163. package/dist/services/export/langchain/index.d.ts +17 -0
  164. package/dist/services/export/langchain/index.d.ts.map +1 -0
  165. package/dist/services/export/langchain/index.js +13 -0
  166. package/dist/services/export/langchain/index.js.map +1 -0
  167. package/dist/services/export/langchain/langchain-exporter.d.ts +174 -0
  168. package/dist/services/export/langchain/langchain-exporter.d.ts.map +1 -0
  169. package/dist/services/export/langchain/langchain-exporter.js +953 -0
  170. package/dist/services/export/langchain/langchain-exporter.js.map +1 -0
  171. package/dist/services/export/langchain/langgraph-generator.d.ts +86 -0
  172. package/dist/services/export/langchain/langgraph-generator.d.ts.map +1 -0
  173. package/dist/services/export/langchain/langgraph-generator.js +473 -0
  174. package/dist/services/export/langchain/langgraph-generator.js.map +1 -0
  175. package/dist/services/export/langchain/langserve-generator.d.ts +95 -0
  176. package/dist/services/export/langchain/langserve-generator.d.ts.map +1 -0
  177. package/dist/services/export/langchain/langserve-generator.js +807 -0
  178. package/dist/services/export/langchain/langserve-generator.js.map +1 -0
  179. package/dist/services/export/langchain/memory-generator.d.ts +71 -0
  180. package/dist/services/export/langchain/memory-generator.d.ts.map +1 -0
  181. package/dist/services/export/langchain/memory-generator.js +1182 -0
  182. package/dist/services/export/langchain/memory-generator.js.map +1 -0
  183. package/dist/services/export/langchain/openapi-generator.d.ts +20 -0
  184. package/dist/services/export/langchain/openapi-generator.d.ts.map +1 -0
  185. package/dist/services/export/langchain/openapi-generator.js +364 -0
  186. package/dist/services/export/langchain/openapi-generator.js.map +1 -0
  187. package/dist/services/export/langchain/plan-execute-generator.d.ts +60 -0
  188. package/dist/services/export/langchain/plan-execute-generator.d.ts.map +1 -0
  189. package/dist/services/export/langchain/plan-execute-generator.js +679 -0
  190. package/dist/services/export/langchain/plan-execute-generator.js.map +1 -0
  191. package/dist/services/export/langchain/streaming-generator.d.ts +66 -0
  192. package/dist/services/export/langchain/streaming-generator.d.ts.map +1 -0
  193. package/dist/services/export/langchain/streaming-generator.js +749 -0
  194. package/dist/services/export/langchain/streaming-generator.js.map +1 -0
  195. package/dist/services/export/langchain/tools-generator.d.ts +67 -0
  196. package/dist/services/export/langchain/tools-generator.d.ts.map +1 -0
  197. package/dist/services/export/langchain/tools-generator.js +543 -0
  198. package/dist/services/export/langchain/tools-generator.js.map +1 -0
  199. package/dist/services/export/npm/express-generator.d.ts +23 -0
  200. package/dist/services/export/npm/express-generator.d.ts.map +1 -0
  201. package/dist/services/export/npm/express-generator.js +296 -0
  202. package/dist/services/export/npm/express-generator.js.map +1 -0
  203. package/dist/services/export/npm/index.d.ts +13 -0
  204. package/dist/services/export/npm/index.d.ts.map +1 -0
  205. package/dist/services/export/npm/index.js +11 -0
  206. package/dist/services/export/npm/index.js.map +1 -0
  207. package/dist/services/export/npm/npm-exporter.d.ts +142 -0
  208. package/dist/services/export/npm/npm-exporter.d.ts.map +1 -0
  209. package/dist/services/export/npm/npm-exporter.js +480 -0
  210. package/dist/services/export/npm/npm-exporter.js.map +1 -0
  211. package/dist/services/export/npm/openapi-generator.d.ts +19 -0
  212. package/dist/services/export/npm/openapi-generator.d.ts.map +1 -0
  213. package/dist/services/export/npm/openapi-generator.js +428 -0
  214. package/dist/services/export/npm/openapi-generator.js.map +1 -0
  215. package/dist/services/export/npm/package-json-generator.d.ts +31 -0
  216. package/dist/services/export/npm/package-json-generator.d.ts.map +1 -0
  217. package/dist/services/export/npm/package-json-generator.js +153 -0
  218. package/dist/services/export/npm/package-json-generator.js.map +1 -0
  219. package/dist/services/export/npm/typescript-generator.d.ts +69 -0
  220. package/dist/services/export/npm/typescript-generator.d.ts.map +1 -0
  221. package/dist/services/export/npm/typescript-generator.js +437 -0
  222. package/dist/services/export/npm/typescript-generator.js.map +1 -0
  223. package/dist/services/export/testing/index.d.ts +8 -0
  224. package/dist/services/export/testing/index.d.ts.map +1 -0
  225. package/dist/services/export/testing/index.js +7 -0
  226. package/dist/services/export/testing/index.js.map +1 -0
  227. package/dist/services/export/testing/test-generator.d.ts +178 -0
  228. package/dist/services/export/testing/test-generator.d.ts.map +1 -0
  229. package/dist/services/export/testing/test-generator.js +2542 -0
  230. package/dist/services/export/testing/test-generator.js.map +1 -0
  231. package/dist/services/test-runner/mock-llm.service.d.ts +77 -0
  232. package/dist/services/test-runner/mock-llm.service.d.ts.map +1 -0
  233. package/dist/services/test-runner/mock-llm.service.js +173 -0
  234. package/dist/services/test-runner/mock-llm.service.js.map +1 -0
  235. package/dist/services/test-runner/scenarios.d.ts +36 -0
  236. package/dist/services/test-runner/scenarios.d.ts.map +1 -0
  237. package/dist/services/test-runner/scenarios.js +196 -0
  238. package/dist/services/test-runner/scenarios.js.map +1 -0
  239. package/dist/services/test-runner/test-runner.service.d.ts +19 -1
  240. package/dist/services/test-runner/test-runner.service.d.ts.map +1 -1
  241. package/dist/services/test-runner/test-runner.service.js +72 -6
  242. package/dist/services/test-runner/test-runner.service.js.map +1 -1
  243. package/dist/services/validation/best-practices-validator.d.ts +84 -0
  244. package/dist/services/validation/best-practices-validator.d.ts.map +1 -0
  245. package/dist/services/validation/best-practices-validator.js +499 -0
  246. package/dist/services/validation/best-practices-validator.js.map +1 -0
  247. package/dist/services/validation/cost-estimator.d.ts +69 -0
  248. package/dist/services/validation/cost-estimator.d.ts.map +1 -0
  249. package/dist/services/validation/cost-estimator.js +221 -0
  250. package/dist/services/validation/cost-estimator.js.map +1 -0
  251. package/dist/services/validation/enhanced-validator.d.ts +78 -0
  252. package/dist/services/validation/enhanced-validator.d.ts.map +1 -0
  253. package/dist/services/validation/enhanced-validator.js +212 -0
  254. package/dist/services/validation/enhanced-validator.js.map +1 -0
  255. package/dist/services/validation/index.d.ts +13 -0
  256. package/dist/services/validation/index.d.ts.map +1 -0
  257. package/dist/services/validation/index.js +9 -0
  258. package/dist/services/validation/index.js.map +1 -0
  259. package/dist/services/validation/security-validator.d.ts +81 -0
  260. package/dist/services/validation/security-validator.d.ts.map +1 -0
  261. package/dist/services/validation/security-validator.js +328 -0
  262. package/dist/services/validation/security-validator.js.map +1 -0
  263. package/dist/services/wizard/prompts.d.ts +71 -0
  264. package/dist/services/wizard/prompts.d.ts.map +1 -0
  265. package/dist/services/wizard/prompts.js +322 -0
  266. package/dist/services/wizard/prompts.js.map +1 -0
  267. package/dist/services/wizard/wizard.service.d.ts +60 -0
  268. package/dist/services/wizard/wizard.service.d.ts.map +1 -0
  269. package/dist/services/wizard/wizard.service.js +261 -0
  270. package/dist/services/wizard/wizard.service.js.map +1 -0
  271. package/dist/types/personality.zod.d.ts +23 -23
  272. package/dist/utils/version.d.ts +1 -1
  273. package/dist/utils/version.js +1 -1
  274. package/dist/version-management/core/version-manager.test.js.map +1 -1
  275. package/dist/version.d.ts +62 -0
  276. package/dist/version.d.ts.map +1 -0
  277. package/dist/version.js +73 -0
  278. package/dist/version.js.map +1 -0
  279. package/examples/a2a/agent-handoff.ossa.yaml +1 -1
  280. package/examples/a2a/service-discovery.ossa.yaml +1 -1
  281. package/examples/adapters/drupal-eca-mapping.yaml +1 -1
  282. package/examples/adapters/drupal-eca-task.yaml +1 -1
  283. package/examples/adapters/drupal-flowdrop-mapping.yaml +1 -1
  284. package/examples/adapters/drupal-maestro-mapping.yaml +1 -1
  285. package/examples/adapters/mistral-agent.yaml +1 -1
  286. package/examples/adapters/symfony-messenger-task.yaml +1 -1
  287. package/examples/adapters/symfony-messenger-workflow.yaml +1 -1
  288. package/examples/adk-integration/code-review-workflow.yml +1 -1
  289. package/examples/adk-integration/customer-support.yml +1 -1
  290. package/examples/adk-integration/data-pipeline.yml +1 -1
  291. package/examples/advanced/reasoning-agent.yaml +1 -1
  292. package/examples/advanced/workflows/hybrid-model-strategy.yaml +1 -1
  293. package/examples/agent-manifests/critics/critic-agent.yaml +1 -1
  294. package/examples/agent-manifests/governors/governor-agent.yaml +1 -1
  295. package/examples/agent-manifests/integrators/integrator-agent.yaml +1 -1
  296. package/examples/agent-manifests/judges/judge-agent.yaml +1 -1
  297. package/examples/agent-manifests/monitors/monitor-agent.yaml +1 -1
  298. package/examples/agent-manifests/orchestrators/orchestrator-agent.yaml +1 -1
  299. package/examples/agent-manifests/sample-compliant-agent.yaml +1 -1
  300. package/examples/agent-manifests/workers/worker-agent.yaml +1 -1
  301. package/examples/agents/01-customer-support-bot/.env.example +32 -0
  302. package/examples/agents/01-customer-support-bot/Dockerfile +30 -0
  303. package/examples/agents/01-customer-support-bot/README.md +295 -0
  304. package/examples/agents/01-customer-support-bot/agent.ossa.yaml +172 -0
  305. package/examples/agents/01-customer-support-bot/docker-compose.yml +55 -0
  306. package/examples/agents/01-customer-support-bot/openapi.yaml +238 -0
  307. package/examples/agents/01-customer-support-bot/package.json +48 -0
  308. package/examples/agents/02-code-review-agent/README.md +72 -0
  309. package/examples/agents/02-code-review-agent/agent.ossa.yaml +239 -0
  310. package/examples/agents/02-code-review-agent/docker-compose.yml +22 -0
  311. package/examples/agents/02-code-review-agent/openapi.yaml +150 -0
  312. package/examples/agents/03-data-analysis-agent/README.md +51 -0
  313. package/examples/agents/03-data-analysis-agent/agent.ossa.yaml +97 -0
  314. package/examples/agents/03-data-analysis-agent/openapi.yaml +74 -0
  315. package/examples/agents/04-content-moderator/README.md +55 -0
  316. package/examples/agents/04-content-moderator/agent.ossa.yaml +131 -0
  317. package/examples/agents/04-content-moderator/openapi.yaml +50 -0
  318. package/examples/agents/05-sales-assistant/README.md +37 -0
  319. package/examples/agents/05-sales-assistant/agent.ossa.yaml +146 -0
  320. package/examples/agents/05-sales-assistant/openapi.yaml +59 -0
  321. package/examples/agents/06-devops-agent/README.md +39 -0
  322. package/examples/agents/06-devops-agent/agent.ossa.yaml +141 -0
  323. package/examples/agents/06-devops-agent/openapi.yaml +51 -0
  324. package/examples/agents/07-research-assistant/README.md +31 -0
  325. package/examples/agents/07-research-assistant/agent.ossa.yaml +119 -0
  326. package/examples/agents/07-research-assistant/openapi.yaml +56 -0
  327. package/examples/agents/08-email-triage-agent/README.md +33 -0
  328. package/examples/agents/08-email-triage-agent/agent.ossa.yaml +133 -0
  329. package/examples/agents/08-email-triage-agent/openapi.yaml +41 -0
  330. package/examples/agents/09-security-scanner/README.md +49 -0
  331. package/examples/agents/09-security-scanner/agent.ossa.yaml +174 -0
  332. package/examples/agents/09-security-scanner/openapi.yaml +46 -0
  333. package/examples/agents/10-meeting-assistant/README.md +53 -0
  334. package/examples/agents/10-meeting-assistant/agent.ossa.yaml +211 -0
  335. package/examples/agents/10-meeting-assistant/docker-compose.yml +27 -0
  336. package/examples/agents/10-meeting-assistant/openapi.yaml +131 -0
  337. package/examples/agents/COMPLETION_REPORT.txt +272 -0
  338. package/examples/agents/INDEX.md +296 -0
  339. package/examples/agents/README.md +452 -0
  340. package/examples/agents/SUMMARY.md +362 -0
  341. package/examples/agents/TEST_RESULTS.md +458 -0
  342. package/examples/agents/architecture-healer-enterprise.yaml +1 -1
  343. package/examples/agents/dependency-healer-npm.yaml +1 -1
  344. package/examples/agents/spec-healer-openapi.yaml +1 -1
  345. package/examples/agents/wiki-healer-production.yaml +1 -1
  346. package/examples/agents-md/code-agent.ossa.json +1 -1
  347. package/examples/agents-md/monorepo-agent.ossa.yaml +1 -1
  348. package/examples/anthropic/claude-assistant.ossa.json +1 -1
  349. package/examples/autogen/multi-agent.ossa.json +1 -1
  350. package/examples/autonomous-evolution/self-evolving-agent.ossa.yaml +1 -1
  351. package/examples/build-once-use-everywhere/agent.ossa.yaml +1 -1
  352. package/examples/claude-code/code-reviewer.ossa.yaml +1 -1
  353. package/examples/claude-code/ossa-validator.ossa.yaml +1 -1
  354. package/examples/common_npm/agent-router.ossa.yaml +2 -2
  355. package/examples/contracts/data-consumer.ossa.yaml +1 -1
  356. package/examples/contracts/data-producer-v2.ossa.yaml +1 -1
  357. package/examples/contracts/data-producer.ossa.yaml +1 -1
  358. package/examples/crewai/research-team.ossa.json +1 -1
  359. package/examples/cursor/code-review-agent.ossa.json +1 -1
  360. package/examples/drupal/QUICKSTART.md +439 -0
  361. package/examples/drupal/ai_agents_ossa-module/.agents/example-agent/agent.ossa.yaml +1 -1
  362. package/examples/drupal/content-moderator.ossa.yaml +107 -0
  363. package/examples/drupal/gitlab-ml-recommender.ossa.yaml +2 -2
  364. package/examples/economics/marketplace-agent.ossa.json +1 -1
  365. package/examples/export/langchain/production-agent-with-memory/README.md +373 -0
  366. package/examples/export/langchain/production-agent-with-memory/agent.ossa.yaml +97 -0
  367. package/examples/export/langchain/production-agent-with-streaming/README.md +617 -0
  368. package/examples/export/langchain/production-agent-with-streaming/agent.ossa.yaml +100 -0
  369. package/examples/export/langchain/production-agent-with-streaming/client-example.py +263 -0
  370. package/examples/export/langchain/production-agent-with-tools/README.md +296 -0
  371. package/examples/export/langchain/production-agent-with-tools/agent.ossa.yaml +216 -0
  372. package/examples/export/langchain-export-example.ts +246 -0
  373. package/examples/export/langserve-export-example.ts +246 -0
  374. package/examples/export/test-generation-example.ts +457 -0
  375. package/examples/extensions/agents-md-advanced.yml +1 -1
  376. package/examples/extensions/agents-md-basic.yml +1 -1
  377. package/examples/extensions/agents-md-sync.yml +1 -1
  378. package/examples/extensions/agents-md-v1.yml +1 -1
  379. package/examples/extensions/drupal-v1.yml +1 -1
  380. package/examples/extensions/encryption-multi-provider.yaml +4 -4
  381. package/examples/extensions/kagent-v1.yml +1 -1
  382. package/examples/extensions/knowledge-sources.yaml +1 -1
  383. package/examples/extensions/mcp-full-featured.yaml +1 -1
  384. package/examples/genetics/breeding-agent.ossa.json +1 -1
  385. package/examples/getting-started/01-minimal-agent.ossa.yaml +1 -1
  386. package/examples/getting-started/02-agent-with-tools.ossa.yaml +1 -1
  387. package/examples/getting-started/03-agent-with-safety.ossa.yaml +1 -1
  388. package/examples/getting-started/04-agent-with-messaging.ossa.yaml +1 -1
  389. package/examples/getting-started/05-workflow-composition.ossa.yaml +1 -1
  390. package/examples/getting-started/hello-world-complete.ossa.yaml +1 -1
  391. package/examples/integration-patterns/agent-to-agent-orchestration.ossa.yaml +1 -1
  392. package/examples/kagent/compliance-validator.ossa.yaml +1 -1
  393. package/examples/kagent/cost-optimizer.ossa.yaml +1 -1
  394. package/examples/kagent/documentation-agent.ossa.yaml +1 -1
  395. package/examples/kagent/k8s-troubleshooter-v1.ossa.yaml +2 -2
  396. package/examples/kagent/k8s-troubleshooter.ossa.yaml +1 -1
  397. package/examples/kagent/security-scanner.ossa.yaml +1 -1
  398. package/examples/langchain/chain-agent.ossa.json +1 -1
  399. package/examples/langflow/workflow-agent.ossa.json +1 -1
  400. package/examples/langgraph/state-machine-agent.ossa.json +1 -1
  401. package/examples/lifecycle/mentoring-agent.ossa.json +1 -1
  402. package/examples/llamaindex/rag-agent.ossa.json +1 -1
  403. package/examples/mcp/database-mcp.ossa.yaml +1 -1
  404. package/examples/mcp/filesystem-mcp.ossa.yaml +1 -1
  405. package/examples/messaging/dependency-healer.ossa.yaml +1 -1
  406. package/examples/messaging/incident-responder.ossa.yaml +1 -1
  407. package/examples/messaging/routing-rules.ossa.yaml +1 -1
  408. package/examples/messaging/security-scanner.ossa.yaml +1 -1
  409. package/examples/migration-guides/from-langchain-to-ossa.yaml +4 -4
  410. package/examples/migrations/langchain/01-python-react-agent-after.ossa.yaml +1 -1
  411. package/examples/migrations/langchain/02-typescript-conversational-after.ossa.yaml +1 -1
  412. package/examples/migrations/langchain/03-sequential-chain-after.ossa.yaml +1 -1
  413. package/examples/migrations/langchain/04-config-based-after.ossa.yaml +1 -1
  414. package/examples/migrations/swarm-to-ossa/after-handoffs.ossa.yaml +6 -6
  415. package/examples/migrations/swarm-to-ossa/after-triage-agent.ossa.yaml +3 -3
  416. package/examples/multi-agent/conditional-router.ossa.yaml +1 -1
  417. package/examples/multi-agent/parallel-execution.ossa.yaml +1 -1
  418. package/examples/multi-agent/sequential-pipeline.ossa.yaml +1 -1
  419. package/examples/multi-agent-research-workflow.ossa.yaml +133 -0
  420. package/examples/multi-platform/single-manifest/agent.ossa.yaml +1 -1
  421. package/examples/npm-export-example.ts +150 -0
  422. package/examples/observability/activity-stream-full.yaml +1 -1
  423. package/examples/openai/basic-agent.ossa.yaml +1 -1
  424. package/examples/openai/multi-tool-agent.ossa.json +1 -1
  425. package/examples/openai/swarm-agent.ossa.json +1 -1
  426. package/examples/ossa-templates/01-code-assistant.ossa.yaml +1 -1
  427. package/examples/ossa-templates/02-security-scanner.ossa.yaml +1 -1
  428. package/examples/ossa-templates/03-ci-pipeline.ossa.yaml +1 -1
  429. package/examples/ossa-templates/04-code-reviewer.ossa.yaml +1 -1
  430. package/examples/ossa-templates/05-doc-generator.ossa.yaml +1 -1
  431. package/examples/ossa-templates/06-compliance-validator.ossa.yaml +1 -1
  432. package/examples/ossa-templates/07-workflow-orchestrator.ossa.yaml +1 -1
  433. package/examples/ossa-templates/08-content-writer.ossa.yaml +1 -1
  434. package/examples/ossa-templates/09-test-generator.ossa.yaml +1 -1
  435. package/examples/ossa-templates/10-data-transformer.ossa.yaml +1 -1
  436. package/examples/ossa-templates/11-react-performance-expert.ossa.yaml +1 -1
  437. package/examples/ossa-templates/12-typescript-type-safety-expert.ossa.yaml +1 -1
  438. package/examples/ossa-templates/13-accessibility-champion.ossa.yaml +1 -1
  439. package/examples/ossa-templates/14-security-hardening-agent.ossa.yaml +1 -1
  440. package/examples/production/document-analyzer-openai.yml +1 -1
  441. package/examples/production-ready/01-customer-support-bot/.env.example +32 -0
  442. package/examples/production-ready/01-customer-support-bot/Dockerfile +30 -0
  443. package/examples/production-ready/01-customer-support-bot/README.md +295 -0
  444. package/examples/production-ready/01-customer-support-bot/agent.ossa.yaml +172 -0
  445. package/examples/production-ready/01-customer-support-bot/docker-compose.yml +55 -0
  446. package/examples/production-ready/01-customer-support-bot/openapi.yaml +238 -0
  447. package/examples/production-ready/01-customer-support-bot/package.json +48 -0
  448. package/examples/production-ready/02-code-review-agent/README.md +72 -0
  449. package/examples/production-ready/02-code-review-agent/agent.ossa.yaml +239 -0
  450. package/examples/production-ready/02-code-review-agent/docker-compose.yml +22 -0
  451. package/examples/production-ready/02-code-review-agent/openapi.yaml +150 -0
  452. package/examples/production-ready/03-data-analysis-agent/README.md +51 -0
  453. package/examples/production-ready/03-data-analysis-agent/agent.ossa.yaml +97 -0
  454. package/examples/production-ready/03-data-analysis-agent/openapi.yaml +74 -0
  455. package/examples/production-ready/04-content-moderator/README.md +55 -0
  456. package/examples/production-ready/04-content-moderator/agent.ossa.yaml +131 -0
  457. package/examples/production-ready/04-content-moderator/openapi.yaml +50 -0
  458. package/examples/production-ready/05-sales-assistant/README.md +37 -0
  459. package/examples/production-ready/05-sales-assistant/agent.ossa.yaml +146 -0
  460. package/examples/production-ready/05-sales-assistant/openapi.yaml +59 -0
  461. package/examples/production-ready/06-devops-agent/README.md +39 -0
  462. package/examples/production-ready/06-devops-agent/agent.ossa.yaml +141 -0
  463. package/examples/production-ready/06-devops-agent/openapi.yaml +51 -0
  464. package/examples/production-ready/07-research-assistant/README.md +31 -0
  465. package/examples/production-ready/07-research-assistant/agent.ossa.yaml +119 -0
  466. package/examples/production-ready/07-research-assistant/openapi.yaml +56 -0
  467. package/examples/production-ready/08-email-triage-agent/README.md +33 -0
  468. package/examples/production-ready/08-email-triage-agent/agent.ossa.yaml +133 -0
  469. package/examples/production-ready/08-email-triage-agent/openapi.yaml +41 -0
  470. package/examples/production-ready/09-security-scanner/README.md +49 -0
  471. package/examples/production-ready/09-security-scanner/agent.ossa.yaml +174 -0
  472. package/examples/production-ready/09-security-scanner/openapi.yaml +46 -0
  473. package/examples/production-ready/10-meeting-assistant/README.md +53 -0
  474. package/examples/production-ready/10-meeting-assistant/agent.ossa.yaml +211 -0
  475. package/examples/production-ready/10-meeting-assistant/docker-compose.yml +27 -0
  476. package/examples/production-ready/10-meeting-assistant/openapi.yaml +131 -0
  477. package/examples/production-ready/COMPLETION_REPORT.txt +272 -0
  478. package/examples/production-ready/INDEX.md +296 -0
  479. package/examples/production-ready/README.md +452 -0
  480. package/examples/production-ready/SUMMARY.md +362 -0
  481. package/examples/production-ready/TEST_RESULTS.md +458 -0
  482. package/examples/quickstart/support-agent.ossa.yaml +1 -1
  483. package/examples/real-world/gitlab-cicd-optimizer.ossa.yaml +1 -1
  484. package/examples/real-world/rag-documentation-assistant.ossa.yaml +1 -1
  485. package/examples/registry/agents/code-reviewer/agent.yaml +1 -1
  486. package/examples/registry/agents/security-scanner/agent.yaml +1 -1
  487. package/examples/runtime-adapters/bedrock-claude-example.ossa.yaml +1 -1
  488. package/examples/schema/reusable-components.yaml +1 -1
  489. package/examples/showcase/ci-pipeline.ossa.yaml +1 -1
  490. package/examples/showcase/code-assistant.ossa.yaml +1 -1
  491. package/examples/showcase/code-reviewer.ossa.yaml +1 -1
  492. package/examples/showcase/compliance-validator.ossa.yaml +1 -1
  493. package/examples/showcase/content-writer.ossa.yaml +1 -1
  494. package/examples/showcase/data-transformer.ossa.yaml +1 -1
  495. package/examples/showcase/doc-generator.ossa.yaml +1 -1
  496. package/examples/showcase/security-scanner.ossa.yaml +1 -1
  497. package/examples/showcase/test-generator.ossa.yaml +1 -1
  498. package/examples/showcase/workflow-orchestrator.ossa.yaml +1 -1
  499. package/examples/skills-example.ossa.yaml +140 -0
  500. package/examples/swarm/pso-optimizer.ossa.json +1 -1
  501. package/examples/tasks/batch-email-sender.yaml +1 -1
  502. package/examples/tasks/data-transform.yaml +1 -1
  503. package/examples/tasks/publish-content.yaml +1 -1
  504. package/examples/templates/ossa-compliance.yaml +1 -1
  505. package/examples/unified/security-scanner.ossa.yaml +1 -1
  506. package/examples/v0.3.6-features/genetics-breeding-advanced.ossa.yaml +1 -1
  507. package/examples/v0.3.6-features/genetics-breeding-simple.ossa.yaml +1 -1
  508. package/examples/v0.3.6-features/genetics-fitness-scoring.ossa.yaml +1 -1
  509. package/examples/vercel/edge-agent.ossa.json +1 -1
  510. package/examples/workflows/batch-email-campaign.yaml +1 -1
  511. package/examples/workflows/content-review-publish.yaml +1 -1
  512. package/examples/workflows/simple-etl.yaml +1 -1
  513. package/openapi/cli/openapi.yaml +221 -5
  514. package/package.json +31 -9
  515. package/dist/cli/commands/export-v2.command.d.ts +0 -7
  516. package/dist/cli/commands/export-v2.command.d.ts.map +0 -1
  517. package/dist/cli/commands/export-v2.command.js.map +0 -1
@@ -0,0 +1,749 @@
1
+ /**
2
+ * LangChain Streaming Generator (Production Quality - v0.4.1)
3
+ *
4
+ * Generates production-ready streaming support for LangChain agents
5
+ *
6
+ * Features:
7
+ * - Server-Sent Events (SSE) for real-time responses
8
+ * - WebSocket bidirectional streaming
9
+ * - LangChain callbacks for actual streaming
10
+ * - a2a (agent-to-agent) streaming integration
11
+ * - Token-by-token streaming
12
+ * - Error handling and reconnection logic
13
+ *
14
+ * SOLID: Single Responsibility - Streaming code generation
15
+ * DRY: Reusable streaming templates
16
+ */
17
+ export class StreamingGenerator {
18
+ /**
19
+ * Generate streaming.py module with SSE, WebSocket, and a2a support
20
+ */
21
+ generate(manifest, config = {}) {
22
+ const sseEnabled = config.sse?.enabled !== false;
23
+ const websocketEnabled = config.websocket?.enabled !== false;
24
+ const a2aEnabled = config.a2a?.enabled === true;
25
+ const imports = this.generateImports(sseEnabled, websocketEnabled, a2aEnabled);
26
+ const callbacks = this.generateCallbacks(config);
27
+ const sseCode = sseEnabled ? this.generateSSE() : '';
28
+ const websocketCode = websocketEnabled ? this.generateWebSocket() : '';
29
+ const a2aCode = a2aEnabled ? this.generateA2A(config.a2a?.mesh_url) : '';
30
+ return `"""
31
+ LangChain Streaming Support (Production Quality)
32
+
33
+ Features:
34
+ - Server-Sent Events (SSE) for real-time responses
35
+ - WebSocket bidirectional streaming
36
+ - LangChain callbacks for token-by-token streaming
37
+ - Agent-to-agent (a2a) streaming integration
38
+ - Comprehensive error handling
39
+ - Reconnection logic
40
+
41
+ """
42
+
43
+ ${imports}
44
+
45
+ ${callbacks}
46
+
47
+ ${sseCode}
48
+
49
+ ${websocketCode}
50
+
51
+ ${a2aCode}
52
+
53
+ def get_streaming_config() -> Dict[str, Any]:
54
+ """
55
+ Get streaming configuration
56
+
57
+ Returns:
58
+ Dictionary with streaming settings
59
+ """
60
+ return {
61
+ "sse_enabled": ${sseEnabled ? 'True' : 'False'},
62
+ "websocket_enabled": ${websocketEnabled ? 'True' : 'False'},
63
+ "a2a_enabled": ${a2aEnabled ? 'True' : 'False'},
64
+ }
65
+ `;
66
+ }
67
+ /**
68
+ * Generate imports based on enabled features
69
+ */
70
+ generateImports(sse, websocket, a2a) {
71
+ const baseImports = `from typing import Any, Dict, AsyncIterator, Optional
72
+ from langchain.callbacks.base import BaseCallbackHandler
73
+ from langchain.schema import LLMResult
74
+ import asyncio
75
+ import json
76
+ import logging
77
+
78
+ logger = logging.getLogger(__name__)`;
79
+ const sseImports = sse ? `
80
+ from fastapi.responses import StreamingResponse
81
+ from starlette.responses import EventSourceResponse` : '';
82
+ const websocketImports = websocket ? `
83
+ from fastapi import WebSocket, WebSocketDisconnect
84
+ from websockets.exceptions import ConnectionClosed` : '';
85
+ const a2aImports = a2a ? `
86
+ import httpx
87
+ from datetime import datetime` : '';
88
+ return `${baseImports}${sseImports}${websocketImports}${a2aImports}`;
89
+ }
90
+ /**
91
+ * Generate LangChain streaming callbacks with cost tracking integration
92
+ */
93
+ generateCallbacks(config) {
94
+ return `
95
+ # Import cost tracking from callbacks module
96
+ try:
97
+ from callbacks import CostTrackingHandler
98
+ COST_TRACKING_AVAILABLE = True
99
+ except ImportError:
100
+ COST_TRACKING_AVAILABLE = False
101
+ logger.warning("callbacks module not available, cost tracking disabled in streaming")
102
+
103
+
104
+ class StreamingCallbackHandler(BaseCallbackHandler):
105
+ """
106
+ Custom callback handler for LangChain streaming with cost tracking
107
+
108
+ Captures tokens as they're generated and sends them through
109
+ the configured streaming channel (SSE, WebSocket, or a2a)
110
+ with real-time cost tracking per token
111
+ """
112
+
113
+ def __init__(self, queue: asyncio.Queue, cost_tracker: Optional[Any] = None):
114
+ """
115
+ Initialize callback handler
116
+
117
+ Args:
118
+ queue: Async queue for streaming tokens
119
+ cost_tracker: Optional CostTrackingHandler for real-time cost tracking
120
+ """
121
+ self.queue = queue
122
+ self.tokens = []
123
+ self.cost_tracker = cost_tracker
124
+ self.token_count = 0
125
+
126
+ def on_llm_start(
127
+ self, serialized: Dict[str, Any], prompts: list[str], **kwargs: Any
128
+ ) -> None:
129
+ """Called when LLM starts generating"""
130
+ logger.info("LLM generation started")
131
+
132
+ # Capture model name for cost tracking
133
+ if self.cost_tracker:
134
+ self.cost_tracker.model_name = serialized.get("name", "unknown")
135
+
136
+ asyncio.create_task(self.queue.put({
137
+ "type": "llm_start",
138
+ "prompts": prompts,
139
+ "model": serialized.get("name", "unknown"),
140
+ }))
141
+
142
+ def on_llm_new_token(self, token: str, **kwargs: Any) -> None:
143
+ """Called when LLM generates a new token"""
144
+ logger.debug(f"New token: {token}")
145
+ self.tokens.append(token)
146
+ self.token_count += 1
147
+
148
+ # Get current cost if tracker available
149
+ current_cost = 0.0
150
+ if self.cost_tracker:
151
+ current_cost = self.cost_tracker.total_cost
152
+
153
+ asyncio.create_task(self.queue.put({
154
+ "type": "token",
155
+ "token": token,
156
+ "token_count": self.token_count,
157
+ "cost": current_cost,
158
+ }))
159
+
160
+ def on_llm_end(self, response: LLMResult, **kwargs: Any) -> None:
161
+ """Called when LLM finishes generating"""
162
+ logger.info("LLM generation completed")
163
+
164
+ # Track final token usage if cost tracker available
165
+ cost_summary = {}
166
+ if self.cost_tracker and response.llm_output:
167
+ token_usage = response.llm_output.get("token_usage", {})
168
+ prompt_tokens = token_usage.get("prompt_tokens", 0)
169
+ completion_tokens = token_usage.get("completion_tokens", 0)
170
+
171
+ # Update cost tracker
172
+ self.cost_tracker.prompt_tokens += prompt_tokens
173
+ self.cost_tracker.completion_tokens += completion_tokens
174
+ self.cost_tracker.total_tokens += (prompt_tokens + completion_tokens)
175
+
176
+ # Calculate final cost
177
+ model_key = self.cost_tracker._normalize_model_name(
178
+ self.cost_tracker.model_name or ""
179
+ )
180
+ pricing = self.cost_tracker.PRICING.get(model_key, {"input": 0, "output": 0})
181
+ input_cost = (prompt_tokens / 1_000_000) * pricing["input"]
182
+ output_cost = (completion_tokens / 1_000_000) * pricing["output"]
183
+ self.cost_tracker.total_cost += input_cost + output_cost
184
+
185
+ cost_summary = self.cost_tracker.get_summary()
186
+
187
+ asyncio.create_task(self.queue.put({
188
+ "type": "llm_end",
189
+ "full_response": "".join(self.tokens),
190
+ "tokens": len(self.tokens),
191
+ "cost_summary": cost_summary,
192
+ }))
193
+
194
+ def on_llm_error(self, error: Exception, **kwargs: Any) -> None:
195
+ """Called when LLM encounters an error"""
196
+ logger.error(f"LLM error: {str(error)}", exc_info=True)
197
+ asyncio.create_task(self.queue.put({
198
+ "type": "error",
199
+ "error": str(error),
200
+ "error_type": type(error).__name__,
201
+ }))
202
+
203
+ def on_tool_start(
204
+ self, serialized: Dict[str, Any], input_str: str, **kwargs: Any
205
+ ) -> None:
206
+ """Called when tool execution starts"""
207
+ tool_name = serialized.get("name", "unknown")
208
+ logger.info(f"Tool '{tool_name}' started")
209
+ asyncio.create_task(self.queue.put({
210
+ "type": "tool_start",
211
+ "tool": tool_name,
212
+ "input": input_str,
213
+ }))
214
+
215
+ def on_tool_end(self, output: str, **kwargs: Any) -> None:
216
+ """Called when tool execution ends"""
217
+ logger.info("Tool execution completed")
218
+ asyncio.create_task(self.queue.put({
219
+ "type": "tool_end",
220
+ "output": output,
221
+ }))
222
+
223
+ def on_tool_error(self, error: Exception, **kwargs: Any) -> None:
224
+ """Called when tool encounters an error"""
225
+ logger.error(f"Tool error: {str(error)}", exc_info=True)
226
+ asyncio.create_task(self.queue.put({
227
+ "type": "tool_error",
228
+ "error": str(error),
229
+ "error_type": type(error).__name__,
230
+ }))
231
+ `;
232
+ }
233
+ /**
234
+ * Generate SSE (Server-Sent Events) implementation with cost tracking
235
+ */
236
+ generateSSE() {
237
+ return `
238
+
239
+ # Server-Sent Events (SSE) Implementation
240
+
241
+ async def stream_sse(
242
+ message: str,
243
+ agent: Any,
244
+ session_id: str = "default",
245
+ cost_tracker: Optional[Any] = None
246
+ ) -> AsyncIterator[str]:
247
+ """
248
+ Stream agent responses via Server-Sent Events with cost tracking
249
+
250
+ Args:
251
+ message: User message
252
+ agent: LangChain agent instance
253
+ session_id: Session identifier
254
+ cost_tracker: Optional CostTrackingHandler for real-time cost tracking
255
+
256
+ Yields:
257
+ SSE formatted strings with agent response tokens and cost information
258
+ """
259
+ queue: asyncio.Queue = asyncio.Queue()
260
+ callback_handler = StreamingCallbackHandler(queue, cost_tracker=cost_tracker)
261
+
262
+ try:
263
+ logger.info(f"Starting SSE stream for session: {session_id}")
264
+
265
+ # Send initial connection event
266
+ yield f"data: {json.dumps({'type': 'connected', 'session_id': session_id})}\\n\\n"
267
+
268
+ # Run agent with streaming callback in background
269
+ async def run_agent():
270
+ try:
271
+ result = await agent.arun(
272
+ message,
273
+ callbacks=[callback_handler]
274
+ )
275
+
276
+ # Get final cost summary
277
+ final_cost = {}
278
+ if cost_tracker:
279
+ final_cost = cost_tracker.get_summary()
280
+
281
+ await queue.put({
282
+ "type": "done",
283
+ "result": result,
284
+ "cost_summary": final_cost
285
+ })
286
+ except Exception as e:
287
+ logger.error(f"Agent error: {str(e)}", exc_info=True)
288
+ await queue.put({"type": "error", "error": str(e)})
289
+
290
+ # Start agent execution
291
+ agent_task = asyncio.create_task(run_agent())
292
+
293
+ # Stream events as they come
294
+ while True:
295
+ try:
296
+ # Wait for event with timeout for heartbeat
297
+ event = await asyncio.wait_for(queue.get(), timeout=30.0)
298
+
299
+ # Format as SSE
300
+ yield f"data: {json.dumps(event)}\\n\\n"
301
+
302
+ # End stream on completion or error
303
+ if event["type"] in ["done", "error"]:
304
+ break
305
+
306
+ except asyncio.TimeoutError:
307
+ # Send heartbeat to keep connection alive
308
+ yield f": heartbeat\\n\\n"
309
+ continue
310
+
311
+ # Wait for agent task to complete
312
+ await agent_task
313
+
314
+ logger.info(f"SSE stream completed for session: {session_id}")
315
+
316
+ except asyncio.CancelledError:
317
+ logger.info(f"SSE stream cancelled for session: {session_id}")
318
+ yield f"data: {json.dumps({'type': 'cancelled'})}\\n\\n"
319
+ raise
320
+ except Exception as e:
321
+ logger.error(f"SSE streaming error: {str(e)}", exc_info=True)
322
+ yield f"data: {json.dumps({'type': 'error', 'error': str(e)})}\\n\\n"
323
+
324
+
325
+ def create_sse_endpoint(agent: Any):
326
+ """
327
+ Create FastAPI endpoint for SSE streaming with cost tracking
328
+
329
+ Args:
330
+ agent: LangChain agent instance
331
+
332
+ Returns:
333
+ FastAPI endpoint function
334
+ """
335
+ async def sse_chat(message: str, session_id: str = "default"):
336
+ """SSE chat endpoint with real-time cost tracking"""
337
+ # Create cost tracker for this session
338
+ cost_tracker = None
339
+ if COST_TRACKING_AVAILABLE:
340
+ from callbacks import CostTrackingHandler
341
+ cost_tracker = CostTrackingHandler()
342
+
343
+ return StreamingResponse(
344
+ stream_sse(message, agent, session_id, cost_tracker),
345
+ media_type="text/event-stream",
346
+ headers={
347
+ "Cache-Control": "no-cache",
348
+ "Connection": "keep-alive",
349
+ "X-Accel-Buffering": "no", # Disable nginx buffering
350
+ "Access-Control-Allow-Origin": "*",
351
+ }
352
+ )
353
+
354
+ return sse_chat
355
+ `;
356
+ }
357
+ /**
358
+ * Generate WebSocket implementation with cost tracking and backpressure handling
359
+ */
360
+ generateWebSocket() {
361
+ return `
362
+
363
+ # WebSocket Implementation
364
+
365
+ class ConnectionManager:
366
+ """
367
+ Manages WebSocket connections for multiple sessions with backpressure handling
368
+ """
369
+
370
+ def __init__(self):
371
+ """Initialize connection manager"""
372
+ self.active_connections: Dict[str, WebSocket] = {}
373
+ self.session_queues: Dict[str, asyncio.Queue] = {}
374
+ self.session_tasks: Dict[str, asyncio.Task] = {}
375
+ self.cost_trackers: Dict[str, Any] = {}
376
+ self.max_queue_size = 1000 # Prevent memory issues
377
+
378
+ async def connect(self, websocket: WebSocket, session_id: str):
379
+ """
380
+ Connect a new WebSocket client
381
+
382
+ Args:
383
+ websocket: WebSocket connection
384
+ session_id: Session identifier
385
+ """
386
+ await websocket.accept()
387
+ self.active_connections[session_id] = websocket
388
+ self.session_queues[session_id] = asyncio.Queue(maxsize=self.max_queue_size)
389
+
390
+ # Create cost tracker for session
391
+ if COST_TRACKING_AVAILABLE:
392
+ from callbacks import CostTrackingHandler
393
+ self.cost_trackers[session_id] = CostTrackingHandler()
394
+
395
+ logger.info(f"WebSocket connected: {session_id}")
396
+
397
+ # Send welcome message
398
+ await websocket.send_json({
399
+ "type": "connected",
400
+ "session_id": session_id,
401
+ "message": "WebSocket connection established"
402
+ })
403
+
404
+ def disconnect(self, session_id: str):
405
+ """
406
+ Disconnect a WebSocket client
407
+
408
+ Args:
409
+ session_id: Session identifier
410
+ """
411
+ # Cancel running tasks
412
+ if session_id in self.session_tasks:
413
+ self.session_tasks[session_id].cancel()
414
+ del self.session_tasks[session_id]
415
+
416
+ if session_id in self.active_connections:
417
+ del self.active_connections[session_id]
418
+ if session_id in self.session_queues:
419
+ del self.session_queues[session_id]
420
+ if session_id in self.cost_trackers:
421
+ del self.cost_trackers[session_id]
422
+
423
+ logger.info(f"WebSocket disconnected: {session_id}")
424
+
425
+ async def send_message(self, session_id: str, message: Dict[str, Any]):
426
+ """
427
+ Send message to specific session with backpressure handling
428
+
429
+ Args:
430
+ session_id: Session identifier
431
+ message: Message dictionary
432
+ """
433
+ if session_id in self.active_connections:
434
+ try:
435
+ # Add timeout to prevent blocking
436
+ await asyncio.wait_for(
437
+ self.active_connections[session_id].send_json(message),
438
+ timeout=5.0
439
+ )
440
+ except asyncio.TimeoutError:
441
+ logger.warning(f"WebSocket send timeout for session: {session_id}")
442
+ self.disconnect(session_id)
443
+ except Exception as e:
444
+ logger.error(f"Error sending WebSocket message: {str(e)}")
445
+ self.disconnect(session_id)
446
+
447
+ async def broadcast(self, message: Dict[str, Any]):
448
+ """
449
+ Broadcast message to all connected clients
450
+
451
+ Args:
452
+ message: Message dictionary
453
+ """
454
+ disconnected = []
455
+ for session_id in list(self.active_connections.keys()):
456
+ try:
457
+ await self.send_message(session_id, message)
458
+ except Exception:
459
+ disconnected.append(session_id)
460
+
461
+ # Clean up disconnected sessions
462
+ for session_id in disconnected:
463
+ self.disconnect(session_id)
464
+
465
+ def get_cost_tracker(self, session_id: str) -> Optional[Any]:
466
+ """Get cost tracker for session"""
467
+ return self.cost_trackers.get(session_id)
468
+
469
+
470
+ # Global connection manager
471
+ manager = ConnectionManager()
472
+
473
+
474
+ async def stream_websocket(
475
+ websocket: WebSocket,
476
+ agent: Any,
477
+ session_id: str = "default"
478
+ ):
479
+ """
480
+ Stream agent responses via WebSocket with cost tracking and cancellation support
481
+
482
+ Args:
483
+ websocket: WebSocket connection
484
+ agent: LangChain agent instance
485
+ session_id: Session identifier
486
+ """
487
+ await manager.connect(websocket, session_id)
488
+ current_task = None
489
+
490
+ try:
491
+ while True:
492
+ # Receive message from client
493
+ data = await websocket.receive_json()
494
+ message_type = data.get("type", "message")
495
+
496
+ # Handle cancellation request
497
+ if message_type == "cancel":
498
+ if current_task and not current_task.done():
499
+ current_task.cancel()
500
+ await websocket.send_json({
501
+ "type": "cancelled",
502
+ "message": "Stream cancelled by user"
503
+ })
504
+ continue
505
+
506
+ message = data.get("message", "")
507
+
508
+ if not message:
509
+ await websocket.send_json({
510
+ "type": "error",
511
+ "error": "Empty message"
512
+ })
513
+ continue
514
+
515
+ logger.info(f"WebSocket message received: {session_id}")
516
+
517
+ # Cancel previous task if still running
518
+ if current_task and not current_task.done():
519
+ current_task.cancel()
520
+
521
+ # Get queue and cost tracker
522
+ queue = manager.session_queues[session_id]
523
+ cost_tracker = manager.get_cost_tracker(session_id)
524
+ callback_handler = StreamingCallbackHandler(queue, cost_tracker=cost_tracker)
525
+
526
+ # Run agent with streaming callback
527
+ async def run_agent():
528
+ try:
529
+ result = await agent.arun(
530
+ message,
531
+ callbacks=[callback_handler]
532
+ )
533
+
534
+ # Get final cost summary
535
+ final_cost = {}
536
+ if cost_tracker:
537
+ final_cost = cost_tracker.get_summary()
538
+
539
+ await queue.put({
540
+ "type": "done",
541
+ "result": result,
542
+ "cost_summary": final_cost
543
+ })
544
+ except asyncio.CancelledError:
545
+ await queue.put({"type": "cancelled"})
546
+ raise
547
+ except Exception as e:
548
+ logger.error(f"Agent error: {str(e)}", exc_info=True)
549
+ await queue.put({"type": "error", "error": str(e)})
550
+
551
+ # Start agent execution
552
+ agent_task = asyncio.create_task(run_agent())
553
+ manager.session_tasks[session_id] = agent_task
554
+
555
+ # Stream events as they come
556
+ async def stream_events():
557
+ try:
558
+ while True:
559
+ event = await queue.get()
560
+ await manager.send_message(session_id, event)
561
+
562
+ if event["type"] in ["done", "error", "cancelled"]:
563
+ break
564
+ except asyncio.CancelledError:
565
+ logger.info(f"Event streaming cancelled for: {session_id}")
566
+ raise
567
+
568
+ # Wait for both tasks
569
+ current_task = asyncio.create_task(stream_events())
570
+ await asyncio.gather(agent_task, current_task, return_exceptions=True)
571
+
572
+ except WebSocketDisconnect:
573
+ logger.info(f"WebSocket client disconnected: {session_id}")
574
+ manager.disconnect(session_id)
575
+ except Exception as e:
576
+ logger.error(f"WebSocket error: {str(e)}", exc_info=True)
577
+ manager.disconnect(session_id)
578
+
579
+
580
+ def create_websocket_endpoint(agent: Any):
581
+ """
582
+ Create FastAPI endpoint for WebSocket streaming with cancellation support
583
+
584
+ Args:
585
+ agent: LangChain agent instance
586
+
587
+ Returns:
588
+ FastAPI endpoint function
589
+ """
590
+ async def websocket_chat(websocket: WebSocket, session_id: str = "default"):
591
+ """WebSocket chat endpoint with real-time cost tracking and cancellation"""
592
+ await stream_websocket(websocket, agent, session_id)
593
+
594
+ return websocket_chat
595
+ `;
596
+ }
597
+ /**
598
+ * Generate a2a (agent-to-agent) streaming implementation
599
+ */
600
+ generateA2A(meshUrl) {
601
+ const url = meshUrl || 'http://localhost:8080';
602
+ return `
603
+
604
+ # Agent-to-Agent (a2a) Streaming Implementation
605
+
606
+ class A2AStreamingClient:
607
+ """
608
+ Client for streaming agent responses to Agent Mesh
609
+ """
610
+
611
+ def __init__(self, mesh_url: str = "${url}"):
612
+ """
613
+ Initialize a2a streaming client
614
+
615
+ Args:
616
+ mesh_url: Agent Mesh URL
617
+ """
618
+ self.mesh_url = mesh_url
619
+ self.client = httpx.AsyncClient(timeout=30.0)
620
+
621
+ async def stream_to_mesh(
622
+ self,
623
+ agent_id: str,
624
+ message: str,
625
+ queue: asyncio.Queue,
626
+ target_agent: Optional[str] = None
627
+ ):
628
+ """
629
+ Stream agent response to Agent Mesh
630
+
631
+ Args:
632
+ agent_id: Source agent identifier
633
+ message: Message content
634
+ queue: Queue with streaming events
635
+ target_agent: Optional target agent for routing
636
+ """
637
+ try:
638
+ endpoint = f"{self.mesh_url}/agents/{agent_id}/stream"
639
+
640
+ # Collect streaming events
641
+ events = []
642
+ full_response = ""
643
+
644
+ while True:
645
+ event = await queue.get()
646
+ events.append(event)
647
+
648
+ # Accumulate tokens
649
+ if event["type"] == "token":
650
+ full_response += event["token"]
651
+
652
+ # Send to mesh on completion
653
+ if event["type"] == "done":
654
+ payload = {
655
+ "agent_id": agent_id,
656
+ "message": message,
657
+ "response": full_response,
658
+ "target_agent": target_agent,
659
+ "timestamp": datetime.utcnow().isoformat(),
660
+ "streaming_events": events,
661
+ }
662
+
663
+ response = await self.client.post(endpoint, json=payload)
664
+ response.raise_for_status()
665
+
666
+ logger.info(f"Streamed response to Agent Mesh: {agent_id}")
667
+ break
668
+
669
+ # Stop on error
670
+ if event["type"] == "error":
671
+ logger.error(f"Streaming error: {event['error']}")
672
+ break
673
+
674
+ except Exception as e:
675
+ logger.error(f"a2a streaming error: {str(e)}", exc_info=True)
676
+
677
+ async def close(self):
678
+ """Close HTTP client"""
679
+ await self.client.aclose()
680
+
681
+
682
+ async def stream_a2a(
683
+ agent_id: str,
684
+ message: str,
685
+ agent: Any,
686
+ mesh_url: str = "${url}",
687
+ target_agent: Optional[str] = None
688
+ ) -> Dict[str, Any]:
689
+ """
690
+ Stream agent response with a2a integration
691
+
692
+ Args:
693
+ agent_id: Agent identifier
694
+ message: User message
695
+ agent: LangChain agent instance
696
+ mesh_url: Agent Mesh URL
697
+ target_agent: Optional target agent
698
+
699
+ Returns:
700
+ Agent response with streaming metadata
701
+ """
702
+ queue: asyncio.Queue = asyncio.Queue()
703
+ callback_handler = StreamingCallbackHandler(queue)
704
+ a2a_client = A2AStreamingClient(mesh_url)
705
+
706
+ try:
707
+ logger.info(f"Starting a2a stream for agent: {agent_id}")
708
+
709
+ # Run agent with streaming callback
710
+ async def run_agent():
711
+ try:
712
+ result = await agent.arun(
713
+ message,
714
+ callbacks=[callback_handler]
715
+ )
716
+ await queue.put({"type": "done", "result": result})
717
+ except Exception as e:
718
+ logger.error(f"Agent error: {str(e)}", exc_info=True)
719
+ await queue.put({"type": "error", "error": str(e)})
720
+
721
+ # Start agent execution and a2a streaming
722
+ agent_task = asyncio.create_task(run_agent())
723
+ mesh_task = asyncio.create_task(
724
+ a2a_client.stream_to_mesh(agent_id, message, queue, target_agent)
725
+ )
726
+
727
+ # Wait for both tasks
728
+ await asyncio.gather(agent_task, mesh_task)
729
+
730
+ logger.info(f"a2a stream completed for agent: {agent_id}")
731
+
732
+ return {
733
+ "success": True,
734
+ "agent_id": agent_id,
735
+ "streamed_to_mesh": True,
736
+ }
737
+
738
+ except Exception as e:
739
+ logger.error(f"a2a streaming error: {str(e)}", exc_info=True)
740
+ return {
741
+ "success": False,
742
+ "error": str(e),
743
+ }
744
+ finally:
745
+ await a2a_client.close()
746
+ `;
747
+ }
748
+ }
749
+ //# sourceMappingURL=streaming-generator.js.map