@stkxp/cli 0.1.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 (371) hide show
  1. package/README.md +273 -0
  2. package/bin/stkxp.mjs +198 -0
  3. package/package.json +97 -0
  4. package/src/bootstrap.mjs +37 -0
  5. package/src/bootstrap.test.mjs +73 -0
  6. package/src/deploy.mjs +145 -0
  7. package/src/deploy.test.mjs +131 -0
  8. package/src/export.mjs +30 -0
  9. package/src/export.test.mjs +56 -0
  10. package/src/secret-input.mjs +64 -0
  11. package/src/secret-input.test.mjs +58 -0
  12. package/src/serve.mjs +83 -0
  13. package/src/serve.test.mjs +93 -0
  14. package/vendor/dist-server/asyncapi/generator.js +1 -0
  15. package/vendor/dist-server/asyncapi/messages.js +1 -0
  16. package/vendor/dist-server/asyncapi/viewer.html +43 -0
  17. package/vendor/dist-server/core/app-config/branding.js +1 -0
  18. package/vendor/dist-server/core/app-config/mantine-theme.js +1 -0
  19. package/vendor/dist-server/core/app-config/mermaid-theme.js +2 -0
  20. package/vendor/dist-server/core/app-config/prompt-optimization.js +1 -0
  21. package/vendor/dist-server/core/app-config/settings.js +1 -0
  22. package/vendor/dist-server/core/config.js +1 -0
  23. package/vendor/dist-server/core/graph/a2a-agent-executor.js +2 -0
  24. package/vendor/dist-server/core/graph/app.js +120 -0
  25. package/vendor/dist-server/core/graph/delegated-agent-adapter.js +1 -0
  26. package/vendor/dist-server/core/graph/graph-builder.js +3 -0
  27. package/vendor/dist-server/core/graph/kibana-agent-executor.js +1 -0
  28. package/vendor/dist-server/core/graph/nodes/context/assistants-context.js +5 -0
  29. package/vendor/dist-server/core/graph/nodes/context/compare-context.js +10 -0
  30. package/vendor/dist-server/core/graph/nodes/context/enrich-context.js +8 -0
  31. package/vendor/dist-server/core/graph/nodes/context/inventory-context.js +4 -0
  32. package/vendor/dist-server/core/graph/nodes/context/namespace-context.js +2 -0
  33. package/vendor/dist-server/core/graph/nodes/context/node-types-context.js +4 -0
  34. package/vendor/dist-server/core/graph/nodes/context/relevant-assistants-context.js +5 -0
  35. package/vendor/dist-server/core/graph/nodes/context/relevant-skills-context.js +5 -0
  36. package/vendor/dist-server/core/graph/nodes/context/skills-context.js +8 -0
  37. package/vendor/dist-server/core/graph/nodes/context/state-setter.js +1 -0
  38. package/vendor/dist-server/core/graph/nodes/control/check-reset.js +1 -0
  39. package/vendor/dist-server/core/graph/nodes/control/topic-detection.js +1 -0
  40. package/vendor/dist-server/core/graph/nodes/governance/human-approval.js +16 -0
  41. package/vendor/dist-server/core/graph/nodes/index.js +1 -0
  42. package/vendor/dist-server/core/graph/nodes/orchestration/suggestion-generator.js +17 -0
  43. package/vendor/dist-server/core/graph/nodes/orchestration/team-decider.js +1 -0
  44. package/vendor/dist-server/core/graph/nodes/orchestration/team-execution/decider-error.js +4 -0
  45. package/vendor/dist-server/core/graph/nodes/orchestration/team-execution/decider-standalone-runner.js +1 -0
  46. package/vendor/dist-server/core/graph/nodes/orchestration/team-execution/decider-synthesis.js +29 -0
  47. package/vendor/dist-server/core/graph/nodes/orchestration/team-execution/pipeline-memory.js +2 -0
  48. package/vendor/dist-server/core/graph/nodes/orchestration/team-execution/pipeline-runner.js +7 -0
  49. package/vendor/dist-server/core/graph/nodes/orchestration/team-execution/team-assistant-utils.js +1 -0
  50. package/vendor/dist-server/core/graph/nodes/orchestration/team-finder.js +13 -0
  51. package/vendor/dist-server/core/graph/nodes/orchestration/team-invoker.js +3 -0
  52. package/vendor/dist-server/core/graph/nodes/orchestration/team-parallel.js +1 -0
  53. package/vendor/dist-server/core/graph/nodes/orchestration/team-pipeline.js +6 -0
  54. package/vendor/dist-server/core/graph/nodes/orchestration/team-router.js +26 -0
  55. package/vendor/dist-server/core/graph/nodes/reasoning/code-executor/index.js +6 -0
  56. package/vendor/dist-server/core/graph/nodes/reasoning/code-executor/resource-bridge.js +2 -0
  57. package/vendor/dist-server/core/graph/nodes/reasoning/code-executor/sandbox.js +6 -0
  58. package/vendor/dist-server/core/graph/nodes/reasoning/code-executor/tool-bridge.js +1 -0
  59. package/vendor/dist-server/core/graph/nodes/reasoning/local-extractor.js +5 -0
  60. package/vendor/dist-server/core/graph/nodes/reasoning/response-generator.js +47 -0
  61. package/vendor/dist-server/core/graph/nodes/reasoning/static-code-executor/index.js +1 -0
  62. package/vendor/dist-server/core/graph/nodes/reasoning/system.js +54 -0
  63. package/vendor/dist-server/core/graph/nodes/reasoning/tool-executor.js +9 -0
  64. package/vendor/dist-server/core/graph/nodes/tools/raw-output.js +4 -0
  65. package/vendor/dist-server/core/graph/nodes/tools/tool-cleaner.js +7 -0
  66. package/vendor/dist-server/core/graph/nodes/tools/tool-execution/execute-tool-calls.js +3 -0
  67. package/vendor/dist-server/core/graph/nodes/tools/tool-execution/invoke.js +1 -0
  68. package/vendor/dist-server/core/graph/nodes/tools/tool-execution/namespace-guard.js +1 -0
  69. package/vendor/dist-server/core/graph/nodes/tools/tool-execution/result-limits.js +3 -0
  70. package/vendor/dist-server/core/graph/nodes/tools/tool-invoker.js +1 -0
  71. package/vendor/dist-server/core/graph/nodes/tools/tool.js +4 -0
  72. package/vendor/dist-server/core/graph/schemas.js +1 -0
  73. package/vendor/dist-server/core/graph/topic-variants.js +1 -0
  74. package/vendor/dist-server/core/graph/types.js +1 -0
  75. package/vendor/dist-server/core/graph/utils/content-utils.js +17 -0
  76. package/vendor/dist-server/core/graph/utils/edge-jsonata-condition.js +1 -0
  77. package/vendor/dist-server/core/graph/utils/engine-vars.js +1 -0
  78. package/vendor/dist-server/core/graph/utils/logging-utils.js +4 -0
  79. package/vendor/dist-server/core/graph/utils/message-utils.js +5 -0
  80. package/vendor/dist-server/core/graph/utils/node-type-defaults-cache.js +1 -0
  81. package/vendor/dist-server/core/graph/utils/sandbox-catalog.js +1 -0
  82. package/vendor/dist-server/core/graph/utils/schema-utils.js +1 -0
  83. package/vendor/dist-server/core/graph/utils/team-context-policy.js +5 -0
  84. package/vendor/dist-server/core/graph/utils/team-node-resolvers.js +1 -0
  85. package/vendor/dist-server/core/graph/utils/tool-result.js +4 -0
  86. package/vendor/dist-server/core/graph/utils/tool-wrapper.js +14 -0
  87. package/vendor/dist-server/core/llm/init-indices.js +1 -0
  88. package/vendor/dist-server/core/llm/models/index.js +1 -0
  89. package/vendor/dist-server/core/llm/models/model.model.js +1 -0
  90. package/vendor/dist-server/core/llm/models/provider.model.js +1 -0
  91. package/vendor/dist-server/core/llm/models/routing-rule.model.js +1 -0
  92. package/vendor/dist-server/core/llm/providers.js +1 -0
  93. package/vendor/dist-server/core/mcp/client.js +1 -0
  94. package/vendor/dist-server/core/runtime/active-runs-registry.js +1 -0
  95. package/vendor/dist-server/core/runtime/system-prompt-cache.js +1 -0
  96. package/vendor/dist-server/core/runtime/trace-bus.js +1 -0
  97. package/vendor/dist-server/core/schema/cluster_health_report.js +1 -0
  98. package/vendor/dist-server/core/schema/cluster_info.js +1 -0
  99. package/vendor/dist-server/core/schema/cluster_license.js +5 -0
  100. package/vendor/dist-server/core/schema/cluster_stats.js +12 -0
  101. package/vendor/dist-server/core/schema/dashboard.js +1 -0
  102. package/vendor/dist-server/core/schema/indices_settings.js +1 -0
  103. package/vendor/dist-server/core/schema/indices_shards.js +1 -0
  104. package/vendor/dist-server/core/schema/indices_stats.js +1 -0
  105. package/vendor/dist-server/core/schema/nodes_info.js +2 -0
  106. package/vendor/dist-server/core/schema/nodes_stats.js +11 -0
  107. package/vendor/dist-server/core/schema/pricing.js +1 -0
  108. package/vendor/dist-server/core/schema/ui.js +1 -0
  109. package/vendor/dist-server/core/schema/zod_client.js +83 -0
  110. package/vendor/dist-server/core/services/a2a-client.js +2 -0
  111. package/vendor/dist-server/core/services/alerts-service.js +1 -0
  112. package/vendor/dist-server/core/services/api-keys-service.js +1 -0
  113. package/vendor/dist-server/core/services/assistant-resolver.js +1 -0
  114. package/vendor/dist-server/core/services/assistants-index-service.js +1 -0
  115. package/vendor/dist-server/core/services/async-conversations-service.js +22 -0
  116. package/vendor/dist-server/core/services/asyncapi-dispatch.js +1 -0
  117. package/vendor/dist-server/core/services/asyncapi-drivers/driver-manager.js +1 -0
  118. package/vendor/dist-server/core/services/asyncapi-drivers/driver-types.js +0 -0
  119. package/vendor/dist-server/core/services/asyncapi-drivers/http-driver.js +1 -0
  120. package/vendor/dist-server/core/services/asyncapi-drivers/nats-driver.js +1 -0
  121. package/vendor/dist-server/core/services/asyncapi-drivers/websocket-driver.js +1 -0
  122. package/vendor/dist-server/core/services/asyncapi-events-service.js +1 -0
  123. package/vendor/dist-server/core/services/asyncapi-reply-service.js +1 -0
  124. package/vendor/dist-server/core/services/asyncapi-sink.js +1 -0
  125. package/vendor/dist-server/core/services/asyncapi-tools-service.js +1 -0
  126. package/vendor/dist-server/core/services/block-repair-service.js +13 -0
  127. package/vendor/dist-server/core/services/chart-renderer.js +1 -0
  128. package/vendor/dist-server/core/services/chat-llms-service.js +1 -0
  129. package/vendor/dist-server/core/services/chat-runs-service.js +1 -0
  130. package/vendor/dist-server/core/services/chat-tools-service.js +1 -0
  131. package/vendor/dist-server/core/services/chat-traces-service.js +1 -0
  132. package/vendor/dist-server/core/services/chats-service.js +5 -0
  133. package/vendor/dist-server/core/services/comparison-service.js +107 -0
  134. package/vendor/dist-server/core/services/default-model.service.js +1 -0
  135. package/vendor/dist-server/core/services/elastic-stack-sync-service.js +2 -0
  136. package/vendor/dist-server/core/services/elasticsearch-wrapper.js +1 -0
  137. package/vendor/dist-server/core/services/embed-rate-limiter.js +1 -0
  138. package/vendor/dist-server/core/services/error-analytics-service.js +1 -0
  139. package/vendor/dist-server/core/services/es-field-resolver.js +1 -0
  140. package/vendor/dist-server/core/services/gateway-platform-types.js +1 -0
  141. package/vendor/dist-server/core/services/gliner-tagging-service.js +1 -0
  142. package/vendor/dist-server/core/services/golden-questions-scoring.js +1 -0
  143. package/vendor/dist-server/core/services/golden-questions-service.js +1 -0
  144. package/vendor/dist-server/core/services/graph-drilldown-service.js +1 -0
  145. package/vendor/dist-server/core/services/graph-registry-service.js +1 -0
  146. package/vendor/dist-server/core/services/hitl-analytics-service.js +1 -0
  147. package/vendor/dist-server/core/services/ingestion-jobs-service.js +1 -0
  148. package/vendor/dist-server/core/services/ingestion-service.js +5 -0
  149. package/vendor/dist-server/core/services/kibana-client-factory.js +1 -0
  150. package/vendor/dist-server/core/services/kibana-client.js +2 -0
  151. package/vendor/dist-server/core/services/kibana-dashboard-extractor.js +1 -0
  152. package/vendor/dist-server/core/services/kibana-service.js +1 -0
  153. package/vendor/dist-server/core/services/llm-analytics-service.js +1 -0
  154. package/vendor/dist-server/core/services/llm-client-resolver.js +1 -0
  155. package/vendor/dist-server/core/services/llm-models-service.js +1 -0
  156. package/vendor/dist-server/core/services/llm-pricing-pure.js +1 -0
  157. package/vendor/dist-server/core/services/llm-pricing-service.js +1 -0
  158. package/vendor/dist-server/core/services/llm-providers-service.js +1 -0
  159. package/vendor/dist-server/core/services/llm-routing-service.js +1 -0
  160. package/vendor/dist-server/core/services/llm-services.js +1 -0
  161. package/vendor/dist-server/core/services/llm-sync-service.js +1 -0
  162. package/vendor/dist-server/core/services/manifest-loader.js +1 -0
  163. package/vendor/dist-server/core/services/mcp-servers-service.js +1 -0
  164. package/vendor/dist-server/core/services/mcp-sync-service.js +1 -0
  165. package/vendor/dist-server/core/services/mcp-tools-service.js +1 -0
  166. package/vendor/dist-server/core/services/memories-service.js +2 -0
  167. package/vendor/dist-server/core/services/memory-analytics-service.js +1 -0
  168. package/vendor/dist-server/core/services/monitoring-analytics-service.js +1 -0
  169. package/vendor/dist-server/core/services/monitoring-service.js +1 -0
  170. package/vendor/dist-server/core/services/multi-kibana-service.js +1 -0
  171. package/vendor/dist-server/core/services/node-latency-service.js +1 -0
  172. package/vendor/dist-server/core/services/package-policy-service.js +2 -0
  173. package/vendor/dist-server/core/services/pdf-service.js +572 -0
  174. package/vendor/dist-server/core/services/plan-service.js +1 -0
  175. package/vendor/dist-server/core/services/platform-direction.js +1 -0
  176. package/vendor/dist-server/core/services/platform-secrets.js +1 -0
  177. package/vendor/dist-server/core/services/platforms-service.js +1 -0
  178. package/vendor/dist-server/core/services/policy-factory.js +1 -0
  179. package/vendor/dist-server/core/services/prompt-cache-service.js +1 -0
  180. package/vendor/dist-server/core/services/provider-rate-limits.js +1 -0
  181. package/vendor/dist-server/core/services/quota-service.js +1 -0
  182. package/vendor/dist-server/core/services/report-assets-service.js +1 -0
  183. package/vendor/dist-server/core/services/run-analytics-collector.js +1 -0
  184. package/vendor/dist-server/core/services/run-stream-sink.js +1 -0
  185. package/vendor/dist-server/core/services/send_mail.js +460 -0
  186. package/vendor/dist-server/core/services/share-service.js +1 -0
  187. package/vendor/dist-server/core/services/slack-signature.js +1 -0
  188. package/vendor/dist-server/core/services/sources-service.js +6 -0
  189. package/vendor/dist-server/core/services/team-mcp-result.js +4 -0
  190. package/vendor/dist-server/core/services/team-mcp-run-tokens.js +1 -0
  191. package/vendor/dist-server/core/services/team-mcp-runner.js +1 -0
  192. package/vendor/dist-server/core/services/team-mcp-server.js +1 -0
  193. package/vendor/dist-server/core/services/team-mcp-tools.js +1 -0
  194. package/vendor/dist-server/core/services/team-mcp-ui.js +551 -0
  195. package/vendor/dist-server/core/services/team-run-progress.js +1 -0
  196. package/vendor/dist-server/core/services/team-runner-headless.js +7 -0
  197. package/vendor/dist-server/core/services/team-search-service.js +1 -0
  198. package/vendor/dist-server/core/services/teams-service.js +1 -0
  199. package/vendor/dist-server/core/services/token-projection-service.js +1 -0
  200. package/vendor/dist-server/core/services/tool-analytics-service.js +1 -0
  201. package/vendor/dist-server/core/services/tool-history-service.js +1 -0
  202. package/vendor/dist-server/core/services/tool-metrics-service.js +1 -0
  203. package/vendor/dist-server/core/services/tool-scoring.js +1 -0
  204. package/vendor/dist-server/core/services/toolbox-import-mappers.js +1 -0
  205. package/vendor/dist-server/core/services/toolbox-import-service.js +1 -0
  206. package/vendor/dist-server/core/services/trigger-service.js +1 -0
  207. package/vendor/dist-server/core/services/version-snapshot-service.js +1 -0
  208. package/vendor/dist-server/core/services/webhook-calls-service.js +1 -0
  209. package/vendor/dist-server/core/tools/compare-chat.js +46 -0
  210. package/vendor/dist-server/core/tools/enrich-chat.js +50 -0
  211. package/vendor/dist-server/core/tools/variable-encoding.js +1 -0
  212. package/vendor/dist-server/core/types/settings.js +1 -0
  213. package/vendor/dist-server/core/utils/ab-evaluator.js +5 -0
  214. package/vendor/dist-server/core/utils/condition-evaluator.js +1 -0
  215. package/vendor/dist-server/core/utils/http-client.js +1 -0
  216. package/vendor/dist-server/core/utils/json-schema-to-form.js +1 -0
  217. package/vendor/dist-server/core/utils/logger.js +3 -0
  218. package/vendor/dist-server/core/utils/owner-scope.js +1 -0
  219. package/vendor/dist-server/core/utils/ownership.js +1 -0
  220. package/vendor/dist-server/core/utils/parallel-tool-executor.js +1 -0
  221. package/vendor/dist-server/core/utils/performance-tracker.js +3 -0
  222. package/vendor/dist-server/core/utils/prompt-optimizer.js +40 -0
  223. package/vendor/dist-server/core/utils/response-cache.js +1 -0
  224. package/vendor/dist-server/core/utils/schema-validator.js +1 -0
  225. package/vendor/dist-server/core/utils/streaming-optimizer.js +2 -0
  226. package/vendor/dist-server/core/utils/string-helpers.js +1 -0
  227. package/vendor/dist-server/core/utils/test-responses.js +9 -0
  228. package/vendor/dist-server/core/utils/text-utils.js +1 -0
  229. package/vendor/dist-server/core/utils/tool-form-trigger.js +1 -0
  230. package/vendor/dist-server/entrypoints/cli-bootstrap-run.js +1 -0
  231. package/vendor/dist-server/entrypoints/cli-deploy-run.js +1 -0
  232. package/vendor/dist-server/entrypoints/cli-deploy.js +1 -0
  233. package/vendor/dist-server/entrypoints/team-runner.js +1 -0
  234. package/vendor/dist-server/generated/toolbox-catalog.js +1 -0
  235. package/vendor/dist-server/index.js +2 -0
  236. package/vendor/dist-server/middleware/integration-logos.js +1 -0
  237. package/vendor/dist-server/middleware/plan-guard.js +1 -0
  238. package/vendor/dist-server/openapi/generator.js +1 -0
  239. package/vendor/dist-server/openapi/html-tool-spec.js +1 -0
  240. package/vendor/dist-server/routes/a2a-routes.js +1 -0
  241. package/vendor/dist-server/routes/a2a-server-routes.js +5 -0
  242. package/vendor/dist-server/routes/admin.js +1 -0
  243. package/vendor/dist-server/routes/assistants-routes.js +1 -0
  244. package/vendor/dist-server/routes/asyncapi-routes.js +1 -0
  245. package/vendor/dist-server/routes/auth.js +1 -0
  246. package/vendor/dist-server/routes/billing-routes.js +1 -0
  247. package/vendor/dist-server/routes/chat-llms.js +1 -0
  248. package/vendor/dist-server/routes/chat-tools.js +1 -0
  249. package/vendor/dist-server/routes/chat-traces.js +1 -0
  250. package/vendor/dist-server/routes/chats.js +1 -0
  251. package/vendor/dist-server/routes/clusters.js +1 -0
  252. package/vendor/dist-server/routes/compare.js +43 -0
  253. package/vendor/dist-server/routes/connectors-routes.js +1 -0
  254. package/vendor/dist-server/routes/consumptions-routes.js +1 -0
  255. package/vendor/dist-server/routes/data-admin-routes.js +1 -0
  256. package/vendor/dist-server/routes/data-transfer-routes.js +1 -0
  257. package/vendor/dist-server/routes/elastic-tool-execution-routes.js +1 -0
  258. package/vendor/dist-server/routes/geo-proxy-routes.js +1 -0
  259. package/vendor/dist-server/routes/golden-questions-routes.js +1 -0
  260. package/vendor/dist-server/routes/graph-registry.js +1 -0
  261. package/vendor/dist-server/routes/graph-templates-routes.js +1 -0
  262. package/vendor/dist-server/routes/helpdesk-routes.js +35 -0
  263. package/vendor/dist-server/routes/html-routes.js +1 -0
  264. package/vendor/dist-server/routes/index.js +1 -0
  265. package/vendor/dist-server/routes/indices.js +1 -0
  266. package/vendor/dist-server/routes/integrations-routes.js +1 -0
  267. package/vendor/dist-server/routes/langgraph.js +7 -0
  268. package/vendor/dist-server/routes/live-resources-routes.js +1 -0
  269. package/vendor/dist-server/routes/llm-analytics.js +1 -0
  270. package/vendor/dist-server/routes/llm-control-plane.js +1 -0
  271. package/vendor/dist-server/routes/llm.js +1 -0
  272. package/vendor/dist-server/routes/mcp-gateway-routes.js +1 -0
  273. package/vendor/dist-server/routes/mcp-query-routes.js +1 -0
  274. package/vendor/dist-server/routes/mcp-servers-routes.js +1 -0
  275. package/vendor/dist-server/routes/mcp-team-routes.js +1 -0
  276. package/vendor/dist-server/routes/mcp-tools-routes.js +1 -0
  277. package/vendor/dist-server/routes/me-routes.js +63 -0
  278. package/vendor/dist-server/routes/memories-routes.js +1 -0
  279. package/vendor/dist-server/routes/monitoring-analytics.js +12 -0
  280. package/vendor/dist-server/routes/monitoring.js +1 -0
  281. package/vendor/dist-server/routes/node-types-routes.js +171 -0
  282. package/vendor/dist-server/routes/nodes.js +1 -0
  283. package/vendor/dist-server/routes/packages.js +1 -0
  284. package/vendor/dist-server/routes/pdf.js +3 -0
  285. package/vendor/dist-server/routes/plan-routes.js +1 -0
  286. package/vendor/dist-server/routes/platform-requests-routes.js +1 -0
  287. package/vendor/dist-server/routes/platforms-routes.js +1 -0
  288. package/vendor/dist-server/routes/prompts-routes.js +1 -0
  289. package/vendor/dist-server/routes/proxy-logos.js +1 -0
  290. package/vendor/dist-server/routes/quality-routes.js +1 -0
  291. package/vendor/dist-server/routes/resources-ingest-routes.js +1 -0
  292. package/vendor/dist-server/routes/resources-routes.js +1 -0
  293. package/vendor/dist-server/routes/schema-routes.js +1 -0
  294. package/vendor/dist-server/routes/settings-original.js +1 -0
  295. package/vendor/dist-server/routes/settings.js +1 -0
  296. package/vendor/dist-server/routes/share-routes.js +1 -0
  297. package/vendor/dist-server/routes/sources-catalog-routes.js +1 -0
  298. package/vendor/dist-server/routes/sources-routes.js +1 -0
  299. package/vendor/dist-server/routes/team-optimizer-routes.js +1 -0
  300. package/vendor/dist-server/routes/team-schedule-routes.js +1 -0
  301. package/vendor/dist-server/routes/teams-routes.js +1 -0
  302. package/vendor/dist-server/routes/tool-analytics.js +1 -0
  303. package/vendor/dist-server/routes/tool-history-routes.js +1 -0
  304. package/vendor/dist-server/routes/tool-metrics-routes.js +1 -0
  305. package/vendor/dist-server/routes/toolbox-import-routes.js +1 -0
  306. package/vendor/dist-server/routes/tools-routes.js +5 -0
  307. package/vendor/dist-server/routes/transcribe-routes.js +1 -0
  308. package/vendor/dist-server/routes/triggers.js +1 -0
  309. package/vendor/dist-server/routes/versions-routes.js +1 -0
  310. package/vendor/dist-server/routes/webhooks-routes.js +1 -0
  311. package/vendor/dist-server/scripts/add-label-to-tools.js +4 -0
  312. package/vendor/dist-server/scripts/migrate-assistants-to-mcp.js +10 -0
  313. package/vendor/dist-server/scripts/migrate-chat-runs.js +8 -0
  314. package/vendor/dist-server/scripts/migrate-mcp-protocol.js +8 -0
  315. package/vendor/dist-server/scripts/migrate-mcp-to-platforms.js +15 -0
  316. package/vendor/dist-server/services/alert-evaluator.js +3 -0
  317. package/vendor/dist-server/services/auth.js +1 -0
  318. package/vendor/dist-server/services/billing-service.js +1 -0
  319. package/vendor/dist-server/services/chat-title-generator.js +12 -0
  320. package/vendor/dist-server/services/clone/clone-executor.js +1 -0
  321. package/vendor/dist-server/services/clone/closure-resolver.js +3 -0
  322. package/vendor/dist-server/services/clone/entity-graph.js +3 -0
  323. package/vendor/dist-server/services/clone/team-bundle-bootstrap.js +1 -0
  324. package/vendor/dist-server/services/clone/team-bundle-crypto.js +1 -0
  325. package/vendor/dist-server/services/clone/team-bundle-encrypted.js +1 -0
  326. package/vendor/dist-server/services/clone/team-bundle.js +1 -0
  327. package/vendor/dist-server/services/cluster-service.js +1 -0
  328. package/vendor/dist-server/services/connection-adapters.js +1 -0
  329. package/vendor/dist-server/services/connectors-service.js +10 -0
  330. package/vendor/dist-server/services/cost-forecast-service.js +1 -0
  331. package/vendor/dist-server/services/eui-ssr-renderer.js +4 -0
  332. package/vendor/dist-server/services/graph-canvas/full-structure-builder.js +1 -0
  333. package/vendor/dist-server/services/graph-templates-service.js +13 -0
  334. package/vendor/dist-server/services/guest-service.js +1 -0
  335. package/vendor/dist-server/services/html-service.js +1 -0
  336. package/vendor/dist-server/services/langgraph-service.js +2 -0
  337. package/vendor/dist-server/services/leaflet-render-service.js +80 -0
  338. package/vendor/dist-server/services/live-resources-service.js +16 -0
  339. package/vendor/dist-server/services/mcp-app-tester-package.js +1 -0
  340. package/vendor/dist-server/services/mcp-gateway/executors/openapi-executor.js +1 -0
  341. package/vendor/dist-server/services/mcp-gateway/gateway-grant-service.js +2 -0
  342. package/vendor/dist-server/services/team-optimizer-service.js +1 -0
  343. package/vendor/dist-server/services/trace-bus-sink.js +1 -0
  344. package/vendor/dist-server/services/user-provisioning-service.js +3 -0
  345. package/vendor/dist-server/templates/mcp-app-tester/src/mcp-http.js +3 -0
  346. package/vendor/dist-server/templates/mcp-app-tester/src/server.js +1 -0
  347. package/vendor/dist-server/utils.js +1 -0
  348. package/vendor/dist-server/ws/assistant-executor.js +7 -0
  349. package/vendor/dist-server/ws/classify-streamed-json-block.js +1 -0
  350. package/vendor/dist-server/ws/collect-response-generator-node-ids.js +1 -0
  351. package/vendor/dist-server/ws/extractors/blockkit-extractor.js +1 -0
  352. package/vendor/dist-server/ws/extractors/echarts-extractor.js +1 -0
  353. package/vendor/dist-server/ws/extractors/eui-extractor.js +1 -0
  354. package/vendor/dist-server/ws/extractors/form-extractor.js +1 -0
  355. package/vendor/dist-server/ws/extractors/index.js +1 -0
  356. package/vendor/dist-server/ws/extractors/leaflet-extractor.js +1 -0
  357. package/vendor/dist-server/ws/extractors/mantine-extractor.js +1 -0
  358. package/vendor/dist-server/ws/extractors/markdown-extractor.js +7 -0
  359. package/vendor/dist-server/ws/extractors/mermaid-extractor.js +1 -0
  360. package/vendor/dist-server/ws/extractors/recharts-extractor.js +1 -0
  361. package/vendor/dist-server/ws/extractors/remotion-extractor.js +1 -0
  362. package/vendor/dist-server/ws/handler.js +66 -0
  363. package/vendor/dist-server/ws/parsers/anthropic-parser.js +7 -0
  364. package/vendor/dist-server/ws/parsers/base-parser.js +3 -0
  365. package/vendor/dist-server/ws/parsers/gemini-parser.js +8 -0
  366. package/vendor/dist-server/ws/parsers/index.js +1 -0
  367. package/vendor/dist-server/ws/parsers/parse-json-blocks.js +1 -0
  368. package/vendor/dist-server/ws/types.js +0 -0
  369. package/vendor/dist-server/ws/utils.js +1 -0
  370. package/vendor/shared/engine-vars.ts +51 -0
  371. package/vendor/shared/llm-providers-config.ts +69 -0
@@ -0,0 +1,2 @@
1
+ import{randomUUID as T}from"node:crypto";import{HumanMessage as N}from"@langchain/core/messages";import{MemorySaver as U}from"@langchain/langgraph-checkpoint";import{buildAppFromDefinition as O}from"../core/graph/app";import{createMcpClient as $}from"../core/mcp/client";import{userToken as P,getUserProviders as q}from"../services/auth";import{getGraph as D}from"../core/services/graph-registry-service";import{getTeamWebhookConfig as J}from"../core/services/teams-service";import{runTeamHeadless as F}from"../core/services/team-runner-headless";import{createChat as H,getChatById as x}from"../core/services/chats-service";import{createChatRun as z,getChatRunByRunId as E}from"../core/services/chat-runs-service";const R=process.env.MCP_URL||"https://localhost:3001/mcp",B=process.env.MCP_AUTH||"";class Q{buffered=[];waiters=[];ended=!1;push(o){if(this.ended)return;const r=this.waiters.shift();r?r({value:o,done:!1}):this.buffered.push(o)}end(){if(!this.ended)for(this.ended=!0;this.waiters.length>0;)this.waiters.shift()({value:void 0,done:!0})}async*[Symbol.asyncIterator](){for(;;){if(this.buffered.length>0){yield this.buffered.shift();continue}if(this.ended)return;const o=await new Promise(r=>{this.waiters.push(r)});if(o.done)return;yield o.value}}}async function V(h){const{teamId:o,chatId:r,runId:m,input:p,callerUsername:v}=h,i=await J(o);if(!i)throw new Error(`Team not found: ${o}`);if(!i.owner)throw new Error(`Team ${o} has no owner configured`);if(!v||v!==i.owner)throw new Error(`Forbidden: the calling user does not own team ${o}`);const s=await x(r,i.owner)!==null;return s||await H({id:r,title:`${i.name||o} \xB7 A2A`,teamId:o,teamName:i.name||o,status:"active",messages:[],assistants:[],metadata:{source:"chat"},username:i.owner}),await z(m,r,i.owner,{teamId:o,teamName:i.name,assistantId:"__a2a_pending__",assistantName:"A2A run (running\u2026)",graphId:i.graphId,userMessage:p.slice(0,2e3)}),{owner:i.owner,name:i.name,graphId:i.graphId,isContinuation:s}}async function*W(h){const{teamId:o,input:r,chatId:m,runId:p,callerUsername:v,activeRuns:i}=h;try{const t=await V({teamId:o,chatId:m,runId:p,input:r,callerUsername:v}),s=new Q,u={name:"A2ASyncSink",onMarkdownToken(f){s.push({type:"token",runId:p,text:f.text})},onToolStart(f){s.push({type:"tool_start",runId:p,text:JSON.stringify({toolName:f.toolName,toolInput:f.toolInput??null})})},onToolEnd(f){s.push({type:"tool_end",runId:p,text:JSON.stringify({toolName:f.toolName,toolOutput:f.toolResult??null})})}},d=new AbortController;i.set(p,{cancel:()=>d.abort(),username:t.owner});const w=F({teamId:o,runId:p,chatId:m,payload:r,depth:0,extraSinks:[u],signal:d.signal,channel:"a2a",...t.isContinuation?{threadIdOverride:m}:{}}).finally(()=>{s.end(),i.delete(p)});yield*s,await w;const[l,y]=await Promise.all([x(m,t.owner),E(p)]);if(y?.status==="error"){yield{type:"error",runId:p,error:y.errorMessage||"Team run failed",data:{errorType:y.errorType||"unknown",chatId:m}};return}yield{type:"done",runId:p,data:{ok:!0,chatId:m,messages:l?.messages||[],toolsUsed:y?.toolsUsed||[],stats:{messageCount:l?.messages?.length||0,toolCallsCount:y?.toolCallsCount||0}}}}catch(t){console.error("[LangGraph][Team] Sync run error:",t),yield{type:"error",runId:p,error:t.message||"Unknown error occurred",data:{errorType:"team_run_error",timestamp:new Date().toISOString()}}}}async function ce(){let h=null;try{console.log(`[LangGraph] Attempting to connect to MCP at ${R}`),h=await $(R,{Authorization:`ApiKey ${B}`}),console.log("[LangGraph] MCP connection established")}catch(t){console.error("[LangGraph] Failed to connect to MCP server:",t.message),console.warn("[LangGraph] WARNING: Service will start without MCP connection"),console.warn("[LangGraph] MCP tools will not be available")}const o=new U,r=new Map;async function*m(t){const{input:s,graphId:u,teamId:d,threadId:w=T(),runId:l=T(),checkpointNs:y="ui-v1",queryParams:f,userToken:_,test:j=!1}=t;if(yield{type:"accepted",runId:l,data:{threadId:w}},d){let n;if(_)try{const a=P(_);a&&a.username&&(n=a.username)}catch(a){console.error("[LangGraph] Error decoding user token:",a)}yield*W({teamId:d,input:s,chatId:w,runId:l,callerUsername:n,activeRuns:r});return}let I;try{let n=null;if(_)try{const e=P(_);e&&e.username&&(console.log(`[LangGraph] Fetching providers for user: ${e.username}`),n=await q(e.username),console.log("[LangGraph] User providers:",n?`${n.length} providers`:"none"))}catch(e){console.error("[LangGraph] Error fetching user providers:",e)}let a=null;if(u){if(console.log(`[LangGraph] Loading graph from registry: ${u}`),a=await D(u),!a)throw new Error(`Graph not found: ${u}`);if(a.enabled===!1)throw new Error(`Graph is disabled: ${u}`);console.log(`[LangGraph] \u2705 Loaded graph: ${a.name} (v${a.version})`)}if(a)console.log(`[LangGraph] \u2705 Building graph dynamically from definition: ${a.name}`),I=await O(a,{mcp:h||[],memory:o,threadId:w,queryParams:f,userToken:_,userProviders:n});else throw new Error("graphId is required: the default buildApp() flow is deprecated, provide a graphId referencing a graph in the registry (/api/graphs).");const b={messages:[new N({content:[{type:"text",text:s}]})]},k=[],M=await I.streamEvents(b,{version:"v2",configurable:{thread_id:w,run_id:l,checkpoint_ns:y},recursionLimit:100,maxConcurrency:1});r.set(l,{cancel:()=>{console.log(`[LangGraph] Cancelling run: ${l}`)}});let S="";for await(const e of M){if(!r.has(l)){console.log(`[LangGraph] Run ${l} was cancelled`);break}if(console.log("[LangGraph] Event:",e.metadata?.langgraph_checkpoint_ns,"| event:",e.event,"| name:",e.name),!e.metadata?.langgraph_checkpoint_ns||e.metadata.langgraph_checkpoint_ns&&e.metadata.langgraph_checkpoint_ns.indexOf("assistant")===-1&&e.metadata.langgraph_checkpoint_ns.indexOf("documentation")===-1)continue;if(e.event==="on_chat_model_stream"||e.event==="on_llm_stream"){const c=e.data?.chunk??e.data?.output,g=c?.content?.[0]?.text??c?.content??c?.delta??c?.token??"";g&&typeof g=="string"&&(S+=g,yield{type:"token",runId:l,text:g})}if(e.event==="on_tool_start"){const c=e.name,g=e.data?.input;console.log("[LangGraph] Tool starting:",c,JSON.stringify(g)?.substring(0,100)),k.push({name:c,input:g,output:null,timestamp:new Date().toISOString()}),yield{type:"tool_start",runId:l,text:JSON.stringify({toolName:c,toolInput:g||null})}}if(e.event==="on_tool_end"){const c=e.name,g=e.data?.output;if(console.log("[LangGraph] Tool result for",c,":",JSON.stringify(g)?.substring(0,200)),g&&g.content){const L=Array.isArray(g.content)?g.content.map(G=>G.text||JSON.stringify(G)).join(`
2
+ `):g.content;if(L&&typeof L=="string"){const G=k.find(A=>A.name===c&&A.output===null);G&&(G.output=L),yield{type:"tool_end",runId:l,text:JSON.stringify({toolName:c,toolOutput:L})}}}}(e.event==="on_graph_end"||e.event==="on_chain_end"&&e.name==="LangGraph")&&(console.log("[LangGraph] Generation complete"),console.log("[LangGraph] Full response length:",S.length),k.length>0&&(yield{type:"tools_summary",runId:l,data:{tools:k.map(c=>({name:c.name,input:c.input,output:c.output,timestamp:c.timestamp}))}}),yield{type:"done",runId:l,data:{ok:!0,stats:{responseLength:S.length,toolsUsed:k.length}}},r.delete(l))}}catch(n){console.error("[LangGraph] Stream error:",n);let a={message:n.message||"Unknown error occurred",type:"stream_error",details:null};if(n.error?.type==="overloaded_error"?a={message:"L'API est temporairement surcharg\xE9e. Veuillez r\xE9essayer dans quelques instants.",type:"api_overloaded",details:{apiError:n.error.type,requestId:n.requestID,retryAfter:"30 seconds"}}:n.error?.type==="rate_limit_error"?a={message:"Limite de taux d'API atteinte. Veuillez patienter avant de faire une nouvelle requ\xEAte.",type:"rate_limit",details:{apiError:n.error.type,requestId:n.requestID,retryAfter:"1 minute"}}:n.error?.type&&(a={message:`Erreur API: ${n.error.message||n.message}`,type:"api_error",details:{apiError:n.error.type,requestId:n.requestID}}),yield{type:"error",runId:l,error:a.message,data:{errorType:a.type,errorDetails:a.details,timestamp:new Date().toISOString()}},r.delete(l),I&&I.cleanup)try{I.cleanup()}catch(C){console.error("[LangGraph] Error cleaning up MCP clients:",C)}}}async function p(t,s){const u=r.get(t);if(u)return u.username&&u.username!==s?{status:"not_found",runId:t}:{status:"running",runId:t};const d=await E(t).catch(()=>null);return d?!s||s!==d.username?{status:"not_found",runId:t}:{status:d.status,runId:t,chatId:d.chatId,...d.errorMessage?{errorMessage:d.errorMessage}:{},...d.errorType?{errorType:d.errorType}:{}}:{status:"not_found",runId:t}}async function v(t,s){const u=r.get(t);return!u||u.username&&u.username!==s?!1:(u.cancel(),r.delete(t),!0)}async function i(){console.log("[LangGraph] Closing service");for(const[t,s]of r.entries())s.cancel(),r.delete(t);h&&await h.close()}return{invoke:m,getRunStatus:p,cancelRun:v,close:i}}export{ce as createLangGraphService};
@@ -0,0 +1,80 @@
1
+ import{PDFService as u}from"../core/services/pdf-service";import{fetchGeoJsonSafely as f}from"../routes/geo-proxy-routes";const s="1.9.4";function e(t){return JSON.stringify(t).replace(/<\/script/gi,"<\\/script").replace(/<!--/g,"<\\!--")}function g(t,n){const a=t.height??400,o=t.choropleth?.scale??["#fee5d9","#fcae91","#fb6a4a","#de2d26","#a50f15"],r=t.choropleth?.steps??[],l=t.choropleth?.opacity??.7,c=t.choropleth?.property,p=t.data_join;return`<!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <link rel="stylesheet" href="https://unpkg.com/leaflet@${s}/dist/leaflet.css">
6
+ <style>html,body{margin:0;padding:0;}#map{width:800px;height:${a}px;}</style>
7
+ </head>
8
+ <body>
9
+ <div id="map"></div>
10
+ <script src="https://unpkg.com/leaflet@${s}/dist/leaflet.js"></script>
11
+ <script>
12
+ const CENTER = ${e(t.center)};
13
+ const ZOOM = ${e(t.zoom??5)};
14
+ const MARKERS = ${e(t.markers??[])};
15
+ const CIRCLES = ${e(t.circles??[])};
16
+ const POLYLINES = ${e(t.polylines??[])};
17
+ const POLYGONS = ${e(t.polygons??[])};
18
+ const __EMBEDDED_GEOJSON__ = ${e(n??null)};
19
+ const CHOROPLETH_PROPERTY = ${e(c??null)};
20
+ const COLOR_SCALE = ${e(o)};
21
+ const STEPS = ${e(r)};
22
+ const FILL_OPACITY = ${e(l)};
23
+ const DATA_JOIN = ${e(p??null)};
24
+
25
+ function svgIcon(color) {
26
+ const svg = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 36" width="24" height="36">' +
27
+ '<path fill="' + color + '" stroke="white" stroke-width="1.5" d="M12 0C7.6 0 4 3.6 4 8c0 5.4 8 28 8 28s8-22.6 8-28c0-4.4-3.6-8-8-8z"/>' +
28
+ '<circle fill="white" cx="12" cy="8" r="3"/></svg>';
29
+ return L.divIcon({ html: svg, iconSize: [24, 36], iconAnchor: [12, 36], popupAnchor: [0, -36], className: '' });
30
+ }
31
+
32
+ function colorForValue(value) {
33
+ if (value == null || !STEPS.length) return '#cccccc';
34
+ let bucket = STEPS.findIndex((t) => value < t);
35
+ if (bucket === -1) bucket = COLOR_SCALE.length - 1;
36
+ return COLOR_SCALE[Math.min(bucket, COLOR_SCALE.length - 1)];
37
+ }
38
+
39
+ const map = L.map('map', { scrollWheelZoom: false, zoomControl: false, attributionControl: false });
40
+ map.setView(CENTER, ZOOM);
41
+ L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png').addTo(map);
42
+
43
+ MARKERS.forEach((mk) => L.marker([mk.lat, mk.lng], { icon: svgIcon(mk.color || '#0077CC') }).addTo(map));
44
+ CIRCLES.forEach((c) => L.circle([c.lat, c.lng], {
45
+ radius: c.radius, color: c.color || '#0077CC',
46
+ fillColor: c.fillColor || c.color || '#0077CC', fillOpacity: c.fillOpacity ?? 0.2,
47
+ }).addTo(map));
48
+ POLYLINES.forEach((pl) => L.polyline(pl.points, {
49
+ color: pl.color || '#DD0A73', weight: pl.weight ?? 2, opacity: pl.opacity ?? 0.8,
50
+ }).addTo(map));
51
+ POLYGONS.forEach((pg) => L.polygon(pg.points, {
52
+ color: pg.color || '#017D73', fillColor: pg.fillColor || pg.color || '#017D73', fillOpacity: pg.fillOpacity ?? 0.3,
53
+ }).addTo(map));
54
+
55
+ if (__EMBEDDED_GEOJSON__) {
56
+ let featureCollection = __EMBEDDED_GEOJSON__;
57
+ if (Array.isArray(__EMBEDDED_GEOJSON__)) {
58
+ featureCollection = { type: 'FeatureCollection', features: __EMBEDDED_GEOJSON__ };
59
+ }
60
+ const layer = L.geoJSON(featureCollection, {
61
+ style: (feature) => {
62
+ let value;
63
+ if (DATA_JOIN && CHOROPLETH_PROPERTY) {
64
+ const key = feature?.properties?.[DATA_JOIN.join_key];
65
+ const joined = key != null ? DATA_JOIN.data?.[String(key)] : undefined;
66
+ value = joined ? joined[CHOROPLETH_PROPERTY] : undefined;
67
+ }
68
+ return { color: '#ffffff', weight: 1, fillColor: colorForValue(value), fillOpacity: FILL_OPACITY };
69
+ },
70
+ }).addTo(map);
71
+ try {
72
+ const bounds = layer.getBounds();
73
+ if (bounds.isValid()) map.fitBounds(bounds, { padding: [20, 20] });
74
+ } catch (e) { /* keep configured center/zoom */ }
75
+ }
76
+
77
+ window.__mapReady = true;
78
+ </script>
79
+ </body>
80
+ </html>`}async function h(t){let n;if(t.geojson_url){const r=await f(t.geojson_url);r.ok?n=r.data:console.error(`[leaflet-render-service] failed to fetch geojson from ${t.geojson_url}: status=${r.status} error=${r.error}`)}const i=g(t,n),o=await(await u.getBrowser()).newPage();try{await o.setViewport({width:820,height:(t.height??400)+20}),await o.setContent(i,{waitUntil:"networkidle0"}),await o.waitForFunction("window.__mapReady === true",{timeout:5e3}).catch(()=>{});const l=await(await o.$("#map")??o).screenshot({type:"png"});return`data:image/png;base64,${Buffer.from(l).toString("base64")}`}finally{await o.close()}}export{g as buildLeafletPageHtml,h as renderLeafletScreenshot};
@@ -0,0 +1,16 @@
1
+ import{Client as f}from"@elastic/elasticsearch";import{config as w}from"../core/config";import{createLLMInstance as h}from"../core/llm/providers";import{getOwnerDefaultLLMConfig as R}from"../core/services/default-model.service";const a=new f(w.elasticsearch),o=".stkxp_live_resources";async function b(){await a.indices.exists({index:o})||(await a.indices.create({index:o,body:{settings:{number_of_shards:1,number_of_replicas:0},mappings:{properties:{name:{type:"text",fields:{keyword:{type:"keyword"}}},tags:{type:"keyword"},owner:{type:"keyword"},teamId:{type:"keyword"},assistantId:{type:"keyword"},assistantName:{type:"keyword"},source:{properties:{chatId:{type:"keyword"},runId:{type:"keyword"},toolCallId:{type:"keyword"},toolName:{type:"keyword"},toolInput:{type:"object",enabled:!1},toolInputVariables:{type:"object",enabled:!1},mcpServerId:{type:"keyword"}}},template:{properties:{blockType:{type:"keyword"},blockStructure:{type:"object",enabled:!1},promptId:{type:"keyword"},renderMode:{type:"keyword"}}},refreshConfig:{properties:{mode:{type:"keyword"},cronExpression:{type:"keyword"},lastRefreshedAt:{type:"date"},lastRefreshStatus:{type:"keyword"},lastRefreshDuration:{type:"integer"}}},lastData:{type:"object",enabled:!1},createdAt:{type:"date"},updatedAt:{type:"date"}}}}}),console.log(`[LiveResources] Index ${o} created`))}b().catch(e=>console.error("[LiveResources] initializeIndex error:",e.message));async function I(e){const t=new Date().toISOString(),r={...e,createdAt:t,updatedAt:t};return{id:(await a.index({index:o,body:r,refresh:"wait_for"}))._id,...r}}async function _(e){try{const t=await a.get({index:o,id:e});return{id:t._id,...t._source}}catch(t){if(t.meta?.statusCode===404)return null;throw t}}const u=e=>`order_${e}`;async function A(e){try{const r=(await a.get({index:o,id:u(e)}))._source;return{orderedIds:r?.orderedIds??[],layouts:r?.layouts??{}}}catch{return{orderedIds:[],layouts:{}}}}async function S(e,t,r){await a.index({index:o,id:u(e),body:{isOrderDoc:!0,owner:e,orderedIds:r,layouts:t},refresh:"wait_for"})}async function C(e,t,r=0,n=20){const i=[{term:{owner:e}}];t&&t.length>0&&i.push({terms:{tags:t}});const s=await a.search({index:o,body:{query:{bool:{must:i,must_not:[{ids:{values:[u(e)]}}]}},sort:[{createdAt:{order:"desc",unmapped_type:"date"}}],from:r,size:n}}),d=typeof s.hits.total=="number"?s.hits.total:s.hits.total?.value??0;return{items:s.hits.hits.map(c=>({id:c._id,...c._source})),total:d}}async function D(e){return((await a.search({index:o,body:{query:{term:{owner:e}},size:0,aggs:{tags:{terms:{field:"tags",size:200}}}}})).aggregations?.tags?.buckets||[]).map(n=>n.key)}async function P(e,t){try{return await a.update({index:o,id:e,body:{doc:{...t,updatedAt:new Date().toISOString()}},refresh:"wait_for"}),!0}catch(r){if(r.meta?.statusCode===404)return!1;throw r}}async function O(e){try{return await a.delete({index:o,id:e,refresh:"wait_for"}),!0}catch(t){if(t.meta?.statusCode===404)return!1;throw t}}async function T(e,t,r,n,i){try{const s=await R(i);if(!s)return console.warn(`[LiveResources] No usable LLM key for owner '${i??"(none)"}', using basic tags`),[r,e];const d=h({provider:s.provider,model:s.model,apiKey:s.apiKey,baseURL:s.baseURL,temperature:.2,streaming:!1}),c=t.substring(0,500),y=`You are a tagging assistant. Generate 3-6 short, lowercase tags for a live data resource block.
2
+
3
+ Block info:
4
+ - Tool name: ${e}
5
+ - Block type: ${r}
6
+ - Block title: ${n}
7
+ - Tool output preview: ${c}
8
+
9
+ Rules:
10
+ - Tags should be lowercase, no spaces (use hyphens if needed)
11
+ - Mix technical (tool/system type) and topical (what data it represents) tags
12
+ - Include: technology/system (e.g. clickhouse, mysql, kubernetes), data domain (e.g. databases, metrics, logs), and type (e.g. table, chart)
13
+ - Maximum 6 tags, minimum 3
14
+ - Return ONLY a JSON array of strings, nothing else
15
+
16
+ Example: ["clickhouse","databases","table","infrastructure","sql"]`,l=await d.invoke(y),g=typeof l.content=="string"?l.content.trim():"",p=JSON.parse(g);return Array.isArray(p)?p.filter(m=>typeof m=="string").slice(0,8):[r,e]}catch(s){return console.error("[LiveResources] generateResourceTags error:",s),[r,e]}}export{I as createLiveResource,O as deleteLiveResource,T as generateResourceTags,D as getAllTags,_ as getLiveResource,A as getLiveResourcesLayout,C as listLiveResources,S as setLiveResourcesLayout,P as updateLiveResource};
@@ -0,0 +1 @@
1
+ import{promises as p}from"node:fs";import a from"node:path";import{fileURLToPath as _}from"node:url";import{ZipArchive as v}from"archiver";import{sanitizeToolName as u}from"../core/services/team-mcp-tools";const A=_(import.meta.url),E=a.dirname(A),d=a.join(E,"..","templates","mcp-app-tester"),M=new Set([".env.example","README.md"]);function N(e){return u(e||"team")}function y(e,t){return e.replace(/\{\{(\w+)\}\}/g,(i,r)=>r in t?t[r]:i)}async function g(e,t=e){const i=await p.readdir(e,{withFileTypes:!0}),r=[];for(const o of i){const c=a.join(e,o.name);o.isDirectory()?r.push(...await g(c,t)):r.push(a.relative(t,c))}return r}async function O(e){const{teamName:t,mcpUrl:i,allowUnsigned:r}=e,o=`ask_${u(t)}`,c={TEAM_NAME:t,MCP_URL:i,ASK_TOOL_NAME:o,ALLOW_UNSIGNED_NOTE:r?"This team already has unsigned requests enabled, so leaving the secret empty will work out of the box.":"This team currently requires a signature \u2014 enable that switch first, or paste a valid secret above."},h=await g(d),w=`mcp-app-tester-${N(t)}`,s=new v({zlib:{level:9}}),m=[];s.on("data",n=>m.push(n));const T=new Promise((n,l)=>{s.on("end",()=>n()),s.on("error",l)});for(const n of h){const l=a.join(d,n),f=`${w}/${n}`;if(M.has(n)){const P=await p.readFile(l,"utf8");s.append(y(P,c),{name:f})}else s.append(await p.readFile(l),{name:f})}return s.finalize(),await T,Buffer.concat(m)}export{O as buildMcpAppTesterZip,N as slugifyTeamName};
@@ -0,0 +1 @@
1
+ const m=new Set(["none","apiKey","bearer","basic"]);function y(e){const t=e?.type;return!t||m.has(t)}function g(e){const t={};if(!e||!e.type||e.type==="none")return t;if(e.type==="apiKey"&&e.apiKey){const n=e.headerName||"Authorization";t[n]=e.headerName?e.apiKey:`ApiKey ${e.apiKey}`}else if(e.type==="bearer"&&e.token)t.Authorization=`Bearer ${e.token}`;else if(e.type==="basic"&&e.username){const n=Buffer.from(`${e.username}:${e.password||""}`).toString("base64");t.Authorization=`Basic ${n}`}return t}function h(e,t){const n={...t},s=/\{([^}]+)\}|:([A-Za-z_][A-Za-z0-9_]*)/g;return{url:e.replace(s,(p,d,c)=>{const u=d||c,a=n[u];return a==null||a===""?p:(delete n[u],encodeURIComponent(String(a)))}),remaining:n}}function f(e){return{tools:(e.toolSnapshots||[]).map(n=>({name:n.name,description:n.description,inputSchema:n.inputSchema?JSON.parse(n.inputSchema):void 0}))}}function S(e){if(typeof e.bodyTemplate=="string"&&e.bodyTemplate.trim()||Array.isArray(e.variables)&&e.variables.length>0)return!0;if(typeof e.inputSchema=="string"&&e.inputSchema.trim()){let t;try{t=JSON.parse(e.inputSchema)}catch{return!0}const n=t?.properties;if(n&&typeof n=="object")for(const s of Object.keys(n)){const o=n[s];if(o&&(o["x-openapi-in"]||o["x-openapi-name"]))return!0}}return!1}async function A(e,t,n){const s=(e.toolSnapshots||[]).find(r=>r.name===t);if(!s)return{error:`Tool "${t}" has no execution snapshot on this grant`};const o=(s.method||"GET").toUpperCase(),{url:p,remaining:d}=h(s.endpoint,n),c={Accept:"application/json",...s.customHeaders||{},...g(s.authConfig)};let u=p;const a={method:o,headers:c,signal:AbortSignal.timeout(3e4)};if(o==="GET"){const r=new URLSearchParams(Object.entries(d).filter(([,i])=>i!=null&&i!=="").map(([i,l])=>[i,String(l)])).toString();r&&(u=`${p}${p.includes("?")?"&":"?"}${r}`)}else c["Content-Type"]=c["Content-Type"]||"application/json",a.body=JSON.stringify(d);try{const r=await fetch(u,a),i=await r.text();return r.ok?{content:[{type:"text",text:i}]}:{error:`Upstream call failed (${r.status}): ${i.slice(0,300)}`}}catch(r){return{error:`Upstream call failed: ${r.message}`}}}export{A as callSnapshottedTool,S as hasUnsupportedArgRouting,y as isSnapshottableOpenApiAuth,f as listSnapshottedTools};
@@ -0,0 +1,2 @@
1
+ import{Client as I}from"@elastic/elasticsearch";import m from"crypto";import{config as D}from"../../core/config";import{createMcpClient as A}from"../../core/mcp/client";import{PERSONAL_TOOLS_REACHED_VIA as H}from"../clone/closure-resolver";import{isGatewayEligiblePlatformType as R,strategyForPlatformType as O}from"../../core/services/gateway-platform-types";import{listSnapshottedTools as $,callSnapshottedTool as B,isSnapshottableOpenApiAuth as T,hasUnsupportedArgRouting as k}from"./executors/openapi-executor";const y=new I(D.elasticsearch),p=".stkxp_mcp_gateway_grants",K=".stkxp_platforms",F=500;function b(t){return t.strategy??"mcp-relay"}async function j(){try{await y.indices.exists({index:p})||(await y.indices.create({index:p,body:{mappings:{properties:{sourceOwner:{type:"keyword"},teamId:{type:"keyword"},bundleExportedAt:{type:"date"},platforms:{type:"object",enabled:!1},keyHash:{type:"keyword"},status:{type:"keyword"},redeemedBy:{type:"keyword"},redeemedAt:{type:"date"},gatewayTokenHash:{type:"keyword"},budget:{type:"object",enabled:!1},usage:{type:"object",enabled:!1},createdAt:{type:"date"},revokedAt:{type:"date"}}}}}),console.log("[GatewayGrantService] Index created:",p))}catch(t){console.error("[GatewayGrantService] Error initializing index:",t)}}j().catch(()=>{});function C(){return m.randomBytes(32).toString("hex")}function h(t){return m.createHash("sha256").update(t).digest("hex")}function _(t,e){const r=Buffer.from(t,"utf8"),o=Buffer.from(e,"utf8");return r.length!==o.length?!1:m.timingSafeEqual(r,o)}function G(){return new Date().toISOString().slice(0,10)}const M="MCP gateway grant unreachable";function v(t,e){const o=(e instanceof Error?e.message:String(e)).split(`
2
+ `)[0].split("<")[0].trim().slice(0,200)||"connection failed";return new Error(`${M}: could not connect to the MCP server for platform "${t}" (${o})`)}function P(t,e,r){const o=new Set;for(const n of t.docs){if(n.key!=="assistant")continue;const a=n.source?.mcp_servers_policy?.servers;if(Array.isArray(a))for(const s of a){if(s?.id!==e)continue;const c=Array.isArray(s.included_tools)?s.included_tools:[],u=Array.isArray(s.excluded_tools)?s.excluded_tools:[],g=c.length===0?r:c;for(const l of g)u.includes(l)||o.add(l)}}return r.filter(n=>o.has(n))}async function N(t,e,r,o,n){let a;try{a=await A(r,{headers:o?{Authorization:`ApiKey ${o}`}:{},transportType:n||"http",timeout:1e4})}catch(c){throw v(e,c)}let s;try{s=((await a.client.listTools()).tools||[]).map(u=>u.name)}catch(c){throw v(e,c)}finally{a.close&&await a.close()}return P(t,e,s)}function U(t,e,r){const o=new Set,n=`__personal_tools__:${e}`;for(const a of t.docs){if(a.key!=="assistant")continue;const s=a.source?.mcp_servers_policy?.servers;if(Array.isArray(s))for(const c of s){if(c?.id!==n)continue;const u=Array.isArray(c.excluded_tools)?c.excluded_tools:[];for(const g of r)u.includes(g)||o.add(g)}}return r.filter(a=>o.has(a))}function z(t,e){if(e?.authConfig?.type!=="platform_es")return e?.authConfig??{type:"none"};const r=t.docs.find(s=>s.key==="platform"&&s.esId===e.platformId),o=r?.source?.config,n=o?.endpoints?.elasticsearch?.username,a=o?.endpoints?.elasticsearch?.password;return!r||r.source?.type!=="ElasticStack"||!n||!a?null:{type:"basic",username:n,password:a}}function L(t,e){const r=t.docs.filter(i=>i.key==="tool"&&i.reachedVia.includes(H)&&i.source?.owner===e&&i.source?.enabled!==!1),o=[],n=[],a=new Map,s=r.filter(i=>{const d=i.source,f=z(t,d);return!f||!T(f)?(o.push(d?.name),!1):k(d)?(n.push(d?.name),!1):(a.set(d.name,f),!0)});(o.length>0||n.length>0)&&console.warn(`[GatewayGrantService] computePersonalToolsAllowlistAndSnapshots: owner "${e}" dropped tools from the gateway grant \u2014 unsupported auth: [${o.join(", ")}], unsupported arg-routing: [${n.join(", ")}]`);const c=s.map(i=>i.source.name),u=U(t,e,c),g=new Set(u),l=s.filter(i=>g.has(i.source.name)).map(i=>{const d=i.source;return{name:d.name,description:d.label??d.description,inputSchema:d.inputSchema,endpoint:d.endpoint,method:d.httpMethod??d.method??"GET",authConfig:a.get(d.name),customHeaders:d.customHeaders,bodyFormat:d.bodyFormat}});return{toolAllowlist:u,toolSnapshots:l}}function X(t,e){const r=t.docs.filter(l=>l.key==="tool"&&l.source?.platformId===e&&l.source?.enabled!==!1),o=[],n=[],a=r.filter(l=>{const i=l.source;return T(i?.authConfig)?k(i)?(n.push(i?.name),!1):!0:(o.push(i?.name),!1)});(o.length>0||n.length>0)&&console.warn(`[GatewayGrantService] computeOpenApiAllowlistAndSnapshots: platform "${e}" dropped tools from the gateway grant \u2014 unsupported auth: [${o.join(", ")}], unsupported arg-routing: [${n.join(", ")}]`);const s=a.map(l=>l.source.name),c=P(t,e,s),u=new Set(c),g=a.filter(l=>u.has(l.source.name)).map(l=>{const i=l.source;return{name:i.name,description:i.label??i.description,inputSchema:i.inputSchema,endpoint:i.endpoint,method:i.httpMethod??i.method??"GET",authConfig:i.authConfig??{type:"none"},customHeaders:i.customHeaders,bodyFormat:i.bodyFormat}});return{toolAllowlist:c,toolSnapshots:g}}async function rt(t,e,r){const o=t.docs.filter(l=>l.key==="platform"&&R(l.source?.type)&&l.source?.owner===e),n=L(t,e);if(o.length===0&&n.toolAllowlist.length===0)return null;const a=[];for(const l of o){const i=l.source.type,d=O(i);if(d==="mcp-relay"){const f=l.source.config||{},w=await N(t,l.esId,f.url,f.authKey,f.protocol);a.push({platformId:l.esId,platformType:i,strategy:d,toolAllowlist:w})}else{const{toolAllowlist:f,toolSnapshots:w}=X(t,l.esId);a.push({platformId:l.esId,platformType:i,strategy:d,toolAllowlist:f,toolSnapshots:w})}}n.toolAllowlist.length>0&&a.push({platformId:`personal:${e}`,strategy:"snapshot-execute",toolAllowlist:n.toolAllowlist,toolSnapshots:n.toolSnapshots});const s=`gwgrant_${Date.now()}_${m.randomBytes(4).toString("hex")}`,c=C(),u=new Date().toISOString(),g={id:s,sourceOwner:e,teamId:r,bundleExportedAt:u,platforms:a,keyHash:h(c),status:"pending",redeemedBy:null,redeemedAt:null,gatewayTokenHash:null,budget:{maxRunsPerDay:F},usage:{day:G(),runs:0},createdAt:u,revokedAt:null};return await y.index({index:p,id:s,document:g,refresh:!0}),{grantId:s,secret:c,platformIds:a.map(l=>l.platformId)}}async function ot(t,e,r){let o;try{o=await y.get({index:p,id:t})}catch{return{error:"Gateway grant not found"}}const n=o._source;if(n.status==="revoked")return{error:"Gateway grant has been revoked"};if(n.status==="redeemed")return{error:"Gateway grant has already been redeemed"};if(!_(h(e),n.keyHash))return{error:"Invalid gateway key"};const a=C();return await y.update({index:p,id:t,body:{doc:{status:"redeemed",redeemedBy:r,redeemedAt:new Date().toISOString(),gatewayTokenHash:h(a)}},refresh:!0}),{gatewayToken:a}}function q(t){const e=G();return(t.usage&&t.usage.day===e?t.usage:{day:e,runs:0}).runs<t.budget.maxRunsPerDay}async function E(t){const e=G();try{await y.update({index:p,id:t,body:{script:{lang:"painless",source:"def u = ctx._source.usage;if (u == null || u.day != params.day) { ctx._source.usage = ['day': params.day, 'runs': 0]; }ctx._source.usage.runs += 1;",params:{day:e}}}})}catch(r){console.error("[GatewayGrantService] consumeGatewayBudget error:",r)}}async function S(t,e,r){let o;try{o=await y.get({index:p,id:t})}catch{return{error:"Gateway grant not found"}}const n=o._source;if(n.status!=="redeemed")return{error:"Gateway grant is not active"};if(!n.gatewayTokenHash||!_(h(r),n.gatewayTokenHash))return{error:"Invalid gateway token"};const a=n.platforms.find(s=>s.platformId===e);return a?q(n)?{grant:n,platformEntry:a}:{error:"Gateway daily budget exceeded"}:{error:"Platform not covered by this gateway grant"}}async function x(t){let e;try{e=await y.get({index:K,id:t.platformEntry.platformId})}catch{return{error:"Source platform no longer exists"}}const r=e._source?.config||{};return{url:r.url,authKey:r.authKey,protocol:r.protocol,toolAllowlist:t.platformEntry.toolAllowlist}}async function nt(t,e,r){const o=await S(t,e,r);return"error"in o?o:x(o)}async function at(t,e,r){const o=await S(t,e,r);if("error"in o)return o;if(b(o.platformEntry)==="snapshot-execute")return $(o.platformEntry);const n=await x(o);if("error"in n)return n;const a=await A(n.url,{headers:n.authKey?{Authorization:`ApiKey ${n.authKey}`}:{},transportType:n.protocol||"http",timeout:1e4});try{return{tools:((await a.client.listTools()).tools||[]).filter(u=>n.toolAllowlist.includes(u.name))}}finally{a.close&&await a.close()}}async function st(t,e,r,o,n){const a=await S(t,e,r);if("error"in a)return a;if(!a.platformEntry.toolAllowlist.includes(o))return{error:`Tool "${o}" is not covered by this gateway grant`};if(b(a.platformEntry)==="snapshot-execute"){const u=await B(a.platformEntry,o,n);return u&&typeof u=="object"&&"error"in u||await E(t),u}const s=await x(a);if("error"in s)return s;const c=await A(s.url,{headers:s.authKey?{Authorization:`ApiKey ${s.authKey}`}:{},transportType:s.protocol||"http",timeout:3e4});try{const u=await c.client.callTool({name:o,arguments:n});return await E(t),u}finally{c.close&&await c.close()}}async function it(t,e){let r;try{r=await y.get({index:p,id:t})}catch{return!1}return r._source.sourceOwner!==e?!1:(await y.update({index:p,id:t,body:{doc:{status:"revoked",revokedAt:new Date().toISOString()}},refresh:!0}),!0)}function V(t){return t.map(e=>!e.toolSnapshots||e.toolSnapshots.length===0?e:{...e,toolSnapshots:e.toolSnapshots.map(r=>({...r,authConfig:{...r.authConfig,token:r.authConfig?.token?"":r.authConfig?.token,apiKey:r.authConfig?.apiKey?"":r.authConfig?.apiKey,password:r.authConfig?.password?"":r.authConfig?.password},customHeaders:r.customHeaders?{}:r.customHeaders}))})}async function lt(t,e){return(await y.search({index:p,size:100,body:{query:{bool:{must:[{term:{"teamId.keyword":t}},{term:{"sourceOwner.keyword":e}}]}},sort:[{createdAt:{order:"desc"}}]}})).hits.hits.map(o=>{const n=o._source;return{...n,platforms:V(n.platforms)}})}export{M as GATEWAY_UNREACHABLE_PREFIX,st as callAllowlistedTool,q as checkGatewayBudget,E as consumeGatewayBudget,rt as createGatewayGrant,at as listAllowlistedTools,lt as listGatewayGrantsForTeam,ot as redeemGatewayGrant,nt as resolveGatewayTarget,it as revokeGatewayGrant};
@@ -0,0 +1 @@
1
+ import{z as m}from"zod";import{Client as S}from"@elastic/elasticsearch";import{resolveClosure as k,createEsStore as w,SHARED_OWNERS as D}from"./clone/closure-resolver";import{getEntitySpec as T,ENTITY_GRAPH as g}from"./clone/entity-graph";import{executeClone as F,createEsCloneWriter as O}from"./clone/clone-executor";import{createLLMInstance as z}from"../core/llm/providers";import{getOwnerDefaultLLMConfig as _}from"../core/services/default-model.service";import{snapshotBeforeUpdate as v}from"../core/services/version-snapshot-service";const x=process.env.ELASTICSEARCH_HOST||"https://51.159.174.230:9205",y=new S({node:x,auth:{username:process.env.ELASTICSEARCH_USER||"elastic",password:process.env.ELASTICSEARCH_PASSWORD||""},tls:{rejectUnauthorized:!1}}),L=m.object({key:m.enum(["assistant","team","graph","prompt","routingRule","model","provider","platform","tool","apiDoc","nodeTemplate"]),esId:m.string().min(1),proposedFields:m.record(m.any()),rationale:m.string().min(1)}),b=m.object({entries:m.array(L)});function A(a,n){const o=new Map;for(const e of a){const t=g[e.key];for(const s of t.edges){const p=K(e.source,s.field);for(const i of p){if(typeof i!="string"||!i)continue;const r=T(s.target),l=a.find(f=>f.key===s.target&&(f.esId===i||r.appIdField&&f.source?.[r.appIdField]===i));if(!l)continue;const u=o.get(l.esId)??[],d=t.nameField;u.push({key:e.key,esId:e.esId,name:d?e.source[d]:void 0}),o.set(l.esId,u)}}}const c=new Map;for(const e of n){const t=o.get(e)??[];t.length>1&&c.set(e,t)}return c}function K(a,n){const o=n.split(".");let c=[a];for(const e of o){const t=e.endsWith("[]"),s=t?e.slice(0,-2):e,p=[];for(const i of c){if(i==null)continue;const r=s?i[s]:i;t&&Array.isArray(r)?p.push(...r):p.push(r)}c=p}return c}async function G(a,n,o){const c=w(y),e=await k([{index:".stkxp_teams",esId:a}],n,c),t=e.docs.map(d=>({key:d.key,esId:d.esId,source:d.source})),s=await _(n);if(!s)throw new Error(`No usable LLM key for owner '${n}' \u2014 cannot run team optimizer analysis`);const i=await z({provider:s.provider,model:s.model,apiKey:s.apiKey,baseURL:s.baseURL,temperature:0,streaming:!1}).withStructuredOutput(b).withConfig({tags:["nostream"]}).invoke([{role:"system",content:"You are aligning every instruction layer of an AI assistant team (team mission, per-assistant role/instructions, per-graph-node prompts, routing rules) to a single stated objective. For each entity that needs a change to be coherent with the objective, propose ONLY the fields that must change, with a one-sentence rationale. Leave entities that are already aligned out of the response entirely."},{role:"user",content:JSON.stringify({objective:o,hierarchy:t})}]),r=new Set(i.entries.map(d=>d.esId)),l=A(e.docs,r),u=i.entries.map(d=>{const f=e.docs.find(R=>R.esId===d.esId),I=f?g[f.key]:void 0,C=f&&I?.nameField?f.source[I.nameField]:void 0,h=l.get(d.esId);return{key:d.key,esId:d.esId,name:C,proposedFields:d.proposedFields,rationale:d.rationale,conflict:!!h,conflictReferrers:h}});return{objective:o,entries:u}}const E=Object.fromEntries(Object.keys(g).map(a=>[a,g[a].index])),N={team:"team",assistant:"assistant",graph:"graph",routingRule:"routing_rule"};async function J(a,n,o){const c=[],e=[];for(const t of a.entries){const s=n[t.esId]??"rewrite";if(t.conflict&&s==="clone"){e.push(t.esId);continue}const p=E[t.key],i=N[t.key];if(i){const r=await y.get({index:p,id:t.esId});await v(i,t.esId,r._source,"team_optimizer",o,t.rationale)}await y.update({index:p,id:t.esId,body:{doc:t.proposedFields},refresh:"wait_for"}),c.push(t.esId)}return{updated:c,cloned:e}}function P(a){return a.map(n=>{const o=g[n.key],c=o.ownerPath==="metadata.owner"?n.source?.metadata?.owner:n.source?.owner;if(!o.nameField||c&&D.includes(c))return n;const e=n.source[o.nameField];return typeof e!="string"||!e?n:{...n,source:{...n.source,[o.nameField]:`${e} (optimized)`}}})}async function V(a,n,o){const c={...a,docs:P(a.docs)},e=w(y),t=O(y),s=await F(c,o,e,t,{blankSecrets:!1}),p=new Map(s.created.map(r=>[r.oldEsId,r.newEsId]));for(const r of n.entries){const l=p.get(r.esId);if(!l)continue;const u=E[r.key];await y.update({index:u,id:l,body:{doc:r.proposedFields},refresh:"wait_for"})}const i=s.created.find(r=>r.key==="team")?.newEsId;if(!i)throw new Error("Clone did not produce a new team document");return{newTeamEsId:i,report:s}}export{G as analyzeTeam,V as applyClone,J as applyRewrite,A as detectConflicts,P as renameForClone};
@@ -0,0 +1 @@
1
+ import{publishTraceEvent as s}from"../core/runtime/trace-bus";class n{name="TraceBusSink";runId="";runStart(t){this.runId=t.runId}onAssistantStart(t){this.runId&&s(this.runId,{kind:"assistant_start",ts:t.ts,assistantName:t.assistantName,assistantIndex:t.assistantIndex,totalAssistants:t.totalAssistants,tools:t.tools})}onAssistantEnd(t){this.runId&&s(this.runId,{kind:"assistant_end",ts:t.ts,assistantName:t.assistantName,success:t.success,error:t.error,durationMs:t.durationMs,inputTokens:t.inputTokens,outputTokens:t.outputTokens,toolCallsCount:t.toolCallsCount})}onToolStart(t){this.runId&&s(this.runId,{kind:"tool_start",ts:t.ts,toolName:t.toolName,toolInput:t.toolInput})}onToolEnd(t){this.runId&&s(this.runId,{kind:"tool_end",ts:t.ts,toolName:t.toolName,toolResult:t.toolResult,durationMs:t.durationMs})}onMarkdownToken(t){this.runId&&s(this.runId,{kind:"markdown_token",ts:t.ts,text:t.text,assistantName:t.assistantName})}onTokenUsage(t){this.runId&&s(this.runId,{kind:"token_usage",ts:t.ts,inputTokens:t.inputTokens,outputTokens:t.outputTokens,totalTokens:t.totalTokens,modelId:t.modelId,provider:t.provider,assistantName:t.assistantName})}onBlock(t){this.runId&&s(this.runId,{kind:"block",ts:t.ts,block:t.block,assistantName:t.assistantName})}onError(t){this.runId&&s(this.runId,{kind:"error",ts:t.ts,errorType:t.errorType,errorMessage:t.errorMessage})}}export{n as TraceBusSink};
@@ -0,0 +1,3 @@
1
+ import{v4 as S}from"uuid";import{Client as b}from"@elastic/elasticsearch";import{config as M}from"../core/config";import{listGraphs as R,createGraph as T}from"../core/services/graph-registry-service";const P="stkxp",L=[{index:".stkxp_tools",ownerPath:"owner",extraOwnerFields:["createdBy","updatedBy"]},{index:".stkxp_node_templates",ownerPath:"owner"},{index:".stkxp_execution_profiles",ownerPath:"owner"},{index:".stkxp_api",ownerPath:"owner"}],_=".stkxp_platforms",C=".stkxp_assistants",D=".stkxp_teams",j=".stkxp_graphs";function G(o){return o.ownerPath==="metadata.owner"?{term:{"metadata.owner":P}}:{term:{owner:P}}}function m(o){return o?.body??o}async function I(o,t,i){const e=[],a=await o.search({index:t,scroll:"1m",size:100,body:{query:i}});let r=m(a)._scroll_id,c=m(a).hits?.hits??[];for(e.push(...c);c.length>0;){const u=await o.scroll({scroll_id:r,scroll:"1m"}),n=m(u);r=n._scroll_id,c=n.hits?.hits??[],e.push(...c)}return e}async function A(o,t,i,e){const a=await o.count({index:t,body:{query:{term:{[i]:e}}}});return m(a).count??0}async function Q(o){const t=new b({...M.elasticsearch}),i=new Date().toISOString();for(const e of L)try{const a=await t.indices.exists({index:e.index});if(!m(a)){console.log(`[provision] Index ${e.index} does not exist, skipping`);continue}const r=e.ownerPath==="metadata.owner"?"metadata.owner":"owner",c=await A(t,e.index,r,o);if(c>0){console.log(`[provision] User ${o} already has ${c} docs in ${e.index}, skipping`);continue}const u=await I(t,e.index,G(e));if(u.length===0){console.log(`[provision] No template docs found in ${e.index}`);continue}const n=[];for(const p of u){const x=S(),d={...p._source,id:x,createdAt:i,updatedAt:i};if(e.ownerPath==="metadata.owner")d.metadata={...d.metadata??{},owner:o};else{d.owner=o;for(const f of e.extraOwnerFields??[])d[f]=o}n.push({index:{_index:e.index,_id:x}}),n.push(d)}const w=await t.bulk({body:n,refresh:!0});m(w).errors?console.error(`[provision] Bulk errors in ${e.index} for user ${o}`):console.log(`[provision] Copied ${u.length} docs from ${e.index} for user ${o}`)}catch(a){console.error(`[provision] Error provisioning ${e.index} for user ${o}:`,a)}}async function W(o,t){const i=t?.sourceOwner??P,e=new Map;try{const a=await R({owner:i}),r=t?.graphIds?a.filter(s=>t.graphIds.includes(s.id)):a;if(r.length===0)return console.log(`[provision:graphs] No graphs found for source owner "${i}"`),e;const c=new Set(r.map(s=>s.id)),u=[];for(const s of r)for(const l of s.nodes??[])l.type==="subgraph"&&l.graphId&&!c.has(l.graphId)&&u.push(`"${s.name}" (${s.id}) \u2192 subgraph dep ${l.graphId} not in selected list`);if(u.length>0)throw new Error(`[provision:graphs] Missing subgraph dependencies:
2
+ ${u.join(`
3
+ `)}`);const n=await R({owner:o}),w=new Map(n.map(s=>[s.name,s.id])),p=[];for(const s of r){const l=w.get(s.name);l?(e.set(s.id,l),console.log(`[provision:graphs] Skip "${s.name}" \u2014 already exists for ${o} (${l})`)):p.push(s)}if(p.length===0)return console.log(`[provision:graphs] All graphs already exist for ${o}`),e;const x=new Map(p.map(s=>[s.id,s]));for(const s of p)e.set(s.id,S());const d=new Set(p.map(s=>s.id)),f=new Map;for(const s of p){const l=(s.nodes??[]).filter(h=>h.type==="subgraph"&&h.graphId&&d.has(h.graphId)).map(h=>h.graphId);f.set(s.id,new Set(l))}const y=[],g=p.map(s=>s.id).filter(s=>f.get(s).size===0);for(;g.length>0;){const s=g.shift();y.push(s);for(const[l,h]of f)h.has(s)&&(h.delete(s),h.size===0&&g.push(l))}for(const s of p)y.includes(s.id)||y.push(s.id);for(const s of y){const l=x.get(s),h=e.get(s),k=(l.nodes??[]).map($=>$.type==="subgraph"&&$.graphId&&e.has($.graphId)?{...$,graphId:e.get($.graphId)}:{...$});await T({...l,id:h,owner:o,nodes:k}),console.log(`[provision:graphs] Cloned "${l.name}" (${s} \u2192 ${h}) for ${o}`)}console.log(`[provision:graphs] Done: ${y.length} cloned, ${p.length-y.length+(r.length-p.length)} skipped for ${o}`)}catch(a){throw console.error(`[provision:graphs] Error for ${o}:`,a),a}return e}async function K(o){const t=new b({...M.elasticsearch}),i=new Date().toISOString(),e=new Map,a={bool:{must:[{term:{owner:P}},{term:{type:"MCPServer"}}]}},r={bool:{must:[{term:{owner:o}},{term:{type:"MCPServer"}}]}};try{const c=await t.indices.exists({index:_});if(!m(c))return console.log(`[provision:mcp] Index ${_} does not exist, skipping`),e;const u=await t.count({index:_,body:{query:r}}),n=m(u).count??0;if(n>0){const d=await I(t,_,r),f=await I(t,_,a),y=new Map(d.map(g=>[g._source.name,g._id]));for(const g of f){const s=y.get(g._source.name);s&&e.set(g._id,s)}return console.log(`[provision:mcp] User ${o} already has ${n} MCPServer platforms, built idMap with ${e.size} entries`),e}const w=await I(t,_,a);if(w.length===0)return console.log("[provision:mcp] No MCPServer template platforms found"),e;const p=[];for(const d of w){const f=`platform_${Date.now()}_${Math.random().toString(36).substring(2,9)}`;e.set(d._id,f);const y={...d._source,id:f,owner:o,managedType:"managed",created:i,updated:i};p.push({index:{_index:_,_id:f}}),p.push(y)}const x=await t.bulk({body:p,refresh:!0});m(x).errors?console.error(`[provision:mcp] Bulk errors copying MCPServer platforms for ${o}`):console.log(`[provision:mcp] Copied ${w.length} MCPServer platforms for ${o}, idMap size: ${e.size}`)}catch(c){console.error(`[provision:mcp] Error provisioning MCPServer platforms for ${o}:`,c)}return e}async function V(o,t,i=new Map){const e=new b({...M.elasticsearch}),a=new Date().toISOString();try{const r=await e.indices.exists({index:C});if(!m(r)){console.log(`[provision:assistants] Index ${C} does not exist, skipping`);return}const c=await A(e,C,"owner",o);if(c>0){console.log(`[provision:assistants] User ${o} already has ${c} assistants, skipping`);return}const u=await I(e,C,{term:{owner:P}});if(u.length===0){console.log("[provision:assistants] No template assistants found");return}const n=[];for(const p of u){const x=S(),d={...p._source,owner:o,createdAt:a,updatedAt:a};Array.isArray(d.mcp_servers_policy?.servers)&&(d.mcp_servers_policy={...d.mcp_servers_policy,servers:d.mcp_servers_policy.servers.map(f=>({...f,id:t.get(f.id)??f.id}))}),d.graphId&&i.has(d.graphId)&&(d.graphId=i.get(d.graphId)),n.push({index:{_index:C,_id:x}}),n.push(d)}const w=await e.bulk({body:n,refresh:!0});m(w).errors?console.error(`[provision:assistants] Bulk errors for ${o}`):console.log(`[provision:assistants] Copied ${u.length} assistants for ${o}`)}catch(r){console.error(`[provision:assistants] Error for ${o}:`,r)}}function z(o){const t=o.match(/^\[([^\]]+)\]/);return t?t[1].trim():null}async function J(o){const t=new b({...M.elasticsearch}),i=new Date().toISOString();try{const e=await t.indices.exists({index:D});if(m(e)){const n=await A(t,D,"owner",o);if(n>0){console.log(`[provision:teams] User ${o} already has ${n} teams, skipping`);return}}const a=await I(t,C,{term:{owner:o}});if(a.length===0){console.log(`[provision:teams] No assistants found for ${o}, skipping teams`);return}const r=new Map;for(const n of a){const w=z(n._source.name||"");w&&(r.has(w)||r.set(w,[]),r.get(w).push({id:n._id,enabled:n._source.metadata?.status!=="inactive"}))}if(r.size===0){console.log(`[provision:teams] No bracket-named assistants for ${o}, no teams to create`);return}const c=[];for(const[n,w]of r.entries()){const p=S(),x=w.map(f=>f.id),d={name:n,description:"",assistantIds:x,assistants:w,owner:o,enabled:!0,createdAt:i,updatedAt:i};c.push({index:{_index:D,_id:p}}),c.push(d)}const u=await t.bulk({body:c,refresh:!0});m(u).errors?console.error(`[provision:teams] Bulk errors for ${o}`):console.log(`[provision:teams] Created ${r.size} teams for ${o}`)}catch(e){console.error(`[provision:teams] Error for ${o}:`,e)}}async function Y(o){const t=new b({...M.elasticsearch});if(await A(t,_,"owner",o)>0)return console.log(`[provision:platform] User ${o} already has a platform assigned, skipping`),null;const e=await t.search({index:_,size:1,body:{query:{bool:{must:[{term:{managedType:"managed"}},{term:{type:"ElasticStack"}}],must_not:[{exists:{field:"owner"}}]}}}}),a=m(e).hits?.hits??[];if(a.length===0)return console.log(`[provision:platform] No available managed platform for ${o}`),null;const c=a[0]._id;return await t.update({index:_,id:c,body:{doc:{owner:o,updatedAt:new Date().toISOString()}},refresh:!0}),console.log(`[provision:platform] Platform ${c} assigned to ${o}`),c}const E="stkxp",N=".stkxp_llm_providers",B=".stkxp_llm_models",O=".stkxp_llm_routing_rules";async function Z(o){const t=new b({...M.elasticsearch}),i=new Date().toISOString(),e=await A(t,N,"owner",o);if(e>0){console.log(`[provision:llm] User ${o} already provisioned (${e} providers), skipping`);return}const a=new Map,r=await I(t,N,{term:{owner:E}});if(r.length===0){console.log(`[provision:llm] No template providers (owner="${E}") found, aborting chain`);return}const c=[];for(const g of r){const s=S();a.set(g._source.id,s),a.set(g._id,s);const{metadata:l,...h}=g._source,k={...h,id:s,owner:o,apiKey:"",enabled:!1,createdAt:i,updatedAt:i};c.push({index:{_index:N,_id:s}}),c.push(k)}const u=await t.bulk({body:c,refresh:!0});m(u).errors?console.error(`[provision:llm] Bulk errors copying providers for ${o}`):console.log(`[provision:llm] Cloned ${r.length} providers for ${o} (apiKey cleared)`);const n=new Map,w=[...new Set([...r.map(g=>g._source.id),...r.map(g=>g._id)])],p=await t.search({index:B,body:{query:{bool:{should:[{term:{owner:E}},{terms:{providerId:w}}],minimum_should_match:1}},size:200}}),x=m(p).hits?.hits??[];if(x.length===0)console.log("[provision:llm] No template models found, routing rules will keep original modelId references");else{const g=[];for(const l of x){const h=S();n.set(l._source.id,h),n.set(l._id,h);const k=a.get(l._source.providerId)??l._source.providerId,$={...l._source,id:h,owner:o,providerId:k,createdAt:i,updatedAt:i};g.push({index:{_index:B,_id:h}}),g.push($)}const s=await t.bulk({body:g,refresh:!0});m(s).errors?console.error(`[provision:llm] Bulk errors copying models for ${o}`):console.log(`[provision:llm] Cloned ${x.length} models for ${o}`)}const d=await I(t,O,{term:{owner:E}});if(d.length===0){console.log(`[provision:llm] No template routing rules (owner="${E}") found`);return}const f=[];for(const g of d){const s=S(),l=g._source.modelId||g._source.llmModelId,h=l&&(n.get(l)??l),k={...g._source,id:s,owner:o,modelId:h,llmModelId:void 0,createdAt:i,updatedAt:i};f.push({index:{_index:O,_id:s}}),f.push(k)}const y=await t.bulk({body:f,refresh:!0});m(y).errors?console.error(`[provision:llm] Bulk errors copying routing rules for ${o}`):console.log(`[provision:llm] Cloned ${d.length} routing rules for ${o}`)}const H=["assistant-generator","team-generator","skill-generator","prompt-generator","resource-generator"],v=new b({node:process.env.ELASTICSEARCH_HOST||"https://51.159.174.230:9205",auth:{username:process.env.ELASTICSEARCH_USER||"elastic",password:process.env.ELASTICSEARCH_PASSWORD||"diagnostics"},tls:{rejectUnauthorized:!1},requestTimeout:3e4});async function oo(o){const t=new Date().toISOString();for(const i of H){const e=`${o}-${i}`;if(await v.exists({index:".stkxp_assistants",id:e}).catch(()=>!1)){console.log(`[provision:generators] Skip "${e}" \u2014 already exists`);continue}const r=await v.get({index:".stkxp_assistants",id:i}).catch(()=>null);if(!r||!r._source){console.warn(`[provision:generators] Template assistant "${i}" not found \u2014 skipping`);continue}const c=r._source,u=c.promptId;let n;if(u&&(n=`${o}-${u}`,!await v.exists({index:".stkxp_prompts",id:n}).catch(()=>!1))){const x=await v.get({index:".stkxp_prompts",id:u}).catch(()=>null);x?._source&&(await v.index({index:".stkxp_prompts",id:n,body:{...x._source,id:n,owner:o,updatedAt:t},refresh:!0}),console.log(`[provision:generators] Created prompt "${n}" for ${o}`))}if(!await v.exists({index:".stkxp_graphs",id:e}).catch(()=>!1)){const p=await v.get({index:".stkxp_graphs",id:i}).catch(()=>null);p?._source&&(await v.index({index:".stkxp_graphs",id:e,body:{...p._source,id:e,owner:o,updatedAt:t,createdAt:t},refresh:!0}),console.log(`[provision:generators] Created graph "${e}" for ${o}`))}await v.index({index:".stkxp_assistants",id:e,body:{...c,id:e,owner:o,graphId:e,...n?{promptId:n}:{},updatedAt:t,created_at:t},refresh:!0}),console.log(`[provision:generators] Created assistant "${e}" for ${o}`)}console.log(`[provision:generators] Done for ${o}`)}export{V as provisionAssistants,oo as provisionGenerators,W as provisionGraphs,Z as provisionLLMChain,K as provisionMcpServers,Y as provisionPlatform,J as provisionTeams,Q as provisionUserFromTemplate};
@@ -0,0 +1,3 @@
1
+ function p(t){return!!t&&typeof t.method=="string"&&t.method.startsWith("notifications/")}function o(t){return!!t&&("result"in t||"error"in t)}function u(t,r){const a=t.startsWith("event:")||t.startsWith("data:")||t.includes(`
2
+ data:`),s=[];if(a)for(const n of t.split(`
3
+ `)){const i=n.trimEnd();if(!i.startsWith("data:"))continue;const e=i.replace(/^data:\s*/,"");if(e)try{s.push(JSON.parse(e))}catch{}}else try{s.push(JSON.parse(t))}catch{}const c=s.filter(p);return{response:s.find(n=>n&&n.id===r&&o(n))??s.find(n=>o(n))??null,notifications:c,raw:t}}export{u as parseMcpHttpBody};
@@ -0,0 +1 @@
1
+ import"dotenv/config";import m from"express";import S from"cors";import y from"node:path";import{fileURLToPath as j}from"node:url";import{createHmac as _}from"node:crypto";import{parseMcpHttpBody as w}from"./mcp-http.js";const M=j(import.meta.url),P=y.dirname(M),h=Number(process.env.PORT||8788),a=process.env.MCP_SERVER_URL||"",p=process.env.MCP_SIGNING_SECRET||"";a||(console.error("Missing MCP_SERVER_URL in .env \u2014 copy .env.example to .env and fill it in."),process.exit(1));let k=1,c;const r=m();r.use(S()),r.use(m.json({limit:"20mb"})),r.use(m.static(y.join(P,"public")));function v(e){if(!p)return{};const t=Math.floor(Date.now()/1e3).toString(),s=`v0:${t}:${e}`,o="v0="+_("sha256",p).update(s).digest("hex");return{"X-Slack-Request-Timestamp":t,"X-Slack-Signature":o}}function R(e){const t={"Content-Type":"application/json",Accept:"application/json, text/event-stream",...v(e)};return c&&(t["Mcp-Session-Id"]=c),t}async function l(e,t){const s=k++,o={jsonrpc:"2.0",id:s,method:e,...t!==void 0?{params:t}:{}},n=JSON.stringify(o),i=await fetch(a,{method:"POST",headers:R(n),body:n}),d=i.headers.get("mcp-session-id");d&&(c=d);const u=await i.text();if(!i.ok)throw new Error(`MCP HTTP ${i.status}: ${u.slice(0,2e3)}`);const{response:f,notifications:g}=w(u,s);if(!f)throw new Error(`MCP: no JSON-RPC response for id ${s}; received ${g.length} notification(s). Body: ${u.slice(0,1e3)}`);return{response:f,notifications:g}}r.post("/api/initialize",async(e,t)=>{try{const{response:s,notifications:o}=await l("initialize",{protocolVersion:"2025-06-18",capabilities:{},clientInfo:{name:"mcp-app-tester-team",version:"0.1.0"}});try{const n=JSON.stringify({jsonrpc:"2.0",method:"notifications/initialized"});await fetch(a,{method:"POST",headers:R(n),body:n})}catch{}t.json({ok:!0,sessionId:c,response:s,notifications:o})}catch(s){t.status(500).json({ok:!1,error:s.message})}}),r.get("/api/tools",async(e,t)=>{try{const{response:s,notifications:o}=await l("tools/list",{});t.json({ok:!0,response:s,notifications:o})}catch(s){t.status(500).json({ok:!1,error:s.message})}}),r.post("/api/tools/call",async(e,t)=>{try{const{name:s,arguments:o}=e.body;if(!s)return t.status(400).json({ok:!1,error:"Missing tool name"});const{response:n,notifications:i}=await l("tools/call",{name:s,arguments:o??{}});t.json({ok:!0,response:n,notifications:i})}catch(s){t.status(500).json({ok:!1,error:s.message})}}),r.post("/api/resources/read",async(e,t)=>{try{const{uri:s}=e.body;if(!s)return t.status(400).json({ok:!1,error:"Missing uri"});const{response:o,notifications:n}=await l("resources/read",{uri:s});t.json({ok:!0,response:o,notifications:n})}catch(s){t.status(500).json({ok:!1,error:s.message})}}),r.get("/api/config",(e,t)=>{t.json({mcpServerUrl:a,signed:!!p,sessionId:c})}),r.listen(h,"0.0.0.0",()=>{console.log(`MCP App Tester (team): http://localhost:${h}`),console.log(`MCP server: ${a}`),console.log(`Request signing: ${p?"ON (HMAC v0)":"OFF (unsigned \u2014 team must allow unsigned requests)"}`)});
@@ -0,0 +1 @@
1
+ import n from"moment";function o(e){const s=[];try{e?.clusters?.value&&s.push({term:{"data_stream.namespace":e.clusters.value}})}catch(t){console.error("Error in filterQuery:",t)}return s}function c(e){const s=[];try{e?.clusters?.value&&s.push({term:{"data_stream.namespace":e.clusters.value}}),e?.roles?.value&&s.push({term:{"stkxp.nodes.roles":e.roles.value}}),e?.nodes?.value&&s.push({term:{"stkxp.nodes.name":e.nodes.value}})}catch(t){console.error("Error in filterQuery:",t)}return s}function l(e){const s=[];try{e?.clusters?.value&&s.push({term:{"data_stream.namespace":e.clusters.value}}),e?.nodes?.value&&s.push({term:{"stkxp.node":e.nodes.value}}),e?.prefix?.value&&s.push({regexp:{"stkxp.index":{value:e.prefix.value,flags:"ALL",case_insensitive:!0,max_determinized_states:1e4,rewrite:"constant_score_blended"}}}),e?.suffix?.value&&s.push({wildcard:{"stkxp.index":"*"+e.suffix.value+"-*"}})}catch(t){console.error("Error in filterQuery:",t)}return s}function u(e){const s=[];try{e?.clusters?.value&&s.push({term:{"data_stream.namespace":e.clusters.value}}),e?.phases?.value&&s.push({term:{"stkxp.ilm.phase":e.phases.value}}),e?.prefix?.value&&s.push({regexp:{"stkxp.index":{value:e.prefix.value,flags:"ALL",case_insensitive:!0,max_determinized_states:1e4,rewrite:"constant_score_blended"}}}),e?.suffix?.value&&s.push({wildcard:{"stkxp.index":"*"+e.suffix.value+"-*"}})}catch(t){console.error("Error in filterQuery:",t)}return s}function d(e){try{return(e||[]).map(r=>({...r,over_time:{...r.over_time,buckets:r.over_time.buckets.filter(a=>a.doc_count>0)}}))}catch(s){return console.error("Error in filterResult:",s),e}}function p(e,s){const t=["@timestamp","data_stream.*"],r={cluster_stats:["stkxp.*"],cluster_info:["stkxp.*"],cluster_license:["stkxp.*"],cluster_usage:["stkxp.*"],cluster_health_report:["stkxp.*"],nodes_stats:["stkxp.nodes.*"],nodes_info:["stkxp.nodes.*"],nodes_enrich:["stkxp.*"],nodes_hot_threads:["stkxp.*"],nodes_tasks_list:["stkxp.*"],indices_settings:["stkxp.*"],indices_stats:["stkxp.*"],indices_shards:["stkxp.*"]};return t.push(...r[e]),t}function f(e){const s=e.match(/^now-(\d+)([smhdwMy])$/);if(!s)return n.utc();const t=parseInt(s[1],10),r=s[2];return n.utc().subtract(t,{s:"seconds",m:"minutes",h:"hours",d:"days",w:"weeks",M:"months",y:"years"}[r])}export{o as filterQueryClusters,u as filterQueryIndices,c as filterQueryNodes,l as filterQueryShards,d as filterResult,p as getAggsTopic,f as parseNowExpression};
@@ -0,0 +1,7 @@
1
+ import{PassThrough as y}from"node:stream";import{OptimizedJsonSlicer as w}from"./handler";import{send as m}from"./utils";async function _($){const{app:b,assistant:s,threadId:g,input:I,ws:n,token:k,runId:e,checkpointNs:f,perf:i,abortController:A,assistantIndex:t,totalAssistants:a,llmProvider:h}=$;console.log(`
2
+ ${"\u{1F916} ".repeat(40)}`),console.log("\u{1F916} ASSISTANT EXECUTION START"),console.log(`${"\u{1F916} ".repeat(40)}`),console.log(`\u{1F4CA} Assistant: ${s?.name||"unknown"} (${t+1}/${a})`),console.log(`\u{1F4CA} AssistantId: ${s?.assistantId||"unknown"}`),console.log(`\u{1F4CA} GraphId: ${s?.graphId}`),console.log(`\u{1F4CA} ThreadId: ${g}`),console.log(`${"\u{1F916} ".repeat(40)}
3
+ `),await m(n,{type:"assistant_start",runId:e,assistantId:s?.assistantId,assistantName:s?.name,assistantIndex:t,totalAssistants:a});const p=Date.now(),c=[],r=[];let T;try{i.start(`assistant_${t}_stream`);const o=await b.streamEvents(I,{version:"v2",configurable:{thread_id:g,run_id:e,checkpoint_ns:f},recursionLimit:100,maxConcurrency:1});console.log(`[Assistant ${t}] \u{1F680} Stream started for ${s?.name}`);const l=new w(n,k,e,h),E=new y({highWaterMark:256*1024}),S=new Set,x=new Map;for await(const u of o){if(A.signal.aborted){console.log(`[Assistant ${t}] \u23F9\uFE0F Aborted, stopping stream`);break}console.log(`[Assistant ${t}] Event: ${u.event} | Name: ${u.name}`)}i.end(`assistant_${t}_stream`);const d=Date.now()-p;return console.log(`
4
+ ${"\u2705 ".repeat(40)}`),console.log("\u2705 ASSISTANT EXECUTION COMPLETE"),console.log(`${"\u2705 ".repeat(40)}`),console.log(`\u{1F4CA} Assistant: ${s?.name}`),console.log(`\u{1F4CA} Duration: ${d}ms`),console.log(`\u{1F4CA} Tools Used: ${c.length}`),console.log(`\u{1F4CA} Blocks Generated: ${r.length}`),console.log(`${"\u2705 ".repeat(40)}
5
+ `),await m(n,{type:"assistant_end",runId:e,assistantId:s?.assistantId,assistantName:s?.name,assistantIndex:t,totalAssistants:a,tools:c,blocks:r,success:!0}),{success:!0,assistantName:s?.name,assistantId:s?.assistantId,blocks:r,tools:c,systemPrompt:T,stats:{totalDuration:d,streamProcessing:i.get(`assistant_${t}_stream`)||0,blocksGenerated:r.length}}}catch(o){const l=Date.now()-p;return console.error(`
6
+ ${"\u274C ".repeat(40)}`),console.error("\u274C ASSISTANT EXECUTION FAILED"),console.error(`${"\u274C ".repeat(40)}`),console.error(`\u{1F4CA} Assistant: ${s?.name}`),console.error(`\u{1F4CA} Error: ${o.message}`),console.error(`\u{1F4CA} Duration: ${l}ms`),console.error(`${"\u274C ".repeat(40)}
7
+ `),await m(n,{type:"assistant_error",runId:e,assistantId:s?.assistantId,assistantName:s?.name,assistantIndex:t,totalAssistants:a,error:o.message,success:!1}),{success:!1,assistantName:s?.name,assistantId:s?.assistantId,blocks:[],tools:[],error:o.message,stats:{totalDuration:l,streamProcessing:0,blocksGenerated:0}}}}export{_ as executeAssistant};
@@ -0,0 +1 @@
1
+ import{validateBlockKitSyntax as e}from"./extractors";const o=["markdown","echarts","eui","recharts","table","mermaid","leaflet","blockkit","mantine","remotion"];function a(n){if(!n||typeof n!="object")return null;if(e(n))return{channel:"blockkit_token"};const t=n.type;return typeof t=="string"&&o.includes(t)?{channel:"dashboard_block"}:null}export{a as classifyStreamedJsonBlock};
@@ -0,0 +1 @@
1
+ async function o(i,s){const t=[];for(const e of i||[]){if(e.type==="assistant_response_generator"){t.push(e.id);continue}if(e.type==="subgraph"&&e.graphId)try{const n=await s(e.graphId);for(const r of n?.nodes||[])r.type==="assistant_response_generator"&&t.push(r.id)}catch{}}return t}async function a(i,s,t){const e=await o(i,s);for(const n of t||[])if(n.graphId)try{const r=await s(n.graphId);e.push(...await o(r?.nodes,s))}catch{}return e}export{a as collectResponseGeneratorNodeIds};
@@ -0,0 +1 @@
1
+ import{EventEmitter as a}from"node:events";const n=["header","section","divider","context","rich_text","table","image","video","file","actions","input","data_visualization","carousel","card","markdown","container","data_table"];function s(i){if(!i||typeof i!="object")return!1;const e=i,t=e.type;return typeof t!="string"||!n.includes(t)?!1:t==="table"?"column_settings"in e||"rows"in e:!0}class c extends a{candidateBuffer="";braceCount=0;inCandidate=!1;inString=!1;escapeNext=!1;processChunk(e){for(const t of e){if(this.inString){this.inCandidate&&(this.candidateBuffer+=t),this.escapeNext?this.escapeNext=!1:t==="\\"?this.escapeNext=!0:t==='"'&&(this.inString=!1);continue}if(!this.inCandidate){t==="{"&&(this.inCandidate=!0,this.braceCount=1,this.candidateBuffer="{");continue}this.candidateBuffer+=t,t==='"'?this.inString=!0:t==="{"?this.braceCount++:t==="}"&&this.braceCount--,this.braceCount===0&&(this.tryEmitCandidate(),this.resetCandidate())}}tryEmitCandidate(){try{const e=this.candidateBuffer.replace(/,\s*",\s*/g,'",').replace(/,\s*,+/g,",").replace(/,(\s*[}\]])/g,"$1").replace(/"\s*:\s*"/g,'":"'),t=JSON.parse(e);if(!s(t))return;console.log(`[BlockkitExtractor] Detected native Slack block type: ${t.type}`),this.emit("blockkitBlock",t)}catch(e){console.warn("[BlockkitExtractor] Failed to parse candidate block:",e instanceof Error?e.message:String(e))}}resetCandidate(){this.inCandidate=!1,this.braceCount=0,this.candidateBuffer="",this.inString=!1,this.escapeNext=!1}complete(){console.log("[BlockkitExtractor] complete"),this.resetCandidate()}}export{c as BlockkitExtractor,s as validateBlockKitSyntax};
@@ -0,0 +1 @@
1
+ import{EventEmitter as o}from"node:events";class n extends o{buffer="";echartsBuffer="";braceCount=0;inJsonBlock=!1;processChunk(e){this.buffer+=e;const r=this.buffer.match(/\{"type"\s*:\s*"echarts"/);if(r&&!this.inJsonBlock){console.log("[EchartsExtractor] Found echarts block start"),this.inJsonBlock=!0,this.braceCount=1;const s=r.index??0;this.echartsBuffer=this.buffer.substring(s),this.buffer=""}if(this.inJsonBlock){const s=(e.match(/\{/g)||[]).length,a=(e.match(/\}/g)||[]).length;if(this.braceCount+=s-a,this.echartsBuffer.length>0&&(this.echartsBuffer+=e),this.braceCount===0&&this.inJsonBlock){console.log("[EchartsExtractor] Complete echarts block detected");try{let t=this.echartsBuffer.replace(/,\s*",\s*/g,'",').replace(/,\s*,+/g,",").replace(/,(\s*[}\]])/g,"$1").replace(/"\s*:\s*"/g,'":"');const c=JSON.parse(t);c.type==="echarts"&&this.emit("echartsBlock",c)}catch(t){console.warn("[EchartsExtractor] Failed to parse echarts block:",t instanceof Error?t.message:String(t)),console.warn("[EchartsExtractor] Buffer content:",this.echartsBuffer.substring(0,200))}this.resetState()}}}resetState(){this.inJsonBlock=!1,this.braceCount=0,this.buffer="",this.echartsBuffer=""}complete(){console.log("[EchartsExtractor] complete"),this.resetState()}}export{n as EchartsExtractor};
@@ -0,0 +1 @@
1
+ import{EventEmitter as p}from"node:events";class E extends p{buffer="";euiBuffer="";braceCount=0;inJsonBlock=!1;rawEuiBuffer="";inRawEuiTag=!1;currentTagName="";tagStartIndex=0;processChunk(s){this.buffer+=s;const c=this.buffer.match(/\{"type"\s*:\s*"eui"/);if(c&&!this.inJsonBlock){console.log("[EuiExtractor] Found eui JSON block start"),this.inJsonBlock=!0,this.braceCount=1;const i=c.index??0;this.euiBuffer=this.buffer.substring(i),this.buffer=""}if(this.inJsonBlock||this.extractRawEuiTags(s),this.inJsonBlock){const i=(s.match(/\{/g)||[]).length,u=(s.match(/\}/g)||[]).length;if(this.braceCount+=i-u,this.euiBuffer.length>0&&(this.euiBuffer+=s),this.braceCount===0&&this.inJsonBlock){console.log("[EuiExtractor] Complete eui block detected");try{let t=this.euiBuffer.replace(/,\s*",\s*/g,'",').replace(/,\s*,+/g,",").replace(/,(\s*[}\]])/g,"$1").replace(/"\s*:\s*"/g,'":"');const e=JSON.parse(t);e.type==="eui"&&this.emit("euiBlock",e)}catch(t){console.warn("[EuiExtractor] Failed to parse eui block:",t instanceof Error?t.message:String(t)),console.warn("[EuiExtractor] Buffer content:",this.euiBuffer.substring(0,200))}this.resetState()}}}extractRawEuiTags(s){const c=/<(Eui[A-Z][a-zA-Z]*)((?:\s+[a-zA-Z]+="[^"]*")*)\s*>(.*?)<\/\1>/gs;let i;for(;(i=c.exec(this.buffer))!==null;){const[t,e,r,o]=i;console.log(`[EuiExtractor] Found raw EUI tag: <${e}>${o.substring(0,30)}...</${e}>`);const a={};if(r){const n=/([a-zA-Z]+)="([^"]*)"/g;let f;for(;(f=n.exec(r))!==null;)a[f[1]]=f[2]}const l={type:"eui",id:`eui-raw-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,title:a.title||`${e} Component`,body:t,component:e,props:a};this.emit("euiBlock",l),this.buffer=this.buffer.replace(t,"")}const u=/<(Eui[A-Z][a-zA-Z]*)((?:\s+[a-zA-Z]+="[^"]*")*)\s*\/>/g;for(;(i=u.exec(this.buffer))!==null;){const[t,e,r]=i;console.log(`[EuiExtractor] Found self-closing EUI tag: <${e} />`);const o={};if(r){const l=/([a-zA-Z]+)="([^"]*)"/g;let n;for(;(n=l.exec(r))!==null;)o[n[1]]=n[2]}const a={type:"eui",id:`eui-raw-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,title:o.title||`${e} Component`,body:t,component:e,props:o};this.emit("euiBlock",a),this.buffer=this.buffer.replace(t,"")}}resetState(){this.inJsonBlock=!1,this.braceCount=0,this.buffer="",this.euiBuffer="",this.rawEuiBuffer="",this.inRawEuiTag=!1,this.currentTagName=""}complete(){console.log("[EuiExtractor] complete"),this.resetState()}}export{E as EuiExtractor};
@@ -0,0 +1 @@
1
+ import{EventEmitter as f}from"node:events";class c extends f{buffer="";formBuffer="";braceCount=0;inJsonBlock=!1;processChunk(e){this.buffer+=e;const s=this.buffer.match(/\{"type"\s*:\s*"form"/);if(s&&!this.inJsonBlock){console.log("[FormExtractor] Found form block start"),this.inJsonBlock=!0,this.braceCount=1;const o=s.index??0;this.formBuffer=this.buffer.substring(o),this.buffer=""}if(this.inJsonBlock){const o=(e.match(/\{/g)??[]).length,i=(e.match(/\}/g)??[]).length;if(this.braceCount+=o-i,this.formBuffer.length>0&&(this.formBuffer+=e),this.braceCount===0&&this.inJsonBlock){console.log("[FormExtractor] Complete form block detected");try{const t=this.formBuffer.replace(/,\s*",\s*/g,'",').replace(/,\s*,+/g,",").replace(/,(\s*[}\]])/g,"$1").replace(/"\s*:\s*"/g,'":"'),r=JSON.parse(t);if(r.type==="form"){if(!Array.isArray(r.fields)){console.warn("[FormExtractor] form block is missing a `fields` array \u2014 skipping"),this.resetState();return}if(!r.tool||typeof r.tool!="string"){console.warn("[FormExtractor] form block is missing a `tool` string \u2014 skipping"),this.resetState();return}this.emit("formBlock",r)}}catch(t){console.warn("[FormExtractor] Failed to parse form block:",t instanceof Error?t.message:String(t)),console.warn("[FormExtractor] Buffer content (first 200 chars):",this.formBuffer.substring(0,200))}this.resetState()}}}resetState(){this.inJsonBlock=!1,this.braceCount=0,this.buffer="",this.formBuffer=""}complete(){console.log("[FormExtractor] complete"),this.resetState()}}export{c as FormExtractor};
@@ -0,0 +1 @@
1
+ import{MarkdownExtractor as o}from"./markdown-extractor";import{RechartsExtractor as a}from"./recharts-extractor";import{EchartsExtractor as c}from"./echarts-extractor";import{EuiExtractor as E}from"./eui-extractor";import{MermaidExtractor as p}from"./mermaid-extractor";import{FormExtractor as n}from"./form-extractor";import{LeafletExtractor as l}from"./leaflet-extractor";import{BlockkitExtractor as M,validateBlockKitSyntax as h}from"./blockkit-extractor";import{MantineExtractor as B}from"./mantine-extractor";import{RemotionExtractor as u}from"./remotion-extractor";export{M as BlockkitExtractor,c as EchartsExtractor,E as EuiExtractor,n as FormExtractor,l as LeafletExtractor,B as MantineExtractor,o as MarkdownExtractor,p as MermaidExtractor,a as RechartsExtractor,u as RemotionExtractor,h as validateBlockKitSyntax};
@@ -0,0 +1 @@
1
+ import{EventEmitter as o}from"node:events";class i extends o{buffer="";leafletBuffer="";braceCount=0;inJsonBlock=!1;processChunk(t){this.buffer+=t;const r=this.buffer.match(/\{"type"\s*:\s*"leaflet"/);if(r&&!this.inJsonBlock){console.log("[LeafletExtractor] Found leaflet block start"),this.inJsonBlock=!0,this.braceCount=1;const s=r.index??0;this.leafletBuffer=this.buffer.substring(s),this.buffer=""}if(this.inJsonBlock){const s=(t.match(/\{/g)||[]).length,a=(t.match(/\}/g)||[]).length;if(this.braceCount+=s-a,this.leafletBuffer.length>0&&(this.leafletBuffer+=t),this.braceCount===0&&this.inJsonBlock){console.log("[LeafletExtractor] Complete leaflet block detected");try{const e=this.leafletBuffer.replace(/,\s*",\s*/g,'",').replace(/,\s*,+/g,",").replace(/,(\s*[}\]])/g,"$1").replace(/"\s*:\s*"/g,'":"'),l=JSON.parse(e);l.type==="leaflet"&&this.emit("leafletBlock",l)}catch(e){console.warn("[LeafletExtractor] Failed to parse leaflet block:",e instanceof Error?e.message:String(e)),console.warn("[LeafletExtractor] Buffer content:",this.leafletBuffer.substring(0,200))}this.resetState()}}}resetState(){this.inJsonBlock=!1,this.braceCount=0,this.buffer="",this.leafletBuffer=""}complete(){console.log("[LeafletExtractor] complete"),this.resetState()}}export{i as LeafletExtractor};
@@ -0,0 +1 @@
1
+ import{EventEmitter as a}from"node:events";class f extends a{buffer="";mantineBuffer="";braceCount=0;inJsonBlock=!1;processChunk(e){this.buffer+=e;const s=this.buffer.match(/\{"type"\s*:\s*"mantine"/);if(s&&!this.inJsonBlock&&(this.inJsonBlock=!0,this.braceCount=1,this.mantineBuffer=this.buffer.substring(s.index??0),this.buffer=""),this.inJsonBlock){const n=(e.match(/\{/g)||[]).length,r=(e.match(/\}/g)||[]).length;if(this.braceCount+=n-r,this.mantineBuffer.length>0&&(this.mantineBuffer+=e),this.braceCount===0){try{const t=this.mantineBuffer.replace(/,\s*",\s*/g,'",').replace(/,\s*,+/g,",").replace(/,(\s*[}\]])/g,"$1").replace(/"\s*:\s*"/g,'":"'),i=JSON.parse(t);i.type==="mantine"&&this.emit("mantineBlock",i)}catch(t){console.warn("[MantineExtractor] Failed to parse block:",t instanceof Error?t.message:String(t))}this.resetState()}}}resetState(){this.inJsonBlock=!1,this.braceCount=0,this.buffer="",this.mantineBuffer=""}complete(){this.resetState()}}export{f as MantineExtractor};
@@ -0,0 +1,7 @@
1
+ import{EventEmitter as d}from"node:events";class k extends d{buffer="";inMarkdownBody=!1;bodyStart=!1;markdownBuffer="";braceCount=0;inJsonBlock=!1;lastStreamTime=0;totalMarkdownContent="";processChunk(t){console.log("[MarkdownExtractor] processChunk"),t.length>10&&console.log("[MarkdownExtractor] Processing chunk:",t.slice(0,30),"..."),this.buffer+=t;const e=this.buffer.match(/\{"type"\s*:\s*"markdown"/),r=this.buffer.includes('{"type"')&&this.buffer.includes('"markdown"');if((e||r)&&!this.inJsonBlock&&(console.log("[MarkdownExtractor] Found markdown block start"),this.inJsonBlock=!0,this.braceCount=1),this.inJsonBlock){const a=(t.match(/\{/g)||[]).length,o=(t.match(/\}/g)||[]).length;this.braceCount+=a-o,this.inMarkdownBody||this.buffer.match(/"body"\s*:\s*"/)&&(console.log("[MarkdownExtractor] Found markdown body start"),this.inMarkdownBody=!0,this.bodyStart=!0,this.markdownBuffer=""),this.inMarkdownBody&&this.extractMarkdownFromChunk(t),this.braceCount===0&&this.inJsonBlock&&(console.log("[MarkdownExtractor] End of JSON block"),this.resetState())}else t.includes('{"type"')&&(console.log("[MarkdownExtractor] Found potential JSON start in non-block context"),this.inJsonBlock=!0,this.braceCount=0)}extractMarkdownFromChunk(t){if(console.log("[MarkdownExtractor] extractMarkdownFromChunk"),!this.inMarkdownBody)return;let e=-1,r=0;for(;r<t.length;){const n=t[r];if(this.bodyStart){this.bodyStart=!1,r++;continue}if(n==='"'&&(r===0||t[r-1]!=="\\")&&t.slice(r).match(/^"\s*[,}]/)){e=r;break}r++}const a=e>=0?t.slice(0,e):t;let o="";for(r=this.bodyStart?1:0;r<a.length;){const n=a[r];if(n==="\\"&&r+1<a.length)switch(a[r+1]){case"n":o+=`
2
+ `,r+=2;break;case"t":o+=" ",r+=2;break;case"r":o+="\r",r+=2;break;case'"':o+='"',r+=2;break;case"\\":o+="\\",r+=2;break;case"/":o+="/",r+=2;break;default:o+=n,r++;break}else o+=n,r++}this.markdownBuffer+=o,this.totalMarkdownContent+=o,console.log("[MarkdownExtractor] markdownBuffer length:",this.markdownBuffer.length);const s=Date.now(),i=this.markdownBuffer.length>=15,c=s-this.lastStreamTime>200;if((i||c)&&this.markdownBuffer.trim()){const n=this.cleanMarkdownForStreaming(this.markdownBuffer);console.log("[MarkdownExtractor] Streaming chunk:",n.slice(0,50),"..."),n.trim()&&(this.emit("markdownChunk",n),this.lastStreamTime=s),this.markdownBuffer=""}if(e>=0){if(console.log("[MarkdownExtractor] End of markdown body, final buffer:",this.markdownBuffer.length,"chars"),this.markdownBuffer.trim()){const n=this.cleanMarkdownForStreaming(this.markdownBuffer);n.trim()&&this.emit("markdownChunk",n)}this.inMarkdownBody=!1,this.markdownBuffer=""}}resetState(){if(console.log("[MarkdownExtractor] resetState"),this.inJsonBlock=!1,this.inMarkdownBody=!1,this.bodyStart=!1,this.braceCount=0,this.buffer="",this.lastStreamTime=0,this.markdownBuffer.trim()){const t=this.cleanMarkdownForStreaming(this.markdownBuffer);t.trim()&&this.emit("markdownChunk",t),this.markdownBuffer=""}}complete(){if(console.log("[MarkdownExtractor] complete"),this.markdownBuffer.trim()){const t=this.cleanMarkdownForStreaming(this.markdownBuffer);t.trim()&&this.emit("markdownChunk",t)}this.resetState()}getTotalContent(){let t=this.totalMarkdownContent;return t=t.replace(/```json\s*/gi,""),t=t.replace(/```\s*/g,""),t=t.replace(/^json\s*$/gim,""),t=t.replace(/\{\s*"type"\s*:\s*"[^"]+"\s*,[\s\S]*?\}/g,""),t=t.replace(/^\s*\{\s*$/gm,""),t=t.replace(/^\s*\}\s*$/gm,""),t=t.replace(/\n{3,}/g,`
3
+
4
+ `),t=t.replace(/^\s*\n/gm,`
5
+ `),t=t.replace(/ {2,}/g," "),t.trim()}resetTotalContent(){this.totalMarkdownContent=""}cleanMarkdownForStreaming(t){console.log("[MarkdownExtractor] cleanMarkdownForStreaming");const e=t.trim();return e.startsWith("{")&&e.endsWith("}")&&e.includes('"type"')&&e.includes('"echarts"')?(console.warn("[MarkdownExtractor] Rejected pure JSON block in markdown stream:",e.substring(0,100)),""):t.replace(/\\"/g,'"').replace(/\\\\/g,"\\").replace(/^#{4,6}\s+/gm,"### ").replace(/\n{3,}/g,`
6
+
7
+ `).trim()}}export{k as MarkdownExtractor};
@@ -0,0 +1 @@
1
+ import{EventEmitter as o}from"node:events";import{validateMermaidSyntax as m}from"../../core/app-config/mermaid-theme";class h extends o{buffer="";mermaidBuffer="";braceCount=0;inJsonBlock=!1;processChunk(e){this.buffer+=e;const t=this.buffer.match(/\{"type"\s*:\s*"mermaid"/);if(t&&!this.inJsonBlock){console.log("[MermaidExtractor] Found mermaid block start"),this.inJsonBlock=!0,this.braceCount=1;const a=t.index??0;this.mermaidBuffer=this.buffer.substring(a),this.buffer=""}if(this.inJsonBlock){const a=(e.match(/\{/g)||[]).length,s=(e.match(/\}/g)||[]).length;if(this.braceCount+=a-s,this.mermaidBuffer.length>0&&(this.mermaidBuffer+=e),this.braceCount===0&&this.inJsonBlock){console.log("[MermaidExtractor] Complete mermaid block detected");try{let i=this.mermaidBuffer.replace(/,\s*",\s*/g,'",').replace(/,\s*,+/g,",").replace(/,(\s*[}\]])/g,"$1").replace(/"\s*:\s*"/g,'":"');const r=JSON.parse(i);if(r.type==="mermaid"){if(!r.body||typeof r.body!="string"){console.warn("[MermaidExtractor] Invalid mermaid block: missing or invalid body field"),this.resetState();return}m(r.body)||console.warn("[MermaidExtractor] Invalid Mermaid syntax detected:",r.body.substring(0,100));const n=this.detectDiagramType(r.body);console.log(`[MermaidExtractor] Detected diagram type: ${n}`),this.emit("mermaidBlock",r)}}catch(i){console.warn("[MermaidExtractor] Failed to parse mermaid block:",i instanceof Error?i.message:String(i)),console.warn("[MermaidExtractor] Buffer content:",this.mermaidBuffer.substring(0,200))}this.resetState()}}}detectDiagramType(e){const t=e.trim();return t.startsWith("graph ")||t.startsWith("flowchart ")?"flowchart":t.startsWith("sequenceDiagram")?"sequence":t.startsWith("classDiagram")?"class":t.startsWith("stateDiagram")?"state":t.startsWith("erDiagram")?"er":t.startsWith("gantt")?"gantt":t.startsWith("pie")?"pie":t.startsWith("gitGraph")?"gitGraph":t.startsWith("journey")?"journey":t.startsWith("requirementDiagram")?"requirement":t.startsWith("mindmap")?"mindmap":t.startsWith("timeline")?"timeline":t.startsWith("quadrantChart")?"quadrant":"unknown"}resetState(){this.inJsonBlock=!1,this.braceCount=0,this.buffer="",this.mermaidBuffer=""}complete(){console.log("[MermaidExtractor] complete"),this.resetState()}}export{h as MermaidExtractor};
@@ -0,0 +1 @@
1
+ import{EventEmitter as o}from"node:events";class n extends o{buffer="";rechartsBuffer="";braceCount=0;inJsonBlock=!1;processChunk(e){this.buffer+=e;const s=this.buffer.match(/\{"type"\s*:\s*"recharts"/);if(s&&!this.inJsonBlock){console.log("[RechartsExtractor] Found recharts block start"),this.inJsonBlock=!0,this.braceCount=1;const r=s.index??0;this.rechartsBuffer=this.buffer.substring(r),this.buffer=""}if(this.inJsonBlock){const r=(e.match(/\{/g)||[]).length,a=(e.match(/\}/g)||[]).length;if(this.braceCount+=r-a,this.rechartsBuffer.length>0&&(this.rechartsBuffer+=e),this.braceCount===0&&this.inJsonBlock){console.log("[RechartsExtractor] Complete recharts block detected");try{let t=this.rechartsBuffer.replace(/,\s*",\s*/g,'",').replace(/,\s*,+/g,",").replace(/,(\s*[}\]])/g,"$1").replace(/"\s*:\s*"/g,'":"');const c=JSON.parse(t);c.type==="recharts"&&this.emit("rechartsBlock",c)}catch(t){console.warn("[RechartsExtractor] Failed to parse recharts block:",t instanceof Error?t.message:String(t)),console.warn("[RechartsExtractor] Buffer content:",this.rechartsBuffer.substring(0,200))}this.resetState()}}}resetState(){this.inJsonBlock=!1,this.braceCount=0,this.buffer="",this.rechartsBuffer=""}complete(){console.log("[RechartsExtractor] complete"),this.resetState()}}export{n as RechartsExtractor};
@@ -0,0 +1 @@
1
+ import{EventEmitter as n}from"node:events";const i=new Set(["stat-reveal","progress-bar","radial-gauge","before-after","ranking-list","sparkline-card","donut-breakdown","timeline-steps","insight-card","kpi-sequence"]);class s extends n{buffer="";remotionBuffer="";braceCount=0;inJsonBlock=!1;static netBraces(o){const r=(o.match(/\{/g)||[]).length,e=(o.match(/\}/g)||[]).length;return r-e}processChunk(o){this.buffer+=o;const r=!this.inJsonBlock&&this.buffer.match(/\{"type"\s*:\s*"remotion"/);if(r){console.log("[RemotionExtractor] Found remotion block start"),this.inJsonBlock=!0;const e=r.index??0;this.remotionBuffer=this.buffer.substring(e),this.buffer="",this.braceCount=s.netBraces(this.remotionBuffer)}else this.inJsonBlock&&(this.remotionBuffer+=o,this.braceCount+=s.netBraces(o));if(this.inJsonBlock&&this.braceCount===0){console.log("[RemotionExtractor] Complete remotion block detected");try{const e=this.remotionBuffer.replace(/,\s*",\s*/g,'",').replace(/,\s*,+/g,",").replace(/,(\s*[}\]])/g,"$1").replace(/"\s*:\s*"/g,'":"'),t=JSON.parse(e);if(t.type==="remotion"){if(!t.templateId||!i.has(t.templateId)){console.warn("[RemotionExtractor] Unknown or missing templateId:",t.templateId),this.resetState();return}if(!t.props||typeof t.props!="object"){console.warn("[RemotionExtractor] Missing props field"),this.resetState();return}this.emit("remotionBlock",t)}}catch(e){console.warn("[RemotionExtractor] Failed to parse remotion block:",e instanceof Error?e.message:String(e))}this.resetState()}}resetState(){this.inJsonBlock=!1,this.braceCount=0,this.buffer="",this.remotionBuffer=""}complete(){console.log("[RemotionExtractor] complete"),this.resetState()}}export{s as RemotionExtractor};